3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
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.
11 package eu
.etaxonomy
.taxeditor
.ui
.section
;
13 import java
.util
.Collection
;
14 import java
.util
.EnumSet
;
16 import org
.eclipse
.jface
.util
.PropertyChangeEvent
;
17 import org
.eclipse
.swt
.SWT
;
18 import org
.eclipse
.swt
.widgets
.Composite
;
20 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
21 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
22 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
23 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
24 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
25 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
26 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.permission
.CRUD
;
27 import eu
.etaxonomy
.taxeditor
.model
.AbstractUtility
;
28 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
29 import eu
.etaxonomy
.taxeditor
.ui
.element
.AbstractCdmFormElement
;
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
.IEnableableFormElement
;
37 * Abstract AbstractCdmDetailElement class.
41 * @created Feb 26, 2010
44 public abstract class AbstractCdmDetailElement
<T
> extends AbstractCdmFormElement
implements ICdmDetailElement
<T
> {
46 private static final EnumSet
<CRUD
> UPDATE
= EnumSet
.of(CRUD
.UPDATE
);
50 private boolean irrelevant
;
54 * Constructor for AbstractCdmDetailElement.
58 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
61 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
66 public AbstractCdmDetailElement(CdmFormFactory formFactory
,
67 ICdmFormElement formElement
) {
68 super(formFactory
, formElement
);
69 // register as property change listener
70 formFactory
.addPropertyChangeListener(this);
74 * Sets the entity and updates controls
80 public void setEntity(T entity
) {
88 * @see eu.etaxonomy.taxeditor.forms.IEntityElement#getEntity()
92 * Getter for the field <code>entity</code>.
98 public T
getEntity() {
103 * Updates all widgets to display the latest data
105 protected void updateContent() {
107 createControls(this, entity
, SWT
.WRAP
);
108 getLayoutComposite().layout();
110 setEnabled(CdmStore
.currentAuthentiationHasPermission((CdmBase
) getEntity(), UPDATE
));
117 * eu.etaxonomy.taxeditor.forms.ISelectableComposite#setSelected(boolean)
121 public void setSelected(boolean selected
) {
122 Composite section
= getLayoutComposite().getParent();
123 section
.setBackground(selected ? SELECTED
: getPersistentBackground());
127 * Sets all field to the given enablement state except the objects in
130 * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#setEnabled(boolean)
134 * a {@link java.util.Collection} object.
136 public void setEnabled(boolean enabled
, Collection
<Object
> except
) {
137 for (ICdmFormElement element
: getElements()) {
138 if (element
instanceof IEnableableFormElement
) {
139 IEnableableFormElement enableableElement
= (IEnableableFormElement
) element
;
140 if (except
!= null && except
.contains(enableableElement
)) {
141 // enableableElement.setEnabled(enabled);
143 enableableElement
.setEnabled(enabled
);
151 * Setter for the field <code>irrelevant</code>.
157 * a {@link java.util.Collection} object.
159 public void setIrrelevant(boolean irrelevant
, Collection
<Object
> except
) {
160 // logger.warn("Setting " + this.getClass().getSimpleName() +
161 // " to irrelevant state: " + irrelevant);
162 for (ICdmFormElement element
: getElements()) {
163 if (element
instanceof IEnableableFormElement
) {
164 IEnableableFormElement relevantElement
= (IEnableableFormElement
) element
;
165 if (except
!= null && except
.contains(relevantElement
)) {
167 // logger.warn("not setting elements irrelevance: " +
168 // relevantElement.getClass().getSimpleName() + " in :" +
169 // this.getClass().getSimpleName());
171 relevantElement
.setIrrelevant(irrelevant
);
179 public void setEnabled(boolean enabled
) {
180 setEnabled(enabled
, null);
185 public void setIrrelevant(boolean irrelevant
) {
186 this.irrelevant
= irrelevant
;
187 setIrrelevant(irrelevant
, null);
191 * Create all content elements
194 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
201 protected abstract void createControls(ICdmFormElement formElement
,
202 T entity
, int style
);
206 public void propertyChange(PropertyChangeEvent event
) {
211 handleTitleCacheRelevantChange(event
);
213 Object eventSource
= event
.getSource();
215 if (eventSource
instanceof ICdmFormElement
) {
216 ICdmFormElement eventElement
= (ICdmFormElement
) eventSource
;
217 ICdmFormElement eventElementContainer
= eventElement
220 if (eventElementContainer
== this) {
221 if (event
instanceof CdmPropertyChangeEvent
) {
222 if (((CdmPropertyChangeEvent
) event
).hasException()) {
223 handleException((CdmPropertyChangeEvent
) event
);
227 // call specific handler implementation
228 handleEvent(eventSource
);
230 firePropertyChangeEvent(this, event
);
231 // update possible parents
232 updateParentSection();
237 protected void handleTitleCacheRelevantChange(PropertyChangeEvent event
) {
238 boolean isRelevant
= getEntity() instanceof TaxonNameBase
239 || getEntity() instanceof TaxonBase
;
240 isRelevant
&= this instanceof AbstractIdentifiableEntityDetailElement
;
243 ((AbstractIdentifiableEntityDetailElement
) this)
244 .updateToggleableCacheField();
245 updateParentSection();
249 private void updateParentSection() {
250 if (getParentElement() instanceof AbstractCdmDetailSection
) {
251 ((AbstractCdmDetailSection
) getParentElement()).updateTitle();
256 * Gets called when the source of the event is a child widget of this
260 * a {@link java.lang.Object} object.
262 public abstract void handleEvent(Object eventSource
);
271 * {@link eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent}
274 public void handleException(CdmPropertyChangeEvent event
) {
275 // override this in subclasses if you want to deal with the error
276 AbstractUtility
.error(event
.getSource().getClass(), event
.getException());
286 public boolean isIrrelevant() {
292 * getConversationHolder
295 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
299 public ConversationHolder
getConversationHolder() {
300 if (getParentElement() instanceof IConversationEnabled
) {
301 return ((IConversationEnabled
) getParentElement())
302 .getConversationHolder();
304 throw new IllegalArgumentException(
305 "Parent element should be IConversationEnabled");
310 public void update(CdmDataChangeMap changeEvents
) {