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

Last change on this file since 18412 was 18412, checked in by kjdon, 15 years ago

more modifications for RTL GLI, thanks to Amin Hedjazi

  • Property svn:keywords set to Author Date Id Revision
File size: 13.1 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 this.setComponentOrientation(Dictionary.getOrientation());
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.