added a readme file
[taxeditor.git] / taxeditor-editor / src / main / java / eu / etaxonomy / taxeditor / forms / CdmFormFactory.java
1 /**
2 *
3 */
4 package eu.etaxonomy.taxeditor.forms;
5
6 import java.net.URI;
7 import java.util.HashSet;
8 import java.util.Map;
9 import java.util.Set;
10
11 import org.eclipse.jface.util.IPropertyChangeListener;
12 import org.eclipse.jface.viewers.ISelection;
13 import org.eclipse.jface.viewers.ISelectionProvider;
14 import org.eclipse.jface.window.Window;
15 import org.eclipse.swt.SWT;
16 import org.eclipse.swt.custom.StyledText;
17 import org.eclipse.swt.events.FocusAdapter;
18 import org.eclipse.swt.events.FocusEvent;
19 import org.eclipse.swt.events.FocusListener;
20 import org.eclipse.swt.events.MouseAdapter;
21 import org.eclipse.swt.events.MouseEvent;
22 import org.eclipse.swt.events.MouseListener;
23 import org.eclipse.swt.events.SelectionEvent;
24 import org.eclipse.swt.events.SelectionListener;
25 import org.eclipse.swt.events.TypedEvent;
26 import org.eclipse.swt.graphics.Color;
27 import org.eclipse.swt.graphics.Font;
28 import org.eclipse.swt.widgets.Composite;
29 import org.eclipse.swt.widgets.Control;
30 import org.eclipse.swt.widgets.Display;
31 import org.eclipse.swt.widgets.Event;
32 import org.eclipse.swt.widgets.Label;
33 import org.eclipse.ui.forms.IFormColors;
34 import org.eclipse.ui.forms.widgets.FormToolkit;
35 import org.eclipse.ui.forms.widgets.Section;
36 import org.eclipse.ui.forms.widgets.TableWrapData;
37 import org.eclipse.ui.forms.widgets.TableWrapLayout;
38 import org.eclipse.ui.internal.forms.widgets.FormFonts;
39 import org.joda.time.Partial;
40
41 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
42 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
43 import eu.etaxonomy.cdm.model.agent.Institution;
44 import eu.etaxonomy.cdm.model.agent.Person;
45 import eu.etaxonomy.cdm.model.agent.Team;
46 import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
47 import eu.etaxonomy.cdm.model.common.Annotation;
48 import eu.etaxonomy.cdm.model.common.AnnotationType;
49 import eu.etaxonomy.cdm.model.common.Credit;
50 import eu.etaxonomy.cdm.model.common.DefinedTermBase;
51 import eu.etaxonomy.cdm.model.common.DescriptionElementSource;
52 import eu.etaxonomy.cdm.model.common.Extension;
53 import eu.etaxonomy.cdm.model.common.ExtensionType;
54 import eu.etaxonomy.cdm.model.common.IAnnotatableEntity;
55 import eu.etaxonomy.cdm.model.common.IVersionableEntity;
56 import eu.etaxonomy.cdm.model.common.IdentifiableSource;
57 import eu.etaxonomy.cdm.model.common.Language;
58 import eu.etaxonomy.cdm.model.common.LanguageString;
59 import eu.etaxonomy.cdm.model.common.Marker;
60 import eu.etaxonomy.cdm.model.common.MarkerType;
61 import eu.etaxonomy.cdm.model.common.TimePeriod;
62 import eu.etaxonomy.cdm.model.common.VersionableEntity;
63 import eu.etaxonomy.cdm.model.description.CategoricalData;
64 import eu.etaxonomy.cdm.model.description.CommonTaxonName;
65 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
66 import eu.etaxonomy.cdm.model.description.Distribution;
67 import eu.etaxonomy.cdm.model.description.Feature;
68 import eu.etaxonomy.cdm.model.description.FeatureTree;
69 import eu.etaxonomy.cdm.model.description.IndividualsAssociation;
70 import eu.etaxonomy.cdm.model.description.MeasurementUnit;
71 import eu.etaxonomy.cdm.model.description.Modifier;
72 import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;
73 import eu.etaxonomy.cdm.model.description.QuantitativeData;
74 import eu.etaxonomy.cdm.model.description.Scope;
75 import eu.etaxonomy.cdm.model.description.Sex;
76 import eu.etaxonomy.cdm.model.description.Stage;
77 import eu.etaxonomy.cdm.model.description.State;
78 import eu.etaxonomy.cdm.model.description.StateData;
79 import eu.etaxonomy.cdm.model.description.StatisticalMeasure;
80 import eu.etaxonomy.cdm.model.description.StatisticalMeasurementValue;
81 import eu.etaxonomy.cdm.model.description.TaxonInteraction;
82 import eu.etaxonomy.cdm.model.description.TextData;
83 import eu.etaxonomy.cdm.model.location.NamedArea;
84 import eu.etaxonomy.cdm.model.location.NamedAreaType;
85 import eu.etaxonomy.cdm.model.location.Point;
86 import eu.etaxonomy.cdm.model.location.ReferenceSystem;
87 import eu.etaxonomy.cdm.model.media.ImageFile;
88 import eu.etaxonomy.cdm.model.media.Media;
89 import eu.etaxonomy.cdm.model.media.MediaRepresentation;
90 import eu.etaxonomy.cdm.model.media.Rights;
91 import eu.etaxonomy.cdm.model.media.RightsTerm;
92 import eu.etaxonomy.cdm.model.name.NameRelationship;
93 import eu.etaxonomy.cdm.model.name.NameRelationshipType;
94 import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
95 import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
96 import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
97 import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
98 import eu.etaxonomy.cdm.model.name.Rank;
99 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
100 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
101 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
102 import eu.etaxonomy.cdm.model.occurrence.Collection;
103 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
104 import eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase;
105 import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
106 import eu.etaxonomy.cdm.model.occurrence.DeterminationModifier;
107 import eu.etaxonomy.cdm.model.occurrence.FieldObservation;
108 import eu.etaxonomy.cdm.model.occurrence.PreservationMethod;
109 import eu.etaxonomy.cdm.model.occurrence.Specimen;
110 import eu.etaxonomy.cdm.model.reference.Reference;
111 import eu.etaxonomy.cdm.model.taxon.Classification;
112 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
113 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
114 import eu.etaxonomy.cdm.strategy.parser.ParserProblem;
115 import eu.etaxonomy.taxeditor.editor.EditorUtil;
116 import eu.etaxonomy.taxeditor.forms.selection.AbstractSelectionElement;
117 import eu.etaxonomy.taxeditor.forms.selection.AgentSelectionElement;
118 import eu.etaxonomy.taxeditor.forms.selection.ClassificationSelectionElement;
119 import eu.etaxonomy.taxeditor.forms.selection.CollectionSelectionElement;
120 import eu.etaxonomy.taxeditor.forms.selection.DerivedUnitBaseSelectionElement;
121 import eu.etaxonomy.taxeditor.forms.selection.FeatureTreeSelectionElement;
122 import eu.etaxonomy.taxeditor.forms.selection.FieldObservationSelectionElement;
123 import eu.etaxonomy.taxeditor.forms.selection.InstitutionSelectionElement;
124 import eu.etaxonomy.taxeditor.forms.selection.NameSelectionElement;
125 import eu.etaxonomy.taxeditor.forms.selection.NamedAreaSelectionElement;
126 import eu.etaxonomy.taxeditor.forms.selection.NomenclaturalAuthorTeamSelectionElement;
127 import eu.etaxonomy.taxeditor.forms.selection.PersonSelectionElement;
128 import eu.etaxonomy.taxeditor.forms.selection.ReferenceSelectionElement;
129 import eu.etaxonomy.taxeditor.forms.selection.TaxonBaseSelectionElement;
130 import eu.etaxonomy.taxeditor.forms.selection.TaxonNodeSelectionElement;
131 import eu.etaxonomy.taxeditor.forms.selection.TeamSelectionElement;
132 import eu.etaxonomy.taxeditor.forms.term.AbstractEnumComboElement;
133 import eu.etaxonomy.taxeditor.forms.term.AbstractTermComboElement;
134 import eu.etaxonomy.taxeditor.forms.term.AnnotationTypeComboElement;
135 import eu.etaxonomy.taxeditor.forms.term.DeterminationModifierComboElement;
136 import eu.etaxonomy.taxeditor.forms.term.EmptyComboElement;
137 import eu.etaxonomy.taxeditor.forms.term.ExtensionTypeComboElement;
138 import eu.etaxonomy.taxeditor.forms.term.LanguageComboElement;
139 import eu.etaxonomy.taxeditor.forms.term.MarkerTypeComboElement;
140 import eu.etaxonomy.taxeditor.forms.term.MeasurementUnitComboElement;
141 import eu.etaxonomy.taxeditor.forms.term.ModifierComboElement;
142 import eu.etaxonomy.taxeditor.forms.term.NameRelationshipTypeComboElement;
143 import eu.etaxonomy.taxeditor.forms.term.NameTypeDesignationStatusComboElement;
144 import eu.etaxonomy.taxeditor.forms.term.NamedAreaTypeComboElement;
145 import eu.etaxonomy.taxeditor.forms.term.NomenclaturalCodeComboElement;
146 import eu.etaxonomy.taxeditor.forms.term.NomenclaturalStatusTypeComboElement;
147 import eu.etaxonomy.taxeditor.forms.term.PresenceAbsenceTermComboElement;
148 import eu.etaxonomy.taxeditor.forms.term.PreservationMethodComboElement;
149 import eu.etaxonomy.taxeditor.forms.term.RankComboElement;
150 import eu.etaxonomy.taxeditor.forms.term.ReferenceSystemComboElement;
151 import eu.etaxonomy.taxeditor.forms.term.ReferenceTypeComboElement;
152 import eu.etaxonomy.taxeditor.forms.term.RightsTypeComboElement;
153 import eu.etaxonomy.taxeditor.forms.term.ScopeComboElement;
154 import eu.etaxonomy.taxeditor.forms.term.SexComboElement;
155 import eu.etaxonomy.taxeditor.forms.term.SpecimenTypeDesignationStatusComboElement;
156 import eu.etaxonomy.taxeditor.forms.term.StageComboElement;
157 import eu.etaxonomy.taxeditor.forms.term.StateComboElement;
158 import eu.etaxonomy.taxeditor.forms.term.StatisticalMeasureComboElement;
159 import eu.etaxonomy.taxeditor.section.AbstractCdmDetailElement;
160 import eu.etaxonomy.taxeditor.section.AbstractEntityCollectionElement;
161 import eu.etaxonomy.taxeditor.section.EmptyElement;
162 import eu.etaxonomy.taxeditor.section.agent.PersonDetailElement;
163 import eu.etaxonomy.taxeditor.section.agent.PersonDetailSection;
164 import eu.etaxonomy.taxeditor.section.agent.TeamDetailElement;
165 import eu.etaxonomy.taxeditor.section.agent.TeamDetailSection;
166 import eu.etaxonomy.taxeditor.section.agent.TeamMemberElement;
167 import eu.etaxonomy.taxeditor.section.agent.TeamMemberSection;
168 import eu.etaxonomy.taxeditor.section.agent.TeamOrPersonBaseDetailSection;
169 import eu.etaxonomy.taxeditor.section.classification.ClassificationDetailElement;
170 import eu.etaxonomy.taxeditor.section.classification.ClassificationDetailSection;
171 import eu.etaxonomy.taxeditor.section.classification.TaxonNodeDetailElement;
172 import eu.etaxonomy.taxeditor.section.classification.TaxonNodeDetailSection;
173 import eu.etaxonomy.taxeditor.section.description.DerivedUnitElement;
174 import eu.etaxonomy.taxeditor.section.description.DescribedSpecimenSection;
175 import eu.etaxonomy.taxeditor.section.description.DescriptionDetailElement;
176 import eu.etaxonomy.taxeditor.section.description.DescriptionDetailSection;
177 import eu.etaxonomy.taxeditor.section.description.DescriptionElementDetailElement;
178 import eu.etaxonomy.taxeditor.section.description.DescriptionElementDetailSection;
179 import eu.etaxonomy.taxeditor.section.description.DescriptionElementMediaSection;
180 import eu.etaxonomy.taxeditor.section.description.DescriptionElementSourceElement;
181 import eu.etaxonomy.taxeditor.section.description.DescriptionElementSourceSection;
182 import eu.etaxonomy.taxeditor.section.description.DescriptionSourceElement;
183 import eu.etaxonomy.taxeditor.section.description.DescriptionSourceSection;
184 import eu.etaxonomy.taxeditor.section.description.ModifierElement;
185 import eu.etaxonomy.taxeditor.section.description.ModifierSection;
186 import eu.etaxonomy.taxeditor.section.description.NaturalLanguageDetailElement;
187 import eu.etaxonomy.taxeditor.section.description.NaturalLanguageSection;
188 import eu.etaxonomy.taxeditor.section.description.ScopeElement;
189 import eu.etaxonomy.taxeditor.section.description.ScopeSection;
190 import eu.etaxonomy.taxeditor.section.description.StateDataElement;
191 import eu.etaxonomy.taxeditor.section.description.StateDataSection;
192 import eu.etaxonomy.taxeditor.section.description.StatisticalMeasurementValueElement;
193 import eu.etaxonomy.taxeditor.section.description.StatisticalMeasurementValueSection;
194 import eu.etaxonomy.taxeditor.section.description.detail.AbstractDetailedDescriptionDetailElement;
195 import eu.etaxonomy.taxeditor.section.description.detail.CategoricalDataDetailElement;
196 import eu.etaxonomy.taxeditor.section.description.detail.CommonNameDetailElement;
197 import eu.etaxonomy.taxeditor.section.description.detail.DistributionDetailElement;
198 import eu.etaxonomy.taxeditor.section.description.detail.IndividualsAssociationDetailElement;
199 import eu.etaxonomy.taxeditor.section.description.detail.QuantitativeDataDetailElement;
200 import eu.etaxonomy.taxeditor.section.description.detail.TaxonInteractionDetailElement;
201 import eu.etaxonomy.taxeditor.section.description.detail.TextDataDetailElement;
202 import eu.etaxonomy.taxeditor.section.feature.FeatureDistributionDetailElement;
203 import eu.etaxonomy.taxeditor.section.feature.FeatureDistributionDetailSection;
204 import eu.etaxonomy.taxeditor.section.name.AuthorshipDetailElement;
205 import eu.etaxonomy.taxeditor.section.name.AuthorshipDetailSection;
206 import eu.etaxonomy.taxeditor.section.name.NameDetailElement;
207 import eu.etaxonomy.taxeditor.section.name.NameDetailSection;
208 import eu.etaxonomy.taxeditor.section.name.NameRelationshipDetailElement;
209 import eu.etaxonomy.taxeditor.section.name.NameRelationshipDetailSection;
210 import eu.etaxonomy.taxeditor.section.name.NameTypeDesignationElement;
211 import eu.etaxonomy.taxeditor.section.name.NomenclaturalStatusElement;
212 import eu.etaxonomy.taxeditor.section.name.NomenclaturalStatusSection;
213 import eu.etaxonomy.taxeditor.section.name.NonViralNameDetailElement;
214 import eu.etaxonomy.taxeditor.section.name.NonViralNameDetailSection;
215 import eu.etaxonomy.taxeditor.section.name.ProtologueElement;
216 import eu.etaxonomy.taxeditor.section.name.ProtologueSection;
217 import eu.etaxonomy.taxeditor.section.name.SpecimenTypeDesignationElement;
218 import eu.etaxonomy.taxeditor.section.name.TypeDesignationSection;
219 import eu.etaxonomy.taxeditor.section.occurrence.CollectingAreasDetailElement;
220 import eu.etaxonomy.taxeditor.section.occurrence.CollectingAreasDetailSection;
221 import eu.etaxonomy.taxeditor.section.occurrence.CollectionDetailElement;
222 import eu.etaxonomy.taxeditor.section.occurrence.DerivedUnitBaseDetailElement;
223 import eu.etaxonomy.taxeditor.section.occurrence.DerivedUnitBaseDetailSection;
224 import eu.etaxonomy.taxeditor.section.occurrence.DerivedUnitFacadeDetailElement;
225 import eu.etaxonomy.taxeditor.section.occurrence.DerivedUnitFacadeDetailSection;
226 import eu.etaxonomy.taxeditor.section.occurrence.DeterminationEventDetailElement;
227 import eu.etaxonomy.taxeditor.section.occurrence.DeterminationEventDetailSection;
228 import eu.etaxonomy.taxeditor.section.occurrence.FieldObservationDetailElement;
229 import eu.etaxonomy.taxeditor.section.occurrence.FieldObservationDetailSection;
230 import eu.etaxonomy.taxeditor.section.occurrence.GatheringEventDetailElement;
231 import eu.etaxonomy.taxeditor.section.occurrence.GatheringEventDetailSection;
232 import eu.etaxonomy.taxeditor.section.occurrence.SourceCollectionDetailSection;
233 import eu.etaxonomy.taxeditor.section.occurrence.SpecimenCollectionDetailElement;
234 import eu.etaxonomy.taxeditor.section.occurrence.SpecimenCollectionDetailSection;
235 import eu.etaxonomy.taxeditor.section.reference.NomenclaturalReferenceDetailElement;
236 import eu.etaxonomy.taxeditor.section.reference.NomenclaturalReferenceDetailSection;
237 import eu.etaxonomy.taxeditor.section.reference.ReferenceBaseDetailElement;
238 import eu.etaxonomy.taxeditor.section.reference.ReferenceBaseDetailSection;
239 import eu.etaxonomy.taxeditor.section.supplemental.AnnotationElement;
240 import eu.etaxonomy.taxeditor.section.supplemental.AnnotationSection;
241 import eu.etaxonomy.taxeditor.section.supplemental.CreditElement;
242 import eu.etaxonomy.taxeditor.section.supplemental.CreditSection;
243 import eu.etaxonomy.taxeditor.section.supplemental.ExtensionElement;
244 import eu.etaxonomy.taxeditor.section.supplemental.ExtensionSection;
245 import eu.etaxonomy.taxeditor.section.supplemental.HeadlineSection;
246 import eu.etaxonomy.taxeditor.section.supplemental.IdentifiableSourceElement;
247 import eu.etaxonomy.taxeditor.section.supplemental.ImageFileElement;
248 import eu.etaxonomy.taxeditor.section.supplemental.MarkerElement;
249 import eu.etaxonomy.taxeditor.section.supplemental.MarkerSection;
250 import eu.etaxonomy.taxeditor.section.supplemental.MediaElement;
251 import eu.etaxonomy.taxeditor.section.supplemental.MediaRepresentationElement;
252 import eu.etaxonomy.taxeditor.section.supplemental.MediaRepresentationPartSection;
253 import eu.etaxonomy.taxeditor.section.supplemental.MediaRepresentationSection;
254 import eu.etaxonomy.taxeditor.section.supplemental.MediaSection;
255 import eu.etaxonomy.taxeditor.section.supplemental.RightsElement;
256 import eu.etaxonomy.taxeditor.section.supplemental.RightsSection;
257 import eu.etaxonomy.taxeditor.section.supplemental.SourceSection;
258 import eu.etaxonomy.taxeditor.section.supplemental.VersionElement;
259 import eu.etaxonomy.taxeditor.section.supplemental.VersionSection;
260 import eu.etaxonomy.taxeditor.section.taxon.ParsingMessageElement;
261 import eu.etaxonomy.taxeditor.section.taxon.ParsingMessagesSection;
262 import eu.etaxonomy.taxeditor.section.taxon.TaxonBaseDetailElement;
263 import eu.etaxonomy.taxeditor.section.taxon.TaxonBaseDetailSection;
264
265 /**
266 * <p>CdmFormFactory class.</p>
267 *
268 * @author n.hoffmann
269 * @created Feb 24, 2010
270 * @version 1.0
271 */
272 public class CdmFormFactory extends FormToolkit{
273
274 private BoldFontHolder2 boldFontHolder2;
275 private MouseListener selectionMouseHandler;
276 private FocusListener selectionFocusHandler;
277
278 private Set selectionListenerList = new HashSet();
279
280 private Set<IPropertyChangeListener> propertyChangeListeners = new HashSet<IPropertyChangeListener>();
281
282 private int orientation = Window.getDefaultOrientation();
283 private ISelectionProvider selectionProvider;
284
285 /**
286 * <p>LAYOUT</p>
287 *
288 * @return a {@link org.eclipse.ui.forms.widgets.TableWrapLayout} object.
289 */
290 public static final TableWrapLayout LAYOUT(){
291 return LAYOUT(1, false);
292 }
293
294 /**
295 * <p>LAYOUT</p>
296 *
297 * @param columns a int.
298 * @param equalWidth a boolean.
299 * @return a {@link org.eclipse.ui.forms.widgets.TableWrapLayout} object.
300 */
301 public static final TableWrapLayout LAYOUT(int columns, boolean equalWidth){
302 TableWrapLayout layout = new TableWrapLayout();
303 layout.topMargin = 0;
304 layout.rightMargin = 0;
305 layout.bottomMargin = 0;
306 layout.leftMargin = 0;
307 layout.numColumns = columns;
308 layout.makeColumnsEqualWidth = equalWidth;
309 layout.verticalSpacing = 0;
310 layout.horizontalSpacing = 0;
311 return layout;
312 }
313
314 /**
315 * <p>FILL</p>
316 *
317 * @return a {@link org.eclipse.ui.forms.widgets.TableWrapData} object.
318 */
319 public static final TableWrapData FILL(){
320 return FILL(1, 1);
321 }
322
323 /**
324 * <p>FILL</p>
325 *
326 * @param horizontalSpan a int.
327 * @param verticalSpan a int.
328 * @return a {@link org.eclipse.ui.forms.widgets.TableWrapData} object.
329 */
330 public static final TableWrapData FILL(int horizontalSpan, int verticalSpan){
331 TableWrapData layoutData = new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.FILL_GRAB);
332 layoutData.colspan = horizontalSpan;
333 layoutData.rowspan = verticalSpan;
334 return layoutData;
335 }
336
337 /**
338 * <p>LEFT</p>
339 *
340 * @return a {@link org.eclipse.ui.forms.widgets.TableWrapData} object.
341 */
342 public static final TableWrapData LEFT(){
343 return new TableWrapData(TableWrapData.LEFT, TableWrapData.TOP);
344 }
345
346 /**
347 * <p>RIGHT</p>
348 *
349 * @return a {@link org.eclipse.ui.forms.widgets.TableWrapData} object.
350 */
351 public static final TableWrapData RIGHT(){
352 return new TableWrapData(TableWrapData.RIGHT, TableWrapData.TOP);
353 }
354
355 /**
356 * <p>FILL_HORIZONTALLY</p>
357 *
358 * @return a {@link org.eclipse.ui.forms.widgets.TableWrapData} object.
359 */
360 public static final TableWrapData FILL_HORIZONTALLY(){
361 return FILL_HORIZONTALLY(1, 1);
362 }
363
364 /**
365 * <p>FILL_HORIZONTALLY</p>
366 *
367 * @param horizontalSpan a int.
368 * @param verticalSpan a int.
369 * @return a {@link org.eclipse.ui.forms.widgets.TableWrapData} object.
370 */
371 public static final TableWrapData FILL_HORIZONTALLY(int horizontalSpan, int verticalSpan){
372 TableWrapData layoutData = new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP);
373 layoutData.colspan = horizontalSpan;
374 layoutData.rowspan = verticalSpan;
375 return layoutData;
376 }
377
378 /** Constant <code>EMPTY_SELECTION</code> */
379 public static ISelection EMPTY_SELECTION = new ISelection() {
380 public boolean isEmpty() {
381 return true;
382 }
383 };
384
385 private class SelectionMouseHandler extends MouseAdapter{
386 @Override
387 public void mouseDown(MouseEvent e) {
388 notifySelectionListeners(e);
389 }
390 }
391
392 private class SelectionFocusHandler extends FocusAdapter{
393 @Override
394 public void focusGained(FocusEvent e) {
395 notifySelectionListeners(e);
396 }
397 }
398
399 private void notifySelectionListeners(TypedEvent e){
400 Event event = new Event();
401 event.widget = e.widget;
402 SelectionEvent selectionEvent = new SelectionEvent(event);
403
404 for(Object listener : selectionListenerList){
405 ((SelectionListener) listener).widgetSelected(selectionEvent);
406 }
407 }
408
409 /**
410 * <p>Constructor for CdmFormFactory.</p>
411 *
412 * @param display a {@link org.eclipse.swt.widgets.Display} object.
413 * @param selectionProvider a {@link org.eclipse.jface.viewers.ISelectionProvider} object.
414 */
415 public CdmFormFactory(Display display, ISelectionProvider selectionProvider) {
416 super(display);
417 this.selectionProvider = selectionProvider;
418 init();
419 }
420
421 /**
422 * <p>Constructor for CdmFormFactory.</p>
423 *
424 * @param display a {@link org.eclipse.swt.widgets.Display} object.
425 */
426 public CdmFormFactory(Display display){
427 super(display);
428 init();
429 }
430
431 /**
432 *
433 */
434 private void init() {
435 boldFontHolder2 = new BoldFontHolder2();
436 selectionMouseHandler = new SelectionMouseHandler();
437 selectionFocusHandler = new SelectionFocusHandler();
438 }
439
440 /**
441 * Creates an instance initialized with the correct selectionProvider
442 *
443 * Make sure to remove the instance when the entityComposite disposes via
444 * destroySelectionArbitrator(..)
445 *
446 * @param entityElement a {@link eu.etaxonomy.taxeditor.forms.IEntityElement} object.
447 * @return a {@link eu.etaxonomy.taxeditor.forms.SelectionArbitrator} object.
448 */
449 public SelectionArbitrator createSelectionArbitrator(IEntityElement entityElement){
450 SelectionArbitrator selectionArbitrator = new SelectionArbitrator(entityElement);
451 selectionArbitrator.addSelectionProvider(selectionProvider);
452 selectionProvider.addSelectionChangedListener(selectionArbitrator);
453 addSelectionListener(selectionArbitrator);
454 return selectionArbitrator;
455 }
456
457 /**
458 * <p>destroySelectionArbitrator</p>
459 *
460 * @param selectionArbitrator a {@link eu.etaxonomy.taxeditor.forms.SelectionArbitrator} object.
461 */
462 public void destroySelectionArbitrator(SelectionArbitrator selectionArbitrator){
463 removeSelectionListener(selectionArbitrator);
464 if(selectionProvider != null){
465 selectionProvider.removeSelectionChangedListener(selectionArbitrator);
466 }else{
467 EditorUtil.error(this.getClass(), "Tried to destroy a selection listener from this factories listeners but was null", null);
468 }
469 }
470
471 /** {@inheritDoc} */
472 @Override
473 public void adapt(Composite composite) {
474 composite.addMouseListener(selectionMouseHandler);
475 super.adapt(composite);
476 }
477
478 /**
479 * <p>adapt</p>
480 *
481 * @param formElement a {@link eu.etaxonomy.taxeditor.forms.AbstractCdmFormElement} object.
482 */
483 public void adapt(AbstractCdmFormElement formElement){
484 formElement.setPropertyChangeListeners(propertyChangeListeners);
485 }
486
487 /** {@inheritDoc} */
488 @Override
489 public void adapt(Control control, boolean trackFocus, boolean trackKeyboard) {
490 if(trackFocus){
491 control.addFocusListener(selectionFocusHandler);
492 }
493 super.adapt(control, trackFocus, trackKeyboard);
494 }
495
496 /**
497 * <p>destroyElement</p>
498 *
499 * @param formElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
500 */
501 public void destroyElement(ICdmFormElement formElement){
502 // return if element was not initialized
503 if(formElement == null){
504 return;
505 }
506 // destroy selection arbitrator, if any
507 if(formElement instanceof ISelectableElement){
508 destroySelectionArbitrator(((ISelectableElement) formElement).getSelectionArbitrator());
509 }
510 // remove this element form its parents list of elements
511 // ICdmFormElement parentElement = formElement.getParentElement();
512 // if(parentElement != null){
513 // parentElement.removeElement(formElement);
514 // }
515 // call destroy on child elements recursively
516 for(ICdmFormElement childElement : formElement.getElements()){
517 destroyElement(childElement);
518 }
519 // dispose of the controls
520 for(Control control : formElement.getControls()){
521 // we added the layoutComposite of the parental element as the layout composite to this formElement
522 // but we do not want to destroy it.
523 if(control.equals(formElement.getLayoutComposite())){
524 continue;
525 }else{
526 control.dispose();
527 control = null;
528 }
529 }
530 }
531
532
533 /**
534 * <p>createEmptyCell</p>
535 *
536 * @param parent a {@link org.eclipse.swt.widgets.Composite} object.
537 * @return a {@link org.eclipse.swt.widgets.Label} object.
538 */
539 public Label createEmptyCell(Composite parent){
540 return this.createLabel(parent, null);
541 }
542
543 /**
544 * <p>createMultilineTextWithLabel</p>
545 *
546 * @param labelString a {@link java.lang.String} object.
547 * @param textHeight a int.
548 * @param style a int.
549 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
550 * @return a {@link eu.etaxonomy.taxeditor.forms.TextWithLabelElement} object.
551 */
552 public TextWithLabelElement createMultilineTextWithLabel(ICdmFormElement parentElement, String labelString, int textHeight, int style){
553 TextWithLabelElement element = new TextWithLabelElement(this, parentElement, labelString, "", textHeight, style);
554 adapt(element);
555 parentElement.addElement(element);
556 return element;
557 }
558
559
560 /**
561 * <p>createMultiLanguageTextElement</p>
562 *
563 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
564 * @param labelString a {@link java.lang.String} object.
565 * @param multilanguageText a {@link java.util.Map} object.
566 * @param textHeight a int.
567 * @param style a int.
568 * @return a {@link eu.etaxonomy.taxeditor.forms.MultilanguageTextElement} object.
569 */
570 public MultilanguageTextElement createMultiLanguageTextElement(
571 ICdmFormElement parentElement, String labelString, Map<Language, LanguageString> multilanguageText, int textHeight,
572 int style) {
573 MultilanguageTextElement element = new MultilanguageTextElement(this, parentElement, labelString, multilanguageText, textHeight, style);
574 adapt(element);
575 parentElement.addElement(element);
576 return element;
577 }
578
579
580 /**
581 * <p>createTextWithLabelElement</p>
582 *
583 * @param labelString a {@link java.lang.String} object.
584 * @param initialText a {@link java.lang.String} object.
585 * @param style a int.
586 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
587 * @return a {@link eu.etaxonomy.taxeditor.forms.TextWithLabelElement} object.
588 */
589 public TextWithLabelElement createTextWithLabelElement(ICdmFormElement parentElement, String labelString, String initialText, int style){
590 TextWithLabelElement element = new TextWithLabelElement(this, parentElement, labelString, initialText, null, style);
591 adapt(element);
592 parentElement.addElement(element);
593 return element;
594 }
595
596 /**
597 * <p>createIntegerTextWithLabelElement</p>
598 *
599 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
600 * @param labelString a {@link java.lang.String} object.
601 * @param initialInteger a {@link java.lang.Integer} object.
602 * @param style a int.
603 * @return a {@link eu.etaxonomy.taxeditor.forms.NumberWithLabelElement} object.
604 */
605 public NumberWithLabelElement createIntegerTextWithLabelElement(ICdmFormElement parentElement, String labelString, Integer initialInteger, int style){
606 NumberWithLabelElement element = new NumberWithLabelElement(this, parentElement, labelString, initialInteger, style);
607 adapt(element);
608 parentElement.addElement(element);
609 return element;
610 }
611
612
613 /**
614 * <p>createFloatTextWithLabelElement</p>
615 *
616 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
617 * @param labelString a {@link java.lang.String} object.
618 * @param initialFloat a float.
619 * @param style a int.
620 * @return a {@link eu.etaxonomy.taxeditor.forms.NumberWithLabelElement} object.
621 */
622 public NumberWithLabelElement createFloatTextWithLabelElement(
623 ICdmFormElement parentElement, String labelString, float initialFloat,
624 int style) {
625 NumberWithLabelElement element = new NumberWithLabelElement(this, parentElement, labelString, initialFloat, style);
626 adapt(element);
627 parentElement.addElement(element);
628 return element;
629 }
630
631 /**
632 * <p>createLanguageStringWithLabelElement</p>
633 *
634 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
635 * @param labelString a {@link java.lang.String} object.
636 * @param languageString a {@link eu.etaxonomy.cdm.model.common.LanguageString} object.
637 * @param style a int.
638 * @return a {@link eu.etaxonomy.taxeditor.forms.LanguageStringWithLabelElement} object.
639 */
640 public LanguageStringWithLabelElement createLanguageStringWithLabelElement(ICdmFormElement parentElement, String labelString, LanguageString languageString, int style){
641 LanguageStringWithLabelElement element = new LanguageStringWithLabelElement(this, parentElement, labelString, languageString, style);
642 adapt(element);
643 parentElement.addElement(element);
644 return element;
645 }
646
647 /**
648 * <p>createLanguageStringWithLabelElement</p>
649 *
650 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
651 * @param labelString a {@link java.lang.String} object.
652 * @param languageString a {@link eu.etaxonomy.cdm.model.common.LanguageString} object.
653 * @param height a int.
654 * @param style a int.
655 * @return a {@link eu.etaxonomy.taxeditor.forms.LanguageStringWithLabelElement} object.
656 */
657 public LanguageStringWithLabelElement createLanguageStringWithLabelElement(ICdmFormElement parentElement, String labelString, LanguageString languageString, int height, int style){
658 LanguageStringWithLabelElement element = new LanguageStringWithLabelElement(this, parentElement, labelString, languageString, height, style);
659 adapt(element);
660 parentElement.addElement(element);
661 return element;
662 }
663
664 /**
665 * <p>createTextElement</p>
666 *
667 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
668 * @param initialText a {@link java.lang.String} object.
669 * @param style a int.
670 * @return a {@link eu.etaxonomy.taxeditor.forms.TextWithLabelElement} object.
671 */
672 public TextWithLabelElement createTextElement(ICdmFormElement parentElement, String initialText, int style){
673 TextWithLabelElement element = new TextWithLabelElement(this, parentElement, null, initialText, null, style);
674 adapt(element);
675 parentElement.addElement(element);
676 return element;
677 }
678
679 /**
680 * <p>createKeyValueViewerElement</p>
681 *
682 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
683 * @param keyHeading a {@link java.lang.String} object.
684 * @param valueHeading a {@link java.lang.String} object.
685 * @param map a {@link java.util.Map} object.
686 * @return a {@link eu.etaxonomy.taxeditor.forms.KeyValueViewerElement} object.
687 */
688 public KeyValueViewerElement createKeyValueViewerElement(ICdmFormElement parentElement, String keyHeading, String valueHeading, Map<Object, Object> map){
689 KeyValueViewerElement element = new KeyValueViewerElement(this, parentElement, keyHeading, valueHeading, map);
690 adapt(element);
691 parentElement.addElement(element);
692 return element;
693 }
694
695
696 public static enum TermComboType{
697 EXTENSIONTYPE,
698 LANGUAGE,
699 MARKERTYPE,
700 NOMENCLATURALSTATUSTYPE,
701 RANK,
702 RIGHTSTYPE,
703 NAMERELATIONSHIP,
704 NAMEDAREATYPE,
705 PRESENCEABSENCESTATUS,
706 ANNOTATIONTYPE,
707 NAMETYPEDESIGNATIONSTATUS,
708 SPECIMENTYPEDESIGNATIONSTATUS,
709 SEX,
710 STAGE,
711 PRESERVATION_METHOD,
712 MEASUREMENT_UNIT,
713 STATE,
714 MODIFIER,
715 STATISTICAL_MEASURE,
716 SCOPE,
717 EMPTY,
718 DETERMINATION_MODIFIER,
719 REFERENCE_SYSTEM
720 }
721
722 /**
723 * <p>createTermComboElement</p>
724 *
725 * @param termComboType a {@link eu.etaxonomy.taxeditor.forms.CdmFormFactory.TermComboType} object.
726 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
727 * @param labelString a {@link java.lang.String} object.
728 * @param selection a {@link eu.etaxonomy.cdm.model.common.DefinedTermBase} object.
729 * @param style a int.
730 * @return a {@link eu.etaxonomy.taxeditor.forms.term.AbstractTermComboElement} object.
731 */
732 public AbstractTermComboElement createTermComboElement(TermComboType termComboType, ICdmFormElement parentElement, String labelString, DefinedTermBase selection, int style){
733 AbstractTermComboElement element = null;
734
735 switch(termComboType){
736 case EMPTY:
737 element = new EmptyComboElement<DefinedTermBase>(this, parentElement, labelString, style);
738 break;
739 case EXTENSIONTYPE:
740 element = new ExtensionTypeComboElement(this, parentElement, labelString, (ExtensionType) selection, style);
741 break;
742 case LANGUAGE:
743 element = new LanguageComboElement(this, parentElement, labelString, (Language) selection, style);
744 break;
745 case MARKERTYPE:
746 element = new MarkerTypeComboElement(this, parentElement, labelString, (MarkerType) selection, style);
747 break;
748 case NOMENCLATURALSTATUSTYPE:
749 element = new NomenclaturalStatusTypeComboElement(this, parentElement, labelString, (NomenclaturalStatusType) selection, style);
750 break;
751 case RANK:
752 element = new RankComboElement(this, parentElement, labelString, (Rank) selection, style);
753 break;
754 case RIGHTSTYPE:
755 element = new RightsTypeComboElement(this, parentElement, labelString, (RightsTerm) selection, style);
756 break;
757 case NAMERELATIONSHIP:
758 element = new NameRelationshipTypeComboElement(this, parentElement, labelString, (NameRelationshipType) selection, style);
759 break;
760 case NAMEDAREATYPE:
761 element = new NamedAreaTypeComboElement(this, parentElement, labelString, (NamedAreaType) selection, style);
762 break;
763 case ANNOTATIONTYPE:
764 element = new AnnotationTypeComboElement(this, parentElement, labelString, (AnnotationType) selection, style);
765 break;
766 case PRESENCEABSENCESTATUS:
767 element = new PresenceAbsenceTermComboElement(this, parentElement, labelString, (PresenceAbsenceTermBase) selection, style);
768 break;
769 case NAMETYPEDESIGNATIONSTATUS:
770 element = new NameTypeDesignationStatusComboElement(this, parentElement, labelString, (NameTypeDesignationStatus) selection, style);
771 break;
772 case SPECIMENTYPEDESIGNATIONSTATUS:
773 element = new SpecimenTypeDesignationStatusComboElement(this, parentElement, labelString, (SpecimenTypeDesignationStatus) selection, style);
774 break;
775 case SEX:
776 element = new SexComboElement(this, parentElement, labelString, (Sex) selection, style);
777 break;
778 case STAGE:
779 element = new StageComboElement(this, parentElement, labelString, (Stage) selection, style);
780 break;
781 case PRESERVATION_METHOD:
782 element = new PreservationMethodComboElement(this, parentElement, labelString, (PreservationMethod) selection, style);
783 break;
784 case MEASUREMENT_UNIT:
785 element = new MeasurementUnitComboElement(this, parentElement, labelString, (MeasurementUnit) selection, style);
786 break;
787 case STATE:
788 element = new StateComboElement(this, parentElement, labelString, (State) selection, style);
789 break;
790 case SCOPE:
791 element = new ScopeComboElement(this, parentElement, labelString, (Scope) selection, style);
792 break;
793 case MODIFIER:
794 element = new ModifierComboElement(this, parentElement, labelString, (Modifier) selection, style);
795 break;
796 case STATISTICAL_MEASURE:
797 element = new StatisticalMeasureComboElement(this, parentElement, labelString, (StatisticalMeasure) selection, style);
798 break;
799 case DETERMINATION_MODIFIER:
800 element = new DeterminationModifierComboElement(this, parentElement, labelString, (DeterminationModifier) selection, style);
801 break;
802 case REFERENCE_SYSTEM:
803 element = new ReferenceSystemComboElement(this, parentElement, labelString, (ReferenceSystem) selection, style);
804 break;
805 }
806
807 adapt(element);
808 parentElement.addElement(element);
809 return element;
810 }
811
812 public static enum EnumComboType{
813 REFERENCETYPE,
814 NOMENCLATURALCODE
815 }
816
817 /**
818 * <p>createEnumComboElement</p>
819 *
820 * @param enumComboType a {@link eu.etaxonomy.taxeditor.forms.CdmFormFactory.EnumComboType} object.
821 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
822 * @param style a int.
823 * @return a {@link eu.etaxonomy.taxeditor.forms.term.AbstractEnumComboElement} object.
824 */
825 public AbstractEnumComboElement createEnumComboElement(EnumComboType enumComboType, ICdmFormElement parentElement, int style){
826 AbstractEnumComboElement element = null;
827
828 switch(enumComboType){
829 case REFERENCETYPE:
830 element = new ReferenceTypeComboElement(this, parentElement, "Reference Type", null, style);
831 break;
832 case NOMENCLATURALCODE:
833 element = new NomenclaturalCodeComboElement(this, parentElement, "Nomenclatural Code", null, style);
834 break;
835 }
836 adapt(element);
837 parentElement.addElement(element);
838 return element;
839 }
840
841 /**
842 * <p>createBrowserElement</p>
843 *
844 * @param imageUri a {@link java.net.URI} object.
845 * @param style a int.
846 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
847 * @return a {@link eu.etaxonomy.taxeditor.forms.BrowserElement} object.
848 */
849 public BrowserElement createBrowserElement(ICdmFormElement parentElement, URI imageUri, int style){
850 BrowserElement element = new BrowserElement(this, parentElement, imageUri, style);
851 adapt(element);
852 parentElement.addElement(element);
853 return element;
854 }
855
856 /**
857 * <p>createImageElement</p>
858 *
859 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
860 * @param imageUri a {@link java.net.URI} object.
861 * @param style a int.
862 * @return a {@link eu.etaxonomy.taxeditor.forms.ImageElement} object.
863 */
864 public ImageElement createImageElement(ICdmFormElement parentElement, URI imageUri, int style) {
865 ImageElement element = new ImageElement(this, parentElement, imageUri, style);
866 adapt(element);
867 parentElement.addElement(element);
868 return element;
869 }
870
871 /**
872 * <p>createTextActionElement</p>
873 *
874 * @param labelString a {@link java.lang.String} object.
875 * @param initialText a {@link java.lang.String} object.
876 * @param style a int.
877 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
878 * @param buttonLabel a {@link java.lang.String} object.
879 * @return a {@link eu.etaxonomy.taxeditor.forms.TextActionElement} object.
880 */
881 public TextActionElement createTextActionElement(ICdmFormElement parentElement, String labelString, String buttonLabel, String initialText, int style){
882 TextActionElement element = new TextActionElement(this, parentElement, labelString, buttonLabel, initialText, style);
883 adapt(element);
884 parentElement.addElement(element);
885 return element;
886 }
887
888 /**
889 *
890 * @author n.hoffmann
891 * @created Mar 5, 2010
892 * @version 1.0
893 */
894 public static enum SelectionType{
895 AGENT,
896 INSTITUTION,
897 NAME,
898 REFERENCE,
899 TAXON_BASE,
900 TEAM,
901 AUTHOR_TEAM,
902 PERSON,
903 DERIVED_UNIT,
904 FIELD_OBSERVATION,
905 FEATURE_TREE,
906 CLASSIFICATION,
907 TAXON_NODE,
908 COLLECTION
909 }
910
911 /**
912 * <p>createCheckbox</p>
913 *
914 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
915 * @param label a {@link java.lang.String} object.
916 * @param initialState a boolean.
917 * @param style a int.
918 * @return a {@link eu.etaxonomy.taxeditor.forms.CheckboxElement} object.
919 */
920 public CheckboxElement createCheckbox(ICdmFormElement parentElement, String label, boolean initialState, int style) {
921 CheckboxElement element = new CheckboxElement(this, parentElement, label, initialState, style | orientation);
922 adapt(element);
923 parentElement.addElement(element);
924 return element;
925 }
926
927
928
929 /**
930 * Creates a section as a part of the form.
931 *
932 * @return the section widget
933 * @param section a {@link eu.etaxonomy.taxeditor.forms.AbstractFormSection} object.
934 */
935 public Section adapt(AbstractFormSection section) {
936 section.setMenu(section.getLayoutComposite().getMenu());
937 adapt(section, true, true);
938
939 // handle focus and property change events for cdm use
940 section.addFocusListener(selectionFocusHandler);
941 section.setPropertyChangeListeners(propertyChangeListeners);
942
943 if (section.getToggle() != null) {
944 section.getToggle().setHoverDecorationColor(getColors()
945 .getColor(IFormColors.TB_TOGGLE_HOVER));
946 section.getToggle().setDecorationColor(getColors()
947 .getColor(IFormColors.TB_TOGGLE));
948 }
949
950 section.setFont(boldFontHolder2.getBoldFont(section.getLayoutComposite().getFont()));
951
952 if ((section.getStyle() & Section.TITLE_BAR) != 0
953 || (section.getStyle() & Section.SHORT_TITLE_BAR) != 0) {
954 getColors().initializeSectionToolBarColors();
955 section.setTitleBarBackground(getColors().getColor(IFormColors.TB_BG));
956 section.setTitleBarBorderColor(getColors()
957 .getColor(IFormColors.TB_BORDER));
958 }
959 // call setTitleBarForeground regardless as it also sets the label color
960 section.setTitleBarForeground(getColors()
961 .getColor(IFormColors.TB_TOGGLE));
962 return section;
963 }
964
965 private class BoldFontHolder2 {
966 private Font normalFont;
967
968 private Font boldFont;
969
970 public BoldFontHolder2() {
971 }
972
973 public Font getBoldFont(Font font) {
974 createBoldFont(font);
975 return boldFont;
976 }
977
978 private void createBoldFont(Font font) {
979 if (normalFont == null || !normalFont.equals(font)) {
980 normalFont = font;
981 dispose();
982 }
983 if (boldFont == null) {
984 boldFont = FormFonts.getInstance().getBoldFont(getColors().getDisplay(),
985 normalFont);
986 }
987 }
988
989 public void dispose() {
990 if (boldFont != null) {
991 FormFonts.getInstance().markFinished(boldFont, getColors().getDisplay());
992 boldFont = null;
993 }
994 }
995 }
996
997 /**
998 * <p>createToggleableTextField</p>
999 *
1000 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
1001 * @param labelString a {@link java.lang.String} object.
1002 * @param initialText a {@link java.lang.String} object.
1003 * @param initialState a boolean.
1004 * @param style a int.
1005 * @return a {@link eu.etaxonomy.taxeditor.forms.ToggleableTextElement} object.
1006 */
1007 public ToggleableTextElement createToggleableTextField(ICdmFormElement parentElement,
1008 String labelString, String initialText, boolean initialState, int style) {
1009 ToggleableTextElement element = new ToggleableTextElement(this, parentElement,
1010 labelString, initialText, initialState, style | orientation);
1011 adapt(element);
1012 parentElement.addElement(element);
1013 return element;
1014 }
1015
1016 /**
1017 * <p>createTimePeriodElement</p>
1018 *
1019 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
1020 * @param labelString a {@link java.lang.String} object.
1021 * @param timePeriod a {@link eu.etaxonomy.cdm.model.common.TimePeriod} object.
1022 * @param style a int.
1023 * @return a {@link eu.etaxonomy.taxeditor.forms.TimePeriodElement} object.
1024 */
1025 public TimePeriodElement createTimePeriodElement(
1026 ICdmFormElement parentElement, String labelString, TimePeriod timePeriod, int style) {
1027 TimePeriodElement element = new TimePeriodElement(this, parentElement, labelString, timePeriod, style);
1028 adapt(element);
1029 parentElement.addElement(element);
1030 return element;
1031 }
1032
1033
1034 /**
1035 * <p>createPointElement</p>
1036 *
1037 * @param style a int.
1038 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
1039 * @param point a {@link eu.etaxonomy.cdm.model.location.Point} object.
1040 * @return a {@link eu.etaxonomy.taxeditor.forms.PointElement} object.
1041 */
1042 public PointElement createPointElement(ICdmFormElement parentElement,
1043 Point point, int style) {
1044 PointElement element = new PointElement(this, parentElement, point, style);
1045 adapt(element);
1046 parentElement.addElement(element);
1047 return element;
1048 }
1049
1050 /**
1051 * <p>createDateDetailSection</p>
1052 *
1053 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
1054 * @param style a int.
1055 * @return a {@link eu.etaxonomy.taxeditor.forms.DateDetailSection} object.
1056 */
1057 public DateDetailSection createDateDetailSection(ICdmFormElement parentElement, int style){
1058 DateDetailSection section = new DateDetailSection(this, parentElement, style);
1059 parentElement.addElement(section);
1060 adapt(section);
1061 return section;
1062 }
1063
1064 /**
1065 * <p>createPartialElement</p>
1066 *
1067 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
1068 * @param labelString a {@link java.lang.String} object.
1069 * @param partial a {@link org.joda.time.Partial} object.
1070 * @param style a int.
1071 * @return a {@link eu.etaxonomy.taxeditor.forms.PartialElement} object.
1072 */
1073 public PartialElement createPartialElement(ICdmFormElement parentElement, String labelString, Partial partial, int style){
1074 PartialElement element = new PartialElement(this, parentElement, labelString, style);
1075 adapt(element);
1076 parentElement.addElement(element);
1077 return element;
1078 }
1079
1080 /**
1081 * <p>addSelectionListener</p>
1082 *
1083 * @param listener a {@link org.eclipse.swt.events.SelectionListener} object.
1084 */
1085 public void addSelectionListener(SelectionListener listener){
1086 selectionListenerList.add(listener);
1087 }
1088
1089 /**
1090 * <p>removeSelectionListener</p>
1091 *
1092 * @param listener a {@link org.eclipse.swt.events.SelectionListener} object.
1093 */
1094 public void removeSelectionListener(SelectionListener listener){
1095 if(listener == null){
1096 EditorUtil.error(this.getClass(), "Tried to remove a selection listener from this factories listeners but was null", null);
1097 }else{
1098 selectionListenerList.remove(listener);
1099 }
1100 }
1101
1102 /**
1103 * <p>addPropertyChangeListener</p>
1104 *
1105 * @param listener a {@link org.eclipse.jface.util.IPropertyChangeListener} object.
1106 */
1107 public void addPropertyChangeListener(IPropertyChangeListener listener) {
1108 propertyChangeListeners.add(listener);
1109 }
1110
1111 /**
1112 * <p>removePropertyChangeListener</p>
1113 *
1114 * @param listener a {@link org.eclipse.jface.util.IPropertyChangeListener} object.
1115 */
1116 public void removePropertyChangeListener(IPropertyChangeListener listener){
1117 propertyChangeListeners.remove(listener);
1118 }
1119
1120
1121
1122 /**
1123 * <p>createHorizontalSeparator</p>
1124 *
1125 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
1126 * @param style a int.
1127 * @return a {@link org.eclipse.swt.widgets.Label} object.
1128 */
1129 public Label createHorizontalSeparator(ICdmFormElement parentElement, int style) {
1130 Label separator = this.createSeparator(parentElement.getLayoutComposite(), SWT.HORIZONTAL | style);
1131 separator.setLayoutData(FILL_HORIZONTALLY());
1132 return separator;
1133 }
1134
1135 /**
1136 * <p>createVersionElement</p>
1137 *
1138 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
1139 * @param entity a {@link eu.etaxonomy.cdm.model.common.VersionableEntity} object.
1140 * @param style a int.
1141 * @return a {@link eu.etaxonomy.taxeditor.section.supplemental.VersionElement} object.
1142 */
1143 public VersionElement createVersionElement(ICdmFormElement parentElement, VersionableEntity entity,
1144 int style) {
1145 VersionElement element = new VersionElement(this, parentElement, entity, style);
1146 adapt(element);
1147 parentElement.addElement(element);
1148 return element;
1149 }
1150
1151 /**
1152 * <p>createVersionSection</p>
1153 *
1154 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
1155 * @param style a int.
1156 * @return a {@link eu.etaxonomy.taxeditor.section.supplemental.VersionSection} object.
1157 */
1158 public VersionSection createVersionSection(ICdmFormElement parentElement, int style) {
1159 VersionSection section = new VersionSection(this, parentElement, style);
1160 parentElement.addElement(section);
1161 adapt(section);
1162 return section;
1163 }
1164
1165 /**
1166 * <p>createEmptyElement</p>
1167 *
1168 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
1169 * @return a {@link eu.etaxonomy.taxeditor.section.EmptyElement} object.
1170 */
1171 public EmptyElement createEmptyElement(ICdmFormElement parentElement) {
1172 EmptyElement element = new EmptyElement(this, parentElement, null, SWT.NULL);
1173 adapt(element);
1174 parentElement.addElement(element);
1175 return element;
1176 }
1177
1178 /**
1179 * <p>createHeadlineSection</p>
1180 *
1181 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
1182 * @return a {@link eu.etaxonomy.taxeditor.section.supplemental.HeadlineSection} object.
1183 */
1184 public HeadlineSection createHeadlineSection(ICdmFormElement parentElement) {
1185 HeadlineSection section = new HeadlineSection(this, parentElement, SWT.NULL);
1186 parentElement.addElement(section);
1187 adapt(section);
1188 return section;
1189 }
1190
1191
1192 /**
1193 * <p>createParsingMessageElement</p>
1194 *
1195 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
1196 * @param parserProblem a {@link eu.etaxonomy.cdm.strategy.parser.ParserProblem} object.
1197 * @param style a int.
1198 * @return a {@link eu.etaxonomy.taxeditor.section.taxon.ParsingMessageElement} object.
1199 */
1200 public ParsingMessageElement createParsingMessageElement(
1201 ICdmFormElement parentElement, ParserProblem parserProblem, int style) {
1202 ParsingMessageElement element = new ParsingMessageElement(this, parentElement, parserProblem, style);
1203 adapt(element);
1204 parentElement.addElement(element);
1205 return element;
1206 }
1207
1208
1209 // SIMPLIFY
1210
1211 /**
1212 *
1213 */
1214 public static enum DetailType{
1215 NONVIRALNAME,
1216 SCIENTIFICNAME,
1217 REFERENCEBASE,
1218 NOMENCLATURALREFERENCE,
1219 TAXONBASE,
1220 AUTHORSHIP,
1221 TEAM,
1222 PERSON,
1223 DESCRIPTION,
1224 DESCRIPTIONELEMENT,
1225 PARSINGMESSAGE,
1226 NAMERELATIONSHIP,
1227 TEAMORPERSONBASE,
1228 MEDIA,
1229 FIELD_OBSERVATION,
1230 DERIVED_UNIT_FACADE,
1231 GATHERING_EVENT,
1232 DERIVED_UNIT, NATURAL_LANGUAGE,
1233 FEATURE_DISTRIBUTION,
1234 CLASSIFICATION,
1235 TAXON_NODE,
1236 COLLECTION
1237 }
1238
1239 /**
1240 * <p>createCdmDetailSection</p>
1241 *
1242 * @param detailType a {@link eu.etaxonomy.taxeditor.forms.CdmFormFactory.DetailType} object.
1243 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
1244 * @param selectionProvider a {@link org.eclipse.jface.viewers.ISelectionProvider} object.
1245 * @param style a int.
1246 * @param conversation a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
1247 * @return a {@link eu.etaxonomy.taxeditor.forms.AbstractFormSection} object.
1248 */
1249 public AbstractFormSection createCdmDetailSection(DetailType detailType, ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){
1250 AbstractFormSection section = null;
1251
1252 switch(detailType){
1253 case SCIENTIFICNAME:
1254 section = new NameDetailSection(this, conversation, parentElement, selectionProvider, style);
1255 break;
1256 case REFERENCEBASE:
1257 section = new ReferenceBaseDetailSection(this, conversation, parentElement, selectionProvider, style);
1258 break;
1259 case NOMENCLATURALREFERENCE:
1260 section = new NomenclaturalReferenceDetailSection(this, conversation, parentElement, selectionProvider, style);
1261 break;
1262 case TAXONBASE:
1263 section = new TaxonBaseDetailSection(this, conversation, parentElement, selectionProvider, style);
1264 break;
1265 case AUTHORSHIP:
1266 section = new AuthorshipDetailSection(this, conversation, parentElement, selectionProvider, style);
1267 break;
1268 case TEAMORPERSONBASE:
1269 section = new TeamOrPersonBaseDetailSection(this, conversation, parentElement, selectionProvider, style);
1270 break;
1271 case TEAM:
1272 section = new TeamDetailSection(this, conversation, parentElement, null, style);
1273 break;
1274 case PERSON:
1275 section = new PersonDetailSection(this, conversation, parentElement, null, style);
1276 break;
1277 case DESCRIPTION:
1278 section = new DescriptionDetailSection(this, conversation, parentElement, selectionProvider, style);
1279 break;
1280 case DESCRIPTIONELEMENT:
1281 section = new DescriptionElementDetailSection(this, conversation, parentElement, selectionProvider, style);
1282 break;
1283 case PARSINGMESSAGE:
1284 section = new ParsingMessagesSection(this, conversation, parentElement, selectionProvider, style);
1285 break;
1286 case NONVIRALNAME:
1287 section = new NonViralNameDetailSection(this, conversation, parentElement, selectionProvider, style);
1288 break;
1289 case MEDIA:
1290 section = new eu.etaxonomy.taxeditor.section.description.MediaDetailsSection(this, conversation, parentElement, selectionProvider, style);
1291 break;
1292 case DERIVED_UNIT_FACADE:
1293 section = new DerivedUnitFacadeDetailSection(this, conversation, parentElement, selectionProvider, style);
1294 break;
1295 case FIELD_OBSERVATION:
1296 section = new FieldObservationDetailSection(this, conversation, parentElement, selectionProvider, style);
1297 break;
1298 case GATHERING_EVENT:
1299 section = new GatheringEventDetailSection(this, conversation, parentElement, selectionProvider, style);
1300 break;
1301 case DERIVED_UNIT:
1302 section = new DerivedUnitBaseDetailSection(this, conversation, parentElement, selectionProvider, style);
1303 break;
1304 case NATURAL_LANGUAGE:
1305 section = new NaturalLanguageSection(this, conversation, parentElement, selectionProvider, style);
1306 break;
1307 case FEATURE_DISTRIBUTION:
1308 section = new FeatureDistributionDetailSection(this, conversation, parentElement, selectionProvider, style);
1309 break;
1310 case CLASSIFICATION:
1311 section = new ClassificationDetailSection(this, conversation, parentElement, selectionProvider, style);
1312 break;
1313 case TAXON_NODE:
1314 section = new TaxonNodeDetailSection(this, conversation, parentElement, selectionProvider, style);
1315 break;
1316 }
1317 parentElement.addElement(section);
1318 adapt(section);
1319 return section;
1320 }
1321
1322 /**
1323 * <p>createCdmDetailElement</p>
1324 *
1325 * @param detailType a {@link eu.etaxonomy.taxeditor.forms.CdmFormFactory.DetailType} object.
1326 * @param style a int.
1327 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
1328 * @return a {@link eu.etaxonomy.taxeditor.section.AbstractCdmDetailElement} object.
1329 */
1330 public AbstractCdmDetailElement createCdmDetailElement(DetailType detailType, ICdmFormElement parentElement, int style){
1331 AbstractCdmDetailElement element = null;
1332
1333 switch(detailType){
1334 case SCIENTIFICNAME:
1335 element = new NameDetailElement(this, parentElement, style);
1336 break;
1337 case REFERENCEBASE:
1338 element = new ReferenceBaseDetailElement(this, parentElement, style);
1339 break;
1340 case NOMENCLATURALREFERENCE:
1341 element = new NomenclaturalReferenceDetailElement(this, parentElement, style);
1342 break;
1343 case TAXONBASE:
1344 element = new TaxonBaseDetailElement(this, parentElement, style);
1345 break;
1346 case AUTHORSHIP:
1347 element = new AuthorshipDetailElement(this, parentElement, style);
1348 break;
1349 case TEAM:
1350 element = new TeamDetailElement(this, parentElement, style);
1351 break;
1352 case PERSON:
1353 element = new PersonDetailElement(this, parentElement, style);
1354 break;
1355 case DESCRIPTION:
1356 element = new DescriptionDetailElement(this, parentElement, style);
1357 break;
1358 case DESCRIPTIONELEMENT:
1359 element = new DescriptionElementDetailElement(this, parentElement, style);
1360 break;
1361 case NONVIRALNAME:
1362 element = new NonViralNameDetailElement(this, parentElement);
1363 break;
1364 case DERIVED_UNIT_FACADE:
1365 element = new DerivedUnitFacadeDetailElement(this, parentElement);
1366 break;
1367 case FIELD_OBSERVATION:
1368 element = new FieldObservationDetailElement(this, parentElement);
1369 break;
1370 case GATHERING_EVENT:
1371 element = new GatheringEventDetailElement(this, parentElement);
1372 break;
1373 case DERIVED_UNIT:
1374 element = new DerivedUnitBaseDetailElement(this, parentElement);
1375 break;
1376 case NATURAL_LANGUAGE:
1377 element = new NaturalLanguageDetailElement(this, parentElement);
1378 break;
1379 case FEATURE_DISTRIBUTION:
1380 element = new FeatureDistributionDetailElement(this, parentElement);
1381 break;
1382 case CLASSIFICATION:
1383 element = new ClassificationDetailElement(this, parentElement);
1384 break;
1385 case TAXON_NODE:
1386 element = new TaxonNodeDetailElement(this, parentElement);
1387 break;
1388 case COLLECTION:
1389 element = new CollectionDetailElement(this, parentElement);
1390 break;
1391 }
1392
1393 if(element == null){
1394 EditorUtil.error(this.getClass(), "Detail element was not created. Seems like the case was not implemented for the requested detail type: " + detailType, null);
1395 }
1396
1397 adapt(element);
1398 parentElement.addElement(element);
1399 return element;
1400 }
1401
1402 /**
1403 *
1404 * @author n.hoffmann
1405 * @created Mar 5, 2010
1406 * @version 1.0
1407 */
1408 public static enum EntityDetailType{
1409 TEAM,
1410 TEAMMEMBER,
1411 ANNOTATION,
1412 CREDIT,
1413 DESCRIPTIONELEMENTSOURCE,
1414 EXTENSION,
1415 MARKER,
1416 MEDIA,
1417 DESCRIPTIONELEMENTMEDIA,
1418 MEDIAREPRESENTATION,
1419 MEDIAREPRESENTATIONPART,
1420 MODIFIER,
1421 NOMENCLATURALSTATUS,
1422 NAME_RELATIONSHIP,
1423 PROTOLOG,
1424 RIGHTS,
1425 SOURCE,
1426 SCOPE,
1427 DESCRIPTIONSOURCE,
1428 TYPEDESIGNATION,
1429 STATE_DATA,
1430 STATISTICAL_MEASUREMENT_VALUE,
1431 DESCRIBED_SPECIMEN,
1432 COLLECTING_AREA,
1433 DETERMINATION_EVENT,
1434 SPECIMEN_COLLECTION,
1435 IDENTIFIABLE_SOURCE_COLLECTION
1436 }
1437
1438 /**
1439 * <p>createEntityDetailSection</p>
1440 *
1441 * @param entityDetailType a {@link eu.etaxonomy.taxeditor.forms.CdmFormFactory.EntityDetailType} object.
1442 * @param style a int.
1443 * @param conversation a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
1444 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
1445 * @return a {@link eu.etaxonomy.taxeditor.forms.AbstractFormSection} object.
1446 */
1447 public AbstractFormSection createEntityDetailSection(EntityDetailType entityDetailType, ConversationHolder conversation, ICdmFormElement parentElement, int style){
1448 AbstractFormSection section = null;
1449
1450 switch(entityDetailType){
1451 case TEAM:
1452 section = new TeamDetailSection(this, conversation, parentElement, null, style);
1453 break;
1454 case TEAMMEMBER:
1455 section = new TeamMemberSection(this, conversation, parentElement, style);
1456 break;
1457 case ANNOTATION:
1458 section = new AnnotationSection(this, conversation, parentElement, style);
1459 break;
1460 case CREDIT:
1461 section = new CreditSection(this, conversation, parentElement, style);
1462 break;
1463 case DESCRIPTIONELEMENTSOURCE:
1464 section = new DescriptionElementSourceSection(this, conversation, parentElement, style);
1465 break;
1466 case EXTENSION:
1467 section = new ExtensionSection(this, conversation, parentElement, style);
1468 break;
1469 case MARKER:
1470 section = new MarkerSection(this, conversation, parentElement, style);
1471 break;
1472 case MEDIA:
1473 section = new MediaSection(this, conversation, parentElement, style);
1474 break;
1475 case DESCRIPTIONELEMENTMEDIA:
1476 section = new DescriptionElementMediaSection(this, conversation, parentElement, style);
1477 break;
1478 case MEDIAREPRESENTATION:
1479 section = new MediaRepresentationSection(this, conversation, parentElement, style);
1480 break;
1481 case MEDIAREPRESENTATIONPART:
1482 section = new MediaRepresentationPartSection(this, conversation, parentElement, style);
1483 break;
1484 case MODIFIER:
1485 section = new ModifierSection(this, conversation, parentElement, style);
1486 break;
1487 case NOMENCLATURALSTATUS:
1488 section = new NomenclaturalStatusSection(this, conversation, parentElement, style);
1489 break;
1490 case NAME_RELATIONSHIP:
1491 section = new NameRelationshipDetailSection(this, conversation, parentElement, style);
1492 break;
1493 case PROTOLOG:
1494 section = new ProtologueSection(this, conversation, parentElement, style);
1495 break;
1496 case RIGHTS:
1497 section = new RightsSection(this, conversation, parentElement, style);
1498 break;
1499 case SOURCE:
1500 section = new SourceSection(this, conversation, parentElement, style);
1501 break;
1502 case SCOPE:
1503 section = new ScopeSection(this, conversation, parentElement, style);
1504 break;
1505 case DESCRIPTIONSOURCE:
1506 section = new DescriptionSourceSection(this, conversation, parentElement, style);
1507 break;
1508 case TYPEDESIGNATION:
1509 section = new TypeDesignationSection(this, conversation, parentElement, style);
1510 break;
1511 case STATE_DATA:
1512 section = new StateDataSection(this, conversation, parentElement, style);
1513 break;
1514 case STATISTICAL_MEASUREMENT_VALUE:
1515 section = new StatisticalMeasurementValueSection(this, conversation, parentElement, style);
1516 break;
1517 case DESCRIBED_SPECIMEN:
1518 section = new DescribedSpecimenSection(this, conversation, parentElement, style);
1519 break;
1520 case COLLECTING_AREA:
1521 section = new CollectingAreasDetailSection(this, conversation, parentElement, style);
1522 break;
1523 case DETERMINATION_EVENT:
1524 section = new DeterminationEventDetailSection(this, conversation, parentElement, style);
1525 break;
1526 case SPECIMEN_COLLECTION:
1527 section = new SpecimenCollectionDetailSection(this, conversation, parentElement, style);
1528 break;
1529 case IDENTIFIABLE_SOURCE_COLLECTION:
1530 section = new SourceCollectionDetailSection(this, conversation, parentElement, style);
1531 break;
1532
1533 }
1534 parentElement.addElement(section);
1535 adapt(section);
1536 return section;
1537 }
1538
1539 /**
1540 * <p>createEntityCollectionElement</p>
1541 *
1542 * @param removeListener a {@link org.eclipse.swt.events.SelectionListener} object.
1543 * @param style a int.
1544 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.AbstractFormSection} object.
1545 * @param versionableEntity a {@link eu.etaxonomy.cdm.model.common.IVersionableEntity} object.
1546 * @param backgroundColor a {@link org.eclipse.swt.graphics.Color} object.
1547 * @return a {@link eu.etaxonomy.taxeditor.section.AbstractEntityCollectionElement} object.
1548 */
1549 public AbstractEntityCollectionElement createEntityCollectionElement(AbstractFormSection parentElement, IVersionableEntity versionableEntity, SelectionListener removeListener, Color backgroundColor, int style){
1550 AbstractEntityCollectionElement element = null;
1551
1552 VersionableEntity entity = (VersionableEntity) HibernateProxyHelper.deproxy(versionableEntity);
1553
1554 if(entity instanceof Annotation){
1555 element = new AnnotationElement(this, parentElement, (Annotation) entity, removeListener, style);
1556 }
1557 else if(entity instanceof Person){
1558 element = new TeamMemberElement(this, parentElement, (Person) entity, removeListener, style);
1559 }
1560 else if(entity instanceof Credit){
1561 element = new CreditElement(this, parentElement, (Credit) entity, removeListener, style);
1562 }
1563 else if(entity instanceof Extension){
1564 element = new ExtensionElement(this, parentElement, (Extension) entity, removeListener, style);
1565 }
1566 else if(entity instanceof Marker){
1567 element = new MarkerElement(this, parentElement, (Marker) entity, removeListener, style);
1568 }
1569 else if(entity instanceof Media){
1570 element = new MediaElement(this, parentElement, (Media) entity, removeListener, style);
1571 }
1572 else if(entity instanceof MediaRepresentation){
1573 element = new MediaRepresentationElement(this, parentElement, (MediaRepresentation) entity, removeListener, style);
1574 }
1575 else if(entity instanceof ImageFile){
1576 element = new ImageFileElement(this, parentElement, (ImageFile) entity, removeListener, style);
1577 }
1578 else if(entity instanceof NomenclaturalStatus){
1579 element = new NomenclaturalStatusElement(this, parentElement, (NomenclaturalStatus) entity, removeListener, style);
1580 }
1581 else if(entity instanceof Rights){
1582 element = new RightsElement(this, parentElement, (Rights) entity, removeListener, style);
1583 }
1584 else if(entity instanceof DescriptionElementSource){
1585 element = new DescriptionElementSourceElement(this, parentElement, (DescriptionElementSource) entity, removeListener, style);
1586 }
1587 else if(entity instanceof IdentifiableSource){
1588 element = new IdentifiableSourceElement(this, parentElement, (IdentifiableSource) entity, removeListener, style);
1589 }
1590 else if(entity instanceof Scope){
1591 element = new ScopeElement(this, parentElement, (Scope) entity, removeListener, style);
1592 }
1593 else if(entity instanceof Modifier){
1594 element = new ModifierElement(this, parentElement, (Modifier) entity, removeListener, style);
1595 }
1596 else if(entity instanceof Reference){
1597 element = new DescriptionSourceElement(this, parentElement, (Reference) entity, removeListener, style);
1598 }
1599 else if(entity instanceof NameTypeDesignation){
1600 element = new NameTypeDesignationElement(this, parentElement, (NameTypeDesignation) entity, removeListener, style);
1601 }
1602 else if(entity instanceof NameRelationship){
1603 element = new NameRelationshipDetailElement(this, parentElement, (NameRelationship) entity, removeListener, style);
1604 }
1605 else if(entity instanceof SpecimenTypeDesignation){
1606 element = new SpecimenTypeDesignationElement(this, parentElement, (SpecimenTypeDesignation) entity, removeListener, style);
1607 }
1608 else if(entity instanceof StateData){
1609 element = new StateDataElement(this, parentElement, (StateData) entity, removeListener, style);
1610 }
1611 else if(entity instanceof StatisticalMeasurementValue){
1612 element = new StatisticalMeasurementValueElement(this, parentElement, (StatisticalMeasurementValue) entity, removeListener, style);
1613 }
1614 else if(entity instanceof DerivedUnit){
1615 element = new DerivedUnitElement(this, parentElement, (DerivedUnit) entity, removeListener, style);
1616 }
1617 else if(entity instanceof NamedArea){
1618 element = new CollectingAreasDetailElement(this, parentElement, (NamedArea) entity, removeListener, style);
1619 }
1620 else if(entity instanceof DeterminationEvent){
1621 element = new DeterminationEventDetailElement(this, parentElement, (DeterminationEvent) entity, removeListener, style);
1622 }
1623 else if(entity instanceof Specimen){
1624 element = new SpecimenCollectionDetailElement(this, parentElement, (Specimen) entity, removeListener, style);
1625 }
1626
1627 else if(entity instanceof DescriptionElementBase){
1628 // this is the special case for protologs, maybe we can do this differently when API improves
1629 DescriptionElementBase descriptionElement = (DescriptionElementBase) entity;
1630 if(descriptionElement.getFeature().equals(Feature.PROTOLOGUE())){
1631 element = new ProtologueElement(this, parentElement, descriptionElement, removeListener, style);
1632 }
1633 }
1634
1635 if(element == null){
1636 EditorUtil.errorDialog("No element for entity", this, "Could not generate element for entity. " +
1637 "Looks like the case is not handled already. Check implementation. Entity: " + entity, null);
1638 }
1639
1640 if(backgroundColor != null && !backgroundColor.isDisposed()){
1641 element.setBackgroundColor(backgroundColor);
1642 }
1643
1644 adapt(element);
1645 parentElement.addElement(element);
1646 return element;
1647 }
1648
1649 /**
1650 * <p>createSelectionElement</p>
1651 *
1652 * @param selectionType a {@link eu.etaxonomy.taxeditor.forms.CdmFormFactory.SelectionType} object.
1653 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
1654 * @param labelString a {@link java.lang.String} object.
1655 * @param selectionType
1656 * @param selection a {@link eu.etaxonomy.cdm.model.common.IAnnotatableEntity} object.
1657 * @param style a int.
1658 * @param conversation a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
1659 * @return a {@link eu.etaxonomy.taxeditor.forms.selection.AbstractSelectionElement} object.
1660 */
1661 public AbstractSelectionElement createSelectionElement(SelectionType selectionType, ConversationHolder conversation, ICdmFormElement parentElement, String labelString, IAnnotatableEntity selection, int style){
1662 AbstractSelectionElement element = null;
1663
1664 IAnnotatableEntity entity = (IAnnotatableEntity) HibernateProxyHelper.deproxy(selection);
1665
1666 switch (selectionType) {
1667 case AGENT:
1668 element = new AgentSelectionElement(this, conversation, parentElement, labelString, (TeamOrPersonBase) entity, style);
1669 break;
1670 case PERSON:
1671 element = new PersonSelectionElement(this, conversation, parentElement, labelString, (Person) entity, style);
1672 break;
1673 case TEAM:
1674 element = new TeamSelectionElement(this, conversation, parentElement, labelString, (Team) entity, style);
1675 break;
1676 case AUTHOR_TEAM:
1677 element = new NomenclaturalAuthorTeamSelectionElement(this, conversation, parentElement, labelString, (Team) entity, style);
1678 break;
1679 case INSTITUTION:
1680 element = new InstitutionSelectionElement(this, conversation, parentElement, labelString, (Institution) entity, style);
1681 break;
1682 case NAME:
1683 element = new NameSelectionElement(this, conversation, parentElement, labelString, (TaxonNameBase) entity, style);
1684 break;
1685 case REFERENCE:
1686 element = new ReferenceSelectionElement(this, conversation, parentElement, labelString, (Reference) entity, style);
1687 break;
1688 case TAXON_BASE:
1689 element = new TaxonBaseSelectionElement(this, conversation, parentElement, labelString, (TaxonBase) entity, style);
1690 break;
1691 case DERIVED_UNIT:
1692 element = new DerivedUnitBaseSelectionElement(this, conversation, parentElement, labelString, (DerivedUnitBase) entity, style);
1693 break;
1694 case FIELD_OBSERVATION:
1695 element = new FieldObservationSelectionElement(this, conversation, parentElement, labelString, (FieldObservation) entity, style);
1696 break;
1697 case FEATURE_TREE:
1698 element = new FeatureTreeSelectionElement(this, conversation, parentElement, labelString, (FeatureTree) entity, style);
1699 break;
1700 case CLASSIFICATION:
1701 element = new ClassificationSelectionElement(this, conversation, parentElement, labelString, (Classification) entity, style);
1702 break;
1703 case TAXON_NODE:
1704 element = new TaxonNodeSelectionElement(this, conversation, parentElement, labelString, (TaxonNode) entity, style);
1705 break;
1706 case COLLECTION:
1707 element = new CollectionSelectionElement(this, conversation, parentElement, labelString, (Collection) entity, style);
1708 break;
1709 default:
1710 new RuntimeException("There is no selection composite for the desired selection type.");
1711 break;
1712 }
1713
1714 adapt(element);
1715 parentElement.addElement(element);
1716 return element;
1717 }
1718
1719 /**
1720 * <p>createNamedAreaSelectionElement</p>
1721 *
1722 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
1723 * @param conversation a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
1724 * @param labelString a {@link java.lang.String} object.
1725 * @param selection a {@link eu.etaxonomy.cdm.model.location.NamedArea} object.
1726 * @param style a int.
1727 * @return a {@link eu.etaxonomy.taxeditor.forms.selection.NamedAreaSelectionElement} object.
1728 */
1729 public NamedAreaSelectionElement createNamedAreaSelectionElement(ICdmFormElement parentElement, ConversationHolder conversation, String labelString, NamedArea selection, int style){
1730 NamedAreaSelectionElement element = new NamedAreaSelectionElement(this, conversation, parentElement, labelString, selection, style);
1731 adapt(element);
1732 parentElement.addElement(element);
1733 return element;
1734 }
1735
1736 /** {@inheritDoc} */
1737 public LabelElement createLabel(ICdmFormElement parentElement, String text) {
1738 LabelElement labelElement = new LabelElement(this, parentElement, text);
1739 adapt(labelElement);
1740 parentElement.addElement(labelElement);
1741 return labelElement;
1742 }
1743
1744 /**
1745 * <p>Getter for the field <code>selectionProvider</code>.</p>
1746 *
1747 * @return a {@link org.eclipse.jface.viewers.ISelectionProvider} object.
1748 */
1749 public ISelectionProvider getSelectionProvider() {
1750 return selectionProvider;
1751 }
1752
1753 /**
1754 * <p>createDetailedDescriptionDetailElement</p>
1755 *
1756 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
1757 * @param entity a {@link eu.etaxonomy.cdm.model.description.DescriptionElementBase} object.
1758 * @param style a int.
1759 * @return a {@link eu.etaxonomy.taxeditor.section.description.detail.AbstractDetailedDescriptionDetailElement} object.
1760 */
1761 public AbstractDetailedDescriptionDetailElement createDetailedDescriptionDetailElement(
1762 ICdmFormElement parentElement, DescriptionElementBase entity, int style) {
1763 AbstractDetailedDescriptionDetailElement detailedDescriptionElement = null;
1764
1765
1766 if(entity instanceof CategoricalData){
1767 detailedDescriptionElement = new CategoricalDataDetailElement(this, parentElement, (CategoricalData) entity, style);
1768 }
1769 else if(entity instanceof CommonTaxonName){
1770 detailedDescriptionElement = new CommonNameDetailElement(this, parentElement, (CommonTaxonName) entity, style);
1771 }
1772 else if(entity instanceof Distribution){
1773 detailedDescriptionElement = new DistributionDetailElement(this, parentElement, (Distribution) entity, style);
1774 }
1775 else if(entity instanceof IndividualsAssociation){
1776 detailedDescriptionElement = new IndividualsAssociationDetailElement(this, parentElement, (IndividualsAssociation) entity, style);
1777 }
1778 else if(entity instanceof QuantitativeData){
1779 detailedDescriptionElement = new QuantitativeDataDetailElement(this, parentElement, (QuantitativeData) entity, style);
1780 }
1781 else if(entity instanceof TaxonInteraction){
1782 detailedDescriptionElement = new TaxonInteractionDetailElement(this, parentElement, (TaxonInteraction) entity, style);
1783 }
1784 else if(entity instanceof TextData){
1785 detailedDescriptionElement = new TextDataDetailElement(this, parentElement, (TextData) entity, style);
1786 }
1787 else{
1788 throw new IllegalStateException("There is no interface for the given description element");
1789 }
1790 adapt(detailedDescriptionElement);
1791 parentElement.addElement(detailedDescriptionElement);
1792 return detailedDescriptionElement;
1793
1794 }
1795
1796
1797 /**
1798 * Creates a styled text as a part of the form.
1799 *
1800 * @param parent
1801 * the text parent
1802 * @param value
1803 * the text initial value
1804 * @param style
1805 * the text style
1806 * @return the text widget
1807 */
1808 public StyledText createStyledText(Composite parent, String value, int style) {
1809 StyledText text = new StyledText(parent, getBorderStyle() | style | getOrientation());
1810 if (value != null)
1811 text.setText(value);
1812 text.setForeground(getColors().getForeground());
1813 text.setBackground(getColors().getBackground());
1814 // text.addFocusListener(visibilityHandler);
1815 return text;
1816 }
1817 }