001 package org.meta_environment.eclipse.actions;
002
003 import java.util.ArrayList;
004 import java.util.List;
005
006 import org.eclipse.core.runtime.IConfigurationElement;
007 import org.eclipse.core.runtime.IExtensionPoint;
008 import org.eclipse.core.runtime.IPath;
009 import org.eclipse.core.runtime.Platform;
010 import org.eclipse.imp.editor.UniversalEditor;
011 import org.eclipse.imp.language.Language;
012 import org.eclipse.imp.model.ISourceProject;
013 import org.eclipse.imp.parser.IParseController;
014 import org.eclipse.imp.services.base.DefaultLanguageActionsContributor;
015 import org.eclipse.jface.action.Action;
016 import org.eclipse.jface.action.IMenuManager;
017 import org.eclipse.jface.action.MenuManager;
018
019 public class LanguageActions extends DefaultLanguageActionsContributor {
020
021 private final String extensionPointId = "org.meta_environment.eclipse.actions.EditorMenus";
022
023 public void contributeToEditorMenu(UniversalEditor editor, IMenuManager menu) {
024 // TODO: Bugzilla: Request getter for UniversalEditor.fLanguage
025 final Language language = editor.fLanguage;
026 IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
027 .getExtensionPoint(extensionPointId);
028
029 if (extensionPoint != null) {
030 List<IConfigurationElement> extensions = getExtensionsForLanguage(
031 extensionPoint, language);
032 if (extensions.size() != 0) {
033 for (IConfigurationElement ext : extensions) {
034 createActionsForEditorMenu(ext, editor, menu);
035 }
036 }
037 }
038 }
039
040 private List<Action> createActionsForEditorMenu(
041 IConfigurationElement editorMenu, final UniversalEditor editor, IMenuManager menu) {
042 List<Action> actions = new ArrayList<Action>();
043
044 IConfigurationElement[] children = editorMenu.getChildren();
045
046 for (IConfigurationElement child : children) {
047 actions.addAll(createActionsForEditorMenuItem(child, editor, menu));
048 }
049
050 return actions;
051 }
052
053 private List<Action> createActionsForEditorMenuItem(
054 IConfigurationElement editorMenuItem,
055 final UniversalEditor editor, IMenuManager menu) {
056
057 List<Action> actions = new ArrayList<Action>();
058 String name = editorMenuItem.getAttribute("name");
059
060 if (editorMenuItem.getName().equals("EditorSubmenu")) {
061 IConfigurationElement[] children = editorMenuItem.getChildren();
062 IMenuManager subMenu = new MenuManager(name);
063
064 for (IConfigurationElement child : children) {
065 actions.addAll(createActionsForEditorMenuItem(child, editor, subMenu));
066 }
067
068 menu.add(subMenu);
069 }
070
071 else if (editorMenuItem.getName().equals("EditorMenuAction")) {
072 addActionForEditorMenuAction(editorMenuItem, name, editor, menu);
073 }
074
075 return actions;
076 }
077
078 private void addActionForEditorMenuAction(
079 IConfigurationElement editorMenuAction, String name,
080 final UniversalEditor editor, IMenuManager menu) {
081 final String toolbus_action = editorMenuAction
082 .getAttribute("toolbus_action");
083 final String language = editor.fLanguage.getName();
084
085 Action action = new Action(name) {
086 public void run() {
087 LanguageActionsTool.getInstance()
088 .PerformAction(toolbus_action, language, getFileName(editor));
089 }
090 };
091 action.setToolTipText(editorMenuAction.getAttribute("description"));
092
093 menu.add(action);
094 }
095
096 public static String getFileName(UniversalEditor editor) {
097 IParseController controller = editor.getParseController();
098 ISourceProject project = controller.getProject();
099 IPath path = controller.getPath();
100 String filename;
101
102 if (project != null) {
103 filename = project.getRawProject().getLocation().append(path)
104 .makeAbsolute().toOSString();
105 }
106
107 else {
108 filename = editor.getParseController().getPath().toOSString();
109 }
110
111 return filename;
112 }
113
114 public static List<IConfigurationElement> getExtensionsForLanguage(
115 IExtensionPoint extensionPoint, Language language) {
116
117 IConfigurationElement[] elements = extensionPoint
118 .getConfigurationElements();
119 List<IConfigurationElement> result = new ArrayList<IConfigurationElement>();
120
121 if (elements != null) {
122 for (int n = 0; n < elements.length; n++) {
123 IConfigurationElement element = elements[n];
124 final String attrValue = element
125 .getAttribute(Language.LANGUAGE_ID_ATTR);
126
127 if (isSameLanguageString(attrValue, language.getName())) {
128 result.add(element);
129 }
130 }
131 }
132
133 return result;
134 }
135
136 public static boolean isSameLanguageString(String l1, String l2) {
137 return l1.toLowerCase().equals(l2.toLowerCase());
138 }
139 }