3 * Copyright (C) 2018 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.taxeditor
.workbench
.handler
;
11 import java
.util
.ArrayList
;
12 import java
.util
.Collections
;
13 import java
.util
.Comparator
;
14 import java
.util
.HashMap
;
15 import java
.util
.Iterator
;
16 import java
.util
.List
;
19 import javax
.inject
.Named
;
21 import org
.apache
.logging
.log4j
.LogManager
;import org
.apache
.logging
.log4j
.Logger
;
22 import org
.eclipse
.core
.runtime
.CoreException
;
23 import org
.eclipse
.core
.runtime
.IConfigurationElement
;
24 import org
.eclipse
.core
.runtime
.IExtensionRegistry
;
25 import org
.eclipse
.core
.runtime
.Platform
;
26 import org
.eclipse
.e4
.core
.di
.annotations
.CanExecute
;
27 import org
.eclipse
.e4
.core
.di
.annotations
.Execute
;
28 import org
.eclipse
.e4
.ui
.services
.IServiceConstants
;
29 import org
.eclipse
.jface
.preference
.IPreferencePage
;
30 import org
.eclipse
.jface
.preference
.PreferenceDialog
;
31 import org
.eclipse
.jface
.preference
.PreferenceManager
;
32 import org
.eclipse
.jface
.preference
.PreferenceNode
;
33 import org
.eclipse
.swt
.widgets
.Shell
;
37 * Scans all extension for extension point <code>eu.etaxonomy.taxeditor.store.preferencePage</code> and
38 * creates the tree of preference nodes according to the <code>category</code> attribute of the
39 * extension point.<br>
40 * <b>Note:</b> If, for a given category, no parent node can be found then this page will not be
41 * added to the preferences
42 * @author pplitzner/k.luther
46 public class OpenAdminPreferencesHandler
{
48 private static final String ATT_NAME
= "name"; //$NON-NLS-1$
49 private static final String ATT_ID
= "id"; //$NON-NLS-1$
50 private static final String ATT_CATEGORY
= "category"; //$NON-NLS-1$
51 private static final String ATT_CLASS
= "class"; //$NON-NLS-1$
52 private static final String EXTENSION_ELEMENT_PAGE
= "page"; //$NON-NLS-1$
53 private static final String EXTENSION_POINT_ID
= "eu.etaxonomy.taxeditor.store.adminPreferencePage"; //$NON-NLS-1$
54 private Logger logger
= LogManager
.getLogger(OpenAdminPreferencesHandler
.class);
57 public void execute(@Named(IServiceConstants
.ACTIVE_SHELL
)Shell shell
) {
58 List
<PageWrapper
> pagesYetToBeAdded
= new ArrayList
<>();
59 List
<PageWrapper
> rootPages
= new ArrayList
<>();
60 Map
<String
, PreferenceNode
> idToNodeMap
= new HashMap
<>();
62 PreferenceManager manager
= new PreferenceManager('/');
64 IExtensionRegistry reg
= Platform
.getExtensionRegistry();
65 IConfigurationElement
[] extensions
= reg
66 .getConfigurationElementsFor(EXTENSION_POINT_ID
); //$NON-NLS-1$
67 for (IConfigurationElement configElement
: extensions
) {
68 if(configElement
.getName().equals(EXTENSION_ELEMENT_PAGE
)){ //$NON-NLS-1$
71 o
= configElement
.createExecutableExtension(ATT_CLASS
);
72 if(o
instanceof IPreferencePage
){
73 IPreferencePage page
= (IPreferencePage
) o
;
74 String category
= configElement
.getAttribute(ATT_CATEGORY
);
75 String id
= configElement
.getAttribute(ATT_ID
);
76 String name
= configElement
.getAttribute(ATT_NAME
);
81 rootPages
.add(new PageWrapper(page
, category
, id
, name
));
83 //child nodes will be handled later
85 pagesYetToBeAdded
.add(new PageWrapper(page
, category
, id
, name
));
88 } catch (CoreException e
) {
89 logger
.error(String
.format("Failed to initialize preference page for config element: %s", configElement
), e
); //$NON-NLS-1$
95 Collections
.sort(rootPages
, new PreferenceNodeComparator());
97 rootPages
.forEach(pageWrapper
->{
98 PreferenceNode node
= new PreferenceNode(pageWrapper
.id
, pageWrapper
.page
);
99 manager
.addToRoot(node
);
100 idToNodeMap
.put(pageWrapper
.id
, node
);
104 Collections
.sort(pagesYetToBeAdded
, new PreferenceNodeComparator());
106 int size
= pagesYetToBeAdded
.size();
107 while(!pagesYetToBeAdded
.isEmpty()){
109 Iterator
<PageWrapper
> iterator
= pagesYetToBeAdded
.iterator();
110 while(iterator
.hasNext()){
111 PageWrapper pageWrapper
= iterator
.next();
112 if(addPage(pageWrapper
, idToNodeMap
)){
116 if(size
==pagesYetToBeAdded
.size()){
117 //avoid potential endless loop
120 size
= pagesYetToBeAdded
.size();
122 PreferenceDialog dialog
= new PreferenceDialog(shell
, manager
);
128 public boolean canExecute()
134 private boolean addPage(PageWrapper pageWrapper
, Map
<String
, PreferenceNode
> idToNodeMap
){
135 PreferenceNode node
= new PreferenceNode(pageWrapper
.id
, pageWrapper
.page
);
136 PreferenceNode parent
= idToNodeMap
.get(pageWrapper
.category
);
138 idToNodeMap
.put(pageWrapper
.id
, node
);
145 private class PreferenceNodeComparator
implements Comparator
<PageWrapper
>{
147 public int compare(PageWrapper o1
, PageWrapper o2
) {
148 return o1
.name
.compareTo(o2
.name
);
152 private class PageWrapper
{
153 IPreferencePage page
;
157 public PageWrapper(IPreferencePage page
, String category
, String id
, String name
) {
160 this.category
= category
;