package org.nightlabs.jfire.personrelation.trade.ui.tucked; import org.apache.log4j.Logger; import org.eclipse.swt.events.TreeEvent; import org.eclipse.swt.events.TreeListener; import org.eclipse.swt.widgets.TreeItem; /** * Operational-coordination: To ensure that expanded children of a collapsed node are restored, * when the collapsed node is re-expanded. This is not the same as 'restoring collapsed state' which has been addressed by the super class. * * @author khaireel */ public class TuckedNodeTreeListener implements TreeListener { private static final Logger logger = Logger.getLogger(TuckedNodeTreeListener.class); @Override public void treeExpanded(TreeEvent event) { if (logger.isDebugEnabled()) { logger.debug(" ----------->>> @treeExpanded: event.item.class = " + event.item.getClass().getSimpleName()); if (event.item instanceof TreeItem) { TreeItem treeItem = (TreeItem) event.item; Object itemData = treeItem.getData(); if (itemData instanceof TuckedPersonRelationTreeNode) { TuckedPersonRelationTreeNode tuckedNode = (TuckedPersonRelationTreeNode) itemData; tuckedNode.toggleNodeExpandedState(); treeItem.setExpanded(true); logger.debug(" :: event.item.getData() --> tuckedNode: " + tuckedNode.toDebugString()); // We should not have the problem of accessing the child nodes we need, since at this point of handling the // event, all the necessary children would have already been previously loaded. TreeItem[] childItems = treeItem.getItems(); logger.debug(" :: treeItem.childItems = " + (childItems == null ? "[null]" : childItems.length)); // Recursively check out those children with !isCollapsed, and expand those nodes. restoreChildNodesCollapsedStates(childItems); } } } } // The recrusive method, via depth-first-search, to restore any children's collapsed state. private void restoreChildNodesCollapsedStates(TreeItem[] childItems) { // Base case I: Les guardian. if (childItems == null) return; // Search depth-first. for (TreeItem treeItem : childItems) { Object itemData = treeItem.getData(); if (itemData instanceof TuckedPersonRelationTreeNode) { TuckedPersonRelationTreeNode tuckedNode = (TuckedPersonRelationTreeNode) itemData; if (logger.isDebugEnabled()) logger.debug("## ### #### @restoreChildNodesCollapsedStates: tuckedNode " + tuckedNode.toDebugString()); // Base case II: Expansion stops when isNodeCollapsed() is true. // Recursive case, continue expansion, and its children, if required. if (tuckedNode.isNodeExpanded()) { treeItem.setExpanded(true); if (logger.isDebugEnabled()) logger.debug("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~ EXPANDED!"); restoreChildNodesCollapsedStates(treeItem.getItems()); } else if (logger.isDebugEnabled()) logger.debug(" ************ WTF?? ***********"); } } } @Override public void treeCollapsed(TreeEvent event) { if (logger.isDebugEnabled()) { logger.debug(" <<<----------- @treeCollapsed: event.item.class = " + event.item.getClass().getSimpleName()); if (event.item instanceof TreeItem) { TreeItem treeItem = (TreeItem) event.item; Object itemData = treeItem.getData(); if (itemData instanceof TuckedPersonRelationTreeNode) { TuckedPersonRelationTreeNode tuckedNode = (TuckedPersonRelationTreeNode) itemData; tuckedNode.toggleNodeExpandedState(); logger.debug(" :: event.item.getData() --> tuckedNode: " + tuckedNode.toDebugString()); } } } } }