Project

General

Profile

Download (9.19 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 *
3
 */
4
package eu.etaxonomy.taxeditor.ui.element;
5

    
6
import java.util.ConcurrentModificationException;
7
import java.util.HashSet;
8
import java.util.List;
9
import java.util.Set;
10

    
11
import org.eclipse.core.runtime.Assert;
12
import org.eclipse.jface.util.IPropertyChangeListener;
13
import org.eclipse.jface.util.PropertyChangeEvent;
14
import org.eclipse.swt.graphics.Color;
15
import org.eclipse.swt.widgets.Composite;
16
import org.eclipse.swt.widgets.Control;
17
import org.eclipse.ui.forms.widgets.Section;
18

    
19
import eu.etaxonomy.taxeditor.model.AbstractUtility;
20
import eu.etaxonomy.taxeditor.ui.section.campanula.compatibility.ICdmFormElement;
21

    
22
/**
23
 * <p>Abstract AbstractCdmFormElement class.</p>
24
 *
25
 * @author n.hoffmann
26
 * @version $Id: $
27
 */
28
public abstract class AbstractCdmFormElement implements ICdmFormElement {
29

    
30
	protected CdmFormFactory formFactory;
31

    
32
	private List<IPropertyChangeListener> propertyChangeListeners;
33

    
34
	private Composite layoutComposite;
35

    
36
	private final Set<Control> controls = new HashSet<Control>();
37

    
38
	private final Set<ICdmFormElement> elements = new HashSet<ICdmFormElement>();
39
	private ICdmFormElement parentElement;
40

    
41
	private Color persistentBackgroundColor;
42

    
43

    
44
	/**
45
	 * <p>Constructor for AbstractCdmFormElement.</p>
46
	 *
47
	 * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
48
	 * @param layoutComposite a {@link org.eclipse.swt.widgets.Composite} object.
49
	 */
50
	protected AbstractCdmFormElement(CdmFormFactory formFactory, Composite layoutComposite){
51
		this.layoutComposite = layoutComposite;
52
		this.formFactory = formFactory;
53
	}
54

    
55
	/**
56
	 * <p>Constructor for AbstractCdmFormElement.</p>
57
	 *
58
	 * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
59
	 * @param formElement a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} object.
60
	 */
61
	public AbstractCdmFormElement(CdmFormFactory formFactory, ICdmFormElement formElement) {
62
		this(formFactory, formElement.getLayoutComposite());
63
		this.parentElement = formElement;
64
//		addControl(layoutComposite);
65
	}
66

    
67
	@Override
68
    public CdmFormFactory getFormFactory() {
69
		return formFactory;
70
	}
71

    
72
	/**
73
	 * Delegates the focus to <code>this</code> elements main input control
74
	 */
75
	public void setFocus(){
76
		// Override in subclasses where needed
77
	}
78

    
79
	/**
80
	 * Returns all Controls that are managed by this element
81
	 *
82
	 * @return a {@link java.util.Set} object.
83
	 */
84
	@Override
85
    public Set<Control> getControls(){
86
		return controls;
87
	}
88

    
89
	/**
90
	 * adds the control to the set of controls that are managed by this element
91
	 *
92
	 * @param child a {@link org.eclipse.swt.widgets.Control} object.
93
	 */
94
	protected void addControl(Control child){
95
		controls.add(child);
96
	}
97

    
98
	/**
99
	 * <p>removeControl</p>
100
	 *
101
	 * @param child a {@link org.eclipse.swt.widgets.Control} object.
102
	 */
103
	protected void removeControl(Control child){
104
		controls.remove(child);
105
	}
106

    
107
	/**
108
	 * <p>Getter for the field <code>elements</code>.</p>
109
	 *
110
	 * @return a {@link java.util.Set} object.
111
	 */
112
	@Override
113
    public Set<ICdmFormElement> getElements(){
114
		return elements;
115
	}
116

    
117
	/**
118
	 * <p>Getter for the field <code>parentElement</code>.</p>
119
	 *
120
	 * @return a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} object.
121
	 */
122
	@Override
123
    public ICdmFormElement getParentElement(){
124
		return parentElement;
125
	}
126

    
127
	/** {@inheritDoc} */
128
	@Override
129
    public void addElement(ICdmFormElement element){
130
		elements.add(element);
131
	}
132

    
133
	/**
134
	 * <p>removeElement</p>
135
	 *
136
	 * @param element a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} object.
137
	 */
138
	protected void removeElement(ICdmFormElement element){
139
		elements.remove(element);
140
	}
141

    
142
	/**
143
	 * <p>removeElements</p>
144
	 */
145
	@Override
146
    public void removeElements(){
147
		for(ICdmFormElement childElement : getElements()){
148
			// recursion
149
			childElement.removeElements();
150

    
151
			// unregister selection arbitrator
152
			if(childElement instanceof ISelectableElement){
153
				SelectionArbitrator selectionArbitrator = ((ISelectableElement) childElement).getSelectionArbitrator();
154
				if(selectionArbitrator != null){
155
					formFactory.destroySelectionArbitrator(selectionArbitrator);
156
				}
157
			}
158

    
159
			// unregister from property changes
160
			formFactory.removePropertyChangeListener(childElement);
161

    
162
			// dispose of the controls
163
			removeControls(childElement);
164
		}
165
		removeControls(this);
166
		elements.clear();
167
	}
168

    
169
	private void removeControls(ICdmFormElement element){
170
		if(element instanceof Section){
171
			((Section) element).dispose();
172
			element = null;
173
		}else{
174
			for(Control control : element.getControls()){
175
				// we added the layoutComposite of the parental element as the layout composite to this formElement
176
				// but we do not want to destroy it.
177
				if(control.equals(element.getLayoutComposite())){
178
					continue;
179
				}else{
180
					control.dispose();
181
					control = null;
182
				}
183
			}
184
		}
185
	}
186

    
187
	/**
188
	 * <p>Getter for the field <code>layoutComposite</code>.</p>
189
	 *
190
	 * @return a {@link org.eclipse.swt.widgets.Composite} object.
191
	 */
192
	@Override
193
    public Composite getLayoutComposite() {
194
		return layoutComposite;
195
	}
196

    
197
	/**
198
	 * <p>Setter for the field <code>layoutComposite</code>.</p>
199
	 *
200
	 * @param layoutComposite a {@link org.eclipse.swt.widgets.Composite} object.
201
	 */
202
	public void setLayoutComposite(Composite layoutComposite){
203
		this.layoutComposite = layoutComposite;
204
	}
205

    
206
	/* (non-Javadoc)
207
	 * @see eu.etaxonomy.taxeditor.forms.ICdmFormComposite#getPropertyChangeListeners()
208
	 */
209
	/**
210
	 * <p>Getter for the field <code>propertyChangeListeners</code>.</p>
211
	 *
212
	 * @return a {@link java.util.Set} object.
213
	 */
214
	@Override
215
    public List<IPropertyChangeListener> getPropertyChangeListeners() {
216
		return propertyChangeListeners;
217
	}
218

    
219
	/* (non-Javadoc)
220
	 * @see eu.etaxonomy.taxeditor.forms.ICdmFormComposite#setPropertyChangeListeners(org.eclipse.core.runtime.ListenerList)
221
	 */
222
	/** {@inheritDoc} */
223
	@Override
224
    public void setPropertyChangeListeners(List<IPropertyChangeListener> propertyChangeListeners){
225
		this.propertyChangeListeners = propertyChangeListeners;
226
	}
227

    
228
	/* (non-Javadoc)
229
	 * @see eu.etaxonomy.taxeditor.forms.IPropertyChangeEmitter#firePropertyChangeEvent()
230
	 */
231
	/* (non-Javadoc)
232
	 * @see eu.etaxonomy.taxeditor.forms.ICdmFormComposite#firePropertyChangeEvent(org.eclipse.jface.util.PropertyChangeEvent)
233
	 */
234
	/** {@inheritDoc} */
235
	@Override
236
    public void firePropertyChangeEvent(CdmPropertyChangeEvent event) {
237
	    //TODO: replace propertyChangeListeners with formFactory.getPropertyChangeListeners() and remove member propertyChangeListeners from AbstractCdmFormElement
238
		Assert.isNotNull(propertyChangeListeners, "Property change listeners are not present");
239

    
240
		try{
241
			for(Object listener : propertyChangeListeners){
242
				((IPropertyChangeListener)listener).propertyChange(event);
243
			}
244
		}catch(ConcurrentModificationException e){
245
			// There are two cases that produce a CME.
246
			// Described here: http://dev.e-taxonomy.eu/trac/ticket/2363#comment:2
247
			// and here: http://dev.e-taxonomy.eu/trac/ticket/2438
248
			// Ignoring the CME because nothing bad is happening
249
			AbstractUtility.warn(getClass(), "ConcurrentModificationException. Can be ignored.");
250
		}
251
	}
252

    
253
	/**
254
	 * Fires a {@link CdmPropertyChangeEvent} with the given object as source.
255
	 *
256
	 * @param object the object on which the property changed
257
	 */
258
	public void firePropertyChangeEvent(Object object){
259
		firePropertyChangeEvent(object, null);
260
	}
261

    
262
	/**
263
	 * Fires a {@link CdmPropertyChangeEvent} with the given object as source also containing the
264
	 * originating event
265
	 *
266
	 * @param object the object on which the property changed
267
	 * @param originatingEvent the originating event
268
	 */
269
	public void firePropertyChangeEvent(Object object, PropertyChangeEvent originatingEvent){
270
		firePropertyChangeEvent(new CdmPropertyChangeEvent(object, originatingEvent));
271
	}
272

    
273

    
274
	/**
275
	 * {@inheritDoc}
276
	 *
277
	 * This method gets called whenever the toolkit this composite was created with gets a property change notification.
278
	 *
279
	 * It is good advice to check whether the PropertyChangeEvent is destined for the implementing composite.
280
	 * Implementations should also check for null PropertyChangeEvents and return immediately in that case.
281
	 * @see eu.etaxonomy.taxeditor.ui.element.ICdmFormElement#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
282
	 */
283
	@Override
284
    public void propertyChange(PropertyChangeEvent event) {
285
		// implement in subclasses
286
	}
287

    
288
	/** {@inheritDoc} */
289
	@Override
290
    public boolean containsFormElement(ICdmFormElement formElement){
291
		if(formElement == this){
292
			return true;
293
		}else{
294
			for(ICdmFormElement element : getElements()){
295
				boolean contains = element.containsFormElement(formElement);
296
				if(contains == true){
297
					return true;
298
				}
299
			}
300
			return false;
301
		}
302
	}
303

    
304
	/*
305
	 * (non-Javadoc)
306
	 * @see eu.etaxonomy.taxeditor.forms.ICdmFormElement#refresh()
307
	 */
308
	/**
309
	 * <p>refresh</p>
310
	 */
311
	@Override
312
    public void refresh() {
313
		// empty default implementation
314
	}
315

    
316

    
317
	/** {@inheritDoc} */
318
	@Override
319
	public void setBackground(Color color) {
320
		for(ICdmFormElement element : getElements()){
321
			element.setBackground(color);
322
		}
323
	}
324

    
325
	@Override
326
	public void setPersistentBackground(Color color) {
327
		persistentBackgroundColor = color;
328
		setBackground(color);
329
	}
330

    
331
	@Override
332
	public Color getPersistentBackground() {
333
		return persistentBackgroundColor;
334
	}
335

    
336
	public Color getColor(String colorId){
337
		return AbstractUtility.getColor(colorId);
338
	}
339
}
(2-2/35)