2
* This file is part of Zaluum
4
* Zaluum is free software: you can redistribute it and/or modify
5
* it under the terms of the GNU Lesser General Public License as published by
6
* the Free Software Foundation, either version 3 of the License, or
7
* (at your option) any later version.
9
* Zaluum is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU Lesser General Public License for more details.
14
* You should have received a copy of the GNU Lesser General Public License
15
* along with Zaluum. If not, see <http://www.gnu.org/licenses/>.
17
* Copyright 2008,2009 Frederic Perez Ordeig
18
* Copyright 2008,2009 Elias Hortas Garcia
20
package org.zaluum.boxes.fsm.editor;
22
import java.util.List;
24
import org.eclipse.draw2d.ConnectionAnchor;
25
import org.eclipse.draw2d.IFigure;
26
import org.eclipse.draw2d.geometry.Point;
27
import org.eclipse.draw2d.geometry.Rectangle;
28
import org.eclipse.gef.ConnectionEditPart;
29
import org.eclipse.gef.EditPolicy;
30
import org.eclipse.gef.GraphicalEditPart;
31
import org.eclipse.gef.NodeEditPart;
32
import org.eclipse.gef.Request;
33
import org.eclipse.gef.commands.Command;
34
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
35
import org.eclipse.gef.editpolicies.ComponentEditPolicy;
36
import org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy;
37
import org.eclipse.gef.requests.CreateConnectionRequest;
38
import org.eclipse.gef.requests.GroupRequest;
39
import org.eclipse.gef.requests.ReconnectRequest;
40
import org.eclipse.ui.views.properties.IPropertySource;
41
import org.zaluum.boxes.fsm.model.State;
42
import org.zaluum.boxes.fsm.model.Transition;
43
import org.zaluum.ide.util.GraphicUtils;
44
import org.zaluum.util.Observer;
46
import com.google.common.collect.Lists;
52
public class StateEditPart extends AbstractGraphicalEditPart implements
53
Observer, NodeEditPart {
55
private StatePropertySource psource;
57
public StateEditPart(State p) {
59
psource = new StatePropertySource(this);
63
public void activate() {
65
getStateModel().addObserver(this);
69
public void deactivate() {
70
getStateModel().removeObserver(this);
74
public State getStateModel() {
75
return (State) getModel();
79
protected List<Transition> getModelSourceConnections() {
80
return Lists.newArrayList(getStateModel().getFrom());
84
protected List<Transition> getModelTargetConnections() {
85
return Lists.newArrayList(getStateModel().getTo());
89
protected IFigure createFigure() {
90
State s = getStateModel();
91
return new StateFigure(s.isInitial(),s.hasEntryActions(),s.hasExitActions());
94
StateFigure getStateFigure(){
95
return (StateFigure) getFigure();
99
protected void refreshVisuals() {
100
getStateFigure().updateFigure(getStateModel().getName(), getStateModel().isInitial(), getStateModel().hasEntryActions(), getStateModel().hasExitActions());
101
Point point = GraphicUtils.modelToDraw2d(getStateModel().getPosition());
102
Rectangle bounds = new Rectangle(point, getFigure().getPreferredSize());
103
((GraphicalEditPart) getParent()).setLayoutConstraint(
110
protected void createEditPolicies() {
111
installEditPolicy(EditPolicy.COMPONENT_ROLE, new ComponentEditPolicy() {
113
protected Command createDeleteCommand(GroupRequest deleteRequest) {
114
return new DeleteStateCommand(getStateModel());
117
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
118
new GraphicalNodeEditPolicy() {
121
protected Command getConnectionCompleteCommand(
122
CreateConnectionRequest request) {
123
if (!(request.getStartCommand() instanceof CreateTransitionCommand))
125
CreateTransitionCommand cmd = (CreateTransitionCommand) request
127
cmd.setTarget(getStateModel());
132
protected Command getConnectionCreateCommand(
133
CreateConnectionRequest request) {
134
if (request.getNewObjectType() != Transition.class)
136
CreateTransitionCommand cmd = new CreateTransitionCommand(
138
request.setStartCommand(cmd);
141
private Command reconnect(ReconnectRequest request){
142
if (request.getConnectionEditPart() instanceof TransitionEditPart){
143
Transition t = (Transition) request.getConnectionEditPart().getModel();
145
if (request.isMovingStartAnchor()){
146
src = getStateModel();
150
trg = getStateModel();
152
if (src==trg) return null;
153
return new ReconnectTransitionCommand(t, src, trg);
158
protected Command getReconnectSourceCommand(
159
ReconnectRequest request) {
160
return reconnect(request);
164
protected Command getReconnectTargetCommand(
165
ReconnectRequest request) {
166
return reconnect(request);
172
public void update() {
177
public ConnectionAnchor getSourceConnectionAnchor(
178
ConnectionEditPart connection) {
179
return getStateFigure().getAnchor();
183
public ConnectionAnchor getSourceConnectionAnchor(Request request) {
184
return getStateFigure().getAnchor();
188
public ConnectionAnchor getTargetConnectionAnchor(
189
ConnectionEditPart connection) {
190
return getStateFigure().getAnchor();
194
public ConnectionAnchor getTargetConnectionAnchor(Request request) {
195
return getStateFigure().getAnchor();
198
@SuppressWarnings("unchecked")
200
public Object getAdapter(Class key) {
201
if (key == IPropertySource.class) {
204
return super.getAdapter(key);