2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.taxeditor
.editor
.name
;
12 import java
.beans
.PropertyChangeEvent
;
13 import java
.beans
.PropertyChangeListener
;
16 import org
.apache
.log4j
.Logger
;
17 import org
.eclipse
.core
.commands
.operations
.IUndoableOperation
;
18 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
19 import org
.eclipse
.swt
.dnd
.DND
;
20 import org
.eclipse
.swt
.dnd
.DropTarget
;
21 import org
.eclipse
.swt
.dnd
.DropTargetAdapter
;
22 import org
.eclipse
.swt
.dnd
.DropTargetEvent
;
23 import org
.eclipse
.swt
.dnd
.Transfer
;
24 import org
.eclipse
.swt
.widgets
.Composite
;
25 import org
.eclipse
.swt
.widgets
.Event
;
26 import org
.eclipse
.swt
.widgets
.Listener
;
27 import org
.eclipse
.ui
.IEditorInput
;
28 import org
.eclipse
.ui
.IEditorSite
;
29 import org
.eclipse
.ui
.PartInitException
;
31 import eu
.etaxonomy
.cdm
.model
.name
.HomotypicalGroup
;
32 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
33 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
34 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
35 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationship
;
36 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationshipType
;
37 import eu
.etaxonomy
.taxeditor
.editor
.AbstractTaxonEditor
;
38 import eu
.etaxonomy
.taxeditor
.editor
.EditorUtil
;
39 import eu
.etaxonomy
.taxeditor
.editor
.FreeTextElementFactory
;
40 import eu
.etaxonomy
.taxeditor
.editor
.GroupedComposite
;
41 import eu
.etaxonomy
.taxeditor
.editor
.MultiPageTaxonEditor
;
42 import eu
.etaxonomy
.taxeditor
.editor
.WidgetTransfer
;
43 import eu
.etaxonomy
.taxeditor
.store
.model
.Resources
;
44 import eu
.etaxonomy
.taxeditor
.store
.operations
.ChangeConceptToSynonymOperation
;
45 import eu
.etaxonomy
.taxeditor
.store
.operations
.ChangeHomotypicGroupOperation
;
52 public class TaxonNameEditor
extends AbstractTaxonEditor
53 implements INameEditorCompositeRepository
{
54 private static final Logger logger
= Logger
.getLogger(TaxonNameEditor
.class);
56 private static final String ID
= "eu.etaxonomy.taxeditor.taxonNameEditor";
58 public TaxonNameEditor(MultiPageTaxonEditor editor
){
63 * Shared listener that sets dirty state to true
64 * when any registered property changes
66 private PropertyChangeListener taxonChangeListener
= new PropertyChangeListener() {
67 public void propertyChange(PropertyChangeEvent event
) {
68 if (event
.getPropertyName().equals(Resources
.PROPERTY_SHEET_CHANGE
)) {
69 firePropertyChange(PROP_DIRTY
);
75 public void doSave(IProgressMonitor monitor
) {}
78 public void doSaveAs() {}
81 public void init(IEditorSite site
, IEditorInput input
)
82 throws PartInitException
{
84 super.init(site
, input
);
86 // Register listeners for any change in accepted name or set of relations
87 taxon
.getName().addPropertyChangeListener(taxonChangeListener
);
88 taxon
.addPropertyChangeListener(taxonChangeListener
);
92 public boolean isDirty() {
97 public boolean isSaveAsAllowed() {
102 protected void createManagedForm(Composite composite
) {
104 super.createManagedForm(composite
);
106 Taxon taxon
= getTaxon();
108 firstGroupedComposite
= (NameComposite
) FreeTextElementFactory
.getDefault().
109 createAcceptedTaxon(this);
111 // Draw synonym and misapplied name elements
112 for (TaxonBase
<?
> taxonBase
: new IterableSynonymyList(taxon
)) {
113 if (taxonBase
instanceof Synonym
) {
114 FreeTextElementFactory
.getDefault().createSynonym(this, (Synonym
) taxonBase
);
116 FreeTextElementFactory
.getDefault().createMisappliedName(this, (Taxon
) taxonBase
);
120 // Draw concept relation elements
121 Set
<TaxonRelationship
> taxonRelations
= taxon
.getTaxonRelations();
122 for (TaxonRelationship relationship
: taxonRelations
) {
124 if (relationship
.getType().equals(TaxonRelationshipType
.MISAPPLIED_NAME_FOR()) ||
125 relationship
.getType().equals(TaxonRelationshipType
.TAXONOMICALLY_INCLUDED_IN())) {
129 FreeTextElementFactory
.getDefault().createConcept(this, relationship
);
132 // Listen for names being dragged outside of existing homotypic groups -
133 // user wants to create a new group
134 Transfer
[] types
= new Transfer
[] {WidgetTransfer
.getInstance()};
135 int operations
= DND
.DROP_MOVE
| DND
.DROP_COPY
| DND
.DROP_DEFAULT
;
136 DropTarget target
= new DropTarget(parent
, operations
);
137 target
.setTransfer(types
);
138 target
.addDropListener(new DropTargetAdapter() {
140 public void drop(DropTargetEvent event
) {
142 if (event
.data
instanceof GroupedComposite
) {
143 final GroupedComposite composite
= (GroupedComposite
) event
.data
;
144 if (composite
.getDragSource() != null) {
146 // Execute operations at end of drag event
147 composite
.getDragSource().addListener(DND
.DragEnd
, new Listener() {
149 public void handleEvent(Event event
) {
150 IUndoableOperation operation
= null;
152 // Synonym being dropped
153 if(composite
instanceof SynonymComposite
){
154 Synonym synonym
= ((SynonymComposite
)composite
).getSynonym();
155 operation
= new ChangeHomotypicGroupOperation
156 ("change type", getUndoContext(),
157 getTaxon(), synonym
, HomotypicalGroup
.NewInstance(), TaxonNameEditor
.this);
160 // Misapplied name being dropped
161 if(composite
instanceof MisappliedNameComposite
){
162 Taxon misapplication
= ((MisappliedNameComposite
)composite
).getMisappliedName();
163 operation
= new ChangeConceptToSynonymOperation
164 ("change misapplied name to synonym", getUndoContext(),
165 getTaxon(), misapplication
, HomotypicalGroup
.NewInstance(), TaxonNameEditor
.this);
168 // Execute operation if it's been init'ed
169 if (operation
== null) {
170 logger
.warn("User unsuccessfully tried to drop " + composite
.getClass());
172 EditorUtil
.executeOperation(operation
);
189 public Composite
getAcceptedName() {
190 for(Composite c
: getAllComposites()){
191 if(c
instanceof AcceptedNameComposite
){
199 public Composite
getHomotypicGroup(HomotypicalGroup group
) {
200 for(Composite c
: getAllComposites()){
201 if(c
instanceof HomotypicalGroupComposite
){
203 ((HomotypicalGroupComposite
) c
).getGroup())) {
212 public Composite
getMisappliedGroup() {
213 for(Composite c
: getAllComposites()){
214 if(c
instanceof MisappliedGroupComposite
){
222 public Composite
getMisappliedName(Taxon misappliedName
) {
223 for(Composite c
: getAllComposites()){
224 if(c
instanceof MisappliedNameComposite
){
225 if (misappliedName
.equals(
226 ((MisappliedNameComposite
) c
).getMisappliedName())) {
235 public Composite
getSynonym(Synonym synonym
) {
236 for(Composite c
: getAllComposites()){
237 if(c
instanceof SynonymComposite
){
239 (((SynonymComposite
) c
).getSynonym())) {
248 public Composite
getConceptGroup() {
249 for(Composite c
: getAllComposites()){
250 if(c
instanceof ConceptGroupComposite
){
258 public Composite
getConcept(Taxon relatedConcept
) {
259 for(Composite c
: getAllComposites()){
260 if(c
instanceof ConceptComposite
){
261 if (relatedConcept
.equals
262 (((ConceptComposite
) c
).getRelatedTaxon())) {
271 * @see eu.etaxonomy.taxeditor.editor.AbstractTaxonEditor#getID()
274 public String
getID() {
275 return TaxonNameEditor
.ID
;