96631a3e2688fa09151c611efbe4bf6a331efa6e
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / section / AbstractCdmDetailElement.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;
12
13 import java.util.Collection;
14 import java.util.EnumSet;
15
16 import org.eclipse.jface.util.PropertyChangeEvent;
17 import org.eclipse.swt.SWT;
18 import org.eclipse.swt.widgets.Composite;
19
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;
34
35 /**
36 * <p>
37 * Abstract AbstractCdmDetailElement class.
38 * </p>
39 *
40 * @author n.hoffmann
41 * @created Feb 26, 2010
42 * @version 1.0
43 */
44 public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement implements ICdmDetailElement<T> {
45
46 private static final EnumSet<CRUD> UPDATE = EnumSet.of(CRUD.UPDATE);
47
48 private T entity;
49
50 private boolean irrelevant;
51
52 /**
53 * <p>
54 * Constructor for AbstractCdmDetailElement.
55 * </p>
56 *
57 * @param formFactory
58 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
59 * object.
60 * @param formElement
61 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
62 * object.
63 * @param <T>
64 * a T object.
65 */
66 public AbstractCdmDetailElement(CdmFormFactory formFactory,
67 ICdmFormElement formElement) {
68 super(formFactory, formElement);
69 // register as property change listener
70 formFactory.addPropertyChangeListener(this);
71 }
72
73 /**
74 * Sets the entity and updates controls
75 *
76 * @param entity
77 * a T object.
78 */
79 @Override
80 public void setEntity(T entity) {
81 this.entity = entity;
82 updateContent();
83 }
84
85 /*
86 * (non-Javadoc)
87 *
88 * @see eu.etaxonomy.taxeditor.forms.IEntityElement#getEntity()
89 */
90 /**
91 * <p>
92 * Getter for the field <code>entity</code>.
93 * </p>
94 *
95 * @return a T object.
96 */
97 @Override
98 public T getEntity() {
99 return entity;
100 }
101
102 /**
103 * Updates all widgets to display the latest data
104 */
105 protected void updateContent() {
106 removeElements();
107 createControls(this, entity, SWT.WRAP);
108 getLayoutComposite().layout();
109
110 setEnabled(CdmStore.currentAuthentiationHasPermission((CdmBase) getEntity(), UPDATE));
111 }
112
113 /*
114 * (non-Javadoc)
115 *
116 * @see
117 * eu.etaxonomy.taxeditor.forms.ISelectableComposite#setSelected(boolean)
118 */
119 /** {@inheritDoc} */
120 @Override
121 public void setSelected(boolean selected) {
122 Composite section = getLayoutComposite().getParent();
123 section.setBackground(selected ? SELECTED : getPersistentBackground());
124 }
125
126 /**
127 * Sets all field to the given enablement state except the objects in
128 * collection except
129 *
130 * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#setEnabled(boolean)
131 * @param enabled
132 * a boolean.
133 * @param except
134 * a {@link java.util.Collection} object.
135 */
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);
142 } else {
143 enableableElement.setEnabled(enabled);
144 }
145 }
146 }
147 }
148
149 /**
150 * <p>
151 * Setter for the field <code>irrelevant</code>.
152 * </p>
153 *
154 * @param irrelevant
155 * a boolean.
156 * @param except
157 * a {@link java.util.Collection} object.
158 */
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)) {
166 // do nothing
167 // logger.warn("not setting elements irrelevance: " +
168 // relevantElement.getClass().getSimpleName() + " in :" +
169 // this.getClass().getSimpleName());
170 } else {
171 relevantElement.setIrrelevant(irrelevant);
172 }
173 }
174 }
175 }
176
177 /** {@inheritDoc} */
178 @Override
179 public void setEnabled(boolean enabled) {
180 setEnabled(enabled, null);
181 }
182
183 /** {@inheritDoc} */
184 @Override
185 public void setIrrelevant(boolean irrelevant) {
186 this.irrelevant = irrelevant;
187 setIrrelevant(irrelevant, null);
188 }
189
190 /**
191 * Create all content elements
192 *
193 * @param formElement
194 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
195 * object.
196 * @param entity
197 * a T object.
198 * @param style
199 * a int.
200 */
201 protected abstract void createControls(ICdmFormElement formElement,
202 T entity, int style);
203
204 /** {@inheritDoc} */
205 @Override
206 public void propertyChange(PropertyChangeEvent event) {
207 if (event == null) {
208 return;
209 }
210
211 handleTitleCacheRelevantChange(event);
212
213 Object eventSource = event.getSource();
214
215 if (eventSource instanceof ICdmFormElement) {
216 ICdmFormElement eventElement = (ICdmFormElement) eventSource;
217 ICdmFormElement eventElementContainer = eventElement
218 .getParentElement();
219
220 if (eventElementContainer == this) {
221 if (event instanceof CdmPropertyChangeEvent) {
222 if (((CdmPropertyChangeEvent) event).hasException()) {
223 handleException((CdmPropertyChangeEvent) event);
224 return;
225 }
226 }
227 // call specific handler implementation
228 handleEvent(eventSource);
229 // refire the event
230 firePropertyChangeEvent(this, event);
231 // update possible parents
232 updateParentSection();
233 }
234 }
235 }
236
237 protected void handleTitleCacheRelevantChange(PropertyChangeEvent event) {
238 boolean isRelevant = getEntity() instanceof TaxonNameBase
239 || getEntity() instanceof TaxonBase;
240 isRelevant &= this instanceof AbstractIdentifiableEntityDetailElement;
241
242 if (isRelevant) {
243 ((AbstractIdentifiableEntityDetailElement) this)
244 .updateToggleableCacheField();
245 updateParentSection();
246 }
247 }
248
249 private void updateParentSection() {
250 if (getParentElement() instanceof AbstractCdmDetailSection) {
251 ((AbstractCdmDetailSection) getParentElement()).updateTitle();
252 }
253 }
254
255 /**
256 * Gets called when the source of the event is a child widget of this
257 * widget.
258 *
259 * @param eventSource
260 * a {@link java.lang.Object} object.
261 */
262 public abstract void handleEvent(Object eventSource);
263
264 /**
265 * <p>
266 * handleException
267 * </p>
268 *
269 * @param event
270 * a
271 * {@link eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent}
272 * object.
273 */
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());
277 }
278
279 /**
280 * <p>
281 * isIrrelevant
282 * </p>
283 *
284 * @return a boolean.
285 */
286 public boolean isIrrelevant() {
287 return irrelevant;
288 }
289
290 /**
291 * <p>
292 * getConversationHolder
293 * </p>
294 *
295 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
296 * object.
297 */
298 @Override
299 public ConversationHolder getConversationHolder() {
300 if (getParentElement() instanceof IConversationEnabled) {
301 return ((IConversationEnabled) getParentElement())
302 .getConversationHolder();
303 }
304 throw new IllegalArgumentException(
305 "Parent element should be IConversationEnabled");
306 }
307
308 /** {@inheritDoc} */
309 @Override
310 public void update(CdmDataChangeMap changeEvents) {
311 }
312 }