]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.ui/src/org/simantics/ui/contribution/OpenWithMenuContribution.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.ui / src / org / simantics / ui / contribution / OpenWithMenuContribution.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.ui.contribution;\r
13 \r
14 import java.util.Arrays;\r
15 import java.util.Comparator;\r
16 \r
17 import org.eclipse.jface.action.ContributionItem;\r
18 import org.eclipse.jface.action.IContributionItem;\r
19 import org.eclipse.jface.resource.ImageDescriptor;\r
20 import org.eclipse.jface.resource.JFaceResources;\r
21 import org.eclipse.jface.resource.LocalResourceManager;\r
22 import org.eclipse.jface.resource.ResourceManager;\r
23 import org.eclipse.swt.SWT;\r
24 import org.eclipse.swt.events.SelectionEvent;\r
25 import org.eclipse.swt.events.SelectionListener;\r
26 import org.eclipse.swt.widgets.Menu;\r
27 import org.eclipse.swt.widgets.MenuItem;\r
28 import org.simantics.db.ReadGraph;\r
29 import org.simantics.db.Resource;\r
30 import org.simantics.db.exception.DatabaseException;\r
31 import org.simantics.ui.utils.ResourceAdaptionUtils;\r
32 import org.simantics.ui.workbench.action.ResourceEditorAdapterAction;\r
33 import org.simantics.ui.workbench.editor.EditorAdapter;\r
34 import org.simantics.ui.workbench.editor.EditorRegistry;\r
35 import org.simantics.utils.strings.AlphanumComparator;\r
36 \r
37 \r
38 /**\r
39  * @author Tuukka Lehtonen\r
40  */\r
41 public class OpenWithMenuContribution extends DynamicMenuContribution {\r
42 \r
43     private static final boolean DEBUG_ADAPTERS = false;\r
44 \r
45     private ResourceManager resourceManager;\r
46 \r
47     public OpenWithMenuContribution() {\r
48         resourceManager = new LocalResourceManager(JFaceResources.getResources());\r
49     }\r
50 \r
51     @Override\r
52     public void dispose() {\r
53         if (resourceManager != null) {\r
54             resourceManager.dispose();\r
55             resourceManager = null;\r
56         }\r
57         super.dispose();\r
58     }\r
59 \r
60     protected Object extractResource(ReadGraph graph, Object object) throws DatabaseException {\r
61         Resource resource = ResourceAdaptionUtils.adaptToResource(graph, object);\r
62         if(resource != null) return resource;\r
63         else return object; \r
64     }\r
65     \r
66     @Override\r
67     protected boolean preAcceptSelection(Object[] selection) {\r
68         return selection.length == 1;\r
69     }\r
70 \r
71     @Override\r
72     protected IContributionItem[] getContributionItems(ReadGraph graph, Object[] selection) throws DatabaseException {\r
73         final Object r = extractResource(graph, selection[0]);\r
74         final EditorAdapter[] editorAdapters = EditorRegistry.getInstance().getAdaptersFor(graph, r);\r
75         if (editorAdapters.length == 0)\r
76             return NONE;\r
77 \r
78         return new IContributionItem[] {\r
79                 new ContributionItem() {\r
80                     @Override\r
81                     public void fill(Menu menu, int index) {\r
82                         MenuItem openWith = new MenuItem(menu, SWT.CASCADE, index);\r
83                         openWith.setText("Open With");\r
84                         openWith.setEnabled(editorAdapters.length > 0);\r
85                         Menu subMenu = new Menu(menu);\r
86                         openWith.setMenu(subMenu);\r
87 \r
88                         if (editorAdapters.length > 0) {\r
89                             // Sort the open with actions in descending priority order.\r
90                             Adapter[] adapters = new Adapter[editorAdapters.length];\r
91                             for (int i = 0; i < editorAdapters.length; i++)\r
92                                 adapters[i] = new Adapter(editorAdapters[i], r, true);\r
93                             Arrays.sort(adapters, new Comparator<Adapter>() {\r
94                                 @Override\r
95                                 public int compare(Adapter o1, Adapter o2) {\r
96                                     int delta = o2.getPriority() - o1.getPriority();\r
97                                     if (delta != 0)\r
98                                         return delta;\r
99                                     return AlphanumComparator.CASE_INSENSITIVE_COMPARATOR.compare(o1.getText(), o2.getText());\r
100                                 }\r
101                             });\r
102 \r
103                             for (Adapter a : adapters)\r
104                                 addMenuItem(subMenu, a, r);\r
105                         }\r
106                     }\r
107                 }\r
108         };\r
109     }\r
110 \r
111     private void addMenuItem(Menu subMenu, Adapter adapter, Object r) {\r
112         MenuItem item = new MenuItem(subMenu, SWT.PUSH);\r
113         String text = adapter.getText();\r
114         if (DEBUG_ADAPTERS) {\r
115             text = text + " (" + adapter.getAdapter().getClass().getCanonicalName() + ") [" + adapter.getPriority() + "]";\r
116         }\r
117         item.setText(text);\r
118         ImageDescriptor descriptor = adapter.getImageDescriptor();\r
119         if (descriptor != null) {\r
120             item.setImage(resourceManager.createImage(descriptor));\r
121         }\r
122         item.addSelectionListener(adapter);\r
123     }\r
124 \r
125     static class Adapter extends ResourceEditorAdapterAction implements SelectionListener {\r
126         boolean remember;\r
127 \r
128         public Adapter(EditorAdapter adapter, Object r, boolean remember) {\r
129             super(adapter, r);\r
130             this.remember = remember;\r
131         }\r
132 \r
133         @Override\r
134         public void widgetDefaultSelected(SelectionEvent e) {\r
135             widgetSelected(e);\r
136         }\r
137 \r
138         @Override\r
139         public void widgetSelected(SelectionEvent e) {\r
140             run();\r
141         }\r
142 \r
143         @Override\r
144         protected void safeRun() throws Exception {\r
145             super.safeRun();\r
146 \r
147             if (remember) {\r
148                 // Make this choice the default for the next time.\r
149                 EditorRegistry.getInstance().getMappings().put(getResource(), getAdapter());\r
150             }\r
151         }\r
152     }\r
153 \r
154 }\r