source: trunk/gli/src/org/greenstone/gatherer/gems/MetadataSetTree.java@ 12732

Last change on this file since 12732 was 12732, checked in by kjdon, 18 years ago

MetadataSetTree now knows what its parent frame is, so the new element prompt can be modal

  • Property svn:keywords set to Author Date Id Revision
File size: 12.8 KB
Line 
1/**
2 *#########################################################################
3 *
4 * A component of the Gatherer application, part of the Greenstone digital
5 * library suite from the New Zealand Digital Library Project at the
6 * University of Waikato, New Zealand.
7 *
8 * <BR><BR>
9 *
10 * Author: Shaoqun Wu, Greenstone Digital Library, University of Waikato
11 *
12 * <BR><BR>
13 *
14 * Copyright (C) 2006 New Zealand Digital Library Project
15 *
16 * <BR><BR>
17 *
18 * This program is free software; you can redistribute it and/or modify
19 * it under the terms of the GNU General Public License as published by
20 * the Free Software Foundation; either version 2 of the License, or
21 * (at your option) any later version.
22 *
23 * <BR><BR>
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
29 *
30 * <BR><BR>
31 *
32 * You should have received a copy of the GNU General Public License
33 * along with this program; if not, write to the Free Software
34 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
35 *########################################################################
36 */
37package org.greenstone.gatherer.gems;
38
39import org.w3c.dom.Document;
40
41import java.awt.*;
42import java.awt.event.*;
43import javax.swing.*;
44import javax.swing.tree.*;
45
46import java.util.Observer;
47import java.util.Observable;
48import java.util.ArrayList;
49
50import org.greenstone.gatherer.Configuration;
51import org.greenstone.gatherer.Dictionary;
52
53/**
54 * @author Shaoqun Wu, Greenstone Digital Library, University of Waikato
55 * @version 2.4
56 */
57public class MetadataSetTree
58 extends JTree
59 implements Observer, ActionListener, MouseListener {
60
61 private MetadataSetTree self;
62 private MetadataSetModel metadata_model;
63 protected JFrame parent_frame;
64 public MetadataSetTree(JFrame parent){
65
66 setCellRenderer(new MetadataSetCellRenderer());
67 setRowHeight(20);
68 setEditable(false);
69 getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
70 setModel(null);
71 self = this;
72 parent_frame = parent;
73 addMouseListener(this);
74 }
75
76 public void mouseClicked(MouseEvent event) {
77 // right click
78 if (SwingUtilities.isRightMouseButton(event)) {
79 new MetadataSetTreeRightClickMenu(this, event);
80 } else {
81 TreePath tse = self.getSelectionPath();
82 if (tse!=null){
83 DefaultMutableTreeNode snode= (DefaultMutableTreeNode)tse.getLastPathComponent();
84
85 Object data = snode.getUserObject();
86
87 if (data instanceof MetadataElementModel){
88
89 ((MetadataElementModel)data).notifyListeners(false);
90 }
91 else{
92 if (data instanceof MetadataSetInfo){
93 ((MetadataSetInfo)data).notifyListeners();
94 }
95 }
96 }
97 }
98
99 }
100
101 public void mouseEntered(MouseEvent event) { }
102
103 public void mouseExited(MouseEvent event) { }
104
105 public void mousePressed(MouseEvent event) { }
106
107 public void mouseReleased(MouseEvent event) { }
108
109 public void update(Observable o,Object arg){
110 if (arg !=null){
111 Boolean replaceModel = (Boolean)arg;
112 if (!replaceModel.booleanValue()){
113 repaint();
114 expandAll();
115 }
116 }
117 metadata_model = (MetadataSetModel)o;
118
119 populateMetadataSetTree(metadata_model);
120
121 }
122
123 private void expandAll() {
124 int row = 0;
125 while (row < getRowCount()) {
126 expandRow(row);
127 row++;
128 }
129 }
130
131
132
133 public void actionPerformed(ActionEvent e){
134 String command = e.getActionCommand();
135
136 if (command.equals(GEMSConstants.ADD_ELEMENT)){
137 addElement();
138 return ;
139 }
140
141 if (command.equals(GEMSConstants.DELETE_ELEMENT)){
142 deleteElement();
143 }
144
145
146 if (command.equals(GEMSConstants.MOVE_UP)){
147 moveUpElement();
148 }
149
150 if (command.equals(GEMSConstants.MOVE_DOWN)){
151 moveDownElement();
152 }
153
154 }
155
156
157 public void addElement(){
158 TreePath tse = self.getSelectionPath();
159 if (tse == null) return;
160 NewMetadataElementNamePrompt name_prompt = new NewMetadataElementNamePrompt(parent_frame);
161 if (name_prompt.isCancelled()) {
162 return;
163 }
164 String new_name = name_prompt.getName();
165
166 DefaultTreeModel dtm = (DefaultTreeModel)getModel();
167 DefaultMutableTreeNode snode=(DefaultMutableTreeNode)tse.getLastPathComponent();
168 MetadataElementModel element_model = new MetadataElementModel(metadata_model.getMetadataSetInfo(), new_name);
169 DefaultMutableTreeNode new_node = new DefaultMutableTreeNode(element_model);
170 dtm.insertNodeInto(new_node,snode,snode.getChildCount());
171 //update model
172 Object data = snode.getUserObject();
173 if (data instanceof MetadataElementModel){
174 MetadataElementModel model = (MetadataElementModel) data;
175 model.addChild(element_model);
176 }
177 else{
178 if(data instanceof MetadataSetInfo){
179 metadata_model.addChild(element_model);
180
181 }
182 }
183
184 dtm.reload(snode);
185 expandPath(tse);
186 tse = tse.pathByAddingChild(new_node);
187 self.setSelectionPath(tse);
188 element_model.notifyListeners(false);
189 }
190
191
192
193 public void deleteElement(){
194
195 //int result = JOptionPane.showConfirmDialog(null, Dictionary.get("GEMS.Confirm_DeleteElement", "(Put name here)"), Dictionary.get("GEMS.Confirm_DeleteElement_Title"), JOptionPane.OK_CANCEL_OPTION);
196 //if (result != JOptionPane.OK_OPTION) return;
197
198 TreePath tse = self.getSelectionPath();
199
200 if (tse!=null){
201 DefaultTreeModel dtm = (DefaultTreeModel)getModel();
202 DefaultMutableTreeNode snode=(DefaultMutableTreeNode)tse.getLastPathComponent();
203 DefaultMutableTreeNode parent = (DefaultMutableTreeNode) snode.getParent();
204 snode.removeFromParent();
205
206 Object parent_data = parent.getUserObject();
207 Object data = snode.getUserObject();
208 MetadataElementModel selected_model = null;
209 if (parent_data instanceof MetadataElementModel){
210 MetadataElementModel parent_model = (MetadataElementModel) parent_data;
211 selected_model = (MetadataElementModel) data;
212 parent_model.removeChild(selected_model);
213 parent_model.notifyListeners(false);
214 }
215 else{
216 if(parent_data instanceof MetadataSetInfo){
217 selected_model = (MetadataElementModel) data;
218 metadata_model.removeChild(selected_model);
219 ((MetadataSetInfo)parent_data).notifyListeners();
220
221 }
222 }
223
224 dtm.reload(parent);
225 self.setSelectionPath(tse.getParentPath());
226 //selected_model.notifyListeners(true);// notify its listeners that it's been deleted
227 }
228
229 }
230
231 private void moveUpElement(){
232 TreePath tse = self.getSelectionPath();
233
234 if (tse!=null){
235 DefaultMutableTreeNode snode= (DefaultMutableTreeNode)tse.getLastPathComponent();
236 int row = getSelectionRows()[0];
237 boolean moved = false;
238
239 Object data = snode.getUserObject();
240
241 if (data instanceof MetadataElementModel){
242 MetadataElementModel element_model = (MetadataElementModel)data;
243 //top level element
244 if (element_model.getParent() == null){
245 moved = metadata_model.moveUp(element_model);
246
247 }
248 else{
249 MetadataElementModel parent = element_model.getParent();
250 moved = parent.moveUp(element_model);
251 }
252 if (moved){
253 DefaultTreeModel dtm = (DefaultTreeModel)getModel();
254 DefaultMutableTreeNode pnode= (DefaultMutableTreeNode) snode.getParent();
255 int index = pnode.getIndex(snode);
256 dtm.removeNodeFromParent(snode);
257 dtm.insertNodeInto(snode,pnode,--index);
258 dtm.reload(pnode);
259 setSelectionRow(--row);
260 }
261 }
262 }
263
264 }
265
266 private void moveDownElement(){
267 TreePath tse = self.getSelectionPath();
268
269 if (tse!=null){
270 boolean moved = false;
271 DefaultMutableTreeNode snode= (DefaultMutableTreeNode)tse.getLastPathComponent();
272 int row = getSelectionRows()[0];
273 Object data = snode.getUserObject();
274
275 if (data instanceof MetadataElementModel){
276 MetadataElementModel element_model = (MetadataElementModel)data;
277 //top level element
278 if (element_model.getParent() == null){
279 moved = metadata_model.moveDown(element_model);
280 }
281 else{
282 MetadataElementModel parent = element_model.getParent();
283 moved = parent.moveDown(element_model);
284 }
285 // move the node down the tree
286 if (moved){
287 DefaultTreeModel dtm = (DefaultTreeModel)getModel();
288 DefaultMutableTreeNode pnode= (DefaultMutableTreeNode) snode.getParent();
289 int index = pnode.getIndex(snode);
290 dtm.removeNodeFromParent(snode);
291 dtm.insertNodeInto(snode,pnode,++index);
292 dtm.reload(pnode);
293 setSelectionRow(++row);
294 }
295 }
296 }
297 }
298
299
300 private void populateMetadataSetTree(MetadataSetModel metadata_model){
301 setModel(null);
302 MetadataSetInfo info= metadata_model.getMetadataSetInfo();
303 if (info == null) {
304 repaint();
305
306 return;
307 }
308
309 ArrayList metadata_elements = metadata_model.getMetadataSetModel();
310
311 DefaultTreeModel dtm = new DefaultTreeModel(new DefaultMutableTreeNode(info));
312 DefaultMutableTreeNode root = (DefaultMutableTreeNode)dtm.getRoot();
313
314 for(int i=0;i <metadata_elements.size();i++){
315 MetadataElementModel element_model = (MetadataElementModel)metadata_elements.get(i);
316 DefaultMutableTreeNode element = new DefaultMutableTreeNode(element_model);
317 dtm.insertNodeInto(element,root,root.getChildCount());
318 ArrayList subelements = element_model.getChildElements();
319 for(int j=0;j <subelements.size();j++){
320 MetadataElementModel subelement_model = (MetadataElementModel)subelements.get(j);
321 DefaultMutableTreeNode subelement = new DefaultMutableTreeNode(subelement_model);
322 dtm.insertNodeInto(subelement,element,element.getChildCount());
323 }
324 }
325
326 dtm.reload(root);
327 setModel(dtm);
328
329 }
330
331 private class MetadataSetTreeRightClickMenu
332 extends JPopupMenu {
333
334 private MetadataSetTreeRightClickMenu(MetadataSetTree meta_set_tree,
335 MouseEvent event)
336 {
337
338 super();
339
340 // the right click position
341 boolean root_node = false;
342 boolean element_node = false;
343 TreePath root_path = meta_set_tree.getPathForRow(0);
344 TreePath right_click_path = meta_set_tree.getPathForLocation(event.getX(), event.getY());
345 if (right_click_path == null) {
346 right_click_path = root_path;
347 root_node = true;
348 } else if (right_click_path.equals(root_path)) {
349 root_node = true;
350 } else if (right_click_path.getParentPath().equals(root_path)) {
351 element_node = true;
352 } // else its a subelement
353
354 meta_set_tree.clearSelection();
355 meta_set_tree.setSelectionPath(right_click_path);
356
357 JMenuItem add_element = new JMenuItem();
358 if (root_node) {
359 add_element.setText(Dictionary.get("GEMS.Popup.AddElement"));
360 } else {
361 add_element.setText(Dictionary.get("GEMS.Popup.AddSubElement"));
362 }
363 add_element.addActionListener(meta_set_tree);
364 add_element.setActionCommand(GEMSConstants.ADD_ELEMENT);
365 add(add_element);
366 if (!root_node) {
367 // delete element also
368 JMenuItem delete_element = new JMenuItem();
369 if (element_node) {
370 delete_element.setText(Dictionary.get("GEMS.Popup.DeleteElement"));
371 } else {
372 delete_element.setText(Dictionary.get("GEMS.Popup.DeleteSubElement"));
373 }
374 delete_element.addActionListener(meta_set_tree);
375 delete_element.setActionCommand(GEMSConstants.DELETE_ELEMENT);
376 add(delete_element);
377 }
378
379 // Show the popup menu on screen
380 show(meta_set_tree, event.getX(), event.getY());
381 }
382
383 }
384}
385
386
387class MetadataSetCellRenderer extends JLabel implements TreeCellRenderer {
388
389 private Color SELECTED_COLOR = Color.lightGray;
390 private Color SELECTED_BORDER_COLOR = Color.gray;
391
392
393 public Component getTreeCellRendererComponent(JTree tree,
394 Object value,
395 boolean selected,
396 boolean expanded,
397 boolean leaf,
398 int row,
399 boolean hasFocus){
400
401 DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
402 Object userObject = node.getUserObject();
403
404 if (userObject instanceof MetadataElementModel){
405 MetadataElementModel model = (MetadataElementModel)userObject;
406 setText(model.getFullName());
407 }
408 else{
409 if (userObject instanceof MetadataSetInfo){
410 MetadataSetInfo info = (MetadataSetInfo)userObject;
411 setText(info.getMetadataSetName());
412 }
413 }
414
415 if (selected){
416 setBackground(SELECTED_COLOR);
417
418 }
419 else{
420 setBackground(tree.getBackground());
421 }
422 setForeground(tree.getForeground());
423 setOpaque(true);
424 return this;
425 }
426
427}
Note: See TracBrowser for help on using the repository browser.