/* Copyright 2012-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.snaker.designer.parts;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.draw2d.ChopboxAnchor;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.GraphicalEditPart;
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.ui.views.properties.IPropertySource;
import org.snaker.designer.SnakerFlowDesignerEditor;
import org.snaker.designer.config.Component;
import org.snaker.designer.config.ConfigManager;
import org.snaker.designer.figures.AbstractElementFigure;
import org.snaker.designer.figures.CustomFigure;
import org.snaker.designer.figures.ExclusiveGatewayFigure;
import org.snaker.designer.figures.ParallelGatewayFigure;
import org.snaker.designer.figures.SimpleFigure;
import org.snaker.designer.figures.StartEventFigure;
import org.snaker.designer.figures.SubProcessFigure;
import org.snaker.designer.figures.TaskFigure;
import org.snaker.designer.figures.TerminateEndEventFigure;
import org.snaker.designer.model.BaseElement;
import org.snaker.designer.model.Custom;
import org.snaker.designer.model.Decision;
import org.snaker.designer.model.End;
import org.snaker.designer.model.Fork;
import org.snaker.designer.model.Join;
import org.snaker.designer.model.ModelHelper;
import org.snaker.designer.model.ModelPropertySource;
import org.snaker.designer.model.NodeElement;
import org.snaker.designer.model.Simple;
import org.snaker.designer.model.Start;
import org.snaker.designer.model.SubProcess;
import org.snaker.designer.model.Task;
import org.snaker.designer.model.Transition;
import org.snaker.designer.policies.ElementDirectEditPolicy;
import org.snaker.designer.policies.ProcessGraphicalNodeEditPolicy;
import org.snaker.designer.policies.NodeComponentEditPolicy;
/**
* 节点元素EditPart
* @author yuqs
* @version 1.0
*/
public class NodeElementEditPart extends AbstractGraphicalEditPart implements
NodeEditPart, PropertyChangeListener {
private DirectEditManager manager;
private SnakerFlowDesignerEditor editor;
private IPropertySource propertySource = null;
private AbstractElementFigure figure = null;
public NodeElementEditPart(SnakerFlowDesignerEditor editor,
NodeElement model) {
this.editor = editor;
setModel(model);
}
@Override
protected IFigure createFigure() {
if (getElement() instanceof Start)
figure = new StartEventFigure();
else if (getElement() instanceof End)
figure = new TerminateEndEventFigure();
else if (getElement() instanceof Decision)
figure = new ExclusiveGatewayFigure();
else if (getElement() instanceof Fork)
figure = new ParallelGatewayFigure();
else if (getElement() instanceof Join)
figure = new ParallelGatewayFigure();
else if (getElement() instanceof SubProcess)
figure = new SubProcessFigure((SubProcess) getElement());
else if (getElement() instanceof Task)
figure = new TaskFigure((Task) getElement());
else if (getElement() instanceof Custom)
figure = new CustomFigure((Custom) getElement());
else if (getElement() instanceof Simple) {
figure = new SimpleFigure((Simple) getElement());
}
return figure;
}
private NodeElement getElement() {
return (NodeElement) getModel();
}
@Override
protected void createEditPolicies() {
installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
new ElementDirectEditPolicy());
installEditPolicy(EditPolicy.COMPONENT_ROLE,
new NodeComponentEditPolicy());
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
new ProcessGraphicalNodeEditPolicy());
}
public void refreshVisuals() {
AbstractElementFigure figure = (AbstractElementFigure) getFigure();
figure.setText(getElement().getDisplayName());
((GraphicalEditPart) getParent()).setLayoutConstraint(this, figure,
getElement().getLayout());
super.refreshVisuals();
}
@SuppressWarnings("rawtypes")
public List<?> getModelChildren() {
return new ArrayList();
}
public void activate() {
if (isActive()) {
return;
}
((NodeElement) getModel()).addPropertyChangeListener(this);
super.activate();
}
public void deactivate() {
if (!isActive()) {
return;
}
((NodeElement) getModel()).removePropertyChangeListener(this);
super.deactivate();
}
@SuppressWarnings("rawtypes")
public Object getAdapter(Class key) {
if (IPropertySource.class == key) {
return getPropertySource();
}
return super.getAdapter(key);
}
protected IPropertySource getPropertySource() {
if (this.propertySource == null) {
Component component = ConfigManager.getComponentByModel(getElement());
ModelHelper.loadAttribute((BaseElement) getModel(), component);
this.propertySource = new ModelPropertySource(getElement(),
component);
}
return this.propertySource;
}
public boolean isAdapterForType(Object type) {
return type.equals(getModel().getClass());
}
@Override
protected List<Transition> getModelSourceConnections() {
return getElement().getOutputs();
}
@Override
protected List<Transition> getModelTargetConnections() {
return getElement().getInputs();
}
@Override
public ConnectionAnchor getTargetConnectionAnchor(
ConnectionEditPart connection) {
return new ChopboxAnchor(getFigure());
}
@Override
public ConnectionAnchor getTargetConnectionAnchor(Request request) {
return new ChopboxAnchor(getFigure());
}
@Override
public ConnectionAnchor getSourceConnectionAnchor(
ConnectionEditPart connection) {
return new ChopboxAnchor(getFigure());
}
@Override
public ConnectionAnchor getSourceConnectionAnchor(Request request) {
return new ChopboxAnchor(getFigure());
}
public SnakerFlowDesignerEditor getEditor() {
return editor;
}
public void setEditor(SnakerFlowDesignerEditor editor) {
this.editor = editor;
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(NodeElement.PROP_LAYOUT))
refreshVisuals();
else if (evt.getPropertyName().equals(NodeElement.PROP_NAME))
refreshVisuals();
else if (evt.getPropertyName().equals(NodeElement.PROP_DISPLAYNAME))
refreshVisuals();
else if (evt.getPropertyName().equals(NodeElement.PROP_INPUTS))
refreshTargetConnections();
else if (evt.getPropertyName().equals(NodeElement.PROP_OUTPUTS))
refreshSourceConnections();
}
@Override
public void performRequest(Request request) {
if (request.getType() == RequestConstants.REQ_OPEN)
//doubleClicked();
;
else if (request.getType() == RequestConstants.REQ_DIRECT_EDIT)
performDirectEdit();
else
super.performRequest(request);
}
protected void performDirectEdit() {
AbstractElementFigure figure = (AbstractElementFigure) getFigure();
Label label = figure.getLabel();
if (label == null)
return;
if (manager == null)
manager = new ElementDirectEditManager(this,
new LabelCellEditorLocator(label));
manager.show();
}
protected void doubleClicked() {
if (getElement() instanceof Task) {
if (-1 != this.editor.getFormEditPageID()) {
this.editor.removeFormEditPage();
}
if (-1 == this.editor.getFormEditPageID()) {
this.editor.createFormEditPage((Task) getElement());
}
this.editor.setActivePage(this.editor.getFormEditPageID());
}
}
}