cleanup
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / preference / DistributionStatusPreferencePage.java
1 /**
2 * Copyright (C) 2019 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.preference;
10
11 import java.util.ArrayList;
12 import java.util.HashMap;
13 import java.util.Iterator;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.UUID;
17
18 import org.eclipse.core.commands.ExecutionException;
19 import org.eclipse.core.commands.NotEnabledException;
20 import org.eclipse.core.commands.NotHandledException;
21 import org.eclipse.core.commands.common.NotDefinedException;
22 import org.eclipse.jface.wizard.WizardDialog;
23 import org.eclipse.swt.SWT;
24 import org.eclipse.swt.custom.CLabel;
25 import org.eclipse.swt.custom.TableEditor;
26 import org.eclipse.swt.events.SelectionAdapter;
27 import org.eclipse.swt.events.SelectionEvent;
28 import org.eclipse.swt.layout.GridData;
29 import org.eclipse.swt.layout.GridLayout;
30 import org.eclipse.swt.widgets.Button;
31 import org.eclipse.swt.widgets.Composite;
32 import org.eclipse.swt.widgets.Control;
33 import org.eclipse.swt.widgets.Table;
34 import org.eclipse.swt.widgets.TableColumn;
35 import org.eclipse.swt.widgets.TableItem;
36 import org.eclipse.ui.handlers.IHandlerService;
37
38 import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
39 import eu.etaxonomy.cdm.model.location.NamedArea;
40 import eu.etaxonomy.cdm.model.metadata.CdmPreference;
41 import eu.etaxonomy.cdm.model.metadata.CdmPreference.PrefKey;
42 import eu.etaxonomy.cdm.model.metadata.PreferencePredicate;
43 import eu.etaxonomy.cdm.model.metadata.PreferenceResolver;
44 import eu.etaxonomy.cdm.model.metadata.PreferenceSubject;
45 import eu.etaxonomy.cdm.model.term.TermType;
46 import eu.etaxonomy.taxeditor.l10n.Messages;
47 import eu.etaxonomy.taxeditor.model.ImageResources;
48 import eu.etaxonomy.taxeditor.preference.wizard.AvailableDistributionPerAreaStatusWizard;
49 import eu.etaxonomy.taxeditor.store.CdmStore;
50 import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
51
52 /**
53 * @author k.luther
54 * @since 02.07.2019
55 *
56 */
57 public class DistributionStatusPreferencePage extends AbstractVocabularySelectionPreference {
58
59 protected String commandHandlerStringStatus;
60
61 protected List<CdmPreference> prefStatus;
62 protected List<CdmPreference> prefStatusToDelete = new ArrayList<>();
63
64 private Button button_openStatusWizard;
65
66 private Composite composite;
67
68 private Map<UUID, NamedArea> namedAreaUUIDMap = new HashMap();
69 CdmPreferenceCache cache;
70
71
72 /**
73 * {@inheritDoc}
74 */
75 @Override
76 protected Control createContents(Composite parent) {
77 getValues();
78 composite = new Composite(parent, SWT.NULL);
79 composite.setLayout(new GridLayout());
80 GridData textGrid = createTextGridData();
81 textGrid.verticalSpan = 2;
82
83
84 if (isAdminPreference){
85 final CLabel labelPerAreaStatus = new CLabel(composite, SWT.NULL);
86 labelPerAreaStatus.setText(Messages.DistributionAdminPreferences_PER_AREA_STATUS);
87 labelPerAreaStatus.setLayoutData(textGrid);
88
89 }else{
90 final CLabel labelPerAreaStatus = new CLabel(composite, SWT.NULL);
91 if (pref != null && !pref.isAllowOverride()){
92 labelPerAreaStatus.setText(Messages.DistributionAdminPreferences_DEFAULT_AREA_STATUS_NOT_ALLOWED);
93 }else{
94 labelPerAreaStatus.setText(Messages.DistributionAdminPreferences_DEFAULT_AREA_STATUS);
95 labelPerAreaStatus.setLayoutData(textGrid);
96 }
97
98 }
99 createStatusTable();
100
101 composite.pack ();
102
103
104 button_openStatusWizard = new Button(composite, SWT.PUSH);
105
106 button_openStatusWizard.addSelectionListener(new SelectionAdapter() {
107 @Override
108 public void widgetSelected(SelectionEvent se) {
109 // you can execute a command directly ... but to get the proper environment it's better to execute it through the IHandlerService:
110 IHandlerService handlerService = TaxeditorStorePlugin.getDefault().getWorkbench().getService(IHandlerService.class);
111 try {
112 Object result = handlerService.executeCommand(commandHandlerStringStatus, null);
113 setApply(true);
114 getValues();
115 refresh();
116 } catch (ExecutionException e) {
117 // TODO Auto-generated catch block
118 e.printStackTrace();
119 } catch (NotDefinedException e) {
120 // TODO Auto-generated catch block
121 e.printStackTrace();
122 } catch (NotEnabledException e) {
123 // TODO Auto-generated catch block
124 e.printStackTrace();
125 } catch (NotHandledException e) {
126 // TODO Auto-generated catch block
127 e.printStackTrace();
128 }
129 }
130
131 });
132 button_openStatusWizard.setText(Messages.Distribution_status_selection);
133 if (!isAdminPreference && pref != null && !pref.isAllowOverride()){
134 button_openStatusWizard.setEnabled(false);
135 }
136
137
138 return composite;
139 }
140
141
142
143 public void createStatusTable() {
144
145 table = new Table(
146 composite, SWT.BORDER /*| SWT.CHECK */| SWT.FULL_SELECTION | SWT.SINGLE
147 );
148
149 table.setLinesVisible(true);
150 table.setHeaderVisible(true);
151 GridData tableGrid = createTextGridData();
152 table.setLayoutData(tableGrid);
153 Iterator<CdmPreference> prefIterator = prefStatus.iterator();
154 CdmPreference pref;
155 TableColumn column = new TableColumn(table, SWT.NONE);
156 column.setText("Predicate");
157 column.setWidth(100);
158 column = new TableColumn(table, SWT.NONE);
159 column.setText("Subject");
160 column.setWidth(100);
161 column = new TableColumn(table, SWT.NONE);
162 column.setText("Values");
163 column.setWidth(100);
164 column = new TableColumn(table, SWT.NONE);
165 column.setText(Messages.Preference_override_allowed);
166 column.setWidth(100);
167 if (isAdminPreference){
168 column = new TableColumn(table, SWT.NONE);
169 column.setText(Messages.Delete);
170 column.setWidth(100);
171 column = new TableColumn(table, SWT.NONE);
172 column.setText("Status");
173 column.setWidth(100);
174 }
175
176
177 while (prefIterator.hasNext()){
178 pref = prefIterator.next();
179 createTableRow(pref);
180 }
181
182 composite.pack();
183 }
184
185 @Override
186 public void createTableRow(CdmPreference pref) {
187 TableItem item = new TableItem(table, SWT.NONE);
188 String uuidString = getUUIDFromSubject(pref);
189 String namedAreaString = null;
190 if (uuidString != null){
191 try{
192 UUID uuid = UUID.fromString(uuidString);
193 namedAreaString = namedAreaUUIDMap.get(UUID.fromString(uuidString)).getLabel();
194 }catch(IllegalArgumentException e){
195 // no UUID
196 }
197 }
198 for (int col = 0; col < 6; col ++) {
199 if (col == 0){
200 item.setText(col, pref.getPredicate());
201 }else if (col == 1){
202 if (namedAreaString != null){
203 String subjectString = pref.getSubjectString().replace(pref.getSubject().getLastPart(), namedAreaString);
204 subjectString = subjectString.replace("/", "");
205 item.setText(col, subjectString);
206 }else{
207 item.setText(col, "Default");
208 }
209
210
211 }else if (col == 2){
212 List<UUID> uuidList = null;
213 if ((isAdminPreference || !override)&& pref.getValue() == null){
214 item.setText(col, "All status");
215 }else{
216
217 if (!isAdminPreference && override && ((pref != null && pref.isAllowOverride()) || pref == null)){
218 uuidList = PreferencesUtil.createUUIDListFromStringPref(PreferencePredicate.AvailableDistributionStatus.getKey(), true);
219 }else{
220 if (pref != null && pref.getValue() != null){
221 uuidList = PreferencesUtil.createUuidList(pref.getValue());
222 }else{
223 item.setText(col, "All status");
224 }
225 }
226 if (uuidList != null){
227 List<PresenceAbsenceTerm> terms = CdmStore.getTermManager().getTerms(uuidList, PresenceAbsenceTerm.class);
228 String status = "";
229 int index = 1;
230 for (PresenceAbsenceTerm term: terms){
231 status = status.concat(term.getLabel());
232 if (index < terms.size()){
233 status = status.concat(", ");
234 }
235 index ++;
236
237 }
238 item.setText(col, status);
239 }
240 }
241
242
243 }else if (col == 3 ){
244 Button allowOverrideButton = new Button(table, SWT.CHECK);
245 allowOverrideButton.setData(pref);
246 TableEditor editor = new TableEditor(table);
247 editor.horizontalAlignment = SWT.LEFT;
248 editor.grabHorizontal = true;
249 editor.setEditor(allowOverrideButton, item, col);
250 allowOverrideButton.setSelection(pref.isAllowOverride());
251 if (isAdminPreference){
252
253 allowOverrideButton.addSelectionListener(new SelectionAdapter(){
254 @Override
255 public void widgetSelected(SelectionEvent e){
256 setApply(true);
257 Button thisButton= (Button) e.widget;
258 CdmPreference preference=(CdmPreference)thisButton.getData();
259 preference = PreferenceResolver.resolve(prefStatus, preference.getKey());
260 if (isAdminPreference){
261 preference.setAllowOverride(!preference.isAllowOverride());
262 }else{
263
264 }
265 }
266 });
267 }else{
268 allowOverrideButton.setEnabled(false);
269 }
270 } else if (col == 4 && isAdminPreference){
271 Button delButton = new Button(table, SWT.PUSH);
272 delButton.setImage(ImageResources
273 .getImage(ImageResources.TRASH_ICON));
274 delButton.setData(pref);
275 delButton.pack();
276 delButton.addSelectionListener(new SelectionAdapter(){
277 @Override
278 public void widgetSelected(SelectionEvent e){
279 Button thisButton= (Button) e.widget;
280 CdmPreference preference=(CdmPreference)thisButton.getData();
281 int index = prefStatus.indexOf(preference);
282 table.getItem(index).setText("Deleted");
283 //prefStatus.remove(preference);
284 prefStatusToDelete.add(preference);
285 setApply(true);
286
287 }
288 });
289 TableEditor editor = new TableEditor(table);
290 editor.horizontalAlignment = SWT.LEFT;
291 editor.grabHorizontal = true;
292 editor.setEditor(delButton, item, col);
293
294 }
295 else if (col == 5 && isAdminPreference){
296 Button listButton = new Button(table, SWT.PUSH);
297 listButton.setImage(ImageResources
298 .getImage(ImageResources.EDIT_ICON));
299 listButton.setData(pref);
300 listButton.pack();
301 listButton.addSelectionListener(new SelectionAdapter(){
302 @Override
303 public void widgetSelected(SelectionEvent e){
304 Button thisButton= (Button) e.widget;
305 AvailableDistributionPerAreaStatusWizard wizard = new AvailableDistributionPerAreaStatusWizard();
306 CdmPreference actualPref = CdmPreferenceCache.instance().findBestMatching(pref.getKey());
307 wizard.setActualPref(actualPref);
308 String uuidString = getUUIDFromSubject(actualPref);
309 String namedAreaString = null;
310 if (uuidString != null){
311 try{
312 UUID uuid = UUID.fromString(uuidString);
313 NamedArea area = namedAreaUUIDMap.get(UUID.fromString(uuidString));
314 wizard.setNamedArea(area);
315
316 }catch(IllegalArgumentException ex){
317 // no UUID
318 }
319 }
320
321
322 WizardDialog dialog = new WizardDialog(null,
323 wizard);
324
325 dialog.open();
326 thisButton.setData(CdmPreferenceCache.instance().findBestMatching(pref.getKey()));
327 refresh();
328
329
330 }
331 });
332 TableEditor editor = new TableEditor(table);
333 editor.horizontalAlignment = SWT.LEFT;
334 editor.grabHorizontal = true;
335 editor.setEditor(listButton, item, col);
336
337 }
338 }
339 }
340
341 @Override
342 public void getValues() {
343 isAdminPreference = false;
344 type = TermType.NamedArea;
345 cache = CdmPreferenceCache.instance();
346 cache.getAllTaxEditorDBPreferences();
347 PrefKey defaultPref = CdmPreference.NewKey(PreferenceSubject.NewTaxEditorInstance(), PreferencePredicate.AvailableDistributionStatus);
348 this.pref = cache.get(defaultPref);
349 prefStatus = cache.getAllForPredicate(PreferencePredicate.AvailableDistributionStatus.getKey());
350 if (prefStatus == null){
351 prefStatus = new ArrayList();
352 CdmPreference statusPref = CdmPreference.NewTaxEditorInstance(PreferencePredicate.AvailableDistributionStatus, PreferencePredicate.AvailableDistributionStatus.getDefaultValue() != null ? PreferencePredicate.AvailableDistributionStatus.getDefaultValue().toString(): null);
353 prefStatus.add(statusPref);
354 }
355 createNamedAreaUUIDMap();
356
357 override = PreferencesUtil.getOverrideForPreference(PreferencePredicate.AvailableDistributionStatus.getKey());
358
359 commandHandlerStringStatus = "eu.etaxonomy.taxeditor.store.open.OpenDistributionStatusWizardHandler";
360 // setApply(true);
361 }
362 @Override
363 protected void refresh() {
364
365 if (table != null){
366 table.removeAll();
367 disposeTableEditors();
368 cache.getAllTaxEditorDBPreferences();
369 prefStatus = cache.getAllForPredicate(PreferencePredicate.AvailableDistributionStatus.getKey());
370 if (prefStatus != null){
371 for (CdmPreference pref:prefStatus){
372 if (pref != null){
373 createTableRow(pref);
374 }
375 }
376 }
377 table.redraw();
378 table.pack();
379
380 }
381 composite.layout(true);
382 composite.redraw();
383
384 }
385
386 private void disposeTableEditors() {
387 Control [] controls = table.getChildren();
388
389 for (int i = 0; i < controls.length; i++) {
390 if(!controls[i].isDisposed()){
391 controls[i].setVisible(false);
392 controls[i].dispose();
393
394 }
395 }
396 }
397
398
399 /**
400 *
401 */
402 private void createNamedAreaUUIDMap() {
403 List<UUID> uuids = new ArrayList();
404 for (CdmPreference pref: prefStatus){
405 try{
406 String lastPart = getUUIDFromSubject(pref);
407 if (lastPart != null){
408 UUID uuid = UUID.fromString(lastPart);
409 uuids.add(uuid);
410 }
411
412 }catch (IllegalArgumentException e){
413 // no uuid in subject
414 }
415
416 }
417 if (!uuids.isEmpty()){
418 List<NamedArea> areas =CdmStore.getTermManager().getTerms(uuids, NamedArea.class);
419 for (NamedArea area: areas){
420 namedAreaUUIDMap.put(area.getUuid(), area);
421 }
422 }
423
424 }
425
426
427 public String getUUIDFromSubject(CdmPreference pref) {
428 if (pref == null){
429 return null;
430 }
431 String lastPart = pref.getSubject().getLastPart();
432 if (lastPart.contains("NamedArea[")){
433 lastPart = lastPart.replace("NamedArea[", "");
434 lastPart = lastPart.replace("]", "");
435 return lastPart;
436 }
437 return null;
438
439 }
440
441 @Override
442 protected void performDefaults() {
443
444 prefStatus = null;
445 getValues();
446 refresh();
447 setApply(true);
448
449 }
450
451 @Override
452 public boolean performOk(){
453 if (!isApply()){
454 return true;
455 }
456 CdmPreferenceCache cache = CdmPreferenceCache.instance();
457 if (prefStatus == null){
458 List<CdmPreference> prefsToDelete =cache.getAllForPredicate(PreferencePredicate.AvailableDistributionStatus.getKey());
459 if (prefsToDelete != null){
460 PreferencesUtil.removeFromDB(prefsToDelete);
461 }
462 return true;
463 }
464
465 List<CdmPreference> toDelete = new ArrayList<>();
466 for (CdmPreference pref:prefStatusToDelete){
467 CdmPreference prefToDelete = CdmPreference.NewInstance(pref.getKey(), null);
468 toDelete.add(prefToDelete);
469 }
470 prefStatus.addAll(toDelete);
471 PreferencesUtil.setPreferencesToDB(prefStatus);
472
473
474 return true;
475 }
476
477
478
479
480
481
482 }