001 package org.meta_environment.eclipse.terms;
002
003 import java.util.HashMap;
004 import java.util.LinkedList;
005 import java.util.List;
006 import java.util.Map;
007
008 import org.eclipse.core.resources.IFile;
009 import org.eclipse.core.resources.ResourcesPlugin;
010 import org.eclipse.core.runtime.Path;
011 import org.eclipse.imp.editor.UniversalEditor;
012 import org.eclipse.jface.action.Action;
013 import org.eclipse.ui.IWorkbench;
014 import org.eclipse.ui.IWorkbenchPage;
015 import org.eclipse.ui.IWorkbenchWindow;
016 import org.eclipse.ui.PartInitException;
017 import org.eclipse.ui.PlatformUI;
018 import org.eclipse.ui.part.FileEditorInput;
019 import org.meta_environment.eclipse.sdf.Activator;
020
021 import toolbus.adapter.eclipse.EclipseTool;
022 import aterm.ATerm;
023 import aterm.ATermAppl;
024 import aterm.ATermList;
025
026 public class TermEditorTools extends EclipseTool {
027 private static TermEditorTools sInstance;
028
029 private Map<String, Map<String, String>> actions = new HashMap<String, Map<String, String>>();
030
031 private TermEditorTools(){
032 super("term-language-registrar");
033 }
034
035 public static TermEditorTools getInstance() {
036 if (sInstance == null) {
037 sInstance = new TermEditorTools();
038 sInstance.connect();
039 }
040 return sInstance;
041 }
042
043 public List<String> getLanguages() {
044 ATermAppl response = sendRequest(factory.make("get-languages"));
045
046 ATermList result = (ATermList) response.getArgument(0);
047 List<String> list = new LinkedList<String>();
048
049 for (; !result.isEmpty(); result = result.getNext()) {
050 list.add(((ATermAppl) result.getFirst()).getName());
051 }
052
053 return list;
054 }
055
056 public String getLanguage(String filename) {
057 ATermAppl response = sendRequest(factory.make("get-language(<str>)", filename));
058 ATerm language = response.getArgument(0);
059
060 return ((ATermAppl) language).getName();
061 }
062
063 public void setLanguage(String filename, String language) {
064 sendEvent(factory.make("set-language(<str>,<str>)", filename, language));
065 }
066
067 public void open(String filename) {
068 IWorkbench wb = PlatformUI.getWorkbench();
069 IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
070
071 if (win != null) {
072 IWorkbenchPage page = win.getActivePage();
073
074 if (page != null) {
075 IFile file = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(new Path(filename));
076 try {
077 page.openEditor(new FileEditorInput(file), UniversalEditor.EDITOR_ID);
078 } catch (PartInitException e) {
079 Activator.getInstance().logException("Could not open editor for: " + filename, e);
080 }
081 }
082 }
083 }
084
085 public void registerAction(String language, String label, String tooltip, String action) {
086 System.err.println("registering " + language + " " + label + " " + action);
087 Map<String, String> map = getActionMap(language);
088 map.put(label, action);
089 }
090
091 private String canonical(String label) {
092 int i = label.lastIndexOf('/');
093 if (i != -1) {
094 return label.substring(i+1);
095 }
096 return label;
097 }
098
099 private Map<String, String> getActionMap(String language) {
100 Map<String, String> map = actions.get(canonical(language));
101
102 if (map == null) {
103 map = new HashMap<String,String>();
104 actions.put(canonical(language), map);
105 }
106
107 return map;
108 }
109
110 public List<Action> getDynamicActions(final String language, final String filename) {
111 Map<String, String> map = getActionMap(language);
112 List<Action> result = new LinkedList<Action>();
113
114 for (String label : map.keySet()) {
115 final String action = map.get(label);
116 result.add(new Action(label) {
117 public void run() {
118 System.err.println("dynamic term action triggered: " + action + " for language " + language + " on file " + filename);
119 performAction(action, language, filename);
120 }
121 });
122 }
123
124 return result;
125 }
126
127 public void unregisterAction(String language, String label) {
128 System.err.println("unregister " + language + " " + label);
129 Map<String, String> map = getActionMap(language);
130 map.remove(label);
131 }
132
133 private void performAction (String Action, String language, String Filename) {
134 this.sendEvent(factory.make("perform-action(<str>,<str>,<str>)", Action, language, Filename));
135 }
136 }