3 * Copyright (C) 2013 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.
10 package eu
.etaxonomy
.taxeditor
.ui
.section
;
12 import java
.util
.Collection
;
14 import org
.eclipse
.jface
.util
.PropertyChangeEvent
;
15 import org
.eclipse
.swt
.SWT
;
16 import org
.eclipse
.swt
.widgets
.Composite
;
17 import org
.eclipse
.ui
.forms
.widgets
.FormToolkit
;
18 import org
.eclipse
.wb
.swt
.SWTResourceManager
;
20 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
21 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
22 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
23 import eu
.etaxonomy
.taxeditor
.model
.AbstractUtility
;
24 import eu
.etaxonomy
.taxeditor
.ui
.element
.AbstractCdmFormElementComposite
;
25 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmFormFactory
;
26 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmPropertyChangeEvent
;
27 import eu
.etaxonomy
.taxeditor
.ui
.element
.ICdmFormElement
;
28 import eu
.etaxonomy
.taxeditor
.ui
.element
.IEnableableFormElement
;
35 public abstract class AbstractCdmDetailElementComposite
<T
> extends AbstractCdmFormElementComposite
implements ICdmDetailElement
<T
>{
39 private boolean irrelevant
;
43 * Constructor for AbstractCdmDetailElement.
47 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
50 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
55 public AbstractCdmDetailElementComposite(Composite parent
, FormToolkit formFactory
, ICdmFormElement parentFormElement
, int style
) {
56 super(parent
, formFactory
, parentFormElement
, style
);
57 setBackground(SWTResourceManager
.getColor(SWT
.COLOR_WHITE
));
58 // register as property change listener
59 if(formFactory
instanceof CdmFormFactory
){
60 ((CdmFormFactory
) formFactory
).addPropertyChangeListener(this);
65 * Sets the entity and updates controls
71 public void setEntity(T entity
) {
79 * @see eu.etaxonomy.taxeditor.forms.IEntityElement#getEntity()
83 * Getter for the field <code>entity</code>.
89 public T
getEntity() {
94 * Updates all widgets to display the latest data
96 protected void updateContent() {
98 createControls(this, entity
, SWT
.WRAP
);
99 getLayoutComposite().layout();
106 * eu.etaxonomy.taxeditor.forms.ISelectableComposite#setSelected(boolean)
110 public void setSelected(boolean selected
) {
111 Composite section
= getLayoutComposite().getParent();
112 section
.setBackground(selected ? SELECTED
: getPersistentBackground());
116 * Sets all field to the given enablement state except the objects in
119 * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#setEnabled(boolean)
123 * a {@link java.util.Collection} object.
125 public void setEnabled(boolean enabled
, Collection
<Object
> except
) {
126 for (ICdmFormElement element
: getElements()) {
127 if (element
instanceof IEnableableFormElement
) {
128 IEnableableFormElement enableableElement
= (IEnableableFormElement
) element
;
129 if (except
!= null && except
.contains(enableableElement
)) {
130 // enableableElement.setEnabled(enabled);
132 enableableElement
.setEnabled(enabled
);
140 * Setter for the field <code>irrelevant</code>.
146 * a {@link java.util.Collection} object.
148 public void setIrrelevant(boolean irrelevant
, Collection
<Object
> except
) {
149 // logger.warn("Setting " + this.getClass().getSimpleName() +
150 // " to irrelevant state: " + irrelevant);
151 for (ICdmFormElement element
: getElements()) {
152 if (element
instanceof IEnableableFormElement
) {
153 IEnableableFormElement relevantElement
= (IEnableableFormElement
) element
;
154 if (except
!= null && except
.contains(relevantElement
)) {
156 // logger.warn("not setting elements irrelevance: " +
157 // relevantElement.getClass().getSimpleName() + " in :" +
158 // this.getClass().getSimpleName());
160 relevantElement
.setIrrelevant(irrelevant
);
168 public void setEnabled(boolean enabled
) {
169 setEnabled(enabled
, null);
174 public void setIrrelevant(boolean irrelevant
) {
175 this.irrelevant
= irrelevant
;
176 setIrrelevant(irrelevant
, null);
180 * Create all content elements
183 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
190 protected abstract void createControls(ICdmFormElement formElement
, T entity
, int style
);
194 public void propertyChange(PropertyChangeEvent event
) {
199 handleTitleCacheRelevantChange(event
);
201 Object eventSource
= event
.getSource();
203 if (eventSource
instanceof ICdmFormElement
) {
204 ICdmFormElement eventElement
= (ICdmFormElement
) eventSource
;
205 ICdmFormElement eventElementContainer
= eventElement
208 if (eventElementContainer
== this) {
209 if (event
instanceof CdmPropertyChangeEvent
) {
210 if (((CdmPropertyChangeEvent
) event
).hasException()) {
211 handleException((CdmPropertyChangeEvent
) event
);
215 // call specific handler implementation
216 handleEvent(eventSource
);
218 firePropertyChangeEvent(this, event
);
219 // update possible parents
220 updateParentSection();
225 protected void handleTitleCacheRelevantChange(PropertyChangeEvent event
) {
228 // boolean isRelevant = getEntity() instanceof TaxonNameBase
229 // || getEntity() instanceof TaxonBase;
230 // isRelevant &= this instanceof AbstractIdentifiableEntityDetailElement;
233 // ((AbstractIdentifiableEntityDetailElement) this)
234 // .updateToggleableCacheField();
235 // updateParentSection();
239 private void updateParentSection() {
240 if (getParentElement() instanceof AbstractCdmDetailSection
) {
241 ((AbstractCdmDetailSection
) getParentElement()).updateTitle();
246 * Gets called when the source of the event is a child widget of this
250 * a {@link java.lang.Object} object.
252 public abstract void handleEvent(Object eventSource
);
261 * {@link eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent}
264 public void handleException(CdmPropertyChangeEvent event
) {
265 // override this in subclasses if you want to deal with the error
266 AbstractUtility
.error(event
.getSource().getClass(), event
.getException());
276 public boolean isIrrelevant() {
282 * getConversationHolder
285 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
289 public ConversationHolder
getConversationHolder() {
290 if (getParentElement() instanceof IConversationEnabled
) {
291 return ((IConversationEnabled
) getParentElement())
292 .getConversationHolder();
294 throw new IllegalArgumentException(
295 "Parent element should be IConversationEnabled");
300 public void update(CdmDataChangeMap changeEvents
) {