public Component getToolbarPresenter() { final JButton button = DropDownButtonFactory.createDropDownButton(/*replaced anyway*/new ImageIcon(new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB)), null); Actions.connect(button, this); final PropertyChangeListener[] weakPCL = {null}; PropertyChangeListener pcl = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { String prop = evt != null ? evt.getPropertyName() : null; if (prop == null || prop.equals(OpenProjectList.PROPERTY_MAIN_PROJECT) || prop.equals(ProjectConfigurationProvider.PROP_CONFIGURATIONS)) { Mutex.EVENT.readAccess(new Runnable() { public void run() { JPopupMenu menu = null; final Project p = OpenProjectList.getDefault().getMainProject(); if (p != null) { ActionProvider ap = p.getLookup().lookup(ActionProvider.class); if (ap != null) { if (Arrays.asList(ap.getSupportedActions()).contains(command)) { final ProjectConfigurationProvider pcp = p.getLookup().lookup(ProjectConfigurationProvider.class); if (pcp != null) { pcp.removePropertyChangeListener(weakPCL[0]); pcp.addPropertyChangeListener(weakPCL[0]); if (pcp.configurationsAffectAction(command) && pcp.getConfigurations().size() > 1) { menu = new JPopupMenu(); for (final ProjectConfiguration config : pcp.getConfigurations()) { JMenuItem item = new JMenuItem(config.getDisplayName()); menu.add(item); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { p.getLookup().lookup(ActionProvider.class).invokeAction(command, Lookups.singleton(config)); } }); } } } } } } button.putClientProperty(DropDownButtonFactory.PROP_DROP_DOWN_MENU, menu); } }); } } }; button.putClientProperty("listener", pcl); // avoid premature GC weakPCL[0] = WeakListeners.propertyChange(pcl, null); OpenProjectList.getDefault().addPropertyChangeListener(weakPCL[0]); pcl.propertyChange(null); return button; }