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
;
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
)) {
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());
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) {
124 str
= StringUtil
.replace(str
, name
, expanded
);
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
, "");