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
.ui
.section
.reference
;
13 import java
.util
.ArrayList
;
14 import java
.util
.Arrays
;
15 import java
.util
.List
;
17 import org
.eclipse
.swt
.SWT
;
18 import org
.eclipse
.swt
.widgets
.Display
;
20 import eu
.etaxonomy
.cdm
.common
.CdmUtils
;
21 import eu
.etaxonomy
.cdm
.model
.agent
.AgentBase
;
22 import eu
.etaxonomy
.cdm
.model
.agent
.Institution
;
23 import eu
.etaxonomy
.cdm
.model
.agent
.TeamOrPersonBase
;
24 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
25 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceFactory
;
26 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceType
;
27 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
28 import eu
.etaxonomy
.taxeditor
.ui
.combo
.EnumComboElement
;
29 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmFormFactory
;
30 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmPropertyChangeEvent
;
31 import eu
.etaxonomy
.taxeditor
.ui
.element
.ICdmFormElement
;
32 import eu
.etaxonomy
.taxeditor
.ui
.element
.IErrorIntolerableElement
;
33 import eu
.etaxonomy
.taxeditor
.ui
.element
.IExceptionHandler
;
34 import eu
.etaxonomy
.taxeditor
.ui
.element
.LabelElement
;
35 import eu
.etaxonomy
.taxeditor
.ui
.element
.LayoutConstants
;
36 import eu
.etaxonomy
.taxeditor
.ui
.element
.TextWithLabelElement
;
37 import eu
.etaxonomy
.taxeditor
.ui
.element
.TimePeriodElement
;
38 import eu
.etaxonomy
.taxeditor
.ui
.element
.ToggleableTextElement
;
39 import eu
.etaxonomy
.taxeditor
.ui
.element
.UriWithLabelElement
;
40 import eu
.etaxonomy
.taxeditor
.ui
.mvc
.element
.DateElement
;
41 import eu
.etaxonomy
.taxeditor
.ui
.section
.AbstractIdentifiableEntityDetailElement
;
42 import eu
.etaxonomy
.taxeditor
.ui
.selection
.EntitySelectionElement
;
46 * ReferenceBaseDetailElement class.
50 * @created Mar 2, 2010
53 public class ReferenceDetailElement
extends AbstractIdentifiableEntityDetailElement
<Reference
>
54 implements IErrorIntolerableElement
, IExceptionHandler
{
58 private ToggleableTextElement toggleableAbbrevCache
;
60 private TextWithLabelElement text_edition
;
61 private TextWithLabelElement text_editor
;
62 private TextWithLabelElement text_isbn
;
63 private TextWithLabelElement text_issn
;
64 private TextWithLabelElement text_organisation
;
65 private TextWithLabelElement text_pages
;
66 private TextWithLabelElement text_placePublished
;
67 private TextWithLabelElement text_publisher
;
68 private TextWithLabelElement text_referenceAbstract
;
69 private TextWithLabelElement text_series
;
70 // private TextWithLabelElement text_seriesPart;
71 private TextWithLabelElement text_volume
;
72 private TextWithLabelElement text_abbrevTitle
;
73 private TextWithLabelElement text_title
;
74 private UriWithLabelElement text_uri
;
75 private DateElement text_accessed
;
76 private EntitySelectionElement
<AgentBase
> selection_authorTeam
;
77 private TimePeriodElement element_timePeriod
;
78 private EntitySelectionElement
<Reference
> selection_inReference
;
79 private EntitySelectionElement
<Institution
> selection_institution
;
80 private EnumComboElement
<ReferenceType
> combo_referenceType
;
82 private EntitySelectionElement
<Reference
> selection_inSeries
;
83 private boolean isWizard
;
87 * Constructor for ReferenceBaseDetailElement.
90 * @param cdmFormFactory
91 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
94 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
99 public ReferenceDetailElement(CdmFormFactory cdmFormFactory
,
100 ICdmFormElement formElement
, int style
, boolean isWizard
) {
101 super(cdmFormFactory
, formElement
);
102 this.isWizard
= isWizard
;
109 * eu.etaxonomy.taxeditor.forms.section.cdmdetail.AbstractCdmDetailComposite
110 * #createControl(org.eclipse.swt.widgets.Composite, int)
114 protected void createControls(ICdmFormElement formElement
,
115 Reference entity
, int style
) {
116 ICdmFormElement o
= this.getParentElement();
117 Class clazz
=o
.getClass();
119 setWarnForReferencingObjects(formElement
);
123 toggleable_cache
= formFactory
.createToggleableTextField(formElement
,
124 "Reference Cache", entity
.getTitleCache(),
125 entity
.isProtectedTitleCache(), style
);
127 toggleableAbbrevCache
= formFactory
.createToggleableTextField(formElement
,
128 "Abbrev. Cache", entity
.getAbbrevTitleCache(),
129 entity
.isProtectedAbbrevTitleCache(), style
);
131 combo_referenceType
= formFactory
.createEnumComboElement(ReferenceType
.class,
134 combo_referenceType
.setSelection(entity
.getType());
137 text_title
= formFactory
.createTextWithLabelElement(formElement
,
138 "Title", entity
.getTitle(), style
);
140 text_abbrevTitle
= formFactory
.createTextWithLabelElement(formElement
,
141 "Nomenclatural Title", entity
.getAbbrevTitle(), style
);
144 selection_authorTeam
= formFactory
145 .createSelectionElement(AgentBase
.class,
146 getConversationHolder(), formElement
, "Author",
147 entity
.getAuthorship(),
148 EntitySelectionElement
.ALL
, style
);
150 ReferenceType referenceType
= entity
.getType();
152 if (referenceType
!= null) {
154 createInReferenceByType(this, referenceType
, entity
, SWT
.NULL
);
156 if (referenceType
.equals(ReferenceType
.Generic
)) {
157 createGenericControls(this, entity
, SWT
.NULL
);
158 createPublicationControls(this, referenceType
, entity
, SWT
.NULL
);
161 if (referenceType
.isPrintedUnit()) {
162 createPrintedUnitControls(this, referenceType
, entity
,
165 if (referenceType
.isPublication()) {
166 createPublicationControls(this, referenceType
, entity
,
169 if (referenceType
.isVolumeReference()) {
170 createVolumeControls(this, entity
, SWT
.NULL
);
172 if (referenceType
.isSection()) {
173 createSectionControls(this, entity
, SWT
.NULL
);
180 element_timePeriod
= formFactory
.createTimePeriodElement(formElement
,
181 "Date Published", entity
.getDatePublished(), style
);
183 createUriAndAbstract(this, entity
, SWT
.NULL
);
184 handleToggleableAbbrevTitleField();
185 handleToggleableCacheField();
188 private void createWebPageControls(ReferenceDetailElement referenceDetailElement
, Reference reference
, int style
) {
189 text_accessed
= formFactory
.createDateElement(referenceDetailElement
, "Accessed", reference
.getAccessed(), style
, false);
197 * eu.etaxonomy.taxeditor.forms.section.cdmdetail.AbstractCdmDetailComposite
202 protected void updateContent() {
203 if (getEntity() == null) {
204 setEntity(ReferenceFactory
.newGeneric());
207 super.updateContent();
209 // enable elements according to state of cache protection
210 // setEnabled(getEntity().isProtectedTitleCache(), Arrays.asList(new
211 // Object[]{text_cache}));
212 toggleable_cache
.setEnabled(getEntity().isProtectedTitleCache());
213 toggleableAbbrevCache
.setEnabled(getEntity().isProtectedAbbrevTitleCache());
214 setIrrelevantReferenceDetail(false);
215 setIrrelevantReferenceDetail(true);
219 * Creates an in reference for reference types that do hav this.
222 * @param referenceType
226 private void createInReferenceByType(ICdmFormElement element
,
227 ReferenceType referenceType
, Reference reference
, int style
) {
228 boolean createInReferenceWidget
= true;
229 String label
= "In Reference";
231 switch (referenceType
) {
240 label
= "Print Series";
248 createInReferenceWidget
= false;
251 if (createInReferenceWidget
) {
252 selection_inReference
= formFactory
253 .createSelectionElement(Reference
.class,
254 getConversationHolder(), element
, label
,
255 reference
.getInReference(),
256 EntitySelectionElement
.ALL
, style
);
261 * Creates additional controls to edit a generic reference
268 private void createGenericControls(ICdmFormElement element
,
269 Reference reference
, int style
) {
272 text_editor
= formFactory
.createTextWithLabelElement(element
, "Editor",
273 reference
.getEditor(), style
);
276 text_series
= formFactory
.createTextWithLabelElement(element
, "Series",
277 reference
.getSeriesPart(), style
);
280 text_volume
= formFactory
.createTextWithLabelElement(element
, "Volume",
281 reference
.getVolume(), style
);
284 text_pages
= formFactory
.createTextWithLabelElement(element
, "Pages",
285 reference
.getPages(), style
);
291 * Creates additional controls to edit a publication
298 private void createPublicationControls(ICdmFormElement element
,
299 ReferenceType referenceType
, Reference reference
, int style
) {
302 text_placePublished
= formFactory
.createTextWithLabelElement(element
,
303 "Place Published", reference
.getPlacePublished(), style
);
306 text_publisher
= formFactory
.createTextWithLabelElement(element
,
307 "Publisher", reference
.getPublisher(), style
);
309 if (referenceType
.equals(ReferenceType
.Journal
)) {
311 text_issn
= formFactory
.createTextWithLabelElement(element
, "ISSN",
312 reference
.getIssn(), style
);
315 if (referenceType
.equals(ReferenceType
.Report
)) {
317 selection_institution
= formFactory
318 .createSelectionElement(Institution
.class,
319 getConversationHolder(), element
, "Institution",
320 reference
.getInstitution(),
321 EntitySelectionElement
.ALL
, style
);
324 if (referenceType
.equals(ReferenceType
.Thesis
)) {
326 selection_institution
= formFactory
327 .createSelectionElement(Institution
.class,
328 getConversationHolder(), element
, "School",
329 reference
.getSchool(),
330 EntitySelectionElement
.ALL
, style
);
333 if (referenceType
.equals(ReferenceType
.Proceedings
)) {
335 text_organisation
= formFactory
.createTextWithLabelElement(element
,
336 "Organisation", reference
.getOrganization(), style
);
341 * Creates additional controls to edit a section
347 private void createSectionControls(ICdmFormElement element
,
348 Reference reference
, int style
) {
350 text_pages
= formFactory
.createTextWithLabelElement(element
, "Pages",
351 reference
.getPages(), style
);
355 * Creates additional controls to edit a volume
361 private void createVolumeControls(ICdmFormElement element
,
362 Reference reference
, int style
) {
364 text_volume
= formFactory
.createTextWithLabelElement(element
, "Volume",
365 reference
.getVolume(), style
);
367 text_series
= formFactory
.createTextWithLabelElement(element
, "Series",
368 reference
.getSeriesPart(), style
);
374 * @param referenceType
378 private void createPrintedUnitControls(ICdmFormElement element
,
379 ReferenceType referenceType
, Reference reference
, int style
) {
381 selection_inSeries
= formFactory
382 .createSelectionElement(Reference
.class,
383 getConversationHolder(), element
, "In Series",
384 (Reference
) reference
.getInSeries(),
385 EntitySelectionElement
.ALL
, style
);
388 text_editor
= formFactory
.createTextWithLabelElement(element
, "Editor",
389 reference
.getEditor(), style
);
392 text_seriesPart = formFactory.createTextWithLabelElement(element,
393 "Series", reference.getSeriesPart(), style);
395 if (referenceType
.equals(ReferenceType
.Book
)) {
397 text_edition
= formFactory
.createTextWithLabelElement(element
,
398 "Edition", reference
.getEdition(), style
);
401 text_isbn
= formFactory
.createTextWithLabelElement(element
, "ISBN",
402 reference
.getIsbn(), style
);
406 private void createUriAndAbstract(ICdmFormElement element
,
407 Reference reference
, int style
) {
409 text_uri
= formFactory
.createUriWithLabelElement(element
, "URI",
410 reference
.getUri(), style
);
411 if (reference
.getType().equals(ReferenceType
.WebPage
)){
412 createWebPageControls(this, reference
, style
);
415 text_referenceAbstract
= formFactory
.createMultiLineTextWithLabel(
416 element
, "Reference Abstract", 100, style
);
417 text_referenceAbstract
.setText(reference
.getReferenceAbstract());
422 public void handleEvent(Object eventSource
) {
423 if (eventSource
== combo_referenceType
) {
424 getEntity().setType(combo_referenceType
.getSelection());
426 } else if (eventSource
== element_timePeriod
) {
427 getEntity().setDatePublished(element_timePeriod
.getTimePeriod());
431 else if (eventSource
== selection_authorTeam
) {
432 getEntity().setAuthorship(
433 (TeamOrPersonBase
) selection_authorTeam
.getSelection());
434 } else if (eventSource
== selection_inReference
) {
435 getEntity().setInReference(selection_inReference
.getSelection());
436 } else if (eventSource
== selection_inSeries
) {
437 getEntity().setInReference(selection_inSeries
.getSelection());
438 } else if (eventSource
== selection_institution
) {
439 getEntity().setInstitution(selection_institution
.getSelection());
443 else if (eventSource
== toggleable_cache
) {
444 handleToggleableCacheField();
446 else if (eventSource
== toggleableAbbrevCache
) {
447 handleToggleableAbbrevTitleField();
448 } else if (eventSource
== text_edition
) {
449 getEntity().setEdition(text_edition
.getText());
450 } else if (eventSource
== text_editor
) {
451 getEntity().setEditor(text_editor
.getText());
452 } else if (eventSource
== text_isbn
) {
453 getEntity().setIsbn(text_isbn
.getText());
454 } else if (eventSource
== text_issn
) {
455 getEntity().setIssn(text_issn
.getText());
456 } else if (eventSource
== text_organisation
) {
457 getEntity().setOrganization(text_organisation
.getText());
458 } else if (eventSource
== text_pages
) {
459 getEntity().setPages(text_pages
.getText());
460 } else if (eventSource
== text_placePublished
) {
461 getEntity().setPlacePublished(text_placePublished
.getText());
462 } else if (eventSource
== text_publisher
) {
463 getEntity().setPublisher(text_publisher
.getText());
464 } else if (eventSource
== text_referenceAbstract
) {
465 getEntity().setReferenceAbstract(text_referenceAbstract
.getText());
466 } else if (eventSource
== text_series
) {
467 getEntity().setSeriesPart(text_series
.getText());
468 } else if (eventSource
== text_title
) {
469 getEntity().setTitle(text_title
.getText());
470 if (!toggleable_cache
.isEnabled()){
471 toggleable_cache
.setText(getEntity().generateTitle());
473 } else if (eventSource
== text_abbrevTitle
) {
474 getEntity().setAbbrevTitle(text_abbrevTitle
.getText());
475 if (!toggleableAbbrevCache
.isEnabled()){
476 toggleableAbbrevCache
.setText(getEntity().generateAbbrevTitle());
478 } else if (eventSource
== text_uri
) {
479 getEntity().setUri(text_uri
.parseText());
480 } else if (eventSource
== text_volume
) {
481 getEntity().setVolume(text_volume
.getText());
482 }else if (eventSource
== text_accessed
.getController()) {
483 getEntity().setAccessed(text_accessed
.getController().getDateTime());
486 if (eventSource
!= text_title
&& eventSource
!= text_abbrevTitle
) {
487 // set abbrev title cache to null to force new generation
488 // for the standard title cache this is done by a PropertyChangeListener registered
489 // in IdentifiableEntity.initListeners()
490 if(!getEntity().isProtectedAbbrevTitleCache()){
491 getEntity().setAbbrevTitleCache(null, getEntity().isProtectedAbbrevTitleCache());
493 toggleable_cache
.setText(getEntity().getTitleCache());
494 toggleableAbbrevCache
.setText(getEntity().getAbbrevTitleCache());
497 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, null));
502 public void updateToggleableCacheField() {
503 if (!getEntity().isProtectedTitleCache()) {
504 toggleable_cache
.setText(getEntity().generateTitle());
506 if (!getEntity().isProtectedAbbrevTitleCache()) {
507 toggleableAbbrevCache
.setText(getEntity().generateAbbrevTitle());
511 protected void handleToggleableAbbrevTitleField() {
512 boolean pushedAbbrevState
= toggleableAbbrevCache
.getState();
513 getEntity().setAbbrevTitleCache(toggleableAbbrevCache
.getText(), pushedAbbrevState
);
514 setIrrelevantReferenceDetail(true);
515 updateToggleableCacheField();
522 * eu.etaxonomy.taxeditor.section.AbstractCdmDetailElement#handleException
523 * (eu.etaxonomy.taxeditor.forms.CdmPropertyChangeEvent)
527 public void handleException(CdmPropertyChangeEvent event
) {
528 exceptionOccurred(event
);
534 * @see eu.etaxonomy.taxeditor.forms.IExceptionHandler#clearException()
538 public void clearException() {
539 exceptionOccurred(null);
542 private final List
<IExceptionHandler
> exceptionHandlers
= new ArrayList
<IExceptionHandler
>();
548 * eu.etaxonomy.taxeditor.forms.IErrorIntolerableElement#addExceptionHandler
549 * (eu.etaxonomy.taxeditor.forms.IExceptionHandler)
553 public void addExceptionHandler(IExceptionHandler handler
) {
554 exceptionHandlers
.add(handler
);
561 * eu.etaxonomy.taxeditor.forms.IErrorIntolerableElement#removeExceptionHandler
562 * (eu.etaxonomy.taxeditor.forms.IExceptionHandler)
566 public void removeExceptionHandler(IExceptionHandler handler
) {
567 exceptionHandlers
.remove(handler
);
574 * eu.etaxonomy.taxeditor.forms.IErrorIntolerableElement#exceptionOccurred
575 * (eu.etaxonomy.taxeditor.forms.CdmPropertyChangeEvent)
579 public void exceptionOccurred(CdmPropertyChangeEvent event
) {
580 for (IExceptionHandler handler
: exceptionHandlers
) {
582 handler
.clearException();
584 handler
.handleException(event
);
590 protected void handleToggleableCacheField() {
592 boolean pushedState
= toggleable_cache
.getState();
593 getEntity().setTitleCache(toggleable_cache
.getText(), pushedState
);
594 setIrrelevantReferenceDetail(false);
595 updateToggleableCacheField();
598 protected void setIrrelevantReferenceDetail(boolean abbrev
){
600 List
<Object
> except
= new ArrayList();
601 except
.addAll( Arrays
.asList(new Object
[] { toggleable_cache
, toggleableAbbrevCache
, text_editor
, text_isbn
, text_issn
, text_organisation
, text_pages
, text_placePublished
, text_publisher
, text_referenceAbstract
, text_uri
, selection_institution
}));
604 except
.add(text_title
);
605 pushedState
= toggleableAbbrevCache
.getState();
607 except
.add(text_abbrevTitle
);
608 pushedState
= toggleable_cache
.getState();
610 switch( getEntity().getType()){
612 except
.add(element_timePeriod
);
615 except
.remove(text_series
);
616 except
.remove(text_edition
);
621 setIrrelevant(pushedState
, except
);