Project

General

Profile

Download (5.73 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
    private List<PageWrapper> pagesYetToBeAdded = new ArrayList<>();
45

    
46
    private Map<String, PreferenceNode> idToNodeMap = new HashMap<>();
47

    
48
    @Execute
49
    public void execute(@Named(IServiceConstants.ACTIVE_SHELL)Shell shell) {
50
        PreferenceManager manager = new PreferenceManager('/');
51

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

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

    
84
//        pagesYetToBeAdded.entrySet().stream().
85
//        //filter stream to only contain parent nodes
86
//        filter(entry->{
87
//            PageWrapper pageWrapper = entry.getValue();
88
//            PreferenceNode node = new PreferenceNode(pageWrapper.getId(), pageWrapper.getPage());
89
//            if(StringUtils.isEmpty(pageWrapper.getCategory())){
90
//                manager.addToRoot(node);
91
//                return true;
92
//            }
93
//            return false;
94
//        })
95
//        .map(parent->addPage(parent.getValue(), manager));
96

    
97

    
98
        Collections.sort(pagesYetToBeAdded, new PreferenceNodeComparator());
99

    
100
        int size = pagesYetToBeAdded.size();
101
        while(!pagesYetToBeAdded.isEmpty()){
102

    
103
            Iterator<PageWrapper> iterator = pagesYetToBeAdded.iterator();
104
            while(iterator.hasNext()){
105
                PageWrapper pageWrapper = iterator.next();
106
                if(addPage(pageWrapper)){
107
                    iterator.remove();
108
                }
109
            }
110
            if(size==pagesYetToBeAdded.size()){
111
                //avoid potential endless loop
112
                break;
113
            }
114
            size = pagesYetToBeAdded.size();
115
        }
116
        PreferenceDialog dialog = new PreferenceDialog(shell, manager);
117
        dialog.create();
118
        dialog.getTreeViewer().expandAll();
119
        dialog.open();
120
    }
121

    
122
    private boolean addPage(PageWrapper pageWrapper){
123
        PreferenceNode node = new PreferenceNode(pageWrapper.getId(), pageWrapper.getPage());
124
        idToNodeMap.put(pageWrapper.getId(), node);
125
        PreferenceNode parent = idToNodeMap.get(pageWrapper.getCategory());
126
        if(parent!=null){
127
            parent.add(node);
128
            return true;
129
        }
130
        return false;
131
    }
132

    
133
    private class PreferenceNodeComparator implements Comparator<PageWrapper>{
134

    
135
        @Override
136
        public int compare(PageWrapper o1, PageWrapper o2) {
137
            return o1.getName().compareTo(o2.getName());
138
        }
139

    
140
    }
141

    
142
    private class PageWrapper{
143
        IPreferencePage page;
144
        String category;
145
        String id;
146
        String name;
147
        public PageWrapper(IPreferencePage page, String category, String id, String name) {
148
            super();
149
            this.page = page;
150
            this.category = category;
151
            this.id = id;
152
            this.name = name;
153
        }
154
        public IPreferencePage getPage() {
155
            return page;
156
        }
157
        public String getCategory() {
158
            return category;
159
        }
160
        public String getId() {
161
            return id;
162
        }
163
        public String getName() {
164
            return name;
165
        }
166
    }
167
}
(3-3/3)