/* * Copyright (c) 2010, grossmann * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the jo-widgets.org nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL jo-widgets.org BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ package org.jowidgets.tools.powo; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import org.jowidgets.api.controller.IContainerListener; import org.jowidgets.api.controller.IContainerRegistry; import org.jowidgets.api.controller.IListenerFactory; import org.jowidgets.api.layout.ILayoutFactory; import org.jowidgets.api.widgets.IComponent; import org.jowidgets.api.widgets.IContainer; import org.jowidgets.api.widgets.IControl; import org.jowidgets.api.widgets.blueprint.builder.IContainerSetupBuilder; import org.jowidgets.common.image.IImageConstant; import org.jowidgets.common.types.Dimension; import org.jowidgets.common.types.Rectangle; import org.jowidgets.common.widgets.controller.IComponentListener; import org.jowidgets.common.widgets.controller.IFocusListener; import org.jowidgets.common.widgets.controller.IKeyListener; import org.jowidgets.common.widgets.controller.IMouseListener; import org.jowidgets.common.widgets.controller.IPopupDetectionListener; import org.jowidgets.common.widgets.descriptor.IWidgetDescriptor; import org.jowidgets.common.widgets.factory.ICustomWidgetCreator; import org.jowidgets.common.widgets.layout.ILayoutDescriptor; import org.jowidgets.common.widgets.layout.ILayouter; import org.jowidgets.util.Assert; import org.jowidgets.util.Tuple; /** * @deprecated The idea of POWO's (Plain Old Widget Object's) has not been established. * For that, POWO's will no longer be supported and may removed completely in middle term. * Feel free to move them to your own open source project. */ @Deprecated class Container<WIDGET_TYPE extends IContainer, BLUE_PRINT_TYPE extends IWidgetDescriptor<? extends WIDGET_TYPE> & IContainerSetupBuilder<?>> extends Component<WIDGET_TYPE, BLUE_PRINT_TYPE> implements IContainer { @SuppressWarnings("rawtypes") private final List<Tuple<Widget, Object>> preWidgets; private final JoWidgetFactory widgetFactory; private final Set<IContainerListener> containerListeners; private final Set<IContainerRegistry> containerChildrenRegistries; private final Set<IListenerFactory<IComponentListener>> componentListenerFactories; private final Set<IListenerFactory<IFocusListener>> focusListenerFactories; private final Set<IListenerFactory<IKeyListener>> keyListenerFactories; private final Set<IListenerFactory<IMouseListener>> mouseListenerFactories; private final Set<IListenerFactory<IPopupDetectionListener>> popupDetectionListenerFactories; private Collection<? extends IControl> tabOrder; @SuppressWarnings("rawtypes") Container(final BLUE_PRINT_TYPE bluePrint) { super(bluePrint); this.preWidgets = new LinkedList<Tuple<Widget, Object>>(); this.widgetFactory = new JoWidgetFactory(); this.containerListeners = new LinkedHashSet<IContainerListener>(); this.containerChildrenRegistries = new LinkedHashSet<IContainerRegistry>(); this.componentListenerFactories = new LinkedHashSet<IListenerFactory<IComponentListener>>(); this.focusListenerFactories = new LinkedHashSet<IListenerFactory<IFocusListener>>(); this.keyListenerFactories = new LinkedHashSet<IListenerFactory<IKeyListener>>(); this.mouseListenerFactories = new LinkedHashSet<IListenerFactory<IMouseListener>>(); this.popupDetectionListenerFactories = new LinkedHashSet<IListenerFactory<IPopupDetectionListener>>(); } @SuppressWarnings({"unchecked", "rawtypes"}) @Override void initialize(final WIDGET_TYPE widget) { super.initialize(widget); for (final IContainerListener containerListener : containerListeners) { widget.addContainerListener(containerListener); } for (final IContainerRegistry registry : containerChildrenRegistries) { widget.addContainerRegistry(registry); } for (final IListenerFactory<IComponentListener> factory : componentListenerFactories) { widget.addComponentListenerRecursive(factory); } for (final IListenerFactory<IFocusListener> factory : focusListenerFactories) { widget.addFocusListenerRecursive(factory); } for (final IListenerFactory<IKeyListener> factory : keyListenerFactories) { widget.addKeyListenerRecursive(factory); } for (final IListenerFactory<IMouseListener> factory : mouseListenerFactories) { widget.addMouseListenerRecursive(factory); } for (final IListenerFactory<IPopupDetectionListener> factory : popupDetectionListenerFactories) { widget.addPopupDetectionListenerRecursive(factory); } for (final Tuple<Widget, Object> preWidgetTuple : preWidgets) { final Widget preWidget = preWidgetTuple.getFirst(); final Object layoutConstraints = preWidgetTuple.getSecond(); final IControl newWidget = widget.add(preWidget.getDescriptor(), layoutConstraints); preWidget.initialize(newWidget); } if (tabOrder != null) { widget.setTabOrder(tabOrder); tabOrder = null; } } public final <P_WIDGET_TYPE extends Component<? extends IControl, ?>> P_WIDGET_TYPE add(final P_WIDGET_TYPE widget) { return add(widget, ""); } @SuppressWarnings({"rawtypes", "unchecked"}) public final <P_WIDGET_TYPE extends Component<? extends IControl, ?>> P_WIDGET_TYPE add( final P_WIDGET_TYPE widget, final Object layoutConstraints) { if (isInitialized()) { final IComponent newWidget = getWidget().add(widget.getDescriptor(), layoutConstraints); final Component rawWidget = widget; rawWidget.initialize(newWidget); return widget; } else { preWidgets.add(new Tuple<Widget, Object>(widget, layoutConstraints)); return widget; } } public final JoLabel addLabel(final String text) { final JoLabel label = new JoLabel(text); add(label); return label; } public final JoLabel addLabel(final String text, final Object layoutConstraints) { final JoLabel label = new JoLabel(text); add(label, layoutConstraints); return label; } public final JoLabel addLabel(final String text, final String tooltipText, final Object layoutConstraints) { final JoLabel label = new JoLabel(text, tooltipText); add(label, layoutConstraints); return label; } public final JoLabel addLabel( final IImageConstant icon, final String text, final String tooltipText, final Object layoutConstraints) { final JoLabel label = new JoLabel(icon, text, tooltipText); add(label, layoutConstraints); return label; } @Override public void setTabOrder(final Collection<? extends IControl> tabOrder) { if (isInitialized()) { getWidget().setTabOrder(tabOrder); } else { this.tabOrder = tabOrder; } } @Override public void setTabOrder(final IControl... controls) { if (isInitialized()) { getWidget().setTabOrder(controls); } else { if (controls != null) { this.tabOrder = Arrays.asList(controls); } else { this.tabOrder = Collections.emptyList(); } } } @Override public void addContainerListener(final IContainerListener listener) { if (isInitialized()) { getWidget().addContainerListener(listener); } else { containerListeners.add(listener); } } @Override public void removeContainerListener(final IContainerListener listener) { if (isInitialized()) { getWidget().removeContainerListener(listener); } else { containerListeners.remove(listener); } } @Override public void addContainerRegistry(final IContainerRegistry registry) { if (isInitialized()) { getWidget().addContainerRegistry(registry); } else { containerChildrenRegistries.add(registry); } } @Override public void removeContainerRegistry(final IContainerRegistry registry) { if (isInitialized()) { getWidget().removeContainerRegistry(registry); } else { containerChildrenRegistries.remove(registry); } } @Override public void addComponentListenerRecursive(final IListenerFactory<IComponentListener> listenerFactory) { if (isInitialized()) { getWidget().addComponentListenerRecursive(listenerFactory); } else { componentListenerFactories.add(listenerFactory); } } @Override public void removeComponentListenerRecursive(final IListenerFactory<IComponentListener> listenerFactory) { if (isInitialized()) { getWidget().removeComponentListenerRecursive(listenerFactory); } else { componentListenerFactories.remove(listenerFactory); } } @Override public void addFocusListenerRecursive(final IListenerFactory<IFocusListener> listenerFactory) { if (isInitialized()) { getWidget().addFocusListenerRecursive(listenerFactory); } else { focusListenerFactories.add(listenerFactory); } } @Override public void removeFocusListenerRecursive(final IListenerFactory<IFocusListener> listenerFactory) { if (isInitialized()) { getWidget().removeFocusListenerRecursive(listenerFactory); } else { focusListenerFactories.remove(listenerFactory); } } @Override public void addKeyListenerRecursive(final IListenerFactory<IKeyListener> listenerFactory) { if (isInitialized()) { getWidget().addKeyListenerRecursive(listenerFactory); } else { keyListenerFactories.add(listenerFactory); } } @Override public void removeKeyListenerRecursive(final IListenerFactory<IKeyListener> listenerFactory) { if (isInitialized()) { getWidget().removeKeyListenerRecursive(listenerFactory); } else { keyListenerFactories.remove(listenerFactory); } } @Override public void addMouseListenerRecursive(final IListenerFactory<IMouseListener> listenerFactory) { if (isInitialized()) { getWidget().addMouseListenerRecursive(listenerFactory); } else { mouseListenerFactories.add(listenerFactory); } } @Override public void removeMouseListenerRecursive(final IListenerFactory<IMouseListener> listenerFactory) { if (isInitialized()) { getWidget().removeMouseListenerRecursive(listenerFactory); } else { mouseListenerFactories.remove(listenerFactory); } } @Override public void addPopupDetectionListenerRecursive(final IListenerFactory<IPopupDetectionListener> listenerFactory) { if (isInitialized()) { getWidget().addPopupDetectionListenerRecursive(listenerFactory); } else { popupDetectionListenerFactories.add(listenerFactory); } } @Override public void removePopupDetectionListenerRecursive(final IListenerFactory<IPopupDetectionListener> listenerFactory) { if (isInitialized()) { getWidget().removePopupDetectionListenerRecursive(listenerFactory); } else { popupDetectionListenerFactories.remove(listenerFactory); } } @SuppressWarnings({"unchecked", "rawtypes"}) @Override public <M_WIDGET_TYPE extends IControl> M_WIDGET_TYPE add( final int index, final IWidgetDescriptor<? extends M_WIDGET_TYPE> descriptor, final Object layoutConstraints) { if (isInitialized()) { return getWidget().add(index, descriptor, layoutConstraints); } else { final Widget powo = widgetFactory.create(descriptor); preWidgets.add(index, new Tuple<Widget, Object>(powo, layoutConstraints)); return (M_WIDGET_TYPE) powo; } } @Override public <M_WIDGET_TYPE extends IControl> M_WIDGET_TYPE add( final int index, final IWidgetDescriptor<? extends M_WIDGET_TYPE> descriptor) { return add(index, descriptor, null); } @SuppressWarnings({"unchecked", "rawtypes"}) @Override public final <M_WIDGET_TYPE extends IControl> M_WIDGET_TYPE add( final IWidgetDescriptor<? extends M_WIDGET_TYPE> descriptor, final Object layoutConstraints) { if (isInitialized()) { return getWidget().add(descriptor, layoutConstraints); } else { final Widget powo = widgetFactory.create(descriptor); preWidgets.add(new Tuple<Widget, Object>(powo, layoutConstraints)); return (M_WIDGET_TYPE) powo; } } @Override public <M_WIDGET_TYPE extends IControl> M_WIDGET_TYPE add(final IWidgetDescriptor<? extends M_WIDGET_TYPE> descriptor) { return add(descriptor, null); } @SuppressWarnings("rawtypes") @Override public List<IControl> getChildren() { if (isInitialized()) { return getWidget().getChildren(); } else { final List<IControl> result = new LinkedList<IControl>(); for (final Tuple<Widget, Object> preWidgetTuple : preWidgets) { result.add((IControl) preWidgetTuple.getFirst()); } return result; } } @SuppressWarnings("rawtypes") @Override public boolean remove(final IControl control) { if (isInitialized()) { return getWidget().remove(control); } else { Assert.paramNotNull(control, "control"); Tuple<Widget, Object> foundControl = null; for (final Tuple<Widget, Object> preWidgetTuple : preWidgets) { if (control == preWidgetTuple.getFirst()) { foundControl = preWidgetTuple; break; } } if (foundControl != null) { final boolean removed = preWidgets.remove(foundControl); if (removed) { return true; } else { throw new IllegalStateException( "Control could not be removed from pre widget list. This seems to be a bug. Please report this."); } } else { return false; } } } @Override public boolean isReparentable() { checkInitialized(); return getWidget().isReparentable(); } @Override public final void setLayout(final ILayoutDescriptor layoutDescriptor) { if (isInitialized()) { getWidget().setLayout(layoutDescriptor); } else { getBluePrint().setLayout(layoutDescriptor); } } @SuppressWarnings("unchecked") @Override public <LAYOUT_TYPE extends ILayouter> LAYOUT_TYPE setLayout(final ILayoutFactory<LAYOUT_TYPE> layoutFactory) { if (isInitialized()) { return getWidget().setLayout(layoutFactory); } else { final ILayouter result = layoutFactory.create(this); getBluePrint().setLayout(result); return (LAYOUT_TYPE) result; } } @Override public final void removeAll() { if (isInitialized()) { getWidget().removeAll(); } else { preWidgets.clear(); } } @Override public Rectangle getClientArea() { checkInitialized(); return getWidget().getClientArea(); } @Override public Dimension computeDecoratedSize(final Dimension clientAreaSize) { checkInitialized(); return getWidget().computeDecoratedSize(clientAreaSize); } @Override public void layout() { checkInitialized(); getWidget().layout(); } @Override public void layoutLater() { checkInitialized(); getWidget().layoutLater(); } @Override public final void layoutBegin() { checkInitialized(); getWidget().layoutBegin(); } @Override public final void layoutEnd() { checkInitialized(); getWidget().layoutEnd(); } @Override public <M_WIDGET_TYPE extends IControl> M_WIDGET_TYPE add( final int index, final ICustomWidgetCreator<M_WIDGET_TYPE> creator, final Object layoutConstraints) { checkInitialized(); return getWidget().add(index, creator, layoutConstraints); } @Override public <M_WIDGET_TYPE extends IControl> M_WIDGET_TYPE add(final int index, final ICustomWidgetCreator<M_WIDGET_TYPE> creator) { return add(index, creator, null); } @Override public final <M_WIDGET_TYPE extends IControl> M_WIDGET_TYPE add( final ICustomWidgetCreator<M_WIDGET_TYPE> creator, final Object layoutConstraints) { checkInitialized(); return getWidget().add(creator, layoutConstraints); } @Override public <M_WIDGET_TYPE extends IControl> M_WIDGET_TYPE add(final ICustomWidgetCreator<M_WIDGET_TYPE> creator) { return add(creator, null); } }