Project

General

Profile

Download (9.07 KB) Statistics
| Branch: | Tag: | Revision:
1
package eu.etaxonomy.taxeditor.ui.element;
2

    
3
import java.util.ConcurrentModificationException;
4
import java.util.HashSet;
5
import java.util.List;
6
import java.util.Set;
7

    
8
import org.eclipse.core.runtime.Assert;
9
import org.eclipse.jface.util.IPropertyChangeListener;
10
import org.eclipse.jface.util.PropertyChangeEvent;
11
import org.eclipse.swt.SWT;
12
import org.eclipse.swt.graphics.Color;
13
import org.eclipse.swt.widgets.Composite;
14
import org.eclipse.swt.widgets.Control;
15
import org.eclipse.ui.forms.widgets.FormToolkit;
16
import org.eclipse.ui.forms.widgets.Section;
17
import org.eclipse.ui.forms.widgets.TableWrapLayout;
18
import org.eclipse.wb.swt.SWTResourceManager;
19

    
20
import eu.etaxonomy.taxeditor.model.AbstractUtility;
21

    
22
public class AbstractCdmFormElementComposite extends Composite implements ICdmFormElement {
23

    
24
	protected CdmFormFactory formFactory;
25

    
26
	private final Set<Control> controls = new HashSet<Control>();
27

    
28
	private final Set<ICdmFormElement> elements = new HashSet<ICdmFormElement>();
29
	private final ICdmFormElement parentElement;
30

    
31
	private Color persistentBackgroundColor;
32

    
33
	/**
34
	 * Create the composite.
35
	 * @param parent
36
	 * @param style
37
	 */
38
	public AbstractCdmFormElementComposite(Composite parent, final FormToolkit formFactory, ICdmFormElement parentFormElement, int style) {
39
		super(parent, style);
40
		setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
41

    
42
		this.parentElement = parentFormElement;
43
		if(formFactory instanceof CdmFormFactory){
44
		    this.formFactory = (CdmFormFactory) formFactory;
45
		}
46
		//TODO what to do when not instance of CdmFormFactory
47

    
48
		TableWrapLayout twl_layoutComposite = new TableWrapLayout();
49
		twl_layoutComposite.numColumns = 2;
50
		this.setLayout(twl_layoutComposite);
51

    
52
//		addDisposeListener(new DisposeListener() {
53
//			@Override
54
//            public void widgetDisposed(DisposeEvent e) {
55
//			    formFactory.dispose();
56
//			}
57
//		});
58
//		formFactory.adapt(this);
59
//		formFactory.paintBordersFor(this);
60
	}
61
	/**
62
	 * <p>Getter for the field <code>formFactory</code>.</p>
63
	 *
64
	 * @return a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
65
	 */
66
	public CdmFormFactory getFormFactory() {
67
		return formFactory;
68
	}
69

    
70

    
71
	/**
72
	 * Returns all Controls that are managed by this element
73
	 *
74
	 * @return a {@link java.util.Set} object.
75
	 */
76
	@Override
77
    public Set<Control> getControls(){
78
		return controls;
79
	}
80

    
81
	/**
82
	 * adds the control to the set of controls that are managed by this element
83
	 *
84
	 * @param child a {@link org.eclipse.swt.widgets.Control} object.
85
	 */
86
	protected void addControl(Control child){
87
		controls.add(child);
88
	}
89

    
90
	/**
91
	 * <p>removeControl</p>
92
	 *
93
	 * @param child a {@link org.eclipse.swt.widgets.Control} object.
94
	 */
95
	protected void removeControl(Control child){
96
		controls.remove(child);
97
	}
98

    
99
	/**
100
	 * <p>Getter for the field <code>elements</code>.</p>
101
	 *
102
	 * @return a {@link java.util.Set} object.
103
	 */
104
	@Override
105
    public Set<ICdmFormElement> getElements(){
106
		return elements;
107
	}
108

    
109
	/**
110
	 * <p>Getter for the field <code>parentElement</code>.</p>
111
	 *
112
	 * @return a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} object.
113
	 */
114
	@Override
115
    public ICdmFormElement getParentElement(){
116
		return parentElement;
117
	}
118

    
119
	/** {@inheritDoc} */
120
	@Override
121
    public void addElement(ICdmFormElement element){
122
		elements.add(element);
123
	}
124

    
125
	/**
126
	 * <p>removeElement</p>
127
	 *
128
	 * @param element a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} object.
129
	 */
130
	protected void removeElement(ICdmFormElement element){
131
		elements.remove(element);
132
	}
133

    
134
	/**
135
	 * <p>removeElements</p>
136
	 */
137
	@Override
138
    public void removeElements(){
139
		for(ICdmFormElement childElement : getElements()){
140
			// recursion
141
			childElement.removeElements();
142

    
143
			// unregister selection arbitrator
144
			if(childElement instanceof ISelectableElement){
145
				SelectionArbitrator selectionArbitrator = ((ISelectableElement) childElement).getSelectionArbitrator();
146
				if(selectionArbitrator != null){
147
					formFactory.destroySelectionArbitrator(selectionArbitrator);
148
				}
149
			}
150

    
151
			// unregister from property changes
152
			formFactory.removePropertyChangeListener(childElement);
153

    
154
			// dispose of the controls
155
			removeControls(childElement);
156
		}
157
		removeControls(this);
158
		elements.clear();
159
	}
160

    
161
	private void removeControls(ICdmFormElement element){
162
		if(element instanceof Section){
163
			((Section) element).dispose();
164
			element = null;
165
		}else{
166
			for(Control control : element.getControls()){
167
				// we added the layoutComposite of the parental element as the layout composite to this formElement
168
				// but we do not want to destroy it.
169
				if(control.equals(element.getLayoutComposite())){
170
					continue;
171
				}else{
172
					control.dispose();
173
					control = null;
174
				}
175
			}
176
		}
177
	}
178

    
179
	/**
180
	 * <p>Getter for the field <code>layoutComposite</code>.</p>
181
	 *
182
	 * @return a {@link org.eclipse.swt.widgets.Composite} object.
183
	 */
184
	@Override
185
    public Composite getLayoutComposite() {
186
		return this;
187
	}
188

    
189
	/**
190
	 * <p>Setter for the field <code>layoutComposite</code>.</p>
191
	 *
192
	 * @param layoutComposite a {@link org.eclipse.swt.widgets.Composite} object.
193
	 */
194
	public void setLayoutComposite(Composite layoutComposite){
195
	    //removed layoutComposite
196
//		this.layoutComposite = layoutComposite;
197
	}
198

    
199
	/* (non-Javadoc)
200
	 * @see eu.etaxonomy.taxeditor.forms.ICdmFormComposite#getPropertyChangeListeners()
201
	 */
202
	/**
203
	 * <p>Getter for the field <code>propertyChangeListeners</code>.</p>
204
	 *
205
	 * @return a {@link java.util.Set} object.
206
	 */
207
	@Override
208
    public List<IPropertyChangeListener> getPropertyChangeListeners() {
209
		return formFactory.getPropertyChangeListeners();
210
	}
211

    
212
	/* (non-Javadoc)
213
	 * @see eu.etaxonomy.taxeditor.forms.ICdmFormComposite#setPropertyChangeListeners(org.eclipse.core.runtime.ListenerList)
214
	 */
215
	/** {@inheritDoc} */
216
	@Override
217
    public void setPropertyChangeListeners(List<IPropertyChangeListener> propertyChangeListeners){
218
	    //TODO: remove method
219
		// listeners are already set in factory. no need for them here
220
	}
221

    
222
	/* (non-Javadoc)
223
	 * @see eu.etaxonomy.taxeditor.forms.IPropertyChangeEmitter#firePropertyChangeEvent()
224
	 */
225
	/* (non-Javadoc)
226
	 * @see eu.etaxonomy.taxeditor.forms.ICdmFormComposite#firePropertyChangeEvent(org.eclipse.jface.util.PropertyChangeEvent)
227
	 */
228
	/** {@inheritDoc} */
229
	@Override
230
    public void firePropertyChangeEvent(CdmPropertyChangeEvent event) {
231
		Assert.isNotNull(formFactory.getPropertyChangeListeners(), "Property change listeners are not present");
232

    
233
		try{
234
			for(Object listener : formFactory.getPropertyChangeListeners()){
235
				((IPropertyChangeListener)listener).propertyChange(event);
236
			}
237
		}catch(ConcurrentModificationException e){
238
			// There are two cases that produce a CME.
239
			// Described here: http://dev.e-taxonomy.eu/trac/ticket/2363#comment:2
240
			// and here: http://dev.e-taxonomy.eu/trac/ticket/2438
241
			// Ignoring the CME because nothing bad is happening
242
			AbstractUtility.warn(getClass(), "ConcurrentModificationException. Can be ignored.");
243
		}
244
	}
245

    
246
	/**
247
	 * Fires a {@link CdmPropertyChangeEvent} with the given object as source.
248
	 *
249
	 * @param object the object on which the property changed
250
	 */
251
	public void firePropertyChangeEvent(Object object){
252
		firePropertyChangeEvent(object, null);
253
	}
254

    
255
	/**
256
	 * Fires a {@link CdmPropertyChangeEvent} with the given object as source also containing the
257
	 * originating event
258
	 *
259
	 * @param object the object on which the property changed
260
	 * @param originatingEvent the originating event
261
	 */
262
	public void firePropertyChangeEvent(Object object, PropertyChangeEvent originatingEvent){
263
		firePropertyChangeEvent(new CdmPropertyChangeEvent(object, originatingEvent));
264
	}
265

    
266

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

    
281
	/** {@inheritDoc} */
282
	@Override
283
    public boolean containsFormElement(ICdmFormElement formElement){
284
		if(formElement == this){
285
			return true;
286
		}else{
287
			for(ICdmFormElement element : getElements()){
288
				boolean contains = element.containsFormElement(formElement);
289
				if(contains == true){
290
					return true;
291
				}
292
			}
293
			return false;
294
		}
295
	}
296

    
297
	/*
298
	 * (non-Javadoc)
299
	 * @see eu.etaxonomy.taxeditor.forms.ICdmFormElement#refresh()
300
	 */
301
	/**
302
	 * <p>refresh</p>
303
	 */
304
	@Override
305
    public void refresh() {
306
		// empty default implementation
307
	}
308

    
309

    
310
	/** {@inheritDoc} */
311
	@Override
312
	public void setBackground(Color color) {
313
		for(ICdmFormElement element : getElements()){
314
			element.setBackground(color);
315
		}
316
		super.setBackground(color);
317
	}
318

    
319
	@Override
320
	public void setPersistentBackground(Color color) {
321
		persistentBackgroundColor = color;
322
		setBackground(color);
323
	}
324

    
325
	@Override
326
	public Color getPersistentBackground() {
327
		return persistentBackgroundColor;
328
	}
329

    
330
	public Color getColor(String colorId){
331
		return AbstractUtility.getColor(colorId);
332
	}
333

    
334
}
(3-3/40)