2 * Copyright (C) 2018 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
.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
;
22 import org
.apache
.logging
.log4j
.Logger
;
23 import org
.eclipse
.core
.runtime
.CoreException
;
24 import org
.eclipse
.core
.runtime
.IConfigurationElement
;
25 import org
.eclipse
.core
.runtime
.IExtensionRegistry
;
26 import org
.eclipse
.core
.runtime
.Platform
;
27 import org
.eclipse
.e4
.core
.di
.annotations
.CanExecute
;
28 import org
.eclipse
.e4
.core
.di
.annotations
.Execute
;
29 import org
.eclipse
.e4
.ui
.services
.IServiceConstants
;
30 import org
.eclipse
.jface
.preference
.IPreferencePage
;
31 import org
.eclipse
.jface
.preference
.PreferenceDialog
;
32 import org
.eclipse
.jface
.preference
.PreferenceManager
;
33 import org
.eclipse
.jface
.preference
.PreferenceNode
;
34 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
43 * @author pplitzner/k.luther
46 public class OpenAdminPreferencesHandler
{
48 private static final Logger logger
= LogManager
.getLogger();
50 private static final String ATT_NAME
= "name"; //$NON-NLS-1$
51 private static final String ATT_ID
= "id"; //$NON-NLS-1$
52 private static final String ATT_CATEGORY
= "category"; //$NON-NLS-1$
53 private static final String ATT_CLASS
= "class"; //$NON-NLS-1$
54 private static final String EXTENSION_ELEMENT_PAGE
= "page"; //$NON-NLS-1$
55 private static final String EXTENSION_POINT_ID
= "eu.etaxonomy.taxeditor.store.adminPreferencePage"; //$NON-NLS-1$
58 public void execute(@Named(IServiceConstants
.ACTIVE_SHELL
)Shell shell
) {
59 List
<PageWrapper
> pagesYetToBeAdded
= new ArrayList
<>();
60 List
<PageWrapper
> rootPages
= new ArrayList
<>();
61 Map
<String
, PreferenceNode
> idToNodeMap
= new HashMap
<>();
63 PreferenceManager manager
= new PreferenceManager('/');
65 IExtensionRegistry reg
= Platform
.getExtensionRegistry();
66 IConfigurationElement
[] extensions
= reg
67 .getConfigurationElementsFor(EXTENSION_POINT_ID
); //$NON-NLS-1$
68 for (IConfigurationElement configElement
: extensions
) {
69 if(configElement
.getName().equals(EXTENSION_ELEMENT_PAGE
)){ //$NON-NLS-1$
72 o
= configElement
.createExecutableExtension(ATT_CLASS
);
73 if(o
instanceof IPreferencePage
){
74 IPreferencePage page
= (IPreferencePage
) o
;
75 String category
= configElement
.getAttribute(ATT_CATEGORY
);
76 String id
= configElement
.getAttribute(ATT_ID
);
77 String name
= configElement
.getAttribute(ATT_NAME
);
82 rootPages
.add(new PageWrapper(page
, category
, id
, name
));
84 //child nodes will be handled later
86 pagesYetToBeAdded
.add(new PageWrapper(page
, category
, id
, name
));
89 } catch (CoreException e
) {
90 logger
.error(String
.format("Failed to initialize preference page for config element: %s", configElement
), e
); //$NON-NLS-1$
96 Collections
.sort(rootPages
, new PreferenceNodeComparator());
98 rootPages
.forEach(pageWrapper
->{
99 PreferenceNode node
= new PreferenceNode(pageWrapper
.id
, pageWrapper
.page
);
100 manager
.addToRoot(node
);
101 idToNodeMap
.put(pageWrapper
.id
, node
);
105 Collections
.sort(pagesYetToBeAdded
, new PreferenceNodeComparator());
107 int size
= pagesYetToBeAdded
.size();
108 while(!pagesYetToBeAdded
.isEmpty()){
110 Iterator
<PageWrapper
> iterator
= pagesYetToBeAdded
.iterator();
111 while(iterator
.hasNext()){
112 PageWrapper pageWrapper
= iterator
.next();
113 if(addPage(pageWrapper
, idToNodeMap
)){
117 if(size
==pagesYetToBeAdded
.size()){
118 //avoid potential endless loop
121 size
= pagesYetToBeAdded
.size();
123 PreferenceDialog dialog
= new PreferenceDialog(shell
, manager
);
129 public boolean canExecute()
135 private boolean addPage(PageWrapper pageWrapper
, Map
<String
, PreferenceNode
> idToNodeMap
){
136 PreferenceNode node
= new PreferenceNode(pageWrapper
.id
, pageWrapper
.page
);
137 PreferenceNode parent
= idToNodeMap
.get(pageWrapper
.category
);
139 idToNodeMap
.put(pageWrapper
.id
, node
);
146 private class PreferenceNodeComparator
implements Comparator
<PageWrapper
>{
148 public int compare(PageWrapper o1
, PageWrapper o2
) {
149 return o1
.name
.compareTo(o2
.name
);
153 private class PageWrapper
{
154 IPreferencePage page
;
158 public PageWrapper(IPreferencePage page
, String category
, String id
, String name
) {
161 this.category
= category
;