- changed layout so that two colums are used for label and text field
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / section / AbstractCdmDetailElementComposite.java
1 // $Id$
2 /**
3 * Copyright (C) 2013 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 package eu.etaxonomy.taxeditor.ui.section;
11
12 import java.util.Collection;
13
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;
19
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;
29
30 /**
31 * @author pplitzner
32 * @date 25.07.2013
33 *
34 */
35 public abstract class AbstractCdmDetailElementComposite<T> extends AbstractCdmFormElementComposite implements ICdmDetailElement<T>{
36
37 private T entity;
38
39 private boolean irrelevant;
40
41 /**
42 * <p>
43 * Constructor for AbstractCdmDetailElement.
44 * </p>
45 *
46 * @param formFactory
47 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
48 * object.
49 * @param formElement
50 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
51 * object.
52 * @param <T>
53 * a T object.
54 */
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);
61 }
62 }
63
64 /**
65 * Sets the entity and updates controls
66 *
67 * @param entity
68 * a T object.
69 */
70 @Override
71 public void setEntity(T entity) {
72 this.entity = entity;
73 updateContent();
74 }
75
76 /*
77 * (non-Javadoc)
78 *
79 * @see eu.etaxonomy.taxeditor.forms.IEntityElement#getEntity()
80 */
81 /**
82 * <p>
83 * Getter for the field <code>entity</code>.
84 * </p>
85 *
86 * @return a T object.
87 */
88 @Override
89 public T getEntity() {
90 return entity;
91 }
92
93 /**
94 * Updates all widgets to display the latest data
95 */
96 protected void updateContent() {
97 removeElements();
98 createControls(this, entity, SWT.WRAP);
99 getLayoutComposite().layout();
100 }
101
102 /*
103 * (non-Javadoc)
104 *
105 * @see
106 * eu.etaxonomy.taxeditor.forms.ISelectableComposite#setSelected(boolean)
107 */
108 /** {@inheritDoc} */
109 @Override
110 public void setSelected(boolean selected) {
111 Composite section = getLayoutComposite().getParent();
112 section.setBackground(selected ? SELECTED : getPersistentBackground());
113 }
114
115 /**
116 * Sets all field to the given enablement state except the objects in
117 * collection except
118 *
119 * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#setEnabled(boolean)
120 * @param enabled
121 * a boolean.
122 * @param except
123 * a {@link java.util.Collection} object.
124 */
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);
131 } else {
132 enableableElement.setEnabled(enabled);
133 }
134 }
135 }
136 }
137
138 /**
139 * <p>
140 * Setter for the field <code>irrelevant</code>.
141 * </p>
142 *
143 * @param irrelevant
144 * a boolean.
145 * @param except
146 * a {@link java.util.Collection} object.
147 */
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)) {
155 // do nothing
156 // logger.warn("not setting elements irrelevance: " +
157 // relevantElement.getClass().getSimpleName() + " in :" +
158 // this.getClass().getSimpleName());
159 } else {
160 relevantElement.setIrrelevant(irrelevant);
161 }
162 }
163 }
164 }
165
166 /** {@inheritDoc} */
167 @Override
168 public void setEnabled(boolean enabled) {
169 setEnabled(enabled, null);
170 }
171
172 /** {@inheritDoc} */
173 @Override
174 public void setIrrelevant(boolean irrelevant) {
175 this.irrelevant = irrelevant;
176 setIrrelevant(irrelevant, null);
177 }
178
179 /**
180 * Create all content elements
181 *
182 * @param formElement
183 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
184 * object.
185 * @param entity
186 * a T object.
187 * @param style
188 * a int.
189 */
190 protected abstract void createControls(ICdmFormElement formElement, T entity, int style);
191
192 /** {@inheritDoc} */
193 @Override
194 public void propertyChange(PropertyChangeEvent event) {
195 if (event == null) {
196 return;
197 }
198
199 handleTitleCacheRelevantChange(event);
200
201 Object eventSource = event.getSource();
202
203 if (eventSource instanceof ICdmFormElement) {
204 ICdmFormElement eventElement = (ICdmFormElement) eventSource;
205 ICdmFormElement eventElementContainer = eventElement
206 .getParentElement();
207
208 if (eventElementContainer == this) {
209 if (event instanceof CdmPropertyChangeEvent) {
210 if (((CdmPropertyChangeEvent) event).hasException()) {
211 handleException((CdmPropertyChangeEvent) event);
212 return;
213 }
214 }
215 // call specific handler implementation
216 handleEvent(eventSource);
217 // refire the event
218 firePropertyChangeEvent(this, event);
219 // update possible parents
220 updateParentSection();
221 }
222 }
223 }
224
225 protected void handleTitleCacheRelevantChange(PropertyChangeEvent event) {
226 //FIXME uncomment
227
228 // boolean isRelevant = getEntity() instanceof TaxonNameBase
229 // || getEntity() instanceof TaxonBase;
230 // isRelevant &= this instanceof AbstractIdentifiableEntityDetailElement;
231 //
232 // if (isRelevant) {
233 // ((AbstractIdentifiableEntityDetailElement) this)
234 // .updateToggleableCacheField();
235 // updateParentSection();
236 // }
237 }
238
239 private void updateParentSection() {
240 if (getParentElement() instanceof AbstractCdmDetailSection) {
241 ((AbstractCdmDetailSection) getParentElement()).updateTitle();
242 }
243 }
244
245 /**
246 * Gets called when the source of the event is a child widget of this
247 * widget.
248 *
249 * @param eventSource
250 * a {@link java.lang.Object} object.
251 */
252 public abstract void handleEvent(Object eventSource);
253
254 /**
255 * <p>
256 * handleException
257 * </p>
258 *
259 * @param event
260 * a
261 * {@link eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent}
262 * object.
263 */
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());
267 }
268
269 /**
270 * <p>
271 * isIrrelevant
272 * </p>
273 *
274 * @return a boolean.
275 */
276 public boolean isIrrelevant() {
277 return irrelevant;
278 }
279
280 /**
281 * <p>
282 * getConversationHolder
283 * </p>
284 *
285 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
286 * object.
287 */
288 @Override
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 @Override
300 public void update(CdmDataChangeMap changeEvents) {
301 }
302 }