implementation and generalization of a form framework to be used in the tabbed proper...
authorn.hoffmann <n.hoffmann@localhost>
Tue, 3 Nov 2009 10:08:23 +0000 (10:08 +0000)
committern.hoffmann <n.hoffmann@localhost>
Tue, 3 Nov 2009 10:08:23 +0000 (10:08 +0000)
15 files changed:
.gitattributes
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/AbstractDescriptionDetailsPage.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/CommonNameSection.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/TaxonInteractionDetailsSection.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/AbstractEntitySetSection.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/AnnotationComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/AnnotationSection.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/DescriptionElementSourceComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/OriginalSourceSection.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/selectioncomposites/AbstractSelectionComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/selectioncomposites/NameSelectionComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/selectioncomposites/ReferenceSelectionComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/selectioncomposites/TaxonSelectionComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/termcombos/AbstractTermComboComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/termcombos/LanguageComboComposite.java [new file with mode: 0644]

index 0558d83b2325970053715ffec65b17cb86845488..1289fda7f082378281bee5f09c22ecf4f15fa853 100644 (file)
@@ -850,6 +850,17 @@ taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/ReferenceSelectionCo
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/TaxonSelectionComposite.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/TextActionComposite.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/TextWithLabelComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/AbstractEntitySetSection.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/AnnotationComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/AnnotationSection.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/DescriptionElementSourceComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/OriginalSourceSection.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/selectioncomposites/AbstractSelectionComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/selectioncomposites/NameSelectionComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/selectioncomposites/ReferenceSelectionComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/selectioncomposites/TaxonSelectionComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/termcombos/AbstractTermComboComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/termcombos/LanguageComboComposite.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/AbstractEditorPropertySheet.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/AgentBasePropertySource.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/propertysheet/AnnotationPropertySource.java -text
index 436f2d828480cc50388516670e8b422a923fda1b..4b58185aa3bcf1b9fd26f94690aa16c143675cdc 100644 (file)
@@ -20,9 +20,9 @@ import org.eclipse.ui.forms.widgets.Section;
 import org.eclipse.ui.forms.widgets.SharedScrolledComposite;\r
 \r
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
-import eu.etaxonomy.taxeditor.forms.AnnotationSection;\r
 import eu.etaxonomy.taxeditor.forms.EditorFormToolkit;\r
-import eu.etaxonomy.taxeditor.forms.OriginalSourceSection;\r
+import eu.etaxonomy.taxeditor.forms.entitysections.AnnotationSection;\r
+import eu.etaxonomy.taxeditor.forms.entitysections.OriginalSourceSection;\r
 \r
 /**\r
  * @author p.ciardelli\r
@@ -73,10 +73,12 @@ public abstract class AbstractDescriptionDetailsPage implements IDetailsPage, IP
                \r
                if(hasCitations)\r
                        citationSection = toolkit.createOriginalSourceSection(parent, getDescriptionElement(), SWT.NULL);\r
-                       citationSection.addPropertyChangeListener(this);\r
+                       if (citationSection != null)\r
+                               citationSection.addPropertyChangeListener(this);\r
                if(hasAnnotations)\r
                        annotationSection = toolkit.createAnnotationSection(parent, getDescriptionElement(), SWT.NULL);\r
-                       annotationSection.addPropertyChangeListener(this);\r
+                       if(annotationSection != null)\r
+                               annotationSection.addPropertyChangeListener(this);\r
                if(hasExtensions)\r
                        // there are no extensions for description elements\r
                \r
index 2fc390151aa6472042926c4314bbf85d40e967eb..ac085551d571136b82756a631e7ea785dd6527f7 100644 (file)
@@ -9,8 +9,8 @@ import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Composite;
 
 import eu.etaxonomy.cdm.model.description.CommonTaxonName;
-import eu.etaxonomy.taxeditor.forms.LanguageComboComposite;
 import eu.etaxonomy.taxeditor.forms.TextWithLabelComposite;
+import eu.etaxonomy.taxeditor.forms.termcombos.LanguageComboComposite;
 
 /**
  * @author nho
index f49572a134e7e0098292861c2a96f8a1f4dcdd67..aaac7d91764b610f37ef16b0f8ac4017b2165a40 100644 (file)
@@ -11,7 +11,7 @@ import eu.etaxonomy.cdm.model.description.Feature;
 import eu.etaxonomy.cdm.model.description.TaxonInteraction;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.taxeditor.forms.MultilineTextWithLabel;
-import eu.etaxonomy.taxeditor.forms.TaxonSelectionComposite;
+import eu.etaxonomy.taxeditor.forms.selectioncomposites.TaxonSelectionComposite;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 
 /**
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/AbstractEntitySetSection.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/AbstractEntitySetSection.java
new file mode 100644 (file)
index 0000000..359cac6
--- /dev/null
@@ -0,0 +1,101 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms.entitysections;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+import eu.etaxonomy.cdm.model.common.VersionableEntity;
+import eu.etaxonomy.taxeditor.forms.AbstractEditorFormSection;
+
+/**
+ * @author nho
+ *
+ */
+public abstract class AbstractEntitySetSection<T extends VersionableEntity> extends AbstractEditorFormSection {
+
+       protected T entity; 
+       protected Composite container;
+       
+       /**
+        * @param parent
+        * @param style
+        */
+       protected AbstractEntitySetSection(Composite parent, T entity, int style) {
+               super(parent, style);
+               this.entity = entity;
+               setTextClient(createToolbar());
+               
+       }
+       
+       private Control createToolbar() {
+               ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
+//             IMenuService menuService = (IMenuService) EditorUtil.getService(IMenuService.class);
+//             menuService.populateContributionManager(toolBarManager, "toolbar:de.md.contributions.sectionToolbar");
+               
+               
+               toolBarManager.add(getAddAction());
+               
+               return toolBarManager.createControl(this);
+       }
+
+       /**
+        * @return
+        */
+       protected abstract IAction getAddAction();
+       
+       private void createContainer(){
+               if(container != null)
+                       container.dispose();
+               container = toolkit.createContainer(getClient(), SWT.NULL);
+               
+               container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+               container.setLayout(new GridLayout());
+       }
+       
+       /**
+        * Call this method after dynamically changing the client area. 
+        * If the options changed is set to true, will also fire a state changed
+        * event to inform the user of unsaved changes. 
+        * 
+        * @param changed 
+        */
+       protected void internalUpdateSection(boolean changed){
+               createContainer();
+               createDynamicContents();
+               this.reflow();
+               if(changed)
+                       firePropertyChangeEvent(null);
+       }
+
+       /**
+        * 
+        */
+       protected abstract void createDynamicContents();
+
+       /**
+        * Sets this composites entity
+        *
+        * Call this method when the page gets loaded
+        * or otherwise updated from outside
+        *
+        * @param entity the entity to set
+        */
+       public void setEntity(T entity) {
+               this.entity = entity;
+               internalUpdateSection(false);
+       }
+
+       /**
+        * @return the entity
+        */
+       public T getEntity() {
+               return entity;
+       }
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/AnnotationComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/AnnotationComposite.java
new file mode 100644 (file)
index 0000000..6f6e3f9
--- /dev/null
@@ -0,0 +1,56 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms.entitysections;
+
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.widgets.Composite;
+
+import eu.etaxonomy.cdm.model.common.Annotation;
+import eu.etaxonomy.taxeditor.forms.MultilineTextWithLabel;
+
+/**
+ * @author nho
+ *
+ */
+public class AnnotationComposite extends MultilineTextWithLabel implements ModifyListener{
+
+       private Annotation annotation;
+
+       /**
+        * 
+        * @param parent
+        * @param annotation
+        * @param style
+        */
+       public AnnotationComposite(Composite parent, Annotation annotation, int style) {
+               super(parent, "Annotation", null, 100, style);
+               
+               this.setAnnotation(annotation);
+               
+               text.addModifyListener(this);
+       }
+
+       /**
+        * @param annotation the annotation to set
+        */
+       public void setAnnotation(Annotation annotation) {
+               this.annotation = annotation;
+               setText(annotation.getText());
+       }
+
+       /**
+        * @return the annotation
+        */
+       public Annotation getAnnotation() {
+               return annotation;
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
+        */
+       public void modifyText(ModifyEvent e) {
+               annotation.setText(getText());
+       }
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/AnnotationSection.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/AnnotationSection.java
new file mode 100644 (file)
index 0000000..c4598af
--- /dev/null
@@ -0,0 +1,110 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms.entitysections;
+
+import java.util.Set;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.widgets.Section;
+
+import eu.etaxonomy.cdm.model.common.AnnotatableEntity;
+import eu.etaxonomy.cdm.model.common.Annotation;
+import eu.etaxonomy.cdm.model.common.AnnotationType;
+import eu.etaxonomy.cdm.model.common.Language;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public class AnnotationSection extends AbstractEntitySetSection<AnnotatableEntity> {
+
+       /**
+        * @param parent
+        * @param style
+        */
+       public AnnotationSection(Composite parent, AnnotatableEntity annotatableEntity,  int style) {
+               super(parent, annotatableEntity, Section.TWISTIE | Section.COMPACT | style);
+               
+               setText("Annotations");
+       }
+       
+
+       /*
+        * (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.forms.AbstractEntitySetSection#createDynamicContents()
+        */
+       @Override
+       public void createDynamicContents() {
+               
+               Set<Annotation> annotations = null;
+               if(getEntity() != null){
+                       annotations = getEntity().getAnnotations();
+               }
+               
+               if(annotations == null || annotations.size() == 0){
+                       toolkit.createLabel(container, "No annotations yet.");
+               }else{
+                       for(Annotation annotation : annotations){
+                               
+                               toolkit.createAnnotationComposite(container, annotation, SWT.NULL);
+                               
+                               Button button_remove = toolkit.createButton(container, "Remove", SWT.PUSH);
+                               button_remove.addSelectionListener(new RemoveListener(annotation));
+                       }
+               }
+       }
+       
+       private class RemoveListener extends SelectionAdapter{
+               private Annotation annotation;
+               
+               public RemoveListener(Annotation annotation){
+                       this.annotation = annotation;
+               }
+               
+               /* (non-Javadoc)
+                * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+                */
+               @Override
+               public void widgetSelected(SelectionEvent e) {
+                       getEntity().removeAnnotation(annotation);
+                       internalUpdateSection(true);
+               }
+       }
+       
+       
+
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.forms.AbstractEntitySetSection#getAddAction()
+        */
+       @Override
+       protected IAction getAddAction() {
+               Action addAnnotation = new Action("add", Action.AS_PUSH_BUTTON){
+                       /* (non-Javadoc)
+                        * @see org.eclipse.jface.action.Action#run()
+                        */
+                       @Override
+                       public void run() {
+                               String text = "";
+                               AnnotationType type = AnnotationType.EDITORIAL();
+                               Language language = CdmStore.getDefaultLanguage();
+                               
+                               Annotation annotation = Annotation.NewInstance(text, type, language);
+                               getEntity().addAnnotation(annotation);
+                               internalUpdateSection(true);
+                               if(! getSection().isExpanded())
+                                       getSection().setExpanded(true);
+                               internalUpdateSection(true);
+                       }
+               };
+               addAnnotation.setToolTipText("Create a new annotation");
+               return addAnnotation;
+       }       
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/DescriptionElementSourceComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/DescriptionElementSourceComposite.java
new file mode 100644 (file)
index 0000000..97be48f
--- /dev/null
@@ -0,0 +1,61 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms.entitysections;
+
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.widgets.Composite;
+
+import eu.etaxonomy.cdm.model.common.DescriptionElementSource;
+import eu.etaxonomy.taxeditor.forms.AbstractFormComposite;
+import eu.etaxonomy.taxeditor.forms.TextWithLabelComposite;
+import eu.etaxonomy.taxeditor.forms.selectioncomposites.NameSelectionComposite;
+import eu.etaxonomy.taxeditor.forms.selectioncomposites.ReferenceSelectionComposite;
+
+/**
+ * @author  nho
+ */
+public class DescriptionElementSourceComposite extends AbstractFormComposite implements IPropertyChangeListener{
+
+       private DescriptionElementSource source;
+       
+       private ReferenceSelectionComposite citationSelection;
+       private TextWithLabelComposite microCitation;
+       private NameSelectionComposite nameSelection;
+
+       public DescriptionElementSourceComposite(Composite parent, DescriptionElementSource source, int style){
+               super(parent, style);
+               this.source = source;
+               
+               citationSelection = new ReferenceSelectionComposite(this, "Citation", source.getCitation(), SWT.NULL);
+               citationSelection.addPropertyChangeListener(this);
+               
+               microCitation = new TextWithLabelComposite(this, "Citation Detail", source.getCitationMicroReference(), SWT.NULL);
+               microCitation.addPropertyChangeListener(this);
+        
+        nameSelection = new NameSelectionComposite(this, "Name in Source", source.getNameUsedInSource(), SWT.NULL);
+        nameSelection.addPropertyChangeListener(this);
+       }
+       
+       
+       /**
+        * @return the source
+        */
+       public DescriptionElementSource getSource() {
+               return source;
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
+        */
+       public void propertyChange(PropertyChangeEvent event) {
+               source.setCitation(citationSelection.getSelection());
+               source.setCitationMicroReference(microCitation.getText());
+               source.setNameUsedInSource(nameSelection.getSelection());
+               firePropertyChangeEvent(event);
+       }       
+}
\ No newline at end of file
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/OriginalSourceSection.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/entitysections/OriginalSourceSection.java
new file mode 100644 (file)
index 0000000..597b2ff
--- /dev/null
@@ -0,0 +1,102 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms.entitysections;
+
+import java.util.Set;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.widgets.Section;
+
+import eu.etaxonomy.cdm.model.common.DescriptionElementSource;
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public class OriginalSourceSection extends AbstractEntitySetSection<DescriptionElementBase> implements IPropertyChangeListener{
+
+
+       public OriginalSourceSection(Composite parent, DescriptionElementBase entity, int style){
+               super(parent, entity, Section.TWISTIE | Section.COMPACT | style);
+               
+               setText("Citations");
+       }
+
+       /*
+        * 
+        */
+       public void createDynamicContents() {
+               
+               Set<DescriptionElementSource> sources = null;
+               if(getEntity() != null){
+                       sources = getEntity().getSources();
+               }
+               
+               if(sources == null || sources.size() == 0){
+                       toolkit.createLabel(container, "No citations yet.");
+               }else{
+                       for(DescriptionElementSource source : sources){
+                               DescriptionElementSourceComposite descriptionElementSourceComposite = toolkit.createDescriptionElementSourceComposite(container, source, SWT.NULL);
+                               descriptionElementSourceComposite.addPropertyChangeListener(this);
+                               
+                               Button button_remove = toolkit.createButton(container, "Remove", SWT.PUSH);
+                               button_remove.addSelectionListener(new RemoveListener(source));
+                       }
+               }
+       }
+       
+       private class RemoveListener extends SelectionAdapter{
+               private DescriptionElementSource source;
+               
+               public RemoveListener(DescriptionElementSource source){
+                       this.source = source;
+               }
+               
+               /* (non-Javadoc)
+                * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+                */
+               @Override
+               public void widgetSelected(SelectionEvent e) {
+                       getEntity().removeSource(source);
+                       internalUpdateSection(true);
+               }
+       }
+
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.forms.AbstractEntitySetSection#getAddAction()
+        */
+       @Override
+       protected IAction getAddAction() {
+               Action addCitation = new Action("add", Action.AS_PUSH_BUTTON){
+                       /* (non-Javadoc)
+                        * @see org.eclipse.jface.action.Action#run()
+                        */
+                       @Override
+                       public void run() {
+                               getEntity().addSource(DescriptionElementSource.NewInstance());
+                               if(! getSection().isExpanded())
+                                       getSection().setExpanded(true);
+                               internalUpdateSection(true);
+                       }
+               };
+               addCitation.setToolTipText("Create a new citation");
+               return addCitation;
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
+        */
+       public void propertyChange(PropertyChangeEvent event) {
+               firePropertyChangeEvent(event);
+       }       
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/selectioncomposites/AbstractSelectionComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/selectioncomposites/AbstractSelectionComposite.java
new file mode 100644 (file)
index 0000000..7374bd7
--- /dev/null
@@ -0,0 +1,95 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms.selectioncomposites;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
+import eu.etaxonomy.taxeditor.forms.AbstractFormComposite;
+
+/**
+ * @author nho
+ *
+ */
+public abstract class AbstractSelectionComposite<T extends IdentifiableEntity> extends AbstractFormComposite implements SelectionListener{
+
+       protected T selection;
+       
+       protected Label label;
+       protected Text text;
+       protected Button button;
+
+       /**
+        * @param parent
+        * @param style
+        */
+       public AbstractSelectionComposite(Composite parent, String labelString, T selection, int style) {
+               super(parent, style);
+               
+               this.selection = selection;
+               
+               this.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+               GridLayout layout = (GridLayout) this.getLayout();
+               layout.numColumns = 2;
+                               
+               label = toolkit.createLabel(this, labelString, SWT.WRAP);
+               GridData labelData = new GridData();
+               labelData.horizontalSpan = 2;
+               label.setLayoutData(labelData);
+               
+               text = toolkit.createText(this, "", SWT.BORDER | SWT.WRAP);
+               text.setEditable(false);
+               text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+               
+               button = toolkit.createButton(this, "Browse", SWT.PUSH);
+               button.addSelectionListener(this);
+               
+               updateText();
+       }
+       
+       /* (non-Javadoc)
+        * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+        */
+       public void widgetDefaultSelected(SelectionEvent e) {
+               // do nothing
+       }
+       
+       /* (non-Javadoc)
+        * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+        */
+       public void widgetSelected(SelectionEvent e) {
+               firePropertyChangeEvent(null);
+       }
+       
+       /**
+        * Return the selected object
+        * 
+        * @return
+        */
+       public T getSelection(){
+               return selection;
+       }
+       
+       /**
+        * 
+        * @param selection
+        */
+       public void setSelection(T selection){
+               this.selection = selection;
+               updateText();
+       }
+
+       protected void updateText(){
+               if(selection != null)
+                       text.setText(selection.getTitleCache());
+       }
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/selectioncomposites/NameSelectionComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/selectioncomposites/NameSelectionComposite.java
new file mode 100644 (file)
index 0000000..c067199
--- /dev/null
@@ -0,0 +1,39 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms.selectioncomposites;
+
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Composite;
+
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;
+import eu.etaxonomy.taxeditor.dialogs.filteredSelection.FilteredNameSelectionDialog;
+
+/**
+ * @author nho
+ *
+ */
+public class NameSelectionComposite extends AbstractSelectionComposite<TaxonNameBase> {
+
+       /**
+        * @param parent
+        * @param labelString
+        * @param selection
+        * @param style
+        */
+       public NameSelectionComposite(Composite parent, String labelString,
+                       TaxonNameBase selection, int style) {
+               super(parent, labelString, selection, style);
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+        */
+       @Override
+       public void widgetSelected(SelectionEvent e) {
+               super.widgetSelected(e);
+               selection = FilteredNameSelectionDialog.selectName(getShell(), selection);
+               updateText();
+       }
+
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/selectioncomposites/ReferenceSelectionComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/selectioncomposites/ReferenceSelectionComposite.java
new file mode 100644 (file)
index 0000000..d88ffcc
--- /dev/null
@@ -0,0 +1,39 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms.selectioncomposites;
+
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Composite;
+
+import eu.etaxonomy.cdm.model.reference.ReferenceBase;
+import eu.etaxonomy.taxeditor.dialogs.filteredSelection.FilteredReferenceSelectionDialog;
+
+/**
+ * @author nho
+ *
+ */
+public class ReferenceSelectionComposite extends AbstractSelectionComposite<ReferenceBase>{
+
+       /**
+        * @param parent
+        * @param labelString
+        * @param selection
+        * @param style
+        */
+       public ReferenceSelectionComposite(Composite parent, String labelString,
+                       ReferenceBase selection, int style) {
+               super(parent, labelString, selection, style);
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+        */
+       @Override
+       public void widgetSelected(SelectionEvent e) {
+               super.widgetSelected(e);
+               selection = FilteredReferenceSelectionDialog.selectReference(getShell(), selection);
+
+               updateText();
+       }
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/selectioncomposites/TaxonSelectionComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/selectioncomposites/TaxonSelectionComposite.java
new file mode 100644 (file)
index 0000000..8275fc1
--- /dev/null
@@ -0,0 +1,38 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms.selectioncomposites;
+
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Composite;
+
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+import eu.etaxonomy.taxeditor.dialogs.filteredSelection.FilteredTaxonSelectionDialog;
+
+/**
+ * @author nho
+ *
+ */
+public class TaxonSelectionComposite extends AbstractSelectionComposite<TaxonBase> {
+
+       /**
+        * @param parent
+        * @param labelString
+        * @param selection
+        * @param style
+        */
+       public TaxonSelectionComposite(Composite parent, String labelString,
+                       TaxonBase selection, int style) {
+               super(parent, labelString, selection, style);   }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+        */
+       @Override
+       public void widgetSelected(SelectionEvent e) {
+               super.widgetSelected(e);
+               selection = FilteredTaxonSelectionDialog.selectTaxon(getShell());
+               updateText();
+       }
+
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/termcombos/AbstractTermComboComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/termcombos/AbstractTermComboComposite.java
new file mode 100644 (file)
index 0000000..5edc136
--- /dev/null
@@ -0,0 +1,211 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms.termcombos;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+
+import eu.etaxonomy.cdm.model.common.DefinedTermBase;
+import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.forms.AbstractFormComposite;
+import eu.etaxonomy.taxeditor.preference.LanguageMenuPreferences;
+import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
+
+/**
+ * @author nho
+ *
+ */
+public abstract class AbstractTermComboComposite<T extends DefinedTermBase> extends AbstractFormComposite implements SelectionListener, IPropertyChangeListener{
+
+       private static final Logger logger = Logger.getLogger(AbstractTermComboComposite.class);
+       
+       T selection;
+       
+       private Label label;
+       private Combo combo;
+
+       private ArrayList<T> terms;
+
+       private Comparator<T> termComparator;
+
+       private Composite msgComposite;
+       
+       /**
+        * @param parent
+        * @param style
+        */
+       public AbstractTermComboComposite(Composite parent, String labelString, T selection, int visibleItems, int style) {
+               super(parent, style);
+               
+               label = toolkit.createLabel(this, labelString);
+               label.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+               
+        // create combo
+        combo = new Combo(this, SWT.BORDER | SWT.READ_ONLY);
+        combo.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+        combo.setVisibleItemCount(visibleItems);
+        
+        populateTerms();
+        
+        combo.addSelectionListener(this);
+        PreferencesUtil.getPreferenceStore().addPropertyChangeListener(this);
+       }
+
+       public T getSelection(){
+               return selection;
+       }
+       
+       public void setSelection(T selection){
+               Listener[] listeners = combo.getListeners(SWT.Selection);
+               
+               for (Listener listener : listeners){
+                       combo.removeListener(SWT.Selection, listener);
+               }
+               
+               combo.select(terms.indexOf(selection));
+               
+               for (Listener listener : listeners){
+                       combo.addListener(SWT.Selection, listener);
+               }
+       }
+       
+       private void populateTerms(){
+               List<T> preferredTerms = preferredTerms();
+               
+               combo.removeAll();
+               
+               terms = new ArrayList<T>();
+               
+               int i = 0;              
+               int index = 0;
+               if(termComparator != null)
+                       Collections.sort(preferredTerms, termComparator);
+               for (T term : preferredTerms) {
+                       String description = term.getDescription(); 
+                       if (description == null) {
+                               logger.warn("No description for " + term + " - not added to combo");
+                               continue;
+                       }
+                       combo.add(description);
+                       terms.add(term);
+
+                       i++;
+                       if (selection != null) {
+                               if (selection.equals(term)) {
+                                       index = i;
+                               }
+                       } else {
+                               // TODO isn't it better to put the last language at the top of the menu, not automatically select?
+//                                     if (lastLanguage != null && lastLanguage.equals(language)) {
+//                                             index = i;  
+//                                     }
+                       }
+               }
+               
+               // Check whether language is in menu
+               if (msgComposite != null) {
+                       msgComposite.dispose();
+                       msgComposite = null;
+               }
+               if (selection != null && index == 0) {
+                       createTermNotInPreferredTerms(selection);
+               }
+               
+               combo.select(index);    
+       }
+       
+       /**
+        * @return
+        */
+       protected abstract List<T> preferredTerms();
+
+       private void createTermNotInPreferredTerms(T term) {
+               
+               msgComposite = toolkit.createComposite(this);
+               GridLayout layout = new GridLayout();
+               layout.numColumns = 2;
+               msgComposite.setLayout(layout);
+               msgComposite.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+                | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL
+                | GridData.VERTICAL_ALIGN_CENTER));
+               
+               String langText = term.getDescription() == null ? term.getLabel() : term.getDescription();
+               langText += " is not one of your preferred " + term.getClass().getSimpleName().toLowerCase() + "s. ";
+               Label label = toolkit.createLabel(msgComposite, langText, SWT.WRAP);
+               label.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+                | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL
+                | GridData.VERTICAL_ALIGN_CENTER));
+               
+               Hyperlink linkEdit = toolkit.createHyperlink(msgComposite, "Edit preferences", SWT.WRAP);
+               linkEdit.addHyperlinkListener(new HyperlinkAdapter() {
+                       /* (non-Javadoc)
+                        * @see org.eclipse.ui.forms.events.HyperlinkAdapter#linkActivated(org.eclipse.ui.forms.events.HyperlinkEvent)
+                        */
+                       @Override
+                       public void linkActivated(HyperlinkEvent e) {
+                               org.eclipse.ui.dialogs.PreferencesUtil.createPreferenceDialogOn(EditorUtil.getShell(), 
+                                               LanguageMenuPreferences.ID, null, null).open();
+                       }
+               });
+               
+               msgComposite.moveBelow(combo);
+               
+               pack(true);
+               layout();
+       }
+       
+       public void addSelectionListener(SelectionListener listener){
+               combo.addSelectionListener(listener);
+       }
+       
+       public void removeSelectionListener(SelectionListener listener){
+               combo.removeSelectionListener(listener);
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+        */
+       public void widgetSelected(SelectionEvent e) {
+               selection = terms.get(combo.getSelectionIndex());
+       }
+       
+       /* (non-Javadoc)
+        * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
+        */
+       public void propertyChange(PropertyChangeEvent event) {
+               if (PreferencesUtil.PREFERRED_TERMS_CHANGE.equals(event.getProperty())) {
+                       populateTerms();
+               }
+       }
+       
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.forms.AbstractFormComposite#dispose()
+        */
+       @Override
+       public void dispose() {
+               super.dispose();
+               PreferencesUtil.getPreferenceStore().removePropertyChangeListener(this);
+       }
+       
+       // not used
+       public void widgetDefaultSelected(SelectionEvent e) {}
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/termcombos/LanguageComboComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/termcombos/LanguageComboComposite.java
new file mode 100644 (file)
index 0000000..b2c677b
--- /dev/null
@@ -0,0 +1,39 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms.termcombos;
+
+import java.util.List;
+
+import org.eclipse.swt.widgets.Composite;
+
+import eu.etaxonomy.cdm.model.common.Language;
+import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
+
+/**
+ * @author nho
+ *
+ */
+public class LanguageComboComposite extends AbstractTermComboComposite<Language> {
+
+       private static final int VISIBLE_ITEMS = 20;
+
+       /**
+        * 
+        * @param parent
+        * @param labelString
+        * @param selection
+        * @param style
+        */
+       public LanguageComboComposite(Composite parent, String labelString, Language selection, int style) {
+               super(parent, labelString, selection, VISIBLE_ITEMS, style);
+       }
+
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.forms.AbstractTermComboComposite#preferredTerms()
+        */
+       @Override
+       protected List<Language> preferredTerms() {
+               return PreferencesUtil.getPreferredLanguages();
+       }
+}