Project

General

Profile

Download (6.2 KB) Statistics
| Branch: | Tag: | Revision:
1
// $Id$
2
/**
3
* Copyright (C) 2018 EDIT
4
* European Distributed Institute of Taxonomy
5
* http://www.e-taxonomy.eu
6
*
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.
9
*/
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;
17
import java.util.Map;
18

    
19
import javax.inject.Named;
20

    
21
import org.apache.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;
34

    
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
 * @author pplitzner/k.luther
43
 * @date 14.03.2018
44
 *
45
 */
46
public class OpenAdminPreferencesHandler {
47

    
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 = Logger.getLogger(OpenAdminPreferencesHandler.class);
55

    
56
    @Execute
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<>();
61

    
62
        PreferenceManager manager = new PreferenceManager('/');
63

    
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$
69
                Object o;
70
                try {
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);
77

    
78
                        page.setTitle(name);
79
                        //add all root nodes
80
                        if(category==null){
81
                            rootPages.add(new PageWrapper(page, category, id, name));
82
                        }
83
                        //child nodes will be handled later
84
                        else{
85
                            pagesYetToBeAdded.add(new PageWrapper(page, category, id, name));
86
                        }
87
                    }
88
                } catch (CoreException e) {
89
                    logger.error(String.format("Failed to initialize preference page for config element: %s", configElement), e); //$NON-NLS-1$
90
                }
91
            }
92
        }
93

    
94
        //sort root nodes
95
        Collections.sort(rootPages, new PreferenceNodeComparator());
96
        //add root nodes
97
        rootPages.forEach(pageWrapper->{
98
            PreferenceNode node = new PreferenceNode(pageWrapper.id, pageWrapper.page);
99
            manager.addToRoot(node);
100
            idToNodeMap.put(pageWrapper.id, node);
101
        });
102

    
103
        //sort child nodes
104
        Collections.sort(pagesYetToBeAdded, new PreferenceNodeComparator());
105
        //add child nodes
106
        int size = pagesYetToBeAdded.size();
107
        while(!pagesYetToBeAdded.isEmpty()){
108

    
109
            Iterator<PageWrapper> iterator = pagesYetToBeAdded.iterator();
110
            while(iterator.hasNext()){
111
                PageWrapper pageWrapper = iterator.next();
112
                if(addPage(pageWrapper, idToNodeMap)){
113
                    iterator.remove();
114
                }
115
            }
116
            if(size==pagesYetToBeAdded.size()){
117
                //avoid potential endless loop
118
                break;
119
            }
120
            size = pagesYetToBeAdded.size();
121
        }
122
        PreferenceDialog dialog = new PreferenceDialog(shell, manager);
123
        dialog.create();
124
        dialog.open();
125
    }
126

    
127
    @CanExecute
128
    public boolean canExecute()
129
    {
130
        return true;
131
    }
132

    
133

    
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);
137
        if(parent!=null){
138
            idToNodeMap.put(pageWrapper.id, node);
139
            parent.add(node);
140
            return true;
141
        }
142
        return false;
143
    }
144

    
145
    private class PreferenceNodeComparator implements Comparator<PageWrapper>{
146
        @Override
147
        public int compare(PageWrapper o1, PageWrapper o2) {
148
            return o1.name.compareTo(o2.name);
149
        }
150
    }
151

    
152
    private class PageWrapper{
153
        IPreferencePage page;
154
        String category;
155
        String id;
156
        String name;
157
        public PageWrapper(IPreferencePage page, String category, String id, String name) {
158
            super();
159
            this.page = page;
160
            this.category = category;
161
            this.id = id;
162
            this.name = name;
163
        }
164
    }
165
}
166

    
167

    
(3-3/4)