1 19 20 package org.netbeans.modules.xml.schema.ui.nodes.categorized; 21 22 import java.awt.Image ; 23 import java.awt.datatransfer.Transferable ; 24 import java.util.HashSet ; 25 import java.util.Iterator ; 26 import java.util.LinkedList ; 27 import java.util.List ; 28 import java.util.MissingResourceException ; 29 import java.util.Set ; 30 import javax.swing.Action ; 31 import org.netbeans.modules.xml.schema.model.SchemaComponent; 32 import org.netbeans.modules.xml.schema.model.SchemaComponentReference; 33 import org.netbeans.modules.xml.schema.model.SchemaModel; 34 import org.netbeans.modules.xml.schema.ui.nodes.DefaultExpandedCookie; 35 import org.netbeans.modules.xml.schema.ui.nodes.ReadOnlyCookie; 36 import org.netbeans.modules.xml.schema.ui.nodes.RefreshableChildren; 37 import org.netbeans.modules.xml.schema.ui.nodes.SchemaUIContext; 38 import org.netbeans.modules.xml.xam.Component; 39 import org.netbeans.modules.xml.xam.ComponentEvent; 40 import org.netbeans.modules.xml.xam.ComponentListener; 41 import org.netbeans.modules.xml.xam.ui.ComponentPasteType; 42 import org.netbeans.modules.xml.xam.ui.XAMUtils; 43 import org.netbeans.modules.xml.xam.ui.cookies.CountChildrenCookie; 44 import org.netbeans.modules.xml.xam.ui.highlight.Highlight; 45 import org.netbeans.modules.xml.xam.ui.highlight.Highlighted; 46 import org.netbeans.modules.xml.xam.ui.highlight.HighlightManager; 47 import org.openide.actions.NewAction; 48 import org.openide.actions.PasteAction; 49 import org.openide.filesystems.FileObject; 50 import org.openide.filesystems.Repository; 51 import org.openide.loaders.DataObject; 52 import org.openide.loaders.DataObjectNotFoundException; 53 import org.openide.nodes.AbstractNode; 54 import org.openide.nodes.Children; 55 import org.openide.nodes.Index; 56 import org.openide.nodes.Node; 57 import org.openide.util.HelpCtx; 58 import org.openide.util.Lookup; 59 import org.openide.util.NbBundle; 60 import org.openide.util.Utilities; 61 import org.openide.util.WeakListeners; 62 import org.openide.util.actions.SystemAction; 63 import org.openide.util.datatransfer.NewType; 64 import org.openide.util.datatransfer.PasteType; 65 import org.openide.util.lookup.AbstractLookup; 66 import org.openide.util.lookup.InstanceContent; 67 import org.openide.util.lookup.Lookups; 68 import org.openide.util.lookup.ProxyLookup; 69 70 74 public class CategoryNode extends AbstractNode 75 implements Node.Cookie, ComponentListener, Highlighted, 76 CountChildrenCookie { 77 78 82 public CategoryNode(SchemaUIContext context, 83 SchemaComponentReference<? extends SchemaComponent> parentReference, 84 Class <? extends SchemaComponent> childType, 85 RefreshableChildren children) 86 { 87 this(context,parentReference,childType,children,new InstanceContent()); 88 } 89 90 91 95 private CategoryNode(SchemaUIContext context, 96 SchemaComponentReference<? extends SchemaComponent> parentReference, 97 Class <? extends SchemaComponent> childType, 98 Children children, 99 InstanceContent contents) 100 { 101 super(children, createLookup(context, contents)); 102 this.context=context; 103 this.reference=parentReference; 104 this.childType=childType; 105 this.lookupContents=contents; 106 107 try { 109 FileObject fobj = (FileObject) reference.get().getModel(). 112 getModelSource().getLookup().lookup(FileObject.class); 113 if (fobj != null) { 114 contents.add(DataObject.find(fobj)); 115 } 116 } catch (DataObjectNotFoundException donfe) { 117 } 118 contents.add(this); 119 contents.add(context); 120 121 contents.add(new DefaultExpandedCookie(true)); 123 if (childType.equals(SchemaComponent.class) && 125 children instanceof Index) { 126 contents.add(children); 127 } 128 129 String name=childType.getName(); 131 try 133 { 134 name = NbBundle.getMessage(CategoryNode.class, 135 "LBL_CategoryNode_" + name); 136 } 137 catch (MissingResourceException e) 138 { 139 assert false: e; 140 } 141 142 setName(name); 143 setDisplayName(name); 144 145 SchemaModel model = parentReference.get().getModel(); 147 weakComponentListener = (ComponentListener) WeakListeners.create( 148 ComponentListener.class, this, model); 149 model.addComponentListener(weakComponentListener); 150 151 referenceSet = new HashSet <Component>(); 152 highlights = new LinkedList <Highlight>(); 153 HighlightManager hm = HighlightManager.getDefault(); 154 SchemaComponent comp = (SchemaComponent) reference.get(); 157 List <? extends SchemaComponent> subcomps = comp.getChildren(childType); 158 Iterator <? extends SchemaComponent> iter = subcomps.iterator(); 159 while (iter.hasNext()) { 160 referenceSet.add(iter.next()); 161 } 162 hm.addHighlighted(this); 163 } 164 165 171 private static Lookup createLookup(SchemaUIContext context, 172 InstanceContent contents) { 173 return new ProxyLookup(new Lookup[] { 178 Lookups.exclude(context.getLookup(), new Class [] { 179 Node.class, 180 DataObject.class, 181 }), 182 new AbstractLookup(contents), 183 }); 184 } 185 186 @Override 187 public boolean equals(Object o) { 188 if (o instanceof CategoryNode) { 190 CategoryNode cn = (CategoryNode) o; 191 String name = getName(); 192 String oname = cn.getName(); 193 if (name != null && oname != null) { 194 SchemaComponentReference scr = cn.getReference(); 195 return name.equals(oname) && scr.equals(reference); 196 } 197 } 198 return false; 199 } 200 201 205 public int hashCode() { 206 return getName().hashCode(); 208 } 209 210 public int getChildCount() { 211 return getReference().get().getChildren(getChildType()).size(); 212 } 213 214 218 public SchemaUIContext getContext() 219 { 220 return context; 221 } 222 223 224 228 public SchemaComponentReference<? extends SchemaComponent> getReference() 229 { 230 return reference; 231 } 232 233 234 238 public Class <? extends SchemaComponent> getChildType() 239 { 240 return childType; 241 } 242 243 244 249 protected InstanceContent getLookupContents() 250 { 251 return lookupContents; 252 } 253 254 255 259 public boolean isDefaultExpanded() 260 { 261 DefaultExpandedCookie cookie=(DefaultExpandedCookie) 262 getCookie(DefaultExpandedCookie.class); 263 if (cookie!=null) 264 return cookie.isDefaultExpanded(); 265 else 266 return false; 267 } 268 269 270 274 public void setDefaultExpanded(boolean value) 275 { 276 DefaultExpandedCookie cookie=(DefaultExpandedCookie) 277 getCookie(DefaultExpandedCookie.class); 278 if (cookie!=null) 279 cookie.setDefaultExpanded(value); 280 } 281 282 283 284 285 289 293 @Override 294 public HelpCtx getHelpCtx() 295 { 296 return new HelpCtx(getClass()); 297 } 298 299 300 304 @Override 305 public boolean canCut() 306 { 307 return false; 308 } 309 310 311 315 @Override 316 public boolean canCopy() 317 { 318 return false; 319 } 320 321 @SuppressWarnings ("unchecked") 322 protected void createPasteTypes(Transferable transferable, List list) { 323 if (isValid() && isEditable()) { 324 PasteType type = ComponentPasteType.getPasteType( 325 reference.get(), transferable, childType); 326 if (type != null) { 327 list.add(type); 328 } 329 } 330 } 331 332 @Override 333 public PasteType getDropType(Transferable transferable, int action, int index) { 334 if (isValid() && isEditable()) { 335 PasteType type = ComponentPasteType.getDropType( 336 reference.get(), transferable, childType, action, index); 337 if (type != null) { 338 return type; 339 } 340 } 341 return null; 342 } 343 344 348 @Override 349 public boolean canDestroy() 350 { 351 return false; 352 } 353 354 355 359 @Override 360 public boolean canRename() 361 { 362 return false; 363 } 364 365 366 370 @Override 371 public Action [] getActions(boolean b) 372 { 373 ReadOnlyCookie roc = (ReadOnlyCookie) getContext().getLookup().lookup( 374 ReadOnlyCookie.class); 375 if (roc != null && roc.isReadOnly()) { 376 return ACTIONS_READONLY; 377 } else { 378 return ACTIONS; 379 } 380 } 381 382 383 387 public NewType[] getNewTypes() 388 { 389 SchemaModel model = getReference().get().getModel(); 390 if(model!=null && isEditable()) 391 { 392 return new AdvancedNewTypesFactory().getNewTypes(getReference(), 393 getChildType()); 394 } 395 return new NewType[0]; 396 } 397 398 399 400 401 405 public boolean isValid() { 406 return getReference().get() != null && getReference().get().getModel() != null; 407 } 408 409 protected boolean isEditable() { 410 SchemaModel model = getReference().get().getModel(); 411 return model != null && model == getContext().getModel() && 412 XAMUtils.isWritable(model); 413 } 414 415 419 public void childrenAdded(ComponentEvent evt) { 420 if (! isValid()) return; 421 if (evt.getSource() == getReference().get()) { 422 ((RefreshableChildren) getChildren()).refreshChildren(); 423 } 424 } 425 426 427 431 public void childrenDeleted(ComponentEvent evt) { 432 if (! isValid()) return; 433 if (evt.getSource() == getReference().get()) { 434 ((RefreshableChildren) getChildren()).refreshChildren(); 435 } 436 } 437 438 439 443 public void valueChanged(ComponentEvent evt) { 444 if (! isValid()) return; 445 } 447 448 public Set <Component> getComponents() { 449 return referenceSet; 450 } 451 452 public void highlightAdded(Highlight hl) { 453 highlights.add(hl); 454 fireDisplayNameChange("TempName", getDisplayName()); 455 } 456 457 public void highlightRemoved(Highlight hl) { 458 highlights.remove(hl); 459 fireDisplayNameChange("TempName", getDisplayName()); 460 } 461 462 470 protected String applyHighlights(String name) { 471 int count = highlights.size(); 472 if (count > 0) { 473 String code = null; 475 Highlight hl = highlights.get(count - 1); 476 String type = hl.getType(); 477 if (type.equals(Highlight.SEARCH_RESULT) || 478 type.equals(Highlight.SEARCH_RESULT_PARENT)) { 479 code = "ffc73c"; 482 } 483 else if (type.equals(Highlight.FIND_USAGES_RESULT) || 484 type.equals(Highlight.FIND_USAGES_RESULT_PARENT)) { 485 code = "c7ff3c"; 489 } 490 491 name = "<strong><font color=\"#" + code + "\">" + name + 492 "</font></strong>"; 493 } 494 return name; 495 } 496 497 private Node getFolderNode() { 498 FileObject fo = 499 Repository.getDefault().getDefaultFileSystem().getRoot(); 500 Node n = null; 501 try { 502 DataObject dobj = DataObject.find(fo); 503 n = dobj.getNodeDelegate(); 504 } catch (DataObjectNotFoundException ex) { 505 } 508 509 return n; 510 } 511 512 @Override 513 public Image getIcon(int type) { 514 Node n = getFolderNode(); 515 Image i = super.getIcon(type); 516 if (n != null) { 517 i = n.getIcon(type); 518 } 519 return badgeImage(i); 520 } 521 522 @Override 523 public Image getOpenedIcon(int type) { 524 Node n = getFolderNode(); 525 Image i = super.getOpenedIcon(type); 526 if (n != null) { 527 i = n.getOpenedIcon(type); 528 } 529 return badgeImage(i); 530 } 531 532 private Image badgeImage(Image main) { 533 Image rv = main; 534 if (badge != null) { 535 Image badgeImage = Utilities.loadImage(badge); 536 rv = Utilities.mergeImages(main, badgeImage, 8, 8); 537 } 538 return rv; 539 } 540 541 public void setBadge(String badge) { 542 this.badge = badge; 543 } 544 545 public String getHtmlDisplayName() { 546 String name = getDisplayName(); 547 name = name.replace("<", "<").replace(">", ">"); 549 return applyHighlights(name); 550 } 551 552 556 private static final SystemAction[] ACTIONS= 557 new SystemAction[] 558 { 559 SystemAction.get(PasteAction.class), 560 null, 561 SystemAction.get(NewAction.class), 562 }; 563 564 private static final SystemAction[] ACTIONS_READONLY = 565 new SystemAction[] { 566 }; 567 568 572 private SchemaUIContext context; 573 private SchemaComponentReference<? extends SchemaComponent> reference; 574 private Set <Component> referenceSet; 575 576 private List <Highlight> highlights; 577 private Class <? extends SchemaComponent> childType; 578 private InstanceContent lookupContents; 579 private ComponentListener weakComponentListener; 580 private String badge; 581 582 } 583 | Popular Tags |