/** *######################################################################### * * A component of the Gatherer application, part of the Greenstone digital * library suite from the New Zealand Digital Library Project at the * University of Waikato, New Zealand. * *

* * Author: Shaoqun Wu, Greenstone Digital Library, University of Waikato * *

* * Copyright (C) 2006 New Zealand Digital Library Project * *

* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * *

* * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * *

* * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *######################################################################## */ package org.greenstone.gatherer.gems; import org.w3c.dom.Document; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.tree.*; import java.util.Observer; import java.util.Observable; import java.util.ArrayList; import org.greenstone.gatherer.Configuration; import org.greenstone.gatherer.Dictionary; /** * @author Shaoqun Wu, Greenstone Digital Library, University of Waikato * @version 2.4 */ public class MetadataSetTree extends JTree implements Observer, ActionListener, MouseListener { private MetadataSetTree self; private MetadataSetModel metadata_model; protected JFrame parent_frame; public MetadataSetTree(JFrame parent){ this.setComponentOrientation(Dictionary.getOrientation()); setCellRenderer(new MetadataSetCellRenderer()); setRowHeight(20); setEditable(false); getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); setModel(null); self = this; parent_frame = parent; addMouseListener(this); } public void mouseClicked(MouseEvent event) { // right click if (SwingUtilities.isRightMouseButton(event)) { new MetadataSetTreeRightClickMenu(this, event); } else { TreePath tse = self.getSelectionPath(); if (tse!=null){ DefaultMutableTreeNode snode= (DefaultMutableTreeNode)tse.getLastPathComponent(); Object data = snode.getUserObject(); if (data instanceof MetadataElementModel){ ((MetadataElementModel)data).notifyListeners(false); } else{ if (data instanceof MetadataSetInfo){ ((MetadataSetInfo)data).notifyListeners(); } } } } } public void mouseEntered(MouseEvent event) { } public void mouseExited(MouseEvent event) { } public void mousePressed(MouseEvent event) { } public void mouseReleased(MouseEvent event) { } public void update(Observable o,Object arg){ if (arg !=null){ Boolean replaceModel = (Boolean)arg; if (!replaceModel.booleanValue()){ repaint(); expandAll(); } } metadata_model = (MetadataSetModel)o; populateMetadataSetTree(metadata_model); } private void expandAll() { int row = 0; while (row < getRowCount()) { expandRow(row); row++; } } public void actionPerformed(ActionEvent e){ String command = e.getActionCommand(); if (command.equals(GEMSConstants.ADD_ELEMENT)){ addElement(false); return ; } if (command.equals(GEMSConstants.ADD_SUBELEMENT)){ addElement(true); return ; } if (command.equals(GEMSConstants.DELETE_ELEMENT)){ deleteElement(); } if (command.equals(GEMSConstants.MOVE_UP)){ moveUpElement(); } if (command.equals(GEMSConstants.MOVE_DOWN)){ moveDownElement(); } } public void addElement(boolean subelement){ TreePath tse = self.getSelectionPath(); if (tse == null) return; DefaultTreeModel dtm = (DefaultTreeModel)getModel(); DefaultMutableTreeNode snode=(DefaultMutableTreeNode)tse.getLastPathComponent(); Object data = snode.getUserObject(); if (data instanceof MetadataSetInfo){ data = metadata_model; } NewMetadataElementNamePrompt name_prompt = new NewMetadataElementNamePrompt(parent_frame, subelement, data); if (name_prompt.isCancelled()) { return; } String new_name = name_prompt.getName(); MetadataElementModel element_model = new MetadataElementModel(metadata_model.getMetadataSetInfo(), new_name); DefaultMutableTreeNode new_node = new DefaultMutableTreeNode(element_model); dtm.insertNodeInto(new_node,snode,snode.getChildCount()); //update model if (data instanceof MetadataElementModel){ ((MetadataElementModel) data).addChild(element_model); } else if(data instanceof MetadataSetModel){ ((MetadataSetModel)data).addChild(element_model); } dtm.reload(snode); expandPath(tse); tse = tse.pathByAddingChild(new_node); self.setSelectionPath(tse); element_model.notifyListeners(false); } public void deleteElement(){ //int result = JOptionPane.showConfirmDialog(null, Dictionary.get("GEMS.Confirm_DeleteElement", "(Put name here)"), Dictionary.get("GEMS.Confirm_DeleteElement_Title"), JOptionPane.OK_CANCEL_OPTION); //if (result != JOptionPane.OK_OPTION) return; TreePath tse = self.getSelectionPath(); if (tse!=null){ DefaultTreeModel dtm = (DefaultTreeModel)getModel(); DefaultMutableTreeNode snode=(DefaultMutableTreeNode)tse.getLastPathComponent(); DefaultMutableTreeNode parent = (DefaultMutableTreeNode) snode.getParent(); snode.removeFromParent(); Object parent_data = parent.getUserObject(); Object data = snode.getUserObject(); MetadataElementModel selected_model = null; if (parent_data instanceof MetadataElementModel){ MetadataElementModel parent_model = (MetadataElementModel) parent_data; selected_model = (MetadataElementModel) data; parent_model.removeChild(selected_model); parent_model.notifyListeners(false); } else{ if(parent_data instanceof MetadataSetInfo){ selected_model = (MetadataElementModel) data; metadata_model.removeChild(selected_model); ((MetadataSetInfo)parent_data).notifyListeners(); } } dtm.reload(parent); self.setSelectionPath(tse.getParentPath()); //selected_model.notifyListeners(true);// notify its listeners that it's been deleted } } private void moveUpElement(){ TreePath tse = self.getSelectionPath(); if (tse!=null){ DefaultMutableTreeNode snode= (DefaultMutableTreeNode)tse.getLastPathComponent(); int row = getSelectionRows()[0]; boolean moved = false; Object data = snode.getUserObject(); if (data instanceof MetadataElementModel){ MetadataElementModel element_model = (MetadataElementModel)data; //top level element if (element_model.getParent() == null){ moved = metadata_model.moveUp(element_model); } else{ MetadataElementModel parent = element_model.getParent(); moved = parent.moveUp(element_model); } if (moved){ DefaultTreeModel dtm = (DefaultTreeModel)getModel(); DefaultMutableTreeNode pnode= (DefaultMutableTreeNode) snode.getParent(); int index = pnode.getIndex(snode); dtm.removeNodeFromParent(snode); dtm.insertNodeInto(snode,pnode,--index); dtm.reload(pnode); setSelectionRow(--row); } } } } private void moveDownElement(){ TreePath tse = self.getSelectionPath(); if (tse!=null){ boolean moved = false; DefaultMutableTreeNode snode= (DefaultMutableTreeNode)tse.getLastPathComponent(); int row = getSelectionRows()[0]; Object data = snode.getUserObject(); if (data instanceof MetadataElementModel){ MetadataElementModel element_model = (MetadataElementModel)data; //top level element if (element_model.getParent() == null){ moved = metadata_model.moveDown(element_model); } else{ MetadataElementModel parent = element_model.getParent(); moved = parent.moveDown(element_model); } // move the node down the tree if (moved){ DefaultTreeModel dtm = (DefaultTreeModel)getModel(); DefaultMutableTreeNode pnode= (DefaultMutableTreeNode) snode.getParent(); int index = pnode.getIndex(snode); dtm.removeNodeFromParent(snode); dtm.insertNodeInto(snode,pnode,++index); dtm.reload(pnode); setSelectionRow(++row); } } } } private void populateMetadataSetTree(MetadataSetModel metadata_model){ setModel(null); MetadataSetInfo info= metadata_model.getMetadataSetInfo(); if (info == null) { repaint(); return; } ArrayList metadata_elements = metadata_model.getMetadataSetModel(); DefaultTreeModel dtm = new DefaultTreeModel(new DefaultMutableTreeNode(info)); DefaultMutableTreeNode root = (DefaultMutableTreeNode)dtm.getRoot(); for(int i=0;i