Project

General

Profile

Download (9.66 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.Collection;
12
import java.util.EnumSet;
13
import java.util.Observable;
14
import java.util.Observer;
15

    
16
import org.eclipse.jface.util.PropertyChangeEvent;
17
import org.eclipse.swt.SWT;
18
import org.eclipse.swt.widgets.Composite;
19
import org.eclipse.swt.widgets.Display;
20

    
21
import eu.etaxonomy.cdm.common.CdmUtils;
22
import eu.etaxonomy.cdm.model.common.CdmBase;
23
import eu.etaxonomy.cdm.model.name.TaxonName;
24
import eu.etaxonomy.cdm.model.permission.CRUD;
25
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
26
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
27
import eu.etaxonomy.taxeditor.model.MessagingUtils;
28
import eu.etaxonomy.taxeditor.store.CdmStore;
29
import eu.etaxonomy.taxeditor.store.LoginManager;
30
import eu.etaxonomy.taxeditor.store.StoreUtil;
31
import eu.etaxonomy.taxeditor.ui.element.AbstractRelevanceFormElement;
32
import eu.etaxonomy.taxeditor.ui.element.CacheRelevance;
33
import eu.etaxonomy.taxeditor.ui.element.CacheRelevanceHelper;
34
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
35
import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
36
import eu.etaxonomy.taxeditor.ui.element.ICacheRelevantFormElement;
37
import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
38
import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement;
39
import eu.etaxonomy.taxeditor.ui.element.LabelElement;
40
import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
41
import eu.etaxonomy.taxeditor.ui.element.ToggleableTextElement;
42

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

    
51
	private T entity;
52

    
53
	protected boolean enabled = true;
54

    
55
	private LabelElement warnForReferencedObjects;
56

    
57
	protected EnumSet<CRUD> requiredCrud = null;
58

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

    
66
		getLayoutComposite().getParent().addDisposeListener(
67
		        e -> CdmStore.getLoginManager().deleteObserver(AbstractCdmDetailElement.this));
68
	}
69

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

    
86
	public void setEntityWithoutUpdate(T entity){
87
	    this.entity = entity;
88
        // the id is always 0 if the entity was not yet saved, so it is new in this case
89
        if(getEntity() == null || (getEntity() instanceof CdmBase && StoreUtil.getCdmEntity(getEntity()).getId() == 0)) {
90
            // new entity, not yet saved
91
            requiredCrud = EnumSet.of(CRUD.CREATE);
92
        } else {
93
            requiredCrud = EnumSet.of(CRUD.UPDATE);
94
        }
95
	}
96

    
97
	@Override
98
    public T getEntity() {
99
		return entity;
100
	}
101

    
102
	/**
103
	 * Updates all widgets to display the latest data
104
	 */
105
	protected void updateContent() {
106
		removeElements();
107
		createControls(this, entity, SWT.NONE);
108
		updateControlStates();
109
	}
110

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

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

    
140
	@Override
141
	public boolean isEnabled() {
142
	    return enabled;
143
	}
144

    
145
    @Override
146
    public void setEnabled(boolean enabled) {
147
        setEnabled(enabled, null);
148
    }
149

    
150
    @Override
151
    public CacheRelevance cacheRelevance() {
152
        return cacheRelevanceHelper.cacheRelevance();
153
    }
154

    
155
    @Override
156
    public void addDependsOnCache(ToggleableTextElement toggleElement) {
157
        cacheRelevanceHelper.addDependsOnCache(toggleElement);
158
    }
159

    
160
    protected void registerCacheRelevance(ICacheRelevantFormElement element, ToggleableTextElement... toggleableCaches) {
161
        if (element != null && toggleableCaches != null) {
162
             for (ToggleableTextElement toggleableCache : toggleableCaches){
163
                 if (toggleableCache != null){
164
                     element.addDependsOnCache(toggleableCache);
165
                 }
166
             }
167
        }
168
//        updateCacheRelevance();
169
    }
170

    
171
	/**
172
	 * Updates the cache relevance state of all internal elements of this
173
	 * AbstractCdmDetailElement.
174
	 */
175
	@Override
176
    public void updateCacheRelevance(){
177
	    CacheRelevanceHelper.updateCacheRelevanceForSubelements(getElements());
178
	}
179

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

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

    
192
		handleTitleCacheRelevantChange(event);
193

    
194
		Object eventSource = event.getSource();
195

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

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

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

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

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

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

    
245

    
246

    
247
	@Override
248
    public void update(Observable o, Object arg){
249
        if(o instanceof LoginManager){
250
            updateControlStates();
251
        }
252
    }
253

    
254
    protected void updateControlStates(){
255
        if (getEntity() != null && getEntity() instanceof CdmBase){
256
            enabled = enabled && CdmStore.currentAuthentiationHasPermission(StoreUtil.getCdmEntity(getEntity()), requiredCrud);
257
        }else{
258
            enabled = true;
259
        }
260
        setEnabled(enabled);
261
    }
262

    
263
	public LabelElement getWarnForReferencedObjects() {
264
		return warnForReferencedObjects;
265
	}
266

    
267
	public void setWarnForReferencedObjects(LabelElement warnForReferencedObjects) {
268
		this.warnForReferencedObjects = warnForReferencedObjects;
269
	}
270

    
271
	public void setWarnForReferencingObjects(ICdmFormElement formElement, int defaultReferencingObjects){
272
	    if (getEntity() instanceof CdmBase){
273
	    	CdmBase cdmBase = (CdmBase) getEntity();
274
	    	if (cdmBase.getId() != 0){
275
		        long referencingObjectsCount = CdmStore.getCommonService().getReferencingObjectsCount(cdmBase);
276

    
277
	    		if (referencingObjectsCount > defaultReferencingObjects){
278
	    			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")));
279
	    			getWarnForReferencedObjects().setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
280
	    			getWarnForReferencedObjects().setLayout(LayoutConstants.FILL(2, 3));
281
	    			getWarnForReferencedObjects().setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
282
	    			formFactory.createLabel(formElement, "");
283
	    		}
284
	    	}
285
	    }
286
	}
287

    
288
	public void setWarnForReferencingObjects(ICdmFormElement formElement){
289
	    setWarnForReferencingObjects(formElement, 1);
290
	}
291

    
292
	public void setWarnForReferencingObjectsVisible(boolean isVisible){
293
		if (getWarnForReferencedObjects() != null){
294
			getWarnForReferencedObjects().setVisible(isVisible);
295
		}
296
	}
297
}
(1-1/9)