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.
9 package eu
.etaxonomy
.taxeditor
.ui
.section
.classification
;
11 import java
.util
.ArrayList
;
12 import java
.util
.Collection
;
13 import java
.util
.HashMap
;
16 import org
.apache
.commons
.lang3
.StringUtils
;
17 import org
.eclipse
.jface
.resource
.JFaceResources
;
18 import org
.eclipse
.swt
.SWT
;
19 import org
.eclipse
.swt
.graphics
.Font
;
20 import org
.eclipse
.swt
.widgets
.Control
;
21 import org
.eclipse
.swt
.widgets
.Label
;
22 import org
.eclipse
.swt
.widgets
.Text
;
24 import eu
.etaxonomy
.cdm
.common
.CdmUtils
;
25 import eu
.etaxonomy
.cdm
.hibernate
.HibernateProxyHelper
;
26 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
27 import eu
.etaxonomy
.cdm
.model
.common
.LanguageString
;
28 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementSource
;
29 import eu
.etaxonomy
.cdm
.model
.metadata
.CdmPreference
;
30 import eu
.etaxonomy
.cdm
.model
.metadata
.PreferencePredicate
;
31 import eu
.etaxonomy
.cdm
.model
.metadata
.PublishEnum
;
32 import eu
.etaxonomy
.cdm
.model
.name
.TaxonName
;
33 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
34 import eu
.etaxonomy
.cdm
.model
.taxon
.Classification
;
35 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
36 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonNode
;
37 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonNodeStatus
;
38 import eu
.etaxonomy
.taxeditor
.l10n
.Messages
;
39 import eu
.etaxonomy
.taxeditor
.model
.AbstractUtility
;
40 import eu
.etaxonomy
.taxeditor
.preference
.CdmPreferenceCache
;
41 import eu
.etaxonomy
.taxeditor
.preference
.PreferencesUtil
;
42 import eu
.etaxonomy
.taxeditor
.preference
.Resources
;
43 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
44 import eu
.etaxonomy
.taxeditor
.store
.StoreUtil
;
45 import eu
.etaxonomy
.taxeditor
.ui
.combo
.EnumComboElement
;
46 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmFormFactory
;
47 import eu
.etaxonomy
.taxeditor
.ui
.element
.CheckboxElement
;
48 import eu
.etaxonomy
.taxeditor
.ui
.element
.ICdmFormElement
;
49 import eu
.etaxonomy
.taxeditor
.ui
.element
.IEnableableFormElement
;
50 import eu
.etaxonomy
.taxeditor
.ui
.element
.LayoutConstants
;
51 import eu
.etaxonomy
.taxeditor
.ui
.element
.MultilanguageTextElement
;
52 import eu
.etaxonomy
.taxeditor
.ui
.element
.SelectionArbitrator
;
53 import eu
.etaxonomy
.taxeditor
.ui
.element
.TextWithLabelElement
;
54 import eu
.etaxonomy
.taxeditor
.ui
.section
.supplemental
.AbstractSingleSourceElement
;
55 import eu
.etaxonomy
.taxeditor
.ui
.selection
.EntitySelectionElement
;
56 import eu
.etaxonomy
.taxeditor
.ui
.selection
.TaxonNodeSelectionElement
;
60 * @created Sep 27, 2010
62 public class TaxonNodeDetailElement
extends AbstractSingleSourceElement
<TaxonNode
> {
64 private static final String STATUS_NOTES
= Messages
.TaxonNodeWizardPage_STATUS_NOTES
;
65 private static final String CLASSIFICATION_STR
= Messages
.TaxonNodeWizardPage_CLASSIFICATION
;
66 private static final String REUSE_EXISTING_TAXON
= Messages
.TaxonNodeWizardPage_REUSE_EXISTING_TAXON
;
67 private static final String REUSE_EXISTING_NAME
= Messages
.TaxonNodeWizardPage_REUSE_EXISTING_NAME
;
68 private static final String SECUNDUM_REFERENCE
= Messages
.TaxonNodeWizardPage_SECUNDUM_REFERENCE
;
70 private static final Font FONT_BOLD
= JFaceResources
.getFontRegistry().getBold(JFaceResources
.DEFAULT_FONT
);
72 private boolean createNew
= false;
73 private Classification classification
;
74 private TaxonNode parentNode
;
76 private boolean complete
;
77 private TaxonNodeStatus status
= null;
78 private Map
<Language
, LanguageString
> multilanguageTextCache
;
80 private TaxonNodeSelectionElement selection_parentTaxonNode
;
81 private EntitySelectionElement
<Taxon
> selection_reuseExistingTaxon
;
82 private EntitySelectionElement
<TaxonName
> selection_reuseExistingName
;
83 private EntitySelectionElement
<Reference
> selection_SecRef
;
85 // private OriginalSourceElement singleSourceSection;
87 private TextWithLabelElement textTaxonSec
;
88 private TextWithLabelElement microReference
;
89 private TextWithLabelElement textNewTaxonName
;
90 private TaxonNodeAgentRelationCollectionSection selectionNodeAgentRelation
;
91 private EnumComboElement
<TaxonNodeStatus
> combo_status
;
92 private CheckboxElement checkbox_publish
;
93 private MultilanguageTextElement multiLanguageTextStatusNotes
;
95 public TaxonNodeDetailElement(CdmFormFactory formFactory
,
96 ICdmFormElement formElement
, boolean isCreateNew
) {
97 super(formFactory
, formElement
);
98 createNew
= isCreateNew
;
101 public Map
<Language
, LanguageString
> getMultiLanguageTextExcludedNotes() {
102 return multiLanguageTextStatusNotes
.getMultilanguageText();
105 public TaxonNodeStatus
getTaxonNodeStatus(){
109 public Reference
getRef() {
110 return getEntity().getCitation();
112 public TaxonName
getExistingName() {
113 return selection_reuseExistingName
.getEntity();
115 public String
getMicroReference() {
116 return microReference
.getText();
120 public void createControls(ICdmFormElement formElement
,TaxonNode entity
, int style
) {
121 // taxon = entity.getTaxon();
123 Label taxonTitle
= new Label(getLayoutComposite(), SWT
.NULL
);
124 taxonTitle
.setText(Messages
.TaxonNodeWizardPage_TAXON_INFORMATION
);
125 taxonTitle
.setLayoutData(LayoutConstants
.FILL_HORIZONTALLY(2, 1));
126 taxonTitle
.setFont(FONT_BOLD
);
131 textNewTaxonName
= formFactory
.createTextWithLabelElement(formElement
,
132 Messages
.TaxonNodeWizardPage_NEW_TAXON
, "", style
);
133 textNewTaxonName
.setFocus();
134 textNewTaxonName
.setIndent(10);
136 selection_reuseExistingTaxon
= formFactory
137 .createSelectionElement(Taxon
.class,//getConversationHolder(),
139 REUSE_EXISTING_TAXON
, null,
140 EntitySelectionElement
.DELETABLE
, style
);
141 selection_reuseExistingTaxon
.setIndent(10);
142 selection_reuseExistingName
= formFactory
143 .createSelectionElement(TaxonName
.class,//getConversationHolder(),
145 REUSE_EXISTING_NAME
, taxon
!= null? taxon
.getName(): null,
146 EntitySelectionElement
.DELETABLE
, style
);
147 selection_reuseExistingName
.setIndent(10);
148 selection_SecRef
= formFactory
149 .createSelectionElement(Reference
.class,//getConversationHolder(),
150 formElement
, SECUNDUM_REFERENCE
, taxon
!= null? taxon
.getSec(): null,
151 EntitySelectionElement
.DELETABLE
, style
, 100);
152 selection_SecRef
.setIndent(10);
153 microReference
= formFactory
.createTextWithLabelElement(formElement
, "Secundum Details", "", style
);
155 microReference
.setIndent(10);
156 checkbox_publish
= formFactory
.createCheckbox(formElement
,
157 Messages
.TaxonNodeWizardPage_TAXON_IS_PUBLISH
, true, style
);
159 checkbox_publish
.setEnabled(isCreateNew());
160 checkbox_publish
.setIndent(10);
161 Label spacer
= new Label(getLayoutComposite(), SWT
.NULL
);
162 spacer
.setLayoutData(LayoutConstants
.FILL_HORIZONTALLY(2, 2));
163 Label nodeTitle
= new Label(getLayoutComposite(), SWT
.NULL
);
164 nodeTitle
.setText("Taxon Node");
165 nodeTitle
.setLayoutData(LayoutConstants
.FILL_HORIZONTALLY(2, 1));
166 nodeTitle
.setFont(FONT_BOLD
);
167 // LabelElement nodeTitle = formFactory.createLabel(formElement, Messages.TaxonNodeWizardPage_TAXON_INFORMATION);
168 // nodeTitle.setLayout(LayoutConstants.FILL_HORIZONTALLY(2, 1));
169 // nodeTitle.setBackground(getPersistentBackground());
170 // nodeTitle.setBold();
172 selection_parentTaxonNode
= formFactory
173 .createTaxonNodeSelectionElement(getConversationHolder(), formElement
, Messages
.TaxonNodeWizardPage_PARENT
, parentNode
,
174 EntitySelectionElement
.SELECTABLE
, style
, 100);
175 selection_parentTaxonNode
.setIndent(10);
180 taxon
= getEntity().getTaxon();
181 selection_reuseExistingTaxon
= formFactory
182 .createSelectionElement(Taxon
.class, formElement
,
183 Messages
.TaxonNodeWizardPage_TAXON
, taxon
,
184 EntitySelectionElement
.DELETABLE
, SWT
.NULL
);
186 selection_reuseExistingTaxon
.setIndent(10);
187 textTaxonSec
= formFactory
.createTextWithLabelElement(formElement
,SECUNDUM_REFERENCE
, "", SWT
.NULL
);
188 textTaxonSec
.setIndent(10);
189 microReference
= formFactory
.createTextWithLabelElement(formElement
, "Secundum Details", "", SWT
.NULL
);
190 microReference
.setIndent(10);
192 if (entity
.getTaxon().getSec() != null){
193 textTaxonSec
.setText(taxon
.getSec().getTitleCache());
195 textTaxonSec
.setEnabled(false);
196 microReference
.setEnabled(false);
197 Label spacer
= new Label(getLayoutComposite(), SWT
.NULL
);
198 spacer
.setLayoutData(LayoutConstants
.FILL_HORIZONTALLY(2, 2));
200 Label nodeTitle
= new Label(getLayoutComposite(), SWT
.NULL
);
201 nodeTitle
.setText("Taxon Node");
202 nodeTitle
.setLayoutData(LayoutConstants
.FILL_HORIZONTALLY(2, 1));
203 nodeTitle
.setFont(FONT_BOLD
);
205 // LabelElement nodeTitle = formFactory.createLabel(formElement, "Taxon Node");
206 // nodeTitle.setLayout(LayoutConstants.FILL_HORIZONTALLY(2, 1));
207 // nodeTitle.setBackground(getPersistentBackground());
208 // nodeTitle.setBold();
211 if (entity
.getParent().getTaxon() == null){
212 TextWithLabelElement textParent
= formFactory
.createTextWithLabelElement(
213 formElement
,CLASSIFICATION_STR
, entity
.getClassification().getTitleCache(), SWT
.NULL
);
214 textParent
.setEnabled(false);
215 textParent
.setIndent(10);
217 TextWithLabelElement textParent
= formFactory
.createTextWithLabelElement(
218 formElement
, Messages
.TaxonNodeWizardPage_PARENT
, entity
.getParent().getTaxon().getTitleCache(), SWT
.NULL
);
219 textParent
.setEnabled(false);
220 textParent
.setIndent(10);
225 combo_status
= formFactory
.createEnumComboElement(TaxonNodeStatus
.class, formElement
, SWT
.NULL
, true);
227 combo_status
.setSelection(entity
.getStatus());
229 combo_status
.setIndent(10);
232 String defaultPublish
= PreferencesUtil
.getStringValue(PreferencePredicate
.DefaultBehaviourForPublishFlag
.getKey());
233 if (defaultPublish
!= null && defaultPublish
.equals(PublishEnum
.Publish
.getKey())){
234 checkbox_publish
.setSelection(true);
235 } else if (defaultPublish
!= null && defaultPublish
.equals(PublishEnum
.NotPublish
.getKey())){
236 checkbox_publish
.setSelection(false);
238 if(this.getParentTreeNode() != null && this.getParentTreeNode().isInstanceOf(TaxonNode
.class) && this.getParentTreeNode().getTaxon() != null){
239 checkbox_publish
.setSelection(this.getParentTreeNode().getTaxon().isPublish());
241 checkbox_publish
.setSelection(true);
253 multiLanguageTextStatusNotes
= formFactory
.createMultiLanguageTextElement(formElement
, STATUS_NOTES
, null, 50, style
);
255 multiLanguageTextStatusNotes
.setMultilanguageText(entity
.getStatusNote());
256 multiLanguageTextStatusNotes
.setEnabled(entity
.getStatus() != null);
258 multiLanguageTextStatusNotes
.setIndent(10);
259 singleSourceSection
= formFactory
.createOriginalSourceElement(formElement
, entity
, "");
260 if (isCreateNew() || entity
.getSource() == null){
261 DescriptionElementSource source
= DescriptionElementSource
.NewPrimarySourceInstance(null, null);
262 entity
.setSource(source
);
263 singleSourceSection
.setEntity(source
);
265 singleSourceSection
.setEntity(entity
.getSource());
268 singleSourceSection
.setIndent(10);
269 // singleSourceSection.set
271 // super.createControls(formElement, entity, style);
273 setSourceLabel(Messages
.TaxonNodeWizardPage_PLACEMENT_SOURCE
);
276 selectionNodeAgentRelation
= formFactory
.createTaxonNodeAgentRelationCollectionSection(formElement
, getConversationHolder(), StoreUtil
.getSectionStyle(TaxonNodeAgentRelationCollectionSection
.class, entity
.getClass().getCanonicalName()));
277 selectionNodeAgentRelation
.setLayoutData(LayoutConstants
.FILL_HORIZONTALLY(2, 1));
278 selectionNodeAgentRelation
.setEntity(entity
);
279 selectionNodeAgentRelation
.setIndent(10);
280 selectionNodeAgentRelation
.setFont(AbstractUtility
.getFont(Resources
.COLOR_FONT_DEFAULT
));
281 setBackground(getPersistentBackground());
285 private void preFillTaxonName() {
286 TaxonNode node
= parentNode
;
287 if(node
!= null && node
.getTaxon()!=null){
288 Taxon taxon
= HibernateProxyHelper
.deproxy(node
.getTaxon(), Taxon
.class);
289 if(taxon
.getName()!=null){
290 TaxonName name
= HibernateProxyHelper
.deproxy(node
.getTaxon().getName());
292 textNewTaxonName
.setText(name
.getNameCache());
293 } else if( ! name
.isSupraGeneric() && name
.getRank() != null){
294 String taxonName
= "";
295 if(name
.isGenus() || name
.isInfraGeneric()|| name
.isSpeciesAggregate() ){
296 taxonName
= name
.getGenusOrUninomial();
298 else if(name
.isSpecies() || name
.isInfraSpecific() ){
299 taxonName
= CdmUtils
.concat(" ", name
.getGenusOrUninomial(),name
.getSpecificEpithet());
301 if (StringUtils
.isNotBlank(taxonName
)){
302 textNewTaxonName
.setText(taxonName
+ " ");
303 if(textNewTaxonName
.getMainControl() instanceof Text
){
304 Text text
= (Text
)textNewTaxonName
.getMainControl();
305 text
.setSelection(textNewTaxonName
.getText().length());
314 public void handleEvent(Object eventSource
) {
315 if (eventSource
== selection_parentTaxonNode
) {
316 setParentTreeNode(selection_parentTaxonNode
.getEntity());
317 } else if (eventSource
== selection_reuseExistingTaxon
) {
318 if (selection_reuseExistingTaxon
.getEntity() != null){
319 setTaxon(selection_reuseExistingTaxon
.getEntity());
320 if (getTaxon().getSec()!= null){
321 microReference
.setText(getTaxon().getSecMicroReference());
323 selection_SecRef
.setEntity(getTaxon().getSec());
325 textTaxonSec
.setText((getTaxon().getSec().getTitleCache()));
328 microReference
.setText("");
330 selection_SecRef
.setEntity(null);
332 textTaxonSec
.setText("");
335 checkbox_publish
.setSelected(getTaxon().isPublish());
337 boolean enabled
= selection_reuseExistingTaxon
.getEntity() == null;
338 if (selection_reuseExistingName
!= null){
339 selection_reuseExistingName
.setEnabled(enabled
);
341 if (textNewTaxonName
!= null){
342 textNewTaxonName
.setEnabled(enabled
);
345 } else if (eventSource
== selection_reuseExistingName
) {
346 boolean enabled
= selection_reuseExistingName
.getEntity() == null;
347 setTaxon(HibernateProxyHelper
.deproxy(selection_reuseExistingName
.getEntity()));
348 if (selection_reuseExistingTaxon
!= null){
349 selection_reuseExistingTaxon
.setEnabled(enabled
);
351 textNewTaxonName
.setEnabled(enabled
);
352 complete
= !textNewTaxonName
.getText().isEmpty();
355 if (eventSource
== combo_status
) {
356 status
= combo_status
.getSelection();
358 if (multiLanguageTextStatusNotes
.getMultilanguageText() != null && !multiLanguageTextStatusNotes
.getMultilanguageText().isEmpty()){
359 multilanguageTextCache
= new HashMap
<>();
360 for (LanguageString langString
: multiLanguageTextStatusNotes
.getMultilanguageText().values()){
361 multilanguageTextCache
.put(langString
.getLanguage(), langString
);
363 // multilanguageTextCache = multiLanguageTextStatusNotes.getMultilanguageText();
365 multiLanguageTextStatusNotes
.setMultilanguageText(new HashMap
<>());
366 // multiLanguageTextStatusNotes.refresh();
368 }else if (multilanguageTextCache
!= null ){
370 multiLanguageTextStatusNotes
.setMultilanguageText(multilanguageTextCache
);
371 multilanguageTextCache
= null;
374 getEntity().setStatus(status
);
376 getEntity().getStatusNote().clear();
377 multiLanguageTextStatusNotes
.setMultilanguageText(new HashMap
<>());
378 multiLanguageTextStatusNotes
.refresh();
380 if (multiLanguageTextStatusNotes
.getMultilanguageText() != null){
381 for (LanguageString lang
:multiLanguageTextStatusNotes
.getMultilanguageText().values()){
382 getEntity().putStatusNote(lang
);
388 multiLanguageTextStatusNotes
.setEnabled(status
!= null);
393 if (eventSource
== textNewTaxonName
) {
394 boolean enabled
= CdmUtils
.isBlank(textNewTaxonName
.getText());
395 if (selection_reuseExistingTaxon
!= null){
396 selection_reuseExistingTaxon
.setEnabled(enabled
);
398 selection_reuseExistingName
.setEnabled(enabled
);
400 complete
= CdmUtils
.isNotBlank(textNewTaxonName
.getText());
403 if (eventSource
== selectionNodeAgentRelation
){
404 boolean allComplete
= true;
405 for (ICdmFormElement element
: selectionNodeAgentRelation
.getElements()){
406 allComplete
&=((TaxonNodeAgentRelationCollectionElement
)element
).isComplete();
408 complete
= !isCreateNew() && allComplete
;
412 public Classification
getClassification() {
413 return classification
;
416 public TaxonNode
getParentTreeNode() {
420 public void setParentTreeNode(TaxonNode parentTreeNode
) {
421 this.parentNode
= parentTreeNode
;
423 if (parentTreeNode
.getTaxon() == null) {
424 classification
= parentTreeNode
.getClassification();
425 if (selection_parentTaxonNode
!= null){
426 selection_parentTaxonNode
.setEntity(classification
.getRootNode());
427 selection_parentTaxonNode
.setClassification(classification
);
428 selection_SecRef
.setEntity(classification
.getReference());
431 classification
= HibernateProxyHelper
432 .deproxy(parentTreeNode
.getClassification());
433 if (selection_parentTaxonNode
!= null){
434 selection_parentTaxonNode
.setEntity(HibernateProxyHelper
.deproxy(parentTreeNode
));
435 selection_parentTaxonNode
.setClassification(classification
);
436 selection_SecRef
.setEntity(parentTreeNode
.getTaxon().getSec());
442 protected void updateControlStates(){
443 Collection
<Object
> except
= new ArrayList
<Object
>();
444 for(ICdmFormElement formElement
:getElements()){
445 if(formElement
instanceof IEnableableFormElement
&& !((IEnableableFormElement
) formElement
).isEnabled()){
446 except
.add(formElement
);
452 enabled
= getEntity() != null && CdmStore
.currentAuthentiationHasPermission(StoreUtil
.getCdmEntity(getEntity()), requiredCrud
);
454 setEnabled(enabled
, except
);
457 private void setTreeNode(TaxonNode treeNode
) {
458 classification
= HibernateProxyHelper
459 .deproxy(treeNode
.getClassification());
461 selection_parentTaxonNode
.setEntity(treeNode
.getParent());
462 selection_parentTaxonNode
.setClassification(treeNode
.getParent().getClassification());
463 selection_SecRef
.setEntity(treeNode
.getTaxon().getSec());
467 private void setTaxon(Taxon taxon
) {
470 getEntity().setTaxon(taxon
);
472 this.set_publish(taxon
.isPublish());
474 textNewTaxonName
.setText(taxon
.getName().getTitleCache());
475 if (taxon
.getSec() != null){
476 selection_SecRef
.setEntity(taxon
.getSec());
479 if (taxon
.getSec() != null) {
480 this.textTaxonSec
.setText(taxon
.getSec().getTitleCache());
485 private void setTaxon(TaxonName taxonName
) {
486 Reference secundum
= null;
487 if (getParentTreeNode() != null) {
488 if (this.selection_SecRef
.getEntity() != null){
489 secundum
= this.selection_SecRef
.getEntity();
495 public String
getTaxonName() {
496 return textNewTaxonName
.getText();
498 public Taxon
getTaxon() {
502 public Reference
getSecReference(){
503 return selection_SecRef
.getSelection();
506 public Control
getMainControl(){
507 return textNewTaxonName
.getMainControl();
510 public boolean isComplete() {
511 boolean allComplete
= true;
513 for (ICdmFormElement element
: selectionNodeAgentRelation
.getElements()){
514 allComplete
&=((TaxonNodeAgentRelationCollectionElement
)element
).isComplete();
516 complete
= allComplete
;
521 public boolean isCreateNew() {
525 public boolean is_publish() {
526 boolean isPublishPreference
= true;
527 CdmPreference defaultPublish
= CdmPreferenceCache
.instance().get(PreferencePredicate
.DefaultBehaviourForPublishFlag
.getKey());
528 if (defaultPublish
!= null && defaultPublish
.getValue()!= null && defaultPublish
.getValue().equals(PublishEnum
.NotPublish
.getKey())){
529 isPublishPreference
= false;
531 return checkbox_publish
!=null?checkbox_publish
.getSelection():isPublishPreference
;
534 public void set_publish(boolean publish
) {
535 this.checkbox_publish
.setSelection(publish
);
539 * Updates all widgets to display the latest data
542 protected void updateContent() {
545 createControls(this, parentNode
, SWT
.NONE
);
547 createControls(this, getEntity(), SWT
.NONE
);
549 updateControlStates();
553 public SelectionArbitrator
getSelectionArbitrator() {
554 // TODO Auto-generated method stub