From: Johannes Dahlström Date: Mon, 12 Nov 2012 11:22:47 +0000 (+0200) Subject: Move widget classes from c.v.c.ui. to c.v.c.ui (#9392) X-Git-Tag: 7.0.0.beta9~9 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=1b7a4a1ee9e03f445cbfcbb520a5ac970ccf47de;p=vaadin-framework.git Move widget classes from c.v.c.ui. to c.v.c.ui (#9392) Conflicts: client/src/com/vaadin/client/ui/VScrollTable.java Change-Id: Ie65e26c9e3df520b099744d4bc1aecc901eaa07a --- diff --git a/client/src/com/vaadin/client/ui/VEmbedded.java b/client/src/com/vaadin/client/ui/VEmbedded.java new file mode 100644 index 0000000000..5315560991 --- /dev/null +++ b/client/src/com/vaadin/client/ui/VEmbedded.java @@ -0,0 +1,262 @@ +/* + * Copyright 2011 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.vaadin.client.ui; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.ui.HTML; +import com.vaadin.client.ApplicationConnection; +import com.vaadin.client.BrowserInfo; +import com.vaadin.client.ComponentConnector; +import com.vaadin.client.ConnectorMap; +import com.vaadin.client.UIDL; +import com.vaadin.client.Util; +import com.vaadin.client.VConsole; +import com.vaadin.shared.ui.embedded.EmbeddedConstants; + +public class VEmbedded extends HTML { + public static String CLASSNAME = "v-embedded"; + + /** For internal use only. May be removed or replaced in the future. */ + public Element browserElement; + + /** For internal use only. May be removed or replaced in the future. */ + public String type; + + /** For internal use only. May be removed or replaced in the future. */ + public String mimetype; + + /** For internal use only. May be removed or replaced in the future. */ + public ApplicationConnection client; + + public VEmbedded() { + setStyleName(CLASSNAME); + } + + /** + * Creates the Object and Embed tags for the Flash plugin so it works + * cross-browser. + *

+ * For internal use only. May be removed or replaced in the future. + * + * @param uidl + * The UIDL + * @return Tags concatenated into a string + */ + public String createFlashEmbed(UIDL uidl) { + /* + * To ensure cross-browser compatibility we are using the twice-cooked + * method to embed flash i.e. we add a OBJECT tag for IE ActiveX and + * inside it a EMBED for all other browsers. + */ + + StringBuilder html = new StringBuilder(); + + // Start the object tag + html.append(""); + + // Ensure we have an movie parameter + Map parameters = getParameters(uidl); + if (parameters.get("movie") == null) { + parameters.put("movie", getSrc(uidl, client)); + } + + // Add parameters to OBJECT + for (String name : parameters.keySet()) { + html.append(""); + } + + // Build inner EMBED tag + html.append(""); + + if (uidl.hasAttribute(EmbeddedConstants.ALTERNATE_TEXT)) { + html.append(uidl + .getStringAttribute(EmbeddedConstants.ALTERNATE_TEXT)); + } + + // End object tag + html.append(""); + + return html.toString(); + } + + /** + * Returns a map (name -> value) of all parameters in the UIDL. + *

+ * For internal use only. May be removed or replaced in the future. + * + * @param uidl + * @return + */ + public static Map getParameters(UIDL uidl) { + Map parameters = new HashMap(); + + Iterator childIterator = uidl.getChildIterator(); + while (childIterator.hasNext()) { + + Object child = childIterator.next(); + if (child instanceof UIDL) { + + UIDL childUIDL = (UIDL) child; + if (childUIDL.getTag().equals("embeddedparam")) { + String name = childUIDL.getStringAttribute("name"); + String value = childUIDL.getStringAttribute("value"); + parameters.put(name, value); + } + } + + } + + return parameters; + } + + /** + * Helper to return translated src-attribute from embedded's UIDL + *

+ * For internal use only. May be removed or replaced in the future. + * + * @param uidl + * @param client + * @return + */ + public String getSrc(UIDL uidl, ApplicationConnection client) { + String url = client.translateVaadinUri(uidl.getStringAttribute("src")); + if (url == null) { + return ""; + } + return url; + } + + @Override + protected void onDetach() { + if (BrowserInfo.get().isIE()) { + // Force browser to fire unload event when component is detached + // from the view (IE doesn't do this automatically) + if (browserElement != null) { + /* + * src was previously set to javascript:false, but this was not + * enough to overcome a bug when detaching an iframe with a pdf + * loaded in IE9. about:blank seems to cause the adobe reader + * plugin to unload properly before the iframe is removed. See + * #7855 + */ + DOM.setElementAttribute(browserElement, "src", "about:blank"); + } + } + super.onDetach(); + } + + @Override + public void onBrowserEvent(Event event) { + super.onBrowserEvent(event); + if (DOM.eventGetType(event) == Event.ONLOAD) { + VConsole.log("Embeddable onload"); + Util.notifyParentOfSizeChange(this, true); + } + } + +} diff --git a/client/src/com/vaadin/client/ui/VFlash.java b/client/src/com/vaadin/client/ui/VFlash.java new file mode 100644 index 0000000000..fede021865 --- /dev/null +++ b/client/src/com/vaadin/client/ui/VFlash.java @@ -0,0 +1,230 @@ +package com.vaadin.client.ui; + +import java.util.HashMap; +import java.util.Map; + +import com.google.gwt.user.client.ui.HTML; +import com.vaadin.client.Util; + +public class VFlash extends HTML { + + public static final String CLASSNAME = "v-flash"; + + protected String source; + protected String altText; + protected String classId; + protected String codebase; + protected String codetype; + protected String standby; + protected String archive; + protected Map embedParams = new HashMap(); + protected boolean needsRebuild = false; + protected String width; + protected String height; + + public VFlash() { + setStyleName(CLASSNAME); + } + + public void setSource(String source) { + if (this.source != source) { + this.source = source; + needsRebuild = true; + } + } + + public void setAlternateText(String altText) { + if (this.altText != altText) { + this.altText = altText; + needsRebuild = true; + } + } + + public void setClassId(String classId) { + if (this.classId != classId) { + this.classId = classId; + needsRebuild = true; + } + } + + public void setCodebase(String codebase) { + if (this.codebase != codebase) { + this.codebase = codebase; + needsRebuild = true; + } + } + + public void setCodetype(String codetype) { + if (this.codetype != codetype) { + this.codetype = codetype; + needsRebuild = true; + } + } + + public void setStandby(String standby) { + if (this.standby != standby) { + this.standby = standby; + needsRebuild = true; + } + } + + public void setArchive(String archive) { + if (this.archive != archive) { + this.archive = archive; + needsRebuild = true; + } + } + + /** + * Call this after changing values of widget. It will rebuild embedding + * structure if needed. + */ + public void rebuildIfNeeded() { + if (needsRebuild) { + needsRebuild = false; + this.setHTML(createFlashEmbed()); + } + } + + @Override + public void setWidth(String width) { + // super.setWidth(height); + + if (this.width != width) { + this.width = width; + needsRebuild = true; + } + } + + @Override + public void setHeight(String height) { + // super.setHeight(height); + + if (this.height != height) { + this.height = height; + needsRebuild = true; + } + } + + public void setEmbedParams(Map params) { + if (params == null) { + if (!embedParams.isEmpty()) { + embedParams.clear(); + needsRebuild = true; + } + return; + } + + if (!embedParams.equals(params)) { + embedParams = new HashMap(params); + needsRebuild = true; + } + } + + protected String createFlashEmbed() { + /* + * To ensure cross-browser compatibility we are using the twice-cooked + * method to embed flash i.e. we add a OBJECT tag for IE ActiveX and + * inside it a EMBED for all other browsers. + */ + + StringBuilder html = new StringBuilder(); + + // Start the object tag + html.append(""); + + // Ensure we have an movie parameter + if (embedParams.get("movie") == null) { + embedParams.put("movie", source); + } + + // Add parameters to OBJECT + for (String name : embedParams.keySet()) { + html.append(""); + } + + // Build inner EMBED tag + html.append(""); + + if (altText != null) { + html.append(""); + html.append(altText); + html.append(""); + } + + // End object tag + html.append(""); + + return html.toString(); + } + +} diff --git a/client/src/com/vaadin/client/ui/VForm.java b/client/src/com/vaadin/client/ui/VForm.java new file mode 100644 index 0000000000..14dc574f71 --- /dev/null +++ b/client/src/com/vaadin/client/ui/VForm.java @@ -0,0 +1,125 @@ +/* + * Copyright 2011 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.vaadin.client.ui; + +import com.google.gwt.event.dom.client.KeyDownEvent; +import com.google.gwt.event.dom.client.KeyDownHandler; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.ui.ComplexPanel; +import com.google.gwt.user.client.ui.Widget; +import com.vaadin.client.ApplicationConnection; +import com.vaadin.client.VErrorMessage; + +public class VForm extends ComplexPanel implements KeyDownHandler { + + public static final String CLASSNAME = "v-form"; + + /** For internal use only. May be removed or replaced in the future. */ + public String id; + + /** For internal use only. May be removed or replaced in the future. */ + public Widget lo; + + /** For internal use only. May be removed or replaced in the future. */ + public Element legend = DOM.createLegend(); + + /** For internal use only. May be removed or replaced in the future. */ + public Element caption = DOM.createSpan(); + + /** For internal use only. May be removed or replaced in the future. */ + public Element desc = DOM.createDiv(); + + /** For internal use only. May be removed or replaced in the future. */ + public Icon icon; + + /** For internal use only. May be removed or replaced in the future. */ + public VErrorMessage errorMessage = new VErrorMessage(); + + /** For internal use only. May be removed or replaced in the future. */ + public Element fieldContainer = DOM.createDiv(); + + /** For internal use only. May be removed or replaced in the future. */ + public Element footerContainer = DOM.createDiv(); + + /** For internal use only. May be removed or replaced in the future. */ + public Element fieldSet = DOM.createFieldSet(); + + /** For internal use only. May be removed or replaced in the future. */ + public Widget footer; + + /** For internal use only. May be removed or replaced in the future. */ + public ApplicationConnection client; + + /** For internal use only. May be removed or replaced in the future. */ + public ShortcutActionHandler shortcutHandler; + + /** For internal use only. May be removed or replaced in the future. */ + public HandlerRegistration keyDownRegistration; + + public VForm() { + setElement(DOM.createDiv()); + getElement().appendChild(fieldSet); + setStyleName(CLASSNAME); + fieldSet.appendChild(legend); + legend.appendChild(caption); + + fieldSet.appendChild(desc); // Adding description for initial padding + // measurements, removed later if no + // description is set + + fieldSet.appendChild(fieldContainer); + errorMessage.setVisible(false); + + fieldSet.appendChild(errorMessage.getElement()); + fieldSet.appendChild(footerContainer); + + errorMessage.setOwner(this); + } + + @Override + public void setStyleName(String style) { + super.setStyleName(style); + updateStyleNames(); + } + + @Override + public void setStylePrimaryName(String style) { + super.setStylePrimaryName(style); + updateStyleNames(); + } + + protected void updateStyleNames() { + fieldContainer.setClassName(getStylePrimaryName() + "-content"); + errorMessage.setStyleName(getStylePrimaryName() + "-errormessage"); + desc.setClassName(getStylePrimaryName() + "-description"); + footerContainer.setClassName(getStylePrimaryName() + "-footer"); + } + + @Override + public void onKeyDown(KeyDownEvent event) { + shortcutHandler.handleKeyboardEvent(Event.as(event.getNativeEvent())); + } + + /** For internal use only. May be removed or replaced in the future. */ + @Override + public void add(Widget child, Element container) { + super.add(child, container); + } +} diff --git a/client/src/com/vaadin/client/ui/VFormLayout.java b/client/src/com/vaadin/client/ui/VFormLayout.java new file mode 100644 index 0000000000..a46a0a41c8 --- /dev/null +++ b/client/src/com/vaadin/client/ui/VFormLayout.java @@ -0,0 +1,382 @@ +/* + * Copyright 2011 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.vaadin.client.ui; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.ui.FlexTable; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.Widget; +import com.vaadin.client.ApplicationConnection; +import com.vaadin.client.BrowserInfo; +import com.vaadin.client.ComponentConnector; +import com.vaadin.client.Focusable; +import com.vaadin.client.StyleConstants; +import com.vaadin.client.VTooltip; +import com.vaadin.shared.ComponentConstants; +import com.vaadin.shared.ComponentState; +import com.vaadin.shared.ui.ComponentStateUtil; +import com.vaadin.shared.ui.MarginInfo; + +/** + * Two col Layout that places caption on left col and field on right col + */ +public class VFormLayout extends SimplePanel { + + private final static String CLASSNAME = "v-formlayout"; + + /** For internal use only. May be removed or replaced in the future. */ + public VFormLayoutTable table; + + public VFormLayout() { + super(); + setStyleName(StyleConstants.UI_LAYOUT); + addStyleName(CLASSNAME); + table = new VFormLayoutTable(); + setWidget(table); + } + + /** + * Parses the stylenames from shared state + * + * @param state + * shared state of the component + * @param enabled + * @return An array of stylenames + */ + private String[] getStylesFromState(ComponentState state, boolean enabled) { + List styles = new ArrayList(); + if (ComponentStateUtil.hasStyles(state)) { + for (String name : state.styles) { + styles.add(name); + } + } + + if (!enabled) { + styles.add(ApplicationConnection.DISABLED_CLASSNAME); + } + + return styles.toArray(new String[styles.size()]); + } + + public class VFormLayoutTable extends FlexTable implements ClickHandler { + + private static final int COLUMN_CAPTION = 0; + private static final int COLUMN_ERRORFLAG = 1; + private static final int COLUMN_WIDGET = 2; + + private HashMap widgetToCaption = new HashMap(); + private HashMap widgetToError = new HashMap(); + + public VFormLayoutTable() { + DOM.setElementProperty(getElement(), "cellPadding", "0"); + DOM.setElementProperty(getElement(), "cellSpacing", "0"); + } + + /* + * (non-Javadoc) + * + * @see + * com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt + * .event.dom.client.ClickEvent) + */ + @Override + public void onClick(ClickEvent event) { + Caption caption = (Caption) event.getSource(); + if (caption.getOwner() != null) { + if (caption.getOwner() instanceof Focusable) { + ((Focusable) caption.getOwner()).focus(); + } else if (caption.getOwner() instanceof com.google.gwt.user.client.ui.Focusable) { + ((com.google.gwt.user.client.ui.Focusable) caption + .getOwner()).setFocus(true); + } + } + } + + public void setMargins(MarginInfo margins) { + Element margin = getElement(); + setStyleName(margin, CLASSNAME + "-" + StyleConstants.MARGIN_TOP, + margins.hasTop()); + setStyleName(margin, CLASSNAME + "-" + StyleConstants.MARGIN_RIGHT, + margins.hasRight()); + setStyleName(margin, + CLASSNAME + "-" + StyleConstants.MARGIN_BOTTOM, + margins.hasBottom()); + setStyleName(margin, CLASSNAME + "-" + StyleConstants.MARGIN_LEFT, + margins.hasLeft()); + + } + + public void setSpacing(boolean spacing) { + setStyleName(getElement(), CLASSNAME + "-" + "spacing", spacing); + + } + + public void setRowCount(int rowNr) { + for (int i = 0; i < rowNr; i++) { + prepareCell(i, COLUMN_CAPTION); + getCellFormatter().setStyleName(i, COLUMN_CAPTION, + CLASSNAME + "-captioncell"); + + prepareCell(i, 1); + getCellFormatter().setStyleName(i, COLUMN_ERRORFLAG, + CLASSNAME + "-errorcell"); + + prepareCell(i, 2); + getCellFormatter().setStyleName(i, COLUMN_WIDGET, + CLASSNAME + "-contentcell"); + + String rowstyles = CLASSNAME + "-row"; + if (i == 0) { + rowstyles += " " + CLASSNAME + "-firstrow"; + } + if (i == rowNr - 1) { + rowstyles += " " + CLASSNAME + "-lastrow"; + } + + getRowFormatter().setStyleName(i, rowstyles); + + } + while (getRowCount() != rowNr) { + removeRow(rowNr); + } + } + + public void setChild(int rowNr, Widget childWidget, Caption caption, + ErrorFlag error) { + setWidget(rowNr, COLUMN_WIDGET, childWidget); + setWidget(rowNr, COLUMN_CAPTION, caption); + setWidget(rowNr, COLUMN_ERRORFLAG, error); + + widgetToCaption.put(childWidget, caption); + widgetToError.put(childWidget, error); + + } + + public Caption getCaption(Widget childWidget) { + return widgetToCaption.get(childWidget); + } + + public ErrorFlag getError(Widget childWidget) { + return widgetToError.get(childWidget); + } + + public void cleanReferences(Widget oldChildWidget) { + widgetToError.remove(oldChildWidget); + widgetToCaption.remove(oldChildWidget); + + } + + public void updateCaption(Widget widget, ComponentState state, + boolean enabled) { + final Caption c = widgetToCaption.get(widget); + if (c != null) { + c.updateCaption(state, enabled); + } + } + + public void updateError(Widget widget, String errorMessage, + boolean hideErrors) { + final ErrorFlag e = widgetToError.get(widget); + if (e != null) { + e.updateError(errorMessage, hideErrors); + } + + } + + } + + // TODO why duplicated here? + public class Caption extends HTML { + + public static final String CLASSNAME = "v-caption"; + + private final ComponentConnector owner; + + private Element requiredFieldIndicator; + + private Icon icon; + + private Element captionText; + + /** + * + * @param component + * optional owner of caption. If not set, getOwner will + * return null + */ + public Caption(ComponentConnector component) { + super(); + owner = component; + } + + private void setStyles(String[] styles) { + String styleName = CLASSNAME; + + if (styles != null) { + for (String style : styles) { + if (ApplicationConnection.DISABLED_CLASSNAME.equals(style)) { + // Add v-disabled also without classname prefix so + // generic v-disabled CSS rules work + styleName += " " + style; + } + + styleName += " " + CLASSNAME + "-" + style; + } + } + + setStyleName(styleName); + } + + public void updateCaption(ComponentState state, boolean enabled) { + // Update styles as they might have changed when the caption changed + setStyles(getStylesFromState(state, enabled)); + + boolean isEmpty = true; + + if (state.resources.containsKey(ComponentConstants.ICON_RESOURCE)) { + if (icon == null) { + icon = new Icon(owner.getConnection()); + + DOM.insertChild(getElement(), icon.getElement(), 0); + } + icon.setUri(state.resources.get( + ComponentConstants.ICON_RESOURCE).getURL()); + isEmpty = false; + } else { + if (icon != null) { + DOM.removeChild(getElement(), icon.getElement()); + icon = null; + } + + } + + if (state.caption != null) { + if (captionText == null) { + captionText = DOM.createSpan(); + DOM.insertChild(getElement(), captionText, icon == null ? 0 + : 1); + } + String c = state.caption; + if (c == null) { + c = ""; + } else { + isEmpty = false; + } + DOM.setInnerText(captionText, c); + } else { + // TODO should span also be removed + } + + if (state.description != null && captionText != null) { + addStyleDependentName("hasdescription"); + } else { + removeStyleDependentName("hasdescription"); + } + + boolean required = owner instanceof AbstractFieldConnector + && ((AbstractFieldConnector) owner).isRequired(); + if (required) { + if (requiredFieldIndicator == null) { + requiredFieldIndicator = DOM.createSpan(); + DOM.setInnerText(requiredFieldIndicator, "*"); + DOM.setElementProperty(requiredFieldIndicator, "className", + "v-required-field-indicator"); + DOM.appendChild(getElement(), requiredFieldIndicator); + } + } else { + if (requiredFieldIndicator != null) { + DOM.removeChild(getElement(), requiredFieldIndicator); + requiredFieldIndicator = null; + } + } + + // Workaround for IE weirdness, sometimes returns bad height in some + // circumstances when Caption is empty. See #1444 + // IE7 bugs more often. I wonder what happens when IE8 arrives... + // FIXME: This could be unnecessary for IE8+ + if (BrowserInfo.get().isIE()) { + if (isEmpty) { + setHeight("0px"); + DOM.setStyleAttribute(getElement(), "overflow", "hidden"); + } else { + setHeight(""); + DOM.setStyleAttribute(getElement(), "overflow", ""); + } + + } + + } + + /** + * Returns Paintable for which this Caption belongs to. + * + * @return owner Widget + */ + public ComponentConnector getOwner() { + return owner; + } + } + + /** For internal use only. May be removed or replaced in the future. */ + public class ErrorFlag extends HTML { + private static final String CLASSNAME = VFormLayout.CLASSNAME + + "-error-indicator"; + Element errorIndicatorElement; + + private ComponentConnector owner; + + public ErrorFlag(ComponentConnector owner) { + setStyleName(CLASSNAME); + sinkEvents(VTooltip.TOOLTIP_EVENTS); + this.owner = owner; + } + + public ComponentConnector getOwner() { + return owner; + } + + public void updateError(String errorMessage, boolean hideErrors) { + boolean showError = null != errorMessage; + if (hideErrors) { + showError = false; + } + + if (showError) { + if (errorIndicatorElement == null) { + errorIndicatorElement = DOM.createDiv(); + DOM.setInnerHTML(errorIndicatorElement, " "); + DOM.setElementProperty(errorIndicatorElement, "className", + "v-errorindicator"); + DOM.appendChild(getElement(), errorIndicatorElement); + } + + } else if (errorIndicatorElement != null) { + DOM.removeChild(getElement(), errorIndicatorElement); + errorIndicatorElement = null; + } + } + + } +} diff --git a/client/src/com/vaadin/client/ui/VScrollTable.java b/client/src/com/vaadin/client/ui/VScrollTable.java index 2af58d8578..601c93428c 100644 --- a/client/src/com/vaadin/client/ui/VScrollTable.java +++ b/client/src/com/vaadin/client/ui/VScrollTable.java @@ -92,7 +92,6 @@ import com.vaadin.client.ui.dd.VDragAndDropManager; import com.vaadin.client.ui.dd.VDragEvent; import com.vaadin.client.ui.dd.VHasDropHandler; import com.vaadin.client.ui.dd.VTransferable; -import com.vaadin.client.ui.embedded.VEmbedded; import com.vaadin.shared.ComponentState; import com.vaadin.shared.MouseEventDetails; import com.vaadin.shared.ui.dd.VerticalDropLocation; diff --git a/client/src/com/vaadin/client/ui/embedded/EmbeddedConnector.java b/client/src/com/vaadin/client/ui/embedded/EmbeddedConnector.java index a15803beb7..97fab6d3d1 100644 --- a/client/src/com/vaadin/client/ui/embedded/EmbeddedConnector.java +++ b/client/src/com/vaadin/client/ui/embedded/EmbeddedConnector.java @@ -34,6 +34,7 @@ import com.vaadin.client.VConsole; import com.vaadin.client.VTooltip; import com.vaadin.client.ui.AbstractComponentConnector; import com.vaadin.client.ui.ClickEventHandler; +import com.vaadin.client.ui.VEmbedded; import com.vaadin.shared.MouseEventDetails; import com.vaadin.shared.ui.Connect; import com.vaadin.shared.ui.embedded.EmbeddedConstants; diff --git a/client/src/com/vaadin/client/ui/embedded/VEmbedded.java b/client/src/com/vaadin/client/ui/embedded/VEmbedded.java deleted file mode 100644 index 4dc85cd10c..0000000000 --- a/client/src/com/vaadin/client/ui/embedded/VEmbedded.java +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright 2011 Vaadin Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.vaadin.client.ui.embedded; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import com.google.gwt.user.client.DOM; -import com.google.gwt.user.client.Element; -import com.google.gwt.user.client.Event; -import com.google.gwt.user.client.ui.HTML; -import com.vaadin.client.ApplicationConnection; -import com.vaadin.client.BrowserInfo; -import com.vaadin.client.ComponentConnector; -import com.vaadin.client.ConnectorMap; -import com.vaadin.client.UIDL; -import com.vaadin.client.Util; -import com.vaadin.client.VConsole; -import com.vaadin.shared.ui.embedded.EmbeddedConstants; - -public class VEmbedded extends HTML { - public static String CLASSNAME = "v-embedded"; - - protected Element browserElement; - - protected String type; - protected String mimetype; - - protected ApplicationConnection client; - - public VEmbedded() { - setStyleName(CLASSNAME); - } - - /** - * Creates the Object and Embed tags for the Flash plugin so it works - * cross-browser - * - * @param uidl - * The UIDL - * @return Tags concatenated into a string - */ - protected String createFlashEmbed(UIDL uidl) { - /* - * To ensure cross-browser compatibility we are using the twice-cooked - * method to embed flash i.e. we add a OBJECT tag for IE ActiveX and - * inside it a EMBED for all other browsers. - */ - - StringBuilder html = new StringBuilder(); - - // Start the object tag - html.append(""); - - // Ensure we have an movie parameter - Map parameters = getParameters(uidl); - if (parameters.get("movie") == null) { - parameters.put("movie", getSrc(uidl, client)); - } - - // Add parameters to OBJECT - for (String name : parameters.keySet()) { - html.append(""); - } - - // Build inner EMBED tag - html.append(""); - - if (uidl.hasAttribute(EmbeddedConstants.ALTERNATE_TEXT)) { - html.append(uidl - .getStringAttribute(EmbeddedConstants.ALTERNATE_TEXT)); - } - - // End object tag - html.append(""); - - return html.toString(); - } - - /** - * Returns a map (name -> value) of all parameters in the UIDL. - * - * @param uidl - * @return - */ - protected static Map getParameters(UIDL uidl) { - Map parameters = new HashMap(); - - Iterator childIterator = uidl.getChildIterator(); - while (childIterator.hasNext()) { - - Object child = childIterator.next(); - if (child instanceof UIDL) { - - UIDL childUIDL = (UIDL) child; - if (childUIDL.getTag().equals("embeddedparam")) { - String name = childUIDL.getStringAttribute("name"); - String value = childUIDL.getStringAttribute("value"); - parameters.put(name, value); - } - } - - } - - return parameters; - } - - /** - * Helper to return translated src-attribute from embedded's UIDL - * - * @param uidl - * @param client - * @return - */ - protected String getSrc(UIDL uidl, ApplicationConnection client) { - String url = client.translateVaadinUri(uidl.getStringAttribute("src")); - if (url == null) { - return ""; - } - return url; - } - - @Override - protected void onDetach() { - if (BrowserInfo.get().isIE()) { - // Force browser to fire unload event when component is detached - // from the view (IE doesn't do this automatically) - if (browserElement != null) { - /* - * src was previously set to javascript:false, but this was not - * enough to overcome a bug when detaching an iframe with a pdf - * loaded in IE9. about:blank seems to cause the adobe reader - * plugin to unload properly before the iframe is removed. See - * #7855 - */ - DOM.setElementAttribute(browserElement, "src", "about:blank"); - } - } - super.onDetach(); - } - - @Override - public void onBrowserEvent(Event event) { - super.onBrowserEvent(event); - if (DOM.eventGetType(event) == Event.ONLOAD) { - VConsole.log("Embeddable onload"); - Util.notifyParentOfSizeChange(this, true); - } - } - -} diff --git a/client/src/com/vaadin/client/ui/flash/FlashConnector.java b/client/src/com/vaadin/client/ui/flash/FlashConnector.java index eaccc4736c..c8ca750840 100644 --- a/client/src/com/vaadin/client/ui/flash/FlashConnector.java +++ b/client/src/com/vaadin/client/ui/flash/FlashConnector.java @@ -2,6 +2,7 @@ package com.vaadin.client.ui.flash; import com.vaadin.client.communication.StateChangeEvent; import com.vaadin.client.ui.AbstractComponentConnector; +import com.vaadin.client.ui.VFlash; import com.vaadin.shared.ui.AbstractEmbeddedState; import com.vaadin.shared.ui.Connect; import com.vaadin.shared.ui.flash.FlashState; diff --git a/client/src/com/vaadin/client/ui/flash/VFlash.java b/client/src/com/vaadin/client/ui/flash/VFlash.java deleted file mode 100644 index 0f91ff88e7..0000000000 --- a/client/src/com/vaadin/client/ui/flash/VFlash.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.vaadin.client.ui.flash; - -import java.util.HashMap; -import java.util.Map; - -import com.google.gwt.user.client.ui.HTML; -import com.vaadin.client.Util; - -public class VFlash extends HTML { - - public static final String CLASSNAME = "v-flash"; - - protected String source; - protected String altText; - protected String classId; - protected String codebase; - protected String codetype; - protected String standby; - protected String archive; - protected Map embedParams = new HashMap(); - protected boolean needsRebuild = false; - protected String width; - protected String height; - - public VFlash() { - setStyleName(CLASSNAME); - } - - public void setSource(String source) { - if (this.source != source) { - this.source = source; - needsRebuild = true; - } - } - - public void setAlternateText(String altText) { - if (this.altText != altText) { - this.altText = altText; - needsRebuild = true; - } - } - - public void setClassId(String classId) { - if (this.classId != classId) { - this.classId = classId; - needsRebuild = true; - } - } - - public void setCodebase(String codebase) { - if (this.codebase != codebase) { - this.codebase = codebase; - needsRebuild = true; - } - } - - public void setCodetype(String codetype) { - if (this.codetype != codetype) { - this.codetype = codetype; - needsRebuild = true; - } - } - - public void setStandby(String standby) { - if (this.standby != standby) { - this.standby = standby; - needsRebuild = true; - } - } - - public void setArchive(String archive) { - if (this.archive != archive) { - this.archive = archive; - needsRebuild = true; - } - } - - /** - * Call this after changing values of widget. It will rebuild embedding - * structure if needed. - */ - public void rebuildIfNeeded() { - if (needsRebuild) { - needsRebuild = false; - this.setHTML(createFlashEmbed()); - } - } - - @Override - public void setWidth(String width) { - // super.setWidth(height); - - if (this.width != width) { - this.width = width; - needsRebuild = true; - } - } - - @Override - public void setHeight(String height) { - // super.setHeight(height); - - if (this.height != height) { - this.height = height; - needsRebuild = true; - } - } - - public void setEmbedParams(Map params) { - if (params == null) { - if (!embedParams.isEmpty()) { - embedParams.clear(); - needsRebuild = true; - } - return; - } - - if (!embedParams.equals(params)) { - embedParams = new HashMap(params); - needsRebuild = true; - } - } - - protected String createFlashEmbed() { - /* - * To ensure cross-browser compatibility we are using the twice-cooked - * method to embed flash i.e. we add a OBJECT tag for IE ActiveX and - * inside it a EMBED for all other browsers. - */ - - StringBuilder html = new StringBuilder(); - - // Start the object tag - html.append(""); - - // Ensure we have an movie parameter - if (embedParams.get("movie") == null) { - embedParams.put("movie", source); - } - - // Add parameters to OBJECT - for (String name : embedParams.keySet()) { - html.append(""); - } - - // Build inner EMBED tag - html.append(""); - - if (altText != null) { - html.append(""); - html.append(altText); - html.append(""); - } - - // End object tag - html.append(""); - - return html.toString(); - } - -} diff --git a/client/src/com/vaadin/client/ui/form/FormConnector.java b/client/src/com/vaadin/client/ui/form/FormConnector.java index 0c2e4a8ecd..bd7ab6ff6e 100644 --- a/client/src/com/vaadin/client/ui/form/FormConnector.java +++ b/client/src/com/vaadin/client/ui/form/FormConnector.java @@ -27,6 +27,7 @@ import com.vaadin.client.UIDL; import com.vaadin.client.ui.AbstractComponentContainerConnector; import com.vaadin.client.ui.Icon; import com.vaadin.client.ui.ShortcutActionHandler; +import com.vaadin.client.ui.VForm; import com.vaadin.client.ui.layout.ElementResizeEvent; import com.vaadin.client.ui.layout.ElementResizeListener; import com.vaadin.client.ui.layout.MayScrollChildren; diff --git a/client/src/com/vaadin/client/ui/form/VForm.java b/client/src/com/vaadin/client/ui/form/VForm.java deleted file mode 100644 index ac877bd12f..0000000000 --- a/client/src/com/vaadin/client/ui/form/VForm.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2011 Vaadin Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.vaadin.client.ui.form; - -import com.google.gwt.event.dom.client.KeyDownEvent; -import com.google.gwt.event.dom.client.KeyDownHandler; -import com.google.gwt.event.shared.HandlerRegistration; -import com.google.gwt.user.client.DOM; -import com.google.gwt.user.client.Element; -import com.google.gwt.user.client.Event; -import com.google.gwt.user.client.ui.ComplexPanel; -import com.google.gwt.user.client.ui.Widget; -import com.vaadin.client.ApplicationConnection; -import com.vaadin.client.VErrorMessage; -import com.vaadin.client.ui.Icon; -import com.vaadin.client.ui.ShortcutActionHandler; - -public class VForm extends ComplexPanel implements KeyDownHandler { - - protected String id; - - public static final String CLASSNAME = "v-form"; - - Widget lo; - Element legend = DOM.createLegend(); - Element caption = DOM.createSpan(); - Element desc = DOM.createDiv(); - Icon icon; - VErrorMessage errorMessage = new VErrorMessage(); - - Element fieldContainer = DOM.createDiv(); - - Element footerContainer = DOM.createDiv(); - - Element fieldSet = DOM.createFieldSet(); - - Widget footer; - - ApplicationConnection client; - - ShortcutActionHandler shortcutHandler; - - HandlerRegistration keyDownRegistration; - - public VForm() { - setElement(DOM.createDiv()); - getElement().appendChild(fieldSet); - setStyleName(CLASSNAME); - fieldSet.appendChild(legend); - legend.appendChild(caption); - - fieldSet.appendChild(desc); // Adding description for initial padding - // measurements, removed later if no - // description is set - - fieldSet.appendChild(fieldContainer); - errorMessage.setVisible(false); - - fieldSet.appendChild(errorMessage.getElement()); - fieldSet.appendChild(footerContainer); - - errorMessage.setOwner(this); - } - - @Override - public void setStyleName(String style) { - super.setStyleName(style); - updateStyleNames(); - } - - @Override - public void setStylePrimaryName(String style) { - super.setStylePrimaryName(style); - updateStyleNames(); - } - - protected void updateStyleNames() { - fieldContainer.setClassName(getStylePrimaryName() + "-content"); - errorMessage.setStyleName(getStylePrimaryName() + "-errormessage"); - desc.setClassName(getStylePrimaryName() + "-description"); - footerContainer.setClassName(getStylePrimaryName() + "-footer"); - } - - @Override - public void onKeyDown(KeyDownEvent event) { - shortcutHandler.handleKeyboardEvent(Event.as(event.getNativeEvent())); - } - - @Override - protected void add(Widget child, Element container) { - // Overridden to allow VFormPaintable to call this. Should be removed - // once functionality from VFormPaintable is moved to VForm. - super.add(child, container); - } -} diff --git a/client/src/com/vaadin/client/ui/formlayout/FormLayoutConnector.java b/client/src/com/vaadin/client/ui/formlayout/FormLayoutConnector.java index 6379ae47be..ed873ae809 100644 --- a/client/src/com/vaadin/client/ui/formlayout/FormLayoutConnector.java +++ b/client/src/com/vaadin/client/ui/formlayout/FormLayoutConnector.java @@ -24,9 +24,10 @@ import com.vaadin.client.Util; import com.vaadin.client.communication.StateChangeEvent; import com.vaadin.client.ui.AbstractFieldConnector; import com.vaadin.client.ui.AbstractLayoutConnector; -import com.vaadin.client.ui.formlayout.VFormLayout.Caption; -import com.vaadin.client.ui.formlayout.VFormLayout.ErrorFlag; -import com.vaadin.client.ui.formlayout.VFormLayout.VFormLayoutTable; +import com.vaadin.client.ui.VFormLayout; +import com.vaadin.client.ui.VFormLayout.Caption; +import com.vaadin.client.ui.VFormLayout.ErrorFlag; +import com.vaadin.client.ui.VFormLayout.VFormLayoutTable; import com.vaadin.shared.ui.Connect; import com.vaadin.shared.ui.MarginInfo; import com.vaadin.shared.ui.orderedlayout.AbstractOrderedLayoutState; diff --git a/client/src/com/vaadin/client/ui/formlayout/VFormLayout.java b/client/src/com/vaadin/client/ui/formlayout/VFormLayout.java deleted file mode 100644 index cbdef6685c..0000000000 --- a/client/src/com/vaadin/client/ui/formlayout/VFormLayout.java +++ /dev/null @@ -1,382 +0,0 @@ -/* - * Copyright 2011 Vaadin Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.vaadin.client.ui.formlayout; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.user.client.DOM; -import com.google.gwt.user.client.Element; -import com.google.gwt.user.client.ui.FlexTable; -import com.google.gwt.user.client.ui.HTML; -import com.google.gwt.user.client.ui.SimplePanel; -import com.google.gwt.user.client.ui.Widget; -import com.vaadin.client.ApplicationConnection; -import com.vaadin.client.BrowserInfo; -import com.vaadin.client.ComponentConnector; -import com.vaadin.client.Focusable; -import com.vaadin.client.StyleConstants; -import com.vaadin.client.VTooltip; -import com.vaadin.client.ui.AbstractFieldConnector; -import com.vaadin.client.ui.Icon; -import com.vaadin.shared.ComponentConstants; -import com.vaadin.shared.ComponentState; -import com.vaadin.shared.ui.ComponentStateUtil; -import com.vaadin.shared.ui.MarginInfo; - -/** - * Two col Layout that places caption on left col and field on right col - */ -public class VFormLayout extends SimplePanel { - - private final static String CLASSNAME = "v-formlayout"; - - VFormLayoutTable table; - - public VFormLayout() { - super(); - setStyleName(StyleConstants.UI_LAYOUT); - addStyleName(CLASSNAME); - table = new VFormLayoutTable(); - setWidget(table); - } - - /** - * Parses the stylenames from shared state - * - * @param state - * shared state of the component - * @param enabled - * @return An array of stylenames - */ - private String[] getStylesFromState(ComponentState state, boolean enabled) { - List styles = new ArrayList(); - if (ComponentStateUtil.hasStyles(state)) { - for (String name : state.styles) { - styles.add(name); - } - } - - if (!enabled) { - styles.add(ApplicationConnection.DISABLED_CLASSNAME); - } - - return styles.toArray(new String[styles.size()]); - } - - public class VFormLayoutTable extends FlexTable implements ClickHandler { - - private static final int COLUMN_CAPTION = 0; - private static final int COLUMN_ERRORFLAG = 1; - private static final int COLUMN_WIDGET = 2; - - private HashMap widgetToCaption = new HashMap(); - private HashMap widgetToError = new HashMap(); - - public VFormLayoutTable() { - DOM.setElementProperty(getElement(), "cellPadding", "0"); - DOM.setElementProperty(getElement(), "cellSpacing", "0"); - } - - /* - * (non-Javadoc) - * - * @see - * com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt - * .event.dom.client.ClickEvent) - */ - @Override - public void onClick(ClickEvent event) { - Caption caption = (Caption) event.getSource(); - if (caption.getOwner() != null) { - if (caption.getOwner() instanceof Focusable) { - ((Focusable) caption.getOwner()).focus(); - } else if (caption.getOwner() instanceof com.google.gwt.user.client.ui.Focusable) { - ((com.google.gwt.user.client.ui.Focusable) caption - .getOwner()).setFocus(true); - } - } - } - - public void setMargins(MarginInfo margins) { - Element margin = getElement(); - setStyleName(margin, CLASSNAME + "-" + StyleConstants.MARGIN_TOP, - margins.hasTop()); - setStyleName(margin, CLASSNAME + "-" + StyleConstants.MARGIN_RIGHT, - margins.hasRight()); - setStyleName(margin, - CLASSNAME + "-" + StyleConstants.MARGIN_BOTTOM, - margins.hasBottom()); - setStyleName(margin, CLASSNAME + "-" + StyleConstants.MARGIN_LEFT, - margins.hasLeft()); - - } - - public void setSpacing(boolean spacing) { - setStyleName(getElement(), CLASSNAME + "-" + "spacing", spacing); - - } - - public void setRowCount(int rowNr) { - for (int i = 0; i < rowNr; i++) { - prepareCell(i, COLUMN_CAPTION); - getCellFormatter().setStyleName(i, COLUMN_CAPTION, - CLASSNAME + "-captioncell"); - - prepareCell(i, 1); - getCellFormatter().setStyleName(i, COLUMN_ERRORFLAG, - CLASSNAME + "-errorcell"); - - prepareCell(i, 2); - getCellFormatter().setStyleName(i, COLUMN_WIDGET, - CLASSNAME + "-contentcell"); - - String rowstyles = CLASSNAME + "-row"; - if (i == 0) { - rowstyles += " " + CLASSNAME + "-firstrow"; - } - if (i == rowNr - 1) { - rowstyles += " " + CLASSNAME + "-lastrow"; - } - - getRowFormatter().setStyleName(i, rowstyles); - - } - while (getRowCount() != rowNr) { - removeRow(rowNr); - } - } - - public void setChild(int rowNr, Widget childWidget, Caption caption, - ErrorFlag error) { - setWidget(rowNr, COLUMN_WIDGET, childWidget); - setWidget(rowNr, COLUMN_CAPTION, caption); - setWidget(rowNr, COLUMN_ERRORFLAG, error); - - widgetToCaption.put(childWidget, caption); - widgetToError.put(childWidget, error); - - } - - public Caption getCaption(Widget childWidget) { - return widgetToCaption.get(childWidget); - } - - public ErrorFlag getError(Widget childWidget) { - return widgetToError.get(childWidget); - } - - public void cleanReferences(Widget oldChildWidget) { - widgetToError.remove(oldChildWidget); - widgetToCaption.remove(oldChildWidget); - - } - - public void updateCaption(Widget widget, ComponentState state, - boolean enabled) { - final Caption c = widgetToCaption.get(widget); - if (c != null) { - c.updateCaption(state, enabled); - } - } - - public void updateError(Widget widget, String errorMessage, - boolean hideErrors) { - final ErrorFlag e = widgetToError.get(widget); - if (e != null) { - e.updateError(errorMessage, hideErrors); - } - - } - - } - - // TODO why duplicated here? - public class Caption extends HTML { - - public static final String CLASSNAME = "v-caption"; - - private final ComponentConnector owner; - - private Element requiredFieldIndicator; - - private Icon icon; - - private Element captionText; - - /** - * - * @param component - * optional owner of caption. If not set, getOwner will - * return null - */ - public Caption(ComponentConnector component) { - super(); - owner = component; - } - - private void setStyles(String[] styles) { - String styleName = CLASSNAME; - - if (styles != null) { - for (String style : styles) { - if (ApplicationConnection.DISABLED_CLASSNAME.equals(style)) { - // Add v-disabled also without classname prefix so - // generic v-disabled CSS rules work - styleName += " " + style; - } - - styleName += " " + CLASSNAME + "-" + style; - } - } - - setStyleName(styleName); - } - - public void updateCaption(ComponentState state, boolean enabled) { - // Update styles as they might have changed when the caption changed - setStyles(getStylesFromState(state, enabled)); - - boolean isEmpty = true; - - if (state.resources.containsKey(ComponentConstants.ICON_RESOURCE)) { - if (icon == null) { - icon = new Icon(owner.getConnection()); - - DOM.insertChild(getElement(), icon.getElement(), 0); - } - icon.setUri(state.resources.get( - ComponentConstants.ICON_RESOURCE).getURL()); - isEmpty = false; - } else { - if (icon != null) { - DOM.removeChild(getElement(), icon.getElement()); - icon = null; - } - - } - - if (state.caption != null) { - if (captionText == null) { - captionText = DOM.createSpan(); - DOM.insertChild(getElement(), captionText, icon == null ? 0 - : 1); - } - String c = state.caption; - if (c == null) { - c = ""; - } else { - isEmpty = false; - } - DOM.setInnerText(captionText, c); - } else { - // TODO should span also be removed - } - - if (state.description != null && captionText != null) { - addStyleDependentName("hasdescription"); - } else { - removeStyleDependentName("hasdescription"); - } - - boolean required = owner instanceof AbstractFieldConnector - && ((AbstractFieldConnector) owner).isRequired(); - if (required) { - if (requiredFieldIndicator == null) { - requiredFieldIndicator = DOM.createSpan(); - DOM.setInnerText(requiredFieldIndicator, "*"); - DOM.setElementProperty(requiredFieldIndicator, "className", - "v-required-field-indicator"); - DOM.appendChild(getElement(), requiredFieldIndicator); - } - } else { - if (requiredFieldIndicator != null) { - DOM.removeChild(getElement(), requiredFieldIndicator); - requiredFieldIndicator = null; - } - } - - // Workaround for IE weirdness, sometimes returns bad height in some - // circumstances when Caption is empty. See #1444 - // IE7 bugs more often. I wonder what happens when IE8 arrives... - // FIXME: This could be unnecessary for IE8+ - if (BrowserInfo.get().isIE()) { - if (isEmpty) { - setHeight("0px"); - DOM.setStyleAttribute(getElement(), "overflow", "hidden"); - } else { - setHeight(""); - DOM.setStyleAttribute(getElement(), "overflow", ""); - } - - } - - } - - /** - * Returns Paintable for which this Caption belongs to. - * - * @return owner Widget - */ - public ComponentConnector getOwner() { - return owner; - } - } - - class ErrorFlag extends HTML { - private static final String CLASSNAME = VFormLayout.CLASSNAME - + "-error-indicator"; - Element errorIndicatorElement; - - private ComponentConnector owner; - - public ErrorFlag(ComponentConnector owner) { - setStyleName(CLASSNAME); - sinkEvents(VTooltip.TOOLTIP_EVENTS); - this.owner = owner; - } - - public ComponentConnector getOwner() { - return owner; - } - - public void updateError(String errorMessage, boolean hideErrors) { - boolean showError = null != errorMessage; - if (hideErrors) { - showError = false; - } - - if (showError) { - if (errorIndicatorElement == null) { - errorIndicatorElement = DOM.createDiv(); - DOM.setInnerHTML(errorIndicatorElement, " "); - DOM.setElementProperty(errorIndicatorElement, "className", - "v-errorindicator"); - DOM.appendChild(getElement(), errorIndicatorElement); - } - - } else if (errorIndicatorElement != null) { - DOM.removeChild(getElement(), errorIndicatorElement); - errorIndicatorElement = null; - } - } - - } -}