Thank you Emilian, Marco and Geertjan. I'll read up on what you mentioned and try things out.
Working on an alternative, pure JavaFX WindowSystem[1], I was looking for a way to handle dynamically created "editor documents", but after a short break I realized it can be done without lookup, the "editor documents" part that is. Not trying to rewrite the WindowSystem, just having a good enough one will suffice. [1] https://github.com/trixon/WindowSystemFX Den sön 13 okt. 2019 kl 19:21 skrev Geertjan Wielenga <[email protected]>: > Or get hold of leanpub.com/nbp4beginners > > It hasn’t been updated for some time, but I’ve not yet seen anything in it > that needs updating. > > Gj > > On Sun, 13 Oct 2019 at 19:17, Marco Rossi <[email protected]> wrote: > >> Hello Patrick, >> >> you should create your own Lookup where to put what you want. I called >> this “MutableLookup” (I’ve found it on the web). You can use the put method >> to add the instances or your objects to lookup. >> >> You could keep an instance of MutableLookup inside a TopComponent and >> call TopComponent.associateLookup(myMutableLookup) to expose your objects >> in the Lookup subsystem (via Utilities.actionsGlobalContext.lookup(...)) >> and retrieve them when the TopComponent is the active one. >> >> Since the “mutable” nature of this Lookup, you can add and remove your >> objects at runtime. >> >> Here follow the code of MutableLookup class: >> >> public class MutableLookup extends AbstractLookup { >> private static final Logger LOGGER = >> Logger.getLogger(MutableLookup.class.getName()); >> private final Object lock = new Object(); >> private final InstanceContent content; >> >> static { >> LOGGER.setLevel(Level.SEVERE); >> } >> >> /** >> * Create a new DynamicLookup >> */ >> public MutableLookup() { >> this(new InstanceContent()); >> } >> >> /** >> * Create a new DynamicLookup with the specific content >> * @param content >> */ >> public MutableLookup(InstanceContent content) { >> super(content); >> this.content = content; >> } >> >> /** >> * Add a new object to this lookup. >> * >> * @param instance >> */ >> public void add(Object instance) { >> synchronized (lock) { >> content.add(instance); >> } >> } >> >> /** >> * Put the instance in this lookup. This method ensures that there is >> only >> * one instance of that type class. >> * If there are other instances of the that class they will be >> removed. >> * If instance parameter is null than all instances of that type will >> be >> * removed from the lookup. >> * >> * @param <T> >> * @param type >> * @param instance >> */ >> public <T> void put(Class<T> type, T instance) { >> synchronized (lock) { >> Collection<? extends T> all = lookupAll(type); >> if (instance == null) { >> remove(all); >> } else if (!all.contains(instance)) { >> remove(all); >> content.add(instance); >> LOGGER.log(Level.FINER, "added [{0}] to the lookup", >> instance); >> } else { >> List<T> instances = new LinkedList<T>(all); >> instances.remove(instance); >> remove(instances); >> } >> } >> } >> >> /** >> * Put collection in this lookup. >> * If there are other instances of the that class they will be >> replaced. >> * >> * @param <T> >> * @param type >> * @param items >> */ >> public <T> void putAll(Class<T> type, Collection<? extends T> items) { >> synchronized (lock) { >> Collection<? extends T> all = lookupAll(type); >> remove(all); >> for (T item : items) { >> content.add(item); >> } >> } >> } >> >> /** >> * Remove instance from the lookup. >> * >> * @param instance >> */ >> public void remove(Object instance) { >> synchronized (lock) { >> content.remove(instance); >> } >> } >> >> private <T> void remove(Collection<? extends T> items) { >> for (T item : items) { >> content.remove(item); >> LOGGER.log(Level.FINER, "removed [{0}] from the lookup.", >> item); >> } >> } >> } >> >> Marco Rossi >> >> > Il giorno 13 ott 2019, alle ore 18:13, Patrik Karlström < >> [email protected]> ha scritto: >> > >> > I feel somewhat stupid asking this one, but I just can't grip how to >> "publish" a "dynamically created" object so it will show up in lookupAll(). >> > >> > This is a really small library I'm working on and the only NetBeans >> dependency I have is org-openide-util-lookup, if that matters at all. >> > >> > The following declared class: >> > @ServiceProvider(service = Window.class) >> > public class Left1bWindow extends Window {} >> > >> > shows up as expected when I do: >> > var windows = new >> ArrayList<>(Lookup.getDefault().lookupAll(Window.class)); >> > >> > but a simple object creation will not. >> > Window someOtherWindow=new Window(); >> > >> > What can I do to get the desired result? >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [email protected] >> For additional commands, e-mail: [email protected] >> >> For further information about the NetBeans mailing lists, visit: >> https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists >> >>
