fixes #1235 and #1228
authorn.hoffmann <n.hoffmann@localhost>
Tue, 27 Oct 2009 12:43:07 +0000 (12:43 +0000)
committern.hoffmann <n.hoffmann@localhost>
Tue, 27 Oct 2009 12:43:07 +0000 (12:43 +0000)
15 files changed:
.gitattributes
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractSelectionComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractTermComboComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AnnotationComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/DescriptionElementSourceComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/EditorFormToolkit.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/FormComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/ImageComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/LanguageComboComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/MultilineTextWithLabel.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/NameSelectionComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/ReferenceSelectionComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/TaxonSelectionComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/TextActionComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/TextWithLabelComposite.java [new file with mode: 0644]

index e54e4ee5e008121019f2009cf074f4a0f372d881..003439d2eec0da94469492480c8040c86c7ff5b5 100644 (file)
@@ -819,6 +819,20 @@ taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/SetBas
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/handler/SwapSynonymAndAcceptedHandler.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/reference/IReferenceSearch.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/reference/ReferenceSelectComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractSelectionComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractTermComboComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AnnotationComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/DescriptionElementSourceComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/EditorFormToolkit.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/FormComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/ImageComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/LanguageComboComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/MultilineTextWithLabel.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/NameSelectionComposite.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/ReferenceSelectionComposite.java -text
+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/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
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractSelectionComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractSelectionComposite.java
new file mode 100644 (file)
index 0000000..02c3c6d
--- /dev/null
@@ -0,0 +1,97 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyListener;
+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;
+
+/**
+ * @author nho
+ *
+ */
+public abstract class AbstractSelectionComposite<T extends IdentifiableEntity> extends FormComposite 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
+       }
+       
+       /**
+        * 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());
+       }
+       
+       public void addModifyListener(ModifyListener listener){
+               text.addModifyListener(listener);
+       }
+       
+       public void removeModifyListener(ModifyListener listener){
+               text.removeModifyListener(listener);
+       }
+
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractTermComboComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractTermComboComposite.java
new file mode 100644 (file)
index 0000000..056fcfc
--- /dev/null
@@ -0,0 +1,210 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+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.preference.LanguageMenuPreferences;
+import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
+
+/**
+ * @author nho
+ *
+ */
+public abstract class AbstractTermComboComposite<T extends DefinedTermBase> extends FormComposite 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/AnnotationComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AnnotationComposite.java
new file mode 100644 (file)
index 0000000..cd69508
--- /dev/null
@@ -0,0 +1,55 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+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;
+
+/**
+ * @author nho
+ *
+ */
+public class AnnotationComposite extends MultilineTextWithLabel implements ModifyListener{
+
+       private Annotation annotation;
+
+       /**
+        * 
+        * @param parent
+        * @param annotation
+        * @param style
+        */
+       protected 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/DescriptionElementSourceComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/DescriptionElementSourceComposite.java
new file mode 100644 (file)
index 0000000..c2c7915
--- /dev/null
@@ -0,0 +1,55 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+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;
+
+/**
+ * @author  nho
+ */
+public class DescriptionElementSourceComposite extends FormComposite implements ModifyListener{
+
+       private DescriptionElementSource source;
+       
+       private ReferenceSelectionComposite citationSelection;
+       private TextWithLabelComposite microCitation;
+       private NameSelectionComposite nameSelection;
+
+       protected DescriptionElementSourceComposite(Composite parent, DescriptionElementSource source, int style){
+               super(parent, style);
+               this.source = source;
+               
+               citationSelection = new ReferenceSelectionComposite(this, "Citation", source.getCitation(), SWT.NULL);
+               citationSelection.addModifyListener(this);
+               
+               microCitation = new TextWithLabelComposite(this, "Citation Detail", source.getCitationMicroReference(), SWT.NULL);
+               microCitation.addModifyListener(this);
+        
+        nameSelection = new NameSelectionComposite(this, "Name in Source", source.getNameUsedInSource(), SWT.NULL);
+        nameSelection.addModifyListener(this);
+       }
+       
+       
+       /**
+        * @return the source
+        */
+       public DescriptionElementSource getSource() {
+               return source;
+       }
+
+
+       /* (non-Javadoc)
+        * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
+        */
+       public void modifyText(ModifyEvent e) {
+               source.setCitation(citationSelection.getSelection());
+               source.setCitationMicroReference(microCitation.getText());
+               source.setNameUsedInSource(nameSelection.getSelection());
+       }       
+}
\ No newline at end of file
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/EditorFormToolkit.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/EditorFormToolkit.java
new file mode 100644 (file)
index 0000000..9c8a377
--- /dev/null
@@ -0,0 +1,222 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+import java.net.URI;
+
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.forms.FormColors;
+import org.eclipse.ui.forms.IFormColors;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.internal.forms.widgets.FormFonts;
+
+import eu.etaxonomy.cdm.model.common.Annotation;
+import eu.etaxonomy.cdm.model.common.DescriptionElementSource;
+import eu.etaxonomy.cdm.model.common.Language;
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+import eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.AbstractDescriptionDetailSection;
+
+/**
+ * @author nho
+ *
+ */
+public class EditorFormToolkit extends FormToolkit{
+
+       private BoldFontHolder2 boldFontHolder2;
+
+       /**
+        * @param display
+        */
+       public EditorFormToolkit(Display display) {
+               super(display);
+               init();
+       }
+       
+       /**
+        * 
+        */
+       private void init() {
+               boldFontHolder2 = new BoldFontHolder2();
+       }
+
+       /**
+        * @param display
+        */
+       public EditorFormToolkit(FormColors colors) {
+               super(colors);
+               init();
+       }
+
+       /**
+        * 
+        * @param parent
+        * @param style
+        * @return
+        */
+       public FormComposite createFormComposite(Composite parent, int style){
+               return new FormComposite(parent, style);
+       }
+       
+       /**
+        * 
+        * @param parent
+        * @param labelString
+        * @param textHeight
+        * @param style
+        * @return
+        */
+       public MultilineTextWithLabel createMultilineTextWithLabel(Composite parent, String labelString, int textHeight, int style){
+               return new MultilineTextWithLabel(parent, labelString, "", textHeight, style);
+       }
+       
+       /**
+        * 
+        * @param parent
+        * @param source
+        * @param style
+        * @return
+        */
+       public DescriptionElementSourceComposite createDescriptionElementSourceComposite(Composite parent, DescriptionElementSource source, int style){
+               return new DescriptionElementSourceComposite(parent, source, style);
+       }
+       
+       /**
+        * 
+        * @param parent
+        * @param labelString
+        * @param initialText
+        * @param style
+        * @return
+        */
+       public TextWithLabelComposite createTextWithLabelComposite(Composite parent, String labelString, String initialText, int style){
+               return new TextWithLabelComposite(parent, labelString, initialText, style);
+       }
+       
+       /**
+        * 
+        * @param parent
+        * @param labelString
+        * @param selection
+        * @param style
+        * @return
+        */
+       public LanguageComboComposite createLanguageComboComposite(Composite parent, String labelString, Language selection, int style){
+               return new LanguageComboComposite(parent, labelString, selection, style);
+       }
+       
+       /**
+        * 
+        * @param parent
+        * @param imageUri
+        * @param style
+        * @return
+        */
+       public ImageComposite createImageComposite(Composite parent, URI imageUri, int style){
+               return new ImageComposite(parent, imageUri, style);
+       }
+       
+       /**
+        * 
+        * @param parent
+        * @param labelString
+        * @param initialText
+        * @param style
+        * @return
+        */
+       public TextActionComposite createTextActionComposite(Composite parent, String labelString, String initialText, int style){
+               return new TextActionComposite(parent, labelString, initialText, style);
+       }
+
+       /**
+        * 
+        * @param parent
+        * @param annotation
+        * @param style
+        * @return
+        */
+       public AnnotationComposite createAnnotationComposite(Composite parent, Annotation annotation, int style) {
+               return new AnnotationComposite(parent, annotation, style);
+       }
+       
+       /**
+        * 
+        * @param parent
+        * @param selection
+        * @param style
+        * @return
+        */
+       public TaxonSelectionComposite createTaxonSelectionComposite(Composite parent, TaxonBase selection, int style) {
+               return new TaxonSelectionComposite(parent, "Taxon", selection, style);
+       }
+       
+       
+       
+       /**
+        * Creates a section as a part of the form.
+        * 
+        * @param parent
+        *            the section parent
+        * @param sectionStyle
+        *            the section style
+        * @return the section widget
+        */
+       public Section adaptSection(Composite parent, AbstractDescriptionDetailSection section, int sectionStyle) {
+//             Section section = new Section(parent, getOrientation(), sectionStyle);
+               section.setMenu(parent.getMenu());
+               adapt(section, true, true);
+               if (section.getToggle() != null) {
+                       section.getToggle().setHoverDecorationColor(getColors()
+                                       .getColor(IFormColors.TB_TOGGLE_HOVER));
+                       section.getToggle().setDecorationColor(getColors()
+                                       .getColor(IFormColors.TB_TOGGLE));
+               }
+               section.setFont(boldFontHolder2.getBoldFont(parent.getFont()));
+
+               getColors().initializeSectionToolBarColors();
+               section.setTitleBarBackground(getColors().getColor(IFormColors.TB_BG));
+               section.setTitleBarBorderColor(getColors()
+                               .getColor(IFormColors.TB_BORDER));
+               // call setTitleBarForeground regardless as it also sets the label color
+               section.setTitleBarForeground(getColors()
+                               .getColor(IFormColors.TB_TOGGLE));
+               return section;
+       }
+       
+       private class BoldFontHolder2 {
+               private Font normalFont;
+
+               private Font boldFont;
+
+               public BoldFontHolder2() {
+               }
+
+               public Font getBoldFont(Font font) {
+                       createBoldFont(font);
+                       return boldFont;
+               }
+
+               private void createBoldFont(Font font) {
+                       if (normalFont == null || !normalFont.equals(font)) {
+                               normalFont = font;
+                               dispose();
+                       }
+                       if (boldFont == null) {
+                               boldFont = FormFonts.getInstance().getBoldFont(getColors().getDisplay(),
+                                               normalFont);
+                       }
+               }
+
+               public void dispose() {
+                       if (boldFont != null) {
+                               FormFonts.getInstance().markFinished(boldFont);
+                               boldFont = null;
+                       }
+               }
+       }
+
+
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/FormComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/FormComposite.java
new file mode 100644 (file)
index 0000000..b717de0
--- /dev/null
@@ -0,0 +1,51 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+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.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author nho
+ *
+ */
+public class FormComposite extends Composite {
+
+       protected FormToolkit toolkit;
+       
+       
+       /**
+        * @param parent
+        * @param style
+        */
+       public FormComposite(Composite parent, int style) {
+               super(parent, style);
+
+               GridLayout layout = new GridLayout();
+               layout.marginWidth = 0;
+               layout.marginHeight = 0;
+               layout.verticalSpacing = 0;
+               layout.horizontalSpacing = 0;
+               
+               this.setLayout(layout);
+               
+               toolkit = new FormToolkit(parent.getDisplay());
+               
+               GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+               
+               this.setLayoutData(gridData);
+       }
+       
+       /* (non-Javadoc)
+        * @see org.eclipse.swt.widgets.Widget#dispose()
+        */
+       @Override
+       public void dispose() {
+               super.dispose();
+               toolkit.dispose();
+       }       
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/ImageComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/ImageComposite.java
new file mode 100644 (file)
index 0000000..b7a2bc0
--- /dev/null
@@ -0,0 +1,105 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+import java.net.URI;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author n.hoffmann
+ *
+ */
+public class ImageComposite extends FormComposite implements ControlListener{
+
+       private Browser browser;
+       
+       private URI imageUri;
+       
+       /**
+        * @param parent
+        * @param style
+        */
+       protected ImageComposite(Composite parent, URI imageUri, int style) {
+               super(parent, style);
+
+               this.setLayout(new GridLayout());
+               
+               this.setImageUri(imageUri);
+               
+               browser = new Browser(this, SWT.NONE);
+               browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+               
+               showImage();
+               browser.addControlListener(this);
+       }
+
+       /**
+        * 
+        */
+       private void showImage() {
+               Display.getDefault().asyncExec(new Runnable() {
+                       public void run() {
+                               String html = "";
+                               html = "<HTML><HEAD><TITLE></TITLE></HEAD><BODY marginwidth=0 marginheight=0 leftmargin=0 topmargin=0>";
+                               html += "<img width=\"" + calculateWidth() + "\" src=\"" + getImageUri() + "\" />";
+                               html += "</BODY></HTML>";
+                               
+                               browser.setText(html);
+                       }
+               });
+       }
+       
+       /** 
+        * @return
+        */
+       public int calculateWidth() {           
+               return browser.getBounds().width;
+       }
+       
+       /* (non-Javadoc)
+        * @see org.eclipse.swt.events.ControlListener#controlMoved(org.eclipse.swt.events.ControlEvent)
+        */
+       public void controlMoved(ControlEvent e) {
+               showImage();
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.swt.events.ControlListener#controlResized(org.eclipse.swt.events.ControlEvent)
+        */
+       public void controlResized(ControlEvent e) {
+               showImage();
+       }
+
+       /**
+        * @param imageUri the imageUri to set
+        */
+       public void setImageUri(URI imageUri) {
+               this.imageUri = imageUri;
+               showImage();
+       }
+
+       /**
+        * @return the imageUri
+        */
+       public URI getImageUri() {
+               return imageUri;
+       }
+       
+       public void addControlListener(ControlListener listener){
+               browser.addControlListener(listener);
+       }
+       
+       public void removeControlListener(ControlListener listener){
+               browser.removeControlListener(listener);
+       }
+
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/LanguageComboComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/LanguageComboComposite.java
new file mode 100644 (file)
index 0000000..97794db
--- /dev/null
@@ -0,0 +1,39 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+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
+        */
+       protected 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();
+       }
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/MultilineTextWithLabel.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/MultilineTextWithLabel.java
new file mode 100644 (file)
index 0000000..863e9b1
--- /dev/null
@@ -0,0 +1,36 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+
+import eu.etaxonomy.taxeditor.model.Resources;
+
+/**
+ * @author nho
+ *
+ */
+public class MultilineTextWithLabel extends TextWithLabelComposite {
+       
+       /**
+        * @param parent
+        * @param labelString
+        * @param initialText
+        * @param style
+        */
+       protected MultilineTextWithLabel(Composite parent, String labelString,
+                       String initialText, int textHeight, int style) {
+               super(parent, labelString, initialText, style);
+               GridData gd = new GridData(SWT.FILL, SWT.TOP, true, true);
+               gd.heightHint = textHeight;
+               text.setLayoutData(gd);
+       }
+
+
+
+
+
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/NameSelectionComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/NameSelectionComposite.java
new file mode 100644 (file)
index 0000000..27984ba
--- /dev/null
@@ -0,0 +1,37 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+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)
+        */
+       public void widgetSelected(SelectionEvent e) {
+                selection = FilteredNameSelectionDialog.selectName(getShell(), selection);
+                updateText();
+       }
+
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/ReferenceSelectionComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/ReferenceSelectionComposite.java
new file mode 100644 (file)
index 0000000..946e55f
--- /dev/null
@@ -0,0 +1,37 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+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)
+        */
+       public void widgetSelected(SelectionEvent e) {
+               selection = FilteredReferenceSelectionDialog.selectReference(getShell(), selection);
+
+               updateText();
+       }
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/TaxonSelectionComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/TaxonSelectionComposite.java
new file mode 100644 (file)
index 0000000..d463e15
--- /dev/null
@@ -0,0 +1,36 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+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)
+        */
+       public void widgetSelected(SelectionEvent e) {
+               selection = FilteredTaxonSelectionDialog.selectTaxon(getShell());
+               updateText();
+       }
+
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/TextActionComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/TextActionComposite.java
new file mode 100644 (file)
index 0000000..f3d38a0
--- /dev/null
@@ -0,0 +1,72 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+import org.eclipse.swt.SWT;
+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.common.CdmUtils;
+
+/**
+ * @author nho
+ *
+ */
+public class TextActionComposite extends FormComposite {
+
+       private Label label;
+       private Text text;
+       private Button button;
+
+       /**
+        * @param parent
+        * @param style
+        */
+       protected TextActionComposite(Composite parent, String labelString, String initialText, int style) {
+               super(parent, style);
+               
+               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(SWT.FILL, SWT.TOP, true, false);
+               labelData.horizontalSpan = 2;
+               label.setLayoutData(labelData);
+               
+               text = toolkit.createText(this, "", SWT.BORDER | SWT.MULTI | SWT.WRAP);
+               text.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+               
+               setText(CdmUtils.Nz(initialText));
+               
+               button = toolkit.createButton(this, "Show", SWT.PUSH);
+       }
+
+       /**
+        * @param text the text to set
+        */
+       public void setText(String string) {
+               text.setText(CdmUtils.Nz(string));
+       }
+
+       /**
+        * @return the text
+        */
+       public String getText() {
+               return text.getText();
+       }
+
+       public void addSelectionListener(SelectionListener listener){
+               button.addSelectionListener(listener);
+       }
+
+       public void removeSelectionListener(SelectionListener listener){
+               button.removeSelectionListener(listener);
+       }
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/TextWithLabelComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/TextWithLabelComposite.java
new file mode 100644 (file)
index 0000000..6550fc2
--- /dev/null
@@ -0,0 +1,84 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+
+import eu.etaxonomy.cdm.common.CdmUtils;
+
+/**
+ * @author nho
+ *
+ */
+public class TextWithLabelComposite extends FormComposite {
+       protected Text text;
+       
+       /**
+        * @param parent
+        * @param style
+        */
+       protected TextWithLabelComposite(Composite parent, String labelString, String initialText, int style) {
+               super(parent, style);
+               
+               this.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+               
+               toolkit.createLabel(this, labelString, SWT.WRAP);
+               
+               text = toolkit.createText(this, "", SWT.BORDER | SWT.MULTI | SWT.WRAP);
+               text.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+               
+               setText(initialText);
+       }
+
+       /**
+        * Add a ModifyListener to this composites text element
+        * 
+        * @param listener
+        */
+       public void addModifyListener(ModifyListener listener){
+               text.addModifyListener(listener);
+       }
+       
+       /**
+        * Remove a ModifyListener from this composites text element
+        * 
+        * @param listener
+        */
+       public void removeModifyListener(ModifyListener listener){
+               text.removeModifyListener(listener);
+       }
+
+       /**
+        * Get the text of this composites text composite
+        * 
+        * @return
+        */
+       public String getText() {
+               return text.getText();
+       }
+
+       /**
+        * Set the text of this composites text composite
+        * 
+        * @param string
+        */
+       public void setText(String string) {
+               Listener[] listeners = text.getListeners(SWT.Modify);
+               
+               for(Listener listener :  listeners){
+                       text.removeListener(SWT.Modify, listener);
+               }
+               
+               text.setText(CdmUtils.Nz(string));
+               
+               for(Listener listener :  listeners){
+                       text.addListener(SWT.Modify, listener);
+               }
+       }
+}