blob: 5677edd63a062f4e14aec9ade24749800302ffa0 [file] [log] [blame]
/******************************************************************************
* 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);
}
}
}