Merge branch 'release/4.4.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / section / reference / ReferenceDetailElement.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10
11 package eu.etaxonomy.taxeditor.ui.section.reference;
12
13
14 import java.util.ArrayList;
15 import java.util.Arrays;
16 import java.util.List;
17
18 import org.eclipse.swt.SWT;
19 import org.eclipse.swt.widgets.Display;
20
21 import eu.etaxonomy.cdm.common.CdmUtils;
22 import eu.etaxonomy.cdm.model.agent.AgentBase;
23 import eu.etaxonomy.cdm.model.agent.Institution;
24 import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
25 import eu.etaxonomy.cdm.model.reference.Reference;
26 import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
27 import eu.etaxonomy.cdm.model.reference.ReferenceType;
28 import eu.etaxonomy.taxeditor.store.CdmStore;
29 import eu.etaxonomy.taxeditor.ui.combo.EnumComboElement;
30 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
31 import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
32 import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
33 import eu.etaxonomy.taxeditor.ui.element.IErrorIntolerableElement;
34 import eu.etaxonomy.taxeditor.ui.element.IExceptionHandler;
35 import eu.etaxonomy.taxeditor.ui.element.LabelElement;
36 import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
37 import eu.etaxonomy.taxeditor.ui.element.TextWithLabelElement;
38 import eu.etaxonomy.taxeditor.ui.element.TimePeriodElement;
39 import eu.etaxonomy.taxeditor.ui.element.ToggleableTextElement;
40 import eu.etaxonomy.taxeditor.ui.element.UriWithLabelElement;
41 import eu.etaxonomy.taxeditor.ui.section.AbstractIdentifiableEntityDetailElement;
42 import eu.etaxonomy.taxeditor.ui.selection.EntitySelectionElement;
43
44 /**
45 * <p>
46 * ReferenceBaseDetailElement class.
47 * </p>
48 *
49 * @author n.hoffmann
50 * @created Mar 2, 2010
51 * @version 1.0
52 */
53 public class ReferenceDetailElement extends AbstractIdentifiableEntityDetailElement<Reference>
54 implements IErrorIntolerableElement, IExceptionHandler {
55
56 private LabelElement warnForReferencedObjects;
57
58 private ToggleableTextElement toggleableAbbrevCache;
59
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 EntitySelectionElement<AgentBase> selection_authorTeam;
76 private TimePeriodElement element_timePeriod;
77 private EntitySelectionElement<Reference> selection_inReference;
78 private EntitySelectionElement<Institution> selection_institution;
79 private EnumComboElement<ReferenceType> combo_referenceType;
80
81 private EntitySelectionElement<Reference> selection_inSeries;
82 private boolean isWizard;
83
84 /**
85 * <p>
86 * Constructor for ReferenceBaseDetailElement.
87 * </p>
88 *
89 * @param cdmFormFactory
90 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
91 * object.
92 * @param formElement
93 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
94 * object.
95 * @param style
96 * a int.
97 */
98 public ReferenceDetailElement(CdmFormFactory cdmFormFactory,
99 ICdmFormElement formElement, int style, boolean isWizard) {
100 super(cdmFormFactory, formElement);
101 this.isWizard = isWizard;
102 }
103
104 /*
105 * (non-Javadoc)
106 *
107 * @see
108 * eu.etaxonomy.taxeditor.forms.section.cdmdetail.AbstractCdmDetailComposite
109 * #createControl(org.eclipse.swt.widgets.Composite, int)
110 */
111 /** {@inheritDoc} */
112 @Override
113 protected void createControls(ICdmFormElement formElement,
114 Reference entity, int style) {
115 ICdmFormElement o = this.getParentElement();
116 Class clazz=o.getClass();
117 if (isWizard){
118 setWarnForReferencingObjects(formElement);
119 }
120
121
122 toggleable_cache = formFactory.createToggleableTextField(formElement,
123 "Reference Cache", entity.getTitleCache(),
124 entity.isProtectedTitleCache(), style);
125
126 toggleableAbbrevCache = formFactory.createToggleableTextField(formElement,
127 "Abbrev. Cache", entity.getAbbrevTitleCache(),
128 entity.isProtectedAbbrevTitleCache(), style);
129
130 combo_referenceType = formFactory.createEnumComboElement(ReferenceType.class,
131 formElement, style);
132
133 combo_referenceType.setSelection(entity.getType());
134
135 // title
136 text_title = formFactory.createTextWithLabelElement(formElement,
137 "Title", entity.getTitle(), style);
138 // abbreviated title
139 text_abbrevTitle = formFactory.createTextWithLabelElement(formElement,
140 "Nomenclatural Title", entity.getAbbrevTitle(), style);
141
142 // author team
143 selection_authorTeam = formFactory
144 .createSelectionElement(AgentBase.class,
145 getConversationHolder(), formElement, "Author",
146 entity.getAuthorship(),
147 EntitySelectionElement.ALL, style);
148
149 ReferenceType referenceType = entity.getType();
150
151 if (referenceType != null) {
152
153 createInReferenceByType(this, referenceType, entity, SWT.NULL);
154
155 if (referenceType.equals(ReferenceType.Generic)) {
156 createGenericControls(this, entity, SWT.NULL);
157 createPublicationControls(this, referenceType, entity, SWT.NULL);
158 } else {
159 if (referenceType.isPrintedUnit()) {
160 createPrintedUnitControls(this, referenceType, entity,
161 SWT.NULL);
162 }
163 if (referenceType.isPublication()) {
164 createPublicationControls(this, referenceType, entity,
165 SWT.NULL);
166 }
167 if (referenceType.isVolumeReference()) {
168 createVolumeControls(this, entity, SWT.NULL);
169 }
170 if (referenceType.isSection()) {
171 createSectionControls(this, entity, SWT.NULL);
172 }
173 }
174 }
175
176 // date published
177 element_timePeriod = formFactory.createTimePeriodElement(formElement,
178 "Date Published", entity.getDatePublished(), style);
179
180 createUriAndAbstract(this, entity, SWT.NULL);
181 handleToggleableAbbrevTitleField();
182 handleToggleableCacheField();
183 }
184
185 /*
186 * (non-Javadoc)
187 *
188 * @see
189 * eu.etaxonomy.taxeditor.forms.section.cdmdetail.AbstractCdmDetailComposite
190 * #updateContent()
191 */
192 /** {@inheritDoc} */
193 @Override
194 protected void updateContent() {
195 if (getEntity() == null) {
196 setEntity(ReferenceFactory.newGeneric());
197 }
198
199 super.updateContent();
200
201 // enable elements according to state of cache protection
202 // setEnabled(getEntity().isProtectedTitleCache(), Arrays.asList(new
203 // Object[]{text_cache}));
204 toggleable_cache.setEnabled(getEntity().isProtectedTitleCache());
205 toggleableAbbrevCache.setEnabled(getEntity().isProtectedAbbrevTitleCache());
206 setIrrelevantReferenceDetail(false);
207 setIrrelevantReferenceDetail(true);
208 }
209
210 /**
211 * Creates an in reference for reference types that do hav this.
212 *
213 * @param element
214 * @param referenceType
215 * @param reference
216 * @param style
217 */
218 private void createInReferenceByType(ICdmFormElement element,
219 ReferenceType referenceType, Reference reference, int style) {
220 boolean createInReferenceWidget = true;
221 String label = "In Reference";
222
223 switch (referenceType) {
224 case Generic:
225 break;
226 case Section:
227 break;
228 case BookSection:
229 label = "Book";
230 break;
231 case InProceedings:
232 label = "Print Series";
233 break;
234 case Article:
235 label = "Journal";
236 break;
237 case WebPage:
238 break;
239 default:
240 createInReferenceWidget = false;
241 }
242
243 if (createInReferenceWidget) {
244 selection_inReference = formFactory
245 .createSelectionElement(Reference.class,
246 getConversationHolder(), element, label,
247 reference.getInReference(),
248 EntitySelectionElement.ALL, style);
249 }
250 }
251
252 /**
253 * Creates additional controls to edit a generic reference
254 *
255 * @param element
256 * @param reference
257 * @param listener
258 * @param style
259 */
260 private void createGenericControls(ICdmFormElement element,
261 Reference reference, int style) {
262
263 // editor
264 text_editor = formFactory.createTextWithLabelElement(element, "Editor",
265 reference.getEditor(), style);
266
267 // series
268 text_series = formFactory.createTextWithLabelElement(element, "Series",
269 reference.getSeriesPart(), style);
270
271 // volume
272 text_volume = formFactory.createTextWithLabelElement(element, "Volume",
273 reference.getVolume(), style);
274
275 // pages
276 text_pages = formFactory.createTextWithLabelElement(element, "Pages",
277 reference.getPages(), style);
278 }
279
280 /**
281 * Creates additional controls to edit a publication
282 *
283 * @param element
284 * @param reference
285 * @param listener
286 * @param style
287 */
288 private void createPublicationControls(ICdmFormElement element,
289 ReferenceType referenceType, Reference reference, int style) {
290
291 // placePublished
292 text_placePublished = formFactory.createTextWithLabelElement(element,
293 "Place Published", reference.getPlacePublished(), style);
294
295 // publisher
296 text_publisher = formFactory.createTextWithLabelElement(element,
297 "Publisher", reference.getPublisher(), style);
298
299 if (referenceType.equals(ReferenceType.Journal)) {
300 // issn
301 text_issn = formFactory.createTextWithLabelElement(element, "ISSN",
302 reference.getIssn(), style);
303 }
304
305 if (referenceType.equals(ReferenceType.Report)) {
306 // institution
307 selection_institution = formFactory
308 .createSelectionElement(Institution.class,
309 getConversationHolder(), element, "Institution",
310 reference.getInstitution(),
311 EntitySelectionElement.ALL, style);
312 }
313
314 if (referenceType.equals(ReferenceType.Thesis)) {
315 // school
316 selection_institution = formFactory
317 .createSelectionElement(Institution.class,
318 getConversationHolder(), element, "School",
319 reference.getSchool(),
320 EntitySelectionElement.ALL, style);
321 }
322
323 if (referenceType.equals(ReferenceType.Proceedings)) {
324 // organization
325 text_organisation = formFactory.createTextWithLabelElement(element,
326 "Organisation", reference.getOrganization(), style);
327 }
328 }
329
330 /**
331 * Creates additional controls to edit a section
332 *
333 * @param element
334 * @param reference
335 * @param style
336 */
337 private void createSectionControls(ICdmFormElement element,
338 Reference reference, int style) {
339 // pages
340 text_pages = formFactory.createTextWithLabelElement(element, "Pages",
341 reference.getPages(), style);
342 }
343
344 /**
345 * Creates additional controls to edit a volume
346 *
347 * @param element
348 * @param reference
349 * @param style
350 */
351 private void createVolumeControls(ICdmFormElement element,
352 Reference reference, int style) {
353
354 text_volume = formFactory.createTextWithLabelElement(element, "Volume",
355 reference.getVolume(), style);
356
357 text_series = formFactory.createTextWithLabelElement(element, "Series",
358 reference.getSeriesPart(), style);
359 }
360
361 /**
362 *
363 * @param element
364 * @param referenceType
365 * @param reference
366 * @param style
367 */
368 private void createPrintedUnitControls(ICdmFormElement element,
369 ReferenceType referenceType, Reference reference, int style) {
370 // in series
371 selection_inSeries = formFactory
372 .createSelectionElement(Reference.class,
373 getConversationHolder(), element, "In Series",
374 (Reference) reference.getInSeries(),
375 EntitySelectionElement.ALL, style);
376
377 // editor
378 text_editor = formFactory.createTextWithLabelElement(element, "Editor",
379 reference.getEditor(), style);
380
381 /* series part
382 text_seriesPart = formFactory.createTextWithLabelElement(element,
383 "Series", reference.getSeriesPart(), style);
384 */
385 if (referenceType.equals(ReferenceType.Book)) {
386 // edition
387 text_edition = formFactory.createTextWithLabelElement(element,
388 "Edition", reference.getEdition(), style);
389
390 // isbn
391 text_isbn = formFactory.createTextWithLabelElement(element, "ISBN",
392 reference.getIsbn(), style);
393 }
394 }
395
396 private void createUriAndAbstract(ICdmFormElement element,
397 Reference reference, int style) {
398 // uri
399 text_uri = formFactory.createUriWithLabelElement(element, "URI",
400 reference.getUri(), style);
401 // abstract
402 text_referenceAbstract = formFactory.createMultiLineTextWithLabel(
403 element, "Reference Abstract", 100, style);
404 text_referenceAbstract.setText(reference.getReferenceAbstract());
405 }
406
407 /** {@inheritDoc} */
408 @Override
409 public void handleEvent(Object eventSource) {
410 if (eventSource == combo_referenceType) {
411 getEntity().setType(combo_referenceType.getSelection());
412 updateContent();
413 } else if (eventSource == element_timePeriod) {
414 getEntity().setDatePublished(element_timePeriod.getTimePeriod());
415 clearException();
416 }
417 // selections
418 else if (eventSource == selection_authorTeam) {
419 getEntity().setAuthorship(
420 (TeamOrPersonBase) selection_authorTeam.getSelection());
421 } else if (eventSource == selection_inReference) {
422 getEntity().setInReference(selection_inReference.getSelection());
423 } else if (eventSource == selection_inSeries) {
424 getEntity().setInReference(selection_inSeries.getSelection());
425 } else if (eventSource == selection_institution) {
426 getEntity().setInstitution(selection_institution.getSelection());
427 }
428
429 // textfields
430 else if (eventSource == toggleable_cache) {
431 handleToggleableCacheField();
432 }
433 else if (eventSource == toggleableAbbrevCache) {
434 handleToggleableAbbrevTitleField();
435 } else if (eventSource == text_edition) {
436 getEntity().setEdition(text_edition.getText());
437 } else if (eventSource == text_editor) {
438 getEntity().setEditor(text_editor.getText());
439 } else if (eventSource == text_isbn) {
440 getEntity().setIsbn(text_isbn.getText());
441 } else if (eventSource == text_issn) {
442 getEntity().setIssn(text_issn.getText());
443 } else if (eventSource == text_organisation) {
444 getEntity().setOrganization(text_organisation.getText());
445 } else if (eventSource == text_pages) {
446 getEntity().setPages(text_pages.getText());
447 } else if (eventSource == text_placePublished) {
448 getEntity().setPlacePublished(text_placePublished.getText());
449 } else if (eventSource == text_publisher) {
450 getEntity().setPublisher(text_publisher.getText());
451 } else if (eventSource == text_referenceAbstract) {
452 getEntity().setReferenceAbstract(text_referenceAbstract.getText());
453 } else if (eventSource == text_series) {
454 getEntity().setSeriesPart(text_series.getText());
455 } else if (eventSource == text_title ) {
456 getEntity().setTitle(text_title.getText());
457 if (!toggleable_cache.isEnabled()){
458 toggleable_cache.setText(getEntity().generateTitle());
459 }
460 } else if (eventSource == text_abbrevTitle ) {
461 getEntity().setAbbrevTitle(text_abbrevTitle.getText());
462 if (!toggleableAbbrevCache.isEnabled()){
463 toggleableAbbrevCache.setText(getEntity().generateAbbrevTitle());
464 }
465 } else if (eventSource == text_uri) {
466 getEntity().setUri(text_uri.parseText());
467 } else if (eventSource == text_volume) {
468 getEntity().setVolume(text_volume.getText());
469 }
470
471 if (eventSource != text_title && eventSource != text_abbrevTitle) {
472 // set abbrev title cache to null to force new generation
473 // for the standard title cache this is done by a PropertyChangeListener registered
474 // in IdentifiableEntity.initListeners()
475 if(!getEntity().isProtectedAbbrevTitleCache()){
476 getEntity().setAbbrevTitleCache(null, getEntity().isProtectedAbbrevTitleCache());
477 }
478 toggleable_cache.setText(getEntity().getTitleCache());
479 toggleableAbbrevCache.setText(getEntity().getAbbrevTitleCache());
480 }
481
482 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, null));
483 }
484
485
486 @Override
487 public void updateToggleableCacheField() {
488 if (!getEntity().isProtectedTitleCache()) {
489 toggleable_cache.setText(getEntity().generateTitle());
490 }
491 if (!getEntity().isProtectedAbbrevTitleCache()) {
492 toggleableAbbrevCache.setText(getEntity().generateAbbrevTitle());
493 }
494 }
495
496 protected void handleToggleableAbbrevTitleField() {
497 boolean pushedAbbrevState = toggleableAbbrevCache.getState();
498 getEntity().setAbbrevTitleCache(toggleableAbbrevCache.getText(), pushedAbbrevState);
499 setIrrelevantReferenceDetail(true);
500 updateToggleableCacheField();
501 }
502
503 /*
504 * (non-Javadoc)
505 *
506 * @see
507 * eu.etaxonomy.taxeditor.section.AbstractCdmDetailElement#handleException
508 * (eu.etaxonomy.taxeditor.forms.CdmPropertyChangeEvent)
509 */
510 /** {@inheritDoc} */
511 @Override
512 public void handleException(CdmPropertyChangeEvent event) {
513 exceptionOccurred(event);
514 }
515
516 /*
517 * (non-Javadoc)
518 *
519 * @see eu.etaxonomy.taxeditor.forms.IExceptionHandler#clearException()
520 */
521 /** {@inheritDoc} */
522 @Override
523 public void clearException() {
524 exceptionOccurred(null);
525 }
526
527 private final List<IExceptionHandler> exceptionHandlers = new ArrayList<IExceptionHandler>();
528
529 /*
530 * (non-Javadoc)
531 *
532 * @see
533 * eu.etaxonomy.taxeditor.forms.IErrorIntolerableElement#addExceptionHandler
534 * (eu.etaxonomy.taxeditor.forms.IExceptionHandler)
535 */
536 /** {@inheritDoc} */
537 @Override
538 public void addExceptionHandler(IExceptionHandler handler) {
539 exceptionHandlers.add(handler);
540 }
541
542 /*
543 * (non-Javadoc)
544 *
545 * @see
546 * eu.etaxonomy.taxeditor.forms.IErrorIntolerableElement#removeExceptionHandler
547 * (eu.etaxonomy.taxeditor.forms.IExceptionHandler)
548 */
549 /** {@inheritDoc} */
550 @Override
551 public void removeExceptionHandler(IExceptionHandler handler) {
552 exceptionHandlers.remove(handler);
553 }
554
555 /*
556 * (non-Javadoc)
557 *
558 * @see
559 * eu.etaxonomy.taxeditor.forms.IErrorIntolerableElement#exceptionOccurred
560 * (eu.etaxonomy.taxeditor.forms.CdmPropertyChangeEvent)
561 */
562 /** {@inheritDoc} */
563 @Override
564 public void exceptionOccurred(CdmPropertyChangeEvent event) {
565 for (IExceptionHandler handler : exceptionHandlers) {
566 if (event == null) {
567 handler.clearException();
568 } else {
569 handler.handleException(event);
570 }
571 }
572 }
573
574 @Override
575 protected void handleToggleableCacheField() {
576
577 boolean pushedState = toggleable_cache.getState();
578 getEntity().setTitleCache(toggleable_cache.getText(), pushedState);
579 setIrrelevantReferenceDetail(false);
580 updateToggleableCacheField();
581 }
582
583 protected void setIrrelevantReferenceDetail(boolean abbrev){
584
585 List<Object> except = new ArrayList();
586 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}));
587 boolean pushedState;
588 if (abbrev){
589 except.add(text_title);
590 pushedState = toggleableAbbrevCache.getState();
591 } else{
592 except.add(text_abbrevTitle);
593 pushedState = toggleable_cache.getState();
594 }
595 switch( getEntity().getType()){
596 case Journal:
597 except.add(element_timePeriod);
598 break;
599 case Book:
600 except.remove(text_series);
601 except.remove(text_edition);
602 break;
603 default:
604 break;
605 }
606 setIrrelevant(pushedState, except);
607 }
608
609 public void setWarnForReferencingObjects(ICdmFormElement formElement){
610 if (getEntity().getId() != 0){
611 Integer referencingObjectsCount = CdmStore.getCommonService().getReferencingObjectsCount(getEntity());
612
613 if (referencingObjectsCount > 1){
614 if (warnForReferencedObjects == null){
615 warnForReferencedObjects = formFactory.createLabel(formElement, CdmUtils.Nz("The reference is referenced by " + referencingObjectsCount+ " objects, if you change it, it is changed for all these objects"));
616 warnForReferencedObjects.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
617 warnForReferencedObjects.setLayout(LayoutConstants.FILL(2, 2));
618 warnForReferencedObjects.setForeground(Display.getCurrent().getSystemColor(
619 SWT.COLOR_RED));
620
621 }else{
622 warnForReferencedObjects.setText(CdmUtils.Nz("The reference is referenced by " + referencingObjectsCount+ " objects, if you change it, it is changed for all these objects"));
623 }
624 warnForReferencedObjects.setVisible(false);
625 }
626 }
627 }
628
629 public void setWarnForReferencingObjectsVisible(boolean isVisible){
630 if (warnForReferencedObjects != null){
631 warnForReferencedObjects.setVisible(isVisible);
632 }
633 }
634
635
636 }