From e411b4b94ab047822f5dc5a351eef15ea12855ba Mon Sep 17 00:00:00 2001 From: "p.ciardelli" Date: Thu, 31 Jan 2008 18:09:22 +0000 Subject: [PATCH] Taxonomic tree and recent name data binding works, including for adding taxonomic children and edited name caches. Did away completely with TaxonList object, replaced with WritableList. --- .gitattributes | 4 +- .../taxeditor/prototype2/Activator.java | 33 ++- .../taxeditor/prototype2/Perspective.java | 3 - .../controller/OpenNameEditorAction.java | 9 +- .../controller/SaveTaxonAction.java | 12 +- .../model/NameTreeContentProvider.java | 72 ++--- .../ObservableListTreeContentProvider.java | 276 ------------------ .../taxeditor/prototype2/model/TaxonList.java | 250 ---------------- .../prototype2/view/AcceptedNameViewer.java | 2 +- .../prototype2/view/MultiPageTaxonView.java | 22 +- .../prototype2/view/NameEditorView.java | 203 ++++++------- .../prototype2/view/NameListView.java | 4 +- .../{NameViewer.java => NameViewer_.java} | 6 +- .../view/RecentNamesTableViewer.java | 6 +- .../prototype2/view/RelatedNameViewer.java | 2 +- .../prototype2/view/TaxonomicTreeViewer.java | 82 ++---- 16 files changed, 208 insertions(+), 778 deletions(-) delete mode 100644 eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/model/ObservableListTreeContentProvider.java delete mode 100644 eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/model/TaxonList.java rename eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/{NameViewer.java => NameViewer_.java} (95%) diff --git a/.gitattributes b/.gitattributes index c8e2c8c58..7bbbe2327 100644 --- a/.gitattributes +++ b/.gitattributes @@ -252,9 +252,7 @@ eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/pro eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/controller/SaveTaxonAction.java -text eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/model/NameEditorInput.java -text eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/model/NameTreeContentProvider.java -text -eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/model/ObservableListTreeContentProvider.java -text eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/model/PropertySheetNode.java -text -eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/model/TaxonList.java -text eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/AcceptedNameViewer.java -text eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/CarduusEditorView.java -text eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/EditNameProperties.java -text @@ -263,7 +261,7 @@ eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/pro eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/MultiPageTaxonView.java -text eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/NameEditorView.java -text eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/NameListView.java -text -eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/NameViewer.java -text +eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/NameViewer_.java -text eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/PilosellaEditorView.java -text eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/PropertySheetViewer.java -text eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/RecentNamesTableViewer.java -text diff --git a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/Activator.java b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/Activator.java index 8af39b211..70103a1ea 100644 --- a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/Activator.java +++ b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/Activator.java @@ -1,13 +1,12 @@ package eu.etaxonomy.taxeditor.prototype2; +import org.eclipse.core.databinding.observable.list.WritableList; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; import eu.etaxonomy.cdm.api.application.CdmApplicationController; -import eu.etaxonomy.cdm.model.name.TaxonNameBase; -import eu.etaxonomy.taxeditor.prototype2.model.TaxonList; /** @@ -18,7 +17,7 @@ public class Activator extends AbstractUIPlugin { /** * The plug-in ID */ - public static final String PLUGIN_ID = "eu.etaxonomy.mvctest"; + public static final String PLUGIN_ID = "eu.etaxonomy.taxeditor.prototype2.activator"; /** * The shared instance @@ -29,16 +28,15 @@ public class Activator extends AbstractUIPlugin { * The dataset of taxa for this session */ private CdmApplicationController cdmApp = new CdmApplicationController(); - private TaxonList taxonList = new TaxonList(); - private TaxonList recentNamesList = new TaxonList(); + private WritableList observableTaxonTreeList = null; + private WritableList observableRecentNamesList = null; /** * The constructor */ - public Activator() { - - taxonList.setTaxonList(cdmApp.getTaxonService().getRootTaxa(null)); + public Activator() { + } /* @@ -84,15 +82,22 @@ public class Activator extends AbstractUIPlugin { return getImageRegistry().get(key); } - public TaxonList getTaxonList() { - return taxonList; + public CdmApplicationController getCdmApp() { + return cdmApp; } - public TaxonList getRecentNamesList() { - return recentNamesList; + public WritableList getObservableTaxonTreeList() { + if (observableTaxonTreeList == null) { + observableTaxonTreeList = new WritableList(); + observableTaxonTreeList.addAll(cdmApp.getTaxonService().getRootTaxa(null)); + } + return observableTaxonTreeList; } - public CdmApplicationController getCdmApp() { - return cdmApp; + public WritableList getObservableRecentNamesList() { + if (observableRecentNamesList == null) { + observableRecentNamesList = new WritableList(); + } + return observableRecentNamesList; } } diff --git a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/Perspective.java b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/Perspective.java index 1f855cc7b..b3b78913d 100644 --- a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/Perspective.java +++ b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/Perspective.java @@ -1,12 +1,9 @@ package eu.etaxonomy.taxeditor.prototype2; -import org.eclipse.ui.IFolderLayout; import org.eclipse.ui.IPageLayout; import org.eclipse.ui.IPerspectiveFactory; -import org.eclipse.ui.IPlaceholderFolderLayout; import eu.etaxonomy.taxeditor.prototype2.view.NameListView; -import eu.etaxonomy.taxeditor.prototype2.view.UndoView; public class Perspective implements IPerspectiveFactory { diff --git a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/controller/OpenNameEditorAction.java b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/controller/OpenNameEditorAction.java index b9d97dadf..929c7111e 100644 --- a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/controller/OpenNameEditorAction.java +++ b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/controller/OpenNameEditorAction.java @@ -41,10 +41,11 @@ public class OpenNameEditorAction extends Action { public void run() { // if this is a non-empty taxon being opened for the first time, - // add to recent names list - if (taxon.getName().getNameCache() != null && !Activator.getDefault().getRecentNamesList().contains(taxon)) - Activator.getDefault().getRecentNamesList().add(taxon); - + // add to recent names list + if (taxon.getName().getNameCache() != null && + !Activator.getDefault().getObservableRecentNamesList().contains(taxon)) + Activator.getDefault().getObservableRecentNamesList().add(taxon); + IEditorInput input = new NameEditorInput(taxon); try { Activator.getDefault().getWorkbench().getActiveWorkbenchWindow(). diff --git a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/controller/SaveTaxonAction.java b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/controller/SaveTaxonAction.java index 640703ebf..982b9d2af 100644 --- a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/controller/SaveTaxonAction.java +++ b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/controller/SaveTaxonAction.java @@ -19,6 +19,16 @@ public class SaveTaxonAction extends Action { } public void run() { + + // If this is a new taxon, add it to the tax. tree and recent names + if (!Activator.getDefault().getObservableTaxonTreeList().contains(taxon)) { + Activator.getDefault().getObservableTaxonTreeList().add(taxon); + Activator.getDefault().getObservableRecentNamesList().add(taxon); + } + Activator.getDefault().getCdmApp().getTaxonService().saveTaxon(taxon); + + // Notify taxon listeners in case name has been updated + taxon.firePropertyChange("name", null, null); } -} +} \ No newline at end of file diff --git a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/model/NameTreeContentProvider.java b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/model/NameTreeContentProvider.java index 2482799f2..81747fca7 100644 --- a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/model/NameTreeContentProvider.java +++ b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/model/NameTreeContentProvider.java @@ -1,5 +1,8 @@ package eu.etaxonomy.taxeditor.prototype2.model; +import java.util.Set; + +import org.eclipse.core.databinding.observable.Realm; import org.eclipse.core.databinding.observable.list.IListChangeListener; import org.eclipse.core.databinding.observable.list.IObservableList; import org.eclipse.core.databinding.observable.list.ListChangeEvent; @@ -7,30 +10,31 @@ import org.eclipse.core.databinding.observable.list.ListDiffEntry; import org.eclipse.core.databinding.observable.list.WritableList; import org.eclipse.core.databinding.observable.set.IObservableSet; import org.eclipse.core.databinding.observable.set.WritableSet; +import org.eclipse.core.runtime.Assert; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.jface.databinding.viewers.ObservableListContentProvider; -import org.eclipse.jface.viewers.AbstractListViewer; import org.eclipse.jface.viewers.ITreeContentProvider; -import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.widgets.Display; +import eu.etaxonomy.cdm.model.taxon.Taxon; +import eu.etaxonomy.taxeditor.prototype2.view.TaxonomicTreeViewer; + public class NameTreeContentProvider extends ObservableListContentProvider implements ITreeContentProvider { public Object[] getChildren(Object parentElement) { - // TODO Auto-generated method stub - return null; + Set children = ((Taxon) parentElement).getTaxonomicChildren(); + observableList.addAll(children); + return children == null ? new Object[0] : children.toArray(); } public Object getParent(Object element) { - // TODO Auto-generated method stub - return null; + return ((Taxon) element).getTaxonomicParent(); } public boolean hasChildren(Object element) { - // TODO Auto-generated method stub - return false; + return ((Taxon) element).hasTaxonomicChildren(); } private IObservableList observableList; @@ -45,22 +49,19 @@ public class NameTreeContentProvider extends ObservableListContentProvider ListDiffEntry[] differences = event.diff.getDifferences(); for (int i = 0; i < differences.length; i++) { ListDiffEntry entry = differences[i]; + if (entry.isAddition()) { + knownElements.add(entry.getElement()); - if (viewer instanceof AbstractListViewer) { - ((AbstractListViewer) viewer).add(entry.getElement()); - } else { - ((TableViewer) viewer).insert(entry.getElement(), entry - .getPosition()); - } + + ((TaxonomicTreeViewer) viewer).add( + ((Taxon) entry.getElement()).getTaxonomicParent(), + entry.getElement()); } else { - if (viewer instanceof AbstractListViewer) { - ((AbstractListViewer) viewer) - .remove(entry.getElement()); - } else { - ((TableViewer) viewer).remove(entry.getElement()); - } + knownElements.remove(entry.getElement()); + + ((TaxonomicTreeViewer) viewer).remove(entry.getElement()); } } } @@ -72,6 +73,9 @@ public class NameTreeContentProvider extends ObservableListContentProvider * */ public NameTreeContentProvider() { + + Assert.isNotNull(Realm.getDefault()); + observableList = new WritableList(SWTObservables.getRealm(Display.getDefault())); knownElements = new WritableSet(SWTObservables.getRealm(Display.getDefault())); } @@ -87,24 +91,10 @@ public class NameTreeContentProvider extends ObservableListContentProvider public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.viewer = viewer; -// if (!(viewer instanceof TableViewer || viewer instanceof AbstractListViewer)) { -// // use reflection to avoid 3.3 dependency: -// Class abstractTableViewerClass = null; -// try { -// abstractTableViewerClass = Class.forName("org.eclipse.jface.viewers.AbstractTableViewer"); //$NON-NLS-1$ -// } catch(Exception ex) { -// // ignore, we might be running against 3.2 -// } -// if (abstractTableViewerClass == null || !abstractTableViewerClass.isInstance(viewer)) { -// throw new IllegalArgumentException( -// "This content provider only works with (Abstract)TableViewer or AbstractListViewer"); //$NON-NLS-1$ -// } -// } -// -// if (newInput != null && !(newInput instanceof IObservableList)) { -// throw new IllegalArgumentException( -// "This content provider only works with input of type IObservableList"); //$NON-NLS-1$ -// } + if (newInput != null && !(newInput instanceof IObservableList)) { + throw new IllegalArgumentException( + "This content provider only works with input of type IObservableList"); //$NON-NLS-1$ + } setInput((IObservableList) newInput); } @@ -113,7 +103,7 @@ public class NameTreeContentProvider extends ObservableListContentProvider * @param list */ private void setInput(IObservableList list) { - + if (list == null) { list = new WritableList(SWTObservables.getRealm(Display.getDefault())); } @@ -127,6 +117,7 @@ public class NameTreeContentProvider extends ObservableListContentProvider observableList = list; knownElements.addAll(list); + observableList.addListChangeListener(listener); } @@ -139,5 +130,4 @@ public class NameTreeContentProvider extends ObservableListContentProvider public IObservableSet getKnownElements() { return knownElements; } - -} +} \ No newline at end of file diff --git a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/model/ObservableListTreeContentProvider.java b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/model/ObservableListTreeContentProvider.java deleted file mode 100644 index 70d553059..000000000 --- a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/model/ObservableListTreeContentProvider.java +++ /dev/null @@ -1,276 +0,0 @@ -package eu.etaxonomy.taxeditor.prototype2.model; - -/************************************************************************************************************ - * Copyright (c) 2006, 2007 IBM Corporation and others. All rights reserved. This program and the - * accompanying materials are made available under the terms of the Eclipse Public License v1.0 which - * accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: IBM Corporation - initial API and implementation - ***********************************************************************************************************/ -import java.util.*; - -import org.eclipse.core.databinding.observable.Observables; -import org.eclipse.core.databinding.observable.list.*; -import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory; -import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.viewers.*; -import org.eclipse.swt.widgets.Control; - -/** - * @since 1.1 - */ -public class ObservableListTreeContentProvider implements ITreeContentProvider { - class TreeNode implements IListChangeListener { - private Object element; - - private Object parent; - private Set parents; - - private IObservableList children; - private boolean observingChildren = false; - - TreeNode( Object element ) { - Assert.isNotNull( element ); - this.element = element; - this.children = (IObservableList) factory.createObservable( element ); - if ( children == null ) { - children = Observables.emptyObservableList(); - observingChildren = true; - } - } - - Object getElement() { - return element; - } - - void addParent( Object parent ) { - if ( this.parent == null ) { - this.parent = parent; - } else { - if ( parent.equals( this.parent ) ) - return; - if ( parents == null ) { - parents = new HashSet(); - parents.add( this.parent ); - } - parents.add( parent ); - } - } - - void removeParent( Object parent ) { - if ( this.parents != null ) - parents.remove( parent ); - - if ( parent == this.parent ) { - if ( parents == null || parents.isEmpty() ) - this.parent = null; - else - this.parent = parents.iterator().next(); - } - - if ( this.parents != null && this.parents.size() <= 1 ) - this.parents = null; - } - - Object getParent() { - return parent; - } - - Set getParents() { - if ( parents == null ) { - if ( parent == null ) - return Collections.EMPTY_SET; - return Collections.singleton( parent ); - } - return parents; - } - - boolean hasChildren() { - if ( children == null ) - return true; - return !children.isEmpty(); - } - - IObservableList getChildren() { - observeChildren(); - return children; - } - - /* Only called by ObservableListTreeContentProvider when the element and node are removed */ - void dispose() { - disposeChildren(); - element = null; - parent = null; - parents = null; - } - - private void observeChildren() { - if ( !observingChildren ) { - children.addListChangeListener( this ); - observingChildren = true; - } - } - - private void disposeChildren() { - if ( children != null ) { - for ( Iterator iterator = children.iterator(); iterator.hasNext(); ) - removeElementNode( iterator.next() ); - if ( observingChildren ) { - children.removeListChangeListener( this ); - observingChildren = false; - } - children.dispose(); - children = null; - } - } - - public void handleListChange( ListChangeEvent event ) { - if ( isViewerControlDisposed() ) { - ObservableListTreeContentProvider.this.dispose(); - return; - } - - if ( event.getSource() == children ) { - ListDiffEntry[] diffs = event.diff.getDifferences(); - for ( int i = 0; i < diffs.length; i++ ) { - ListDiffEntry diff = diffs[i]; - Object child = diff.getElement(); - if ( diff.isAddition() ) - add( element, child, diff.getPosition() ); - else - remove( element, child ); - } - } - } - } - - private IObservableFactory factory; - private AbstractTreeViewer viewer; - - // Map < Object element, TreeNode node > - private Map elementNodes; - - /** - * A tree content provider which uses the passed in factory to obtain the elements of the tree. - *

- * - * @param factory factory that produces IObservableLists as children - */ - public ObservableListTreeContentProvider( IObservableFactory factory ) { - Assert.isNotNull( factory ); - this.factory = factory; - this.elementNodes = new HashMap(); - } - - public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) { - setViewer( viewer ); - - if ( oldInput != null ) - removeElementNode( oldInput ); - - if ( newInput != null ) - getOrCreateNode( newInput ).getChildren(); - } - - private void setViewer( Viewer viewer ) { - if ( this.viewer == viewer ) - return; - if ( viewer != null ) - if ( !( viewer instanceof AbstractTreeViewer ) ) - throw new IllegalArgumentException( "This content provider only works with AbstractTreeViewer" ); //$NON-NLS-1$ - this.viewer = (AbstractTreeViewer) viewer; - } - - // implies viewer.refresh(inputElement) - public Object[] getElements( Object inputElement ) { - TreeNode rootNode = getOrCreateNode( inputElement ); - - IObservableList elements = rootNode.getChildren(); - setParent( inputElement, elements ); - - return elements.toArray(); - } - - public boolean hasChildren( Object element ) { - return getOrCreateNode( element ).hasChildren(); - } - - // implies viewer.refresh(parentElement); - public Object[] getChildren( Object parentElement ) { - IObservableList children = getOrCreateNode( parentElement ).getChildren(); - - setParent( parentElement, children ); - - return children.toArray(); - } - - public Object getParent( Object element ) { - return getOrCreateNode( element ).getParent(); - } - - TreeNode getOrCreateNode( Object element ) { - TreeNode node = getExistingNode( element ); - if ( node == null ) - node = createNode( element ); - return node; - } - - private TreeNode getExistingNode( Object element ) { - TreeNode node = (TreeNode) elementNodes.get( element ); - return node; - } - - private TreeNode createNode( Object element ) { - TreeNode node = new TreeNode( element ); - elementNodes.put( element, node ); - return node; - } - - private void setParent( Object parent, List children ) { - for ( Iterator iterator = children.iterator(); iterator.hasNext(); ) { - Object element = iterator.next(); - TreeNode node = getOrCreateNode( element ); - node.addParent( parent ); - } - } - - void add( Object parent, Object element, int position ) { - getOrCreateNode( element ).addParent( parent ); - viewer.insert( parent, element, position ); - } - - void remove( Object parent, Object element ) { - viewer.remove( parent, new Object[] { element } ); - removeElementNode( element ); - } - - private void removeElementNode( Object element ) { - TreeNode node = getExistingNode( element ); - if ( node != null ) - removeNode( node ); - } - - private void removeNode( TreeNode node ) { - elementNodes.remove( node.getElement() ); - node.dispose(); - } - - private boolean isViewerControlDisposed() { - if ( viewer == null ) - return false; - Control control = viewer.getControl(); - if ( control == null ) - return false; - return control.isDisposed(); - } - - public void dispose() { - Object[] elements = elementNodes.keySet().toArray(); - for ( int i = 0; i < elements.length; i++ ) - removeElementNode( elements[i] ); - elementNodes.clear(); - elementNodes = null; - - setViewer( null ); - } -} \ No newline at end of file diff --git a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/model/TaxonList.java b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/model/TaxonList.java deleted file mode 100644 index a8356b17f..000000000 --- a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/model/TaxonList.java +++ /dev/null @@ -1,250 +0,0 @@ -package eu.etaxonomy.taxeditor.prototype2.model; - -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; - -import org.eclipse.core.databinding.observable.IChangeListener; -import org.eclipse.core.databinding.observable.IStaleListener; -import org.eclipse.core.databinding.observable.Realm; -import org.eclipse.core.databinding.observable.list.IListChangeListener; -import org.eclipse.core.databinding.observable.list.IObservableList; - -import eu.etaxonomy.cdm.model.taxon.Taxon; - -/** - * List exists mainly to catch "add taxon" events, which require - * the taxonomic tree to be updated. - * - * @author p.ciardelli - * - */ -public class TaxonList implements IObservableList { - - private List taxonList = new ArrayList(); - - public void add(Taxon taxon) { - this.taxonList.add(0, taxon); - firePropertyChange("taxonList", null, null); //$NON-NLS-1$ - } - - public void remove(Taxon taxon) { - this.taxonList.remove(taxon); - firePropertyChange("taxonList", null, null); //$NON-NLS-1$ - } - - public Taxon[] toArray() { - return (Taxon[]) this.taxonList.toArray(new Taxon[this.taxonList.size()]); - } - - public List getTaxonList() { - return taxonList; - } - - public boolean contains(Taxon taxon) { - if (taxonList.contains(taxon)) - return true; - return false; - } - public void setTaxonList(List taxonList) { - this.taxonList = taxonList; - } - - public void setTaxonList(Taxon rootTaxa) { - this.taxonList.add(rootTaxa); - } - - protected final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); - public void addPropertyChangeListener(PropertyChangeListener listener) { - propertyChangeSupport.addPropertyChangeListener(listener); - } - - public void addPropertyChangeListener(String propertyName, - PropertyChangeListener listener) { - propertyChangeSupport.addPropertyChangeListener(propertyName, listener); - } - - public void removePropertyChangeListener(PropertyChangeListener listener) { - propertyChangeSupport.removePropertyChangeListener(listener); - } - - public void removePropertyChangeListener(String propertyName, - PropertyChangeListener listener) { - propertyChangeSupport.removePropertyChangeListener(propertyName, - listener); - } - - protected void firePropertyChange(String propertyName, Object oldValue, - Object newValue) { - try { - propertyChangeSupport.firePropertyChange(propertyName, oldValue, - newValue); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public boolean add(Object o) { - // TODO Auto-generated method stub - return false; - } - - public boolean addAll(Collection c) { - // TODO Auto-generated method stub - return false; - } - - public boolean addAll(int index, Collection c) { - // TODO Auto-generated method stub - return false; - } - - public void addListChangeListener(IListChangeListener listener) { - // TODO Auto-generated method stub - - } - - public boolean contains(Object o) { - // TODO Auto-generated method stub - return false; - } - - public boolean containsAll(Collection c) { - // TODO Auto-generated method stub - return false; - } - - public Object get(int index) { - // TODO Auto-generated method stub - return null; - } - - public Object getElementType() { - // TODO Auto-generated method stub - return null; - } - - public int indexOf(Object o) { - // TODO Auto-generated method stub - return 0; - } - - public boolean isEmpty() { - // TODO Auto-generated method stub - return false; - } - - public Iterator iterator() { - // TODO Auto-generated method stub - return null; - } - - public int lastIndexOf(Object o) { - // TODO Auto-generated method stub - return 0; - } - - public ListIterator listIterator() { - // TODO Auto-generated method stub - return null; - } - - public ListIterator listIterator(int index) { - // TODO Auto-generated method stub - return null; - } - - public boolean remove(Object o) { - // TODO Auto-generated method stub - return false; - } - - public Object remove(int index) { - // TODO Auto-generated method stub - return null; - } - - public boolean removeAll(Collection c) { - // TODO Auto-generated method stub - return false; - } - - public void removeListChangeListener(IListChangeListener listener) { - // TODO Auto-generated method stub - - } - - public boolean retainAll(Collection c) { - // TODO Auto-generated method stub - return false; - } - - public Object set(int index, Object element) { - // TODO Auto-generated method stub - return null; - } - - public int size() { - // TODO Auto-generated method stub - return 0; - } - - public List subList(int fromIndex, int toIndex) { - // TODO Auto-generated method stub - return null; - } - - public Object[] toArray(Object[] a) { - // TODO Auto-generated method stub - return null; - } - - public void add(int index, Object element) { - // TODO Auto-generated method stub - - } - - public void clear() { - // TODO Auto-generated method stub - - } - - public void addChangeListener(IChangeListener listener) { - // TODO Auto-generated method stub - - } - - public void addStaleListener(IStaleListener listener) { - // TODO Auto-generated method stub - - } - - public void dispose() { - // TODO Auto-generated method stub - - } - - public Realm getRealm() { - // TODO Auto-generated method stub - return null; - } - - public boolean isStale() { - // TODO Auto-generated method stub - return false; - } - - public void removeChangeListener(IChangeListener listener) { - // TODO Auto-generated method stub - - } - - public void removeStaleListener(IStaleListener listener) { - // TODO Auto-generated method stub - - } -} diff --git a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/AcceptedNameViewer.java b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/AcceptedNameViewer.java index 15adaaaae..67c32eb3c 100644 --- a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/AcceptedNameViewer.java +++ b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/AcceptedNameViewer.java @@ -7,7 +7,7 @@ import org.eclipse.swt.widgets.Composite; import com.swtdesigner.SWTResourceManager; -public class AcceptedNameViewer extends NameViewer { +public class AcceptedNameViewer extends NameViewer_ { AcceptedNameViewer(TaxonName taxonName, DataBindingContext bindingContext, Composite parent) { diff --git a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/MultiPageTaxonView.java b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/MultiPageTaxonView.java index b42d7ed37..5d8f11506 100644 --- a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/MultiPageTaxonView.java +++ b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/MultiPageTaxonView.java @@ -1,7 +1,8 @@ package eu.etaxonomy.taxeditor.prototype2.view; -import org.eclipse.core.databinding.DataBindingContext; -import org.eclipse.core.databinding.beans.BeansObservables; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; @@ -10,7 +11,6 @@ import org.eclipse.ui.part.MultiPageEditorPart; import eu.etaxonomy.cdm.model.taxon.Taxon; - /** * * Generates the tabbed editor with Name view on top and tabs for @@ -23,7 +23,6 @@ public class MultiPageTaxonView extends MultiPageEditorPart { public static final String ID = "eu.etaxonomy.taxeditor.prototype2.view.multipagetaxonview"; private Taxon taxon; - private DataBindingContext bindingContext; @Override protected void createPages() { @@ -45,6 +44,8 @@ public class MultiPageTaxonView extends MultiPageEditorPart { // TODO Auto-generated catch block e.printStackTrace(); } + +// bindPartName(); } @Override @@ -72,12 +73,23 @@ public class MultiPageTaxonView extends MultiPageEditorPart { throw new PartInitException( "Invalid Input: Must be IFileEditorInput"); + // Get taxon from editor input if (input.getAdapter(Taxon.class) != null) { taxon = (Taxon) input.getAdapter(Taxon.class); } else { taxon = null; } - + + // Listen for name changes fired when taxon is saved; + // change tab for this taxon editor accordingly + taxon.addPropertyChangeListener("name", new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent e) { + setPartName(taxon.getName().getNameCache()); + } + }); + + // Any taxon that has been saved will by necessity have a name; + // only a new taxon will not if (taxon.getName().getNameCache() == null) setPartName("New taxon"); else diff --git a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/NameEditorView.java b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/NameEditorView.java index 10cee8fab..48b18b164 100644 --- a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/NameEditorView.java +++ b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/NameEditorView.java @@ -1,8 +1,11 @@ package eu.etaxonomy.taxeditor.prototype2.view; import java.beans.IntrospectionException; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @@ -52,13 +55,18 @@ import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.EditorPart; +import org.eclipse.ui.part.WorkbenchPart; import com.swtdesigner.ResourceManager; import com.swtdesigner.SWTResourceManager; import eu.etaxonomy.cdm.model.name.BotanicalName; +import eu.etaxonomy.cdm.model.name.NameRelationshipType; import eu.etaxonomy.cdm.model.name.TaxonNameBase; +import eu.etaxonomy.cdm.model.taxon.SynonymRelationship; +import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType; import eu.etaxonomy.cdm.model.taxon.Taxon; +import eu.etaxonomy.cdm.model.taxon.TaxonRelationship; import eu.etaxonomy.taxeditor.prototype2.Activator; import eu.etaxonomy.taxeditor.prototype2.controller.DeleteTaxonAction; import eu.etaxonomy.taxeditor.prototype2.controller.OpenNameEditorAction; @@ -79,7 +87,6 @@ import eu.etaxonomy.taxeditor.prototype2.view.propertysheetsupport.PropertySheet import eu.etaxonomy.taxeditor.prototype2.view.propertysheetsupport.PropertySheetValueLabelProvider; public class NameEditorView extends EditorPart { - /** * The taxon the editor is editing */ @@ -88,6 +95,21 @@ public class NameEditorView extends EditorPart { * The higher taxon of the taxon the editor is editing */ private Taxon higherTaxon = null; + /** + * The workbench part that contains this editor, + * i.e. MultiPageTaxonView + */ + private WorkbenchPart parentPart = null; + /** + * Shared listener that sets dirty state to true + * when any registered property changes + */ + private PropertyChangeListener taxonChangeListener = new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent arg0) { + dirtyBoy = true; + firePropertyChange(PROP_DIRTY); + } + }; /** * Arrays for the creation of synonyms - text and images */ @@ -109,10 +131,10 @@ public class NameEditorView extends EditorPart { "orthovariant_no_bg.gif", "misapplied_no_bg.gif", "concept_no_bg.gif"}; - /* - * Annotation model + String [] conceptTypes = {"congruent","included in","includes","overlaps","excludes","doubtful"}; + /** + * If true, show "save" prompt before closing editor */ - private AnnotationModel fAnnotationModel = new AnnotationModel(); public boolean dirtyBoy = false; String clickText; @@ -123,13 +145,19 @@ public class NameEditorView extends EditorPart { public static final String ID = "eu.etaxonomy.taxeditor.prototype2.view.nameeditorview"; //$NON-NLS-1$ + public NameEditorView() { + + } + public NameEditorView(WorkbenchPart parentPart) { + this.parentPart = parentPart; + } /** * Create contents of the editor part * @param parent */ @Override public void createPartControl(Composite parent) { - + parent.setLayout(new GridLayout()); parent.setRedraw(true); @@ -163,30 +191,28 @@ public class NameEditorView extends EditorPart { // toolBar.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY)); final ToolItem itemSave = new ToolItem(toolBar, SWT.PUSH); -// final CoolItem itemSave = new CoolItem(coolBar, SWT.PUSH); -// itemSave.setToolTipText("Save taxon \"" + taxon.getName().getNameCache() + "\""); itemSave.setToolTipText("Save taxon"); itemSave.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/save_edit.gif")); itemSave.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { + dirtyBoy = false; new SaveTaxonAction(taxon).run(); } public void widgetSelected(SelectionEvent e) { + dirtyBoy = false; new SaveTaxonAction(taxon).run(); } }); final ToolItem itemMove = new ToolItem(toolBar, SWT.DROP_DOWN); -// itemMove.setToolTipText("Move taxon \"" + taxon.getName().getNameCache() + "\""); itemMove.setToolTipText("Move taxon"); final Menu menuMove = new Menu(toolBar); addDropDown(itemMove, menuMove); - final MenuItem moveTaxonpilosellaMenuItem = new MenuItem(menuMove, SWT.NONE); -// moveTaxonpilosellaMenuItem.setText("Move taxon \"" + taxon.getName().getNameCache() + "\" to another higher taxon"); - moveTaxonpilosellaMenuItem.setText("Move taxon to another higher taxon"); - moveTaxonpilosellaMenuItem.addSelectionListener(new SelectionAdapter() { + final MenuItem moveTaxonMenuItem = new MenuItem(menuMove, SWT.NONE); + moveTaxonMenuItem.setText("Move taxon to another higher taxon"); + moveTaxonMenuItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(final SelectionEvent e) { new MoveDialogView(getSite().getShell()); MoveDialogView dialog = new MoveDialogView(getSite().getShell()); @@ -194,11 +220,10 @@ public class NameEditorView extends EditorPart { } }); - final MenuItem turnTaxonpilosellaMenuItem = new MenuItem(menuMove, SWT.NONE); - turnTaxonpilosellaMenuItem.setSelection(true); -// turnTaxonpilosellaMenuItem.setText("Turn taxon \"" + taxon.getName().getNameCache() + "\" into a synonym"); - turnTaxonpilosellaMenuItem.setText("Turn taxon's accepted name into a synonym"); - turnTaxonpilosellaMenuItem.addSelectionListener(new SelectionAdapter() { + final MenuItem taxonToSynonymMenuItem = new MenuItem(menuMove, SWT.NONE); + taxonToSynonymMenuItem.setSelection(true); + taxonToSynonymMenuItem.setText("Turn taxon's accepted name into a synonym"); + taxonToSynonymMenuItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(final SelectionEvent e) { new MoveDialogView(getSite().getShell()); MoveDialogView dialog = new MoveDialogView(getSite().getShell()); @@ -209,7 +234,6 @@ public class NameEditorView extends EditorPart { itemMove.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/correction_change.gif")); final ToolItem itemDelete = new ToolItem(toolBar, SWT.NONE); -// itemDelete.setToolTipText("Delete taxon \"" + taxon.getName().getNameCache() + "\""); itemDelete.setToolTipText("Delete taxon"); itemDelete.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/delete_edit.gif")); itemDelete.addSelectionListener(new SelectionListener() { @@ -226,8 +250,6 @@ public class NameEditorView extends EditorPart { final ToolItem separator1 = new ToolItem(toolBar, SWT.SEPARATOR); final ToolItem itemAddRelationship = new ToolItem(toolBar, SWT.DROP_DOWN); -// itemAddRelationship.setToolTipText("Add nom. or tax. relation to \"" + -// taxon.getName().getNameCache() + "\""); itemAddRelationship.setToolTipText("Add nom. or tax. relation to taxon"); itemAddRelationship.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/rel_no_bg.gif")); @@ -235,73 +257,35 @@ public class NameEditorView extends EditorPart { * Create menu to add relations to the taxon */ final Menu menuAddRel = new Menu(toolBar); -// menuAddRel.setData("x", null); addDropDown(itemAddRelationship, menuAddRel); -// for (int i= 0; i < relTypes.length; i++) { -// final MenuItem menuItem = new MenuItem(menuAddRel, SWT.NONE); -// menuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/" + relImgs[i])); -// menuItem.setText("Add " + relTypes[i]); -// } - - final MenuItem testMenuItem = new MenuItem(menuAddRel, SWT.NONE); - testMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/unknown_no_bg.gif")); - testMenuItem.setText("Add synonym (type unknown)"); - - final MenuItem addHomotypicSynonymMenuItem = new MenuItem(menuAddRel, SWT.NONE); - addHomotypicSynonymMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/homosyn_no_bg.gif")); - addHomotypicSynonymMenuItem.setText("Add homotypic synonym"); - - final MenuItem addHeterotypicSynoynmMenuItem = new MenuItem(menuAddRel, SWT.NONE); - addHeterotypicSynoynmMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/heterosyn_no_bg.gif")); - addHeterotypicSynoynmMenuItem.setText("Add heterotypic synoynm"); - - final MenuItem addBasionymMenuItem = new MenuItem(menuAddRel, SWT.NONE); - addBasionymMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/basionym_no_bg.gif")); - addBasionymMenuItem.setText("Add basionym"); - - final MenuItem addReplacedSynonymMenuItem = new MenuItem(menuAddRel, SWT.NONE); - addReplacedSynonymMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/repsyn_no_bg.gif")); - addReplacedSynonymMenuItem.setText("Add replaced synonym"); - - final MenuItem addHomonymMenuItem = new MenuItem(menuAddRel, SWT.NONE); - addHomonymMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/homonym_no_bg.gif")); - addHomonymMenuItem.setText("Add homonym"); - - final MenuItem addOrthographicVariantMenuItem = new MenuItem(menuAddRel, SWT.NONE); - addOrthographicVariantMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/orthovariant_no_bg.gif")); - addOrthographicVariantMenuItem.setText("Add orthographic variant"); - - final MenuItem addMisappliedNameMenuItem = new MenuItem(menuAddRel, SWT.NONE); - addMisappliedNameMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/misapplied_no_bg.gif")); - addMisappliedNameMenuItem.setText("Add misapplied name"); - - final MenuItem addConceptRelationMenuItem_1 = new MenuItem(menuAddRel, SWT.CASCADE); - addConceptRelationMenuItem_1.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/concept_no_bg.gif")); - addConceptRelationMenuItem_1.setText("Add concept relation"); - - final Menu menu = new Menu(addConceptRelationMenuItem_1); - addConceptRelationMenuItem_1.setMenu(menu); - - final MenuItem checkboxMenuItem = new MenuItem(menu, SWT.CHECK); - checkboxMenuItem.setText("congruent"); - - final MenuItem checkboxMenuItem_1 = new MenuItem(menu, SWT.CHECK); - checkboxMenuItem_1.setSelection(true); - checkboxMenuItem_1.setText("included in"); - - final MenuItem checkboxMenuItem_2 = new MenuItem(menu, SWT.CHECK); - checkboxMenuItem_2.setText("includes"); - - final MenuItem checkboxMenuItem_3 = new MenuItem(menu, SWT.CHECK); - checkboxMenuItem_3.setText("overlaps"); - - final MenuItem checkboxMenuItem_4 = new MenuItem(menu, SWT.CHECK); - checkboxMenuItem_4.setText("excludes"); + for (int i = 0; i < relTypes.length; i++) { + final MenuItem menuItem; + if (relTypes[i].contains("concept")) { + menuItem = new MenuItem(menuAddRel, SWT.CASCADE); + + final Menu conceptMenu = new Menu(menuItem); + menuItem.setMenu(conceptMenu); + + for (int j = 0; j < conceptTypes.length; j++) { + final MenuItem conceptMenuItem = new MenuItem(conceptMenu, SWT.CHECK); + conceptMenuItem.setText(conceptTypes[j]); + } + } else { + menuItem = new MenuItem(menuAddRel, SWT.NONE); + } + + menuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/" + relImgs[i])); + menuItem.setText("Add " + relTypes[i]); + } - final MenuItem checkboxMenuItem_5 = new MenuItem(menu, SWT.CHECK); - checkboxMenuItem_5.setSelection(true); - checkboxMenuItem_5.setText("doubtful"); +// SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF() +// SynonymRelationshipType.HOMOTYPIC_SYNONYM_OF() +// SynonymRelationshipType.PARTIAL_SYNONYM_OF() +// SynonymRelationshipType.PRO_PARTE_SYNONYM_OF() +// SynonymRelationshipType.SYNONYM_OF() +// NameRelationshipType.BASIONYM() +// NameRelationshipType.LATER_HOMONYM() final ToolItem separator2 = new ToolItem(toolBar, SWT.SEPARATOR); @@ -329,7 +313,6 @@ public class NameEditorView extends EditorPart { }); } final MenuItem addTaxonItem = new MenuItem(menuAdd, SWT.NONE); -// addTaxonItem.setText("Add new taxon to \"" + taxon.getName().getNameCache() + "\""); addTaxonItem.setText("Add new taxon to this taxon"); addTaxonItem.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { @@ -351,7 +334,7 @@ public class NameEditorView extends EditorPart { contentComposite.setLayout(gridLayout_2); contentComposite.setRedraw(true); - nameComposite = new Composite(contentComposite, SWT.NONE); + nameComposite = new Composite(contentComposite, SWT.BORDER); nameComposite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); nameComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true)); nameComposite.setLayout(new GridLayout()); @@ -359,7 +342,7 @@ public class NameEditorView extends EditorPart { nameComposite.setRedraw(true); // clickText = "Click here to start entering accepted name or enter its individual fields in the property sheet to the right"; -// NameViewer acceptedNameViewer = new AcceptedNameViewer(taxon, bindingContext, nameComposite); +// NameViewer_ acceptedNameViewer = new AcceptedNameViewer(taxon, bindingContext, nameComposite); // acceptedNameViewer.setBindingContext(bindingContext); // acceptedNameViewer.configure(new NameViewerConfig()); @@ -394,6 +377,18 @@ public class NameEditorView extends EditorPart { private SourceViewer createAcceptedName() { +// Method[] methods = BotanicalName.class.getMethods(); +// for (int i = 0; i < methods.length; i++) { +// System.out.println("Annotations:"); +// for (int j = 0; i < methods[j].getAnnotations().length; j++) +// System.out.println("\t" + methods[i].getAnnotations()[j]); +// System.out.println("Type: " + methods[i].getReturnType().toString()); +// System.out.println("Name:" + methods[i].getName()); +// System.out.println(); +// } + // use annotations to find persistent methods + + // PropertyDescriptor descriptor; // try { // descriptor = new PropertyDescriptor("genus", taxonname.getClass()); @@ -418,7 +413,7 @@ public class NameEditorView extends EditorPart { final SourceViewer sourceViewer = createSourceViewer(taxon.getName()); sourceViewer.getTextWidget().setLayoutData( - new GridData(SWT.FILL, SWT.CENTER, true, false, 2 , 1)); + new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); sourceViewer.getTextWidget().setFont( SWTResourceManager.getFont("Georgia", 12, SWT.NONE)); @@ -437,8 +432,8 @@ public class NameEditorView extends EditorPart { sourceViewer.getTextWidget().setText(""); sourceViewer.getTextWidget().setFont(SWTResourceManager.getFont("Georgia", 12, SWT.NONE)); sourceViewer.getTextWidget().setForeground(SWTResourceManager.getColor(0, 0, 0)); - dirtyBoy = true; - firePropertyChange(PROP_DIRTY); +// dirtyBoy = true; +// firePropertyChange(PROP_DIRTY); } } public void focusLost(FocusEvent e) { @@ -489,21 +484,6 @@ public class NameEditorView extends EditorPart { ctlChooseRelType.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); ((Label) ctlChooseRelType).setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/unknown_no_bg.gif")); ctlChooseRelType.moveBelow(precedingControl); - - ctlChooseRelType.addMouseListener(new MouseListener() { - public void mouseDoubleClick(MouseEvent e) { - // TODO Auto-generated method stub - - } - public void mouseDown(MouseEvent e) { - // TODO Auto-generated method stub - - } - public void mouseUp(MouseEvent e) { - // TODO Auto-generated method stub - - } - }); createRelationMenu((Label) ctlChooseRelType); @@ -566,7 +546,9 @@ public class NameEditorView extends EditorPart { } public void focusLost(FocusEvent e) { // ((StyledText) e.widget).setBackgrond((Display.getCurrent().getSystemColor(SWT.COLOR_WHITE))); - String text = ((StyledText) e.widget).getText(); + String text = ((StyledText) e.widget).getText(); + + // dummy code to get squigglies for walter's screenshots if (text.contains("(?)")) { sourceViewer.getAnnotationModel().addAnnotation( new ErrorAnnotation(1, "Could not parse name."), @@ -673,10 +655,15 @@ public class NameEditorView extends EditorPart { taxon = null; } - // get parent taxon + // Get parent taxon if (taxon.getTaxonomicParent() != null) higherTaxon = taxon.getTaxonomicParent(); + // Register listeners for any change in accepted name or set of relations + taxon.getName().addPropertyChangeListener("nameCache", taxonChangeListener); + taxon.addPropertyChangeListener("relationsFromThisTaxon", taxonChangeListener); + taxon.addPropertyChangeListener("relationsToThisTaxon", taxonChangeListener); + setSite(site); setInput(input); setBindingContext(new DataBindingContext()); @@ -696,7 +683,7 @@ public class NameEditorView extends EditorPart { null, PropertySheetNode.EDITABLE); propertySheetNodes.add(node); - // note: only top-level nodes are "add"-ed - otherwise, they are + // Note: only top-level nodes are "add"-ed - otherwise, they are // instantiated with their parent node new PropertySheetNode("Genus", BeansObservables.observeValue(botName, "uninomial"), node, PropertySheetNode.EDITABLE); diff --git a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/NameListView.java b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/NameListView.java index afb17252f..bd2d94570 100644 --- a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/NameListView.java +++ b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/NameListView.java @@ -57,7 +57,7 @@ public class NameListView extends ViewPart { */ @Override public void createPartControl(Composite parent) { - // TODO Auto-generated method stub + parent.setLayout(new FillLayout()); GridLayout gridLayout = new GridLayout(); gridLayout.horizontalSpacing = 0; @@ -145,8 +145,6 @@ public class NameListView extends ViewPart { taxTreeExpandItem.setExpanded(true); taxTreeExpandItem.setHeight(200); taxTreeExpandItem.setText("Taxonomic Tree"); -// IFileArrangerImages.IMG_HOME); -// nameListExpandItem.setImage(image); taxTreeComposite = new Composite(expandBar, SWT.NONE); taxTreeComposite.setLayout(new FillLayout()); diff --git a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/NameViewer.java b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/NameViewer_.java similarity index 95% rename from eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/NameViewer.java rename to eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/NameViewer_.java index a7f584794..79c3f195a 100644 --- a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/NameViewer.java +++ b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/NameViewer_.java @@ -64,7 +64,7 @@ import eu.etaxonomy.taxeditor.prototype2.view.nameviewersupport.NamePartitionSca * @author p.ciardelli * */ -public class NameViewer extends SourceViewer { +public class NameViewer_ extends SourceViewer { final Document document; final IDocumentPartitioner partitioner; @@ -84,7 +84,7 @@ public class NameViewer extends SourceViewer { // annotation model private AnnotationModel fAnnotationModel = new AnnotationModel(); - NameViewer(TaxonName taxonName, DataBindingContext bindingContext, Composite parent) { + NameViewer_(TaxonName taxonName, DataBindingContext bindingContext, Composite parent) { super(parent, null, SWT.WRAP | SWT.MULTI | SWT.RESIZE); // null -> no vertical ruler this.taxonName = taxonName; @@ -92,7 +92,7 @@ public class NameViewer extends SourceViewer { this.parent = parent; Assert.isNotNull(bindingContext, - "NameViewer's binding context must be explicitly set."); + "NameViewer_'s binding context must be explicitly set."); fieldPartitions = new BoundPartition[] { new BoundPartition("genus", SWT.ITALIC), diff --git a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/RecentNamesTableViewer.java b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/RecentNamesTableViewer.java index 4f5853a13..d4e8a967a 100644 --- a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/RecentNamesTableViewer.java +++ b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/RecentNamesTableViewer.java @@ -1,8 +1,6 @@ package eu.etaxonomy.taxeditor.prototype2.view; import org.eclipse.core.databinding.beans.BeansObservables; -import org.eclipse.core.databinding.observable.Realm; -import org.eclipse.core.databinding.observable.list.IObservableList; import org.eclipse.core.databinding.observable.map.IObservableMap; import org.eclipse.jface.databinding.viewers.ObservableListContentProvider; import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider; @@ -40,9 +38,7 @@ public class RecentNamesTableViewer extends TableViewer { } }); // - IObservableList rnObjectListObserveList = BeansObservables.observeList(Realm.getDefault(), Activator.getDefault(). - getRecentNamesList(), "taxonList"); - this.setInput(rnObjectListObserveList); + this.setInput(Activator.getDefault().getObservableRecentNamesList()); } } \ No newline at end of file diff --git a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/RelatedNameViewer.java b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/RelatedNameViewer.java index 2bb923d34..639bf7948 100644 --- a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/RelatedNameViewer.java +++ b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/RelatedNameViewer.java @@ -13,7 +13,7 @@ import com.swtdesigner.SWTResourceManager; import eu.etaxonomy.taxeditor.prototype2.Activator; -public class RelatedNameViewer extends NameViewer { +public class RelatedNameViewer extends NameViewer_ { Control ctlChooseRelType; diff --git a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/TaxonomicTreeViewer.java b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/TaxonomicTreeViewer.java index 242070422..68e3a25bf 100644 --- a/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/TaxonomicTreeViewer.java +++ b/eclipseprojects/eu.etaxonomy.taxeditor.prototype2/src/eu/etaxonomy/taxeditor/prototype2/view/TaxonomicTreeViewer.java @@ -1,30 +1,17 @@ package eu.etaxonomy.taxeditor.prototype2.view; -import java.util.List; -import java.util.Set; - -import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.beans.BeansObservables; -import org.eclipse.core.databinding.observable.Realm; -import org.eclipse.core.databinding.observable.list.IObservableList; import org.eclipse.core.databinding.observable.map.IObservableMap; import org.eclipse.jface.databinding.viewers.ObservableListContentProvider; import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider; -import org.eclipse.jface.viewers.IStructuredContentProvider; -import org.eclipse.jface.viewers.ITreeContentProvider; -import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import eu.etaxonomy.cdm.model.taxon.Taxon; import eu.etaxonomy.taxeditor.prototype2.Activator; import eu.etaxonomy.taxeditor.prototype2.model.NameTreeContentProvider; -import eu.etaxonomy.taxeditor.prototype2.model.TaxonList; /** * @@ -46,64 +33,39 @@ import eu.etaxonomy.taxeditor.prototype2.model.TaxonList; * */ public class TaxonomicTreeViewer extends TreeViewer { - - class TreeContentProvider implements IStructuredContentProvider, ITreeContentProvider { - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - } - public void dispose() { - } - public Object[] getElements(Object inputElement) { - if (inputElement != null && inputElement instanceof TaxonList) - return ((TaxonList) inputElement).toArray(); - return new Object[0]; - } - public Object[] getChildren(Object parentElement) { - Set children = ((Taxon) parentElement).getTaxonomicChildren(); - return children == null ? new Object[0] : children.toArray(); - } - public Object getParent(Object element) { - return ((Taxon) element).getTaxonomicParent(); - } - public boolean hasChildren(Object element) { - return ((Taxon) element).hasTaxonomicChildren(); - } - } public TaxonomicTreeViewer(Composite parent) { super(parent, SWT.VIRTUAL); - this.setContentProvider(new TreeContentProvider()); - this.setLabelProvider(new LabelProvider() { - public String getText(Object element) { - return ((Taxon) element).getName().getNameCache(); - } - public Image getImage(Object element) { - return null; - } - }); - this.setInput(Activator.getDefault().getTaxonList()); this.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true)); this.getTree().setLinesVisible(false); this.getTree().setHeaderVisible(false); -// initDataBindings(); + initDataBindings(); } - protected DataBindingContext initDataBindings() { + protected void initDataBindings() { // -// ObservableListContentProvider viewerContentProviderList = new NameTreeContentProvider(); -// this.setContentProvider(viewerContentProviderList); -// // -// IObservableMap[] viewerLabelProviderMaps = BeansObservables.observeMaps(viewerContentProviderList.getKnownElements(), -// TaxonName.class, new String[]{"name"}); -// this.setLabelProvider(new ObservableMapLabelProvider(viewerLabelProviderMaps)); -// // -// IObservableList olObjectListObserveList = BeansObservables.observeList(Realm.getDefault(), -// Activator.getDefault().getTaxonList(), "taxonList"); -// this.setInput(olObjectListObserveList); - DataBindingContext bindingContext = new DataBindingContext(); + ObservableListContentProvider viewerContentProviderList = new NameTreeContentProvider(); + this.setContentProvider(viewerContentProviderList); // + IObservableMap[] viewerLabelProviderMaps = BeansObservables.observeMaps(viewerContentProviderList.getKnownElements(), + Taxon.class, new String[]{"name"}); + this.setLabelProvider(new ObservableMapLabelProvider(viewerLabelProviderMaps) { + /* + * JFace databinding syntax makes it to difficult to retrieve + * Taxon.getName().getNameCache, so override function that returns + * label + * + * (non-Javadoc) + * @see org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider#getColumnText(java.lang.Object, int) + */ + public String getColumnText(Object element, int columnIndex) { + return ((Taxon) element).getName().getNameCache(); + } + }); // - return bindingContext; + this.setInput(Activator.getDefault().getObservableTaxonTreeList()); + } - } + -- 2.34.1