Project

General

Profile

Download (5.25 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.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
 * @author pplitzner
37
 * @date 14.02.2018
38
 *
39
 */
40
public class OpenPreferencesHandler {
41

    
42
    private Logger logger = Logger.getLogger(OpenPreferencesHandler.class);
43

    
44
    @Execute
45
    public void execute(@Named(IServiceConstants.ACTIVE_SHELL)Shell shell) {
46
        List<PageWrapper> pagesYetToBeAdded = new ArrayList<>();
47
        Map<String, PreferenceNode> idToNodeMap = new HashMap<>();
48

    
49
        PreferenceManager manager = new PreferenceManager('/');
50

    
51
        IExtensionRegistry reg = Platform.getExtensionRegistry();
52
        IConfigurationElement[] extensions = reg
53
                .getConfigurationElementsFor("eu.etaxonomy.taxeditor.store.preferencePage"); //$NON-NLS-1$
54
        for (IConfigurationElement configElement : extensions) {
55
            if(configElement.getName().equals("page")){ //$NON-NLS-1$
56
                Object o;
57
                try {
58
                    o = configElement.createExecutableExtension("class");
59
                    if(o instanceof IPreferencePage){
60
                        IPreferencePage page = (IPreferencePage) o;
61
                        String category = configElement.getAttribute("category");
62
                        String id = configElement.getAttribute("id");
63
                        String name = configElement.getAttribute("name");
64

    
65
                        page.setTitle(name);
66
                        //add all root nodes
67
                        if(category==null){
68
                            PreferenceNode node = new PreferenceNode(id, page);
69
                            manager.addToRoot(node);
70
                            idToNodeMap.put(id, node);
71
                        }
72
                        //child nodes will be handled later
73
                        else{
74
                            pagesYetToBeAdded.add(new PageWrapper(page, category, id, name));
75
                        }
76
                    }
77
                } catch (CoreException e) {
78
                    logger.error(String.format("Failed to initialize preference page for config element: %s", configElement), e);
79
                }
80
            }
81
        }
82

    
83
        Collections.sort(pagesYetToBeAdded, new PreferenceNodeComparator());
84

    
85
        int size = pagesYetToBeAdded.size();
86
        while(!pagesYetToBeAdded.isEmpty()){
87

    
88
            Iterator<PageWrapper> iterator = pagesYetToBeAdded.iterator();
89
            while(iterator.hasNext()){
90
                PageWrapper pageWrapper = iterator.next();
91
                if(addPage(pageWrapper, idToNodeMap)){
92
                    iterator.remove();
93
                }
94
            }
95
            if(size==pagesYetToBeAdded.size()){
96
                //avoid potential endless loop
97
                break;
98
            }
99
            size = pagesYetToBeAdded.size();
100
        }
101
        PreferenceDialog dialog = new PreferenceDialog(shell, manager);
102
        dialog.create();
103
        dialog.getTreeViewer().expandAll();
104
        dialog.open();
105
    }
106

    
107
    private boolean addPage(PageWrapper pageWrapper, Map<String, PreferenceNode> idToNodeMap){
108
        PreferenceNode node = new PreferenceNode(pageWrapper.getId(), pageWrapper.getPage());
109
        PreferenceNode parent = idToNodeMap.get(pageWrapper.getCategory());
110
        if(parent!=null){
111
            idToNodeMap.put(pageWrapper.getId(), node);
112
            parent.add(node);
113
            return true;
114
        }
115
        return false;
116
    }
117

    
118
    private class PreferenceNodeComparator implements Comparator<PageWrapper>{
119

    
120
        @Override
121
        public int compare(PageWrapper o1, PageWrapper o2) {
122
            return o1.getName().compareTo(o2.getName());
123
        }
124

    
125
    }
126

    
127
    private class PageWrapper{
128
        IPreferencePage page;
129
        String category;
130
        String id;
131
        String name;
132
        public PageWrapper(IPreferencePage page, String category, String id, String name) {
133
            super();
134
            this.page = page;
135
            this.category = category;
136
            this.id = id;
137
            this.name = name;
138
        }
139
        public IPreferencePage getPage() {
140
            return page;
141
        }
142
        public String getCategory() {
143
            return category;
144
        }
145
        public String getId() {
146
            return id;
147
        }
148
        public String getName() {
149
            return name;
150
        }
151
    }
152
}
(3-3/3)