- converted Point element (used for coordinates)
authorPatric Plitzner <p.plitzner@bgbm.org>
Thu, 15 Aug 2013 12:50:34 +0000 (12:50 +0000)
committerPatric Plitzner <p.plitzner@bgbm.org>
Thu, 15 Aug 2013 12:50:34 +0000 (12:50 +0000)
.gitattributes
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/FieldObservationGeneralElement.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/FieldObservationGeneralElementController.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/LanguageTextFieldController.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/PointField.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/PointFieldController.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/TermComboFieldController.java [new file with mode: 0644]

index f65ecccbdeec504d841db5cae0ca913a05a9e38f..cd624314561287b87a64164ba2da8e523873de37 100644 (file)
@@ -1235,7 +1235,11 @@ eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/F
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/FieldObservationGeneralElementController.java -text
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/GatheringEventDetailsElement.java -text
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/GatheringEventDetailsElementController.java -text
+eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/LanguageTextFieldController.java -text
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/NumberFieldController.java -text
+eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/PointField.java -text
+eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/PointFieldController.java -text
+eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/TermComboFieldController.java -text
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/TextFieldController.java -text
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/ToggleableTextField.java -text
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/ToggleableTextFieldController.java -text
index 743f4d4e5f7a6ebd17b3e6a6d22387eb2f4b3c2b..429de95c84f5b0732adf9ed66b3f40945e88c1fe 100644 (file)
@@ -1,12 +1,12 @@
 // $Id$
 /**
-* Copyright (C) 2013 EDIT
-* European Distributed Institute of Taxonomy
-* http://www.e-taxonomy.eu
-*
-* The contents of this file are subject to the Mozilla Public License Version 1.1
-* See LICENSE.TXT at the top of this package for the full license terms.
-*/
+ * Copyright (C) 2013 EDIT
+ * European Distributed Institute of Taxonomy
+ * http://www.e-taxonomy.eu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
 package eu.etaxonomy.taxeditor.ui.campanula;
 
 import org.eclipse.swt.SWT;
@@ -27,17 +27,16 @@ import org.eclipse.wb.swt.SWTResourceManager;
 public class FieldObservationGeneralElement extends Composite {
     private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
     private final Text textLocality;
-    private final Text textLatitude;
-    private final Text textLongitude;
-    private final Text textErrorRadius;
     private final Text textElevation;
     private final Text textCollectingNumber;
     private EntitySelectionField countrySelectionField;
     private EntitySelectionField collectorSelectionField;
     private ToggleableTextField toggleableTextField;
+    private PointField pointField;
 
     /**
      * Create the composite.
+     *
      * @param parent
      * @param style
      */
@@ -76,24 +75,25 @@ public class FieldObservationGeneralElement extends Composite {
 
         Label lblLatitude = formToolkit.createLabel(this, "Latitude", SWT.NONE);
 
-        textLatitude = formToolkit.createText(this, "New Text", SWT.NONE);
-        textLatitude.setText("");
-        textLatitude.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP, 1, 1));
+        pointField = new PointField(this, SWT.NONE);
+        TableWrapLayout twl_pointField = (TableWrapLayout) pointField.getLayout();
+        twl_pointField.verticalSpacing = 0;
+        twl_pointField.topMargin = 0;
+        twl_pointField.rightMargin = 0;
+        twl_pointField.leftMargin = 0;
+        twl_pointField.horizontalSpacing = 0;
+        twl_pointField.bottomMargin = 0;
+        pointField.setLayoutData(new TableWrapData(TableWrapData.LEFT, TableWrapData.TOP, 6, 1));
+        formToolkit.adapt(pointField);
+        formToolkit.paintBordersFor(pointField);
+        new Label(this, SWT.NONE);
 
         Label lblLongitude = formToolkit.createLabel(this, "Longitude", SWT.NONE);
-
-        textLongitude = formToolkit.createText(this, "New Text", SWT.NONE);
-        textLongitude.setText("");
-        textLongitude.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP, 1, 1));
+        new Label(this, SWT.NONE);
 
         Label lblErrorRadiusm = formToolkit.createLabel(this, "Error Radius (m)", SWT.NONE);
 
-        textErrorRadius = formToolkit.createText(this, "New Text", SWT.NONE);
-        textErrorRadius.setText("");
-        textErrorRadius.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP, 1, 1));
-
         Label lblReferenceSystem = formToolkit.createLabel(this, "Reference System", SWT.NONE);
-        new Label(this, SWT.NONE);
 
         Label lblAbsoluteElevationm = formToolkit.createLabel(this, "Absolute Elevation (m)", SWT.NONE);
 
@@ -111,7 +111,6 @@ public class FieldObservationGeneralElement extends Composite {
         formToolkit.adapt(collectorSelectionField);
         formToolkit.paintBordersFor(collectorSelectionField);
 
-
         Label lblCollectingNumber = formToolkit.createLabel(this, "Collecting Number", SWT.NONE);
 
         textCollectingNumber = formToolkit.createText(this, "New Text", SWT.NONE);
@@ -124,31 +123,32 @@ public class FieldObservationGeneralElement extends Composite {
     protected void checkSubclass() {
         // Disable the check that prevents subclassing of SWT components
     }
+
     public EntitySelectionField getCountrySelectionField() {
         return countrySelectionField;
     }
+
     public EntitySelectionField getCollectorSelectionField() {
         return collectorSelectionField;
     }
+
     public Text getTextElevation() {
         return textElevation;
     }
+
     public Text getTextLocality() {
         return textLocality;
     }
-    public Text getTextLatitude() {
-        return textLatitude;
-    }
-    public Text getTextLongitude() {
-        return textLongitude;
-    }
-    public Text getTextErrorRadius() {
-        return textErrorRadius;
-    }
+
     public Text getTextCollectingNumber() {
         return textCollectingNumber;
     }
+
     public ToggleableTextField getToggleableTextField() {
         return toggleableTextField;
     }
+
+    public PointField getPointField() {
+        return pointField;
+    }
 }
index 54007fb0430bb7d0323b13d8faa4961e928a53ba..04d220e689a5e6cf757c2bcaa9c8c512ec5f94ba 100644 (file)
@@ -14,8 +14,6 @@ import eu.etaxonomy.cdm.model.agent.AgentBase;
 import eu.etaxonomy.cdm.model.common.LanguageString;
 import eu.etaxonomy.cdm.model.location.NamedArea;
 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
-import eu.etaxonomy.taxeditor.ui.element.LanguageStringWithLabelElement;
-import eu.etaxonomy.taxeditor.ui.element.PointElement;
 import eu.etaxonomy.taxeditor.ui.element.TimePeriodElement;
 import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement;
 import eu.etaxonomy.taxeditor.ui.section.campanula.compatibility.ICdmFormElement;
@@ -28,16 +26,16 @@ import eu.etaxonomy.taxeditor.ui.selection.EntitySelectionElement;
  */
 public class FieldObservationGeneralElementController extends AbstractCdmDetailElement<DerivedUnitFacade> {
 
-    private ToggleableTextFieldController toggleableText_titleCache;
+    private FieldObservationGeneralElement fieldObservationGeneralElement;
 
+    private ToggleableTextFieldController toggleableText_titleCache;
     private EntitySelectionFieldController<NamedArea> selection_country;
-    private LanguageStringWithLabelElement languageText_locality;
-    private PointElement element_point;
+    private LanguageTextFieldController languageText_locality;
+    private PointFieldController element_point;
     private NumberFieldController number_elevation;
     private TimePeriodElement element_date;
     private EntitySelectionFieldController<AgentBase> selection_collector;
     private TextFieldController text_collectingNumber;
-    private FieldObservationGeneralElement fieldObservationGeneralElement;
 
     /**
      * @param formFactory
@@ -46,8 +44,8 @@ public class FieldObservationGeneralElementController extends AbstractCdmDetailE
     public FieldObservationGeneralElementController(FieldObservationGeneralElement fieldObservationGeneralElement, CdmFormFactory formFactory, ICdmFormElement formElement) {
         super(formFactory, formElement);
         this.fieldObservationGeneralElement = fieldObservationGeneralElement;
+        setPropertyChangeListeners(formFactory.getPropertyChangeListeners());
         formFactory.addPropertyChangeListener(this);
-        formFactory.getPropertyChangeListeners().add(this);
     }
 
     /*
@@ -62,8 +60,8 @@ public class FieldObservationGeneralElementController extends AbstractCdmDetailE
         toggleableText_titleCache = new ToggleableTextFieldController(fieldObservationGeneralElement.getToggleableTextField(), getFormFactory(), formElement, entity.getTitleCache(), entity.isProtectedTitleCache(), style);
 
         selection_country = new EntitySelectionFieldController<NamedArea>(fieldObservationGeneralElement.getCountrySelectionField(), getFormFactory(), getConversationHolder(), formElement, NamedArea.class, "Country", entity.getCountry(), EntitySelectionElement.NOTHING, style);
-//        languageText_locality = formFactory.createLanguageStringWithLabelElement(formElement, "Locality", entity.getLocality(), style);
-//        element_point = formFactory.createPointElement(formElement, entity.getExactLocation(), style);
+        languageText_locality = new LanguageTextFieldController(fieldObservationGeneralElement.getTextLocality(), getFormFactory(), formElement, entity.getLocality());
+        element_point = new PointFieldController(fieldObservationGeneralElement.getPointField(),getFormFactory(), formElement, entity.getExactLocation(), style);
         number_elevation = new NumberFieldController(fieldObservationGeneralElement.getTextElevation(), getFormFactory(), formElement, entity.getAbsoluteElevation());
 //        element_date = formFactory.createTimePeriodElement(formElement, "Date", entity.getGatheringPeriod(), style);
         selection_collector = new EntitySelectionFieldController<AgentBase>(fieldObservationGeneralElement.getCollectorSelectionField(), getFormFactory(), getConversationHolder(), formElement, AgentBase.class, "Collector", entity.getCollector(), EntitySelectionElement.ALL, style);
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/LanguageTextFieldController.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/LanguageTextFieldController.java
new file mode 100644 (file)
index 0000000..522ac75
--- /dev/null
@@ -0,0 +1,100 @@
+// $Id$
+/**
+* Copyright (C) 2013 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.ui.campanula;
+
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.widgets.Text;
+
+import eu.etaxonomy.cdm.model.common.LanguageString;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
+import eu.etaxonomy.taxeditor.ui.section.campanula.compatibility.ICdmFormElement;
+
+/**
+ * @author pplitzner
+ * @date 15.08.2013
+ *
+ */
+public class LanguageTextFieldController extends TextFieldController{
+
+    private LanguageString languageString;
+
+    /**
+     * <p>Constructor for LanguageStringWithLabelElement.</p>
+     *
+     * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
+     * @param parentElement a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} object.
+     * @param labelString a {@link java.lang.String} object.
+     * @param languageString a {@link eu.etaxonomy.cdm.model.common.LanguageString} object.
+     * @param style a int.
+     */
+    protected LanguageTextFieldController(Text controlledText, CdmFormFactory formFactory,
+            ICdmFormElement parentElement,
+            LanguageString languageString) {
+        this(controlledText, formFactory, parentElement, languageString, null);
+    }
+
+    /**
+     * <p>Constructor for LanguageStringWithLabelElement.</p>
+     *
+     * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
+     * @param parentElement a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} object.
+     * @param labelString a {@link java.lang.String} object.
+     * @param languageString a {@link eu.etaxonomy.cdm.model.common.LanguageString} object.
+     * @param height a int.
+     * @param style a int.
+     */
+    protected LanguageTextFieldController(Text controlledText, CdmFormFactory formFactory,
+            ICdmFormElement parentElement,
+            LanguageString languageString, Integer height) {
+        super(controlledText, formFactory, parentElement, null, height);
+
+        setLanguageString(languageString);
+    }
+
+    /**
+     * <p>Getter for the field <code>languageString</code>.</p>
+     *
+     * @return a {@link eu.etaxonomy.cdm.model.common.LanguageString} object.
+     */
+    public LanguageString getLanguageString() {
+        return languageString;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void modifyText(ModifyEvent e) {
+        if(languageString == null){
+            languageString = LanguageString.NewInstance("", CdmStore.getDefaultLanguage());
+        }
+
+        languageString.setText(text.getText());
+        super.modifyText(e);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void setText(String text) {
+        if(text != null){
+            languageString.setText(text);
+            super.setText(text);
+        }
+    }
+
+    /**
+     * <p>Setter for the field <code>languageString</code>.</p>
+     *
+     * @param languageString a {@link eu.etaxonomy.cdm.model.common.LanguageString} object.
+     */
+    public void setLanguageString(LanguageString languageString) {
+        this.languageString = languageString;
+        super.setText(languageString != null ? languageString.getText() : "");
+    }
+}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/PointField.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/PointField.java
new file mode 100644 (file)
index 0000000..fe73ddd
--- /dev/null
@@ -0,0 +1,98 @@
+// $Id$
+/**
+* Copyright (C) 2013 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.ui.campanula;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.TableWrapData;
+import org.eclipse.ui.forms.widgets.TableWrapLayout;
+
+/**
+ * @author pplitzner
+ * @date 15.08.2013
+ *
+ */
+public class PointField extends Composite {
+    private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
+    private Text text_latitude;
+    private Text text_latitudeParsed;
+    private Text text_longitude;
+    private Text text_longitudeParsed;
+    private Text number_errorRadius;
+    private Combo combo_referenceSystem;
+
+    /**
+     * Create the composite.
+     * @param parent
+     * @param style
+     */
+    public PointField(Composite parent, int style) {
+        super(parent, style);
+        {
+            setLayout(new TableWrapLayout());
+        }
+
+        text_latitude = formToolkit.createText(this, "New Text", SWT.NONE);
+        text_latitude.setText("");
+        text_latitude.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP, 1, 1));
+
+        text_latitudeParsed = formToolkit.createText(this, "New Text", SWT.NONE);
+        text_latitudeParsed.setEnabled(false);
+        text_latitudeParsed.setText("");
+        text_latitudeParsed.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP, 1, 1));
+
+        text_longitude = formToolkit.createText(this, "New Text", SWT.NONE);
+        text_longitude.setText("");
+        text_longitude.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP, 1, 1));
+
+        text_longitudeParsed = formToolkit.createText(this, "New Text", SWT.NONE);
+        text_longitudeParsed.setEnabled(false);
+        text_longitudeParsed.setText("");
+        text_longitudeParsed.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP, 1, 1));
+
+        number_errorRadius = formToolkit.createText(this, "New Text", SWT.NONE);
+        number_errorRadius.setText("");
+        number_errorRadius.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP, 1, 1));
+
+        combo_referenceSystem = new Combo(this, SWT.READ_ONLY);
+        combo_referenceSystem.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP, 1, 1));
+        formToolkit.adapt(combo_referenceSystem);
+        formToolkit.paintBordersFor(combo_referenceSystem);
+
+    }
+
+    @Override
+    protected void checkSubclass() {
+        // Disable the check that prevents subclassing of SWT components
+    }
+
+    public Text getText_latitude() {
+        return text_latitude;
+    }
+    public Text getText_latitudeParsed() {
+        return text_latitudeParsed;
+    }
+    public Text getText_longitude() {
+        return text_longitude;
+    }
+    public Text getText_longitudeParsed() {
+        return text_longitudeParsed;
+    }
+    public Text getNumber_errorRadius() {
+        return number_errorRadius;
+    }
+    public Combo getCombo_referenceSystem() {
+        return combo_referenceSystem;
+    }
+}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/PointFieldController.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/PointFieldController.java
new file mode 100644 (file)
index 0000000..32aa076
--- /dev/null
@@ -0,0 +1,187 @@
+// $Id$
+/**
+ * Copyright (C) 2013 EDIT
+ * European Distributed Institute of Taxonomy
+ * http://www.e-taxonomy.eu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
+package eu.etaxonomy.taxeditor.ui.campanula;
+
+import java.text.ParseException;
+
+import org.eclipse.jface.util.PropertyChangeEvent;
+
+import eu.etaxonomy.cdm.model.location.Point;
+import eu.etaxonomy.cdm.model.location.ReferenceSystem;
+import eu.etaxonomy.taxeditor.preference.Resources;
+import eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement;
+import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
+import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
+import eu.etaxonomy.taxeditor.ui.element.IEntityElement;
+import eu.etaxonomy.taxeditor.ui.section.campanula.compatibility.ICdmFormElement;
+
+/**
+ * @author pplitzner
+ * @date 15.08.2013
+ *
+ */
+public class PointFieldController extends AbstractCdmFormElement implements IEntityElement<Point> {
+
+    private Point point;
+
+    private final TextFieldController text_latitude;
+    private final TextFieldController text_longitude;
+    private final NumberFieldController number_errorRadius;
+    private final TermComboFieldController<ReferenceSystem> combo_referenceSystem;
+
+    private final TextFieldController text_latitudeParsed;
+
+    private final TextFieldController text_longitudeParsed;
+
+    /**
+     * <p>
+     * Constructor for PointElement.
+     * </p>
+     *
+     * @param formFactory
+     *            a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
+     *            object.
+     * @param formElement
+     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+     *            object.
+     * @param point
+     *            a {@link eu.etaxonomy.cdm.model.location.Point} object.
+     * @param style
+     *            a int.
+     */
+    public PointFieldController(PointField pointField, CdmFormFactory formFactory, ICdmFormElement formElement, Point point, final int style) {
+        super(formFactory, formElement);
+
+        setPropertyChangeListeners(formFactory.getPropertyChangeListeners());
+        formFactory.addPropertyChangeListener(this);
+
+        text_latitude = new TextFieldController(pointField.getText_latitude(), getFormFactory(), formElement, null, style);
+        text_latitudeParsed = new TextFieldController(pointField.getText_latitudeParsed(), getFormFactory(), formElement, null, style);
+        text_longitude = new TextFieldController(pointField.getText_longitude(), getFormFactory(), formElement, null, style);
+        text_longitudeParsed = new TextFieldController(pointField.getText_longitudeParsed(), getFormFactory(), formElement, null, style);
+        number_errorRadius = new NumberFieldController(pointField.getNumber_errorRadius(), getFormFactory(), formElement, (Integer)null);
+        combo_referenceSystem = new TermComboFieldController<ReferenceSystem>(pointField.getCombo_referenceSystem(), getFormFactory(), formElement, ReferenceSystem.class, null, style);
+
+        setPoint(point);
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see
+     * eu.etaxonomy.taxeditor.forms.AbstractCdmFormElement#propertyChange(org
+     * .eclipse.jface.util.PropertyChangeEvent)
+     */
+    /** {@inheritDoc} */
+    @Override
+    public void propertyChange(PropertyChangeEvent event) {
+        if (event == null) {
+            return;
+        }
+
+        boolean propagate = false;
+
+        Object eventSource = event.getSource();
+        if (eventSource == text_latitude) {
+            try {
+                getPoint().setLatitudeByParsing(text_latitude.getText());
+                text_latitudeParsed.setText(point.getLatitudeSexagesimal().toString(false));
+                text_latitude.setBackground(getColor(Resources.COLOR_COMPOSITE_BACKGROUND));
+                propagate = true;
+            } catch (ParseException e) {
+                text_latitude.setBackground(getColor(Resources.COLOR_PARSE_ERROR));
+            }
+        } else if (eventSource == text_longitude) {
+            try {
+                getPoint().setLongitudeByParsing(text_longitude.getText());
+                text_longitudeParsed.setText(point.getLongitudeSexagesimal().toString(false));
+                text_longitude.setBackground(getColor(Resources.COLOR_COMPOSITE_BACKGROUND));
+                propagate = true;
+            } catch (ParseException e) {
+                text_longitude.setBackground(getColor(Resources.COLOR_PARSE_ERROR));
+            }
+        } else if (eventSource == number_errorRadius) {
+            getPoint().setErrorRadius(number_errorRadius.getInteger());
+            propagate = true;
+        } else if (eventSource == combo_referenceSystem) {
+            getPoint().setReferenceSystem(combo_referenceSystem.getSelection());
+            propagate = true;
+        }
+
+        if (propagate) {
+            firePropertyChangeEvent(new CdmPropertyChangeEvent(this, event));
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see eu.etaxonomy.taxeditor.forms.IEntityElement#getEntity()
+     */
+    /** {@inheritDoc} */
+    @Override
+    public Point getEntity() {
+        return getPoint();
+    }
+
+    /**
+     * <p>
+     * setEntity
+     * </p>
+     *
+     * @param point
+     *            a {@link eu.etaxonomy.cdm.model.location.Point} object.
+     */
+    public void setEntity(Point point) {
+        setPoint(point);
+    }
+
+    /**
+     * <p>
+     * Setter for the field <code>point</code>.
+     * </p>
+     *
+     * @param point
+     *            the point to set
+     */
+    public void setPoint(Point point) {
+        this.point = point;
+        if (point != null) {
+            String latitude = point.getLatitudeSexagesimal() == null ? "" : point.getLatitudeSexagesimal().toString(false);
+            String longitude = point.getLongitudeSexagesimal() == null ? "" : point.getLongitudeSexagesimal().toString(false);
+            text_latitude.setText(latitude);
+            text_latitudeParsed.setText(latitude);
+            text_longitude.setText(longitude);
+            text_longitudeParsed.setText(longitude);
+            number_errorRadius.setInteger(point.getErrorRadius());
+            combo_referenceSystem.setSelection(point.getReferenceSystem());
+        }
+    }
+
+    /**
+     * <p>
+     * Getter for the field <code>point</code>.
+     * </p>
+     *
+     * @return the point
+     */
+    public Point getPoint() {
+        if (point == null) {
+            point = Point.NewInstance();
+        }
+
+        return point;
+    }
+
+    @Override
+    public void setSelected(boolean selected) {
+        setBackground(selected ? SELECTED : getPersistentBackground());
+    }
+}
\ No newline at end of file
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/TermComboFieldController.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/campanula/TermComboFieldController.java
new file mode 100644 (file)
index 0000000..213e6c0
--- /dev/null
@@ -0,0 +1,402 @@
+// $Id$
+/**
+ * Copyright (C) 2013 EDIT
+ * European Distributed Institute of Taxonomy
+ * http://www.e-taxonomy.eu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
+package eu.etaxonomy.taxeditor.ui.campanula;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Listener;
+
+import eu.etaxonomy.cdm.model.common.DefinedTermBase;
+import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
+import eu.etaxonomy.taxeditor.preference.Resources;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.store.StoreUtil;
+import eu.etaxonomy.taxeditor.store.TermManager;
+import eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement;
+import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
+import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
+import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement;
+import eu.etaxonomy.taxeditor.ui.element.ISelectable;
+import eu.etaxonomy.taxeditor.ui.section.campanula.compatibility.ICdmFormElement;
+
+/**
+ * @author pplitzner
+ * @date 15.08.2013
+ *
+ */
+public class TermComboFieldController<T extends DefinedTermBase> extends AbstractCdmFormElement implements SelectionListener, DisposeListener, IEnableableFormElement, ISelectable {
+
+    private static final int DEFAULT_VISIBLE_ITEMS = 10;
+
+    private T selection;
+
+    private T emptyElement;
+    private static String EMPTY_ELEMENT_LABEL = "";
+
+//    protected Label label;
+    private Combo combo;
+
+    private ArrayList<T> terms;
+
+    private Comparator<T> termComparator;
+
+    private Class<T> termClass;
+
+    private List<T> customPreferredTerms;
+
+    /**
+     * <p>
+     * Constructor for AbstractTermComboElement.
+     * </p>
+     *
+     * @param parentElement
+     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
+     *            object.
+     * @param style
+     *            a int.
+     * @param formFactory
+     *            a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
+     *            object.
+     * @param labelString
+     *            a {@link java.lang.String} object.
+     * @param selection
+     *            a T object.
+     * @param visibleItems
+     *            a int.
+     * @param <T>
+     *            a T object.
+     */
+    public TermComboFieldController(Combo combo, CdmFormFactory formFactory, ICdmFormElement parentElement, Class<T> termClass, T selection, int style) {
+        super(formFactory, parentElement);
+
+        this.termClass = termClass;
+        setPropertyChangeListeners(formFactory.getPropertyChangeListeners());
+        formFactory.addPropertyChangeListener(this);
+//        if (labelString != null) {
+//            label = formFactory.createLabel(getLayoutComposite(), labelString);
+//            addControl(label);
+//        }
+
+        // create combo
+        this.combo = combo;//new Combo(getLayoutComposite(), SWT.BORDER | SWT.READ_ONLY);
+        addControl(combo);
+//        combo.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
+        combo.setVisibleItemCount(DEFAULT_VISIBLE_ITEMS);
+
+        populateTerms(getPreferredTerms());
+
+        combo.addSelectionListener(this);
+        combo.addDisposeListener(this);
+        PreferencesUtil.getPreferenceStore().addPropertyChangeListener(this);
+
+        if (selection != null) {
+            setSelection(selection);
+        }
+    }
+
+    /**
+     * <p>
+     * Getter for the field <code>selection</code>.
+     * </p>
+     *
+     * @return a T object.
+     */
+    public T getSelection() {
+        return selection;
+    }
+
+    /**
+     * <p>
+     * Sets the selection of the combo to the given T object.
+     * </p>
+     * <p>
+     * Passing <code>null</code> to this method will set the selection to the
+     * empty element and effectively clear the selection
+     * </p>
+     *
+     * @param selection
+     *            a T object or <code>null</code> to clear the selection
+     */
+    public void setSelection(T selection) {
+        this.selection = selection;
+
+        this.selection = selection;
+
+        Listener[] listeners = combo.getListeners(SWT.Selection);
+
+        for (Listener listener : listeners) {
+            combo.removeListener(SWT.Selection, listener);
+        }
+        int selectedIndex;
+        if (selection == null) {
+            // set selection to the emptyElement
+            selectedIndex = 0;
+        } else {
+            selectedIndex = terms.indexOf(selection);
+            if (selectedIndex == -1) {
+                createTermNotInPreferredTerms(selection);
+                selectedIndex = terms.indexOf(selection);
+            }
+        }
+        combo.select(selectedIndex);
+
+        for (Listener listener : listeners) {
+            combo.addListener(SWT.Selection, listener);
+        }
+    }
+
+    /**
+     * Fills the combo with elements and sets up the convenience functions for
+     * selection index
+     *
+     * @param preferredTerms
+     */
+    private void populateTerms(List<T> preferredTerms) {
+
+        combo.removeAll();
+
+        terms = new ArrayList<T>();
+
+        int i = 1;
+        int index = 0;
+
+        // Add an empty element for when nothing was selected yet
+        combo.add(EMPTY_ELEMENT_LABEL);
+        terms.add(emptyElement);
+
+        if (termComparator != null) {
+            Collections.sort(preferredTerms, termComparator);
+        }
+        for (T term : preferredTerms) {
+            String label = getLabel(term);
+            if (label == null) {
+                if (term.getTitleCache() != null) {
+                    label = term.getTitleCache();
+                    StoreUtil.warn(getClass(), "Term does not have a representation: " + term + ", " + term.getUuid());
+                } else {
+                    label = "Unknown";
+                    StoreUtil.warn(getClass(), "Representation Label and TitleCache empty for term: " + term + ", " + term.getUuid());
+                }
+
+            }
+
+            combo.add(label);
+            terms.add(term);
+
+            i++;
+            if (selection != null) {
+                if (selection.equals(term)) {
+                    index = i;
+                }
+            }
+        }
+
+        if (selection != null && index == 0) {
+            createTermNotInPreferredTerms(selection);
+        }
+
+        combo.select(index);
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see
+     * eu.etaxonomy.taxeditor.forms.IEnableableFormElement#setEnabled(boolean)
+     */
+    /** {@inheritDoc} */
+    @Override
+    public void setEnabled(boolean enabled) {
+        combo.setEnabled(enabled);
+    }
+
+    /**
+     * <p>
+     * preferredTerms
+     * </p>
+     *
+     * @return a {@link java.util.List} object.
+     */
+    protected List<T> getPreferredTerms() {
+        if (customPreferredTerms != null) {
+            return customPreferredTerms;
+        }
+        return getTermManager().getPreferredTerms(termClass);
+    }
+
+    /**
+     * May be overridden by derived classes if the desired label string does not
+     * reside in term.getLabel();
+     *
+     * @param term
+     *            a T object.
+     * @return a {@link java.lang.String} object.
+     */
+    protected String getLabel(T term) {
+        return term.getLabel(CdmStore.getDefaultLanguage());
+    }
+
+    /**
+     *
+     *
+     * @param term
+     */
+    private void createTermNotInPreferredTerms(T term) {
+        List<T> preferredTerms = getPreferredTerms();
+
+        preferredTerms.add(term);
+
+        populateTerms(preferredTerms);
+    }
+
+    /**
+     * <p>
+     * addSelectionListener
+     * </p>
+     *
+     * @param listener
+     *            a {@link org.eclipse.swt.events.SelectionListener} object.
+     */
+    public void addSelectionListener(SelectionListener listener) {
+        combo.addSelectionListener(listener);
+    }
+
+    /**
+     * <p>
+     * removeSelectionListener
+     * </p>
+     *
+     * @param listener
+     *            a {@link org.eclipse.swt.events.SelectionListener} object.
+     */
+    public void removeSelectionListener(SelectionListener listener) {
+        combo.removeSelectionListener(listener);
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see
+     * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
+     * .events.SelectionEvent)
+     */
+    /** {@inheritDoc} */
+    @Override
+    public void widgetSelected(SelectionEvent e) {
+        selection = terms.get(combo.getSelectionIndex());
+        firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see java.beans.PropertyChangeListener#propertyChange(java.beans.
+     * PropertyChangeEvent)
+     */
+    /** {@inheritDoc} */
+    @Override
+    public void propertyChange(PropertyChangeEvent event) {
+        super.propertyChange(event);
+        if (event != null && PreferencesUtil.PREFERRED_TERMS_CHANGE.equals(event.getProperty())) {
+            populateTerms(getPreferredTerms());
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void setSelected(boolean selected) {
+        setBackground(selected ? SELECTED : getPersistentBackground());
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void widgetDisposed(DisposeEvent e) {
+        PreferencesUtil.getPreferenceStore().removePropertyChangeListener(this);
+    }
+
+    // not used
+    /** {@inheritDoc} */
+    @Override
+    public void widgetDefaultSelected(SelectionEvent e) {
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void setIrrelevant(boolean irrelevant) {
+        String colorId = irrelevant ? Resources.COLOR_COMPOSITE_IRRELEVANT : Resources.COLOR_COMPOSITE_BACKGROUND;
+
+        Color color = StoreUtil.getColor(colorId);
+        combo.setBackground(color);
+    }
+
+//    /** {@inheritDoc} */
+//    @Override
+//    public void setBackground(Color color) {
+//        if (label != null)
+//            label.setBackground(color);
+//    }
+
+    /**
+*
+*/
+    protected TermManager getTermManager() {
+        return CdmStore.getTermManager();
+    }
+
+    /**
+     *
+     * @return
+     */
+    public int getVisibleItemCount() {
+        return combo.getVisibleItemCount();
+    }
+
+    /**
+     *
+     * @param count
+     */
+    public void setVisibleItemCount(int count) {
+        combo.setVisibleItemCount(count);
+    }
+
+    /**
+     * <p>
+     * A {@link List} of term objects may be passed to this combo box. In this
+     * case, the default behaviour of displaying the preferred terms for the T
+     * type will be overridden and the combo will only display the given terms.
+     * Also, any previous selection will be reseted.
+     * </p>
+     *
+     * <p>
+     * To return to the default of displaying the preferred terms, simply pass
+     * <code>null</code>.
+     * </p>
+     *
+     * @param terms
+     *            a {@link List} of T objects or <code>null</code> for default
+     *            preferred terms
+     */
+    public void setTerms(List<T> terms) {
+        setSelection(null);
+        customPreferredTerms = terms;
+        populateTerms(customPreferredTerms);
+    }
+}
\ No newline at end of file