Project

General

Profile

Download (8.57 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2007 EDIT
3
 * European Distributed Institute of Taxonomy
4
 * http://www.e-taxonomy.eu
5
 *
6
 * The contents of this file are subject to the Mozilla Public License Version 1.1
7
 * See LICENSE.TXT at the top of this package for the full license terms.
8
 */
9

    
10
package eu.etaxonomy.taxeditor.ui.section;
11

    
12
import java.util.ArrayList;
13
import java.util.Collection;
14
import java.util.EnumSet;
15
import java.util.Observable;
16
import java.util.Observer;
17

    
18
import org.eclipse.jface.util.PropertyChangeEvent;
19
import org.eclipse.swt.SWT;
20
import org.eclipse.swt.events.DisposeEvent;
21
import org.eclipse.swt.events.DisposeListener;
22
import org.eclipse.swt.widgets.Composite;
23

    
24
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
25
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
26
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
27
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
28
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
29
import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
30
import eu.etaxonomy.taxeditor.model.MessagingUtils;
31
import eu.etaxonomy.taxeditor.store.CdmStore;
32
import eu.etaxonomy.taxeditor.store.LoginManager;
33
import eu.etaxonomy.taxeditor.store.StoreUtil;
34
import eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement;
35
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
36
import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
37
import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
38
import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement;
39

    
40
/**
41
 *
42
 * @author n.hoffmann
43
 * @created Feb 26, 2010
44
 * @version 1.0
45
 */
46
public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement implements ICdmDetailElement<T>, Observer {
47

    
48
	private T entity;
49

    
50
	private boolean irrelevant;
51

    
52
	private boolean enabled;
53

    
54
	private EnumSet<CRUD> requiredCrud = null;
55

    
56
	public AbstractCdmDetailElement(CdmFormFactory formFactory,
57
			ICdmFormElement formElement) {
58
		super(formFactory, formElement);
59
		// register as property change listener
60
		formFactory.addPropertyChangeListener(this);
61
		CdmStore.getLoginManager().addObserver(this);
62

    
63
		getLayoutComposite().getParent().addDisposeListener(new DisposeListener() {
64

    
65
            @Override
66
            public void widgetDisposed(DisposeEvent e) {
67
                CdmStore.getLoginManager().deleteObserver(AbstractCdmDetailElement.this);
68
            }
69
        });
70
	}
71

    
72
	/**
73
	 * Sets the entity and updates controls
74
	 *
75
	 * @param entity
76
	 *            a T object.
77
	 */
78
	@Override
79
    public void setEntity(T entity) {
80
        this.entity = entity;
81
        // the id is always 0 if the entity was not yet saved, so it is new in this case
82
        if(getEntity() == null || StoreUtil.getCdmEntity(getEntity()).getId() == 0) {
83
            // new entity, not yet saved
84
            requiredCrud = EnumSet.of(CRUD.CREATE);
85
        } else {
86
            requiredCrud = EnumSet.of(CRUD.UPDATE);
87
        }
88
        updateContent();
89
	}
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
		reflowParentScrolledForm(true);
103

    
104
		updateControlStates();
105
	}
106

    
107
    @Override
108
    public void setSelected(boolean selected) {
109
		Composite section = getLayoutComposite().getParent();
110
		section.setBackground(selected ? SELECTED : getPersistentBackground());
111
	}
112

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

    
137
	@Override
138
	public boolean isEnabled() {
139
	    return enabled;
140
	}
141

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

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

    
176
	/** {@inheritDoc} */
177
	@Override
178
    public void setIrrelevant(boolean irrelevant) {
179
		this.irrelevant = irrelevant;
180
		setIrrelevant(irrelevant, null);
181
	}
182

    
183
	/**
184
	 * Create all content elements
185
	 *
186
	 * @param formElement
187
	 *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
188
	 *            object.
189
	 * @param entity
190
	 *            a T object.
191
	 * @param style
192
	 *            a int.
193
	 */
194
	protected abstract void createControls(ICdmFormElement formElement,
195
			T entity, int style);
196

    
197
	/** {@inheritDoc} */
198
	@Override
199
	public void propertyChange(PropertyChangeEvent event) {
200
		if (event == null) {
201
			return;
202
		}
203

    
204
		handleTitleCacheRelevantChange(event);
205

    
206
		Object eventSource = event.getSource();
207

    
208
		if (eventSource instanceof ICdmFormElement) {
209
			ICdmFormElement eventElement = (ICdmFormElement) eventSource;
210
			ICdmFormElement eventElementContainer = eventElement
211
					.getParentElement();
212

    
213
			if (eventElementContainer == this) {
214
				if (event instanceof CdmPropertyChangeEvent) {
215
					if (((CdmPropertyChangeEvent) event).hasException()) {
216
						handleException((CdmPropertyChangeEvent) event);
217
						return;
218
					}
219
				}
220
				// call specific handler implementation
221
				handleEvent(eventSource);
222
				// refire the event
223
				firePropertyChangeEvent(this, event);
224
				// update possible parents
225
				updateParentSection();
226
			}
227
		}
228
	}
229

    
230
	protected void handleTitleCacheRelevantChange(PropertyChangeEvent event) {
231
		boolean isRelevant = getEntity() instanceof TaxonNameBase
232
				|| getEntity() instanceof TaxonBase;
233
		isRelevant &= this instanceof AbstractIdentifiableEntityDetailElement;
234

    
235
		if (isRelevant) {
236
			((AbstractIdentifiableEntityDetailElement) this)
237
					.updateToggleableCacheField();
238
			updateParentSection();
239
		}
240
	}
241

    
242
	private void updateParentSection() {
243
		if (getParentElement() instanceof AbstractCdmDetailSection) {
244
			((AbstractCdmDetailSection) getParentElement()).updateTitle();
245
		}
246
		reflowParentScrolledForm(true);
247
	}
248

    
249
	/**
250
	 * Gets called when the source of the event is a child widget of this
251
	 * widget.
252
	 *
253
	 * @param eventSource
254
	 *            a {@link java.lang.Object} object.
255
	 */
256
	public abstract void handleEvent(Object eventSource);
257

    
258
	public void handleException(CdmPropertyChangeEvent event) {
259
		// override this in subclasses if you want to deal with the error
260
		MessagingUtils.error(event.getSource().getClass(), event.getException());
261
	}
262

    
263
	public boolean isIrrelevant() {
264
		return irrelevant;
265
	}
266

    
267
	@Override
268
    public ConversationHolder getConversationHolder() {
269
		if (getParentElement() instanceof IConversationEnabled) {
270
			return ((IConversationEnabled) getParentElement())
271
					.getConversationHolder();
272
		}
273
		throw new IllegalArgumentException(
274
				"Parent element should be IConversationEnabled");
275
	}
276

    
277
	/** {@inheritDoc} */
278
	@Override
279
    public void update(CdmDataChangeMap changeEvents) {
280
	}
281

    
282
	@Override
283
    public void update(Observable o, Object arg){
284
        if(o instanceof LoginManager){
285
            updateControlStates();
286
        }
287
    }
288

    
289

    
290
    protected void updateControlStates(){
291
        Collection<Object> except = new ArrayList<Object>();
292
        for(ICdmFormElement formElement:getElements()){
293
            if(formElement instanceof IEnableableFormElement && !((IEnableableFormElement) formElement).isEnabled()){
294
                except.add(formElement);
295
            }
296
        }
297
        setEnabled(getEntity() != null && CdmStore.currentAuthentiationHasPermission(StoreUtil.getCdmEntity(getEntity()), requiredCrud), except);
298
    }
299
}
(1-1/8)