1 19 20 package org.netbeans.modules.xml.schema.ui.basic.navigator; 21 22 import java.awt.BorderLayout ; 23 import java.awt.Color ; 24 import java.awt.EventQueue ; 25 import java.beans.PropertyChangeEvent ; 26 import java.beans.PropertyChangeListener ; 27 import java.beans.PropertyVetoException ; 28 import java.io.IOException ; 29 import java.util.ArrayList ; 30 import java.util.Enumeration ; 31 import java.util.List ; 32 import javax.swing.JPanel ; 33 import javax.swing.JTree ; 34 import javax.swing.SwingConstants ; 35 import javax.swing.SwingUtilities ; 36 import javax.swing.UIManager ; 37 import org.netbeans.modules.xml.schema.model.SchemaComponent; 38 import org.netbeans.modules.xml.schema.model.SchemaModel; 39 import org.netbeans.modules.xml.schema.ui.basic.SchemaModelCookie; 40 import org.netbeans.modules.xml.schema.ui.basic.UIUtilities; 41 import org.netbeans.modules.xml.schema.ui.nodes.DefaultExpandedCookie; 42 import org.netbeans.modules.xml.schema.ui.nodes.SchemaNodeFactory; 43 import org.netbeans.modules.xml.schema.ui.nodes.ReadOnlyCookie; 44 import org.netbeans.modules.xml.schema.ui.nodes.categorized.CategorizedSchemaNodeFactory; 45 import org.netbeans.modules.xml.xam.Model.State; 46 import org.openide.explorer.ExplorerManager; 47 import org.openide.explorer.view.BeanTreeView; 48 import org.openide.explorer.view.TreeView; 49 import org.openide.loaders.DataObject; 50 import org.openide.nodes.Node; 51 import org.openide.util.Lookup; 52 import org.openide.util.NbBundle; 53 import org.openide.util.lookup.Lookups; 54 import org.openide.windows.TopComponent; 55 56 61 public class SchemaNavigatorContent extends JPanel 62 implements ExplorerManager.Provider, Runnable , PropertyChangeListener { 63 64 private static final long serialVersionUID = 1L; 65 66 private static Lookup lookup; 67 68 private ExplorerManager explorerManager; 69 70 private TreeView treeView; 71 72 private boolean treeInHierarchy; 73 74 private boolean listeningOnActivatedNodes = false; 75 private final javax.swing.JLabel notAvailableLabel = new javax.swing.JLabel ( 76 NbBundle.getMessage(SchemaNavigatorContent.class, "MSG_NotAvailable")); 78 static { 79 lookup = Lookups.singleton(new ReadOnlyCookie(true)); 81 } 82 83 86 public SchemaNavigatorContent() { 87 setLayout(new BorderLayout ()); 88 explorerManager = new ExplorerManager(); 89 treeView = new BeanTreeView(); 90 explorerManager.addPropertyChangeListener(this); 91 notAvailableLabel.setHorizontalAlignment(SwingConstants.CENTER); 93 notAvailableLabel.setEnabled(false); 94 Color usualWindowBkg = UIManager.getColor("window"); notAvailableLabel.setBackground(usualWindowBkg != null ? usualWindowBkg : Color.white); 96 notAvailableLabel.setOpaque(true); 98 } 99 100 103 protected void expandDefaultNodes() { 104 Node rootNode = getExplorerManager().getRootContext(); 105 int depth = 0; 108 do { 109 Node[] children = rootNode.getChildren().getNodes(); 110 if (children.length == 1) { 111 treeView.expandNode(children[0]); 113 rootNode = children[0]; 114 depth++; 115 } else { 116 for (Node child : children) { 119 DefaultExpandedCookie cookie = (DefaultExpandedCookie) 120 child.getCookie(DefaultExpandedCookie.class); 121 if (cookie != null && cookie.isDefaultExpanded()) { 122 treeView.expandNode(child); 123 } 124 } 125 rootNode = null; 126 } 127 } while (rootNode != null && depth < 5); 128 129 JTree tree = (JTree ) treeView.getViewport().getView(); 142 if (tree.getRowCount() > tree.getVisibleRowCount()) { 143 rootNode = getExplorerManager().getRootContext(); 144 Enumeration kids = rootNode.getChildren().nodes(); 145 while (kids.hasMoreElements()) { 146 Node kid = (Node) kids.nextElement(); 147 treeView.collapseNode(kid); 148 } 149 } 150 } 151 152 public ExplorerManager getExplorerManager() { 153 return explorerManager; 154 } 155 156 private SchemaModel getSchemaModel(DataObject dobj) { 157 try { 158 SchemaModelCookie modelCookie = (SchemaModelCookie) 159 dobj.getCookie(SchemaModelCookie.class); 160 assert modelCookie != null; 161 SchemaModel model = modelCookie.getModel(); 162 if(model != null) { 163 model.removePropertyChangeListener(this); 164 model.addPropertyChangeListener(this); 165 } 166 return model; 167 } catch (IOException ioe) { 168 } 170 171 return null; 172 } 173 174 175 180 public void navigate(DataObject dobj) { 181 SchemaModel model = getSchemaModel(dobj); 182 if (model == null || model.getState() != SchemaModel.State.VALID) { 183 showError(); 184 } else { 185 show(model); 186 } 187 } 188 189 public boolean requestFocusInWindow() { 190 return treeView.requestFocusInWindow(); 191 } 192 193 public void run() { 194 expandDefaultNodes(); 195 selectActivatedNodes(); 196 } 197 198 public void propertyChange(PropertyChangeEvent event) { 199 String property = event.getPropertyName(); 200 if(SchemaModel.STATE_PROPERTY.equals(property)) { 201 onModelStateChanged(event); 202 return; 203 } 204 TopComponent tc = (TopComponent) SwingUtilities. 205 getAncestorOfClass(TopComponent.class,this); 206 if (ExplorerManager.PROP_SELECTED_NODES.equals(property) && 207 tc == TopComponent.getRegistry().getActivated()) { 208 Node[] filteredNodes = (Node[])event.getNewValue(); 209 if (filteredNodes != null && filteredNodes.length >= 1) { 210 tc.setActivatedNodes(filteredNodes); 212 } 213 } else if(TopComponent.getRegistry().PROP_ACTIVATED_NODES.equals(property) && 214 tc != null && tc !=TopComponent.getRegistry().getActivated()) { 215 EventQueue.invokeLater(new Runnable () { 216 public void run() { 217 selectActivatedNodes(); 218 } 219 }); 220 } else if(TopComponent.getRegistry().PROP_ACTIVATED.equals(property) && 221 tc == TopComponent.getRegistry().getActivated()) { 222 tc.setActivatedNodes(getExplorerManager().getSelectedNodes()); 223 } 224 } 225 226 private void selectActivatedNodes() { 227 Node[] activated = TopComponent.getRegistry().getActivatedNodes(); 228 List <Node> selNodes = new ArrayList <Node>(); 229 for(Node n:activated) { 230 SchemaComponent sc = (SchemaComponent) n.getLookup(). 231 lookup(SchemaComponent.class); 232 if(sc!=null) { 233 List <Node> path = UIUtilities.findPathFromRoot( 234 getExplorerManager().getRootContext(),sc); 235 if(path!=null&&!path.isEmpty()) 236 selNodes.add(path.get(path.size()-1)); 237 } 238 } 239 try { 240 getExplorerManager().setSelectedNodes( 241 selNodes.toArray(new Node[0])); 242 } catch (PropertyVetoException ex) { 243 } 244 } 245 246 public void onModelStateChanged(PropertyChangeEvent evt) { 247 State newState = (State)evt.getNewValue(); 248 if(newState == SchemaModel.State.VALID) { 249 SchemaModel model = (SchemaModel)evt.getSource(); 250 show(model); 251 return; 252 } 253 254 showError(); 256 return; 257 } 258 259 private void showError() { 260 if (notAvailableLabel.isShowing()) { 261 return; 262 } 263 remove(treeView); 264 add(notAvailableLabel, BorderLayout.CENTER); 265 revalidate(); 266 repaint(); 267 } 268 269 private void show(SchemaModel model) { 270 remove(notAvailableLabel); 271 add(treeView, BorderLayout.CENTER); 272 SchemaNodeFactory factory = new CategorizedSchemaNodeFactory( 273 model, lookup); 274 Node node = factory.createRootNode(); 275 getExplorerManager().setRootContext(node); 276 EventQueue.invokeLater(this); 278 revalidate(); 279 repaint(); 280 } 281 } 282 | Popular Tags |