public static synchronized JContextTree getContextTree() { if (tree == null) { final JContextTree tree = new JContextTree(); // search available popup menu items Lookup lk = Lookups.forPath("/Puzzle/ContextTree/Actions"); for (TreePopupItem item : lk.lookupAll(TreePopupItem.class)) { tree.controls().add(item); } final List<PropertyPane> configPanes = new ArrayList<PropertyPane>(); JPropertyTree propertyTree = new JPropertyTree(); DefaultMutableTreeNode root = new DefaultMutableTreeNode(); // search available property panels lk = Lookups.forPath("/Puzzle/ContextTree/PropertyPanels"); for (PropertyPane p : lk.lookupAll(PropertyPane.class)) { root.add(new DefaultMutableTreeNode(p)); } // search filter panels DefaultMutableTreeNode filterNodes = new DefaultMutableTreeNode(CoreResource.getString("filter")); lk = Lookups.forPath("/Puzzle/ContextTree/FilterPanels"); for (PropertyPane p : lk.lookupAll(PropertyPane.class)) { filterNodes.add(new DefaultMutableTreeNode(p)); } root.add(filterNodes); // search style panels DefaultMutableTreeNode styleNodes = new DefaultMutableTreeNode(CoreResource.getString("symbology")); lk = Lookups.forPath("/Puzzle/ContextTree/StylePanels"); for (PropertyPane p : lk.lookupAll(PropertyPane.class)) { styleNodes.add(new DefaultMutableTreeNode(p)); } root.add(styleNodes); if (!tree.controls().isEmpty()) { tree.controls().add(new SeparatorItem()); } LayerPropertyItem property = new LayerPropertyItem(root); tree.controls().add(property); tree.revalidate(); tree.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); ContextTreeTopComponent.tree = tree; } return tree; }