fiore@0
|
1 /*
|
fiore@0
|
2 CCmI Editor - A Collaborative Cross-Modal Diagram Editing Tool
|
fiore@0
|
3
|
fiore@0
|
4 Copyright (C) 2002 Cay S. Horstmann (http://horstmann.com)
|
fiore@0
|
5 Copyright (C) 2011 Queen Mary University of London (http://ccmi.eecs.qmul.ac.uk/)
|
fiore@0
|
6
|
fiore@0
|
7 This program is free software: you can redistribute it and/or modify
|
fiore@0
|
8 it under the terms of the GNU General Public License as published by
|
fiore@0
|
9 the Free Software Foundation, either version 3 of the License, or
|
fiore@0
|
10 (at your option) any later version.
|
fiore@0
|
11
|
fiore@0
|
12 This program is distributed in the hope that it will be useful,
|
fiore@0
|
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
fiore@0
|
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
fiore@0
|
15 GNU General Public License for more details.
|
fiore@0
|
16
|
fiore@0
|
17 You should have received a copy of the GNU General Public License
|
fiore@0
|
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
|
fiore@0
|
19 */
|
fiore@0
|
20
|
fiore@0
|
21 package uk.ac.qmul.eecs.ccmi.gui;
|
fiore@0
|
22
|
fiore@0
|
23 import java.awt.BorderLayout;
|
fiore@0
|
24
|
fiore@0
|
25 import javax.swing.JPanel;
|
fiore@0
|
26 import javax.swing.JScrollPane;
|
fiore@0
|
27 import javax.swing.JSplitPane;
|
fiore@0
|
28 import javax.swing.event.ChangeEvent;
|
fiore@0
|
29 import javax.swing.event.ChangeListener;
|
fiore@0
|
30
|
fiore@0
|
31 /**
|
fiore@0
|
32 * It's the panel which displays a diagram. It contains a {@link GraphPanel}, a {@link DiagramTree}
|
fiore@0
|
33 * and a {@link GraphToolbar}
|
fiore@0
|
34 *
|
fiore@0
|
35 */
|
fiore@0
|
36 @SuppressWarnings("serial")
|
fiore@0
|
37 public class DiagramPanel extends JPanel{
|
fiore@0
|
38
|
fiore@0
|
39 public DiagramPanel(Diagram diagram, EditorTabbedPane tabbedPane){
|
fiore@0
|
40 this.diagram = diagram;
|
fiore@0
|
41 this.tabbedPane = tabbedPane;
|
fiore@0
|
42 setName(diagram.getLabel());
|
fiore@0
|
43 setLayout(new BorderLayout());
|
fiore@0
|
44
|
fiore@0
|
45 modelChangeListener = new ChangeListener(){
|
fiore@0
|
46 @Override
|
fiore@0
|
47 public void stateChanged(ChangeEvent e) {
|
fiore@0
|
48 setModified(true);
|
fiore@0
|
49 }
|
fiore@0
|
50 };
|
fiore@0
|
51
|
fiore@0
|
52 toolbar = new GraphToolbar(diagram);
|
fiore@0
|
53 graphPanel = new GraphPanel(diagram, toolbar);
|
fiore@0
|
54 /* the focus must be hold by the tree and the tab panel only */
|
fiore@0
|
55 toolbar.setFocusable(false);
|
fiore@0
|
56 graphPanel.setFocusable(false);
|
fiore@0
|
57
|
fiore@0
|
58 tree = new DiagramTree(diagram);
|
fiore@0
|
59
|
fiore@0
|
60 /* the panel containing the graph and the toolbar */
|
fiore@0
|
61 JPanel graphAndToolbarPanel = new JPanel(new BorderLayout());
|
fiore@0
|
62 graphAndToolbarPanel.add(toolbar, BorderLayout.NORTH);
|
fiore@0
|
63 graphAndToolbarPanel.add(new JScrollPane(graphPanel),BorderLayout.CENTER);
|
fiore@0
|
64
|
fiore@0
|
65 JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
|
fiore@0
|
66 new JScrollPane(tree),
|
fiore@0
|
67 graphAndToolbarPanel);
|
fiore@0
|
68 splitPane.setDividerLocation((int)tree.getPreferredSize().width*2);
|
fiore@0
|
69 add(splitPane, BorderLayout.CENTER);
|
fiore@0
|
70
|
fiore@0
|
71 diagram.getCollectionModel().addChangeListener(modelChangeListener);
|
fiore@0
|
72 }
|
fiore@0
|
73
|
fiore@0
|
74 public String getFilePath(){
|
fiore@0
|
75 return filePath;
|
fiore@0
|
76 }
|
fiore@0
|
77
|
fiore@0
|
78 public void setFilePath(String newValue){
|
fiore@0
|
79 filePath = newValue;
|
fiore@0
|
80 }
|
fiore@0
|
81
|
fiore@0
|
82 public Diagram getDiagram(){
|
fiore@0
|
83 return diagram;
|
fiore@0
|
84 }
|
fiore@0
|
85
|
fiore@0
|
86 public void setDiagram(Diagram diagram){
|
fiore@0
|
87 /* remove the listener from the old model */
|
fiore@0
|
88 this.diagram.getCollectionModel().removeChangeListener(modelChangeListener);
|
fiore@0
|
89 diagram.getCollectionModel().addChangeListener(modelChangeListener);
|
fiore@0
|
90
|
fiore@0
|
91 this.diagram = diagram;
|
fiore@0
|
92 tree.setDiagram(diagram);
|
fiore@0
|
93 graphPanel.setModelUpdater(diagram.getModelUpdater());
|
fiore@0
|
94 setName(diagram.getLabel());
|
fiore@0
|
95 /* set the * according to the new diagram's model modification status */
|
fiore@0
|
96 setModified(isModified());
|
fiore@0
|
97 }
|
fiore@0
|
98
|
fiore@0
|
99 public GraphPanel getGraphPanel(){
|
fiore@0
|
100 return graphPanel;
|
fiore@0
|
101 }
|
fiore@0
|
102
|
fiore@0
|
103 public DiagramTree getTree(){
|
fiore@0
|
104 return tree;
|
fiore@0
|
105 }
|
fiore@0
|
106
|
fiore@0
|
107 /** This method is for changing the 'modified' status of the diagram. *
|
fiore@0
|
108 * When called passing false as argument listeners are notified that the *
|
fiore@0
|
109 * diagram has been saved. */
|
fiore@0
|
110 public void setModified(boolean modified){
|
fiore@0
|
111 if(!modified)
|
fiore@0
|
112 diagram.getCollectionModel().setUnmodified();
|
fiore@0
|
113 /* add an asterisk to notify that the diagram has changed */
|
fiore@0
|
114 if(modified)
|
fiore@0
|
115 setName(getName()+"*");
|
fiore@0
|
116 else
|
fiore@0
|
117 setName(diagram.getLabel());
|
fiore@0
|
118 tabbedPane.refreshComponentTabTitle(this);
|
fiore@0
|
119 }
|
fiore@0
|
120
|
fiore@0
|
121 public boolean isModified(){
|
fiore@0
|
122 return diagram.getCollectionModel().isModified();
|
fiore@0
|
123 }
|
fiore@0
|
124
|
fiore@0
|
125 private Diagram diagram;
|
fiore@0
|
126 private GraphPanel graphPanel;
|
fiore@0
|
127 private DiagramTree tree;
|
fiore@0
|
128 private GraphToolbar toolbar;
|
fiore@0
|
129 private String filePath;
|
fiore@0
|
130 private ChangeListener modelChangeListener;
|
fiore@0
|
131 private EditorTabbedPane tabbedPane;
|
fiore@0
|
132 }
|