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
;
12 import java
.util
.HashMap
;
15 import org
.apache
.log4j
.Logger
;
16 import org
.eclipse
.core
.runtime
.Assert
;
17 import org
.eclipse
.swt
.widgets
.Composite
;
18 import org
.eclipse
.ui
.forms
.IManagedForm
;
20 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementBase
;
21 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
22 import eu
.etaxonomy
.cdm
.model
.description
.TaxonDescription
;
23 import eu
.etaxonomy
.cdm
.model
.name
.HomotypicalGroup
;
24 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
25 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
26 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationship
;
27 import eu
.etaxonomy
.taxeditor
.controller
.EditorController
;
28 import eu
.etaxonomy
.taxeditor
.editor
.description
.DescriptionElementComposite
;
29 import eu
.etaxonomy
.taxeditor
.editor
.description
.DescriptionFeatureGroupComposite
;
30 import eu
.etaxonomy
.taxeditor
.editor
.description
.DescriptionGroupComposite
;
31 import eu
.etaxonomy
.taxeditor
.editor
.description
.DescriptionLabelComposite
;
32 import eu
.etaxonomy
.taxeditor
.editor
.name
.AcceptedNameComposite
;
33 import eu
.etaxonomy
.taxeditor
.editor
.name
.ConceptComposite
;
34 import eu
.etaxonomy
.taxeditor
.editor
.name
.ConceptGroupComposite
;
35 import eu
.etaxonomy
.taxeditor
.editor
.name
.HomotypicalGroupComposite
;
36 import eu
.etaxonomy
.taxeditor
.editor
.name
.MisappliedGroupComposite
;
37 import eu
.etaxonomy
.taxeditor
.editor
.name
.MisappliedNameComposite
;
38 import eu
.etaxonomy
.taxeditor
.editor
.name
.SynonymComposite
;
45 public class FreeTextElementFactory
implements IFreeTextElementFactory
{
46 private static final Logger logger
= Logger
47 .getLogger(FreeTextElementFactory
.class);
49 private static IFreeTextElementFactory factory
;
51 private Map
<Taxon
, IManagedForm
> nameForms
;
52 private Map
<Taxon
, IManagedForm
> descriptionForms
;
54 public static IFreeTextElementFactory
getDefault() {
55 if (factory
== null) {
56 factory
= new FreeTextElementFactory();
61 public Composite
createAcceptedTaxon(IManagedForm form
, Taxon taxon
) {
63 // Put the taxon's form in the form map
64 Assert
.isNotNull(form
, "A non-null IManagedForm must be provided.");
65 getTaxonNameForms().put(taxon
, form
);
67 // Create a homotypic group composite for the accepted taxon
68 HomotypicalGroup group
= taxon
.getHomotypicGroup();
69 Assert
.isNotNull(group
, "Taxon does not have a homotypic group");
70 Composite groupComposite
= createHomotypicalGroup(taxon
, group
);
72 // Create a name composite for the accepted taxon
73 Composite acceptedNameComposite
=
74 new AcceptedNameComposite(groupComposite
, form
, taxon
);
76 // Return the name composite
77 return acceptedNameComposite
;
80 public Composite
createSynonym(Taxon taxon
, Synonym synonym
) {
82 // Get the taxon's form
83 IManagedForm form
= getNameForm(taxon
);
84 Assert
.isNotNull(form
, "No IManagedForm has been provided for the synonym's accepted taxon.");
86 // Get the synonym's homotypic group
87 HomotypicalGroup group
= synonym
.getHomotypicGroup();
88 Assert
.isNotNull(group
, "Synonym does not have a homotypic group");
90 // If the group doesn't yet have a composite, create one and add it to the repository
91 Composite groupComposite
=
92 EditorController
.getNameEditor(taxon
).getHomotypicGroup(group
);
93 if (groupComposite
== null) {
94 groupComposite
= createHomotypicalGroup(taxon
, group
);
97 // Create a synonym composite in the homotypic group
98 Composite synonymComposite
=
99 new SynonymComposite(groupComposite
, form
, taxon
, synonym
);
101 return synonymComposite
;
105 public Composite
createMisappliedName(Taxon taxon
, Taxon misappliedName
) {
107 // Get the taxon's form
108 IManagedForm form
= getNameForm(taxon
);
109 Assert
.isNotNull(form
, "No IManagedForm has been provided for the synonym's accepted taxon.");
111 // If there is no composite for misapplied names,
112 // create one and add it to the repository
113 Composite groupComposite
=
114 EditorController
.getNameEditor(taxon
).getMisappliedGroup();
115 if (groupComposite
== null) {
116 groupComposite
= createMisappliedGroup(taxon
);
119 // Create the name's composite
120 Composite composite
= new MisappliedNameComposite
121 (groupComposite
, form
, taxon
, misappliedName
);
127 public Composite
createMisappliedGroup(Taxon taxon
) {
129 // Get the taxon's form
130 IManagedForm form
= getNameForm(taxon
);
131 Assert
.isNotNull(form
, "No IManagedForm has been provided for the misapplied group's accepted taxon.");
133 // Create the group composite
134 Composite groupComposite
= new MisappliedGroupComposite(getTopLevelComposite(form
), taxon
);
135 groupComposite
.addFocusListener(new CompositeBorderDecorator(groupComposite
, form
));
137 // Put the group composite before concept group composite, if any
138 Composite conceptGroupComposite
=
139 EditorController
.getNameEditor(taxon
).getConceptGroup();
140 if (conceptGroupComposite
!= null) {
141 groupComposite
.moveAbove(conceptGroupComposite
);
144 return groupComposite
;
147 public Composite
createHomotypicalGroup(Taxon taxon
, HomotypicalGroup group
) {
149 // Get the taxon's form
150 IManagedForm form
= getNameForm(taxon
);
151 Assert
.isNotNull(form
, "No IManagedForm has been provided for the homotypical group's accepted taxon.");
153 // Create the group composite
154 Composite groupComposite
= new HomotypicalGroupComposite(getTopLevelComposite(form
), taxon
, group
);
155 groupComposite
.addFocusListener(new CompositeBorderDecorator(groupComposite
, form
));
157 return groupComposite
;
160 private Map
<Taxon
, IManagedForm
> getTaxonNameForms() {
161 if (nameForms
== null) {
162 nameForms
= new HashMap
<Taxon
, IManagedForm
>();
167 private IManagedForm
getNameForm(Taxon taxon
) {
168 return getTaxonNameForms().get(taxon
);
171 private Composite
getTopLevelComposite(IManagedForm form
) {
172 return form
.getForm().getBody();
176 public Composite
createConcept(Taxon taxon
, TaxonRelationship relationship
) {
177 // Get the taxon's form
178 IManagedForm form
= getNameForm(taxon
);
179 Assert
.isNotNull(form
, "No IManagedForm has been provided for the synonym's accepted taxon.");
181 // If there is no composite for misapplied names,
182 // create one and add it to the repository
183 Composite groupComposite
=
184 EditorController
.getNameEditor(taxon
).getConceptGroup();
185 if (groupComposite
== null) {
186 groupComposite
= createConceptGroup(taxon
);
189 // Create the name's composite
190 Composite composite
= ConceptComposite
.getNewInstance(groupComposite
, form
,
191 taxon
, relationship
);
197 public Composite
createConceptGroup(Taxon taxon
) {
199 // Get the taxon's form
200 IManagedForm form
= getNameForm(taxon
);
201 Assert
.isNotNull(form
, "No IManagedForm has been provided for the concept group's accepted taxon.");
203 // Create the group composite
204 Composite groupComposite
= new ConceptGroupComposite(getTopLevelComposite(form
), taxon
);
205 groupComposite
.addFocusListener(new CompositeBorderDecorator(groupComposite
, form
));
207 // Put the group composite after misapplied group composite, if any
208 Composite misappliedGroupComposite
=
209 EditorController
.getNameEditor(taxon
).getMisappliedGroup();
210 if (misappliedGroupComposite
!= null) {
211 groupComposite
.moveBelow(misappliedGroupComposite
);
214 return groupComposite
;
219 public Composite
createDescriptionLabel(IManagedForm form
, Taxon taxon
,
220 TaxonDescription description
) {
222 // Put the taxon's form in the form map if no other description has done so
223 Assert
.isNotNull(form
, "A non-null IManagedForm must be provided.");
224 getTaxonDescriptionForms().put(taxon
, form
);
226 // Create a group composite for the description
227 Composite groupComposite
= createDescriptionGroup(taxon
, description
);
229 // Create label composite
230 Composite labelComposite
=
231 new DescriptionLabelComposite(groupComposite
, form
, description
);
233 // Return the label composite
234 return labelComposite
;
238 public Composite
createDescriptionElement(Taxon taxon
, TaxonDescription description
,
239 DescriptionElementBase element
) {
241 // Get the taxon's form
242 IManagedForm form
= getDescriptionForm(taxon
);
243 Assert
.isNotNull(form
, "No IManagedForm has been provided for the element's taxon.");
245 // Get the element's feature
246 Feature feature
= element
.getFeature();
247 Assert
.isNotNull(feature
, "Element does not have a feature.");
249 // If the feature doesn't yet have a composite, create one and add it to the repository
250 Composite groupComposite
= EditorController
.getDescriptionEditor(taxon
)
251 .getDescriptionFeatureGroup(description
, feature
);
252 if (groupComposite
== null) {
253 groupComposite
= createDescriptionFeatureGroup(taxon
, description
, feature
);
256 // Create an element composite in the feature group
257 Composite elementComposite
=
258 new DescriptionElementComposite(groupComposite
, form
, element
);
260 return elementComposite
;
264 public Composite
createDescriptionGroup(Taxon taxon
,
265 TaxonDescription description
) {
267 // Get the taxon's form
268 IManagedForm form
= getDescriptionForm(taxon
);
269 Assert
.isNotNull(form
, "No IManagedForm has been provided for the description's taxon.");
271 // Create the group composite
272 GroupComposite groupComposite
= new DescriptionGroupComposite(getTopLevelComposite(form
), taxon
, description
);
273 groupComposite
.addFocusListener(new CompositeBorderDecorator(groupComposite
, form
));
274 groupComposite
.setDroppable(false);
276 return groupComposite
;
280 public Composite
createDescriptionFeatureGroup(Taxon taxon
,
281 TaxonDescription description
, Feature feature
) {
283 // Get the taxon's form
284 IManagedForm form
= getDescriptionForm(taxon
);
285 Assert
.isNotNull(form
, "No IManagedForm has been provided for the feature's taxon.");
287 // Description label should be created before adding features
288 Composite descriptionGroupComposite
=
289 EditorController
.getDescriptionEditor(taxon
).getDescriptionGroup(description
);
290 Assert
.isNotNull(descriptionGroupComposite
,
291 "Description group must be created - usually by creating its label - before adding features.");
293 // Create the group composite
294 Composite groupComposite
= new DescriptionFeatureGroupComposite
295 (descriptionGroupComposite
, taxon
, description
, feature
);
296 groupComposite
.addFocusListener(new CompositeBorderDecorator(groupComposite
, form
));
298 return groupComposite
;
301 private Map
<Taxon
, IManagedForm
> getTaxonDescriptionForms() {
302 if (descriptionForms
== null) {
303 descriptionForms
= new HashMap
<Taxon
, IManagedForm
>();
305 return descriptionForms
;
309 private IManagedForm
getDescriptionForm(Taxon taxon
) {
310 return getTaxonDescriptionForms().get(taxon
);