Project

General

Profile

Download (17.7 KB) Statistics
| Branch: | Tag: | Revision:
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(isAdminPreference);
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.OpenDistributionPerAreaStatusWizardHandler";
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
}
(15-15/61)