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
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.api.conversation.ConversationHolder;
22
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
23
import eu.etaxonomy.cdm.common.CdmUtils;
24
import eu.etaxonomy.cdm.model.common.CdmBase;
25
import eu.etaxonomy.cdm.model.name.TaxonName;
26
import eu.etaxonomy.cdm.model.permission.CRUD;
27
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
28
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
29
import eu.etaxonomy.taxeditor.model.MessagingUtils;
30
import eu.etaxonomy.taxeditor.store.CdmStore;
31
import eu.etaxonomy.taxeditor.store.LoginManager;
32
import eu.etaxonomy.taxeditor.store.StoreUtil;
33
import eu.etaxonomy.taxeditor.ui.element.AbstractRelevanceFormElement;
34
import eu.etaxonomy.taxeditor.ui.element.CacheRelevance;
35
import eu.etaxonomy.taxeditor.ui.element.CacheRelevanceHelper;
36
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
37
import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
38
import eu.etaxonomy.taxeditor.ui.element.ICacheRelevantFormElement;
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
import eu.etaxonomy.taxeditor.ui.element.ToggleableTextElement;
44

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

    
53
	private T entity;
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(
69
		        e -> CdmStore.getLoginManager().deleteObserver(AbstractCdmDetailElement.this));
70
	}
71

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

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

    
99
	@Override
100
    public T getEntity() {
101
		return entity;
102
	}
103

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

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

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

    
142
	@Override
143
	public boolean isEnabled() {
144
	    return enabled;
145
	}
146

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

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

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

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

    
173
	/**
174
	 * Updates the cache relevance state of all internal elements of this
175
	 * AbstractCdmDetailElement.
176
	 */
177
	@Override
178
    public void updateCacheRelevance(){
179
	    CacheRelevanceHelper.updateCacheRelevanceForSubelements(getElements());
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
	@Override
248
    public ConversationHolder getConversationHolder() {
249
		if (getParentElement() instanceof IConversationEnabled) {
250
			return ((IConversationEnabled) getParentElement())
251
					.getConversationHolder();
252
		}
253
		throw new IllegalArgumentException(
254
				"Parent element should be IConversationEnabled");
255
	}
256

    
257
	@Override
258
    public void update(CdmDataChangeMap changeEvents) {
259
	}
260

    
261
	@Override
262
    public void update(Observable o, Object arg){
263
        if(o instanceof LoginManager){
264
            updateControlStates();
265
        }
266
    }
267

    
268
    protected void updateControlStates(){
269
        if (getEntity() != null && getEntity() instanceof CdmBase){
270
            enabled = enabled && CdmStore.currentAuthentiationHasPermission(StoreUtil.getCdmEntity(getEntity()), requiredCrud);
271
        }else{
272
            enabled = true;
273
        }
274
        setEnabled(enabled);
275
    }
276

    
277
	public LabelElement getWarnForReferencedObjects() {
278
		return warnForReferencedObjects;
279
	}
280

    
281
	public void setWarnForReferencedObjects(LabelElement warnForReferencedObjects) {
282
		this.warnForReferencedObjects = warnForReferencedObjects;
283
	}
284

    
285
	public void setWarnForReferencingObjects(ICdmFormElement formElement, int defaultReferencingObjects){
286
	    if (getEntity() instanceof CdmBase){
287
	    	CdmBase cdmBase = (CdmBase) getEntity();
288
	    	if (cdmBase.getId() != 0){
289
		        long referencingObjectsCount = CdmStore.getCommonService().getReferencingObjectsCount(cdmBase);
290

    
291
	    		if (referencingObjectsCount > defaultReferencingObjects){
292
	    			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")));
293
	    			getWarnForReferencedObjects().setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
294
	    			getWarnForReferencedObjects().setLayout(LayoutConstants.FILL(2, 3));
295
	    			getWarnForReferencedObjects().setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
296
	    			formFactory.createLabel(formElement, "");
297
	    		}
298
	    	}
299
	    }
300
	}
301

    
302
	public void setWarnForReferencingObjects(ICdmFormElement formElement){
303
	    setWarnForReferencingObjects(formElement, 1);
304
	}
305

    
306
	public void setWarnForReferencingObjectsVisible(boolean isVisible){
307
		if (getWarnForReferencedObjects() != null){
308
			getWarnForReferencedObjects().setVisible(isVisible);
309
		}
310
	}
311
}
(1-1/9)