package org.nightlabs.jfire.personrelation.trade.ui.tucked;
import org.apache.log4j.Logger;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.nightlabs.jdo.ObjectID;
import org.nightlabs.jfire.base.ui.jdo.tree.lazy.JDOLazyTreeNodesChangedEvent;
import org.nightlabs.jfire.base.ui.jdo.tree.lazy.JDOLazyTreeNodesChangedEventHandler;
import org.nightlabs.jfire.personrelation.ui.tree.PersonRelationTree;
import org.nightlabs.jfire.personrelation.ui.tree.PersonRelationTreeController;
import org.nightlabs.jfire.personrelation.ui.tree.PersonRelationTreeLabelProvider;
import org.nightlabs.jfire.personrelation.ui.tree.PersonRelationTreeNode;
import org.nightlabs.jfire.personrelation.ui.tree.PersonRelationTreeUtil;
import org.nightlabs.progress.NullProgressMonitor;
import org.nightlabs.util.CollectionUtil;
/**
* The {@link PersonRelationTree} with compressed (or 'tucked') nodes.
* Properties in this tree:
* (i) simplified single column,
*
* See notes on "Search by Association".
*
* @author khaireel (at) nightlabs (dot) de
*/
public class TuckedPersonRelationTree extends PersonRelationTree<TuckedPersonRelationTreeNode> {
private static final Logger logger = Logger.getLogger(TuckedPersonRelationTree.class);
/**
* Creates a new instance of the TuckedPersonRelationTree.
*/
public TuckedPersonRelationTree(Composite parent, boolean isMenuWithDrillDownAdapter) {
// By default, (i) we shall NOT restore the tree's collapsed state, but (ii) use the convenient context-menu management framework offered in the super class.
super(parent, false, true, isMenuWithDrillDownAdapter);
// Operational-coordination: We need to ensure that expanded children of a collapsed node are properly 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.
getTree().addTreeListener(new TuckedNodeTreeListener()); // <-- A bit weird on Linux, sometimes it works, sometimes it doesnt.
}
@Override
protected PersonRelationTreeLabelProvider<TuckedPersonRelationTreeNode> createPersonRelationTreeLabelProvider(TreeViewer treeViewer) {
return new TuckedPersonRelationTreeLabelProvider(treeViewer, getDisplay());
}
// ----------------------------------------------------------------------------------- || -------------------------------------------->>
// [Section] Dynamic context-menus that allows for tucking and untucking.
// ----------------------------------------------------------------------------------- || -------------------------------------------->>
@Override
protected void fillContextMenu(IMenuManager manager) {
// We decide what menu-items to be display here, depending on the currently selected Node.
TuckedPersonRelationTreeNode selectedNode = PersonRelationTreeNode.getPersonRelationTreeNodeFromSelection(getSelection());
if (logger.isDebugEnabled())
logger.debug(":: selectedNode: " + (selectedNode == null ? "null" : selectedNode.toDebugString()));
// Fill the top part of the context-menu with TUCK/UNTUCK operations, but only when necessary.
if (selectedNode != null) {
if (selectedNode.getTuckedStatus().equals(TuckedNodeStatus.TUCKED))
manager.add(new NodeTuckUntuckAction("Untuck node " + PersonRelationTreeUtil.showObjectID(selectedNode.getPropertySetID()), TuckedNodeStatus.UNTUCKED));
else if (selectedNode.getTuckedStatus().equals(TuckedNodeStatus.UNTUCKED))
manager.add(new NodeTuckUntuckAction("Tuck node " + PersonRelationTreeUtil.showObjectID(selectedNode.getPropertySetID()), TuckedNodeStatus.TUCKED));
// Put a separator, to indicate a difference from the default items.
manager.add(new Separator());
}
// Then fill up the rest of the menu-items with whatever has been registered in the super class.
super.fillContextMenu(manager);
}
// Two main menu behaviours:
// [1] Untuck; [2] Tuck (duhh...)
protected class NodeTuckUntuckAction extends Action {
private TuckedNodeStatus tuckUntuckAction = null;
public NodeTuckUntuckAction(String menuText, TuckedNodeStatus tuckUntuckAction) {
setId(NodeTuckUntuckAction.class.getName());
setText(menuText);
this.tuckUntuckAction = tuckUntuckAction;
}
@Override
public void run() {
final TuckedPersonRelationTreeNode selectedNode = PersonRelationTreeNode.getPersonRelationTreeNodeFromSelection(getSelection());
if (selectedNode != null) {
selectedNode.setStatusToChangeTo(tuckUntuckAction); //TuckedNodeStatus.UNTUCKED);
// Job tuckUntuckJob = new Job("Processing tucked node...") {
// @Override
// protected IStatus run(ProgressMonitor monitor) throws Exception {
// ((TuckedPersonRelationTreeController) getPersonRelationTreeController()).fireTuckChangedEvent(
// new JDOLazyTreeNodesChangedEvent<ObjectID, TuckedPersonRelationTreeNode>(this, CollectionUtil.createHashSet(selectedNode)), monitor);
//
// monitor.done();
// return Status.OK_STATUS;
// }
// };
//
// tuckUntuckJob.setPriority(Job.SHORT);
// tuckUntuckJob.schedule();
((TuckedPersonRelationTreeController) getPersonRelationTreeController()).fireTuckChangedEvent(
new JDOLazyTreeNodesChangedEvent<ObjectID, TuckedPersonRelationTreeNode>(this, CollectionUtil.createHashSet(selectedNode)), new NullProgressMonitor()); // FIXME ... the bloody monitor!
}
}
}
// ----------------------------------------------------------------------------------- || -------------------------------------------->>
// [Section] Other related initialisers.
// ----------------------------------------------------------------------------------- || -------------------------------------------->>
@Override
protected PersonRelationTreeController<TuckedPersonRelationTreeNode> createPersonRelationTreeController() {
return new TuckedPersonRelationTreeController() {
@Override
protected void onJDOObjectsChanged(JDOLazyTreeNodesChangedEvent<ObjectID, TuckedPersonRelationTreeNode> changedEvent) {
super.onJDOObjectsChanged(changedEvent);
JDOLazyTreeNodesChangedEventHandler.handle(getTreeViewer(), changedEvent);
}
};
}
@Override
public void createTreeColumns(Tree tree) {
TableLayout tableLayout = new TableLayout();
@SuppressWarnings("unused")
TreeColumn column = new TreeColumn(tree, SWT.LEFT);
tableLayout.addColumnData(new ColumnWeightData(1));
tree.setLayout(tableLayout);
tree.setHeaderVisible(false);
}
}