Project

General

Profile

Download (10.2 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
import org.eclipse.swt.widgets.Display;
24

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

    
45
/**
46
 * @author n.hoffmann
47
 * @created Feb 26, 2010
48
 */
49
public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement implements ICdmDetailElement<T>, Observer{
50

    
51
	private T entity;
52

    
53
	private boolean irrelevant;
54

    
55
	protected boolean enabled = true;
56

    
57
	private LabelElement warnForReferencedObjects;
58

    
59
	protected EnumSet<CRUD> requiredCrud = null;
60

    
61
	public AbstractCdmDetailElement(CdmFormFactory formFactory,
62
			ICdmFormElement formElement) {
63
		super(formFactory, formElement);
64
		// register as property change listener
65
		formFactory.addPropertyChangeListener(this);
66
		CdmStore.getLoginManager().addObserver(this);
67

    
68
		getLayoutComposite().getParent().addDisposeListener(new DisposeListener() {
69

    
70
            @Override
71
            public void widgetDisposed(DisposeEvent e) {
72
                CdmStore.getLoginManager().deleteObserver(AbstractCdmDetailElement.this);
73
            }
74
        });
75
	}
76

    
77
	/**
78
	 * Sets the entity and updates controls
79
	 */
80
	@Override
81
    public void setEntity(T entity) {
82
        this.entity = entity;
83
        // the id is always 0 if the entity was not yet saved, so it is new in this case
84
        if(getEntity() == null || (getEntity() instanceof CdmBase && StoreUtil.getCdmEntity(getEntity()).getId() == 0)) {
85
            // new entity, not yet saved
86
            requiredCrud = EnumSet.of(CRUD.CREATE);
87
        } else {
88
            requiredCrud = EnumSet.of(CRUD.UPDATE);
89
        }
90
        updateContent();
91
	}
92

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

    
98
	/**
99
	 * Updates all widgets to display the latest data
100
	 */
101
	protected void updateContent() {
102
		removeElements();
103
		createControls(this, entity, SWT.NONE);
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
	@Override
171
    public void setEnabled(boolean enabled) {
172
		setEnabled(enabled, null);
173
	}
174

    
175
	@Override
176
    public void setIrrelevant(boolean irrelevant) {
177
		this.irrelevant = irrelevant;
178
		setIrrelevant(irrelevant, null);
179
	}
180

    
181
	/**
182
	 * Create all content elements
183
	 */
184
	protected abstract void createControls(ICdmFormElement formElement,
185
			T entity, int style);
186

    
187
	@Override
188
	public void propertyChange(PropertyChangeEvent event) {
189
		if (event == null) {
190
			return;
191
		}
192

    
193
		handleTitleCacheRelevantChange(event);
194

    
195
		Object eventSource = event.getSource();
196

    
197
		if (eventSource instanceof ICdmFormElement) {
198
			ICdmFormElement eventElement = (ICdmFormElement) eventSource;
199
			ICdmFormElement eventElementContainer = eventElement
200
					.getParentElement();
201
			ICdmFormElement parent = this.getParentElement();
202
			if (eventElementContainer == this) {
203
				if (event instanceof CdmPropertyChangeEvent) {
204
					if (((CdmPropertyChangeEvent) event).hasException()) {
205
						handleException((CdmPropertyChangeEvent) event);
206
						return;
207
					}
208
				}
209
				// call specific handler implementation
210
				handleEvent(eventSource);
211
				// refire the event
212
				firePropertyChangeEvent(this, event);
213
				// update possible parents
214
				updateParentSection();
215
			}
216
		}
217
	}
218

    
219
	protected void handleTitleCacheRelevantChange(PropertyChangeEvent event) {
220
		boolean isRelevant = getEntity() instanceof TaxonName
221
				|| getEntity() instanceof TaxonBase;
222
		isRelevant &= this instanceof AbstractIdentifiableEntityDetailElement;
223

    
224
		if (isRelevant) {
225
			((AbstractIdentifiableEntityDetailElement) this)
226
					.updateToggleableCacheField();
227
		}
228
	}
229

    
230
	private void updateParentSection() {
231
		if (getParentElement() instanceof AbstractCdmDetailSection) {
232
			((AbstractCdmDetailSection) getParentElement()).updateTitle();
233
		}
234
		//NOTE: This slows down the rendering of the details view
235
//		StoreUtil.reflowParentScrolledForm(getLayoutComposite(), true);
236
	}
237

    
238
	/**
239
	 * Gets called when the source of the event is a child widget of this
240
	 * widget.
241
	 */
242
	public abstract void handleEvent(Object eventSource);
243

    
244
	public void handleException(CdmPropertyChangeEvent event) {
245
		// override this in subclasses if you want to deal with the error
246
		MessagingUtils.error(event.getSource().getClass(), event.getException());
247
	}
248

    
249
	public boolean isIrrelevant() {
250
		return irrelevant;
251
	}
252

    
253
	@Override
254
    public ConversationHolder getConversationHolder() {
255
		if (getParentElement() instanceof IConversationEnabled) {
256
			return ((IConversationEnabled) getParentElement())
257
					.getConversationHolder();
258
		}
259
		throw new IllegalArgumentException(
260
				"Parent element should be IConversationEnabled");
261
	}
262

    
263
	@Override
264
    public void update(CdmDataChangeMap changeEvents) {
265
	}
266

    
267
	@Override
268
    public void update(Observable o, Object arg){
269
        if(o instanceof LoginManager){
270
            updateControlStates();
271
        }
272
    }
273

    
274
    protected void updateControlStates(){
275
        Collection<Object> except = new ArrayList<Object>();
276
        for(ICdmFormElement formElement:getElements()){
277
            if(formElement instanceof IEnableableFormElement && !((IEnableableFormElement) formElement).isEnabled()){
278
                except.add(formElement);
279
            }
280
        }
281
        if (getEntity() != null && getEntity() instanceof CdmBase){
282
            enabled = CdmStore.currentAuthentiationHasPermission(StoreUtil.getCdmEntity(getEntity()), requiredCrud);
283
        }else{
284
            enabled = true;
285
        }
286
        setEnabled(enabled, except);
287
    }
288

    
289
	public LabelElement getWarnForReferencedObjects() {
290
		return warnForReferencedObjects;
291
	}
292

    
293
	public void setWarnForReferencedObjects(LabelElement warnForReferencedObjects) {
294
		this.warnForReferencedObjects = warnForReferencedObjects;
295
	}
296

    
297
	public void setWarnForReferencingObjects(ICdmFormElement formElement, int defaultReferencingObjects){
298
	    if (getEntity() instanceof CdmBase){
299
	    	CdmBase cdmBase = (CdmBase) getEntity();
300
	    	if (cdmBase.getId() != 0){
301
		        long referencingObjectsCount = CdmStore.getCommonService().getReferencingObjectsCount(cdmBase);
302

    
303
	    		if (referencingObjectsCount > defaultReferencingObjects){
304
	    			setWarnForReferencedObjects(formFactory.createLabel(formElement, CdmUtils.Nz("The "+ cdmBase.getUserFriendlyTypeName()+" is referenced by " + referencingObjectsCount+ " objects, if you change it, it is changed for all these objects")));
305
	    			getWarnForReferencedObjects().setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
306
	    			getWarnForReferencedObjects().setLayout(LayoutConstants.FILL(2, 3));
307
	    			getWarnForReferencedObjects().setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
308
	    			formFactory.createLabel(formElement, "");
309

    
310
	    		}
311
	    	}
312
	    }
313
	}
314

    
315
	public void setWarnForReferencingObjects(ICdmFormElement formElement){
316
	    setWarnForReferencingObjects(formElement, 1);
317
	}
318

    
319
	public void setWarnForReferencingObjectsVisible(boolean isVisible){
320
		if (getWarnForReferencedObjects() != null){
321
			getWarnForReferencedObjects().setVisible(isVisible);
322
		}
323
	}
324

    
325
}
(1-1/9)