DevFaqTrackGlobalSelection
I need to write some code that tracks the global selection. What should I do?
If you are writing an action, consider using one of the context sensitive action classes in the apis such as NodeAction or CookieAction.
For other types of code (or for actions sensitive to something that does not implement Node.Cookie in the active TopComponent's or Node's Lookup , consider using Utilities.actionsGlobalContext().
Utilities.actionsGlobalContext() returns a Lookup which proxies the Lookup of the active (focused) TopComponent's Lookup (which, if it is an explorer view, is proxying the Lookup(s) of whatever Node(s) are selected). You can do something like this:
Lookup.Template tpl = new Lookup.Template (SomeApiClass.class);
Lookup.Result res = Utilities.actionsGlobalContext().lookup (tpl);
res.addLookupListener (new LookupListener() {
public void resultChanged (LookupEvent evt) {
Collection c = ((Lookup.Result) evt.getSource()).allInstances();
//do something with the collection of 0 or more instances - the collection has changed
}
});
The nice thing about this approach is that, unless your code specifically cares about Nodes, you don't need to depend on the Nodes API.
The idea behind this is that every "logical window" in NetBeans has its own Lookup, whose contents represent the "selection" in that window (or whatever services it wants to expose). Utilities.actionsGlobalContext() is a single point of entry - you don't have to track which window currently has focus - it is a Lookup which proxies the Lookup of whatever window does have focus. When the focused window changes, the Lookup returned by Utilities.actionsGlobalContext() will fire the appropriate changes. So, for example, an Action can be written to be sensitive to a particular object type; it does not need any code that relates to tracking window focus or similar.
Please note: Generally, keep a hard reference on the Lookup.Result (or make a closure on it with some final keyword and a reference from the anonymous listener). Because if you don't -- the garbage collector might kick in quite soon and your listener won't be called. Source: Lookup.Result garbage collection trick

