View Javadoc

1   /*
2    * @(#)$Id: ExplorerTreeController.java 740 2009-08-14 21:40:55Z kurmannu $
3    *
4    * Author   : Ueli Kurmann, igesture@uelikurmann.ch
5    *                                   
6    *                                   
7    * Purpose  : 
8    *
9    * -----------------------------------------------------------------------
10   *
11   * Revision Information:
12   *
13   * Date       Who     Reason
14   *
15   * 23.03.2008 ukurmann  Initial Release
16   *
17   * -----------------------------------------------------------------------
18   *
19   * Copyright 1999-2009 ETH Zurich. All Rights Reserved.
20   *
21   * This software is the proprietary information of ETH Zurich.
22   * Use is subject to license terms.
23   * 
24   */
25  
26  package org.ximtec.igesture.tool.explorer;
27  
28  import java.beans.PropertyChangeEvent;
29  import java.util.Map;
30  import java.util.logging.Logger;
31  
32  import javax.swing.Icon;
33  import javax.swing.JComponent;
34  import javax.swing.SwingUtilities;
35  import javax.swing.ToolTipManager;
36  import javax.swing.event.TreeSelectionEvent;
37  import javax.swing.event.TreeSelectionListener;
38  import javax.swing.tree.TreeCellRenderer;
39  import javax.swing.tree.TreePath;
40  
41  import org.ximtec.igesture.tool.core.Controller;
42  import org.ximtec.igesture.tool.core.DefaultController;
43  import org.ximtec.igesture.tool.core.TabbedView;
44  import org.ximtec.igesture.tool.explorer.core.ExplorerTreeContainer;
45  import org.ximtec.igesture.tool.explorer.core.ExplorerTreeView;
46  import org.ximtec.igesture.tool.explorer.core.NodeInfo;
47  
48  /**
49   * Controller Component of the Explorer Tree.
50   * 
51   * @author UeliKurmann
52   * @version 1.0
53   * @since igesture
54   */
55  public class ExplorerTreeController extends DefaultController implements TreeSelectionListener {
56  
57    private static final Logger LOG = Logger.getLogger(ExplorerTreeController.class.getName());
58  
59    /**
60     * The Container where the tree and views are shown. A container has to
61     * implement the ExplorerTreeContainer interface.
62     */
63    private ExplorerTreeContainer container;
64  
65    /**
66     * The Model of the Explorer Tree
67     */
68    private ExplorerTreeModel model;
69  
70    /**
71     * A Map of NodeInfo. Node Info contains information about a specific node.
72     */
73    private Map<Class<?>, NodeInfo> nodeInfos;
74  
75    /**
76     * The Explorer Tree instance.
77     */
78    private ExplorerTree tree;
79  
80    private ExplorerTreeView selectedExplorerTreeView;
81  
82    /**
83     * Constructor
84     * 
85     * @param parentController
86     * @param container
87     * @param model
88     * @param renderer
89     */
90    public ExplorerTreeController(Controller parentController, ExplorerTreeContainer container, ExplorerTreeModel model,
91        TreeCellRenderer renderer) {
92      super(parentController);
93      this.container = container;
94      this.model = model;
95      this.nodeInfos = model.getNodeInfos();
96  
97      tree = new ExplorerTree(this.model, renderer);
98      ToolTipManager.sharedInstance().registerComponent(tree);
99  
100     tree.addTreeSelectionListener(this);
101     tree.addMouseListener(new ExplorerPopupDispatcher(nodeInfos));
102 
103     container.setTree(tree);
104     selectedExplorerTreeView = nodeInfos.get(model.getRoot().getClass()).getView(this, model.getRoot());
105     container.setView(selectedExplorerTreeView);
106 
107   }
108 
109   /**
110    * 
111    * @param container
112    *          the container where the components are visualized.
113    * @param model
114    *          the Explorer Tree model.
115    * @param nodeInfos
116    *          a map of NodeInfos
117    */
118   public ExplorerTreeController(Controller parentController, ExplorerTreeContainer container, ExplorerTreeModel model) {
119     this(parentController, container, model, new NodeRenderer(model.getNodeInfos()));
120   }
121 
122   /*
123    * (non-Javadoc)
124    * 
125    * @see
126    * javax.swing.event.TreeSelectionListener#valueChanged(javax.swing.event.
127    * TreeSelectionEvent)
128    */
129   @Override
130   public void valueChanged(TreeSelectionEvent e) {
131     final Object node = e.getPath().getLastPathComponent();
132     if (nodeInfos.get(node.getClass()) != null) {
133       SwingUtilities.invokeLater(new Runnable() {
134 
135         @Override
136         public void run() {
137           selectedExplorerTreeView = nodeInfos.get(node.getClass()).getView(ExplorerTreeController.this, node);
138           container.setView(selectedExplorerTreeView);
139         }
140       });
141     }
142   }
143 
144   /*
145    * (non-Javadoc)
146    * 
147    * @see org.ximtec.igesture.tool.core.Controller#getView()
148    */
149   @Override
150   public TabbedView getView() {
151     return new TabbedView() {
152 
153       @Override
154       public Icon getIcon() {
155         return null;
156       }
157 
158       @Override
159       public String getTabName() {
160         return tree.getName();
161       }
162 
163       @Override
164       public JComponent getPane() {
165         return tree;
166       }
167 
168     };
169   }
170 
171   public void selectNode(Object obj) {
172     TreePath path = new TreePath(obj);
173     tree.setSelectionPath(path);
174     tree.setExpandsSelectedPaths(true);
175   }
176 
177   /**
178    * Returns the currently active explorer tree view. (the view of the selected
179    * node)
180    * 
181    * @return
182    */
183   public ExplorerTreeView getExplorerTreeView() {
184     return selectedExplorerTreeView;
185   }
186   
187   public ExplorerTree getExplorerTree(){
188     return tree;
189   }
190 
191   /*
192    * (non-Javadoc)
193    * 
194    * @see
195    * java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent
196    * )
197    */
198   @Override
199   public void propertyChange(PropertyChangeEvent evt) {
200 
201     LOG.info("Update Tree");
202 
203     // node was inserted, select the new, inserted node
204     if (evt.getOldValue() == null && evt.getNewValue() != null) {
205       TreePath[] paths = tree.getSelectionPaths();
206       if (paths != null) {
207         for (TreePath treePath : paths) {
208 
209           if (treePath.getLastPathComponent() == evt.getSource()
210               && !nodeInfos.get(treePath.getLastPathComponent().getClass()).isLeaf(treePath.getLastPathComponent())) {
211             tree.setSelectionPath(treePath.pathByAddingChild(evt.getNewValue()));
212           }
213         }
214       }
215     }
216 
217     // node was deleted, select the parent node of the deleted node
218     else if (evt.getOldValue() != null && evt.getNewValue() == null) {
219       TreePath[] paths = tree.getSelectionPaths();
220       if (paths != null) {
221         for (TreePath treePath : paths) {
222 
223           if (treePath.getParentPath() != null && treePath.getParentPath().getLastPathComponent() == evt.getSource()) {
224             tree.setSelectionPath(treePath.getParentPath());
225           }
226         }
227       }
228     }
229 
230     tree.updateUI();
231   }
232 
233 }