Project

General

Profile

Download (7.88 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 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
}
(1-1/7)