1 19 20 package org.netbeans.modules.xml.schema.ui.basic; 21 22 import java.awt.BorderLayout ; 23 import java.awt.Component ; 24 import java.awt.EventQueue ; 25 import java.beans.PropertyChangeEvent ; 26 import java.beans.PropertyChangeListener ; 27 import java.beans.PropertyVetoException ; 28 import java.util.Enumeration ; 29 import java.util.List ; 30 import javax.swing.ActionMap ; 31 import javax.swing.JPanel ; 32 import javax.swing.JScrollPane ; 33 import javax.swing.JTree ; 34 import javax.swing.text.DefaultEditorKit ; 35 import javax.swing.tree.TreeSelectionModel ; 36 import org.openide.explorer.ExplorerManager; 37 import org.openide.explorer.ExplorerUtils; 38 import org.openide.explorer.view.BeanTreeView; 39 import org.openide.explorer.view.TreeView; 40 import org.openide.nodes.Node; 41 import org.openide.util.Lookup; 42 import org.openide.util.NbBundle; 43 import org.openide.windows.TopComponent; 44 import org.netbeans.modules.xml.schema.model.SchemaComponent; 45 import org.netbeans.modules.xml.schema.model.SchemaModel; 46 import org.netbeans.modules.xml.schema.ui.nodes.DefaultExpandedCookie; 47 import org.netbeans.modules.xml.schema.ui.nodes.SchemaNodeFactory; 48 import org.netbeans.modules.xml.schema.ui.nodes.StructuralSchemaNodeFactory; 49 import org.netbeans.modules.xml.schema.ui.nodes.categorized.CategorizedSchemaNodeFactory; 50 51 58 public class SchemaTreeView extends JPanel 59 implements ExplorerManager.Provider, Lookup.Provider, 60 PropertyChangeListener { 61 private static final long serialVersionUID = 1L; 62 private ExplorerManager explorerManager; 63 private Lookup lookup; 64 private TreeView treeView; 65 66 public static enum ViewType { 67 68 CATEGORIZED, 69 70 STRUCTURAL; 71 } 72 73 80 public SchemaTreeView(SchemaModel model, ViewType viewType, Lookup lookup) { 81 super(new BorderLayout ()); 82 treeView = new BeanTreeView(); 83 treeView.getAccessibleContext().setAccessibleName(NbBundle.getMessage(SchemaTreeCategory.class, 84 "LBL_SchemaCategory_Tree")); 85 treeView.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(SchemaTreeCategory.class, 86 "HINT_SchemaCategory_Tree")); 87 treeView.setRootVisible(true); 88 treeView.setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); 89 treeView.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 90 add(treeView, BorderLayout.CENTER); 91 92 SchemaNodeFactory factory; 93 switch (viewType) { 94 case CATEGORIZED: 95 factory = new CategorizedSchemaNodeFactory(model, lookup); 96 break; 97 case STRUCTURAL: 98 factory = new StructuralSchemaNodeFactory(model, lookup); 99 break; 100 default: 101 factory = null; 102 break; 103 } 104 Node rootNode = factory.createRootNode(); 105 explorerManager = new ExplorerManager(); 106 explorerManager.setRootContext(rootNode); 107 explorerManager.addPropertyChangeListener(this); 109 110 ActionMap map = getActionMap(); 112 map.put(DefaultEditorKit.copyAction, 113 ExplorerUtils.actionCopy(explorerManager)); 114 map.put(DefaultEditorKit.cutAction, 115 ExplorerUtils.actionCut(explorerManager)); 116 map.put(DefaultEditorKit.pasteAction, 117 ExplorerUtils.actionPaste(explorerManager)); 118 map.put("delete", ExplorerUtils.actionDelete(explorerManager, false)); 119 this.lookup = ExplorerUtils.createLookup(explorerManager, map); 122 127 EventQueue.invokeLater(new Runnable () { 129 public void run() { 130 expandDefaultNodes(); 131 } 132 }); 133 } 134 135 public ExplorerManager getExplorerManager() { 136 return explorerManager; 137 } 138 139 public Lookup getLookup() { 140 return lookup; 141 } 142 143 @Override 144 public void requestFocus() { 145 super.requestFocus(); 146 treeView.requestFocus(); 147 } 148 149 @Override 150 public boolean requestFocusInWindow() { 151 super.requestFocusInWindow(); 152 return treeView.requestFocusInWindow(); 153 } 154 155 158 private void expandDefaultNodes() { 159 Node rootNode = getExplorerManager().getRootContext(); 160 int depth = 0; 163 do { 164 Node[] children = rootNode.getChildren().getNodes(); 165 if (children.length == 1) { 166 treeView.expandNode(children[0]); 168 rootNode = children[0]; 169 depth++; 170 } else { 171 for (Node child : children) { 174 DefaultExpandedCookie cookie = (DefaultExpandedCookie) 175 child.getCookie(DefaultExpandedCookie.class); 176 if (cookie != null && cookie.isDefaultExpanded()) { 177 treeView.expandNode(child); 178 } 179 } 180 rootNode = null; 181 } 182 } while (rootNode != null && depth < 5); 183 184 JTree tree = (JTree ) treeView.getViewport().getView(); 197 if (tree.getRowCount() > tree.getVisibleRowCount()) { 198 rootNode = getExplorerManager().getRootContext(); 199 Enumeration kids = rootNode.getChildren().nodes(); 200 while (kids.hasMoreElements()) { 201 Node kid = (Node) kids.nextElement(); 202 treeView.collapseNode(kid); 203 } 204 } 205 } 206 207 212 private TopComponent findParentTopComponent() { 213 Component parent = getParent(); 214 while (parent != null) { 215 if (parent instanceof TopComponent) { 216 return (TopComponent) parent; 217 } else { 218 parent = parent.getParent(); 219 } 220 } 221 return null; 222 } 223 224 public void propertyChange(PropertyChangeEvent event) { 225 if (ExplorerManager.PROP_SELECTED_NODES.equals( 226 event.getPropertyName())) { 227 Node[] filteredNodes = (Node[]) event.getNewValue(); 228 if (filteredNodes != null && filteredNodes.length >= 1) { 229 TopComponent tc = findParentTopComponent(); 231 if (tc != null) { 232 tc.setActivatedNodes(filteredNodes); 233 } 234 } 235 } 236 } 237 238 public void showComponent(SchemaComponent sc) { 239 List <Node> path = UIUtilities.findPathFromRoot( 240 getExplorerManager().getRootContext(), sc); 241 if (path == null || path.isEmpty()) { 242 return; 243 } 244 Node node = path.get(path.size() - 1); 245 try { 255 getExplorerManager().setSelectedNodes(new Node[] { node }); 256 } catch (PropertyVetoException pve) { 257 } 258 } 259 } 260 | Popular Tags |