Project

General

Profile

Download (8.52 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

    
15
import org.eclipse.jface.action.ToolBarManager;
16
import org.eclipse.jface.viewers.ISelectionProvider;
17
import org.eclipse.swt.SWT;
18
import org.eclipse.swt.graphics.Color;
19
import org.eclipse.swt.widgets.Control;
20
import org.eclipse.ui.forms.events.ExpansionEvent;
21
import org.eclipse.ui.forms.events.IExpansionListener;
22
import org.eclipse.ui.forms.widgets.ExpandableComposite;
23
import org.eclipse.ui.forms.widgets.TableWrapData;
24
import org.eclipse.ui.forms.widgets.TableWrapLayout;
25

    
26
import eu.etaxonomy.cdm.common.CdmUtils;
27
import eu.etaxonomy.cdm.model.common.CdmBase;
28
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
29
import eu.etaxonomy.cdm.model.common.Language;
30
import eu.etaxonomy.cdm.model.description.TextData;
31
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
32
import eu.etaxonomy.cdm.model.permission.CRUD;
33
import eu.etaxonomy.cdm.model.term.DefinedTermBase;
34
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
35
import eu.etaxonomy.taxeditor.store.CdmStore;
36
import eu.etaxonomy.taxeditor.store.StoreUtil;
37
import eu.etaxonomy.taxeditor.ui.element.AbstractFormSection;
38
import eu.etaxonomy.taxeditor.ui.element.CacheRelevance;
39
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
40
import eu.etaxonomy.taxeditor.ui.element.ICacheRelevantFormElement;
41
import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
42
import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement;
43
import eu.etaxonomy.taxeditor.ui.element.ISelectableElement;
44
import eu.etaxonomy.taxeditor.ui.element.ToggleableTextElement;
45

    
46
/**
47
 * This class visualizes an CDM entity of type ENTITY.
48
 *
49
 * @param <ENTITY> A CDM entity which should be visualized by this section.
50
 *
51
 * @author n.hoffmann
52
 * @created Feb 26, 2010
53
 */
54
public abstract class AbstractCdmDetailSection<ENTITY>
55
			extends AbstractFormSection<ENTITY>
56
			implements IEnableableFormElement, IExpansionListener, ICacheRelevantFormElement {
57

    
58
	protected AbstractCdmDetailElement<ENTITY> detailElement;
59

    
60
	public AbstractCdmDetailSection(CdmFormFactory formFactory,
61
			ICdmFormElement parentElement,
62
			ISelectionProvider selectionProvider, int style) {
63
	    this(formFactory, null, parentElement, selectionProvider, style);
64
	}
65

    
66
	public AbstractCdmDetailSection(CdmFormFactory formFactory, Class<ENTITY> clazz,
67
			ICdmFormElement parentElement,
68
			ISelectionProvider selectionProvider, int style) {
69
		super(formFactory, parentElement, selectionProvider,
70
				ExpandableComposite.CLIENT_INDENT | style);
71

    
72
        setText(getHeading());
73

    
74
        addExpansionListener(this);
75

    
76
        if(clazz==null){
77
            createControls(this, style);
78
        }
79
        else{
80
            createControlsByType(this, clazz, SWT.NULL);
81
        }
82
	}
83

    
84
	@Override
85
	public void setText(String title) {
86
	    super.setText(StoreUtil.cleanTitleString(title));
87
	}
88

    
89
	public AbstractCdmDetailElement<ENTITY> getDetailElement() {
90
        return detailElement;
91
    }
92

    
93
    public void setDetailElement(AbstractCdmDetailElement<ENTITY> detailElement) {
94
        this.detailElement = detailElement;
95
    }
96

    
97
    protected void createControlsByType(AbstractCdmDetailSection<ENTITY> formElement, Class<ENTITY> entityClass, int style) {
98
	    TableWrapLayout layout = (TableWrapLayout) getLayoutComposite().getLayout();
99
	    layout.topMargin = 10;
100
	    layout.numColumns = DEFAULT_NUM_COLUMNS;
101

    
102
	    getLayoutComposite().setLayout(layout);
103
	    if(entityClass==null){
104
	        detailElement = createCdmDetailElement(formElement, style);
105
	    }
106
	    else{
107
	        detailElement = createCdmDetailElementByType(formElement, entityClass, style);
108
	    }
109
	}
110

    
111
	protected void createControls(AbstractCdmDetailSection<ENTITY> formElement, int style) {
112
	    createControlsByType(formElement, null, style);
113
	}
114

    
115
	protected abstract AbstractCdmDetailElement<ENTITY> createCdmDetailElement(AbstractCdmDetailSection<ENTITY> parentElement, int style);
116

    
117
	protected AbstractCdmDetailElement<ENTITY> createCdmDetailElementByType(AbstractCdmDetailSection<ENTITY> parentElement, Class<ENTITY> entityClass, int style){
118
	    return createCdmDetailElement(parentElement, style);
119
	}
120

    
121
	public abstract String getHeading();
122

    
123
	@Override
124
	public void dispose() {
125
		if (detailElement instanceof ISelectableElement) {
126
			ISelectableElement selectableElement = (ISelectableElement) detailElement;
127
			if (selectableElement.getSelectionArbitrator() != null) {
128
				formFactory.destroySelectionArbitrator(selectableElement
129
						.getSelectionArbitrator());
130
			}
131
		}
132
		super.dispose();
133
	}
134

    
135
	@Override
136
	public void setBackground(Color color) {
137
		if (detailElement != null) {
138
		    detailElement.setBackground(color);
139
		}
140
		super.setBackground(color);
141
	}
142

    
143
	@Override
144
	public void setEntity(ENTITY entity) {
145
	    EnumSet<CRUD> requiredCrud;
146
	    if(entity == null || (entity instanceof CdmBase &&StoreUtil.getCdmEntity(entity).getId() == 0 )) {
147
            // new entity, not yet saved
148
            requiredCrud = EnumSet.of(CRUD.CREATE);
149
        } else {
150
            requiredCrud = EnumSet.of(CRUD.UPDATE);
151
        }
152
		if (detailElement != null) {
153
			detailElement.setEntity(entity);
154
			formFactory.adapt(detailElement);
155
	        Collection<Object> except = new ArrayList<>();
156
	        for(ICdmFormElement formElement:detailElement.getElements()){
157
	            if(formElement instanceof IEnableableFormElement && !((IEnableableFormElement) formElement).isEnabled()){
158
	                except.add(formElement);
159
	            }
160
	        }
161
	        if (entity != null && entity instanceof CdmBase){
162
	            boolean hasPermission = CdmStore.currentAuthentiationHasPermission(StoreUtil.getCdmEntity(entity), requiredCrud);
163
	            detailElement.setEnabled(isEnabled() && hasPermission, except);
164
	        }else{
165
	            detailElement.setEnabled(isEnabled() && true, except);
166
	        }
167

    
168
		}
169
		super.setEntity(entity);
170
		setSectionTitle();
171
		layout();
172
	}
173
	
174
	public void setEntityWithoutUpdate(ENTITY entity) {
175

    
176
		if (detailElement != null) {
177
			detailElement.fillFields();
178

    
179
		}
180
		super.setEntity(entity);
181
		setSectionTitle();
182

    
183
	}
184

    
185
	protected void setSectionTitle() {
186
		String title = "";
187
		String label = "";
188
		if (getEntity() != null && (getEntity() instanceof IdentifiableEntity) && !(getEntity() instanceof SpecimenOrObservationBase)) {
189
			if (getEntity() instanceof DefinedTermBase<?> ){
190
				label = ((DefinedTermBase<?>)getEntity()).getPreferredRepresentation(PreferencesUtil.getGlobalLanguage()).getLabel();
191
//				if (label == null){
192
//					label = ((DefinedTermBase<?>)getEntity()).getLabel();
193
//				}
194
			} else if (getEntity() instanceof TextData){
195
				label = ((TextData)getEntity()).getLanguageText(PreferencesUtil.getGlobalLanguage()).getText();
196
				if (label == null){
197
					label = ((TextData)getEntity()).getLanguageText(Language.DEFAULT()).getText();
198
				}
199
			}
200
			if(CdmUtils.isBlank(label)){
201
			    label = ((IdentifiableEntity<?>) getEntity()).getTitleCache();
202
			}
203
			if(CdmUtils.isBlank(label)){
204
			    label = ((IdentifiableEntity<?>) getEntity()).generateTitle();
205
			}
206
			title = ": " + label;
207
		}
208
		this.setText(String.format("%s%s", getHeading(), title));
209
		setTextClient(createToolbar());
210
	}
211

    
212
	protected Control createToolbar() {
213
		ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
214
		return toolBarManager.createControl(this);
215
	}
216

    
217
	public void updateTitle() {
218
		if (!isDisposed()) {
219
			setSectionTitle();
220
			layout();
221
		}
222
	}
223

    
224
    @Override
225
    public void updateCacheRelevance() {
226
        if (detailElement != null) {
227
            detailElement.updateCacheRelevance();
228
        }
229
    }
230

    
231
    @Override
232
    public void addDependsOnCache(ToggleableTextElement toggleElement) {
233
        if (detailElement != null) {
234
            detailElement.addDependsOnCache(toggleElement);
235
        }
236
    }
237

    
238
    @Override
239
    public CacheRelevance cacheRelevance() {
240
        return detailElement.cacheRelevance();
241
    }
242

    
243
    @Override
244
    public void expansionStateChanging(ExpansionEvent e) {
245
		// logger.warn("Expansion State Changing");
246
	}
247

    
248
	@Override
249
    public void expansionStateChanged(ExpansionEvent e) {
250
		// logger.warn("Expansion State Changed");
251
	}
252

    
253
	public void setIndent(int indent){
254
	    TableWrapData tableWrapData = (TableWrapData)this.getLayoutData();
255
	    if (tableWrapData == null){
256
	        tableWrapData = new TableWrapData();
257
	    }
258
	    tableWrapData.indent = indent;
259
	    setLayoutData(tableWrapData);
260
	}
261
}
(2-2/9)