Project

General

Profile

Download (10.1 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
package eu.etaxonomy.taxeditor.ui.section;
10

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

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

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

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

    
52
	private T entity;
53

    
54
	private boolean irrelevant;
55

    
56
	protected boolean enabled = true;
57

    
58
	private LabelElement warnForReferencedObjects;
59

    
60
	protected EnumSet<CRUD> requiredCrud = null;
61

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

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

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

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

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

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

    
148
    @Override
149
    public void setIrrelevant(boolean irrelevant) {
150
        this.irrelevant = irrelevant;
151
        setIrrelevant(irrelevant, null);
152
    }
153

    
154
	/**
155
	 * <p>
156
	 * Setter for the field <code>irrelevant</code>.
157
	 * </p>
158
	 *
159
	 * @param irrelevant
160
	 *            a boolean.
161
	 * @param except
162
	 *            a {@link java.util.Collection} object.
163
	 */
164
	public void setIrrelevant(boolean irrelevant, Collection<Object> except) {
165
		// logger.warn("Setting " + this.getClass().getSimpleName() +
166
		// " to irrelevant state: " + irrelevant);
167
		for (ICdmFormElement element : getElements()) {
168
			if (element instanceof IEnableableFormElement) {
169
				IEnableableFormElement relevantElement = (IEnableableFormElement) element;
170
				if (except != null && except.contains(relevantElement)) {
171
					// do nothing
172
					// logger.warn("not setting elements irrelevance: " +
173
					// relevantElement.getClass().getSimpleName() + " in :" +
174
					// this.getClass().getSimpleName());
175
				} else {
176
					relevantElement.setIrrelevant(irrelevant);
177
				}
178
			}
179
		}
180
	}
181

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

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

    
194
		handleTitleCacheRelevantChange(event);
195

    
196
		Object eventSource = event.getSource();
197

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

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

    
223
		if (isRelevant) {
224
			((AbstractIdentifiableEntityDetailElement<?>)this).updateToggleableCacheField();
225
		}
226
	}
227

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

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

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

    
247
	public boolean isIrrelevant() {
248
		return irrelevant;
249
	}
250

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

    
261
	@Override
262
    public void update(CdmDataChangeMap changeEvents) {
263
	}
264

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

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

    
287
	public LabelElement getWarnForReferencedObjects() {
288
		return warnForReferencedObjects;
289
	}
290

    
291
	public void setWarnForReferencedObjects(LabelElement warnForReferencedObjects) {
292
		this.warnForReferencedObjects = warnForReferencedObjects;
293
	}
294

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

    
301
	    		if (referencingObjectsCount > defaultReferencingObjects){
302
	    			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")));
303
	    			getWarnForReferencedObjects().setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
304
	    			getWarnForReferencedObjects().setLayout(LayoutConstants.FILL(2, 3));
305
	    			getWarnForReferencedObjects().setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
306
	    			formFactory.createLabel(formElement, "");
307
	    		}
308
	    	}
309
	    }
310
	}
311

    
312
	public void setWarnForReferencingObjects(ICdmFormElement formElement){
313
	    setWarnForReferencingObjects(formElement, 1);
314
	}
315

    
316
	public void setWarnForReferencingObjectsVisible(boolean isVisible){
317
		if (getWarnForReferencedObjects() != null){
318
			getWarnForReferencedObjects().setVisible(isVisible);
319
		}
320
	}
321
}
(1-1/9)