Project

General

Profile

Download (7.93 KB) Statistics
| Branch: | Tag: | Revision:
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 enabled;
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, (ICdmFormElement) 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
	public void setEntity(T entity) {
80
		this.entity = entity;
81
		updateContent();
82
	}
83

    
84
	/*
85
	 * (non-Javadoc)
86
	 * 
87
	 * @see eu.etaxonomy.taxeditor.forms.IEntityElement#getEntity()
88
	 */
89
	/**
90
	 * <p>
91
	 * Getter for the field <code>entity</code>.
92
	 * </p>
93
	 * 
94
	 * @return a T object.
95
	 */
96
	public T getEntity() {
97
		return entity;
98
	}
99

    
100
	/**
101
	 * Updates all widgets to display the latest data
102
	 */
103
	protected void updateContent() {
104
		removeElements();
105
		createControls(this, entity, SWT.WRAP);
106
		getLayoutComposite().layout();
107
	}
108

    
109
	/*
110
	 * (non-Javadoc)
111
	 * 
112
	 * @see
113
	 * eu.etaxonomy.taxeditor.forms.ISelectableComposite#setSelected(boolean)
114
	 */
115
	/** {@inheritDoc} */
116
	public void setSelected(boolean selected) {
117
		Composite section = getLayoutComposite().getParent();
118
		section.setBackground(selected ? SELECTED : getPersistentBackground());
119
	}
120

    
121
	/**
122
	 * Sets all field to the given enablement state except the objects in
123
	 * collection except
124
	 * 
125
	 * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#setEnabled(boolean)
126
	 * @param enabled
127
	 *            a boolean.
128
	 * @param except
129
	 *            a {@link java.util.Collection} object.
130
	 */
131
	public void setEnabled(boolean enabled, Collection<Object> except) {
132
		for (ICdmFormElement element : getElements()) {
133
			if (element instanceof IEnableableFormElement) {
134
				IEnableableFormElement enableableElement = (IEnableableFormElement) element;
135
				if (except != null && except.contains(enableableElement)) {
136
					// enableableElement.setEnabled(enabled);
137
				} else {
138
					enableableElement.setEnabled(enabled);
139
				}
140
			}
141
		}
142
	}
143

    
144
	/**
145
	 * <p>
146
	 * Setter for the field <code>irrelevant</code>.
147
	 * </p>
148
	 * 
149
	 * @param irrelevant
150
	 *            a boolean.
151
	 * @param except
152
	 *            a {@link java.util.Collection} object.
153
	 */
154
	public void setIrrelevant(boolean irrelevant, Collection<Object> except) {
155
		// logger.warn("Setting " + this.getClass().getSimpleName() +
156
		// " to irrelevant state: " + irrelevant);
157
		for (ICdmFormElement element : getElements()) {
158
			if (element instanceof IEnableableFormElement) {
159
				IEnableableFormElement relevantElement = (IEnableableFormElement) element;
160
				if (except != null && except.contains(relevantElement)) {
161
					// do nothing
162
					// logger.warn("not setting elements irrelevance: " +
163
					// relevantElement.getClass().getSimpleName() + " in :" +
164
					// this.getClass().getSimpleName());
165
				} else {
166
					relevantElement.setIrrelevant(irrelevant);
167
				}
168
			}
169
		}
170
	}
171

    
172
	/** {@inheritDoc} */
173
	public void setEnabled(boolean enabled) {
174
		this.enabled = enabled;
175
		setEnabled(enabled, null);
176
	}
177

    
178
	/** {@inheritDoc} */
179
	public void setIrrelevant(boolean irrelevant) {
180
		this.irrelevant = irrelevant;
181
		setIrrelevant(irrelevant, null);
182
	}
183

    
184
	/**
185
	 * Create all content elements
186
	 * 
187
	 * @param formElement
188
	 *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
189
	 *            object.
190
	 * @param entity
191
	 *            a T object.
192
	 * @param style
193
	 *            a int.
194
	 */
195
	protected abstract void createControls(ICdmFormElement formElement,
196
			T entity, int style);
197

    
198
	/** {@inheritDoc} */
199
	@Override
200
	public void propertyChange(PropertyChangeEvent event) {
201
		if (event == null) {
202
			return;
203
		}
204

    
205
		handleTitleCacheRelevantChange(event);
206

    
207
		Object eventSource = event.getSource();
208

    
209
		if (eventSource instanceof ICdmFormElement) {
210
			ICdmFormElement eventElement = (ICdmFormElement) eventSource;
211
			ICdmFormElement eventElementContainer = eventElement
212
					.getParentElement();
213

    
214
			if (eventElementContainer == this) {
215
				if (event instanceof CdmPropertyChangeEvent) {
216
					if (((CdmPropertyChangeEvent) event).hasException()) {
217
						handleException((CdmPropertyChangeEvent) event);
218
						return;
219
					}
220
				}
221
				// call specific handler implementation
222
				handleEvent(eventSource);
223
				// refire the event
224
				firePropertyChangeEvent(this, event);
225
				// update possible parents
226
				updateParentSection();
227
			}
228
		}
229
	}
230

    
231
	protected void handleTitleCacheRelevantChange(PropertyChangeEvent event) {
232
		boolean isRelevant = getEntity() instanceof TaxonNameBase
233
				|| getEntity() instanceof TaxonBase;
234
		isRelevant &= this instanceof AbstractIdentifiableEntityDetailElement;
235

    
236
		if (isRelevant) {
237
			((AbstractIdentifiableEntityDetailElement) this)
238
					.updateToggleableCacheField();
239
			updateParentSection();
240
		}
241
	}
242

    
243
	private void updateParentSection() {
244
		if (getParentElement() instanceof AbstractCdmDetailSection) {
245
			((AbstractCdmDetailSection) getParentElement()).updateTitle();
246
		}
247
	}
248

    
249
	/**
250
	 * Gets called when the source of the event is a child widget of this
251
	 * widget.
252
	 * 
253
	 * @param eventSource
254
	 *            a {@link java.lang.Object} object.
255
	 */
256
	public abstract void handleEvent(Object eventSource);
257

    
258
	/**
259
	 * <p>
260
	 * handleException
261
	 * </p>
262
	 * 
263
	 * @param event
264
	 *            a
265
	 *            {@link eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent}
266
	 *            object.
267
	 */
268
	public void handleException(CdmPropertyChangeEvent event) {
269
		// override this in subclasses if you want to deal with the error
270
		StoreUtil.error(event.getSource().getClass(), event.getException());
271
	}
272

    
273
	/**
274
	 * <p>
275
	 * isIrrelevant
276
	 * </p>
277
	 * 
278
	 * @return a boolean.
279
	 */
280
	public boolean isIrrelevant() {
281
		return irrelevant;
282
	}
283

    
284
	/**
285
	 * <p>
286
	 * getConversationHolder
287
	 * </p>
288
	 * 
289
	 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
290
	 *         object.
291
	 */
292
	public ConversationHolder getConversationHolder() {
293
		if (getParentElement() instanceof IConversationEnabled) {
294
			return ((IConversationEnabled) getParentElement())
295
					.getConversationHolder();
296
		}
297
		throw new IllegalArgumentException(
298
				"Parent element should be IConversationEnabled");
299
	}
300

    
301
	/** {@inheritDoc} */
302
	public void update(CdmDataChangeMap changeEvents) {
303
	}
304
}
(1-1/7)