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
.ArrayList
;
14 import java
.util
.Collection
;
15 import java
.util
.EnumSet
;
16 import java
.util
.Observable
;
17 import java
.util
.Observer
;
19 import org
.eclipse
.jface
.util
.PropertyChangeEvent
;
20 import org
.eclipse
.swt
.SWT
;
21 import org
.eclipse
.swt
.events
.DisposeEvent
;
22 import org
.eclipse
.swt
.events
.DisposeListener
;
23 import org
.eclipse
.swt
.widgets
.Composite
;
25 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
26 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
27 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
28 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
29 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
30 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.permission
.CRUD
;
31 import eu
.etaxonomy
.taxeditor
.model
.MessagingUtils
;
32 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
33 import eu
.etaxonomy
.taxeditor
.store
.LoginManager
;
34 import eu
.etaxonomy
.taxeditor
.store
.StoreUtil
;
35 import eu
.etaxonomy
.taxeditor
.ui
.element
.AbstractCdmFormElement
;
36 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmFormFactory
;
37 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmPropertyChangeEvent
;
38 import eu
.etaxonomy
.taxeditor
.ui
.element
.ICdmFormElement
;
39 import eu
.etaxonomy
.taxeditor
.ui
.element
.IEnableableFormElement
;
43 * Abstract AbstractCdmDetailElement class.
47 * @created Feb 26, 2010
50 public abstract class AbstractCdmDetailElement
<T
> extends AbstractCdmFormElement
implements ICdmDetailElement
<T
>, Observer
{
54 private boolean irrelevant
;
56 private boolean enabled
;
58 private EnumSet
<CRUD
> requiredCrud
= null;
62 * Constructor for AbstractCdmDetailElement.
66 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
69 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
74 public AbstractCdmDetailElement(CdmFormFactory formFactory
,
75 ICdmFormElement formElement
) {
76 super(formFactory
, formElement
);
77 // register as property change listener
78 formFactory
.addPropertyChangeListener(this);
79 CdmStore
.getLoginManager().addObserver(this);
81 getLayoutComposite().getParent().addDisposeListener(new DisposeListener() {
84 public void widgetDisposed(DisposeEvent e
) {
85 CdmStore
.getLoginManager().deleteObserver(AbstractCdmDetailElement
.this);
91 * Sets the entity and updates controls
97 public void setEntity(T entity
) {
99 // the id is always 0 if the entity was not yet saved, so it is new in this case
100 if(getEntity() == null || StoreUtil
.getCdmEntity(getEntity()).getId() == 0) {
101 // new entity, not yet saved
102 requiredCrud
= EnumSet
.of(CRUD
.CREATE
);
104 requiredCrud
= EnumSet
.of(CRUD
.UPDATE
);
112 * @see eu.etaxonomy.taxeditor.forms.IEntityElement#getEntity()
116 * Getter for the field <code>entity</code>.
119 * @return a T object.
122 public T
getEntity() {
127 * Updates all widgets to display the latest data
129 protected void updateContent() {
131 createControls(this, entity
, SWT
.WRAP
);
132 getLayoutComposite().layout();
134 updateControlStates();
141 * eu.etaxonomy.taxeditor.forms.ISelectableComposite#setSelected(boolean)
145 public void setSelected(boolean selected
) {
146 Composite section
= getLayoutComposite().getParent();
147 section
.setBackground(selected ? SELECTED
: getPersistentBackground());
151 * Sets all field to the given enablement state except the objects in
154 * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#setEnabled(boolean)
158 * a {@link java.util.Collection} object.
160 public void setEnabled(boolean enabled
, Collection
<Object
> except
) {
161 this.enabled
= enabled
;
162 for (ICdmFormElement element
: getElements()) {
163 if (element
instanceof IEnableableFormElement
) {
164 IEnableableFormElement enableableElement
= (IEnableableFormElement
) element
;
165 if (except
!= null && except
.contains(enableableElement
)) {
166 // enableableElement.setEnabled(enabled);
168 enableableElement
.setEnabled(enabled
);
175 * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#isEnabled()
178 public boolean isEnabled() {
184 * Setter for the field <code>irrelevant</code>.
190 * a {@link java.util.Collection} object.
192 public void setIrrelevant(boolean irrelevant
, Collection
<Object
> except
) {
193 // logger.warn("Setting " + this.getClass().getSimpleName() +
194 // " to irrelevant state: " + irrelevant);
195 for (ICdmFormElement element
: getElements()) {
196 if (element
instanceof IEnableableFormElement
) {
197 IEnableableFormElement relevantElement
= (IEnableableFormElement
) element
;
198 if (except
!= null && except
.contains(relevantElement
)) {
200 // logger.warn("not setting elements irrelevance: " +
201 // relevantElement.getClass().getSimpleName() + " in :" +
202 // this.getClass().getSimpleName());
204 relevantElement
.setIrrelevant(irrelevant
);
212 public void setEnabled(boolean enabled
) {
213 setEnabled(enabled
, null);
218 public void setIrrelevant(boolean irrelevant
) {
219 this.irrelevant
= irrelevant
;
220 setIrrelevant(irrelevant
, null);
224 * Create all content elements
227 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
234 protected abstract void createControls(ICdmFormElement formElement
,
235 T entity
, int style
);
239 public void propertyChange(PropertyChangeEvent event
) {
244 handleTitleCacheRelevantChange(event
);
246 Object eventSource
= event
.getSource();
248 if (eventSource
instanceof ICdmFormElement
) {
249 ICdmFormElement eventElement
= (ICdmFormElement
) eventSource
;
250 ICdmFormElement eventElementContainer
= eventElement
253 if (eventElementContainer
== this) {
254 if (event
instanceof CdmPropertyChangeEvent
) {
255 if (((CdmPropertyChangeEvent
) event
).hasException()) {
256 handleException((CdmPropertyChangeEvent
) event
);
260 // call specific handler implementation
261 handleEvent(eventSource
);
263 firePropertyChangeEvent(this, event
);
264 // update possible parents
265 updateParentSection();
270 protected void handleTitleCacheRelevantChange(PropertyChangeEvent event
) {
271 boolean isRelevant
= getEntity() instanceof TaxonNameBase
272 || getEntity() instanceof TaxonBase
;
273 isRelevant
&= this instanceof AbstractIdentifiableEntityDetailElement
;
276 ((AbstractIdentifiableEntityDetailElement
) this)
277 .updateToggleableCacheField();
278 updateParentSection();
282 private void updateParentSection() {
283 if (getParentElement() instanceof AbstractCdmDetailSection
) {
284 ((AbstractCdmDetailSection
) getParentElement()).updateTitle();
289 * Gets called when the source of the event is a child widget of this
293 * a {@link java.lang.Object} object.
295 public abstract void handleEvent(Object eventSource
);
304 * {@link eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent}
307 public void handleException(CdmPropertyChangeEvent event
) {
308 // override this in subclasses if you want to deal with the error
309 MessagingUtils
.error(event
.getSource().getClass(), event
.getException());
319 public boolean isIrrelevant() {
325 * getConversationHolder
328 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
332 public ConversationHolder
getConversationHolder() {
333 if (getParentElement() instanceof IConversationEnabled
) {
334 return ((IConversationEnabled
) getParentElement())
335 .getConversationHolder();
337 throw new IllegalArgumentException(
338 "Parent element should be IConversationEnabled");
343 public void update(CdmDataChangeMap changeEvents
) {
347 public void update(Observable o
, Object arg
){
348 if(o
instanceof LoginManager
){
349 updateControlStates();
354 protected void updateControlStates(){
355 Collection
<Object
> except
= new ArrayList
<Object
>();
356 for(ICdmFormElement formElement
:getElements()){
357 if(formElement
instanceof IEnableableFormElement
&& !((IEnableableFormElement
) formElement
).isEnabled()){
358 except
.add(formElement
);
361 setEnabled(getEntity() != null && CdmStore
.currentAuthentiationHasPermission(StoreUtil
.getCdmEntity(getEntity()), requiredCrud
), except
);