add load as palette option in palette browser
[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.awt.Color;
16 import java.util.List;
17
18 import org.scilab.modules.gui.tab.Tab;
19 import org.scilab.modules.gui.utils.UIElementMapper;
20 import org.scilab.modules.gui.window.ScilabWindow;
21 import org.scilab.modules.localization.Messages;
22 import org.scilab.modules.xcos.utils.XcosComponent;
23
24 import com.mxgraph.canvas.mxICanvas;
25 import com.mxgraph.swing.mxGraphComponent;
26 import com.mxgraph.swing.mxGraphOutline;
27 import com.mxgraph.swing.handler.mxKeyboardHandler;
28 import com.mxgraph.swing.handler.mxRubberband;
29 import com.mxgraph.swing.util.mxGraphActions;
30 import com.mxgraph.util.mxEvent;
31 import com.mxgraph.util.mxEventObject;
32 import com.mxgraph.util.mxUndoManager;
33 import com.mxgraph.util.mxUndoableEdit;
34 import com.mxgraph.view.mxCellState;
35 import com.mxgraph.view.mxGraph;
36
37 public class ScilabGraph extends mxGraph {
38
39     protected mxUndoManager undoManager = new mxUndoManager();
40     protected mxGraphOutline graphOutline = null;
41     protected mxKeyboardHandler keyboardHandler = null;
42     protected XcosComponent component = null;
43     //    protected mxGraphComponent component = null;
44
45     private String title = Messages.gettext("Untitled");
46     private String savedFile = null;
47     private boolean modified = false;
48     private Tab parentTab;
49     private boolean opened = false;
50     private boolean redoInAction = false;
51     private int undoCounter = 0;
52     private boolean readOnly = false;
53     private Color originalColor = null;
54     private mxRubberband rubberBand;
55
56     /**
57      * 
58      */
59     protected mxIEventListener changeTracker = new mxIEventListener() {
60         public void invoke(Object source, mxEventObject evt) {
61             setModified(true);
62         }
63     };
64
65     protected mxIEventListener undoHandler = new mxIEventListener() {
66         public void invoke(Object source, mxEventObject evt) {
67
68             if (!redoInAction) {
69                 undoManager.undoableEditHappened((mxUndoableEdit) evt.getArgAt(0));
70                 incrementUndoCounter();
71             }
72         }
73     };
74
75     mxIEventListener selectionHandler = new mxIEventListener() {
76         public void invoke(Object source, mxEventObject evt) {
77             List changes = ((mxUndoableEdit) evt.getArgAt(0)).getChanges();
78             setSelectionCells(getSelectionCellsForChanges(changes));
79         }
80     };
81
82     public ScilabGraph() {
83         super();
84
85         /*
86          * Disabling the default connected action and event listeners.
87          */
88         mxGraphActions.getSelectNextAction().setEnabled(false);
89         mxGraphActions.getSelectPreviousAction().setEnabled(false);
90         mxGraphActions.getSelectChildAction().setEnabled(false);
91         mxGraphActions.getSelectParentAction().setEnabled(false);
92
93         // Undo / Redo capabilities
94         getModel().addListener(mxEvent.UNDO, undoHandler);
95         getView().addListener(mxEvent.UNDO, undoHandler);
96
97         // Keeps the selection in sync with the command history
98
99         undoManager.addListener(mxEvent.UNDO, selectionHandler);
100         undoManager.addListener(mxEvent.REDO, selectionHandler);
101
102         component = new XcosComponent(this);
103         //      component = new mxGraphComponent(this);
104
105         // Adds rubberband selection
106         rubberBand = new mxRubberband(component);
107
108         // Modified property change
109         getModel().addListener(mxEvent.CHANGE, changeTracker);
110
111         // addKeyListener(new XcosShortCut());
112         // setMarqueeHandler(new XcosPortAction());
113         // getGraphLayoutCache().setFactory(new DiagrammFactory());
114         // setPortsScaled(true);
115         // setVisible(true);
116         // Control-drag should clone selection
117         // this.setCloneable(true);
118         // this.setPortsVisible(true);
119
120         // Enable edit without final RETURN keystroke
121         // this.setInvokesStopCellEditing(true);
122     }
123
124     public String getSavedFile() {
125         return savedFile;
126     }
127
128     public void setSavedFile(String savedFile) {
129         this.savedFile = savedFile;
130     }
131
132     public boolean isModified() {
133         return modified;
134     }
135
136     public void setModified(boolean modified) {
137         boolean oldValue = this.modified;
138         this.modified = modified;
139
140         getAsComponent().firePropertyChange("modified", oldValue, modified);
141     }
142
143     public void setTitle(String title) {
144         this.title = title;
145     }
146
147     public String getTitle() {
148         return title;
149     }
150
151     public mxGraphComponent getAsComponent() {
152         return component;
153     }
154
155     public void undo() {
156         decrementUndoCounter();
157         redoInAction = true;
158         undoManager.undo();
159         redoInAction = false;
160     }
161
162     public void redo() {
163         incrementUndoCounter();
164         redoInAction = true;
165         undoManager.redo();
166         redoInAction = false;
167     }
168
169     private void incrementUndoCounter() {
170         if (undoCounter < Integer.MAX_VALUE) {
171             undoCounter++;
172         }
173     }
174
175     private void decrementUndoCounter() {
176         if (undoCounter > Integer.MIN_VALUE) {
177             undoCounter--;
178         }
179     }
180
181     protected boolean isZeroUndoCounter() {
182         return (undoCounter == 0);
183     }
184
185     protected void resetUndoCounter() {
186         undoCounter = 0;
187     }
188
189     public void zoom() {
190         // this.setScale(2 * this.getScale());
191     }
192
193     public void unzoom() {
194         // this.setScale(this.getScale() / 2);
195     }
196
197     public void delete() {
198         // if (!isSelectionEmpty()) {
199         // getModel().remove(getDescendants(getSelectionCells()));
200         // }
201     }
202
203     public Tab getParentTab() {
204         return parentTab;
205     }
206
207     public void setParentTab(Tab parentTab) {
208         this.parentTab = parentTab;
209     }
210
211     public void setOpened(boolean opened) {
212         this.opened = opened;
213     }
214
215     public boolean isOpened() {
216         return opened;
217     }
218
219     public void setVisible(boolean visible) {
220         if (parentTab != null) {
221             ScilabWindow xcosWindow = (ScilabWindow) UIElementMapper.getCorrespondingUIElement(parentTab.getParentWindowId());
222             xcosWindow.setVisible(visible);
223         }
224     }
225
226     public boolean isVisible() {
227         if (parentTab != null) {
228             ScilabWindow xcosWindow = (ScilabWindow) UIElementMapper.getCorrespondingUIElement(parentTab.getParentWindowId());
229             return xcosWindow.isVisible();
230         }
231
232         return false;
233     }
234
235     public void setReadOnly(boolean readOnly) {
236         this.readOnly = readOnly;
237         
238         setCellsLocked(readOnly);
239         if(isReadonly()) {
240             setOriginalColor(getAsComponent().getBackground());
241             getAsComponent().setBackground(new Color(240, 240, 240));
242         } else {
243             getAsComponent().setBackground(getOriginalColor());
244         }
245     }
246
247     public boolean isReadonly() {
248         return readOnly;
249     }
250
251     public void setOriginalColor(Color originalColor) {
252         this.originalColor = originalColor;
253     }
254
255     public Color getOriginalColor() {
256         if(originalColor != null){
257             return originalColor;
258         }
259         return Color.WHITE;
260     }
261
262     public mxRubberband getRubberBand() {
263         return rubberBand;
264     }
265 }