1 19 20 package org.netbeans.modules.xml.schema.ui.basic; 21 22 import java.awt.BorderLayout ; 23 import java.awt.Color ; 24 import java.awt.Dimension ; 25 import java.awt.EventQueue ; 26 import java.awt.event.FocusEvent ; 27 import java.awt.event.FocusListener ; 28 import java.beans.PropertyChangeEvent ; 29 import java.util.EventListener ; 30 import javax.swing.ActionMap ; 31 import javax.swing.JComponent ; 32 import javax.swing.JLabel ; 33 import javax.swing.JList ; 34 import javax.swing.JPanel ; 35 import javax.swing.JScrollPane ; 36 import javax.swing.ListSelectionModel ; 37 import javax.swing.SwingConstants ; 38 import javax.swing.SwingUtilities ; 39 import javax.swing.UIManager ; 40 import javax.swing.text.DefaultEditorKit ; 41 import org.netbeans.modules.xml.schema.ui.nodes.categorized.CategoryNode; 42 import org.netbeans.modules.xml.xam.ui.column.ColumnListCellRenderer; 43 import org.openide.explorer.ExplorerManager; 44 import org.openide.explorer.ExplorerUtils; 45 import org.openide.explorer.view.Visualizer; 46 import org.openide.nodes.Children; 47 import org.openide.nodes.Node; 48 import org.openide.nodes.NodeEvent; 49 import org.openide.nodes.NodeMemberEvent; 50 import org.openide.nodes.NodeReorderEvent; 51 import org.openide.util.Lookup; 52 import org.openide.windows.TopComponent; 53 import org.netbeans.modules.xml.schema.ui.nodes.SchemaComponentNode; 54 import org.netbeans.modules.xml.schema.ui.nodes.categorized.DummySchemaNode; 55 import org.netbeans.modules.xml.schema.ui.nodes.categorized.ReadOnlySchemaComponentNode; 56 import org.netbeans.modules.xml.schema.ui.nodes.schema.SchemaNode; 57 import org.netbeans.modules.xml.xam.ui.column.Column; 58 import org.netbeans.modules.xml.xam.ui.column.ColumnListView; 59 import org.netbeans.modules.xml.xam.ui.column.ColumnProvider; 60 import org.openide.explorer.view.ListView; 61 import org.openide.nodes.NodeListener; 62 import org.openide.util.NbBundle; 63 64 72 public class SchemaColumn extends JPanel 73 implements ExplorerManager.Provider, Lookup.Provider, 74 NodeListener, Column, FocusListener { 75 private static final long serialVersionUID = 1L; 76 private SchemaColumnsView columnView; 77 private ExplorerManager explorerManager; 78 private transient Lookup lookup; 79 private ListView nodeView; 80 private JLabel noChildrenLabel; 81 public static final String SCHEMA_COLUMN_NODE_SELECTED = "schema-column-node-selected"; 83 91 public SchemaColumn(SchemaColumnsView columnView, Node rootNode, 92 boolean showRoot) { 93 super(); 94 this.columnView = columnView; 95 explorerManager = new ExplorerManager(); 96 explorerManager.addPropertyChangeListener(this); 97 Color usualWindowBkg = UIManager.getColor("window"); setBackground(usualWindowBkg != null ? usualWindowBkg :Color.white); 99 setLayout(new BorderLayout ()); 100 setPreferredSize(new Dimension (200, 200)); 101 nodeView = new ColumnListView(explorerManager); 102 nodeView.getAccessibleContext().setAccessibleName(NbBundle.getMessage(SchemaColumn.class, 103 "LBL_SchemaCategory_Categorized")); 104 nodeView.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(SchemaColumn.class, 105 "HINT_SchemaCategory_Categorized")); 106 nodeView.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 107 nodeView.setTraversalAllowed(false); 110 nodeView.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 111 add(nodeView, BorderLayout.CENTER); 112 JList list = (JList ) nodeView.getViewport().getView(); 113 list.addFocusListener(this); 114 list.setCellRenderer(new ColumnListCellRenderer()); 115 if (rootNode != null) { 116 if (rootNode.getCookie(DummySchemaNode.class) == null && 117 rootNode.getCookie(SchemaNode.class) != null) { 118 rootNode = new DummySchemaNode(rootNode); 119 } 120 getExplorerManager().setRootContext(rootNode); 121 rootNode.addNodeListener(this); 122 noChildrenLabel = new JLabel (NbBundle.getMessage(SchemaColumn.class, 124 "LBL_NoChildren")); 125 noChildrenLabel.setBackground(getBackground()); 126 noChildrenLabel.setHorizontalTextPosition(SwingConstants.CENTER); 127 noChildrenLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 128 noChildrenLabel.setVisible(false); 129 noChildrenLabel.setEnabled(false); 130 if (rootNode.getCookie(CategoryNode.class) != null) { 131 noChildrenLabel.setText(NbBundle.getMessage(SchemaColumn.class, 132 "LBL_NoCateroryChildren",rootNode.getDisplayName())); 133 } 134 } 135 136 ActionMap map = getActionMap(); 138 map.put(DefaultEditorKit.copyAction, 139 ExplorerUtils.actionCopy(explorerManager)); 140 map.put(DefaultEditorKit.cutAction, 141 ExplorerUtils.actionCut(explorerManager)); 142 map.put(DefaultEditorKit.pasteAction, 143 ExplorerUtils.actionPaste(explorerManager)); 144 map.put("delete", ExplorerUtils.actionDelete(explorerManager, false)); 145 lookup = ExplorerUtils.createLookup(explorerManager, map); 146 } 151 152 public ExplorerManager getExplorerManager() { 153 return explorerManager; 154 } 155 156 public Lookup getLookup() { 157 return lookup; 158 } 159 160 @Override 161 public void requestFocus() { 162 super.requestFocus(); 163 nodeView.requestFocus(); 164 } 165 166 @Override 167 public boolean requestFocusInWindow() { 168 super.requestFocusInWindow(); 169 return nodeView.requestFocusInWindow(); 170 } 171 172 177 protected TopComponent findParentTopComponent() { 178 return (TopComponent)SwingUtilities.getAncestorOfClass(TopComponent.class,this); 179 } 180 181 public JComponent getComponent() { 182 return this; 183 } 184 185 public String getTitle() { 186 Node node = getExplorerManager().getRootContext(); 187 Column col = columnView.getFirstColumn(); 188 if (col == this && (node.getCookie(DummySchemaNode.class) != null || 189 node.getCookie(SchemaNode.class) != null)) { 190 return NbBundle.getMessage(SchemaColumn.class, 191 "LBL_SchemaNode_Title"); 192 } else { 193 return getDefaultDisplayName(node); 194 } 195 } 196 197 private String getDefaultDisplayName(Node n) { 198 String displayName = null; 199 ReadOnlySchemaComponentNode roNode = (ReadOnlySchemaComponentNode) 200 n.getLookup().lookup(ReadOnlySchemaComponentNode.class); 201 202 if (roNode != null) { 203 displayName = roNode.getDefaultDisplayName(); 204 } else { 205 SchemaComponentNode scn = (SchemaComponentNode) 206 n.getLookup().lookup(SchemaComponentNode.class); 207 if (scn != null) { 208 displayName = scn.getDefaultDisplayName(); 209 } else { 210 displayName = n.getDisplayName(); 211 } 212 } 213 214 return displayName; 215 } 216 217 public String getDescription() { 218 StringBuilder sb = new StringBuilder (); 219 Node node = getExplorerManager().getRootContext(); 220 sb.append(getDefaultDisplayName(node)); 221 node = node.getParentNode(); 222 while (node != null) { 223 sb.insert(0, '/'); 224 sb.insert(0, getDefaultDisplayName(node)); 225 node = node.getParentNode(); 226 } 227 return sb.toString(); 228 } 229 230 public void propertyChange(PropertyChangeEvent event) { 231 String pname = event.getPropertyName(); 232 Object src = event.getSource(); 233 if (ExplorerManager.PROP_SELECTED_NODES.equals(pname)) { 234 Node[] filteredNodes = (Node[])event.getNewValue(); 235 if (filteredNodes != null && filteredNodes.length >= 1) { 236 TopComponent tc = findParentTopComponent(); 238 if (tc != null) { 239 tc.setActivatedNodes(filteredNodes); 240 } 241 addDetailColumn(filteredNodes[0]); 242 EventListener listener = getColumnView().getColumnListener(); 243 if (listener != null) { 244 firePropertyChange(SchemaColumn.SCHEMA_COLUMN_NODE_SELECTED, 245 null, filteredNodes[0]); 246 } 247 } 248 } else if (Node.PROP_DISPLAY_NAME.equals(pname) && src instanceof Node) { 249 firePropertyChange(PROP_TITLE, null, null); 252 } 253 } 254 255 261 protected void addDetailColumn(final Node node) { 262 Column column = null; 263 ColumnProvider provider = (ColumnProvider) node.getLookup().lookup( 265 ColumnProvider.class); 266 final SchemaColumnsView view = getColumnView(); 267 if (provider != null) { 268 column = provider.getColumn(); 269 if (column instanceof SchemaColumn) { 270 SchemaColumn sc = (SchemaColumn) column; 271 if (sc.getColumnView() == null) { 272 sc.setColumnView(view); 273 } 274 } 275 } 276 if (column == null && (node != getExplorerManager().getRootContext()) && 279 node.getChildren() != Children.LEAF) { 280 column = getColumnView().createColumnComponent(node, false); 281 } 282 if (view.getColumnIndex(this) != -1) { 284 view.removeColumnsAfter(this); 285 } 286 if (column != null) { 287 view.appendColumn(column); 288 } 289 requestFocusInWindow(); 290 } 291 292 public void focusLost(FocusEvent e) { 293 } 294 295 public void focusGained(FocusEvent e) { 296 TopComponent tc = findParentTopComponent(); 297 if (tc != null) { 298 JList list = (JList ) nodeView.getViewport().getView(); 300 Object comp = list.getSelectedValue(); 301 if (comp != null) { 302 Node node = Visualizer.findNode(comp); 303 if (node != null) { 304 tc.setActivatedNodes(new Node[] { node }); 305 } 306 } 307 getColumnView().scrollToColumn(this,true); 308 } 309 } 310 311 @Override 312 public void addNotify() { 313 super.addNotify(); 314 getColumnView().addColumnListener(this); 315 Node rootNode = getExplorerManager().getRootContext(); 317 if (rootNode != null && rootNode.getChildren().getNodesCount() == 0) { 318 remove(nodeView); 319 noChildrenLabel.setVisible(true); 320 add(noChildrenLabel,BorderLayout.CENTER); 321 } 322 } 323 324 protected SchemaColumnsView getColumnView() { 325 return columnView; 326 } 327 328 protected void setColumnView(SchemaColumnsView columnView) { 329 this.columnView = columnView; 330 } 331 332 public void childrenAdded(NodeMemberEvent event) { 333 final Node node = event.getNode(); 335 EventQueue.invokeLater(new Runnable () { 337 public void run() { 338 if (noChildrenLabel.isVisible() && node != null && 339 node == getExplorerManager().getRootContext()) { 340 noChildrenLabel.setVisible(false); 341 remove(noChildrenLabel); 342 add(nodeView,BorderLayout.CENTER); 343 } 344 } 345 }); 346 } 347 348 public void childrenRemoved(NodeMemberEvent event) { 349 final Node node = event.getNode(); 351 EventQueue.invokeLater(new Runnable () { 353 public void run() { 354 if (!noChildrenLabel.isVisible() && node != null && 355 node == getExplorerManager().getRootContext() && 356 node.getChildren().getNodesCount() == 0) { 357 noChildrenLabel.setVisible(true); 358 remove(nodeView); 359 add(noChildrenLabel,BorderLayout.CENTER); 360 repaint(); 361 } 362 } 363 }); 364 } 365 366 public void childrenReordered(NodeReorderEvent event) { 367 } 368 369 public void nodeDestroyed(NodeEvent event) 370 { 371 final Node node = event.getNode(); 373 if(node!=null && node==getExplorerManager().getRootContext()) 374 { 375 final SchemaColumnsView view = getColumnView(); 376 int idx = view.getColumnIndex(this); 377 if(idx<=0) return; 378 Column c = view.getFirstColumn(); 379 for(int i=1;i<idx;i++) 380 { 381 c = view.getNextColumn(c); 382 } 383 final Column currentColumn = c; 384 EventQueue.invokeLater(new Runnable () 385 { 386 public void run() 387 { 388 view.removeColumnsAfter(currentColumn); 389 } 390 }); 391 } 392 } 393 } 394 | Popular Tags |