blob: cd66aab545e49821743f9a612ec6d6b4db4d517b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.wsdl.ui.internal.graph.editparts;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.RectangleFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartFactory;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.gef.editpolicies.SelectionEditPolicy;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.wst.wsdl.ui.internal.WSDLEditorPlugin;
import org.eclipse.wst.wsdl.ui.internal.gef.util.editparts.InteractorHelper;
import org.eclipse.wst.wsdl.ui.internal.graph.GraphicsConstants;
import org.eclipse.wst.wsdl.ui.internal.graph.WSDLComponentViewer;
import org.eclipse.wst.wsdl.ui.internal.graph.editpolicies.WSDLSelectionHandlesEditPolicyImpl;
import org.eclipse.wst.wsdl.ui.internal.graph.figures.TreeNodeContentFigure;
import org.eclipse.wst.wsdl.ui.internal.model.ModelAdapter;
import org.eclipse.wst.wsdl.ui.internal.model.ModelAdapterListener;
import org.eclipse.wst.xsd.ui.internal.gef.util.figures.ContainerFigure;
public abstract class TreeNodeEditPart extends AbstractGraphicalEditPart implements ModelAdapterListener, GraphicsConstants, IFeedbackHandler
{
protected Label label;
protected Label label2;
protected ContainerFigure labelHolder = new ContainerFigure();
protected TreeNodeContentFigure contentFigure;
protected InteractorHelper interactorHelper;
protected boolean isSelected = false;
protected boolean isReadOnly = false;
public void activate()
{
super.activate();
addModelAdapterListener(getModel(), this);
//viewer = getViewer();
}
int removeNotifyCount = 0;
public void removeNotify()
{
removeNotifyCount++;
if (removeNotifyCount == 1)
{
super.removeNotify();
}
}
/**
* Apart from the deactivation done in super, the source
* and target connections are deactivated, and the visual
* part of the this is removed.
*
* @see #activate()
*/
public void deactivate()
{
removeModelAdapterListener(getModel(), this);
super.deactivate();
}
protected void createEditPolicies()
{
//SelectionHandlesEditPolicyImpl policy = new SelectionHandlesEditPolicyImpl();
//installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, policy);
SelectionEditPolicy feedBackSelectionEditPolicy = new WSDLSelectionHandlesEditPolicyImpl();
installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, feedBackSelectionEditPolicy);
}
protected EditPart createChild(Object model)
{
return getEditPartFactory().createEditPart(this, model);
}
public void propertyChanged(Object object, String property)
{
if (property == ModelAdapter.CHILDREN_PROPERTY)
{
refreshChildren();
}
else if (property == ModelAdapter.DETAIL_PROPERTY)
{
refreshVisuals();
}
else
{
refreshChildren();
refreshVisuals();
}
}
protected IFigure createFigure()
{
createContentFigure();
createFigureContent();
return contentFigure;
}
protected void createContentFigure()
{
contentFigure = new TreeNodeContentFigure();
}
protected void createFigureContent()
{
// add a bit of space between the interactor and icon
//
RectangleFigure space = new RectangleFigure();
space.setVisible(false);
space.setPreferredSize(new Dimension(3, 3));
contentFigure.getIconArea().add(space);
labelHolder = new ContainerFigure();
labelHolder.setFill(true);
contentFigure.getIconArea().add(labelHolder);
label = new Label(WSDLEditorPlugin.getWSDLString("_UI_LABEL_UNKNOWN_OBJECT"));
label.setForegroundColor(ColorConstants.black);
labelHolder.add(label);
interactorHelper = new InteractorHelper(this, contentFigure.getInteractor(), contentFigure.getInnerContentArea());
}
public IFigure getContentPane()
{
return contentFigure.getInnerContentArea();
}
public Color computeLabelColor()
{
Color color = ColorConstants.black;
if (isSelected)
{
color = ColorConstants.white;
}
else if (isReadOnly)
{
color = ColorConstants.gray;
}
return color;
}
public void refreshVisuals()
{
ModelAdapter adapter = getModelAdapter(getModel());
if (adapter != null)
{
isReadOnly = Boolean.TRUE.equals(adapter.getProperty(getModel(), "isReadOnly"));
label.setForegroundColor(computeLabelColor());
label.setText((String)adapter.getProperty(getModel(), ModelAdapter.LABEL_PROPERTY));
label.setIcon((Image)adapter.getProperty(getModel(), ModelAdapter.IMAGE_PROPERTY));
}
else
{
label.setText(WSDLEditorPlugin.getWSDLString("_UI_LABEL_UNKNOWN_NODE") + getModel().getClass().getName());
}
}
private void _refreshChildren()
{
int i;
EditPart editPart;
Object model;
Map modelToEditPart = new HashMap();
List children = getChildren();
for (i = 0; i < children.size(); i++)
{
editPart = (EditPart)children.get(i);
modelToEditPart.put(editPart.getModel(), editPart);
}
List modelObjects = getModelChildren();
for (i = 0; i < modelObjects.size(); i++)
{
model = modelObjects.get(i);
//Do a quick check to see if editPart[i] == model[i]
if (i < children.size())
{
editPart = (EditPart)children.get(i);
Object editPartModel = editPart.getModel();
if (editPartModel == model)
{
continue;
}
else if (editPartModel.getClass() == model.getClass())
{
modelToEditPart.remove(editPartModel);
if (isActive())
editPart.deactivate();
editPart.setModel(model);
if (isActive())
{
editPart.activate();
editPart.refresh();
}
continue;
}
}
//Look to see if the EditPart is already around but in the wrong location
editPart = (EditPart)modelToEditPart.get(model);
if (editPart != null)
reorderChild(editPart, i);
else
{
//An editpart for this model doesn't exist yet. Create and insert one.
editPart = createChild(model);
addChild(editPart, i);
}
}
List trash = new ArrayList();
for (; i < children.size(); i++)
trash.add(children.get(i));
for (i = 0; i < trash.size(); i++)
{
EditPart ep = (EditPart)trash.get(i);
removeChild(ep);
}
}
public void refreshChildren()
{
boolean reuseChildren = false;
if (getViewer() instanceof WSDLComponentViewer)
{
WSDLComponentViewer wsdlComponentViewer = (WSDLComponentViewer)getViewer();
reuseChildren = wsdlComponentViewer.isPreserveExpansionEnabled();
}
if (reuseChildren)
{
_refreshChildren();
}
else
{
super.refreshChildren();
}
contentFigure.getInteractor().setVisible(hasChildren());
}
public List getModelChildren()
{
return contentFigure.getInteractor().isExpanded() ? getModelChildrenHelper() : Collections.EMPTY_LIST;
}
protected List getModelChildrenHelper()
{
List result = null;
ModelAdapter modelAdapter = getModelAdapter(getModel());
if (modelAdapter != null)
{
result = (List)modelAdapter.getProperty(getModel(), ModelAdapter.CHILDREN_PROPERTY);
}
return result != null ? result : Collections.EMPTY_LIST;
}
protected boolean hasChildren()
{
return getModelChildrenHelper().size() > 0;
}
protected abstract ModelAdapter getModelAdapter(Object model);
protected EditPartFactory getEditPartFactory()
{
return ExtensibleEditPartFactory.getInstance();
}
protected void addModelAdapterListener(Object modelObject, ModelAdapterListener listener)
{
ModelAdapter adapter = getModelAdapter(modelObject);
if (adapter != null)
{
adapter.addListener(listener);
}
}
protected void removeModelAdapterListener(Object modelObject, ModelAdapterListener listener)
{
ModelAdapter adapter = getModelAdapter(modelObject);
if (adapter != null)
{
adapter.removeListener(listener);
}
}
public void addFeedback()
{
isSelected = true;
labelHolder.setBackgroundColor(ColorConstants.black);
label.setForegroundColor(computeLabelColor());
labelHolder.setFill(true);
}
public void removeFeedback()
{
isSelected = false;
labelHolder.setBackgroundColor(null);
label.setForegroundColor(computeLabelColor());
labelHolder.setFill(false);
}
public boolean isExpanded()
{
return contentFigure.getInteractor().isExpanded();
}
public void setExpanded(boolean arg)
{
interactorHelper.setExpanded(arg);
}
}