Project

General

Profile

Download (9.93 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.widgets.Composite;
20
import org.eclipse.swt.widgets.Display;
21

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

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

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

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

    
89
	@Override
90
    public T getEntity() {
91
		return entity;
92
	}
93

    
94
	/**
95
	 * Updates all widgets to display the latest data
96
	 */
97
	protected void updateContent() {
98
		removeElements();
99
		createControls(this, entity, SWT.NONE);
100
		updateControlStates();
101
	}
102

    
103
    @Override
104
    public void setSelected(boolean selected) {
105
		Composite section = getLayoutComposite().getParent();
106
		section.setBackground(selected ? SELECTED : getPersistentBackground());
107
	}
108

    
109
	/**
110
	 * Sets all field to the given enablement state except the objects in
111
	 * the collection except parameter.
112
	 *
113
	 * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#setEnabled(boolean)
114
	 */
115
	public void setEnabled(boolean enabled, Collection<Object> except) {
116
	    this.enabled = enabled;
117
		for (ICdmFormElement element : getElements()) {
118
			if (element instanceof IEnableableFormElement) {
119
				IEnableableFormElement enableableElement = (IEnableableFormElement) element;
120
				if (except != null && except.contains(enableableElement)) {
121
					// enableableElement.setEnabled(enabled);
122
				} else {
123
					enableableElement.setEnabled(enabled);
124
				}
125
			}
126
		}
127
	}
128

    
129
	@Override
130
	public boolean isEnabled() {
131
	    return enabled;
132
	}
133

    
134
    @Override
135
    public void setEnabled(boolean enabled) {
136
        setEnabled(enabled, null);
137
    }
138

    
139
    @Override
140
    public CacheRelevance cacheRelevance() {
141
        return cacheRelevanceHelper.cacheRelevance();
142
    }
143

    
144
    @Override
145
    public void addDependsOnCache(ToggleableTextElement toggleElement) {
146
        cacheRelevanceHelper.addDependsOnCache(toggleElement);
147
    }
148

    
149
    protected void registerCacheRelevance(ICacheRelevantFormElement element, ToggleableTextElement... toggleableCaches) {
150
        if (element != null && toggleableCaches != null) {
151
             for (ToggleableTextElement toggleableCache : toggleableCaches){
152
                 if (toggleableCache != null){
153
                     element.addDependsOnCache(toggleableCache);
154
                 }
155
             }
156
        }
157
//        updateCacheRelevance();
158
    }
159

    
160
	/**
161
	 * Updates the cache relevance state of all internal elements of this
162
	 * AbstractCdmDetailElement.
163
	 */
164
	@Override
165
    public void updateCacheRelevance(){
166
	    CacheRelevanceHelper.updateCacheRelevanceForSubelements(getElements());
167
	}
168

    
169
	/**
170
	 * Create all content elements
171
	 */
172
	protected abstract void createControls(ICdmFormElement formElement,
173
			T entity, int style);
174

    
175
	@Override
176
	public void propertyChange(PropertyChangeEvent event) {
177
		if (event == null) {
178
			return;
179
		}
180

    
181
		handleTitleCacheRelevantChange(event);
182

    
183
		Object eventSource = event.getSource();
184

    
185
		if (eventSource instanceof ICdmFormElement) {
186
			ICdmFormElement eventElement = (ICdmFormElement) eventSource;
187
			ICdmFormElement eventElementContainer = eventElement.getParentElement();
188
			if (eventElementContainer == this) {
189
				if (event instanceof CdmPropertyChangeEvent) {
190
					if (((CdmPropertyChangeEvent) event).hasException()) {
191
						handleException((CdmPropertyChangeEvent) event);
192
						return;
193
					}
194
				}
195
				// call specific handler implementation
196
				handleEvent(eventSource);
197
				// refire the event
198
				firePropertyChangeEvent(this, event);
199
				// update possible parents
200
				updateParentSection();
201
			}
202
		}
203
	}
204

    
205
	protected void handleTitleCacheRelevantChange(PropertyChangeEvent event) {
206
		boolean isRelevant = getEntity() instanceof TaxonName
207
				|| getEntity() instanceof TaxonBase;
208
		isRelevant &= this instanceof AbstractIdentifiableEntityDetailElement;
209

    
210
		if (isRelevant) {
211
			((AbstractIdentifiableEntityDetailElement<?>)this).updateToggleableCacheField();
212
		}
213
	}
214

    
215
	private void updateParentSection() {
216
		if (getParentElement() instanceof AbstractCdmDetailSection) {
217
			((AbstractCdmDetailSection<?>) getParentElement()).updateTitle();
218
		}
219
		//NOTE: This slows down the rendering of the details view
220
//		StoreUtil.reflowParentScrolledForm(getLayoutComposite(), true);
221
	}
222

    
223
	/**
224
	 * Gets called when the source of the event is a child widget of this
225
	 * widget.
226
	 */
227
	public abstract void handleEvent(Object eventSource);
228

    
229
	public void handleException(CdmPropertyChangeEvent event) {
230
		// override this in subclasses if you want to deal with the error
231
		MessagingUtils.error(event.getSource().getClass(), event.getException());
232
	}
233

    
234
	@Override
235
    public ConversationHolder getConversationHolder() {
236
		if (getParentElement() instanceof IConversationEnabled) {
237
			return ((IConversationEnabled) getParentElement())
238
					.getConversationHolder();
239
		}
240
		throw new IllegalArgumentException(
241
				"Parent element should be IConversationEnabled");
242
	}
243

    
244
	@Override
245
    public void update(CdmDataChangeMap changeEvents) {
246
	}
247

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

    
255
    protected void updateControlStates(){
256
        Collection<Object> except = new ArrayList<Object>();
257
        for(ICdmFormElement formElement:getElements()){
258
            if(formElement instanceof IEnableableFormElement && !((IEnableableFormElement) formElement).isEnabled()){
259
                except.add(formElement);
260
            }
261
        }
262
        if (getEntity() != null && getEntity() instanceof CdmBase){
263
            enabled = CdmStore.currentAuthentiationHasPermission(StoreUtil.getCdmEntity(getEntity()), requiredCrud);
264
        }else{
265
            enabled = true;
266
        }
267
        setEnabled(enabled, except);
268
    }
269

    
270
	public LabelElement getWarnForReferencedObjects() {
271
		return warnForReferencedObjects;
272
	}
273

    
274
	public void setWarnForReferencedObjects(LabelElement warnForReferencedObjects) {
275
		this.warnForReferencedObjects = warnForReferencedObjects;
276
	}
277

    
278
	public void setWarnForReferencingObjects(ICdmFormElement formElement, int defaultReferencingObjects){
279
	    if (getEntity() instanceof CdmBase){
280
	    	CdmBase cdmBase = (CdmBase) getEntity();
281
	    	if (cdmBase.getId() != 0){
282
		        long referencingObjectsCount = CdmStore.getCommonService().getReferencingObjectsCount(cdmBase);
283

    
284
	    		if (referencingObjectsCount > defaultReferencingObjects){
285
	    			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")));
286
	    			getWarnForReferencedObjects().setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
287
	    			getWarnForReferencedObjects().setLayout(LayoutConstants.FILL(2, 3));
288
	    			getWarnForReferencedObjects().setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
289
	    			formFactory.createLabel(formElement, "");
290
	    		}
291
	    	}
292
	    }
293
	}
294

    
295
	public void setWarnForReferencingObjects(ICdmFormElement formElement){
296
	    setWarnForReferencingObjects(formElement, 1);
297
	}
298

    
299
	public void setWarnForReferencingObjectsVisible(boolean isVisible){
300
		if (getWarnForReferencedObjects() != null){
301
			getWarnForReferencedObjects().setVisible(isVisible);
302
		}
303
	}
304
}
(1-1/9)