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