2
GeoGebra - Dynamic Mathematics for Everyone
3
http://www.geogebra.org
5
This file is part of GeoGebra.
7
This program is free software; you can redistribute it and/or modify it
8
under the terms of the GNU General Public License as published by
9
the Free Software Foundation.
13
package geogebra.gui.toolbar;
14
import geogebra.main.Application;
16
import java.awt.BorderLayout;
17
import java.awt.Dimension;
18
import java.awt.event.ActionEvent;
19
import java.util.Enumeration;
20
import java.util.Vector;
22
import javax.swing.Box;
23
import javax.swing.BoxLayout;
24
import javax.swing.JButton;
25
import javax.swing.JList;
26
import javax.swing.JPanel;
27
import javax.swing.JScrollPane;
28
import javax.swing.JTree;
29
import javax.swing.ListSelectionModel;
30
import javax.swing.border.EmptyBorder;
31
import javax.swing.border.TitledBorder;
32
import javax.swing.tree.DefaultMutableTreeNode;
33
import javax.swing.tree.DefaultTreeModel;
34
import javax.swing.tree.TreePath;
35
import javax.swing.tree.TreeSelectionModel;
38
* Toolbar configuration panel.
40
* @author Markus Hohenwarter, based on a dialog from geonext.de
43
public class ToolbarConfigPanel extends javax.swing.JPanel implements java.awt.event.ActionListener, javax.swing.event.TreeExpansionListener {
45
private static final int SCROLL_PANEL_WIDTH = 300;
46
private static final int SCROLL_PANEL_HEIGHT = 400;
48
public JButton insertButton;
49
public JButton moveUpButton;
50
public JButton moveDownButton;
51
public JButton deleteButton;
53
JScrollPane configScrollPane;
54
JScrollPane modeScrollPane;
55
JScrollPane iconScrollPane;
56
JPanel selectionPanel;
61
public ToolbarConfigPanel(Application app) {
65
selectionPanel = new JPanel();
66
selectionPanel.setLayout(new BorderLayout(5, 5));
67
selectionPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
68
setLayout(new BorderLayout(5, 5));
70
tree = generateTree();
71
setToolBarString(app.getGuiManager().getToolBarDefinition());
73
configScrollPane = new JScrollPane(tree);
74
configScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
75
configScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
76
//configScrollPane.setSize(150, 150);
77
JPanel scrollSpacePanel = new JPanel();
78
scrollSpacePanel.setLayout(new BorderLayout(0, 0));
79
scrollSpacePanel.setBorder(new EmptyBorder(3, 5, 3, 5));
80
scrollSpacePanel.add(configScrollPane, BorderLayout.CENTER); //
81
JPanel scrollPanel = new JPanel();
82
scrollPanel.setLayout(new BorderLayout(0, 0));
83
scrollPanel.setBorder(new TitledBorder(app.getMenu("Toolbar")));
84
scrollPanel.add(scrollSpacePanel, BorderLayout.CENTER);
86
scrollPanel.setPreferredSize(new Dimension(SCROLL_PANEL_WIDTH, SCROLL_PANEL_HEIGHT));
88
selectionPanel.add(scrollPanel, BorderLayout.WEST);
91
JPanel buttonPanel = new JPanel();
92
buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
93
buttonPanel.add(Box.createVerticalGlue());
95
insertButton = new JButton("< " + app.getPlain("Insert"));
96
insertButton.addActionListener(this);
97
insertButton.setAlignmentX(CENTER_ALIGNMENT);
98
buttonPanel.add(insertButton);
99
buttonPanel.add(Box.createVerticalStrut(10));
101
deleteButton = new javax.swing.JButton(app.getPlain("Remove") + " >");
102
deleteButton.addActionListener(this);
103
deleteButton.setAlignmentX(CENTER_ALIGNMENT);
104
buttonPanel.add(deleteButton);
106
buttonPanel.add(Box.createVerticalGlue());
107
selectionPanel.add(buttonPanel, BorderLayout.CENTER);
112
JPanel upDownPanel = new JPanel();
113
moveUpButton = new javax.swing.JButton("\u25b2 " + app.getPlain("Up"));
114
moveUpButton.addActionListener(this);
115
upDownPanel.add(moveUpButton);
117
moveDownButton = new javax.swing.JButton("\u25bc " + app.getPlain("Down"));
118
moveDownButton.addActionListener(this);
119
upDownPanel.add(moveDownButton);
121
scrollPanel.add(upDownPanel, BorderLayout.SOUTH);
126
JPanel modePanel = new JPanel();
127
modePanel.setLayout(new BorderLayout(0, 0));
128
modePanel.setBorder(new TitledBorder(app.getMenu("Tools")));
129
//modePanel.setBorder(new TitledBorder(new EmptyBorder(0, 0, 0, 0), " " + "W�hlbare Eintr�ge" + " "));
131
Vector modeVector = generateToolsVector();
132
toolList = new JList(modeVector);
133
//modeList.setPreferredSize(new Dimension(150, 150));
135
//modeList.setSize(new Dimension(150, 150));
136
//modeList.addListSelectionListener(this);
138
ListSelectionModel lsm = toolList.getSelectionModel();
139
lsm.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
140
toolList.setBackground(configScrollPane.getBackground());
141
modeScrollPane = new JScrollPane(toolList);
142
modeScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
143
modeScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
144
toolList.setCellRenderer(new ModeCellRenderer(app));
145
toolList.setSelectedIndex(0);
148
JPanel modeSpacePanel = new JPanel();
149
modeSpacePanel.setLayout(new BorderLayout(0, 0));
150
modeSpacePanel.setBorder(new EmptyBorder(3, 5, 3, 5));
151
modeSpacePanel.add("Center", modeScrollPane);
153
//modeSpacePanel.setPreferredSize(new Dimension(175, 175));
155
//modeSpacePanel.setSize(new Dimension(175, 175));
157
modePanel.add("Center", modeSpacePanel);
158
modePanel.setPreferredSize(new Dimension(SCROLL_PANEL_WIDTH, SCROLL_PANEL_HEIGHT));
159
selectionPanel.add("East", modePanel);
160
add("Center", selectionPanel);
162
/*JPanel controlPanel = new JPanel();
163
controlPanel.setLayout(new FlowLayout());
164
okButton = new javax.swing.JButton("OK");
165
okButton.setName("ok");
166
okButton.addActionListener(this);
167
controlPanel.add(okButton);
168
cancelButton = new javax.swing.JButton("Abbrechen");
169
cancelButton.setName("cancel");
170
cancelButton.addActionListener(this);
171
controlPanel.add(cancelButton);
172
controlPanel.doLayout();*/
173
//add(controlPanel, BorderLayout.SOUTH);
176
//this.validateTree();
177
//modeScrollPane.setPreferredSize(new Dimension(Math.max(modeScrollPane.getWidth(), configScrollPane.getWidth()), (int) configScrollPane.getSize().getHeight()));
178
//modeScrollPane.setSize(modeList.getPreferredSize());
179
//modeScrollPane.setSize(modeScrollPane.getPreferredSize());
180
//configScrollPane.setPreferredSize(new Dimension(Math.max(modeScrollPane.getWidth(), configScrollPane.getWidth()), (int) configScrollPane.getSize().getHeight()));
184
tree.setSelectionRow(1);
185
} catch (Exception exc) {
186
tree.setSelectionRow(0);
194
* Handles remove, add and up, down buttons.
196
public void actionPerformed(ActionEvent e) {
197
// get selected node in tree
198
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
199
TreePath selPath = tree.getSelectionPath();
200
if (selPath == null) {
201
tree.setSelectionRow(0); // take root if nothing is selected
202
selPath = tree.getSelectionPath();
204
DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
205
DefaultMutableTreeNode selNode = (DefaultMutableTreeNode) selPath.getLastPathComponent();
206
// remember row number
207
int selRow = tree.getRowForPath(selPath);
209
DefaultMutableTreeNode parentNode;
210
if (selNode == root) { // root is selected
211
parentNode = selNode;
213
parentNode = (DefaultMutableTreeNode) selNode.getParent();
215
int childIndex = parentNode.getIndex(selNode);
217
Object src = e.getSource();
220
if (src == deleteButton) {
221
if (selRow > 0) { // not root
222
// delete node unless move node
223
Object userOb = selNode.getUserObject();
225
userOb = ((DefaultMutableTreeNode) selNode.getFirstChild()).getUserObject();
226
if (userOb instanceof Integer && ((Integer) userOb).intValue() == 0)
229
// not move mode: delete node
230
model.removeNodeFromParent(selNode);
231
// remove empty menu too
232
if (parentNode.getChildCount() == 0) {
233
if (!parentNode.isRoot()) {
234
model.removeNodeFromParent(parentNode);
239
// select node at same row or above
240
if (selRow >= tree.getRowCount())
242
tree.setSelectionRow(selRow);
246
else if (src == insertButton) {
249
boolean didInsert = false;
250
Object [] tools = toolList.getSelectedValues();
251
for (int i=0; i < tools.length; i++) {
252
// check if too is already there
253
Integer modeInt = (Integer)tools[i];
254
if (modeInt.intValue() > -1 && containsTool(root, (Integer)tools[i]))
257
DefaultMutableTreeNode newNode;
258
if (parentNode == root && modeInt.intValue() > -1) {
259
// parent is root: create new submenu
260
newNode = new DefaultMutableTreeNode();
261
newNode.add(new DefaultMutableTreeNode(modeInt));
265
newNode = new DefaultMutableTreeNode(modeInt);
267
model.insertNodeInto(newNode, parentNode, childIndex++);
272
// make sure that root is expanded
273
tree.expandPath(new TreePath(model.getRoot()));
275
// select first inserted node
276
tree.setSelectionRow(++selRow);
277
tree.scrollRowToVisible(selRow);
278
configScrollPane.getHorizontalScrollBar().setValue(0); // scroll to left
283
else if (src == moveUpButton) {
287
if (parentNode.getChildBefore(selNode) != null) {
288
model.removeNodeFromParent(selNode);
289
model.insertNodeInto(selNode, parentNode, --childIndex);
290
tree.setSelectionRow(--selRow);
295
else if (src == moveDownButton) {
299
if (parentNode.getChildAfter(selNode) != null) {
300
model.removeNodeFromParent(selNode);
301
model.insertNodeInto(selNode, parentNode, ++childIndex);
302
tree.setSelectionRow(++selRow);
307
private boolean containsTool(DefaultMutableTreeNode node, Integer mode) {
309
Object ob = node.getUserObject();
310
if (ob != null && mode.compareTo((Integer)ob) == 0) {
314
if (node.getChildCount() >= 0) {
315
for (Enumeration e=node.children(); e.hasMoreElements(); ) {
316
DefaultMutableTreeNode n = (DefaultMutableTreeNode)e.nextElement();
317
if (containsTool(n, mode))
325
* Inits the toolbar tree in this panel to show the given toolbar definition string.
327
public void setToolBarString(String toolbarDefinition) {
328
// create new tree model
329
Vector toolVec = MyToolbar.createToolBarVec(toolbarDefinition);
330
DefaultTreeModel model = new DefaultTreeModel(generateRootNode(toolVec));
331
tree.setModel(model);
333
tree.setRowHeight(-1);
337
* Returns the custom toolbar created with this panel as a String.
338
* Separator ("||" between menus, "," in menu), New menu starts with "|"
340
public String getToolBarString() {
341
StringBuffer sb = new StringBuffer();
343
DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot();
344
for (int i=0; i < root.getChildCount(); i++) {
345
DefaultMutableTreeNode menu = (DefaultMutableTreeNode) root.getChildAt(i);
347
if (menu.getChildCount() == 0) { // new menu with separator
350
else if (i > 0 && !sb.toString().endsWith("|| ")) // new menu
353
for (int j=0; j < menu.getChildCount(); j++) {
354
DefaultMutableTreeNode node = (DefaultMutableTreeNode) menu.getChildAt(j);
355
int mode = ((Integer) node.getUserObject()).intValue();
357
if (mode < 0) // separator
359
else { // mode number
366
return sb.toString().trim();
369
public void collapseAllRows() {
370
int z = tree.getRowCount();
371
for (int i = z; i > 0; i--) {
380
public Vector generateToolsVector() {
381
Vector vector = new Vector();
383
vector.add(MyToolbar.TOOLBAR_SEPARATOR);
385
// get default toolbar as nested vectors
386
Vector defTools = MyToolbar.createToolBarVec(app.getGuiManager().getDefaultToolbarString());
387
for (int i=0; i < defTools.size(); i++) {
388
Object element = defTools.get(i);
390
if (element instanceof Vector) {
391
Vector menu = (Vector) element;
392
for (int j=0; j < menu.size(); j++) {
393
Integer modeInt = (Integer) menu.get(j);
394
int mode = modeInt.intValue();
399
Integer modeInt = (Integer) element;
400
int mode = modeInt.intValue();
410
private JTree generateTree() {
411
final JTree jTree = new JTree() {
412
protected void setExpandedState(TreePath path, boolean state) {
413
// Ignore all collapse requests of root
414
if (path != getPathForRow(0)) {
415
super.setExpandedState(path, state);
420
jTree.setCellRenderer(new ModeCellRenderer(app));
421
jTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
422
jTree.putClientProperty("JTree.lineStyle", "Angled");
423
jTree.addTreeExpansionListener(this);
430
public DefaultMutableTreeNode generateRootNode(Vector toolbarModes) {
431
DefaultMutableTreeNode node = new DefaultMutableTreeNode();
433
for (int i = 0; i < toolbarModes.size(); i++) {
434
Object ob = toolbarModes.get(i);
435
if (ob instanceof Vector) {
436
Vector menu = (Vector) ob;
437
DefaultMutableTreeNode sub = new DefaultMutableTreeNode();
438
for (int j = 0; j < menu.size(); j++) {
439
sub.add(new DefaultMutableTreeNode(menu.get(j)));
444
node.add(new DefaultMutableTreeNode(ob));
452
public void treeCollapsed(javax.swing.event.TreeExpansionEvent event) {}
456
public void treeExpanded(javax.swing.event.TreeExpansionEvent event) {
457
/*tabbed.invalidate();
458
tabbed.validateTree();*/
464
public void valueChanged(javax.swing.event.ListSelectionEvent e) {}
2
GeoGebra - Dynamic Mathematics for Everyone
3
http://www.geogebra.org
5
This file is part of GeoGebra.
7
This program is free software; you can redistribute it and/or modify it
8
under the terms of the GNU General Public License as published by
9
the Free Software Foundation.
13
package geogebra.gui.toolbar;
14
import geogebra.gui.layout.DockPanel;
15
import geogebra.main.Application;
17
import java.awt.BorderLayout;
18
import java.awt.Dimension;
19
import java.awt.SystemColor;
20
import java.awt.event.ActionEvent;
21
import java.util.Enumeration;
22
import java.util.Iterator;
23
import java.util.Vector;
25
import javax.swing.Box;
26
import javax.swing.BoxLayout;
27
import javax.swing.DefaultListModel;
28
import javax.swing.JButton;
29
import javax.swing.JList;
30
import javax.swing.JPanel;
31
import javax.swing.JScrollPane;
32
import javax.swing.JTree;
33
import javax.swing.ListSelectionModel;
34
import javax.swing.border.EmptyBorder;
35
import javax.swing.border.TitledBorder;
36
import javax.swing.tree.DefaultMutableTreeNode;
37
import javax.swing.tree.DefaultTreeModel;
38
import javax.swing.tree.TreePath;
39
import javax.swing.tree.TreeSelectionModel;
42
* Toolbar configuration panel.
44
* @author Markus Hohenwarter, based on a dialog from geonext.de
47
public class ToolbarConfigPanel extends javax.swing.JPanel implements java.awt.event.ActionListener, javax.swing.event.TreeExpansionListener {
49
private static final int SCROLL_PANEL_WIDTH = 300;
50
private static final int SCROLL_PANEL_HEIGHT = 400;
52
private DockPanel dockPanel;
54
public JButton insertButton;
55
public JButton moveUpButton;
56
public JButton moveDownButton;
57
public JButton deleteButton;
59
JScrollPane configScrollPane;
60
JScrollPane modeScrollPane;
61
JScrollPane iconScrollPane;
62
JPanel selectionPanel;
64
DefaultListModel toolListModel;
68
public ToolbarConfigPanel(Application app) {
72
selectionPanel = new JPanel();
73
selectionPanel.setLayout(new BorderLayout(5, 5));
74
selectionPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
75
setLayout(new BorderLayout(5, 5));
77
tree = generateTree();
79
toolListModel = new DefaultListModel();
80
toolList = new JList(toolListModel);
82
setToolbar(null, app.getGuiManager().getToolbarDefinition());
84
configScrollPane = new JScrollPane(tree);
85
configScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
86
configScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
87
//configScrollPane.setSize(150, 150);
88
JPanel scrollSpacePanel = new JPanel();
89
scrollSpacePanel.setLayout(new BorderLayout(0, 0));
90
scrollSpacePanel.setBorder(new EmptyBorder(3, 5, 3, 5));
91
scrollSpacePanel.add(configScrollPane, BorderLayout.CENTER); //
92
JPanel scrollPanel = new JPanel();
93
scrollPanel.setLayout(new BorderLayout(0, 0));
94
scrollPanel.setBorder(new TitledBorder(app.getMenu("Toolbar")));
95
scrollPanel.add(scrollSpacePanel, BorderLayout.CENTER);
97
scrollPanel.setPreferredSize(new Dimension(SCROLL_PANEL_WIDTH, SCROLL_PANEL_HEIGHT));
99
selectionPanel.add(scrollPanel, BorderLayout.WEST);
102
JPanel buttonPanel = new JPanel();
103
buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
104
buttonPanel.add(Box.createVerticalGlue());
106
insertButton = new JButton("< " + app.getPlain("Insert"));
107
insertButton.addActionListener(this);
108
insertButton.setAlignmentX(CENTER_ALIGNMENT);
109
buttonPanel.add(insertButton);
110
buttonPanel.add(Box.createVerticalStrut(10));
112
deleteButton = new javax.swing.JButton(app.getPlain("Remove") + " >");
113
deleteButton.addActionListener(this);
114
deleteButton.setAlignmentX(CENTER_ALIGNMENT);
115
buttonPanel.add(deleteButton);
117
buttonPanel.add(Box.createVerticalGlue());
118
selectionPanel.add(buttonPanel, BorderLayout.CENTER);
123
JPanel upDownPanel = new JPanel();
124
moveUpButton = new javax.swing.JButton("\u25b2 " + app.getPlain("Up"));
125
moveUpButton.addActionListener(this);
126
upDownPanel.add(moveUpButton);
128
moveDownButton = new javax.swing.JButton("\u25bc " + app.getPlain("Down"));
129
moveDownButton.addActionListener(this);
130
upDownPanel.add(moveDownButton);
132
scrollPanel.add(upDownPanel, BorderLayout.SOUTH);
136
JPanel buttonAllPanel = new JPanel(new BorderLayout());
137
buttonAllPanel.add(buttonPanel, BorderLayout.NORTH);
138
JPanel tempPanel = new JPanel();
139
tempPanel.setLayout(new BoxLayout(tempPanel, BoxLayout.Y_AXIS));
140
tempPanel.add(Box.createRigidArea(new Dimension(10,150)));
141
tempPanel.add(buttonAllPanel);
142
tempPanel.add(Box.createVerticalGlue());
144
selectionPanel.add(tempPanel, BorderLayout.CENTER);
145
JPanel modePanel = new JPanel();
146
modePanel.setLayout(new BorderLayout(0, 0));
147
modePanel.setBorder(new TitledBorder(app.getMenu("Tools")));
149
ListSelectionModel lsm = toolList.getSelectionModel();
150
lsm.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
151
toolList.setBackground(SystemColor.text);
152
modeScrollPane = new JScrollPane(toolList);
153
modeScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
154
modeScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
155
toolList.setCellRenderer(new ModeCellRenderer(app));
156
toolList.setSelectedIndex(0);
159
JPanel modeSpacePanel = new JPanel();
160
modeSpacePanel.setLayout(new BorderLayout(0, 0));
161
modeSpacePanel.setBorder(new EmptyBorder(3, 5, 3, 5));
162
modeSpacePanel.add("Center", modeScrollPane);
164
modePanel.add("Center", modeSpacePanel);
165
modePanel.setPreferredSize(new Dimension(SCROLL_PANEL_WIDTH, SCROLL_PANEL_HEIGHT));
166
selectionPanel.add("East", modePanel);
167
add("Center", selectionPanel);
170
tree.setSelectionRow(1);
171
} catch (Exception exc) {
172
tree.setSelectionRow(0);
180
* Handles remove, add and up, down buttons.
182
public void actionPerformed(ActionEvent e) {
183
// get selected node in tree
184
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
185
TreePath selPath = tree.getSelectionPath();
186
if (selPath == null) {
187
tree.setSelectionRow(0); // take root if nothing is selected
188
selPath = tree.getSelectionPath();
190
DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
191
DefaultMutableTreeNode selNode = (DefaultMutableTreeNode) selPath.getLastPathComponent();
192
// remember row number
193
int selRow = tree.getRowForPath(selPath);
195
DefaultMutableTreeNode parentNode;
196
if (selNode == root) { // root is selected
197
parentNode = selNode;
199
parentNode = (DefaultMutableTreeNode) selNode.getParent();
201
int childIndex = parentNode.getIndex(selNode);
203
Object src = e.getSource();
206
if (src == deleteButton) {
207
if (selRow > 0) { // not root
208
Object userOb = selNode.getUserObject();
210
userOb = ((DefaultMutableTreeNode) selNode.getFirstChild()).getUserObject();
212
// not move mode: delete node
213
model.removeNodeFromParent(selNode);
214
// remove empty menu too
215
if (parentNode.getChildCount() == 0) {
216
if (!parentNode.isRoot()) {
217
model.removeNodeFromParent(parentNode);
222
toolListModel.addElement(userOb);
225
// select node at same row or above
226
if (selRow >= tree.getRowCount())
228
tree.setSelectionRow(selRow);
232
else if (src == insertButton) {
235
boolean didInsert = false;
236
Object [] tools = toolList.getSelectedValues();
237
for (int i=0; i < tools.length; i++) {
238
// check if too is already there
239
Integer modeInt = (Integer)tools[i];
240
if (modeInt.intValue() > -1 && containsTool(root, (Integer)tools[i]))
243
DefaultMutableTreeNode newNode;
244
if (parentNode == root && modeInt.intValue() > -1) {
245
// parent is root: create new submenu
246
newNode = new DefaultMutableTreeNode();
247
newNode.add(new DefaultMutableTreeNode(modeInt));
251
newNode = new DefaultMutableTreeNode(modeInt);
253
model.insertNodeInto(newNode, parentNode, childIndex++);
256
// remove node from list of unused tools if the node is not a separator
257
if(modeInt.intValue() > -1)
258
toolListModel.removeElement(modeInt);
262
// make sure that root is expanded
263
tree.expandPath(new TreePath(model.getRoot()));
265
// select first inserted node
266
tree.setSelectionRow(++selRow);
267
tree.scrollRowToVisible(selRow);
268
configScrollPane.getHorizontalScrollBar().setValue(0); // scroll to left
276
else if (src == moveUpButton) {
280
if (parentNode.getChildBefore(selNode) != null) {
281
model.removeNodeFromParent(selNode);
282
model.insertNodeInto(selNode, parentNode, --childIndex);
283
tree.setSelectionRow(--selRow);
288
else if (src == moveDownButton) {
292
if (parentNode.getChildAfter(selNode) != null) {
293
model.removeNodeFromParent(selNode);
294
model.insertNodeInto(selNode, parentNode, ++childIndex);
295
tree.setSelectionRow(++selRow);
300
@SuppressWarnings("unchecked")
301
private boolean containsTool(DefaultMutableTreeNode node, Integer mode) {
303
Object ob = node.getUserObject();
304
if (ob != null && mode.compareTo((Integer)ob) == 0) {
308
if (node.getChildCount() >= 0) {
309
for (Enumeration e=node.children(); e.hasMoreElements(); ) {
310
DefaultMutableTreeNode n = (DefaultMutableTreeNode)e.nextElement();
311
if (containsTool(n, mode))
319
* Inits the toolbar tree in this panel to show the given toolbar definition string.
321
* @param toolbarDefinition toolbar as string (sequence of numbers and delimiters)
323
public void setToolbar(DockPanel dockPanel, String toolbarDefinition) {
324
this.dockPanel = dockPanel;
326
// create new tree model
327
Vector<Object> toolVec = Toolbar.parseToolbarString(toolbarDefinition);
328
DefaultTreeModel model = new DefaultTreeModel(generateRootNode(toolVec));
329
tree.setModel(model);
331
tree.setRowHeight(-1);
333
Vector<Object> allTools = generateToolsVector(Toolbar.getAllTools(app));
334
Vector<Object> usedTools = generateToolsVector(toolbarDefinition);
336
toolListModel.clear();
337
toolListModel.addElement(Toolbar.SEPARATOR); // always display the separator in the tools list
339
for(Iterator<Object> iter = allTools.iterator(); iter.hasNext();) {
340
Object next = iter.next();
342
if(!usedTools.contains(next)) {
343
toolListModel.addElement(next);
348
public void apply() {
349
if(dockPanel != null) {
350
dockPanel.setToolbarString(getToolBarString());
352
app.getGuiManager().setToolBarDefinition(getToolBarString());
357
* Reset the current toolbar to its default state.
359
public void resetDefaultToolbar() {
360
if(dockPanel != null) {
361
setToolbar(dockPanel, dockPanel.getDefaultToolbarString());
363
setToolbar(null, app.getGuiManager().getDefaultToolbarString());
368
* Returns the custom toolbar created with this panel as a String.
369
* Separator ("||" between menus, "," in menu), New menu starts with "|"
370
* @return toolbar as string
372
public String getToolBarString() {
373
StringBuilder sb = new StringBuilder();
375
DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot();
376
for (int i=0; i < root.getChildCount(); i++) {
377
DefaultMutableTreeNode menu = (DefaultMutableTreeNode) root.getChildAt(i);
379
if (menu.getChildCount() == 0) { // new menu with separator
382
else if (i > 0 && !sb.toString().endsWith("|| ")) // new menu
385
for (int j=0; j < menu.getChildCount(); j++) {
386
DefaultMutableTreeNode node = (DefaultMutableTreeNode) menu.getChildAt(j);
387
int mode = ((Integer) node.getUserObject()).intValue();
389
if (mode < 0) // separator
391
else { // mode number
398
return sb.toString().trim();
401
public void collapseAllRows() {
402
int z = tree.getRowCount();
403
for (int i = z; i > 0; i--) {
409
* @param toolbarDefinition
410
* @return vector of menus (vectors of ints) and separators (ints)
413
@SuppressWarnings("unchecked")
414
public Vector<Object> generateToolsVector(String toolbarDefinition) {
415
Vector<Object> vector = new Vector<Object>();
417
vector.add(Toolbar.SEPARATOR);
419
// get default toolbar as nested vectors
420
Vector<Object> defTools = Toolbar.parseToolbarString(toolbarDefinition);
421
for (int i=0; i < defTools.size(); i++) {
422
Object element = defTools.get(i);
424
if (element instanceof Vector) {
425
Vector<Integer> menu = (Vector<Integer>) element;
426
for (int j=0; j < menu.size(); j++) {
427
Integer modeInt = menu.get(j);
428
int mode = modeInt.intValue();
433
Integer modeInt = (Integer) element;
434
int mode = modeInt.intValue();
444
private JTree generateTree() {
445
final JTree jTree = new JTree() {
446
protected void setExpandedState(TreePath path, boolean state) {
447
// Ignore all collapse requests of root
448
if (path != getPathForRow(0)) {
449
super.setExpandedState(path, state);
454
jTree.setCellRenderer(new ModeCellRenderer(app));
455
jTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
456
jTree.putClientProperty("JTree.lineStyle", "Angled");
457
jTree.addTreeExpansionListener(this);
462
* @param toolbarModes
463
* @return toolbar as DefaultMutableTreeNode
466
@SuppressWarnings("unchecked")
467
public DefaultMutableTreeNode generateRootNode(Vector toolbarModes) {
468
DefaultMutableTreeNode node = new DefaultMutableTreeNode();
470
for (int i = 0; i < toolbarModes.size(); i++) {
471
Object ob = toolbarModes.get(i);
472
if (ob instanceof Vector) {
473
Vector menu = (Vector) ob;
474
DefaultMutableTreeNode sub = new DefaultMutableTreeNode();
475
for (int j = 0; j < menu.size(); j++) {
476
sub.add(new DefaultMutableTreeNode(menu.get(j)));
481
node.add(new DefaultMutableTreeNode(ob));
487
* Add an item to the tool list
490
* TODO Use this method to insert new items into the model
491
* TODO Use the default toolbar vector to keep the standard sorting
493
* @author Florian Sonner
494
* @version 2008-10-22
496
private void sortToolList() {
497
/*int numItems = toolListModel.getSize();
502
// copy list data into an array
503
Integer[] a = new Integer[numItems];
504
for (int i = 0; i < numItems; ++i) {
505
a[i] = (Integer) toolListModel.getElementAt(i);
511
// copy the sorted array back into the model
512
for (int i = 0; i < numItems; ++i) {
513
toolListModel.setElementAt(a[i], i);
520
public void treeCollapsed(javax.swing.event.TreeExpansionEvent event) {}
524
public void treeExpanded(javax.swing.event.TreeExpansionEvent event) {
525
/*tabbed.invalidate();
526
tabbed.validateTree();*/
533
public void valueChanged(javax.swing.event.ListSelectionEvent e) {}
b'\\ No newline at end of file'