Project

General

Profile

Download (7.79 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.campanula.compatibility.ICdmFormElement;
26
import eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement;
27
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
28
import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
29
import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement;
30

    
31
/**
32
 * <p>
33
 * Abstract AbstractCdmDetailElement class.
34
 * </p>
35
 *
36
 * @author n.hoffmann
37
 * @created Feb 26, 2010
38
 * @version 1.0
39
 */
40
public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement implements ICdmDetailElement<T> {
41

    
42
	private T entity;
43

    
44
	private boolean irrelevant;
45

    
46
	/**
47
	 * <p>
48
	 * Constructor for AbstractCdmDetailElement.
49
	 * </p>
50
	 *
51
	 * @param formFactory
52
	 *            a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
53
	 *            object.
54
	 * @param formElement
55
	 *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
56
	 *            object.
57
	 * @param <T>
58
	 *            a T object.
59
	 */
60
	public AbstractCdmDetailElement(CdmFormFactory formFactory,
61
			ICdmFormElement formElement) {
62
		super(formFactory, formElement);
63
		// register as property change listener
64
		formFactory.addPropertyChangeListener(this);
65
	}
66

    
67
	/**
68
	 * Sets the entity and updates controls
69
	 *
70
	 * @param entity
71
	 *            a T object.
72
	 */
73
	public void setEntity(T entity) {
74
		this.entity = entity;
75
		updateContent();
76
	}
77

    
78
	/*
79
	 * (non-Javadoc)
80
	 *
81
	 * @see eu.etaxonomy.taxeditor.forms.IEntityElement#getEntity()
82
	 */
83
	/**
84
	 * <p>
85
	 * Getter for the field <code>entity</code>.
86
	 * </p>
87
	 *
88
	 * @return a T object.
89
	 */
90
	@Override
91
    public T getEntity() {
92
		return entity;
93
	}
94

    
95
	/**
96
	 * Updates all widgets to display the latest data
97
	 */
98
	protected void updateContent() {
99
		removeElements();
100
		createControls(this, entity, SWT.WRAP);
101
		getLayoutComposite().layout();
102
	}
103

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

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

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

    
168
	/** {@inheritDoc} */
169
	@Override
170
    public void setEnabled(boolean enabled) {
171
		setEnabled(enabled, null);
172
	}
173

    
174
	/** {@inheritDoc} */
175
	@Override
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
		AbstractUtility.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
	@Override
290
    public ConversationHolder getConversationHolder() {
291
		if (getParentElement() instanceof IConversationEnabled) {
292
			return ((IConversationEnabled) getParentElement())
293
					.getConversationHolder();
294
		}
295
		throw new IllegalArgumentException(
296
				"Parent element should be IConversationEnabled");
297
	}
298

    
299
	/** {@inheritDoc} */
300
	@Override
301
    public void update(CdmDataChangeMap changeEvents) {
302
	}
303
}
(1-1/8)