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