From ac74d37b185837149c1ef8d5bfe6fc921c7e1ac4 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Tue, 23 Aug 2016 15:18:41 +0300 Subject: Move Vaadin 7 CustomField to compatibility package Change-Id: Ie1d37fd2d249bf35e953f095fa80a6905a135793 --- .../legacy/ui/LegacyCustomFieldConnector.java | 25 ---- .../ui/customfield/CustomFieldConnector.java | 124 +++++++++++++++++ .../main/java/com/vaadin/v7/ui/CustomField.java | 155 +++++++++++++++++++++ .../main/java/com/vaadin/v7/ui/CustomField.java | 155 --------------------- 4 files changed, 279 insertions(+), 180 deletions(-) delete mode 100644 client/src/main/java/com/vaadin/client/legacy/ui/LegacyCustomFieldConnector.java create mode 100644 compatibility-client/src/main/java/com/vaadin/v7/client/ui/customfield/CustomFieldConnector.java create mode 100644 compatibility-server/src/main/java/com/vaadin/v7/ui/CustomField.java delete mode 100644 server/src/main/java/com/vaadin/v7/ui/CustomField.java diff --git a/client/src/main/java/com/vaadin/client/legacy/ui/LegacyCustomFieldConnector.java b/client/src/main/java/com/vaadin/client/legacy/ui/LegacyCustomFieldConnector.java deleted file mode 100644 index 19b13f53d6..0000000000 --- a/client/src/main/java/com/vaadin/client/legacy/ui/LegacyCustomFieldConnector.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2000-2016 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.legacy.ui; - -import com.vaadin.client.ui.customfield.CustomFieldConnector; -import com.vaadin.shared.ui.Connect; -import com.vaadin.v7.ui.CustomField; - -@Connect(value = CustomField.class) -public class LegacyCustomFieldConnector extends CustomFieldConnector { - -} diff --git a/compatibility-client/src/main/java/com/vaadin/v7/client/ui/customfield/CustomFieldConnector.java b/compatibility-client/src/main/java/com/vaadin/v7/client/ui/customfield/CustomFieldConnector.java new file mode 100644 index 0000000000..33495a399d --- /dev/null +++ b/compatibility-client/src/main/java/com/vaadin/v7/client/ui/customfield/CustomFieldConnector.java @@ -0,0 +1,124 @@ +/* + * Copyright 2000-2016 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.v7.client.ui.customfield; + +import java.util.Collections; +import java.util.List; + +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.user.client.ui.Widget; +import com.vaadin.client.ComponentConnector; +import com.vaadin.client.ConnectorHierarchyChangeEvent; +import com.vaadin.client.ConnectorHierarchyChangeEvent.ConnectorHierarchyChangeHandler; +import com.vaadin.client.HasComponentsConnector; +import com.vaadin.client.ui.AbstractFieldConnector; +import com.vaadin.client.ui.VCustomComponent; +import com.vaadin.shared.ui.Connect; +import com.vaadin.v7.ui.CustomField; + +@Connect(value = CustomField.class) +public class CustomFieldConnector extends AbstractFieldConnector + implements HasComponentsConnector, ConnectorHierarchyChangeHandler { + + List childComponents; + + /** + * Default constructor + */ + public CustomFieldConnector() { + addConnectorHierarchyChangeHandler(this); + } + + @Override + public VCustomComponent getWidget() { + return (VCustomComponent) super.getWidget(); + } + + @Override + public void updateCaption(ComponentConnector connector) { + // NOP, custom field does not render the caption of its content + } + + @Override + public void onConnectorHierarchyChange( + ConnectorHierarchyChangeEvent event) { + // We always have 1 child, unless the child is hidden + getWidget().setWidget(getContentWidget()); + } + + /* + * (non-Javadoc) + * + * @see com.vaadin.client.HasComponentsConnector#getChildren() + */ + @Override + public List getChildComponents() { + if (childComponents == null) { + return Collections.emptyList(); + } + + return childComponents; + } + + /* + * (non-Javadoc) + * + * @see com.vaadin.client.HasComponentsConnector#setChildren + * (java.util.Collection) + */ + @Override + public void setChildComponents(List childComponents) { + this.childComponents = childComponents; + } + + @Override + public HandlerRegistration addConnectorHierarchyChangeHandler( + ConnectorHierarchyChangeHandler handler) { + return ensureHandlerManager() + .addHandler(ConnectorHierarchyChangeEvent.TYPE, handler); + } + + /** + * Returns the content (only/first child) of the container. + * + * @return child connector or null if none (e.g. invisible or not set on + * server) + */ + protected ComponentConnector getContent() { + List children = getChildComponents(); + if (children.isEmpty()) { + return null; + } else { + return children.get(0); + } + } + + /** + * Returns the widget (if any) of the content of the container. + * + * @return widget of the only/first connector of the container, null if no + * content or if there is no widget for the connector + */ + protected Widget getContentWidget() { + ComponentConnector content = getContent(); + if (null != content) { + return content.getWidget(); + } else { + return null; + } + } + +} diff --git a/compatibility-server/src/main/java/com/vaadin/v7/ui/CustomField.java b/compatibility-server/src/main/java/com/vaadin/v7/ui/CustomField.java new file mode 100644 index 0000000000..f55b3307a3 --- /dev/null +++ b/compatibility-server/src/main/java/com/vaadin/v7/ui/CustomField.java @@ -0,0 +1,155 @@ +/* + * Copyright 2000-2016 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.v7.ui; + +import java.io.Serializable; +import java.util.Iterator; + +import com.vaadin.ui.Component; +import com.vaadin.ui.HasComponents; +import com.vaadin.v7.data.Property; + +/** + * A {@link Field} whose UI content can be constructed by the user, enabling the + * creation of e.g. form fields by composing Vaadin components. Customization of + * both the visual presentation and the logic of the field is possible. + * + * Subclasses must implement {@link #getType()} and {@link #initContent()}. + * + * Most custom fields can simply compose a user interface that calls the methods + * {@link #setInternalValue(Object)} and {@link #getInternalValue()} when + * necessary. + * + * It is also possible to override {@link #validate()}, + * {@link #setInternalValue(Object)}, {@link #commit()}, + * {@link #setPropertyDataSource(Property)}, {@link #isEmpty()} and other logic + * of the field. Methods overriding {@link #setInternalValue(Object)} should + * also call the corresponding superclass method. + * + * @param + * field value type + * + * @since 7.0 + */ +public abstract class CustomField extends AbstractField + implements HasComponents { + + /** + * The root component implementing the custom component. + */ + private Component root = null; + + /** + * Constructs a new custom field. + * + *

+ * The component is implemented by wrapping the methods of the composition + * root component given as parameter. The composition root must be set + * before the component can be used. + *

+ */ + public CustomField() { + // expand horizontally by default + setWidth(100, Unit.PERCENTAGE); + } + + /** + * Constructs the content and notifies it that the {@link CustomField} is + * attached to a window. + * + * @see com.vaadin.ui.Component#attach() + */ + @Override + public void attach() { + // First call super attach to notify all children (none if content has + // not yet been created) + super.attach(); + + // If the content has not yet been created, create and attach it at + // this point by calling getContent() + getContent(); + } + + /** + * Returns the content (UI) of the custom component. + * + * @return Component + */ + protected Component getContent() { + if (null == root) { + root = initContent(); + root.setParent(this); + } + return root; + } + + /** + * Create the content component or layout for the field. Subclasses of + * {@link CustomField} should implement this method. + * + * Note that this method is called when the CustomField is attached to a + * layout or when {@link #getContent()} is called explicitly for the first + * time. It is only called once for a {@link CustomField}. + * + * @return {@link Component} representing the UI of the CustomField + */ + protected abstract Component initContent(); + + // Size related methods + // TODO might not be necessary to override but following the pattern from + // AbstractComponentContainer + + @Override + public void setHeight(float height, Unit unit) { + super.setHeight(height, unit); + markAsDirtyRecursive(); + } + + @Override + public void setWidth(float width, Unit unit) { + super.setWidth(width, unit); + markAsDirtyRecursive(); + } + + // ComponentContainer methods + + private class ComponentIterator + implements Iterator, Serializable { + boolean first = (root != null); + + @Override + public boolean hasNext() { + return first; + } + + @Override + public Component next() { + first = false; + return getContent(); + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + } + + @Override + public Iterator iterator() { + return new ComponentIterator(); + } +} diff --git a/server/src/main/java/com/vaadin/v7/ui/CustomField.java b/server/src/main/java/com/vaadin/v7/ui/CustomField.java deleted file mode 100644 index f55b3307a3..0000000000 --- a/server/src/main/java/com/vaadin/v7/ui/CustomField.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright 2000-2016 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.v7.ui; - -import java.io.Serializable; -import java.util.Iterator; - -import com.vaadin.ui.Component; -import com.vaadin.ui.HasComponents; -import com.vaadin.v7.data.Property; - -/** - * A {@link Field} whose UI content can be constructed by the user, enabling the - * creation of e.g. form fields by composing Vaadin components. Customization of - * both the visual presentation and the logic of the field is possible. - * - * Subclasses must implement {@link #getType()} and {@link #initContent()}. - * - * Most custom fields can simply compose a user interface that calls the methods - * {@link #setInternalValue(Object)} and {@link #getInternalValue()} when - * necessary. - * - * It is also possible to override {@link #validate()}, - * {@link #setInternalValue(Object)}, {@link #commit()}, - * {@link #setPropertyDataSource(Property)}, {@link #isEmpty()} and other logic - * of the field. Methods overriding {@link #setInternalValue(Object)} should - * also call the corresponding superclass method. - * - * @param - * field value type - * - * @since 7.0 - */ -public abstract class CustomField extends AbstractField - implements HasComponents { - - /** - * The root component implementing the custom component. - */ - private Component root = null; - - /** - * Constructs a new custom field. - * - *

- * The component is implemented by wrapping the methods of the composition - * root component given as parameter. The composition root must be set - * before the component can be used. - *

- */ - public CustomField() { - // expand horizontally by default - setWidth(100, Unit.PERCENTAGE); - } - - /** - * Constructs the content and notifies it that the {@link CustomField} is - * attached to a window. - * - * @see com.vaadin.ui.Component#attach() - */ - @Override - public void attach() { - // First call super attach to notify all children (none if content has - // not yet been created) - super.attach(); - - // If the content has not yet been created, create and attach it at - // this point by calling getContent() - getContent(); - } - - /** - * Returns the content (UI) of the custom component. - * - * @return Component - */ - protected Component getContent() { - if (null == root) { - root = initContent(); - root.setParent(this); - } - return root; - } - - /** - * Create the content component or layout for the field. Subclasses of - * {@link CustomField} should implement this method. - * - * Note that this method is called when the CustomField is attached to a - * layout or when {@link #getContent()} is called explicitly for the first - * time. It is only called once for a {@link CustomField}. - * - * @return {@link Component} representing the UI of the CustomField - */ - protected abstract Component initContent(); - - // Size related methods - // TODO might not be necessary to override but following the pattern from - // AbstractComponentContainer - - @Override - public void setHeight(float height, Unit unit) { - super.setHeight(height, unit); - markAsDirtyRecursive(); - } - - @Override - public void setWidth(float width, Unit unit) { - super.setWidth(width, unit); - markAsDirtyRecursive(); - } - - // ComponentContainer methods - - private class ComponentIterator - implements Iterator, Serializable { - boolean first = (root != null); - - @Override - public boolean hasNext() { - return first; - } - - @Override - public Component next() { - first = false; - return getContent(); - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - } - - @Override - public Iterator iterator() { - return new ComponentIterator(); - } -} -- cgit v1.2.3