1 19 20 package org.netbeans.modules.xml.wsdl.ui.netbeans.module; 21 22 import java.awt.BorderLayout ; 23 import java.beans.PropertyChangeEvent ; 24 import java.beans.PropertyChangeListener ; 25 import java.beans.PropertyVetoException ; 26 import java.lang.reflect.Method ; 27 import java.util.ArrayList ; 28 import java.util.EventListener ; 29 import java.util.List ; 30 import javax.swing.JPanel ; 31 import org.netbeans.modules.xml.schema.model.SchemaComponent; 32 import org.netbeans.modules.xml.wsdl.model.Definitions; 33 import org.netbeans.modules.xml.wsdl.model.WSDLComponent; 34 import org.netbeans.modules.xml.wsdl.model.WSDLModel; 35 import org.netbeans.modules.xml.wsdl.ui.view.treeeditor.NodesFactory; 36 import org.netbeans.modules.xml.xam.ui.column.BasicColumnView; 37 import org.netbeans.modules.xml.xam.ui.column.Column; 38 import org.netbeans.modules.xml.xam.ui.column.ColumnView; 39 import org.netbeans.modules.xml.xam.ui.column.LinkPanel; 40 import org.openide.ErrorManager; 41 import org.openide.explorer.ExplorerManager; 42 import org.openide.nodes.Node; 43 import org.openide.util.Lookup; 44 45 56 public class WSDLColumnsView extends JPanel implements ColumnView, 57 PropertyChangeListener { 58 59 static final long serialVersionUID = 1L; 60 61 private transient BasicColumnView columnView; 62 63 private transient LinkPanel breadCrumbs; 64 private transient WSDLModel wsdlModel; 65 private transient Lookup lookup; 66 private Class <? extends EventListener > columnListenerClass; 67 private transient EventListener columnListener; 68 public static final String PROP_COLUMN_ADDED = "column_added"; 69 70 77 public WSDLColumnsView(WSDLModel model, Lookup lookup) { 78 super(new BorderLayout ()); 79 breadCrumbs = new LinkPanel(this); 80 add(breadCrumbs, BorderLayout.NORTH); 81 columnView = new BasicColumnView(); 82 add(columnView, BorderLayout.CENTER); 83 this.wsdlModel = model; 84 this.lookup = lookup; 85 clearColumns(); 86 Node rootNode = NodesFactory.getInstance().create(model.getDefinitions()); 87 WSDLColumn column = createColumnComponent(rootNode, true); 88 appendColumn(column); 89 } 90 91 97 protected WSDLColumn createColumnComponent(Node node, boolean showRoot) { 98 WSDLColumn panel = new WSDLColumn(this, node, showRoot); 99 addColumnListener(panel); 100 return panel; 101 } 102 103 108 public void addColumnListener(WSDLColumn column){ 109 if (!(columnListener == null && columnListenerClass == null)) { 110 try { 111 Method addListenerMethod = WSDLColumn.class.getMethod( 113 "add" + columnListenerClass.getSimpleName(), 114 columnListenerClass); addListenerMethod.invoke(column, columnListener); 116 } catch (Exception e) { 117 ErrorManager.getDefault().notify(ErrorManager.WARNING, e); 119 } 120 } 121 } 122 123 131 public <L extends EventListener > void setColumnListener( 132 Class <L> listenerClass, L listener) { 133 columnListenerClass = listenerClass; 134 columnListener = listener; 135 } 136 137 142 public EventListener getColumnListener() { 143 return columnListener; 144 } 145 146 public void propertyChange(PropertyChangeEvent event) { 147 Object src = event.getSource(); 148 if (event.getPropertyName().equals(Column.PROP_TITLE) && 149 src instanceof Column) { 150 breadCrumbs.updateLink((Column) src); 152 } 153 } 154 155 public void showComponent(WSDLComponent wc) { 156 Node rootNode = null; 157 Column currentColumn = getFirstColumn(); 158 ExplorerManager currentExplorer = null; 159 if (currentColumn instanceof ExplorerManager.Provider) { 160 currentExplorer = ((ExplorerManager.Provider)currentColumn). 161 getExplorerManager(); 162 } 163 if (currentExplorer != null) { 164 rootNode = currentExplorer.getRootContext(); 165 } else { 166 NodesFactory factory = NodesFactory.getInstance(); 167 Definitions defs = wsdlModel.getDefinitions(); 168 rootNode = factory.create(defs); 169 clearColumns(); 170 currentColumn = createColumnComponent(rootNode,false); 171 appendColumn(currentColumn); 172 currentExplorer = ExplorerManager.find(currentColumn.getComponent()); 173 } 174 List <Node> path = UIUtilities.findPathFromRoot(rootNode, wc); 175 if (path.isEmpty()) { 176 return; 177 } 178 int idx = 0; 180 Column tmpColumn = currentColumn; 181 ExplorerManager tmpExplorer = currentExplorer; 182 for (Node node:path) { 183 boolean found = false; 184 while (tmpExplorer != null && tmpExplorer.getRootContext() == node) { 185 found = true; 186 currentColumn = tmpColumn; 187 currentExplorer = tmpExplorer; 188 tmpColumn = getNextColumn(tmpColumn); 189 if (!(tmpColumn instanceof ExplorerManager.Provider)) { 190 break; 191 } 192 tmpExplorer = ((ExplorerManager.Provider)tmpColumn). 193 getExplorerManager(); 194 } 195 if (found) { 196 idx++; 197 } else { 198 removeColumnsAfter(currentColumn); 200 try { 201 currentExplorer.setSelectedNodes(new Node[]{}); 202 } catch (PropertyVetoException ex) { 203 } 204 break; 205 } 206 } 207 if (idx < path.size() - 1) { 209 List <Column> columns = new ArrayList <Column>(); 210 for (Node node : path.subList(idx, path.size() - 1)) { 211 currentColumn = createColumnComponent(node, true); 212 columns.add(currentColumn); 213 } 214 Column[] arr = columns.toArray(new Column[columns.size()]); 215 appendColumns(arr); 216 } 217 if (currentColumn instanceof ExplorerManager.Provider) { 219 currentExplorer = ((ExplorerManager.Provider)currentColumn). 220 getExplorerManager(); 221 } 222 try { 223 if (currentExplorer != null) { 224 if (path.size() <= 1) { 225 currentExplorer.setSelectedNodes( 226 new Node[] { }); 227 } else { 228 currentExplorer.setSelectedNodes( 229 new Node[] { path.get(path.size() - 1) }); 230 } 231 } 232 } catch (PropertyVetoException ex) { 233 } 234 } 235 236 public void showComponent(SchemaComponent sc) { 237 Node rootNode = null; 238 Column currentColumn = getFirstColumn(); 239 ExplorerManager currentExplorer = null; 240 if(currentColumn instanceof ExplorerManager.Provider) 241 currentExplorer = ((ExplorerManager.Provider)currentColumn). 242 getExplorerManager(); 243 if(currentExplorer!=null) { 244 rootNode = currentExplorer.getRootContext(); 245 } else { 246 NodesFactory factory = NodesFactory.getInstance(); 247 Definitions defs = wsdlModel.getDefinitions(); 248 rootNode = factory.create(defs); 249 clearColumns(); 250 currentColumn = createColumnComponent(rootNode,false); 251 appendColumn(currentColumn); 252 currentExplorer = ExplorerManager.find(currentColumn.getComponent()); 253 } 254 List <Node> path = UIUtilities.findPathFromRoot(rootNode, sc, wsdlModel); 255 if(path.isEmpty()) return; 256 int idx = 0; 258 Column tmpColumn = currentColumn; 259 ExplorerManager tmpExplorer = currentExplorer; 260 for(Node node:path.subList(0,path.size()-1)) { 261 boolean found = false; 262 while(tmpExplorer!=null&&tmpExplorer.getRootContext()==node) { 263 found = true; 264 currentColumn = tmpColumn; 265 currentExplorer = tmpExplorer; 266 tmpColumn = getNextColumn(tmpColumn); 267 if(!(tmpColumn instanceof ExplorerManager.Provider)) break; 268 tmpExplorer = ((ExplorerManager.Provider)tmpColumn). 269 getExplorerManager(); 270 } 271 if(found) idx++; 272 else { 274 removeColumnsAfter(currentColumn); 275 try { 276 currentExplorer.setSelectedNodes(new Node[]{}); 277 } catch (PropertyVetoException ex) { 278 } 279 break; 280 } 281 } 282 if (idx < path.size() - 1) { 284 List <Column> columns = new ArrayList <Column>(); 285 for (Node node : path.subList(idx, path.size() - 1)) { 286 currentColumn = createColumnComponent(node, true); 287 columns.add(currentColumn); 288 } 289 Column[] arr = columns.toArray(new Column[columns.size()]); 290 appendColumns(arr); 291 } 292 if(currentColumn instanceof ExplorerManager.Provider) 294 currentExplorer = ((ExplorerManager.Provider)currentColumn). 295 getExplorerManager(); 296 try { 297 if(currentExplorer!=null) 298 currentExplorer.setSelectedNodes( 299 new Node[]{path.get(path.size()-1)}); 300 } catch (PropertyVetoException ex) { 301 } 302 } 303 304 @Override 305 public void requestFocus() { 306 super.requestFocus(); 307 columnView.requestFocus(); 308 } 309 310 @Override 311 public boolean requestFocusInWindow() { 312 super.requestFocusInWindow(); 313 return columnView.requestFocusInWindow(); 314 } 315 316 320 public void appendColumn(Column column) { 321 column.addPropertyChangeListener(this); 322 columnView.appendColumn(column); 323 breadCrumbs.appendLink(column); 324 firePropertyChange(PROP_COLUMN_ADDED, null, column); 325 } 326 327 public void appendColumns(Column[] columns) { 328 for (Column column : columns) { 329 column.addPropertyChangeListener(this); 330 breadCrumbs.appendLink(column); 331 firePropertyChange(PROP_COLUMN_ADDED, null, column); 332 } 333 columnView.appendColumns(columns); 334 } 335 336 public void clearColumns() { 337 columnView.clearColumns(); 338 breadCrumbs.clearLinks(); 339 } 340 341 public int getColumnCount() { 342 return columnView.getColumnCount(); 343 } 344 345 public int getColumnIndex(Column column) { 346 return columnView.getColumnIndex(column); 347 } 348 349 public Column getFirstColumn() { 350 return columnView.getFirstColumn(); 351 } 352 353 public Column getNextColumn(Column column) { 354 return columnView.getNextColumn(column); 355 } 356 357 public void removeColumnsAfter(Column column) { 358 int index = columnView.getColumnIndex(column); 359 columnView.removeColumnsAfter(column); 360 breadCrumbs.truncateLinks(index + 1); 362 } 363 364 public void scrollToColumn(Column column, boolean synchronous) { 365 columnView.scrollToColumn(column, synchronous); 366 } 367 368 } 373 | Popular Tags |