Project

General

Profile

Download (8.58 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.ArrayList;
14
import java.util.Collection;
15
import java.util.EnumSet;
16
import java.util.Observable;
17
import java.util.Observer;
18

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

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

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

    
49
	private T entity;
50

    
51
	private boolean irrelevant;
52

    
53
	private boolean enabled;
54

    
55
	private EnumSet<CRUD> requiredCrud = null;
56

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

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

    
66
            @Override
67
            public void widgetDisposed(DisposeEvent e) {
68
                CdmStore.getLoginManager().deleteObserver(AbstractCdmDetailElement.this);
69
            }
70
        });
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
        // the id is always 0 if the entity was not yet saved, so it is new in this case
83
        if(getEntity() == null || StoreUtil.getCdmEntity(getEntity()).getId() == 0) {
84
            // new entity, not yet saved
85
            requiredCrud = EnumSet.of(CRUD.CREATE);
86
        } else {
87
            requiredCrud = EnumSet.of(CRUD.UPDATE);
88
        }
89
        updateContent();
90
	}
91

    
92
	@Override
93
    public T getEntity() {
94
		return entity;
95
	}
96

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

    
105
		updateControlStates();
106
	}
107

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

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

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

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

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

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

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

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

    
205
		handleTitleCacheRelevantChange(event);
206

    
207
		Object eventSource = event.getSource();
208

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

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

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

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

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

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

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

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

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

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

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

    
290

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