26aa71faefdaf775d269af50409e9d3dfa1e67a0
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / graph / ScilabGraph.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009 - DIGITEO - Bruno JOFRET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 package org.scilab.modules.graph;
14
15 import java.util.List;
16
17 import org.scilab.modules.gui.tab.Tab;
18 import org.scilab.modules.gui.utils.UIElementMapper;
19 import org.scilab.modules.gui.window.ScilabWindow;
20 import org.scilab.modules.localization.Messages;
21 import org.scilab.modules.xcos.utils.XcosComponent;
22
23 import com.mxgraph.canvas.mxICanvas;
24 import com.mxgraph.swing.mxGraphComponent;
25 import com.mxgraph.swing.mxGraphOutline;
26 import com.mxgraph.swing.handler.mxKeyboardHandler;
27 import com.mxgraph.swing.handler.mxRubberband;
28 import com.mxgraph.swing.util.mxGraphActions;
29 import com.mxgraph.util.mxEvent;
30 import com.mxgraph.util.mxEventObject;
31 import com.mxgraph.util.mxUndoManager;
32 import com.mxgraph.util.mxUndoableEdit;
33 import com.mxgraph.view.mxCellState;
34 import com.mxgraph.view.mxGraph;
35
36 public class ScilabGraph extends mxGraph {
37
38     protected mxUndoManager undoManager = new mxUndoManager();
39     protected mxGraphOutline graphOutline = null;
40     protected mxKeyboardHandler keyboardHandler = null;
41     protected XcosComponent component = null;
42 //    protected mxGraphComponent component = null;
43
44     private String title = Messages.gettext("Untitled");
45     private String savedFile = null;
46     private boolean modified = false;
47     private Tab parentTab;
48     private boolean opened = false;
49     private boolean redoInAction = false;
50     private int undoCounter = 0;
51
52     /**
53      * 
54      */
55     protected mxIEventListener changeTracker = new mxIEventListener() {
56         public void invoke(Object source, mxEventObject evt) {
57             setModified(true);
58         }
59     };
60
61     protected mxIEventListener undoHandler = new mxIEventListener() {
62         public void invoke(Object source, mxEventObject evt) {
63
64             if (!redoInAction) {
65                 undoManager.undoableEditHappened((mxUndoableEdit) evt
66                         .getArgAt(0));
67                 incrementUndoCounter();
68             }
69         }
70     };
71
72     mxIEventListener selectionHandler = new mxIEventListener() {
73         public void invoke(Object source, mxEventObject evt) {
74             List changes = ((mxUndoableEdit) evt.getArgAt(0)).getChanges();
75             setSelectionCells(getSelectionCellsForChanges(changes));
76         }
77     };
78
79     public ScilabGraph() {
80         super();
81         
82         /*
83          * Disabling the default connected action and event listeners.
84          */
85         mxGraphActions.getSelectNextAction().setEnabled(false);
86         mxGraphActions.getSelectPreviousAction().setEnabled(false);
87         mxGraphActions.getSelectChildAction().setEnabled(false);
88         mxGraphActions.getSelectParentAction().setEnabled(false);
89         
90         // Undo / Redo capabilities
91         getModel().addListener(mxEvent.UNDO, undoHandler);
92         getView().addListener(mxEvent.UNDO, undoHandler);
93
94         // Keeps the selection in sync with the command history
95
96         undoManager.addListener(mxEvent.UNDO, selectionHandler);
97         undoManager.addListener(mxEvent.REDO, selectionHandler);
98
99         component = new XcosComponent(this);
100 //      component = new mxGraphComponent(this);
101
102         // Adds rubberband selection
103         new mxRubberband(component);
104
105         // Modified property change
106         getModel().addListener(mxEvent.CHANGE, changeTracker);
107
108         // addKeyListener(new XcosShortCut());
109         // setMarqueeHandler(new XcosPortAction());
110         // getGraphLayoutCache().setFactory(new DiagrammFactory());
111         // setPortsScaled(true);
112         // setVisible(true);
113         // Control-drag should clone selection
114         // this.setCloneable(true);
115         // this.setPortsVisible(true);
116
117         // Enable edit without final RETURN keystroke
118         // this.setInvokesStopCellEditing(true);
119     }
120
121         public String getSavedFile() {
122         return savedFile;
123     }
124
125     public void setSavedFile(String savedFile) {
126         this.savedFile = savedFile;
127     }
128
129     public boolean isModified() {
130         return modified;
131     }
132
133     public void setModified(boolean modified) {
134         boolean oldValue = this.modified;
135         this.modified = modified;
136
137         getAsComponent().firePropertyChange("modified", oldValue, modified);
138     }
139
140     public void setTitle(String title) {
141         this.title = title;
142     }
143
144     public String getTitle() {
145         return title;
146     }
147
148     public mxGraphComponent getAsComponent() {
149         return component;
150     }
151
152     public void undo() {
153         decrementUndoCounter();
154         redoInAction = true;
155         undoManager.undo();
156         redoInAction = false;
157     }
158
159     public void redo() {
160         incrementUndoCounter();
161         redoInAction = true;
162         undoManager.redo();
163         redoInAction = false;
164     }
165
166     private void incrementUndoCounter() {
167         if (undoCounter < Integer.MAX_VALUE) {
168             undoCounter++;
169         }
170     }
171
172     private void decrementUndoCounter() {
173         if (undoCounter > Integer.MIN_VALUE) {
174             undoCounter--;
175         }
176     }
177
178     protected boolean isZeroUndoCounter() {
179         return (undoCounter == 0);
180     }
181
182     protected void resetUndoCounter() {
183         undoCounter = 0;
184     }
185
186     public void zoom() {
187         // this.setScale(2 * this.getScale());
188     }
189
190     public void unzoom() {
191         // this.setScale(this.getScale() / 2);
192     }
193
194     public void delete() {
195         // if (!isSelectionEmpty()) {
196         // getModel().remove(getDescendants(getSelectionCells()));
197         // }
198     }
199
200     public Tab getParentTab() {
201         return parentTab;
202     }
203
204     public void setParentTab(Tab parentTab) {
205         this.parentTab = parentTab;
206     }
207
208     public void setOpened(boolean opened) {
209         this.opened = opened;
210     }
211
212     public boolean isOpened() {
213         return opened;
214     }
215
216     public void setVisible(boolean visible) {
217         if (parentTab != null) {
218             ScilabWindow xcosWindow = (ScilabWindow) UIElementMapper
219                     .getCorrespondingUIElement(parentTab.getParentWindowId());
220             xcosWindow.setVisible(visible);
221         }
222     }
223
224     public boolean isVisible() {
225         if (parentTab != null) {
226             ScilabWindow xcosWindow = (ScilabWindow) UIElementMapper
227                     .getCorrespondingUIElement(parentTab.getParentWindowId());
228             return xcosWindow.isVisible();
229         }
230
231         return false;
232     }
233
234 }