2 * Copyright (C) 2019 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
9 package eu
.etaxonomy
.taxeditor
.preference
;
11 import java
.util
.ArrayList
;
12 import java
.util
.HashMap
;
13 import java
.util
.Iterator
;
14 import java
.util
.List
;
16 import java
.util
.UUID
;
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
;
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
;
57 public class DistributionStatusPreferencePage
extends AbstractVocabularySelectionPreference
{
59 protected String commandHandlerStringStatus
;
61 protected List
<CdmPreference
> prefStatus
;
62 protected List
<CdmPreference
> prefStatusToDelete
= new ArrayList
<>();
64 private Button button_openStatusWizard
;
66 private Composite composite
;
68 private Map
<UUID
, NamedArea
> namedAreaUUIDMap
= new HashMap();
69 CdmPreferenceCache cache
;
76 protected Control
createContents(Composite parent
) {
78 composite
= new Composite(parent
, SWT
.NULL
);
79 composite
.setLayout(new GridLayout());
80 GridData textGrid
= createTextGridData();
81 textGrid
.verticalSpan
= 2;
84 if (isAdminPreference
){
85 final CLabel labelPerAreaStatus
= new CLabel(composite
, SWT
.NULL
);
86 labelPerAreaStatus
.setText(Messages
.DistributionAdminPreferences_PER_AREA_STATUS
);
87 labelPerAreaStatus
.setLayoutData(textGrid
);
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
);
94 labelPerAreaStatus
.setText(Messages
.DistributionAdminPreferences_DEFAULT_AREA_STATUS
);
95 labelPerAreaStatus
.setLayoutData(textGrid
);
104 button_openStatusWizard
= new Button(composite
, SWT
.PUSH
);
106 button_openStatusWizard
.addSelectionListener(new SelectionAdapter() {
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);
112 Object result
= handlerService
.executeCommand(commandHandlerStringStatus
, null);
116 } catch (ExecutionException e
) {
117 // TODO Auto-generated catch block
119 } catch (NotDefinedException e
) {
120 // TODO Auto-generated catch block
122 } catch (NotEnabledException e
) {
123 // TODO Auto-generated catch block
125 } catch (NotHandledException e
) {
126 // TODO Auto-generated catch block
132 button_openStatusWizard
.setText(Messages
.Distribution_status_selection
);
133 if (!isAdminPreference
&& pref
!= null && !pref
.isAllowOverride()){
134 button_openStatusWizard
.setEnabled(false);
143 public void createStatusTable() {
146 composite
, SWT
.BORDER
/*| SWT.CHECK */| SWT
.FULL_SELECTION
| SWT
.SINGLE
149 table
.setLinesVisible(true);
150 table
.setHeaderVisible(true);
151 GridData tableGrid
= createTextGridData();
152 table
.setLayoutData(tableGrid
);
153 Iterator
<CdmPreference
> prefIterator
= prefStatus
.iterator();
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);
177 while (prefIterator
.hasNext()){
178 pref
= prefIterator
.next();
179 createTableRow(pref
);
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){
192 UUID uuid
= UUID
.fromString(uuidString
);
193 namedAreaString
= namedAreaUUIDMap
.get(UUID
.fromString(uuidString
)).getLabel();
194 }catch(IllegalArgumentException e
){
198 for (int col
= 0; col
< 6; col
++) {
200 item
.setText(col
, pref
.getPredicate());
202 if (namedAreaString
!= null){
203 String subjectString
= pref
.getSubjectString().replace(pref
.getSubject().getLastPart(), namedAreaString
);
204 subjectString
= subjectString
.replace("/", "");
205 item
.setText(col
, subjectString
);
207 item
.setText(col
, "Default");
212 List
<UUID
> uuidList
= null;
213 if ((isAdminPreference
|| !override
)&& pref
.getValue() == null){
214 item
.setText(col
, "All status");
217 if (!isAdminPreference
&& override
&& ((pref
!= null && pref
.isAllowOverride()) || pref
== null)){
218 uuidList
= PreferencesUtil
.createUUIDListFromStringPref(PreferencePredicate
.AvailableDistributionStatus
.getKey(), true);
220 if (pref
!= null && pref
.getValue() != null){
221 uuidList
= PreferencesUtil
.createUuidList(pref
.getValue());
223 item
.setText(col
, "All status");
226 if (uuidList
!= null){
227 List
<PresenceAbsenceTerm
> terms
= CdmStore
.getTermManager().getTerms(uuidList
, PresenceAbsenceTerm
.class);
230 for (PresenceAbsenceTerm term
: terms
){
231 status
= status
.concat(term
.getLabel());
232 if (index
< terms
.size()){
233 status
= status
.concat(", ");
238 item
.setText(col
, status
);
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
){
253 allowOverrideButton
.addSelectionListener(new SelectionAdapter(){
255 public void widgetSelected(SelectionEvent e
){
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());
268 allowOverrideButton
.setEnabled(false);
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
);
276 delButton
.addSelectionListener(new SelectionAdapter(){
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
);
289 TableEditor editor
= new TableEditor(table
);
290 editor
.horizontalAlignment
= SWT
.LEFT
;
291 editor
.grabHorizontal
= true;
292 editor
.setEditor(delButton
, item
, col
);
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
);
301 listButton
.addSelectionListener(new SelectionAdapter(){
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){
312 UUID uuid
= UUID
.fromString(uuidString
);
313 NamedArea area
= namedAreaUUIDMap
.get(UUID
.fromString(uuidString
));
314 wizard
.setNamedArea(area
);
316 }catch(IllegalArgumentException ex
){
322 WizardDialog dialog
= new WizardDialog(null,
326 thisButton
.setData(CdmPreferenceCache
.instance().findBestMatching(pref
.getKey()));
332 TableEditor editor
= new TableEditor(table
);
333 editor
.horizontalAlignment
= SWT
.LEFT
;
334 editor
.grabHorizontal
= true;
335 editor
.setEditor(listButton
, item
, col
);
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
);
355 createNamedAreaUUIDMap();
357 override
= PreferencesUtil
.getOverrideForPreference(PreferencePredicate
.AvailableDistributionStatus
.getKey());
359 commandHandlerStringStatus
= "eu.etaxonomy.taxeditor.store.open.OpenDistributionStatusWizardHandler";
363 protected void refresh() {
367 disposeTableEditors();
368 cache
.getAllTaxEditorDBPreferences();
369 prefStatus
= cache
.getAllForPredicate(PreferencePredicate
.AvailableDistributionStatus
.getKey());
370 if (prefStatus
!= null){
371 for (CdmPreference pref
:prefStatus
){
373 createTableRow(pref
);
381 composite
.layout(true);
386 private void disposeTableEditors() {
387 Control
[] controls
= table
.getChildren();
389 for (int i
= 0; i
< controls
.length
; i
++) {
390 if(!controls
[i
].isDisposed()){
391 controls
[i
].setVisible(false);
392 controls
[i
].dispose();
402 private void createNamedAreaUUIDMap() {
403 List
<UUID
> uuids
= new ArrayList();
404 for (CdmPreference pref
: prefStatus
){
406 String lastPart
= getUUIDFromSubject(pref
);
407 if (lastPart
!= null){
408 UUID uuid
= UUID
.fromString(lastPart
);
412 }catch (IllegalArgumentException e
){
413 // no uuid in subject
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
);
427 public String
getUUIDFromSubject(CdmPreference pref
) {
431 String lastPart
= pref
.getSubject().getLastPart();
432 if (lastPart
.contains("NamedArea[")){
433 lastPart
= lastPart
.replace("NamedArea[", "");
434 lastPart
= lastPart
.replace("]", "");
442 protected void performDefaults() {
452 public boolean performOk(){
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
);
465 List
<CdmPreference
> toDelete
= new ArrayList
<>();
466 for (CdmPreference pref
:prefStatusToDelete
){
467 CdmPreference prefToDelete
= CdmPreference
.NewInstance(pref
.getKey(), null);
468 toDelete
.add(prefToDelete
);
470 prefStatus
.addAll(toDelete
);
471 PreferencesUtil
.setPreferencesToDB(prefStatus
);