Project

General

Profile

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