Project

General

Profile

Download (8.16 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
import java.util.EnumSet;
15

    
16
import org.eclipse.jface.util.PropertyChangeEvent;
17
import org.eclipse.swt.SWT;
18
import org.eclipse.swt.widgets.Composite;
19

    
20
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
21
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
22
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
23
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
24
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
25
import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
26
import eu.etaxonomy.taxeditor.model.AbstractUtility;
27
import eu.etaxonomy.taxeditor.store.CdmStore;
28
import eu.etaxonomy.taxeditor.store.StoreUtil;
29
import eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement;
30
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
31
import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
32
import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
33
import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement;
34

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

    
46
	private static final EnumSet<CRUD> UPDATE = EnumSet.of(CRUD.UPDATE);
47

    
48
	private T entity;
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, 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
	@Override
80
    public void setEntity(T entity) {
81
		this.entity = entity;
82
		updateContent();
83
	}
84

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

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

    
110
		setEnabled(getEntity() != null && CdmStore.currentAuthentiationHasPermission(StoreUtil.getCdmEntity(getEntity()), UPDATE));
111
	}
112

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

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

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

    
177
	/** {@inheritDoc} */
178
	@Override
179
    public void setEnabled(boolean enabled) {
180
		setEnabled(enabled, null);
181
	}
182

    
183
	/** {@inheritDoc} */
184
	@Override
185
    public void setIrrelevant(boolean irrelevant) {
186
		this.irrelevant = irrelevant;
187
		setIrrelevant(irrelevant, null);
188
	}
189

    
190
	/**
191
	 * Create all content elements
192
	 *
193
	 * @param formElement
194
	 *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
195
	 *            object.
196
	 * @param entity
197
	 *            a T object.
198
	 * @param style
199
	 *            a int.
200
	 */
201
	protected abstract void createControls(ICdmFormElement formElement,
202
			T entity, int style);
203

    
204
	/** {@inheritDoc} */
205
	@Override
206
	public void propertyChange(PropertyChangeEvent event) {
207
		if (event == null) {
208
			return;
209
		}
210

    
211
		handleTitleCacheRelevantChange(event);
212

    
213
		Object eventSource = event.getSource();
214

    
215
		if (eventSource instanceof ICdmFormElement) {
216
			ICdmFormElement eventElement = (ICdmFormElement) eventSource;
217
			ICdmFormElement eventElementContainer = eventElement
218
					.getParentElement();
219

    
220
			if (eventElementContainer == this) {
221
				if (event instanceof CdmPropertyChangeEvent) {
222
					if (((CdmPropertyChangeEvent) event).hasException()) {
223
						handleException((CdmPropertyChangeEvent) event);
224
						return;
225
					}
226
				}
227
				// call specific handler implementation
228
				handleEvent(eventSource);
229
				// refire the event
230
				firePropertyChangeEvent(this, event);
231
				// update possible parents
232
				updateParentSection();
233
			}
234
		}
235
	}
236

    
237
	protected void handleTitleCacheRelevantChange(PropertyChangeEvent event) {
238
		boolean isRelevant = getEntity() instanceof TaxonNameBase
239
				|| getEntity() instanceof TaxonBase;
240
		isRelevant &= this instanceof AbstractIdentifiableEntityDetailElement;
241

    
242
		if (isRelevant) {
243
			((AbstractIdentifiableEntityDetailElement) this)
244
					.updateToggleableCacheField();
245
			updateParentSection();
246
		}
247
	}
248

    
249
	private void updateParentSection() {
250
		if (getParentElement() instanceof AbstractCdmDetailSection) {
251
			((AbstractCdmDetailSection) getParentElement()).updateTitle();
252
		}
253
	}
254

    
255
	/**
256
	 * Gets called when the source of the event is a child widget of this
257
	 * widget.
258
	 *
259
	 * @param eventSource
260
	 *            a {@link java.lang.Object} object.
261
	 */
262
	public abstract void handleEvent(Object eventSource);
263

    
264
	/**
265
	 * <p>
266
	 * handleException
267
	 * </p>
268
	 *
269
	 * @param event
270
	 *            a
271
	 *            {@link eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent}
272
	 *            object.
273
	 */
274
	public void handleException(CdmPropertyChangeEvent event) {
275
		// override this in subclasses if you want to deal with the error
276
		AbstractUtility.error(event.getSource().getClass(), event.getException());
277
	}
278

    
279
	/**
280
	 * <p>
281
	 * isIrrelevant
282
	 * </p>
283
	 *
284
	 * @return a boolean.
285
	 */
286
	public boolean isIrrelevant() {
287
		return irrelevant;
288
	}
289

    
290
	/**
291
	 * <p>
292
	 * getConversationHolder
293
	 * </p>
294
	 *
295
	 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
296
	 *         object.
297
	 */
298
	@Override
299
    public ConversationHolder getConversationHolder() {
300
		if (getParentElement() instanceof IConversationEnabled) {
301
			return ((IConversationEnabled) getParentElement())
302
					.getConversationHolder();
303
		}
304
		throw new IllegalArgumentException(
305
				"Parent element should be IConversationEnabled");
306
	}
307

    
308
	/** {@inheritDoc} */
309
	@Override
310
    public void update(CdmDataChangeMap changeEvents) {
311
	}
312
}
(1-1/8)