/* FeatureIDE - An IDE to support feature-oriented software development * Copyright (C) 2005-2009 FeatureIDE Team, University of Magdeburg * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * See http://www.fosd.de/featureide/ for further information. */ package featureide.fm.ui.editors.featuremodel.editparts; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.List; import java.util.Map; import org.eclipse.draw2d.ConnectionAnchor; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.geometry.Point; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.NodeEditPart; import org.eclipse.gef.Request; import org.eclipse.gef.RequestConstants; import org.eclipse.gef.editparts.AbstractGraphicalEditPart; import org.eclipse.gef.tools.DirectEditManager; import org.eclipse.jface.viewers.TextCellEditor; import featureide.fm.core.Feature; import featureide.fm.core.FeatureConnection; import featureide.fm.core.FeatureModel; import featureide.fm.core.PropertyConstants; import featureide.fm.ui.editors.FeatureUIHelper; import featureide.fm.ui.editors.featuremodel.commands.renaming.FeatureCellEditorLocator; import featureide.fm.ui.editors.featuremodel.commands.renaming.FeatureLabelEditManager; import featureide.fm.ui.editors.featuremodel.figures.FeatureFigure; import featureide.fm.ui.editors.featuremodel.policies.FeatureDirectEditPolicy; /** * An editpart for features. It implements the <code>NodeEditPart</code> that * the models of features can provide connection anchors. * * @author Thomas Thuem */ public class FeatureEditPart extends AbstractGraphicalEditPart implements NodeEditPart, PropertyConstants, PropertyChangeListener { public FeatureEditPart(Feature feature) { super(); setModel(feature); } public Feature getFeatureModel() { return (Feature) getModel(); } public FeatureFigure getFeatureFigure() { return (FeatureFigure) getFigure(); } @Override protected IFigure createFigure() { FeatureFigure figure = new FeatureFigure(getFeatureModel()); return figure; } @Override protected void createEditPolicies() { FeatureModel featureModel = ((ModelEditPart) getParent()).getFeatureModel(); installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new FeatureDirectEditPolicy(featureModel, getFeatureModel())); } private DirectEditManager manager; @Override public void performRequest(Request request) { if (request.getType() == RequestConstants.REQ_DIRECT_EDIT) { if (manager == null) { ModelEditPart parent = (ModelEditPart) getParent(); FeatureModel featureModel = parent.getFeatureModel(); manager = new FeatureLabelEditManager(this, TextCellEditor.class, new FeatureCellEditorLocator(getFeatureFigure()), featureModel); } manager.show(); } else if (request.getType() == RequestConstants.REQ_OPEN) { Feature feature = getFeatureModel(); feature.setMandatory(!feature.isMandatory()); ModelEditPart parent = (ModelEditPart) getParent(); FeatureModel featureModel = parent.getFeatureModel(); featureModel.handleModelDataChanged(); } } @Override protected List<FeatureConnection> getModelSourceConnections() { return ((Feature) getModel()).getSourceConnections(); } @Override protected List<FeatureConnection> getModelTargetConnections() { return ((Feature) getModel()).getTargetConnections(); } public ConnectionAnchor getSourceConnectionAnchor(org.eclipse.gef.ConnectionEditPart connection) { return ((FeatureFigure) figure).getSourceAnchor(); } public ConnectionAnchor getSourceConnectionAnchor(Request request) { return ((FeatureFigure) figure).getSourceAnchor(); } public ConnectionAnchor getTargetConnectionAnchor(org.eclipse.gef.ConnectionEditPart connection) { return ((FeatureFigure) figure).getTargetAnchor(); } public ConnectionAnchor getTargetConnectionAnchor(Request request) { return ((FeatureFigure) figure).getTargetAnchor(); } @Override public void activate() { getFeatureModel().addListener(this); super.activate(); } @Override public void deactivate() { super.deactivate(); getFeatureModel().removeListener(this); } /* * (non-Javadoc) * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent) */ @SuppressWarnings("unchecked") public void propertyChange(PropertyChangeEvent event) { String prop = event.getPropertyName(); if (prop.equals(LOCATION_CHANGED)) { getFeatureFigure().setLocation((Point) event.getNewValue()); } else if (prop.equals(CHILDREN_CHANGED)) { getFeatureFigure().setAbstract(getFeatureModel().isAbstract()); for (FeatureConnection connection : getFeatureModel().getTargetConnections()) { Map registry = getViewer().getEditPartRegistry(); ConnectionEditPart connectionEditPart = (ConnectionEditPart) registry.get(connection); if (connectionEditPart != null) { connectionEditPart.refreshSourceDecoration(); connectionEditPart.refreshTargetDecoration(); connectionEditPart.refreshToolTip(); } } } else if (prop.equals(NAME_CHANGED)) { getFeatureFigure().setName(getFeatureModel().getName()); FeatureUIHelper.setSize(getFeatureModel(),getFeatureFigure().getSize()); } } }