/** * <p> * The preparePaintComponent method has been overridden to ensure that expanded row renderers have been correctly * initialised. * </p> * <p> * Expanded row renderers are lazily instantiated and added to the shared structure as needed. This means for the * first use of a renderer, it will not have been part of the WComponent tree, and would not have had its * preparePaintComponent called. We therefore add the renderer to the tree here, and manually call its preparePaint. * </p> * * @param request the Request being responded to. */ @Override protected void preparePaintComponent(final Request request) { super.preparePaintComponent(request); Class<? extends WComponent> rowRendererClass = getRowRendererClass(); if (rowRendererClass != null && !expandedRenderers.containsKey(rowRendererClass)) { getExpandedTreeNodeRenderer(rowRendererClass).preparePaint(request); } }
/** * Update the expandable row renderer. * * @param rowRenderer the table row renderer * @param rowContext the row context * @param expandRenderer the renderer for the expandable row. */ private void updateBeanValueForRowRenderer(final WTableRowRenderer rowRenderer, final UIContext rowContext, final Class<? extends WComponent> expandRenderer) { Container expandWrapper = (Container) rowRenderer. getExpandedTreeNodeRenderer(expandRenderer); if (expandWrapper == null) { return; } // The actual component is wrapped in a renderer wrapper, so we have to fetch it from that WComponent expandInstance = expandWrapper.getChildAt(0); UIContextHolder.pushContext(rowContext); try { // Will apply updates to the "bean" returned by the model for this expanded renderer (ie // getValueAt(rowIndex, -1)) WebUtilities.updateBeanValue(expandInstance); } finally { UIContextHolder.popContext(); } }
UIContext nodeContext = repeater.getRowContext(child, child.getPosition()); WComponent expandedRenderer = renderer.getExpandedTreeNodeRenderer(dataModel. getRendererClass(child .getRowIndex()));