*/
package eu.etaxonomy.taxeditor.ui.section.description;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
import eu.etaxonomy.cdm.model.common.OriginalSourceType;
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
import eu.etaxonomy.cdm.model.description.DescriptionElementSource;
+import eu.etaxonomy.cdm.model.reference.Reference;
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
import eu.etaxonomy.taxeditor.ui.section.AbstractEntityCollectionSection;
/**
- * <p>DescriptionElementSourceSection class.</p>
+ * <p>
+ * DescriptionElementSourceSection class.
+ * </p>
*
* @author n.hoffmann
* @created Nov 17, 2009
* @version 1.0
*/
-public class DescriptionElementSourceSection extends AbstractEntityCollectionSection<DescriptionElementBase, DescriptionElementSource>{
+public class DescriptionElementSourceSection extends
+ AbstractEntityCollectionSection<DescriptionElementBase, DescriptionElementSource> {
- /**
- * <p>Constructor for DescriptionElementSourceSection.</p>
- *
- * @param parentElement a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} object.
- * @param style a int.
- * @param cdmFormFactory a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
- * @param conversation a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
- */
- public DescriptionElementSourceSection(CdmFormFactory cdmFormFactory, ConversationHolder conversation, ICdmFormElement parentElement, int style){
- super(cdmFormFactory, conversation, parentElement, "References", style);
- }
+ /**
+ * <p>
+ * Constructor for DescriptionElementSourceSection.
+ * </p>
+ *
+ * @param parentElement
+ * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+ * object.
+ * @param style
+ * a int.
+ * @param cdmFormFactory
+ * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
+ * object.
+ * @param conversation
+ * a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
+ * object.
+ */
+ public DescriptionElementSourceSection(CdmFormFactory cdmFormFactory, ConversationHolder conversation,
+ ICdmFormElement parentElement, int style) {
+ super(cdmFormFactory, conversation, parentElement, "References", style);
+ }
- /** {@inheritDoc} */
- @Override
- public DescriptionElementSource createNewElement() {
- return DescriptionElementSource.NewInstance(OriginalSourceType.PrimaryTaxonomicSource);
- }
+ /** {@inheritDoc} */
+ @Override
+ public DescriptionElementSource createNewElement() {
+ return DescriptionElementSource.NewInstance(OriginalSourceType.PrimaryTaxonomicSource);
+ }
- /** {@inheritDoc} */
- @Override
- public Collection<DescriptionElementSource> getCollection(
- DescriptionElementBase entity) {
- return entity.getSources();
- }
+ /** {@inheritDoc} */
+ @Override
+ public Collection<DescriptionElementSource> getCollection(DescriptionElementBase entity) {
+ List<DescriptionElementSource> sources = new ArrayList<DescriptionElementSource>(entity.getSources());
+ Collections.sort(sources, new Comparator<DescriptionElementSource>() {
- /** {@inheritDoc} */
- @Override
- public String getEmptyString() {
- return "No references yet.";
- }
+ @Override
+ public int compare(DescriptionElementSource o1, DescriptionElementSource o2) {
+ int id1 = o1.getId();
+ int id2 = o2.getId();
+ OriginalSourceType type1 = o1.getType();
+ OriginalSourceType type2 = o2.getType();
+ Reference citation1 = o1.getCitation();
+ Reference citation2 = o2.getCitation();
- /** {@inheritDoc} */
- @Override
- protected String getTooltipString() {
- return "Create a new reference";
- }
+ // the newly created should always be on top
+ if (id1 == 0) {
+ return -1;
+ }
+ if (id2 == 0) {
+ return 1;
+ }
- /** {@inheritDoc} */
- @Override
- public void addElement(DescriptionElementSource element) {
- getEntity().addSource(element);
- }
+ // sort by type (Primary taxonomic > Primary Media > others
+ // alphabetically by reference title cache)
+ if (type1 != null && type1.equals(OriginalSourceType.PrimaryTaxonomicSource)) {
+ return -1;
+ }
+ if (type1 != null && type1.equals(OriginalSourceType.PrimaryMediaSource)
+ && type2!=null && !type2.equals(OriginalSourceType.PrimaryTaxonomicSource)) {
+ return -1;
+ }
+ if (type2 != null && type2.equals(OriginalSourceType.PrimaryTaxonomicSource)) {
+ return 1;
+ }
+ if (type2 != null && type2.equals(OriginalSourceType.PrimaryMediaSource)
+ && type1!=null && !type1.equals(OriginalSourceType.PrimaryTaxonomicSource)) {
+ return 1;
+ }
- /** {@inheritDoc} */
- @Override
- public void removeElement(DescriptionElementSource element) {
- getEntity().removeSource(element);
- }
+ //sort by citation title cache
+ if(citation1==null){
+ return -1;
+ }
+ if(citation2==null){
+ return 1;
+ }
+ if(citation1!=null && citation2!=null){
+ return citation1.getTitleCache().compareTo(citation2.getTitleCache());
+ }
+ return 0;
+ }
+ });
+ return sources;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public String getEmptyString() {
+ return "No references yet.";
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ protected String getTooltipString() {
+ return "Create a new reference";
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void addElement(DescriptionElementSource element) {
+ getEntity().addSource(element);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void removeElement(DescriptionElementSource element) {
+ getEntity().removeSource(element);
+ }
}