/** * <p> * This is called to lazily add expanded renderers as necessary. To save memory, only one instance of a renderer * class is ever added to the row renderer instance. The RendererWrapper ensures that data binding occurs at the * right time. * </p> * * @param rendererClass the renderer class. * @return the expanded renderer for the given row. */ public WComponent getExpandedTreeNodeRenderer(final Class<? extends WComponent> rendererClass) { if (rendererClass == null) { return null; } // If we already have an additional renderer for this class, return it. // This is synchronized, as it updates the shared model using locking/unlocking, which is a bit dodgy. synchronized (expandedRenderers) { WComponent renderer = expandedRenderers.get(rendererClass); if (renderer != null) { return renderer; } // Not found, create a new instance of the given class renderer = new RendererWrapper(this, rendererClass, -1); expandedRenderers.put(rendererClass, renderer); setLocked(false); add(renderer); setLocked(true); return renderer; } }