package org.nightlabs.jfire.personrelation.trade.ui.tucked; import java.util.List; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.graphics.Image; import org.nightlabs.base.ui.resource.SharedImages; import org.nightlabs.jdo.ObjectID; import org.nightlabs.jfire.person.Person; import org.nightlabs.jfire.person.PersonStruct; import org.nightlabs.jfire.personrelation.PersonRelation; import org.nightlabs.jfire.personrelation.PersonRelationType; import org.nightlabs.jfire.personrelation.id.PersonRelationID; import org.nightlabs.jfire.personrelation.trade.ui.Activator; import org.nightlabs.jfire.personrelation.ui.tree.AbstractPersonRelationTreeLabelProviderDelegate; import org.nightlabs.jfire.personrelation.ui.tree.IPersonRelationTreeLabelProviderDelegate; import org.nightlabs.jfire.personrelation.ui.tree.PersonRelationTree; import org.nightlabs.jfire.personrelation.ui.tree.PersonRelationTreeController; import org.nightlabs.jfire.prop.DataField; import org.nightlabs.jfire.prop.datafield.SelectionDataField; import org.nightlabs.jfire.prop.datafield.TextDataField; import org.nightlabs.jfire.prop.id.StructFieldID; /** * The default extended PersonRelationTreeLabelProviderDelegate that should be plugged into the {@link PersonRelationTree}'s collection * {@link IPersonRelationTreeLabelProviderDelegate}, which specifically handles the {@link LabelProvider}s for displaying JFire's * known default {@link PersonRelationType}s. * * @author khaireel (at) nightlabs (dot) de */ public class TuckedPersonRelationTreeLabelProviderDelegate extends AbstractPersonRelationTreeLabelProviderDelegate { private PersonRelationTreeController<TuckedPersonRelationTreeNode> personRelationTreeController; /** * Creates a new instance of the TuckedPersonRelationTreeLabelProviderDelegate with a specific reference * to the PersonRelationTreeController. */ public TuckedPersonRelationTreeLabelProviderDelegate(PersonRelationTreeController<TuckedPersonRelationTreeNode> personRelationTreeController) { this.personRelationTreeController = personRelationTreeController; } @Override public Class<?> getJDOObjectClass() { return PersonRelation.class; } @Override public Class<? extends ObjectID> getJDOObjectIDClass() { return PersonRelationID.class; } @Override public int[][] getJDOObjectColumnSpan(ObjectID jdoObjectID, Object jdoObject) { return null; } @Override public String getJDOObjectText(ObjectID jdoObjectID, Object jdoObject, int spanColIndex) { if (jdoObject != null && spanColIndex == 0) { // 1. Display the usual content of the node represented by the given jdoObjectID. // 2. Also display the "tucked" information of this node, whenever the information becomes available. // From 1. String defaultText = getDefaultJDOObjectText((PersonRelation) jdoObject); // From 2. // Cautiously work to access the data of the LAZY tree. // See notes on progress-steps. // Lazy-progress: Step 1. List<TuckedPersonRelationTreeNode> treeNodeList = personRelationTreeController.getTreeNodeList(jdoObjectID); if (treeNodeList == null || treeNodeList.isEmpty()) return defaultText; // Lazy progress: Step 2. TuckedPersonRelationTreeNode tuckedNode = treeNodeList.get(0); if (tuckedNode == null) return defaultText; // Now we can append the "tucked" information of the node. // TODO Figure out some sort of standard. return String.format("%s %s", defaultText, tuckedNode.getTuckedInfoStatus(jdoObjectID)); } return null; // Let the default LabelProvider in the PersonRelationTree handle this. } /** * The default text to appear in the node, when the node is not tucked. */ private String getDefaultJDOObjectText(PersonRelation personRelation) { String personRelationTypeID = personRelation.getPersonRelationType().getPersonRelationTypeID(); // Display the city field for companyGroup and subsidiary relations, if available. Person person = personRelation.getTo(); if (personRelationTypeID.equals(PersonRelationType.PredefinedRelationTypes.companyGroup.personRelationTypeID) || personRelationTypeID.equals(PersonRelationType.PredefinedRelationTypes.subsidiary.personRelationTypeID)) { String cityField = getFieldInfo(person, PersonStruct.POSTADDRESS_CITY); if (cityField != null && !cityField.isEmpty()) cityField = String.format(", (%s)", cityField); return String.format("%s%s", person.getDisplayName(), cityField); } else if (personRelationTypeID.equals(PersonRelationType.PredefinedRelationTypes.employed.personRelationTypeID) || personRelationTypeID.equals(PersonRelationType.PredefinedRelationTypes.employing.personRelationTypeID)) { // Display this person-customer field as: <Title> <Salutation> Vorname, Name (Role) // Fetch info. String firstNameField = getFieldInfo(person, PersonStruct.PERSONALDATA_FIRSTNAME); String nameField = getFieldInfo(person, PersonStruct.PERSONALDATA_NAME); String titleField = getFieldInfo(person, PersonStruct.PERSONALDATA_TITLE); String salutationField = getFieldInfo(person, PersonStruct.PERSONALDATA_SALUTATION); String companyField = getFieldInfo(person, PersonStruct.PERSONALDATA_COMPANY); // Process info. String personNameField = String.format("%s %s", firstNameField, nameField); //$NON-NLS-1$ if (!titleField.isEmpty()) personNameField = String.format("%2$s %1$s", personNameField, titleField); //$NON-NLS-1$ if (!salutationField.isEmpty()) personNameField = String.format("%2$s %1$s", personNameField, salutationField); //$NON-NLS-1$ if (!companyField.isEmpty()) personNameField = String.format("%s: %s", companyField, personNameField); //$NON-NLS-1$ return personNameField; } return person.getDisplayName(); } @Override public Image getJDOObjectImage(ObjectID jdoObjectID, Object jdoObject, int spanColIndex) { if (jdoObject != null && spanColIndex == 0) { PersonRelation personRelation = (PersonRelation) jdoObject; String personRelationTypeID = personRelation.getPersonRelationType().getReversePersonRelationTypeID().personRelationTypeID; // Somehow, it's the reverse we want to dislay. Kai. if (hasImageForPersonRelationTypeID(personRelationTypeID)) return SharedImages.getSharedImage(Activator.getDefault(), TuckedPersonRelationTreeLabelProviderDelegate.class, personRelationTypeID); } return null; } /** * @return true if we have a specialised image for the given personRelationTypeID. */ private boolean hasImageForPersonRelationTypeID(String personRelationTypeID) { // There are special icons for the PersonRelationTypes: return personRelationTypeID.equals(PersonRelationType.PredefinedRelationTypes.companyGroup.personRelationTypeID) // (since 2010.03.15) || personRelationTypeID.equals(PersonRelationType.PredefinedRelationTypes.subsidiary.personRelationTypeID) // (since 2010.03.15) || personRelationTypeID.equals(PersonRelationType.PredefinedRelationTypes.employed.personRelationTypeID) // (ever since) || personRelationTypeID.equals(PersonRelationType.PredefinedRelationTypes.employing.personRelationTypeID); // (ever since) } /** * @return the information tagged to the given person by the identifier structField. * Returns an empty String if no such information found. */ private String getFieldInfo(Person person, StructFieldID structFieldID) { try { DataField dataField = person.getDataField(structFieldID); if (dataField instanceof TextDataField) return ((TextDataField) dataField).getText(); if (dataField instanceof SelectionDataField) return ((SelectionDataField) dataField).getI18nText().getText(); return ""; //$NON-NLS-1$ } catch (Exception e) { return ""; //$NON-NLS-1$ } } }