1 19 20 package org.netbeans.modules.xml.schema.core.multiview; 21 22 import java.beans.PropertyChangeEvent ; 23 import java.beans.PropertyChangeListener ; 24 import java.util.ArrayList ; 25 import org.openide.nodes.Node; 26 import org.openide.util.Lookup; 27 import org.openide.util.lookup.Lookups; 28 import org.openide.util.lookup.ProxyLookup; 29 30 54 public class SourceCookieProxyLookup extends ProxyLookup 55 implements PropertyChangeListener { 56 57 private Lookup[] lookups; 58 59 private Node delegate; 60 61 private boolean propertyChanging; 62 63 69 public SourceCookieProxyLookup(Lookup[] lookups, Node delegate) { 70 super(); 71 this.lookups = lookups; 72 this.delegate = delegate; 73 setLookups(new Lookup[] { 74 new ProxyLookup(lookups), 75 new NoNodeLookup(delegate.getLookup()), 76 Lookups.singleton(delegate), 77 }); 78 } 79 80 public synchronized void propertyChange(PropertyChangeEvent event) { 81 if (propertyChanging) 82 { 83 return; 86 } 87 propertyChanging = true; 88 try 89 { 90 Node[] oldNodes = (Node[]) event.getOldValue(); 91 Node[] newNodes = (Node[]) event.getNewValue(); 92 if(newNodes==null || newNodes.length==0) 93 { 94 setLookups(new Lookup[] { 95 new ProxyLookup(lookups), 96 new NoNodeLookup(delegate.getLookup()), 97 Lookups.singleton(delegate), 98 }); 99 } 100 else 101 { 102 Lookup[] newNodeLookups = new Lookup[newNodes.length]; 103 for (int i=0;i<newNodes.length;i++) 104 { 105 newNodeLookups[i]=new NoNodeLookup(newNodes[i].getLookup()); 106 } 107 setLookups(new Lookup[] { 108 new ProxyLookup(lookups), 109 new ProxyLookup(newNodeLookups), 110 Lookups.fixed(newNodes), 111 }); 112 } 113 } 114 finally 115 { 116 propertyChanging = false; 117 } 118 } 119 120 124 private static class NoNodeLookup extends Lookup { 125 private final Lookup delegate; 126 127 public NoNodeLookup(Lookup delegate) { 128 this.delegate = delegate; 129 } 130 131 public Object lookup(Class clazz) { 132 return (clazz == Node.class) ? null : delegate.lookup(clazz); 133 } 134 135 public Lookup.Result lookup(Lookup.Template template) { 136 if (template.getType() == Node.class) { 137 return Lookup.EMPTY.lookup(new Lookup.Template(Node.class)); 138 } else { 139 return delegate.lookup(template); 140 } 141 } 142 } 143 } 144 | Popular Tags |