/* * Copyright (c) 2011, 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.workbench.toolkit.impl; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import org.jowidgets.api.model.item.IMenuModel; import org.jowidgets.common.image.IImageConstant; import org.jowidgets.common.widgets.controller.ITreeNodeListener; import org.jowidgets.workbench.api.IDisposeCallback; import org.jowidgets.workbench.toolkit.api.IComponentFactory; import org.jowidgets.workbench.toolkit.api.IComponentNodeContainerModel; import org.jowidgets.workbench.toolkit.api.IComponentNodeInitializeCallback; import org.jowidgets.workbench.toolkit.api.IComponentNodeModel; import org.jowidgets.workbench.toolkit.api.IWorkbenchApplicationModel; import org.jowidgets.workbench.toolkit.api.IWorkbenchModel; import org.jowidgets.workbench.toolkit.api.IWorkbenchPartModelListener; class ComponentNodeModel extends ComponentNodeContainerModel implements IComponentNodeModel { private final WorkbenchPartModelObservable workbenchPartModelObservable; private final Set<ITreeNodeListener> treeNodeListeners; private String label; private String tooltip; private IImageConstant icon; private boolean selected; private boolean expanded; private IMenuModel popupMenu; private final IComponentFactory componentFactory; private final IComponentNodeInitializeCallback initializeCallback; private final IDisposeCallback disposeCallback; private IComponentNodeContainerModel parentContainer; ComponentNodeModel( final String id, final String label, final String tooltip, final IImageConstant icon, final boolean selected, final boolean expanded, final IMenuModel popupMenu, final IComponentFactory componentFactory, final IComponentNodeInitializeCallback initializeCallback, final IDisposeCallback disposeCallback, final List<IComponentNodeModel> children) { super(id, children); this.workbenchPartModelObservable = new WorkbenchPartModelObservable(); this.treeNodeListeners = new HashSet<ITreeNodeListener>(); this.label = label; this.tooltip = tooltip; this.icon = icon; this.selected = selected; this.expanded = expanded; this.popupMenu = popupMenu; this.componentFactory = componentFactory; this.initializeCallback = initializeCallback; this.disposeCallback = disposeCallback; } @Override public String getLabel() { return label; } @Override public String getTooltip() { return tooltip; } @Override public IImageConstant getIcon() { return icon; } @Override public boolean isSelected() { return selected; } @Override public boolean isExpanded() { return expanded; } @Override public IMenuModel getPopupMenu() { return popupMenu; } @Override public IComponentFactory getComponentFactory() { return componentFactory; } @Override public IComponentNodeInitializeCallback getInitializeCallback() { return initializeCallback; } @Override public IDisposeCallback getDisposeCallback() { return disposeCallback; } @Override public void setLabel(final String label) { this.label = label; fireModelChanged(); } @Override public void setTooltip(final String tooltip) { this.tooltip = tooltip; fireModelChanged(); } @Override public void setIcon(final IImageConstant icon) { this.icon = icon; fireModelChanged(); } @Override public void setSelected(final boolean selected) { this.selected = selected; fireModelChanged(); fireSelectionChanged(selected); } @Override public void setExpanded(final boolean expanded) { this.expanded = expanded; fireModelChanged(); fireExpandedChanged(expanded); } @Override public void setPopupMenu(final IMenuModel popupMenu) { this.popupMenu = popupMenu; fireModelChanged(); } @Override public String getPathId() { final LinkedList<IComponentNodeContainerModel> containerList = new LinkedList<IComponentNodeContainerModel>(); IComponentNodeContainerModel container = this; containerList.add(this); while (container.getParentContainer() != null) { container = container.getParentContainer(); containerList.addFirst(container); } final StringBuilder result = new StringBuilder(); for (final IComponentNodeContainerModel containerModel : containerList) { result.append(containerModel.getId().toString() + "#"); } return result.substring(0, result.length() - 1); } @Override public void setParentContainer(final IComponentNodeContainerModel parentContainer) { if (this.parentContainer != parentContainer) { if (this.parentContainer != null) { this.parentContainer.remove(this); } if (parentContainer != null) { if (!parentContainer.getChildren().contains(this)) { parentContainer.addChild(this); } } this.parentContainer = parentContainer; } } @Override public IComponentNodeContainerModel getParentContainer() { return parentContainer; } @Override public IComponentNodeModel getParent() { final IComponentNodeContainerModel parent = getParentContainer(); if (parent instanceof IComponentNodeModel) { return (IComponentNodeModel) parent; } return null; } @Override public IWorkbenchApplicationModel getApplication() { IComponentNodeContainerModel parent = getParentContainer(); while (parent.getParentContainer() != null) { parent = parent.getParentContainer(); } if (parent instanceof IWorkbenchApplicationModel) { return (IWorkbenchApplicationModel) parent; } return null; } @Override public IWorkbenchModel getWorkbench() { final IWorkbenchApplicationModel application = getApplication(); if (application != null) { return application.getWorkbench(); } return null; } @Override public void addWorkbenchPartModelListener(final IWorkbenchPartModelListener listener) { workbenchPartModelObservable.addWorkbenchPartModelListener(listener); } @Override public void removeWorkbenchPartModelListener(final IWorkbenchPartModelListener listener) { workbenchPartModelObservable.removeWorkbenchPartModelListener(listener); } @Override public void addTreeNodeListener(final ITreeNodeListener listener) { treeNodeListeners.add(listener); } @Override public void removeTreeNodeListener(final ITreeNodeListener listener) { treeNodeListeners.remove(listener); } @Override public IComponentNodeModel unwrap() { return this; } private void fireSelectionChanged(final boolean selected) { for (final ITreeNodeListener listener : treeNodeListeners) { listener.selectionChanged(selected); } } private void fireExpandedChanged(final boolean expanded) { for (final ITreeNodeListener listener : treeNodeListeners) { listener.expandedChanged(expanded); } } private void fireModelChanged() { workbenchPartModelObservable.fireModelChanged(); } @Override public int hashCode() { return unwrap().hashCode(); } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (!(obj instanceof IComponentNodeModel)) { return false; } final IComponentNodeModel other = (IComponentNodeModel) obj; return unwrap() == other.unwrap(); } }