further refactoring of the editor form api.
authorn.hoffmann <n.hoffmann@localhost>
Wed, 28 Oct 2009 10:47:42 +0000 (10:47 +0000)
committern.hoffmann <n.hoffmann@localhost>
Wed, 28 Oct 2009 10:47:42 +0000 (10:47 +0000)
All modification of data is now propagated as PropertyChangeEvents.

33 files changed:
.gitattributes
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/AbstractDescriptionDetailSection.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/AbstractDescriptionDetailsPage.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/CitationSection.java [deleted file]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/CommonNameDetailsPage.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/CommonNameSection.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/DistributionDetailsPage.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/ImageDetailsPage.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/ImageDetailsSection.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/LabelDetailsPage.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/LabelDetailsSection.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/TaxonInteractionDetailsPage.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/TaxonInteractionDetailsSection.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/TextDataDetailsPage.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/TextDataSection.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractEditorFormSection.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractEntitySetSection.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractFormComposite.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractSelectionComposite.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractTermComboComposite.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AnnotationSection.java [moved from taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/AnnotationSection.java with 53% similarity]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/Container.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/DescriptionElementSourceComposite.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/EditorFormToolkit.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/FormComposite.java [deleted file]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/IPropertyChangeEmitter.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/ImageComposite.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/NameSelectionComposite.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/OriginalSourceSection.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/ReferenceSelectionComposite.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/TaxonSelectionComposite.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/TextActionComposite.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/TextWithLabelComposite.java

index 0fb315f1373fc992ec3c413128bd38fb4b02482a..8fc5562dac0fbf673d8c1ebbc79f8c01ff5bcade 100644 (file)
@@ -760,8 +760,6 @@ taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/Tax
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/TaxonDescriptionTreeEditor.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/AbstractDescriptionDetailSection.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/AbstractDescriptionDetailsPage.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/AnnotationSection.java -text
-taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/CitationSection.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/CommonNameDetailsPage.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/CommonNameSection.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/DistributionDetailSection.java -text
@@ -835,16 +833,22 @@ 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/AbstractEditorFormSection.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractEntitySetSection.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractFormComposite.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/AnnotationSection.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/Container.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/IPropertyChangeEmitter.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/OriginalSourceSection.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
index 33903cc3df3d08fd1cdb43794ad0e7293a574895..4eb38808a9845e81c262ce322a97f88da4e33a87 100644 (file)
@@ -3,28 +3,25 @@
  */
 package eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage;
 
+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.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.events.ExpansionEvent;
-import org.eclipse.ui.forms.events.IExpansionListener;
 import org.eclipse.ui.forms.widgets.Section;
 import org.eclipse.ui.forms.widgets.ToggleHyperlink;
 
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
-import eu.etaxonomy.taxeditor.forms.EditorFormToolkit;
+import eu.etaxonomy.taxeditor.forms.AbstractEditorFormSection;
 
 /**
  * @author nho
  *
  */
-public abstract class AbstractDescriptionDetailSection extends Section implements IExpansionListener, ModifyListener{
+public abstract class AbstractDescriptionDetailSection extends AbstractEditorFormSection implements IPropertyChangeListener{
 
        protected AbstractDescriptionDetailsPage page;
-       protected EditorFormToolkit toolkit;
        private Composite client;
        
        /**
@@ -33,7 +30,6 @@ public abstract class AbstractDescriptionDetailSection extends Section implement
         */
        public AbstractDescriptionDetailSection(Composite parent, AbstractDescriptionDetailsPage page, int sectionStyle) {
                super(parent, Section.TITLE_BAR | SWT.NO_BACKGROUND | sectionStyle);
-               toolkit = page.toolkit;
                this.page = page;
                                
                this.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
@@ -60,53 +56,18 @@ public abstract class AbstractDescriptionDetailSection extends Section implement
                // default is empty
        }
        
-       /**
-        * 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){
-               createDynamicContents();
-               this.reflow();
-               if(changed)
-                       fireStateChanged();
-       }
-       
        public DescriptionElementBase getDescriptionElement() {
                return page.getDescriptionElement();
        }
        
-       protected void fireStateChanged(){
-               page.fireStateChanged();
-       }
-       
        /* (non-Javadoc)
-        * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
+        * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
         */
-       public void modifyText(ModifyEvent e) {
-               page.fireStateChanged();
+       public void propertyChange(PropertyChangeEvent event) {
+               page.propertyChange(event);
        }
        
        public ToggleHyperlink getToggle(){
                return toggle;
        }
-       
-       /* (non-Javadoc)
-        * @see org.eclipse.ui.forms.events.IExpansionListener#expansionStateChanged(org.eclipse.ui.forms.events.ExpansionEvent)
-        */
-       public void expansionStateChanged(ExpansionEvent e) {
-               // TODO Auto-generated method stub
-               
-       }
-
-
-       /* (non-Javadoc)
-        * @see org.eclipse.ui.forms.events.IExpansionListener#expansionStateChanging(org.eclipse.ui.forms.events.ExpansionEvent)
-        */
-       public void expansionStateChanging(ExpansionEvent e) {
-               // TODO Auto-generated method stub
-               
-       }
 }
index da0c541195471e2e8e2ad88e5e0c4bbbebbf05b0..436f2d828480cc50388516670e8b422a923fda1b 100644 (file)
@@ -4,6 +4,8 @@
 package eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage;\r
 \r
 import org.apache.log4j.Logger;\r
+import org.eclipse.jface.util.IPropertyChangeListener;\r
+import org.eclipse.jface.util.PropertyChangeEvent;\r
 import org.eclipse.jface.viewers.ISelection;\r
 import org.eclipse.jface.viewers.IStructuredSelection;\r
 import org.eclipse.swt.SWT;\r
@@ -14,19 +16,20 @@ import org.eclipse.swt.widgets.Label;
 import org.eclipse.ui.forms.IDetailsPage;\r
 import org.eclipse.ui.forms.IFormPart;\r
 import org.eclipse.ui.forms.IManagedForm;\r
-import org.eclipse.ui.forms.widgets.FormToolkit;\r
 import org.eclipse.ui.forms.widgets.Section;\r
 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
 \r
 /**\r
  * @author p.ciardelli\r
  * @author n.hoffmann\r
  *\r
  */\r
-public abstract class AbstractDescriptionDetailsPage implements IDetailsPage { \r
+public abstract class AbstractDescriptionDetailsPage implements IDetailsPage, IPropertyChangeListener {        \r
        private static final Logger logger = Logger.getLogger(AbstractDescriptionDetailsPage.class);\r
 \r
        protected IManagedForm managedForm;\r
@@ -40,7 +43,7 @@ public abstract class AbstractDescriptionDetailsPage implements IDetailsPage {
        private boolean hasExtensions = false;\r
                \r
        protected AbstractDescriptionDetailSection descriptionSection;\r
-       private CitationSection citationSection;\r
+       private OriginalSourceSection citationSection;\r
        private AnnotationSection annotationSection;\r
        private ExtensionSection extensionSection;\r
 \r
@@ -69,11 +72,13 @@ public abstract class AbstractDescriptionDetailsPage implements IDetailsPage {
                createDescriptionContents(parent);\r
                \r
                if(hasCitations)\r
-                       createCitations(parent);\r
+                       citationSection = toolkit.createOriginalSourceSection(parent, getDescriptionElement(), SWT.NULL);\r
+                       citationSection.addPropertyChangeListener(this);\r
                if(hasAnnotations)\r
-                       createAnnotations(parent);\r
+                       annotationSection = toolkit.createAnnotationSection(parent, getDescriptionElement(), SWT.NULL);\r
+                       annotationSection.addPropertyChangeListener(this);\r
                if(hasExtensions)\r
-                       createExtensions(parent);\r
+                       // there are no extensions for description elements\r
                \r
                reflow(true);\r
        }\r
@@ -93,34 +98,12 @@ public abstract class AbstractDescriptionDetailsPage implements IDetailsPage {
         * \r
         * @param parent\r
         */\r
-       abstract protected void createDescriptionContents(Composite parent);\r
-       \r
-       /**\r
-        * \r
-        * @param parent\r
-        */\r
-       protected void createCitations(Composite parent) {\r
-               citationSection = new CitationSection(parent, this, SWT.NULL);\r
-               toolkit.adaptSection(parent, citationSection, SWT.NULL);\r
-               citationSection.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));\r
-       }       \r
-       \r
-       protected void createAnnotations(Composite parent){\r
-               annotationSection = new AnnotationSection(parent, this, SWT.NULL);\r
-               toolkit.adaptSection(parent, annotationSection, SWT.NULL);\r
-               annotationSection.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));\r
-       }\r
-       \r
-       protected void createExtensions(Composite parent){\r
-               extensionSection = new ExtensionSection(parent, this, SWT.NULL);\r
-               toolkit.adaptSection(parent, extensionSection, SWT.NULL);\r
-               extensionSection.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));\r
-       }\r
+       abstract protected void createDescriptionContents(Composite parent);    \r
 \r
-       /**\r
-        * Alerts editor that dirty state has changed.\r
+       /* (non-Javadoc)\r
+        * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)\r
         */\r
-       protected void fireStateChanged() {\r
+       public void propertyChange(PropertyChangeEvent event) {\r
                managedForm.dirtyStateChanged();\r
        }\r
        \r
@@ -198,13 +181,13 @@ public abstract class AbstractDescriptionDetailsPage implements IDetailsPage {
                descriptionSection.updateSection();\r
                                \r
                if(hasCitations){\r
-                       citationSection.updateSection();\r
+                       citationSection.setEntity(getDescriptionElement());\r
                }\r
                if(hasAnnotations){\r
-                       annotationSection.updateSection();\r
+                       annotationSection.setEntity(getDescriptionElement());\r
                }\r
                if(hasExtensions){\r
-                       extensionSection.updateSection();\r
+//                     extensionSection.updateSection();\r
                }\r
        }\r
 \r
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/CitationSection.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/CitationSection.java
deleted file mode 100644 (file)
index 3b85024..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-/**
- * 
- */
-package eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage;
-
-import java.util.Set;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-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.Control;
-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 CitationSection extends AbstractDescriptionDetailSection{
-
-       private Composite citationContainer;
-
-       public CitationSection(Composite parent, AbstractDescriptionDetailsPage page, int style){
-               super(parent, page, Section.TWISTIE | Section.COMPACT | style);
-               
-               setText("Citations");
-               setTextClient(createToolbar(this));
-       }
-       
-       /**
-        * @return
-        */
-       private Control createToolbar(final Section section) {
-               ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
-//             IMenuService menuService = (IMenuService) EditorUtil.getService(IMenuService.class);
-//             menuService.populateContributionManager(toolBarManager, "toolbar:de.md.contributions.sectionToolbar");
-               
-               Action addCitation = new Action("add", Action.AS_PUSH_BUTTON){
-                       /* (non-Javadoc)
-                        * @see org.eclipse.jface.action.Action#run()
-                        */
-                       @Override
-                       public void run() {
-                               getDescriptionElement().addSource(DescriptionElementSource.NewInstance());
-                               if(! section.isExpanded())
-                                       section.setExpanded(true);
-                               internalUpdateSection(true);
-                       }
-               };
-               addCitation.setToolTipText("Create a new citation");
-               toolBarManager.add(addCitation);
-               
-               return toolBarManager.createControl(section);
-       }
-
-       /*
-        * 
-        */
-       public void createDynamicContents() {
-               if(citationContainer != null)
-                       citationContainer.dispose();
-               citationContainer = toolkit.createFormComposite(getClient(), SWT.NULL);
-
-               citationContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-               citationContainer.setLayout(new GridLayout());
-               
-               Set<DescriptionElementSource> sources = null;
-               if(getDescriptionElement() != null){
-                       sources = getDescriptionElement().getSources();
-               }
-               
-               if(sources == null || sources.size() == 0){
-                       toolkit.createLabel(citationContainer, "No citations yet.");
-               }else{
-                       for(DescriptionElementSource source : sources){
-                               toolkit.createDescriptionElementSourceComposite(citationContainer, source, SWT.NULL);
-                               
-                               Button button_remove = toolkit.createButton(citationContainer, "Remove", SWT.PUSH);
-                               button_remove.addSelectionListener(new RemoveListener(source));
-                       }
-               }
-       }
-
-
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.AbstractDescriptionDetailSection#updateSection()
-        */
-       @Override
-       public void updateSection() {
-               internalUpdateSection(false);
-       }
-       
-       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) {
-                       DescriptionElementBase sourcedObjcet = source.getSourcedObj();
-                       
-                       sourcedObjcet.removeSource(source);
-                       internalUpdateSection(true);
-               }
-       }       
-}
index d4028f8f30cc24c2ca157622eae296691fdccdc5..ca3b53e460a9e9b4095d6131f2d31a955584d704 100644 (file)
@@ -25,6 +25,6 @@ public class CommonNameDetailsPage extends AbstractDescriptionDetailsPage{
        @Override\r
        protected void createDescriptionContents(Composite parent) {\r
                descriptionSection = new CommonNameSection(parent, this, SWT.WRAP);\r
-               toolkit.adaptSection(parent, descriptionSection, SWT.NULL);\r
+               toolkit.adapt(descriptionSection);\r
        }\r
 }
\ No newline at end of file
index 5406429a6d008ffcbf91ffc512222bfe42292e76..2fc390151aa6472042926c4314bbf85d40e967eb 100644 (file)
@@ -3,11 +3,8 @@
  */
 package eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage;
 
+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.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Composite;
 
@@ -19,7 +16,7 @@ import eu.etaxonomy.taxeditor.forms.TextWithLabelComposite;
  * @author nho
  *
  */
-public class CommonNameSection extends AbstractDescriptionDetailSection implements ModifyListener, SelectionListener{
+public class CommonNameSection extends AbstractDescriptionDetailSection{
 
        LanguageComboComposite languageCombo;
        TextWithLabelComposite commonName;
@@ -36,10 +33,10 @@ public class CommonNameSection extends AbstractDescriptionDetailSection implemen
                setText("Common Name Details");
                
                languageCombo = toolkit.createLanguageComboComposite(getClient(), "Language", null, SWT.WRAP);
-               languageCombo.addSelectionListener(this);
+               languageCombo.addPropertyChangeListener(this);
                languageCombo.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
                commonName = toolkit.createTextWithLabelComposite(getClient(), "Common Name", null, SWT.WRAP);
-               commonName.addModifyListener(this);
+               commonName.addPropertyChangeListener(this);
        }
 
        /* (non-Javadoc)
@@ -52,19 +49,12 @@ public class CommonNameSection extends AbstractDescriptionDetailSection implemen
        }
 
        /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.AbstractDescriptionDetailSection#modifyText(org.eclipse.swt.events.ModifyEvent)
+        * @see eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.AbstractDescriptionDetailSection#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
         */
        @Override
-       public void modifyText(ModifyEvent e) {
-               super.modifyText(e);
+       public void propertyChange(PropertyChangeEvent event) {
+               super.propertyChange(event);
                getDescriptionElement().setName(commonName.getText());
-       }
-
-       /* (non-Javadoc)
-        * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-        */
-       public void widgetSelected(SelectionEvent e) {
-               page.fireStateChanged();
                getDescriptionElement().setLanguage(languageCombo.getSelection());
        }
        
@@ -75,7 +65,4 @@ public class CommonNameSection extends AbstractDescriptionDetailSection implemen
        public CommonTaxonName getDescriptionElement() {
                return (CommonTaxonName) super.getDescriptionElement();
        }
-
-       // not used
-       public void widgetDefaultSelected(SelectionEvent e) {}
 }
index a82d36a870f93e82ae6c90237130d72e33bc24da..d73af9df644dde9a68664ceb358cb5011ce4fe9f 100644 (file)
@@ -28,7 +28,7 @@ public class DistributionDetailsPage extends AbstractDescriptionDetailsPage {
        @Override\r
        protected void createDescriptionContents(Composite parent) {\r
                descriptionSection = new DistributionDetailSection(parent, this, SWT.WRAP);\r
-               toolkit.adaptSection(parent, descriptionSection, SWT.NULL);\r
+               toolkit.adapt(descriptionSection);\r
        }\r
 \r
 \r
index cf2a6903b762d037d0c5feda7daf6613d13462af..27aa94c9d5bf5d77ecda19c74511e8f0035bb86b 100644 (file)
@@ -27,6 +27,6 @@ public class ImageDetailsPage extends AbstractDescriptionDetailsPage{
        @Override\r
        protected void createDescriptionContents(Composite parent) {\r
                descriptionSection = new ImageDetailsSection(parent, this, SWT.WRAP);\r
-               toolkit.adaptSection(parent, descriptionSection, SWT.NULL);\r
+               toolkit.adapt(descriptionSection);\r
        }\r
 }
\ No newline at end of file
index 2454b688bb19e56b5821a15adacb00dc2a0884a4..06f458d877ed7f1bf90c147371fb65f3a11fad17 100644 (file)
@@ -68,6 +68,20 @@ public class ImageDetailsSection extends AbstractDescriptionDetailSection implem
                changed = false;
        }
        
+       /**
+        * 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){
+//             createDynamicContents();
+               this.reflow();
+               if(changed)
+                       firePropertyChangeEvent(null);
+       }
+       
        private ImageFile getImageFile(){
                return (ImageFile) page.input;
        }
index 766c28e298f1c16fd4f91e61ee402130a539b540..3c3bc7698365b448138c2f4510aef042537b4821 100644 (file)
@@ -38,6 +38,6 @@ public class LabelDetailsPage extends AbstractDescriptionDetailsPage{
        @Override\r
        protected void createDescriptionContents(Composite parent) {\r
                descriptionSection = new LabelDetailsSection(parent, this, sectionHeader, description, SWT.WRAP);\r
-               toolkit.adaptSection(parent, descriptionSection, SWT.NULL);\r
+               toolkit.adapt(descriptionSection);\r
        }\r
 }
\ No newline at end of file
index 4e46d31be2ef2013ee7294dd58e9f39e32036b15..c1d8c807bf8c259cde660ca1ba333147c1dc6939 100644 (file)
@@ -3,8 +3,8 @@
  */
 package eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage;
 
+import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.widgets.Composite;
 
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
@@ -32,7 +32,7 @@ public class LabelDetailsSection extends AbstractDescriptionDetailSection {
                setText(title);
                
                detailDescription = toolkit.createMultilineTextWithLabel(getClient(), labelString, 100, SWT.WRAP);
-               detailDescription.addModifyListener(this);
+               detailDescription.addPropertyChangeListener(this);
        }
        
        /* (non-Javadoc)
@@ -44,11 +44,11 @@ public class LabelDetailsSection extends AbstractDescriptionDetailSection {
        }
        
        /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.AbstractDescriptionDetailSection#modifyText(org.eclipse.swt.events.ModifyEvent)
+        * @see eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.AbstractDescriptionDetailSection#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
         */
        @Override
-       public void modifyText(ModifyEvent e) {
-               super.modifyText(e);
+       public void propertyChange(PropertyChangeEvent event) {
+               super.propertyChange(event);
                saveLabel();
        }
        
index 9291b8c64e2e093d371023370d328dda8c295c11..29ca42c1d184f3bf128162591d58dcd97e5cd86f 100644 (file)
@@ -27,7 +27,7 @@ public class TaxonInteractionDetailsPage extends AbstractDescriptionDetailsPage
        @Override
        protected void createDescriptionContents(Composite parent) {
                descriptionSection = new TaxonInteractionDetailsSection(parent, this, SWT.WRAP);
-               toolkit.adaptSection(parent, descriptionSection, SWT.NULL);
+               toolkit.adapt(descriptionSection);
        }
 
 }
index 6b0f6635c494fdbdeef41253535c12d4175ae6f2..f49572a134e7e0098292861c2a96f8a1f4dcdd67 100644 (file)
@@ -3,8 +3,8 @@
  */
 package eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage;
 
+import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.widgets.Composite;
 
 import eu.etaxonomy.cdm.model.description.Feature;
@@ -34,10 +34,10 @@ public class TaxonInteractionDetailsSection extends
                super(parent, page, sectionStyle);
                
                taxonSelection = toolkit.createTaxonSelectionComposite(getClient(), null, SWT.WRAP);
-               taxonSelection.addModifyListener(this);
+               taxonSelection.addPropertyChangeListener(this);
                
                interactionDescription = toolkit.createMultilineTextWithLabel(getClient(), "Description", 200, SWT.WRAP);
-               interactionDescription.addModifyListener(this);
+               interactionDescription.addPropertyChangeListener(this);
        }
 
        /* (non-Javadoc)
@@ -53,11 +53,11 @@ public class TaxonInteractionDetailsSection extends
        }
        
        /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.AbstractDescriptionDetailSection#modifyText(org.eclipse.swt.events.ModifyEvent)
+        * @see eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.AbstractDescriptionDetailSection#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
         */
        @Override
-       public void modifyText(ModifyEvent e) {
-               super.modifyText(e);
+       public void propertyChange(PropertyChangeEvent event) {
+               super.propertyChange(event);
                getTaxonInteraction().addDescription(interactionDescription.getText(), CdmStore.getDefaultLanguage());
                getTaxonInteraction().setTaxon2((Taxon) taxonSelection.getSelection());
        }
index e11f87f099517d32989161ae7e5589317b1d17e5..631a9eaca10ada6e6bd8f922d1e3e817235e4424 100644 (file)
@@ -27,6 +27,6 @@ public class TextDataDetailsPage extends AbstractDescriptionDetailsPage{
        @Override\r
        protected void createDescriptionContents(Composite parent) {\r
                descriptionSection = new TextDataSection(parent, this, SWT.WRAP);\r
-               toolkit.adaptSection(parent, descriptionSection, SWT.NULL);\r
+               toolkit.adapt(descriptionSection);\r
        }\r
 }
\ No newline at end of file
index 6a463832f6aefcdd7f4bbd55dadbe411afcada51..310e8b48d2a6f5c000f959e6457de19d548389c6 100644 (file)
@@ -3,8 +3,8 @@
  */
 package eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage;
 
+import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.widgets.Composite;
 
 import eu.etaxonomy.cdm.model.description.Feature;
@@ -30,15 +30,15 @@ public class TextDataSection extends AbstractDescriptionDetailSection{
                
                multilineTextWithLabel = toolkit.createMultilineTextWithLabel(getClient(), "Text for this descriptive element:", 200, SWT.WRAP);
                
-               multilineTextWithLabel.addModifyListener(this);
+               multilineTextWithLabel.addPropertyChangeListener(this);
        }
        
        /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.AbstractDescriptionDetailSection#modifyText(org.eclipse.swt.events.ModifyEvent)
+        * @see eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.AbstractDescriptionDetailSection#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
         */
        @Override
-       public void modifyText(ModifyEvent e) {
-               super.modifyText(e);
+       public void propertyChange(PropertyChangeEvent event) {
+               super.propertyChange(event);
                DescriptionHelper.setCache(getDescriptionElement(), multilineTextWithLabel.getText());
        }
 
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractEditorFormSection.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractEditorFormSection.java
new file mode 100644 (file)
index 0000000..b41a2e0
--- /dev/null
@@ -0,0 +1,111 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+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.events.ExpansionEvent;
+import org.eclipse.ui.forms.events.IExpansionListener;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.forms.widgets.ToggleHyperlink;
+
+/**
+ * @author nho
+ *
+ */
+public abstract class AbstractEditorFormSection extends Section implements IExpansionListener, IPropertyChangeEmitter{
+
+
+       protected EditorFormToolkit toolkit;
+       private Composite client;
+       
+       private Set<IPropertyChangeListener> propertyChangeListeners = new HashSet<IPropertyChangeListener>();
+
+       /**
+        * @param parent
+        * @param style
+        */
+       protected AbstractEditorFormSection(Composite parent, int style) {
+               super(parent, Section.TITLE_BAR | SWT.NO_BACKGROUND | style);
+               
+               toolkit = new EditorFormToolkit(parent.getDisplay());
+               
+               toolkit.adapt(this);
+               
+               this.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+               
+               client = toolkit.createComposite(this, SWT.WRAP);
+               client.setLayout(new GridLayout());
+
+               this.setClient(client);
+               this.addExpansionListener(this);
+       }
+       
+       /* (non-Javadoc)
+        * @see org.eclipse.swt.widgets.Widget#dispose()
+        */
+       @Override
+       public void dispose() {
+               super.dispose();
+               toolkit.dispose();
+       }
+       
+       public ToggleHyperlink getToggle(){
+               return this.toggle;
+       }
+       
+       public Composite getClient(){
+               return client;
+       }
+
+       public AbstractEditorFormSection getSection(){
+               return this;
+       }
+       
+       /* (non-Javadoc)
+        * @see org.eclipse.ui.forms.events.IExpansionListener#expansionStateChanged(org.eclipse.ui.forms.events.ExpansionEvent)
+        */
+       public void expansionStateChanged(ExpansionEvent e) {
+               // TODO Auto-generated method stub
+               
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.ui.forms.events.IExpansionListener#expansionStateChanging(org.eclipse.ui.forms.events.ExpansionEvent)
+        */
+       public void expansionStateChanging(ExpansionEvent e) {
+               // TODO Auto-generated method stub
+               
+       }       
+       
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.forms.IPropertyChangeEmitter#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
+        */
+       public void addPropertyChangeListener(IPropertyChangeListener listener) {
+               propertyChangeListeners.add(listener);
+       }
+       
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.forms.IPropertyChangeEmitter#removePropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
+        */
+       public void removePropertyChangeListener(IPropertyChangeListener listener) {
+               propertyChangeListeners.remove(listener);
+       }
+       
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.forms.IPropertyChangeEmitter#firePropertyChangeEvent()
+        */
+       public void firePropertyChangeEvent(PropertyChangeEvent event) {
+               for(IPropertyChangeListener listener : propertyChangeListeners){
+                       listener.propertyChange(event);
+               }
+       }
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractEntitySetSection.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractEntitySetSection.java
new file mode 100644 (file)
index 0000000..daebf73
--- /dev/null
@@ -0,0 +1,100 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+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;
+
+/**
+ * @author nho
+ *
+ */
+public abstract class AbstractEntitySetSection<T extends VersionableEntity> extends AbstractEditorFormSection {
+
+       protected T entity; 
+       protected Composite container;
+       
+       /**
+        * @param parent
+        * @param style
+        */
+       protected AbstractEntitySetSection(Composite parent, T entity, int style) {
+               super(parent, style);
+               this.entity = entity;
+               setTextClient(createToolbar());
+               
+       }
+       
+       private Control createToolbar() {
+               ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
+//             IMenuService menuService = (IMenuService) EditorUtil.getService(IMenuService.class);
+//             menuService.populateContributionManager(toolBarManager, "toolbar:de.md.contributions.sectionToolbar");
+               
+               
+               toolBarManager.add(getAddAction());
+               
+               return toolBarManager.createControl(this);
+       }
+
+       /**
+        * @return
+        */
+       protected abstract IAction getAddAction();
+       
+       private void createContainer(){
+               if(container != null)
+                       container.dispose();
+               container = toolkit.createContainer(getClient(), SWT.NULL);
+               
+               container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+               container.setLayout(new GridLayout());
+       }
+       
+       /**
+        * Call this method after dynamically changing the client area. 
+        * If the options changed is set to true, will also fire a state changed
+        * event to inform the user of unsaved changes. 
+        * 
+        * @param changed 
+        */
+       protected void internalUpdateSection(boolean changed){
+               createContainer();
+               createDynamicContents();
+               this.reflow();
+               if(changed)
+                       firePropertyChangeEvent(null);
+       }
+
+       /**
+        * 
+        */
+       protected abstract void createDynamicContents();
+
+       /**
+        * Sets this composites entity
+        *
+        * Call this method when the page gets loaded
+        * or otherwise updated from outside
+        *
+        * @param entity the entity to set
+        */
+       public void setEntity(T entity) {
+               this.entity = entity;
+               internalUpdateSection(false);
+       }
+
+       /**
+        * @return the entity
+        */
+       public T getEntity() {
+               return entity;
+       }
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractFormComposite.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AbstractFormComposite.java
new file mode 100644 (file)
index 0000000..cba926c
--- /dev/null
@@ -0,0 +1,80 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+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 abstract class AbstractFormComposite extends Composite implements IPropertyChangeEmitter {
+
+       protected FormToolkit toolkit;
+       private Set<IPropertyChangeListener> propertyChangeListeners = new HashSet<IPropertyChangeListener>();
+
+       
+       /**
+        * @param parent
+        * @param style
+        */
+       public AbstractFormComposite(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();
+       }
+       
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.forms.IPropertyChangeEmitter#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
+        */
+       public void addPropertyChangeListener(IPropertyChangeListener listener) {
+               propertyChangeListeners.add(listener);
+       }
+       
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.forms.IPropertyChangeEmitter#removePropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
+        */
+       public void removePropertyChangeListener(IPropertyChangeListener listener) {
+               propertyChangeListeners.remove(listener);
+       }
+       
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.forms.IPropertyChangeEmitter#firePropertyChangeEvent()
+        */
+       public void firePropertyChangeEvent(PropertyChangeEvent event) {
+               for(IPropertyChangeListener listener : propertyChangeListeners){
+                       listener.propertyChange(event);
+               }
+       }
+}
index 02c3c6d4dc60e2b9ebb788225f90d6eeb49bba44..a92f907bebc9520b0e4a3143c41943890e69b90e 100644 (file)
@@ -4,7 +4,6 @@
 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;
@@ -20,7 +19,7 @@ import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
  * @author nho
  *
  */
-public abstract class AbstractSelectionComposite<T extends IdentifiableEntity> extends FormComposite implements SelectionListener{
+public abstract class AbstractSelectionComposite<T extends IdentifiableEntity> extends AbstractFormComposite implements SelectionListener{
 
        protected T selection;
        
@@ -63,6 +62,13 @@ public abstract class AbstractSelectionComposite<T extends IdentifiableEntity> 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
         * 
@@ -85,13 +91,4 @@ public abstract class AbstractSelectionComposite<T extends IdentifiableEntity> e
                if(selection != null)
                        text.setText(selection.getTitleCache());
        }
-       
-       public void addModifyListener(ModifyListener listener){
-               text.addModifyListener(listener);
-       }
-       
-       public void removeModifyListener(ModifyListener listener){
-               text.removeModifyListener(listener);
-       }
-
 }
index 056fcfc09bdb9bdef495ac23d5c565f95ed0a6e3..6c7d48f51874cb5bd3cc098856c39026c85d9665 100644 (file)
@@ -33,7 +33,7 @@ import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
  * @author nho
  *
  */
-public abstract class AbstractTermComboComposite<T extends DefinedTermBase> extends FormComposite implements SelectionListener, IPropertyChangeListener{
+public abstract class AbstractTermComboComposite<T extends DefinedTermBase> extends AbstractFormComposite implements SelectionListener, IPropertyChangeListener{
 
        private static final Logger logger = Logger.getLogger(AbstractTermComboComposite.class);
        
similarity index 53%
rename from taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/detailpage/AnnotationSection.java
rename to taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/AnnotationSection.java
index b75e1fdebc64e465de05f77f5bf1a0a63aa4a0eb..73a4165ea180bc2d1183abdfeb6bca1859f6d321 100644 (file)
@@ -1,27 +1,22 @@
 /**
  * 
  */
-package eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage;
+package eu.etaxonomy.taxeditor.forms;
 
 import java.util.Set;
 
 import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ToolBarManager;
+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.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.Control;
-import org.eclipse.ui.forms.events.ExpansionEvent;
 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.DescriptionElementSource;
 import eu.etaxonomy.cdm.model.common.Language;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 
@@ -29,69 +24,29 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
  * @author n.hoffmann
  *
  */
-public class AnnotationSection extends AbstractDescriptionDetailSection {
+public class AnnotationSection extends AbstractEntitySetSection<AnnotatableEntity> {
 
-       private Button button_add;
-       private Composite container;
-       
        /**
         * @param parent
         * @param style
         */
-       public AnnotationSection(Composite parent,  AbstractDescriptionDetailsPage page,  int style) {
-               super(parent, page, Section.TWISTIE | Section.COMPACT | style);
+       protected AnnotationSection(Composite parent, AnnotatableEntity annotatableEntity,  int style) {
+               super(parent, annotatableEntity, Section.TWISTIE | Section.COMPACT | style);
                
                setText("Annotations");
-               setTextClient(createToolbar(this));
-       }
-
-       /**
-        * @return
-        */
-       private Control createToolbar(final Section section) {
-               ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
-//             IMenuService menuService = (IMenuService) EditorUtil.getService(IMenuService.class);
-//             menuService.populateContributionManager(toolBarManager, "toolbar:de.md.contributions.sectionToolbar");
-               
-               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);
-                               getDescriptionElement().addAnnotation(annotation);
-                               internalUpdateSection(true);
-                               if(! section.isExpanded())
-                                       section.setExpanded(true);
-                               internalUpdateSection(true);
-                       }
-               };
-               addAnnotation.setToolTipText("Create a new annotation");
-               toolBarManager.add(addAnnotation);
-               
-               return toolBarManager.createControl(section);
        }
+       
 
        /*
-        * 
+        * (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.forms.AbstractEntitySetSection#createDynamicContents()
         */
+       @Override
        public void createDynamicContents() {
-                               
-               if(container != null)
-                       container.dispose();
-               container = toolkit.createFormComposite(getClient(), SWT.NULL);
-               
-               container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-               container.setLayout(new GridLayout());
                
                Set<Annotation> annotations = null;
-               if(getDescriptionElement() != null){
-                       annotations = getDescriptionElement().getAnnotations();
+               if(getEntity() != null){
+                       annotations = getEntity().getAnnotations();
                }
                
                if(annotations == null || annotations.size() == 0){
@@ -106,15 +61,6 @@ public class AnnotationSection extends AbstractDescriptionDetailSection {
                        }
                }
        }
-
-
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.AbstractDescriptionDetailSection#updateSection()
-        */
-       @Override
-       public void updateSection() {
-               internalUpdateSection(false);
-       }
        
        private class RemoveListener extends SelectionAdapter{
                private Annotation annotation;
@@ -128,11 +74,37 @@ public class AnnotationSection extends AbstractDescriptionDetailSection {
                 */
                @Override
                public void widgetSelected(SelectionEvent e) {
-                       
-                       AnnotatableEntity annotatedObjcet = annotation.getAnnotatedObj();
-                       
-                       annotatedObjcet.removeAnnotation(annotation);
+                       getEntity().removeAnnotation(annotation);
                        internalUpdateSection(true);
                }
        }
+       
+       
+
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.forms.AbstractEntitySetSection#getAddAction()
+        */
+       @Override
+       protected IAction getAddAction() {
+               Action addAnnotation = new Action("add", Action.AS_PUSH_BUTTON){
+                       /* (non-Javadoc)
+                        * @see org.eclipse.jface.action.Action#run()
+                        */
+                       @Override
+                       public void run() {
+                               String text = "";
+                               AnnotationType type = AnnotationType.EDITORIAL();
+                               Language language = CdmStore.getDefaultLanguage();
+                               
+                               Annotation annotation = Annotation.NewInstance(text, type, language);
+                               getEntity().addAnnotation(annotation);
+                               internalUpdateSection(true);
+                               if(! getSection().isExpanded())
+                                       getSection().setExpanded(true);
+                               internalUpdateSection(true);
+                       }
+               };
+               addAnnotation.setToolTipText("Create a new annotation");
+               return addAnnotation;
+       }       
 }
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/Container.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/Container.java
new file mode 100644 (file)
index 0000000..cad2cdc
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author nho
+ *
+ */
+public class Container extends AbstractFormComposite {
+
+       /**
+        * @param parent
+        * @param style
+        */
+       public Container(Composite parent, int style) {
+               super(parent, style);
+       }
+
+}
index c2c7915b0e403a70d1c1f0ef7ac0df58e1237d91..96b7048f714fef171667cedba9b7b966fa2549da 100644 (file)
@@ -3,6 +3,8 @@
  */
 package eu.etaxonomy.taxeditor.forms;
 
+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;
@@ -13,7 +15,7 @@ import eu.etaxonomy.cdm.model.common.DescriptionElementSource;
 /**
  * @author  nho
  */
-public class DescriptionElementSourceComposite extends FormComposite implements ModifyListener{
+public class DescriptionElementSourceComposite extends AbstractFormComposite implements IPropertyChangeListener{
 
        private DescriptionElementSource source;
        
@@ -26,13 +28,13 @@ public class DescriptionElementSourceComposite extends FormComposite implements
                this.source = source;
                
                citationSelection = new ReferenceSelectionComposite(this, "Citation", source.getCitation(), SWT.NULL);
-               citationSelection.addModifyListener(this);
+               citationSelection.addPropertyChangeListener(this);
                
                microCitation = new TextWithLabelComposite(this, "Citation Detail", source.getCitationMicroReference(), SWT.NULL);
-               microCitation.addModifyListener(this);
+               microCitation.addPropertyChangeListener(this);
         
         nameSelection = new NameSelectionComposite(this, "Name in Source", source.getNameUsedInSource(), SWT.NULL);
-        nameSelection.addModifyListener(this);
+        nameSelection.addPropertyChangeListener(this);
        }
        
        
@@ -43,13 +45,13 @@ public class DescriptionElementSourceComposite extends FormComposite implements
                return source;
        }
 
-
        /* (non-Javadoc)
-        * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
+        * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
         */
-       public void modifyText(ModifyEvent e) {
+       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
index 9c8a377ac89b2d55ea59fb301023cab6d81cff5c..ca86e91a324374fdf672d9bb2bc3ef6b6a6d7abc 100644 (file)
@@ -14,11 +14,12 @@ 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.AnnotatableEntity;
 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.description.DescriptionElementBase;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
-import eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.AbstractDescriptionDetailSection;
 
 /**
  * @author nho
@@ -57,8 +58,9 @@ public class EditorFormToolkit extends FormToolkit{
         * @param style
         * @return
         */
-       public FormComposite createFormComposite(Composite parent, int style){
-               return new FormComposite(parent, style);
+       public Container createContainer(Composite parent, int style){          
+               return new Container(parent, style);
+               
        }
        
        /**
@@ -153,6 +155,27 @@ public class EditorFormToolkit extends FormToolkit{
                return new TaxonSelectionComposite(parent, "Taxon", selection, style);
        }
        
+       /**
+        * 
+        * @param parent
+        * @param annotatableEntity
+        * @param style
+        * @return
+        */
+       public AnnotationSection createAnnotationSection(Composite parent, AnnotatableEntity annotatableEntity,  int style){
+               return new AnnotationSection(parent, annotatableEntity, style);
+       }
+       
+       /**
+        * 
+        * @param parent
+        * @param entity
+        * @param style
+        * @return
+        */
+       public OriginalSourceSection createOriginalSourceSection(Composite parent, DescriptionElementBase entity, int style){
+               return new OriginalSourceSection(parent, entity, style);
+       }
        
        
        /**
@@ -164,9 +187,8 @@ public class EditorFormToolkit extends FormToolkit{
         *            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());
+       public Section adapt(AbstractEditorFormSection section) {
+               section.setMenu(section.getParent().getMenu());
                adapt(section, true, true);
                if (section.getToggle() != null) {
                        section.getToggle().setHoverDecorationColor(getColors()
@@ -174,12 +196,16 @@ public class EditorFormToolkit extends FormToolkit{
                        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));
+               
+               section.setFont(boldFontHolder2.getBoldFont(section.getParent().getFont()));
+
+//             if ((section.getStyle() & Section.TITLE_BAR) != 0
+//                             || (section.getStyle() & Section.SHORT_TITLE_BAR) != 0) {
+                       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));
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
deleted file mode 100644 (file)
index b717de0..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * 
- */
-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/IPropertyChangeEmitter.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/IPropertyChangeEmitter.java
new file mode 100644 (file)
index 0000000..f065ef7
--- /dev/null
@@ -0,0 +1,23 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+
+/**
+ * @author nho
+ *
+ */
+public interface IPropertyChangeEmitter {
+
+       public void addPropertyChangeListener(IPropertyChangeListener listener);
+       
+       public void removePropertyChangeListener(IPropertyChangeListener listener);
+       
+       /**
+        * Notify registeres listeners of changed properties
+        */
+       public void firePropertyChangeEvent(PropertyChangeEvent event);
+}
index b7a2bc099a6038546ff69fff465ffc932441b7fd..7a739a6d0f9eca33fd9bb7912ef0a78df9de0c21 100644 (file)
@@ -18,7 +18,7 @@ import org.eclipse.swt.widgets.Display;
  * @author n.hoffmann
  *
  */
-public class ImageComposite extends FormComposite implements ControlListener{
+public class ImageComposite extends AbstractFormComposite implements ControlListener{
 
        private Browser browser;
        
index 27984ba137c2d0946d76c27d6a0c42fb60acd8ba..ea99a98f01828a508b3815dc145dff1f6ca50685 100644 (file)
@@ -29,9 +29,11 @@ public class NameSelectionComposite extends AbstractSelectionComposite<TaxonName
        /* (non-Javadoc)
         * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
         */
+       @Override
        public void widgetSelected(SelectionEvent e) {
-                selection = FilteredNameSelectionDialog.selectName(getShell(), selection);
-                updateText();
+               super.widgetSelected(e);
+               selection = FilteredNameSelectionDialog.selectName(getShell(), selection);
+               updateText();
        }
 
 }
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/OriginalSourceSection.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/forms/OriginalSourceSection.java
new file mode 100644 (file)
index 0000000..90a381e
--- /dev/null
@@ -0,0 +1,102 @@
+/**
+ * 
+ */
+package eu.etaxonomy.taxeditor.forms;
+
+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);
+       }       
+}
index 946e55fea3c77715a45e777ee9cf9789bba2b744..4b0639e7cf576a99298424b3c055994b44396faa 100644 (file)
@@ -29,7 +29,9 @@ public class ReferenceSelectionComposite extends AbstractSelectionComposite<Refe
        /* (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();
index d463e156db7c39a6c2e484c238ffa42398b3cef4..019de4ff8fd9e6eb43796b070871f573a699d53a 100644 (file)
@@ -28,7 +28,9 @@ public class TaxonSelectionComposite extends AbstractSelectionComposite<TaxonBas
        /* (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();
        }
index f3d38a062619e969a962b004dc1160785ce2a971..e7128b247d365461a9d5dc809fc9a8ded0face35 100644 (file)
@@ -18,7 +18,7 @@ import eu.etaxonomy.cdm.common.CdmUtils;
  * @author nho
  *
  */
-public class TextActionComposite extends FormComposite {
+public class TextActionComposite extends AbstractFormComposite {
 
        private Label label;
        private Text text;
index 6550fc2f70b39fa2d11182b3f094d7a3d37918ae..b0e3d461f5357ba3d623c5e0bc91f902315e3d3c 100644 (file)
@@ -4,6 +4,7 @@
 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.layout.GridData;
 import org.eclipse.swt.widgets.Composite;
@@ -16,7 +17,7 @@ import eu.etaxonomy.cdm.common.CdmUtils;
  * @author nho
  *
  */
-public class TextWithLabelComposite extends FormComposite {
+public class TextWithLabelComposite extends AbstractFormComposite implements ModifyListener{
        protected Text text;
        
        /**
@@ -32,28 +33,11 @@ public class TextWithLabelComposite extends FormComposite {
                
                text = toolkit.createText(this, "", SWT.BORDER | SWT.MULTI | SWT.WRAP);
                text.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+               text.addModifyListener(this);
                
                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
         * 
@@ -81,4 +65,11 @@ public class TextWithLabelComposite extends FormComposite {
                        text.addListener(SWT.Modify, listener);
                }
        }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
+        */
+       public void modifyText(ModifyEvent e) {
+               firePropertyChangeEvent(null);
+       }
 }