Revision 5098693b
Added by Patrick Plitzner over 5 years ago
eu.etaxonomy.taxeditor.workbench/src/main/java/eu/etaxonomy/taxeditor/workbench/handler/OpenPreferencesHandler.java | ||
---|---|---|
33 | 33 |
import org.eclipse.swt.widgets.Shell; |
34 | 34 |
|
35 | 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 |
|
36 | 41 |
* @author pplitzner |
37 | 42 |
* @date 14.02.2018 |
38 | 43 |
* |
39 | 44 |
*/ |
40 | 45 |
public class OpenPreferencesHandler { |
41 | 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$ |
|
42 | 53 |
private Logger logger = Logger.getLogger(OpenPreferencesHandler.class); |
43 | 54 |
|
44 | 55 |
@Execute |
45 | 56 |
public void execute(@Named(IServiceConstants.ACTIVE_SHELL)Shell shell) { |
46 | 57 |
List<PageWrapper> pagesYetToBeAdded = new ArrayList<>(); |
58 |
List<PageWrapper> rootPages = new ArrayList<>(); |
|
47 | 59 |
Map<String, PreferenceNode> idToNodeMap = new HashMap<>(); |
48 | 60 |
|
49 | 61 |
PreferenceManager manager = new PreferenceManager('/'); |
50 | 62 |
|
51 | 63 |
IExtensionRegistry reg = Platform.getExtensionRegistry(); |
52 | 64 |
IConfigurationElement[] extensions = reg |
53 |
.getConfigurationElementsFor("eu.etaxonomy.taxeditor.store.preferencePage"); //$NON-NLS-1$
|
|
65 |
.getConfigurationElementsFor(EXTENSION_POINT_ID); //$NON-NLS-1$
|
|
54 | 66 |
for (IConfigurationElement configElement : extensions) { |
55 |
if(configElement.getName().equals("page")){ //$NON-NLS-1$
|
|
67 |
if(configElement.getName().equals(EXTENSION_ELEMENT_PAGE)){ //$NON-NLS-1$
|
|
56 | 68 |
Object o; |
57 | 69 |
try { |
58 |
o = configElement.createExecutableExtension("class");
|
|
70 |
o = configElement.createExecutableExtension(ATT_CLASS);
|
|
59 | 71 |
if(o instanceof IPreferencePage){ |
60 | 72 |
IPreferencePage page = (IPreferencePage) o; |
61 |
String category = configElement.getAttribute("category");
|
|
62 |
String id = configElement.getAttribute("id");
|
|
63 |
String name = configElement.getAttribute("name");
|
|
73 |
String category = configElement.getAttribute(ATT_CATEGORY);
|
|
74 |
String id = configElement.getAttribute(ATT_ID);
|
|
75 |
String name = configElement.getAttribute(ATT_NAME);
|
|
64 | 76 |
|
65 | 77 |
page.setTitle(name); |
66 | 78 |
//add all root nodes |
67 | 79 |
if(category==null){ |
68 |
PreferenceNode node = new PreferenceNode(id, page); |
|
69 |
manager.addToRoot(node); |
|
70 |
idToNodeMap.put(id, node); |
|
80 |
rootPages.add(new PageWrapper(page, category, id, name)); |
|
71 | 81 |
} |
72 | 82 |
//child nodes will be handled later |
73 | 83 |
else{ |
... | ... | |
75 | 85 |
} |
76 | 86 |
} |
77 | 87 |
} catch (CoreException e) { |
78 |
logger.error(String.format("Failed to initialize preference page for config element: %s", configElement), e); |
|
88 |
logger.error(String.format("Failed to initialize preference page for config element: %s", configElement), e); //$NON-NLS-1$
|
|
79 | 89 |
} |
80 | 90 |
} |
81 | 91 |
} |
82 | 92 |
|
83 |
Collections.sort(pagesYetToBeAdded, new PreferenceNodeComparator()); |
|
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 |
}); |
|
84 | 101 |
|
102 |
//sort child nodes |
|
103 |
Collections.sort(pagesYetToBeAdded, new PreferenceNodeComparator()); |
|
104 |
//add child nodes |
|
85 | 105 |
int size = pagesYetToBeAdded.size(); |
86 | 106 |
while(!pagesYetToBeAdded.isEmpty()){ |
87 | 107 |
|
... | ... | |
105 | 125 |
} |
106 | 126 |
|
107 | 127 |
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());
|
|
128 |
PreferenceNode node = new PreferenceNode(pageWrapper.id, pageWrapper.page);
|
|
129 |
PreferenceNode parent = idToNodeMap.get(pageWrapper.category);
|
|
110 | 130 |
if(parent!=null){ |
111 |
idToNodeMap.put(pageWrapper.getId(), node);
|
|
131 |
idToNodeMap.put(pageWrapper.id, node);
|
|
112 | 132 |
parent.add(node); |
113 | 133 |
return true; |
114 | 134 |
} |
... | ... | |
116 | 136 |
} |
117 | 137 |
|
118 | 138 |
private class PreferenceNodeComparator implements Comparator<PageWrapper>{ |
119 |
|
|
120 | 139 |
@Override |
121 | 140 |
public int compare(PageWrapper o1, PageWrapper o2) { |
122 |
return o1.getName().compareTo(o2.getName());
|
|
141 |
return o1.name.compareTo(o2.name);
|
|
123 | 142 |
} |
124 |
|
|
125 | 143 |
} |
126 | 144 |
|
127 | 145 |
private class PageWrapper{ |
... | ... | |
136 | 154 |
this.id = id; |
137 | 155 |
this.name = name; |
138 | 156 |
} |
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 | 157 |
} |
152 | 158 |
} |
Also available in: Unified diff
ref #7268 Sort root nodes in preference dialog