package org.nightlabs.jfire.personrelation.trade.ui.tucked.compact;
import java.util.List;
import org.nightlabs.jdo.ObjectID;
import org.nightlabs.jfire.person.Person;
import org.nightlabs.jfire.personrelation.PersonRelation;
import org.nightlabs.jfire.personrelation.trade.ui.tucked.TuckedNodeStatus;
import org.nightlabs.jfire.personrelation.ui.tree.AbstractPersonRelationTreeLabelProviderDelegate;
import org.nightlabs.jfire.prop.id.PropertySetID;
/**
* Handles the display of root {@link CompactedPersonRelationTreeNode}s.
*
* @author khaireel at nightlabs dot de
*/
public class CompactedPropertySetTreeLabelProviderDelegate extends AbstractPersonRelationTreeLabelProviderDelegate {
private CompactedPersonRelationTreeController cprtController = null;
/**
* Creates a new instance of the CompactedPropertySetTreeLabelProviderDelegate.
* It becomes imperative that we have access to the {@link CompactedPersonRelationTreeController} in order to get
* the information we want to display on the tree.
*/
public CompactedPropertySetTreeLabelProviderDelegate(CompactedPersonRelationTreeController cprtController) {
this.cprtController = cprtController;
}
@Override
public String getJDOObjectText(ObjectID jdoObjectID, Object jdoObject, int spanColIndex) {
if (jdoObject != null && spanColIndex == 0 && cprtController != null) {
// Go get the (root) node. There is a possibility that it contains several nodes in its internal tucked-path.
// Caution, the node is lazy.
List<CompactedPersonRelationTreeNode> treeNodeList = cprtController.getTreeNodeList(jdoObjectID);
CompactedPersonRelationTreeNode compactedTuckedNode = getCorrectNodeFromList(treeNodeList);
if (compactedTuckedNode == null)
return "Loading... we are still loading... tralalalalalalalalalaaaaallaaaaaa";
// At this point, the node we want is loaded.
// If this is a COLLECTIVE node, we need to check if its collective elements in the tucked-path are also loaded.
CompactedPersonRelationTreeNode[] tuckedPathNodes = compactedTuckedNode.getTuckedPathNodes();
String displayText = "";
if (tuckedPathNodes != null) {
// AHA! We have a COLLECTIVE node.
int pathLen = tuckedPathNodes.length;
for (int i=0; i<pathLen; i++) {
displayText += getDisplayTextForNode(tuckedPathNodes[i]);
if (compactedTuckedNode.tuckedPathNodeStatuses[i].equals(TuckedNodeStatus.TUCKED)) {
long diffVal = compactedTuckedNode.tuckedPathNodesActualChildCount[i] - compactedTuckedNode.tuckedPathNodesTuckedChildCount[i];
displayText += " (... + " + diffVal + ")";
}
if (i < pathLen-1)
displayText += " -> "; // displayText += " " + '\u2192' + " " + person.getDisplayName(); //" → " + person.getDisplayName();
}
}
else
displayText = getDisplayTextForNode(compactedTuckedNode);
return displayText;
}
return null;
}
/**
* @return the COLLECTIVE node if there are several nodes mapped to given {@link PropertySetID}.
*/
private CompactedPersonRelationTreeNode getCorrectNodeFromList(List<CompactedPersonRelationTreeNode> treeNodeList) {
if (treeNodeList == null || treeNodeList.isEmpty())
return null;
if (treeNodeList.size() == 1)
return treeNodeList.get(0);
for (CompactedPersonRelationTreeNode treeNode : treeNodeList)
if (treeNode.tuckedPathDosier != null)
return treeNode;
return null;
}
/**
* @return the String representation for display on this label provider, provided the node and object are not null.
*/
private String getDisplayTextForNode(CompactedPersonRelationTreeNode node) {
String displayText = ""; // node.getNodeStatus().equals(CompactedNodeStatus.COMPACTED) ? " (... + " + node.getCompactedChildCountDifference() + ")" : "";
Object jdoObject = node.getJdoObject();
if (jdoObject instanceof Person)
displayText = String.format("%s%s", ((Person) jdoObject).getDisplayName(), displayText);
else if (jdoObject instanceof PersonRelation)
displayText = String.format("%s%s", ((PersonRelation) jdoObject).getTo().getDisplayName(), displayText);
return displayText;
}
// ------------------------------------------------------------------------------------- ++ ------------------------------->>
// [Section] Information on when to activate this label-provider delegate.
// ------------------------------------------------------------------------------------- ++ ------------------------------->>
@Override
public Class<?> getJDOObjectClass() { return Person.class; }
@Override
public Class<? extends ObjectID> getJDOObjectIDClass() { return PropertySetID.class; }
@Override
public int[][] getJDOObjectColumnSpan(ObjectID jdoObjectID, Object jdoObject) { return null; }
}