Project

General

Profile

Download (6.14 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

    
12
import java.util.ArrayList;
13
import java.util.Collections;
14
import java.util.Comparator;
15
import java.util.HashMap;
16
import java.util.Iterator;
17
import java.util.List;
18
import java.util.Map;
19

    
20
import javax.inject.Named;
21

    
22
import org.apache.logging.log4j.LogManager;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.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
 * Scans all extension for extension point <code>eu.etaxonomy.taxeditor.store.preferencePage</code> and
37
 * creates the tree of preference nodes according to the <code>category</code> attribute of the
38
 * extension point.<br>
39
 * <b>Note:</b> If, for a given category, no parent node can be found then this page will not be
40
 * added to the preferences
41
 * @author pplitzner
42
 * @date 14.02.2018
43
 *
44
 */
45
public class OpenPreferencesHandler {
46

    
47
    private static final String ATT_NAME = "name"; //$NON-NLS-1$
48
    private static final String ATT_ID = "id"; //$NON-NLS-1$
49
    private static final String ATT_CATEGORY = "category"; //$NON-NLS-1$
50
    private static final String ATT_CLASS = "class"; //$NON-NLS-1$
51
    private static final String EXTENSION_ELEMENT_PAGE = "page"; //$NON-NLS-1$
52
    private static final String EXTENSION_POINT_ID = "eu.etaxonomy.taxeditor.store.preferencePage"; //$NON-NLS-1$
53
    private Logger logger = LogManager.getLogger(OpenPreferencesHandler.class);
54

    
55
    @Execute
56
    public void execute(@Named(IServiceConstants.ACTIVE_SHELL)Shell shell) {
57
        List<PageWrapper> pagesYetToBeAdded = new ArrayList<>();
58
        List<PageWrapper> rootPages = new ArrayList<>();
59
        Map<String, PreferenceNode> idToNodeMap = new HashMap<>();
60

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

    
63
        IExtensionRegistry reg = Platform.getExtensionRegistry();
64
        IConfigurationElement[] extensions = reg
65
                .getConfigurationElementsFor(EXTENSION_POINT_ID); //$NON-NLS-1$
66
        for (IConfigurationElement configElement : extensions) {
67
            if(configElement.getName().equals(EXTENSION_ELEMENT_PAGE)){ //$NON-NLS-1$
68
                Object o;
69
                try {
70
                    o = configElement.createExecutableExtension(ATT_CLASS);
71
                    if(o instanceof IPreferencePage){
72
                        IPreferencePage page = (IPreferencePage) o;
73
                        String category = configElement.getAttribute(ATT_CATEGORY);
74
                        String id = configElement.getAttribute(ATT_ID);
75
                        String name = configElement.getAttribute(ATT_NAME);
76

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

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

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

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

    
127
    private boolean addPage(PageWrapper pageWrapper, Map<String, PreferenceNode> idToNodeMap){
128
        PreferenceNode node = new PreferenceNode(pageWrapper.id, pageWrapper.page);
129
        PreferenceNode parent = idToNodeMap.get(pageWrapper.category);
130
        if(parent!=null){
131
            idToNodeMap.put(pageWrapper.id, node);
132
            parent.add(node);
133
            return true;
134
        }
135
        return false;
136
    }
137

    
138
    private class PreferenceNodeComparator implements Comparator<PageWrapper>{
139
        @Override
140
        public int compare(PageWrapper o1, PageWrapper o2) {
141
            return o1.name.compareTo(o2.name);
142
        }
143
    }
144

    
145
    private class PageWrapper{
146
        IPreferencePage page;
147
        String category;
148
        String id;
149
        String name;
150
        public PageWrapper(IPreferencePage page, String category, String id, String name) {
151
            super();
152
            this.page = page;
153
            this.category = category;
154
            this.id = id;
155
            this.name = name;
156
        }
157
    }
158
}
(4-4/4)