cleanup
[taxeditor.git] / eu.etaxonomy.taxeditor.workbench / src / main / java / eu / etaxonomy / taxeditor / workbench / handler / OpenAdminPreferencesHandler.java
1 /**
2 * Copyright (C) 2018 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.workbench.handler;
10
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;
17 import java.util.Map;
18
19 import javax.inject.Named;
20
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;
35
36 /**
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 *
43 * @author pplitzner/k.luther
44 * @date 14.03.2018
45 */
46 public class OpenAdminPreferencesHandler {
47
48 private static final Logger logger = LogManager.getLogger();
49
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$
56
57 @Execute
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<>();
62
63 PreferenceManager manager = new PreferenceManager('/');
64
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$
70 Object o;
71 try {
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);
78
79 page.setTitle(name);
80 //add all root nodes
81 if(category==null){
82 rootPages.add(new PageWrapper(page, category, id, name));
83 }
84 //child nodes will be handled later
85 else{
86 pagesYetToBeAdded.add(new PageWrapper(page, category, id, name));
87 }
88 }
89 } catch (CoreException e) {
90 logger.error(String.format("Failed to initialize preference page for config element: %s", configElement), e); //$NON-NLS-1$
91 }
92 }
93 }
94
95 //sort root nodes
96 Collections.sort(rootPages, new PreferenceNodeComparator());
97 //add root nodes
98 rootPages.forEach(pageWrapper->{
99 PreferenceNode node = new PreferenceNode(pageWrapper.id, pageWrapper.page);
100 manager.addToRoot(node);
101 idToNodeMap.put(pageWrapper.id, node);
102 });
103
104 //sort child nodes
105 Collections.sort(pagesYetToBeAdded, new PreferenceNodeComparator());
106 //add child nodes
107 int size = pagesYetToBeAdded.size();
108 while(!pagesYetToBeAdded.isEmpty()){
109
110 Iterator<PageWrapper> iterator = pagesYetToBeAdded.iterator();
111 while(iterator.hasNext()){
112 PageWrapper pageWrapper = iterator.next();
113 if(addPage(pageWrapper, idToNodeMap)){
114 iterator.remove();
115 }
116 }
117 if(size==pagesYetToBeAdded.size()){
118 //avoid potential endless loop
119 break;
120 }
121 size = pagesYetToBeAdded.size();
122 }
123 PreferenceDialog dialog = new PreferenceDialog(shell, manager);
124 dialog.create();
125 dialog.open();
126 }
127
128 @CanExecute
129 public boolean canExecute()
130 {
131 return true;
132 }
133
134
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);
138 if(parent!=null){
139 idToNodeMap.put(pageWrapper.id, node);
140 parent.add(node);
141 return true;
142 }
143 return false;
144 }
145
146 private class PreferenceNodeComparator implements Comparator<PageWrapper>{
147 @Override
148 public int compare(PageWrapper o1, PageWrapper o2) {
149 return o1.name.compareTo(o2.name);
150 }
151 }
152
153 private class PageWrapper{
154 IPreferencePage page;
155 String category;
156 String id;
157 String name;
158 public PageWrapper(IPreferencePage page, String category, String id, String name) {
159 super();
160 this.page = page;
161 this.category = category;
162 this.id = id;
163 this.name = name;
164 }
165 }
166 }
167
168