1 19 20 package org.netbeans.modules.xml.wsdl.ui.netbeans.module; 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.beans.PropertyChangeListener ; 30 import java.util.EventListener ; 31 import javax.swing.ActionMap ; 32 import javax.swing.JComponent ; 33 import javax.swing.JLabel ; 34 import javax.swing.JList ; 35 import javax.swing.JPanel ; 36 import javax.swing.JScrollPane ; 37 import javax.swing.ListSelectionModel ; 38 import javax.swing.SwingConstants ; 39 import javax.swing.SwingUtilities ; 40 import javax.swing.UIManager ; 41 import javax.swing.text.DefaultEditorKit ; 42 import org.netbeans.modules.xml.wsdl.ui.view.treeeditor.DefinitionsNode; 43 import org.netbeans.modules.xml.wsdl.ui.view.treeeditor.DummyDefinitionsNode; 44 import org.netbeans.modules.xml.wsdl.ui.view.treeeditor.FolderNode; 45 import org.openide.explorer.ExplorerManager; 46 import org.openide.explorer.ExplorerUtils; 47 import org.openide.explorer.view.Visualizer; 48 import org.openide.nodes.Node; 49 import org.openide.util.Lookup; 50 import org.openide.windows.TopComponent; 51 import org.netbeans.modules.xml.xam.ui.column.Column; 52 import org.netbeans.modules.xml.xam.ui.column.ColumnListCellRenderer; 53 import org.netbeans.modules.xml.xam.ui.column.ColumnListView; 54 import org.netbeans.modules.xml.xam.ui.column.ColumnProvider; 55 import org.openide.explorer.view.ListView; 56 import org.openide.nodes.Children; 57 import org.openide.nodes.NodeEvent; 58 import org.openide.nodes.NodeListener; 59 import org.openide.nodes.NodeMemberEvent; 60 import org.openide.nodes.NodeReorderEvent; 61 import org.openide.util.NbBundle; 62 63 71 public class WSDLColumn extends JPanel 72 implements ExplorerManager.Provider, Lookup.Provider, NodeListener, 73 PropertyChangeListener , Column, FocusListener { 74 private static final long serialVersionUID = 1L; 75 private WSDLColumnsView columnView; 76 private ExplorerManager explorerManager; 77 private transient Lookup lookup; 78 private ListView nodeView; 79 public static final String WSDL_COLUMN_NODE_SELECTED = "wsdl-column-node-selected"; private JLabel noChildrenLabel; 81 82 90 public WSDLColumn(WSDLColumnsView columnView, Node rootNode, 91 boolean showRoot) { 92 super(); 93 this.columnView = columnView; 94 explorerManager = new ExplorerManager(); 95 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.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 103 nodeView.setTraversalAllowed(false); 106 nodeView.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 107 add(nodeView, BorderLayout.CENTER); 108 JList list = (JList ) nodeView.getViewport().getView(); 109 list.addFocusListener(this); 110 list.setCellRenderer(new ColumnListCellRenderer()); 111 if (rootNode != null) { 112 if (rootNode.getCookie(DummyDefinitionsNode.class) == null && 113 rootNode.getCookie(DefinitionsNode.class) != null) { 114 rootNode = new DummyDefinitionsNode(rootNode); 115 } 116 getExplorerManager().setRootContext(rootNode); 117 rootNode.addNodeListener(this); 118 noChildrenLabel = new JLabel (NbBundle.getMessage(WSDLColumn.class, 120 "LBL_NoChildren")); 121 noChildrenLabel.setBackground(getBackground()); 122 noChildrenLabel.setHorizontalTextPosition(SwingConstants.CENTER); 123 noChildrenLabel.setHorizontalAlignment(SwingConstants.CENTER); 124 noChildrenLabel.setVisible(false); 125 noChildrenLabel.setEnabled(false); 126 if (rootNode.getCookie(FolderNode.class) != null) { 127 noChildrenLabel.setText(NbBundle.getMessage(WSDLColumn.class, 128 "LBL_NoCateroryChildren", rootNode.getDisplayName())); 129 } 130 } 131 132 ActionMap map = getActionMap(); 134 map.put(DefaultEditorKit.copyAction, 135 ExplorerUtils.actionCopy(explorerManager)); 136 map.put(DefaultEditorKit.cutAction, 137 ExplorerUtils.actionCut(explorerManager)); 138 map.put(DefaultEditorKit.pasteAction, 139 ExplorerUtils.actionPaste(explorerManager)); 140 map.put("delete", ExplorerUtils.actionDelete(explorerManager, false)); 141 lookup = ExplorerUtils.createLookup(explorerManager, map); 142 } 147 148 public ExplorerManager getExplorerManager() { 149 return explorerManager; 150 } 151 152 public Lookup getLookup() { 153 return lookup; 154 } 155 156 @Override 157 public void requestFocus() { 158 super.requestFocus(); 159 nodeView.requestFocus(); 160 } 161 162 @Override 163 public boolean requestFocusInWindow() { 164 super.requestFocusInWindow(); 165 return nodeView.requestFocusInWindow(); 166 } 167 168 173 protected TopComponent findParentTopComponent() { 174 return (TopComponent) SwingUtilities.getAncestorOfClass( 175 TopComponent.class, this); 176 } 177 178 public JComponent getComponent() { 179 return this; 180 } 181 182 public String getTitle() { 183 Node node = getExplorerManager().getRootContext(); 184 Column col = columnView.getFirstColumn(); 185 if (col == this && (node.getCookie(DummyDefinitionsNode.class) != null || 186 node.getCookie(DefinitionsNode.class) != null)) { 187 return NbBundle.getMessage(WSDLColumn.class, 188 "LBL_DefinitionsNode_Title"); 189 } else { 190 return node.getDisplayName(); 191 } 192 } 193 194 public String getDescription() { 195 StringBuilder sb = new StringBuilder (); 196 Node node = getExplorerManager().getRootContext(); 197 sb.append(node.getDisplayName()); 198 node = node.getParentNode(); 199 while (node != null) { 200 sb.insert(0, '/'); 201 sb.insert(0, node.getDisplayName()); 202 node = node.getParentNode(); 203 } 204 return sb.toString(); 205 } 206 207 public void propertyChange(PropertyChangeEvent event) { 208 String pname = event.getPropertyName(); 209 Object src = event.getSource(); 210 if (ExplorerManager.PROP_SELECTED_NODES.equals(pname)) { 211 Node[] filteredNodes = (Node[])event.getNewValue(); 212 if (filteredNodes != null && filteredNodes.length >= 1) { 213 TopComponent tc = findParentTopComponent(); 215 if (tc != null) { 216 tc.setActivatedNodes(filteredNodes); 217 } 218 addDetailColumn(filteredNodes[0]); 219 EventListener listener = getColumnView().getColumnListener(); 220 if (listener != null) { 221 firePropertyChange(WSDLColumn.WSDL_COLUMN_NODE_SELECTED, 222 null, filteredNodes[0]); 223 } 224 } 225 } else if (Node.PROP_DISPLAY_NAME.equals(pname) && src instanceof Node) { 226 firePropertyChange(PROP_TITLE, null, null); 229 } 230 } 231 232 238 protected void addDetailColumn(final Node node) { 239 EventQueue.invokeLater(new Runnable () { 240 public void run() { 241 Column column = null; 242 ColumnProvider provider = (ColumnProvider) node.getLookup().lookup( 244 ColumnProvider.class); 245 WSDLColumnsView view = getColumnView(); 246 if (provider != null) { 247 column = provider.getColumn(); 248 if (column instanceof WSDLColumn) { 249 WSDLColumn sc = (WSDLColumn) column; 250 if (sc.getColumnView() == null) { 251 sc.setColumnView(view); 252 } 253 } 254 } 255 if (column == null && node != getExplorerManager().getRootContext() && 257 node.getChildren() != Children.LEAF) { 258 column = view.createColumnComponent(node, false); 259 } 260 if (view.getColumnIndex(WSDLColumn.this) != -1) { 262 view.removeColumnsAfter(WSDLColumn.this); 263 } 264 if (column != null) { 265 view.appendColumn(column); 266 } 267 requestFocusInWindow(); 268 } 269 }); 270 } 271 272 public void focusLost(FocusEvent e) { 273 } 274 275 public void focusGained(FocusEvent e) { 276 TopComponent tc = findParentTopComponent(); 277 if (tc != null) { 278 JList list = (JList ) nodeView.getViewport().getView(); 280 Object comp = list.getSelectedValue(); 281 if (comp != null) { 282 Node node = Visualizer.findNode(comp); 283 if (node != null) { 284 tc.setActivatedNodes(new Node[] { node }); 285 } 286 } 287 } 288 } 289 290 @Override 291 public void addNotify() { 292 super.addNotify(); 293 getColumnView().addColumnListener(this); 294 Node rootNode = getExplorerManager().getRootContext(); 296 if (rootNode != null && rootNode.getChildren().getNodesCount() == 0) { 297 remove(nodeView); 298 noChildrenLabel.setVisible(true); 299 add(noChildrenLabel,BorderLayout.CENTER); 300 } 301 } 302 303 public void childrenAdded(NodeMemberEvent event) { 304 Node node = event.getNode(); 306 if (node != null && node == getExplorerManager().getRootContext() && 307 noChildrenLabel.isVisible()) { 308 noChildrenLabel.setVisible(false); 309 remove(noChildrenLabel); 310 add(nodeView, BorderLayout.CENTER); 311 } 312 } 313 314 public void childrenRemoved(NodeMemberEvent event) { 315 final Node node = event.getNode(); 317 if (node != null && node == getExplorerManager().getRootContext() && 318 !noChildrenLabel.isVisible()) { 319 EventQueue.invokeLater(new Runnable () { 320 public void run() { 321 if (node.getChildren().getNodesCount() == 0) { 322 noChildrenLabel.setVisible(true); 323 remove(nodeView); 324 add(noChildrenLabel, BorderLayout.CENTER); 325 } 326 } 327 }); 328 } 329 } 330 331 public void childrenReordered(NodeReorderEvent event) { 332 } 333 334 public void nodeDestroyed(NodeEvent event) { 335 Node node = event.getNode(); 337 if (node != null && node == getExplorerManager().getRootContext()) { 338 final WSDLColumnsView view = getColumnView(); 339 int idx = view.getColumnIndex(this); 340 if (idx <= 0) { 341 return; 342 } 343 Column c = view.getFirstColumn(); 344 for (int ii = 1; ii < idx; ii++) { 345 c = view.getNextColumn(c); 346 } 347 final Column currentColumn = c; 348 EventQueue.invokeLater(new Runnable () { 349 public void run() { 350 view.removeColumnsAfter(currentColumn); 351 } 352 }); 353 } 354 } 355 356 protected WSDLColumnsView getColumnView() { 357 return columnView; 358 } 359 360 protected void setColumnView(WSDLColumnsView columnView) { 361 this.columnView = columnView; 362 } 363 } 364 | Popular Tags |