/** * */ package org.jboss.tools.smooks.gef.tree.editparts; import java.beans.PropertyChangeEvent; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.draw2d.ConnectionAnchor; import org.eclipse.draw2d.FreeformLayer; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Label; import org.eclipse.gef.ConnectionEditPart; import org.eclipse.gef.DragTracker; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.NodeEditPart; import org.eclipse.gef.Request; import org.eclipse.gef.RequestConstants; import org.eclipse.gef.commands.Command; import org.eclipse.gef.editpolicies.DirectEditPolicy; import org.eclipse.gef.requests.DirectEditRequest; import org.eclipse.gef.tools.ConnectionDragCreationTool; import org.eclipse.gef.tools.DirectEditManager; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.swt.graphics.Image; import org.jboss.tools.smooks.configuration.SmooksConfigurationActivator; import org.jboss.tools.smooks.configuration.editors.GraphicsConstants; import org.jboss.tools.smooks.gef.tree.editpolicy.FigureHighlightEditPolicy; import org.jboss.tools.smooks.gef.tree.editpolicy.TreeNodeGraphicalNodeEditPolicy; import org.jboss.tools.smooks.gef.tree.editpolicy.TreeNodeSelectEditPolicy; import org.jboss.tools.smooks.gef.tree.figures.ITreeFigureListener; import org.jboss.tools.smooks.gef.tree.figures.LeftOrRightAnchor; import org.jboss.tools.smooks.gef.tree.figures.TreeContainerFigure; import org.jboss.tools.smooks.gef.tree.figures.TreeFigureExpansionEvent; import org.jboss.tools.smooks.gef.tree.figures.TreeNodeFigure; import org.jboss.tools.smooks.gef.tree.figures.TreeNodeTextDirectManager; import org.jboss.tools.smooks.gef.tree.figures.TreeNodeTextDirectManagerLocator; import org.jboss.tools.smooks.gef.tree.model.IConnectableNode; import org.jboss.tools.smooks.gef.tree.model.TreeNodeModel; import org.jboss.tools.smooks.graphical.editors.model.IValidatableModel; /** * @author DartPeng * */ public class TreeNodeEditPart extends AbstractTreeEditPart implements ITreeFigureListener, NodeEditPart { protected boolean childrenLoaded = false; private IFigure anchorFigure = null; protected DirectEditManager editManager = null; protected Label errorLabel = new Label(); protected Label warningLabel = new Label(); @Override protected IFigure createFigure() { TreeNodeModel model = (TreeNodeModel) getModel(); TreeNodeFigure figure = new TreeNodeFigure(model); figure.addTreeListener(this); return figure; } protected void performDirectEdit() { if (canDirectEdit()) { if (editManager == null) { editManager = createDirectEditManager(); } editManager.show(); } } protected DirectEditManager createDirectEditManager() { Label l = ((TreeNodeFigure) getFigure()).getLabel(); return new TreeNodeTextDirectManager(this, TextCellEditor.class, new TreeNodeTextDirectManagerLocator(l), l); } protected boolean canDirectEdit() { return false; } /** * @return the dragLink */ protected boolean isDragLink() { return false; } /* * (non-Javadoc) * * @see * org.eclipse.gef.editparts.AbstractGraphicalEditPart#getDragTracker(org * .eclipse.gef.Request) */ public DragTracker getDragTracker(Request request) { if (isDragLink()) { getViewer().select(this); return new ConnectionDragCreationTool(); } else { return super.getDragTracker(request); } } public TreeContainerEditPart getTreeContainerEditPart() { EditPart parent = this.getParent(); while (parent != null && (parent.getClass() != TreeContainerEditPart.class)) { parent = parent.getParent(); } if (parent != null && parent.getClass() == TreeContainerEditPart.class) { return (TreeContainerEditPart) parent; } return null; } public void expandNode() { IFigure figure1 = getFigure(); if (figure1 instanceof TreeNodeFigure) { ((TreeNodeFigure) figure1).expandNode(); } } public void collapsedNode() { IFigure figure1 = getFigure(); if (figure1 instanceof TreeNodeFigure) { ((TreeNodeFigure) figure1).collapsedNode(); } } public boolean isSourceLinkNodeEditPart() { TreeContainerEditPart container = getTreeContainerEditPart(); if (container != null) return container.isSourceLinkNodeEditPart(); return true; } protected Command createDirectEditCommand(DirectEditRequest request) { return null; } @Override protected void createEditPolicies() { installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new DirectEditPolicy() { /* * (non-Javadoc) * * @see * org.eclipse.gef.editpolicies.DirectEditPolicy#getDirectEditCommand * (org.eclipse.gef.requests.DirectEditRequest) */ @Override protected Command getDirectEditCommand(DirectEditRequest request) { return createDirectEditCommand(request); } /* * (non-Javadoc) * * @see * org.eclipse.gef.editpolicies.DirectEditPolicy#showCurrentEditValue * (org.eclipse.gef.requests.DirectEditRequest) */ @Override protected void showCurrentEditValue(DirectEditRequest request) { } }); this.installEditPolicy(EditPolicy.NODE_ROLE, new TreeNodeGraphicalNodeEditPolicy()); this.installEditPolicy("SELECTED", new TreeNodeSelectEditPolicy()); //$NON-NLS-1$ this.installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new FigureHighlightEditPolicy()); } @Override public IFigure getContentPane() { TreeNodeFigure figure = (TreeNodeFigure) getFigure(); return figure.getContentFigure(); } protected void refreshVisuals() { try { TreeNodeModel node = (TreeNodeModel) getModel(); String text = node.getText(); if (text != null) { ((TreeNodeFigure) getFigure()).setLabelText(text); } Label tooltip = null; int serverity = node.getSeverity(); String message = getSeverityMessage(node); Image image = node.getImage(); if (serverity == IValidatableModel.NONE) { image = node.getImage(); } if (serverity == IValidatableModel.ERROR) { image = SmooksConfigurationActivator.getDefault().getImageRegistry().get(GraphicsConstants.IMAGE_ERROR); tooltip = errorLabel; tooltip.setText(message); } if (serverity == IValidatableModel.WARNING) { image = SmooksConfigurationActivator.getDefault().getImageRegistry().get( GraphicsConstants.IMAGE_WARNING); tooltip = warningLabel; tooltip.setText(message); } if (image != null) { ((TreeNodeFigure) getFigure()).setLabelImage(image); } ((TreeNodeFigure) getFigure()).setToolTip(tooltip); IFigure parent = getFigure(); while (parent != null && !(parent instanceof FreeformLayer)) { parent = parent.getParent(); } if (parent != null) { parent.repaint(); } } catch (Throwable e) { e.printStackTrace(); } // Dimension size = getFigure().getPreferredSize(-1, -1); // Rectangle rect = getFigure().getBounds(); // rect.setSize(size); // ((AbstractGraphicalEditPart) getParent()).setLayoutConstraint(this, // this.getFigure(), rect); } protected String getSeverityMessage(IValidatableModel model) { List<String> messages = model.getMessage(); String message = null; for (Iterator<?> iterator = messages.iterator(); iterator.hasNext();) { String string = (String) iterator.next(); if (message == null) { message = " - " + string; //$NON-NLS-1$ } else { message = message + "\n" + " - " + string; //$NON-NLS-1$ //$NON-NLS-2$ } } return message; } public List<?> getModelChildren() { if (childrenLoaded) { TreeNodeModel node = (TreeNodeModel) getModel(); return node.getChildren(); } else { return Collections.emptyList(); } } public void childrenModelChanged() { refreshChildren(); } public void treeCollapsed(TreeFigureExpansionEvent event) { caculateAnchorFigure(); } public void treeExpanded(TreeFigureExpansionEvent event) { if (!childrenLoaded) { childrenLoaded = true; refreshChildren(); refreshVisuals(); } caculateAnchorFigure(); } /** * @see org.eclipse.gef.EditPart#performRequest(org.eclipse.gef.Request) */ public void performRequest(Request request) { if (request.getType() == RequestConstants.REQ_DIRECT_EDIT) performDirectEdit(); } public void propertyChange(PropertyChangeEvent evt) { String proName = evt.getPropertyName(); if (TreeNodeModel.PRO_SEVERITY_CHANGED.equals(proName)) { refreshVisuals(); } if (TreeNodeModel.PRO_FORCE_VISUAL_CHANGED.equals(proName) || TreeNodeModel.PRO_TEXT_CHANGED.equals(proName)) { refreshVisuals(); } if (TreeNodeModel.PRO_ADD_CHILD.equals(proName) || TreeNodeModel.PRO_MOVE_CHILD.equals(proName) || TreeNodeModel.PRO_REMOVE_CHILD.equals(proName) || TreeNodeModel.PRO_FORCE_CHIDLREN_CHANGED.equals(proName)) { refreshChildren(); this.expandNode(); refreshVisuals(); } if (TreeNodeModel.PRO_ADD_SOURCE_CONNECTION.equals(proName) || TreeNodeModel.PRO_REMOVE_SOURCE_CONNECTION.equals(proName)) { refreshSourceConnections(); } if (TreeNodeModel.PRO_ADD_TARGET_CONNECTION.equals(proName) || TreeNodeModel.PRO_REMOVE_TARGET_CONNECTION.equals(proName)) { refreshTargetConnections(); } if (TreeNodeModel.PRO_FORCE_CONNECTION_CHANGED.equals(proName)) { refreshSourceConnections(); refreshTargetConnections(); } } // protected void recordBounds(SmooksGraphicsExtType graphicsExt, Rectangle // bounds) { // GraphType graph = graphicsExt.getGraph(); // if (graph == null) { // graph = GraphFactory.eINSTANCE.createGraphType(); // graphicsExt.setGraph(graph); // } // String figureId = generateFigureID(); // if (figureId == null) // return; // FigureType figure = SmooksGraphUtil.findFigureType(graph, figureId); // // if (figure == null) { // figure = GraphFactory.eINSTANCE.createFigureType(); // figure.setId(figureId); // graph.getFigure().add(figure); // } // recordFigureBounds(figure, bounds); // } // // protected void recordFigureBounds(FigureType figureType, Rectangle // bounds) { // figureType.setX(String.valueOf(bounds.getLocation().x)); // figureType.setY(String.valueOf(bounds.getLocation().y)); // // figureType.setHeight(String.valueOf(bounds.getSize().height)); // figureType.setWidth(String.valueOf(bounds.getSize().width)); // // EObject ext = figureType; // while (ext != null && !(ext instanceof SmooksGraphicsExtType)) { // ext = ext.eContainer(); // } // // if (ext != null && ext instanceof SmooksGraphicsExtType) { // List<ISmooksGraphChangeListener> listeners = ((SmooksGraphicsExtType) // ext).getChangeListeners(); // for (Iterator<?> iterator = listeners.iterator(); iterator.hasNext();) { // ISmooksGraphChangeListener smooksGraphChangeListener = // (ISmooksGraphChangeListener) iterator.next(); // smooksGraphChangeListener.graphChanged((SmooksGraphicsExtType) ext); // } // } // } protected String generateFigureID() { return null; } protected IFigure getAnchorFigure() { if (anchorFigure != null) return anchorFigure; else { IFigure figure = getFigure(); anchorFigure = figure; if (figure instanceof TreeContainerFigure) { anchorFigure = ((TreeContainerFigure) figure).getLabel(); } if (figure instanceof TreeNodeFigure) { anchorFigure = ((TreeNodeFigure) figure).getLabel(); } } return anchorFigure; } public void caculateAnchorFigure() { anchorFigure = null; EditPart parent = getParent(); List<TreeNodeEditPart> parentList = new ArrayList<TreeNodeEditPart>(); while (parent != null && parent instanceof TreeNodeEditPart) { parentList.add((TreeNodeEditPart) parent); if (parent.getParent() == null || !(parent.getParent() instanceof TreeNodeEditPart)) { break; } parent = parent.getParent(); } for (int i = parentList.size() - 1; i >= 0; i--) { TreeNodeEditPart p = parentList.get(i); if (p.isExpanded()) continue; anchorFigure = p.getAnchorFigure(); break; } int alpha = 255; if (anchorFigure != null) { alpha = 20; } List<?> sourceConnectionEditParts = getSourceConnections(); for (Iterator<?> iterator = sourceConnectionEditParts.iterator(); iterator.hasNext();) { Object con = (Object) iterator.next(); if (con instanceof TreeNodeConnectionEditPart) { ((TreeNodeConnectionEditPart) con).changeLineAlpha(alpha); ((TreeNodeConnectionEditPart) con).refresh(); } } List<?> targetConnectionEditParts = getTargetConnections(); for (Iterator<?> iterator = targetConnectionEditParts.iterator(); iterator.hasNext();) { Object con = (Object) iterator.next(); if (con instanceof TreeNodeConnectionEditPart) { ((TreeNodeConnectionEditPart) con).changeLineAlpha(alpha); ((TreeNodeConnectionEditPart) con).refresh(); } } List<?> childrenEditParts = getChildren(); for (Iterator<?> iterator = childrenEditParts.iterator(); iterator.hasNext();) { EditPart child = (EditPart) iterator.next(); if (child instanceof TreeNodeEditPart) { ((TreeNodeEditPart) child).caculateAnchorFigure(); } } } public boolean isExpanded() { IFigure f = getFigure(); if (f instanceof TreeNodeFigure) { return ((TreeNodeFigure) f).isExpand(); } return true; } @Override protected List<?> getModelSourceConnections() { Object model = getModel(); if (model instanceof IConnectableNode) { return ((IConnectableNode) model).getSourceConnections(); } return Collections.emptyList(); } @Override protected List<?> getModelTargetConnections() { Object model = getModel(); if (model instanceof IConnectableNode) { return ((IConnectableNode) model).getTargetConnections(); } return Collections.emptyList(); } public ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart connection) { try { return new LeftOrRightAnchor(getAnchorFigure()); } catch (Exception e) { e.printStackTrace(); } return null; } public ConnectionAnchor getSourceConnectionAnchor(Request request) { try { return new LeftOrRightAnchor(getAnchorFigure()); } catch (Exception e) { e.printStackTrace(); } return null; } public ConnectionAnchor getTargetConnectionAnchor(ConnectionEditPart connection) { return new LeftOrRightAnchor(getAnchorFigure()); } public ConnectionAnchor getTargetConnectionAnchor(Request request) { return new LeftOrRightAnchor(getAnchorFigure()); } public CreateConnectionCommand createCreateConnectionCommand() { return null; } }