Merge branch 'hotfix/5.44.1'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / section / AbstractCdmDetailSection.java
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 }