| /****************************************************************************** |
| * Copyright (c) 2004, 2008 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.gmf.examples.runtime.diagram.logic.internal.editparts; |
| |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.Map; |
| |
| import org.eclipse.draw2d.PositionConstants; |
| import org.eclipse.draw2d.geometry.Dimension; |
| import org.eclipse.draw2d.geometry.Point; |
| import org.eclipse.emf.common.notify.Notification; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.EStructuralFeature; |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.gef.EditPolicy; |
| import org.eclipse.gef.Request; |
| import org.eclipse.gmf.examples.runtime.diagram.logic.internal.editpolicies.ContainerHighlightEditPolicy; |
| import org.eclipse.gmf.examples.runtime.diagram.logic.internal.editpolicies.PortsColorEditPolicy; |
| import org.eclipse.gmf.examples.runtime.diagram.logic.internal.figures.BottomTerminalFigure; |
| import org.eclipse.gmf.examples.runtime.diagram.logic.internal.figures.CircuitFigure; |
| import org.eclipse.gmf.examples.runtime.diagram.logic.internal.figures.LogicColorConstants; |
| import org.eclipse.gmf.examples.runtime.diagram.logic.internal.figures.TerminalFigure; |
| import org.eclipse.gmf.examples.runtime.diagram.logic.internal.figures.TopTerminalFigure; |
| import org.eclipse.gmf.examples.runtime.diagram.logic.internal.providers.LogicConstants; |
| import org.eclipse.gmf.examples.runtime.diagram.logic.internal.util.StringConstants; |
| import org.eclipse.gmf.examples.runtime.diagram.logic.semantic.InputTerminal; |
| import org.eclipse.gmf.examples.runtime.diagram.logic.semantic.Terminal; |
| import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil; |
| import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; |
| import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants; |
| import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout; |
| import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities; |
| import org.eclipse.gmf.runtime.draw2d.ui.mapmode.IMapMode; |
| import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure; |
| import org.eclipse.gmf.runtime.notation.NotationPackage; |
| import org.eclipse.gmf.runtime.notation.PropertiesSetStyle; |
| import org.eclipse.gmf.runtime.notation.View; |
| |
| /** |
| * Holds a circuit, which is a container capable of |
| * holding other LogicEditParts. |
| */ |
| /* |
| * @canBeSeenBy org.eclipse.gmf.examples.runtime.diagram.logic.* |
| */ |
| public class CircuitEditPart extends TerminalOwnerShapeEditPart { |
| |
| protected class CircuitContainerEditPolicy extends ShapeContainerEditPolicy { |
| |
| /** |
| * Returns the child CompartmentEditPart as a target for pasting |
| * (the circuit is not a container, but ShapeCompartmentEditPart is) |
| * |
| * @see org.eclipse.gmf.runtime.diagram.ui.editpolicies.ContainerEditPolicy#getTargetEditPart(org.eclipse.gef.Request) |
| */ |
| public EditPart getTargetEditPart(Request request) { |
| if (RequestConstants.REQ_PASTE.equals(request.getType())) { |
| IGraphicalEditPart editPart = (IGraphicalEditPart) getHost(); |
| if (editPart instanceof CircuitEditPart) { |
| IGraphicalEditPart targetEP = |
| ((CircuitEditPart)editPart).getChildBySemanticHint(LogicConstants.LOGIC_SHAPE_COMPARTMENT); |
| if (targetEP != null) { |
| return targetEP; |
| } |
| } |
| } |
| return super.getTargetEditPart(request); |
| } |
| } |
| /** |
| * @param view |
| */ |
| public CircuitEditPart(View view) { |
| super(view); |
| } |
| |
| //install ContainerHighlightEditPolicy to highlight circuit figure |
| protected void createDefaultEditPolicies() { |
| super.createDefaultEditPolicies(); |
| installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, |
| new ContainerHighlightEditPolicy()); |
| installEditPolicy(StringConstants.PORTS_COLOR_EDITPOLICY_ROLE, |
| new PortsColorEditPolicy()); |
| // ensure that the paste command will execute on its child LogicShapeCompartmentEditPart |
| installEditPolicy(EditPolicy.CONTAINER_ROLE, |
| new CircuitContainerEditPolicy()); |
| } |
| |
| /** |
| * Creates a new Circuit Figure and returns it. |
| * |
| * @return Figure representing the circuit. |
| */ |
| protected NodeFigure createMainFigure() { |
| NodeFigure nf = new CircuitFigure(new Dimension(getMapMode() |
| .DPtoLP(100), getMapMode().DPtoLP(100))); |
| ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout(); |
| nf.setLayoutManager(layout); |
| return nf; |
| } |
| |
| /** |
| * @see org.eclipse.gmf.examples.runtime.diagram.logic.internal.editparts.ITerminalOwnerEditPart#createBoundsMap() |
| */ |
| public Map createBoundsMap() { |
| Map posMap = new HashMap(); |
| |
| IMapMode mm = getMapMode(); |
| posMap.put("A", new Point(mm.DPtoLP(11), mm.DPtoLP(-1))); //$NON-NLS-1$ |
| posMap.put("B", new Point(mm.DPtoLP(36), mm.DPtoLP(-1))); //$NON-NLS-1$ |
| posMap.put("C", new Point(mm.DPtoLP(61), mm.DPtoLP(-1))); //$NON-NLS-1$ |
| posMap.put("D", new Point(mm.DPtoLP(86), mm.DPtoLP(-1))); //$NON-NLS-1$ |
| |
| posMap.put("1", new Point(mm.DPtoLP(11), mm.DPtoLP(100))); //$NON-NLS-1$ |
| posMap.put("2", new Point(mm.DPtoLP(36), mm.DPtoLP(100))); //$NON-NLS-1$ |
| posMap.put("3", new Point(mm.DPtoLP(61), mm.DPtoLP(100))); //$NON-NLS-1$ |
| posMap.put("4", new Point(mm.DPtoLP(86), mm.DPtoLP(100))); //$NON-NLS-1$ |
| |
| return posMap; |
| } |
| |
| /** |
| * @see org.eclipse.gmf.examples.runtime.diagram.logic.internal.editparts.ITerminalOwnerEditPart#createOwnedTerminalFigure(TerminalEditPart) |
| */ |
| public NodeFigure createOwnedTerminalFigure(TerminalEditPart terminalEP) { |
| Terminal terminal = (Terminal) ViewUtil |
| .resolveSemanticElement((View) terminalEP.getModel()); |
| if (terminal == null) { |
| return null; |
| } |
| |
| NodeFigure theFigure = null; |
| int side = PositionConstants.NORTH; |
| if (terminal instanceof InputTerminal) { |
| theFigure = new TopTerminalFigure(terminal.getId(), new Dimension( |
| getMapMode().DPtoLP(6), getMapMode().DPtoLP(7))); |
| } else { |
| theFigure = new BottomTerminalFigure(terminal.getId(), |
| new Dimension(getMapMode().DPtoLP(6), getMapMode() |
| .DPtoLP(7))); |
| side = PositionConstants.SOUTH; |
| } |
| |
| terminalEP.setLocator(new TerminalFigure.TerminalLocator(getFigure(), |
| new Dimension(getMapMode().DPtoLP(100), getMapMode() |
| .DPtoLP(100)), side)); |
| return theFigure; |
| } |
| |
| public Object getPreferredValue(EStructuralFeature feature) { |
| if (feature == NotationPackage.eINSTANCE.getFillStyle_FillColor()) { |
| return FigureUtilities |
| .colorToInteger(LogicColorConstants.logicGreen); |
| } else if (feature == NotationPackage.eINSTANCE |
| .getLineStyle_LineColor()) { |
| return FigureUtilities |
| .colorToInteger(LogicColorConstants.connectorGreen); |
| } |
| return super.getPreferredValue(feature); |
| } |
| |
| protected void handleNotificationEvent(Notification evt) { |
| if (NotationPackage.eINSTANCE.getPropertyValue_RawValue().equals( |
| evt.getFeature())) { |
| View viewContainer = ViewUtil.getViewContainer((EObject) evt |
| .getNotifier()); |
| if (viewContainer != null |
| && viewContainer.equals(getNotationView())) { |
| PropertiesSetStyle style = (PropertiesSetStyle) getNotationView() |
| .getNamedStyle( |
| NotationPackage.eINSTANCE |
| .getPropertiesSetStyle(), |
| StringConstants.PORTS_PROPERTIES_STYLE_NAME); |
| if (style != null |
| && style.getPropertiesMap().get( |
| StringConstants.PORTS_COLOR_PROPERTY_NAME) |
| .equals(evt.getNotifier())) { |
| for (Iterator itr = getChildren().iterator(); itr.hasNext();) { |
| Object obj = itr.next(); |
| if (obj instanceof TerminalEditPart) { |
| ((TerminalEditPart) obj).refreshBackgroundColor(); |
| } |
| getFigure().repaint(); |
| } |
| } |
| } |
| } else { |
| super.handleNotificationEvent(evt); |
| } |
| } |
| |
| } |