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
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
\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
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
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;
/**
--- /dev/null
+/**
+ *
+ */
+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;
+ }
+}
--- /dev/null
+/**
+ *
+ */
+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());
+ }
+}
--- /dev/null
+/**
+ *
+ */
+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;
+ }
+}
--- /dev/null
+/**
+ *
+ */
+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
--- /dev/null
+/**
+ *
+ */
+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);
+ }
+}
--- /dev/null
+/**
+ *
+ */
+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());
+ }
+}
--- /dev/null
+/**
+ *
+ */
+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();
+ }
+
+}
--- /dev/null
+/**
+ *
+ */
+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();
+ }
+}
--- /dev/null
+/**
+ *
+ */
+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();
+ }
+
+}
--- /dev/null
+/**
+ *
+ */
+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) {}
+}
--- /dev/null
+/**
+ *
+ */
+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();
+ }
+}