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

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

addElement now passes the model to the new name prompt, so that the new name can be checked against existing elements

  • Property svn:keywords set to Author Date Id Revision
File size: 13.0 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(false);
138 return ;
139 }
140 if (command.equals(GEMSConstants.ADD_SUBELEMENT)){
141 addElement(true);
142 return ;
143 }
144
145 if (command.equals(GEMSConstants.DELETE_ELEMENT)){
146 deleteElement();
147 }
148
149
150 if (command.equals(GEMSConstants.MOVE_UP)){
151 moveUpElement();
152 }
153
154 if (command.equals(GEMSConstants.MOVE_DOWN)){
155 moveDownElement();
156 }
157
158 }
159
160
161 public void addElement(boolean subelement){
162 TreePath tse = self.getSelectionPath();
163 if (tse == null) return;
164
165 DefaultTreeModel dtm = (DefaultTreeModel)getModel();
166 DefaultMutableTreeNode snode=(DefaultMutableTreeNode)tse.getLastPathComponent();
167 Object data = snode.getUserObject();
168 if (data instanceof MetadataSetInfo){
169 data = metadata_model;
170 }
171 NewMetadataElementNamePrompt name_prompt = new NewMetadataElementNamePrompt(parent_frame, subelement, data);
172 if (name_prompt.isCancelled()) {
173 return;
174 }
175 String new_name = name_prompt.getName();
176
177 MetadataElementModel element_model = new MetadataElementModel(metadata_model.getMetadataSetInfo(), new_name);
178 DefaultMutableTreeNode new_node = new DefaultMutableTreeNode(element_model);
179 dtm.insertNodeInto(new_node,snode,snode.getChildCount());
180 //update model
181 if (data instanceof MetadataElementModel){
182 ((MetadataElementModel) data).addChild(element_model);
183 }
184 else if(data instanceof MetadataSetModel){
185 ((MetadataSetModel)data).addChild(element_model);
186
187 }
188
189
190 dtm.reload(snode);
191 expandPath(tse);
192 tse = tse.pathByAddingChild(new_node);
193 self.setSelectionPath(tse);
194 element_model.notifyListeners(false);
195 }
196
197
198
199 public void deleteElement(){
200
201 //int result = JOptionPane.showConfirmDialog(null, Dictionary.get("GEMS.Confirm_DeleteElement", "(Put name here)"), Dictionary.get("GEMS.Confirm_DeleteElement_Title"), JOptionPane.OK_CANCEL_OPTION);
202 //if (result != JOptionPane.OK_OPTION) return;
203
204 TreePath tse = self.getSelectionPath();
205
206 if (tse!=null){
207 DefaultTreeModel dtm = (DefaultTreeModel)getModel();
208 DefaultMutableTreeNode snode=(DefaultMutableTreeNode)tse.getLastPathComponent();
209 DefaultMutableTreeNode parent = (DefaultMutableTreeNode) snode.getParent();
210 snode.removeFromParent();
211
212 Object parent_data = parent.getUserObject();
213 Object data = snode.getUserObject();
214 MetadataElementModel selected_model = null;
215 if (parent_data instanceof MetadataElementModel){
216 MetadataElementModel parent_model = (MetadataElementModel) parent_data;
217 selected_model = (MetadataElementModel) data;
218 parent_model.removeChild(selected_model);
219 parent_model.notifyListeners(false);
220 }
221 else{
222 if(parent_data instanceof MetadataSetInfo){
223 selected_model = (MetadataElementModel) data;
224 metadata_model.removeChild(selected_model);
225 ((MetadataSetInfo)parent_data).notifyListeners();
226
227 }
228 }
229
230 dtm.reload(parent);
231 self.setSelectionPath(tse.getParentPath());
232 //selected_model.notifyListeners(true);// notify its listeners that it's been deleted
233 }
234
235 }
236
237 private void moveUpElement(){
238 TreePath tse = self.getSelectionPath();
239
240 if (tse!=null){
241 DefaultMutableTreeNode snode= (DefaultMutableTreeNode)tse.getLastPathComponent();
242 int row = getSelectionRows()[0];
243 boolean moved = false;
244
245 Object data = snode.getUserObject();
246
247 if (data instanceof MetadataElementModel){
248 MetadataElementModel element_model = (MetadataElementModel)data;
249 //top level element
250 if (element_model.getParent() == null){
251 moved = metadata_model.moveUp(element_model);
252
253 }
254 else{
255 MetadataElementModel parent = element_model.getParent();
256 moved = parent.moveUp(element_model);
257 }
258 if (moved){
259 DefaultTreeModel dtm = (DefaultTreeModel)getModel();
260 DefaultMutableTreeNode pnode= (DefaultMutableTreeNode) snode.getParent();
261 int index = pnode.getIndex(snode);
262 dtm.removeNodeFromParent(snode);
263 dtm.insertNodeInto(snode,pnode,--index);
264 dtm.reload(pnode);
265 setSelectionRow(--row);
266 }
267 }
268 }
269
270 }
271
272 private void moveDownElement(){
273 TreePath tse = self.getSelectionPath();
274
275 if (tse!=null){
276 boolean moved = false;
277 DefaultMutableTreeNode snode= (DefaultMutableTreeNode)tse.getLastPathComponent();
278 int row = getSelectionRows()[0];
279 Object data = snode.getUserObject();
280
281 if (data instanceof MetadataElementModel){
282 MetadataElementModel element_model = (MetadataElementModel)data;
283 //top level element
284 if (element_model.getParent() == null){
285 moved = metadata_model.moveDown(element_model);
286 }
287 else{
288 MetadataElementModel parent = element_model.getParent();
289 moved = parent.moveDown(element_model);
290 }
291 // move the node down the tree
292 if (moved){
293 DefaultTreeModel dtm = (DefaultTreeModel)getModel();
294 DefaultMutableTreeNode pnode= (DefaultMutableTreeNode) snode.getParent();
295 int index = pnode.getIndex(snode);
296 dtm.removeNodeFromParent(snode);
297 dtm.insertNodeInto(snode,pnode,++index);
298 dtm.reload(pnode);
299 setSelectionRow(++row);
300 }
301 }
302 }
303 }
304
305
306 private void populateMetadataSetTree(MetadataSetModel metadata_model){
307 setModel(null);
308 MetadataSetInfo info= metadata_model.getMetadataSetInfo();
309 if (info == null) {
310 repaint();
311
312 return;
313 }
314
315 ArrayList metadata_elements = metadata_model.getMetadataSetModel();
316
317 DefaultTreeModel dtm = new DefaultTreeModel(new DefaultMutableTreeNode(info));
318 DefaultMutableTreeNode root = (DefaultMutableTreeNode)dtm.getRoot();
319
320 for(int i=0;i <metadata_elements.size();i++){
321 MetadataElementModel element_model = (MetadataElementModel)metadata_elements.get(i);
322 DefaultMutableTreeNode element = new DefaultMutableTreeNode(element_model);
323 dtm.insertNodeInto(element,root,root.getChildCount());
324 ArrayList subelements = element_model.getChildElements();
325 for(int j=0;j <subelements.size();j++){
326 MetadataElementModel subelement_model = (MetadataElementModel)subelements.get(j);
327 DefaultMutableTreeNode subelement = new DefaultMutableTreeNode(subelement_model);
328 dtm.insertNodeInto(subelement,element,element.getChildCount());
329 }
330 }
331
332 dtm.reload(root);
333 setModel(dtm);
334
335 }
336
337 private class MetadataSetTreeRightClickMenu
338 extends JPopupMenu {
339
340 private MetadataSetTreeRightClickMenu(MetadataSetTree meta_set_tree,
341 MouseEvent event)
342 {
343
344 super();
345
346 // the right click position
347 boolean root_node = false;
348 boolean element_node = false;
349 TreePath root_path = meta_set_tree.getPathForRow(0);
350 TreePath right_click_path = meta_set_tree.getPathForLocation(event.getX(), event.getY());
351 if (right_click_path == null) {
352 right_click_path = root_path;
353 root_node = true;
354 } else if (right_click_path.equals(root_path)) {
355 root_node = true;
356 } else if (right_click_path.getParentPath().equals(root_path)) {
357 element_node = true;
358 } // else its a subelement
359
360 meta_set_tree.clearSelection();
361 meta_set_tree.setSelectionPath(right_click_path);
362
363 JMenuItem add_element = new JMenuItem();
364 if (root_node) {
365 add_element.setText(Dictionary.get("GEMS.Popup.AddElement"));
366 add_element.setActionCommand(GEMSConstants.ADD_ELEMENT);
367 } else {
368 add_element.setText(Dictionary.get("GEMS.Popup.AddSubElement"));
369 add_element.setActionCommand(GEMSConstants.ADD_SUBELEMENT);
370
371 }
372 add_element.addActionListener(meta_set_tree);
373 add(add_element);
374 if (!root_node) {
375 // delete element also
376 JMenuItem delete_element = new JMenuItem();
377 if (element_node) {
378 delete_element.setText(Dictionary.get("GEMS.Popup.DeleteElement"));
379 } else {
380 delete_element.setText(Dictionary.get("GEMS.Popup.DeleteSubElement"));
381 }
382 delete_element.addActionListener(meta_set_tree);
383 delete_element.setActionCommand(GEMSConstants.DELETE_ELEMENT);
384 add(delete_element);
385 }
386
387 // Show the popup menu on screen
388 show(meta_set_tree, event.getX(), event.getY());
389 }
390
391 }
392}
393
394
395class MetadataSetCellRenderer extends JLabel implements TreeCellRenderer {
396
397 private Color SELECTED_COLOR = Color.lightGray;
398 private Color SELECTED_BORDER_COLOR = Color.gray;
399
400
401 public Component getTreeCellRendererComponent(JTree tree,
402 Object value,
403 boolean selected,
404 boolean expanded,
405 boolean leaf,
406 int row,
407 boolean hasFocus){
408
409 DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
410 Object userObject = node.getUserObject();
411
412 if (userObject instanceof MetadataElementModel){
413 MetadataElementModel model = (MetadataElementModel)userObject;
414 setText(model.getFullName());
415 }
416 else{
417 if (userObject instanceof MetadataSetInfo){
418 MetadataSetInfo info = (MetadataSetInfo)userObject;
419 setText(info.getMetadataSetName());
420 }
421 }
422
423 if (selected){
424 setBackground(SELECTED_COLOR);
425
426 }
427 else{
428 setBackground(tree.getBackground());
429 }
430 setForeground(tree.getForeground());
431 setOpaque(true);
432 return this;
433 }
434
435}
Note: See TracBrowser for help on using the repository browser.