combobox instead of buttons on the LogConsole panel
[fedora-idea.git] / platform / lang-impl / src / com / intellij / ide / macro / MacroManager.java
bloba38d5730c8bd27bbbd6e76247fc4f1ef01ca7047
1 package com.intellij.ide.macro;
3 import com.intellij.ide.DataManager;
4 import com.intellij.ide.IdeEventQueue;
5 import com.intellij.ide.impl.DataManagerImpl;
6 import com.intellij.openapi.actionSystem.DataConstants;
7 import com.intellij.openapi.actionSystem.DataContext;
8 import com.intellij.openapi.actionSystem.PlatformDataKeys;
9 import com.intellij.openapi.components.ServiceManager;
10 import com.intellij.openapi.extensions.Extensions;
11 import com.intellij.openapi.fileEditor.FileEditor;
12 import com.intellij.openapi.fileEditor.FileEditorManager;
13 import com.intellij.openapi.project.Project;
14 import com.intellij.openapi.util.text.StringUtil;
15 import com.intellij.openapi.vfs.VirtualFile;
16 import com.intellij.util.containers.ConvertingIterator;
17 import com.intellij.util.containers.Convertor;
18 import com.intellij.util.containers.HashMap;
20 import java.io.File;
21 import java.util.Collection;
22 import java.util.Iterator;
24 public final class MacroManager {
25 private final HashMap<String, Macro> myMacrosMap = new HashMap<String, Macro>();
27 public static MacroManager getInstance() {
28 return ServiceManager.getService(MacroManager.class);
31 private MacroManager() {
32 registerMacro(new SourcepathMacro());
33 registerMacro(new FileDirMacro());
34 registerMacro(new FileExtMacro());
35 registerMacro(new FileNameMacro());
36 registerMacro(new FileNameWithoutExtension());
37 registerMacro(new FilePathMacro());
38 registerMacro(new FileDirRelativeToProjectRootMacro());
39 registerMacro(new FilePathRelativeToProjectRootMacro());
40 registerMacro(new FileDirRelativeToSourcepathMacro());
41 registerMacro(new FilePathRelativeToSourcepathMacro());
42 registerMacro(new JdkPathMacro());
43 registerMacro(new PromptMacro());
44 registerMacro(new SourcepathEntryMacro());
45 //registerMacro(new ProjectFilePathMacro());
46 registerMacro(new ProjectFileDirMacro());
47 registerMacro(new ProjectNameMacro());
48 registerMacro(new ProjectPathMacro());
50 registerMacro(new ModuleFilePathMacro());
51 registerMacro(new ModuleFileDirMacro());
52 registerMacro(new ModuleNameMacro());
53 registerMacro(new ModulePathMacro());
55 registerMacro(new FileRelativePathMacro());
56 registerMacro(new FileRelativeDirMacro());
57 registerMacro(new LineNumberMacro());
58 registerMacro(new ColumnNumberMacro());
59 if (File.separatorChar != '/') {
60 registerMacro(new FileDirRelativeToProjectRootMacro2());
61 registerMacro(new FilePathRelativeToProjectRootMacro2());
62 registerMacro(new FileDirRelativeToSourcepathMacro2());
63 registerMacro(new FilePathRelativeToSourcepathMacro2());
64 registerMacro(new FileRelativeDirMacro2());
65 registerMacro(new FileRelativePathMacro2());
67 for (Macro macro : Extensions.getExtensions(Macro.EP_NAME)) {
68 registerMacro(macro);
72 private void registerMacro(Macro macro) {
73 myMacrosMap.put(macro.getName(), macro);
76 public Collection<Macro> getMacros() {
77 return myMacrosMap.values();
80 public void cacheMacrosPreview(DataContext dataContext) {
81 dataContext = getCorrectContext(dataContext);
82 for (Macro macro : getMacros()) {
83 macro.cachePreview(dataContext);
87 private static DataContext getCorrectContext(DataContext dataContext) {
88 if (dataContext.getData(DataConstants.FILE_EDITOR) != null) return dataContext;
89 Project project = PlatformDataKeys.PROJECT.getData(dataContext);
90 if (project == null) return dataContext;
91 FileEditorManager editorManager = FileEditorManager.getInstance(project);
92 VirtualFile[] files = editorManager.getSelectedFiles();
93 if (files.length == 0) return dataContext;
94 FileEditor fileEditor = editorManager.getSelectedEditor(files[0]);
95 return fileEditor == null ? dataContext :
96 DataManager.getInstance().getDataContext(fileEditor.getComponent());
99 /**
100 * Expands all macros that are found in the <code>str</code>.
102 public String expandMacrosInString(String str, boolean firstQueueExpand, DataContext dataContext) throws Macro.ExecutionCancelledException {
103 return expandMacroSet(str, firstQueueExpand, dataContext, getMacros().iterator());
106 private String expandMacroSet(String str,
107 boolean firstQueueExpand, DataContext dataContext, Iterator<Macro> macros
108 ) throws Macro.ExecutionCancelledException {
109 if (str == null) return null;
110 while (macros.hasNext()) {
111 Macro macro = macros.next();
112 if (macro instanceof SecondQueueExpandMacro && firstQueueExpand) continue;
113 String name = "$" + macro.getName() + "$";
114 if (str.indexOf(name) >= 0) {
115 String expanded = macro.expand(dataContext);
116 if (dataContext instanceof DataManagerImpl.MyDataContext) {
117 // hack: macro.expand() can cause UI events such as showing dialogs ('Prompt' macro) which may 'invalidate' the datacontext
118 // since we know exactly that context is valid, we need to update its event count
119 ((DataManagerImpl.MyDataContext)dataContext).setEventCount(IdeEventQueue.getInstance().getEventCount());
121 if (expanded == null) {
122 expanded = "";
124 str = StringUtil.replace(str, name, expanded);
127 return str;
130 public String expandSilentMarcos(String str, boolean firstQueueExpand, DataContext dataContext) throws Macro.ExecutionCancelledException {
131 return expandMacroSet(str, firstQueueExpand, dataContext,
132 ConvertingIterator.create(getMacros().iterator(), new Convertor<Macro, Macro>() {
133 public Macro convert(Macro macro) {
134 if (macro instanceof PromptMacro)
135 return new Macro.Silent(macro, "");
136 return macro;
138 }));