]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.ui/src/org/simantics/ui/contribution/OpenWithMenuContribution.java
Modified OpenWith for further customization.
[simantics/platform.git] / bundles / org.simantics.ui / src / org / simantics / ui / contribution / OpenWithMenuContribution.java
index 4112d905134e5b9319a86e8db55a1f14a7112f6c..c8a88f27dff64315f7d67ae52a6f34daba3fbf91 100644 (file)
  *******************************************************************************/
 package org.simantics.ui.contribution;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
+import java.util.Hashtable;
+import java.util.List;
 
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
 import org.eclipse.jface.action.ContributionItem;
 import org.eclipse.jface.action.IContributionItem;
 import org.eclipse.jface.resource.ImageDescriptor;
@@ -33,21 +39,48 @@ import org.simantics.ui.workbench.action.ResourceEditorAdapterAction;
 import org.simantics.ui.workbench.editor.EditorAdapter;
 import org.simantics.ui.workbench.editor.EditorRegistry;
 import org.simantics.utils.strings.AlphanumComparator;
+import org.simantics.utils.ui.workbench.WorkbenchUtils;
 
 
 /**
  * @author Tuukka Lehtonen
  */
-public class OpenWithMenuContribution extends DynamicMenuContribution {
+public class OpenWithMenuContribution extends DynamicMenuContribution implements IExecutableExtension{
 
     private static final boolean DEBUG_ADAPTERS = false;
 
-    private ResourceManager resourceManager;
+    protected ResourceManager resourceManager;
 
+    private String editorId = null;
     public OpenWithMenuContribution() {
         resourceManager = new LocalResourceManager(JFaceResources.getResources());
     }
-
+    
+    @Override
+    public void setInitializationData(IConfigurationElement config, String propertyName, Object data)
+               throws CoreException {
+       if ("class".equals(propertyName)) {
+               if (data instanceof String) {
+                       setEditorId((String)data);
+               } else if (data instanceof Hashtable) {
+                       @SuppressWarnings("unchecked")
+                               Hashtable<String,String> params = (Hashtable<String, String>)data;
+                       setEditorId(params.get("editorId"));
+               }
+               if ("activeEditorId".equals(this.editorId)) {
+                       setEditorId(WorkbenchUtils.getActiveWorkbenchPart().getSite().getId());
+               }
+       }
+    }
+    
+    public String getEditorId() {
+               return editorId;
+       }
+    
+    public void setEditorId(String editorId) {
+               this.editorId = editorId;
+       }
+   
     @Override
     public void dispose() {
         if (resourceManager != null) {
@@ -58,48 +91,43 @@ public class OpenWithMenuContribution extends DynamicMenuContribution {
     }
 
     protected Object extractResource(ReadGraph graph, Object object) throws DatabaseException {
-       Resource resource = WorkbenchSelectionUtils.getPossibleResource(object);
-       //Resource resource = ResourceAdaptionUtils.adaptToResource(graph, object);
-       if(resource != null) return resource;
-       else return object; 
+        Resource resource = WorkbenchSelectionUtils.getPossibleResourceFromSelection(graph, object);
+        return resource != null ? resource : object;
     }
-    
+
     @Override
     protected boolean preAcceptSelection(Object[] selection) {
         return selection.length == 1;
     }
 
+    protected String getText() {
+        return "Open With";
+    }
+
     @Override
     protected IContributionItem[] getContributionItems(ReadGraph graph, Object[] selection) throws DatabaseException {
         final Object r = extractResource(graph, selection[0]);
-        final EditorAdapter[] editorAdapters = EditorRegistry.getInstance().getAdaptersFor(graph, r);
+        if (r == null)
+            return NONE;
+        EditorAdapter[] _editorAdapters = EditorRegistry.getInstance().getAdaptersFor(graph, r);
+        final EditorAdapter[] editorAdapters = filter(_editorAdapters, editorId);
         if (editorAdapters.length == 0)
             return NONE;
 
+        
         return new IContributionItem[] {
                 new ContributionItem() {
                     @Override
                     public void fill(Menu menu, int index) {
                         MenuItem openWith = new MenuItem(menu, SWT.CASCADE, index);
-                        openWith.setText("Open With");
+                        openWith.setText(getText());
                         openWith.setEnabled(editorAdapters.length > 0);
                         Menu subMenu = new Menu(menu);
                         openWith.setMenu(subMenu);
 
                         if (editorAdapters.length > 0) {
                             // Sort the open with actions in descending priority order.
-                            Adapter[] adapters = new Adapter[editorAdapters.length];
-                            for (int i = 0; i < editorAdapters.length; i++)
-                                adapters[i] = new Adapter(editorAdapters[i], r, true);
-                            Arrays.sort(adapters, new Comparator<Adapter>() {
-                                @Override
-                                public int compare(Adapter o1, Adapter o2) {
-                                    int delta = o2.getPriority() - o1.getPriority();
-                                    if (delta != 0)
-                                        return delta;
-                                    return AlphanumComparator.CASE_INSENSITIVE_COMPARATOR.compare(o1.getText(), o2.getText());
-                                }
-                            });
+                               Adapter[] adapters = toAdapters(editorAdapters, r);
 
                             for (Adapter a : adapters)
                                 addMenuItem(subMenu, a, r);
@@ -108,6 +136,34 @@ public class OpenWithMenuContribution extends DynamicMenuContribution {
                 }
         };
     }
+    
+    protected Adapter[] toAdapters(EditorAdapter[] editorAdapters, Object r) {
+        Adapter[] adapters = new Adapter[editorAdapters.length];
+         for (int i = 0; i < editorAdapters.length; i++)
+             adapters[i] = new Adapter(editorAdapters[i], r, true);
+         Arrays.sort(adapters, new Comparator<Adapter>() {
+             @Override
+             public int compare(Adapter o1, Adapter o2) {
+                 int delta = o2.getPriority() - o1.getPriority();
+                 if (delta != 0)
+                     return delta;
+                 return AlphanumComparator.CASE_INSENSITIVE_COMPARATOR.compare(o1.getText(), o2.getText());
+             }
+         });
+         return adapters;
+    }
+    
+    protected EditorAdapter[] filter(EditorAdapter[] adapters, String id) {
+       if (id == null)
+               return adapters;
+       List<EditorAdapter> editorAdapters = new ArrayList<EditorAdapter>();
+       for (EditorAdapter a : adapters) {
+               if (id.equals(a.getEditorId()))
+                       continue;
+               editorAdapters.add(a);
+       }
+       return editorAdapters.toArray(new EditorAdapter[editorAdapters.size()]);
+    }
 
     private void addMenuItem(Menu subMenu, Adapter adapter, Object r) {
         MenuItem item = new MenuItem(subMenu, SWT.PUSH);
@@ -123,7 +179,7 @@ public class OpenWithMenuContribution extends DynamicMenuContribution {
         item.addSelectionListener(adapter);
     }
 
-    static class Adapter extends ResourceEditorAdapterAction implements SelectionListener {
+    protected static class Adapter extends ResourceEditorAdapterAction implements SelectionListener {
         boolean remember;
 
         public Adapter(EditorAdapter adapter, Object r, boolean remember) {