From 0c09a2004bd580dedbeca06a6dbce92466dc72a3 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Wed, 3 Dec 2014 16:43:01 +0100 Subject: [PATCH 001/104] Dummy plugin stub to illustrate plugin.xml --- plugin_sample/META-INF/plugin.xml | 90 +++++++++++++++++++ plugin_sample/PluginSample.iml | 13 +++ .../PluginSampleBundle.properties | 1 + .../sample/DummyApplicationComponent.java | 9 ++ .../sample/DummyApplicationComponentImpl.java | 24 +++++ .../plugins/sample/DummyModuleComponent.java | 9 ++ .../sample/DummyModuleComponentImpl.java | 39 ++++++++ .../plugins/sample/DummyProjectComponent.java | 9 ++ .../sample/DummyProjectComponentImpl.java | 34 +++++++ .../plugins/sample/SimpleAction.java | 14 +++ 10 files changed, 242 insertions(+) create mode 100644 plugin_sample/META-INF/plugin.xml create mode 100644 plugin_sample/PluginSample.iml create mode 100644 plugin_sample/resources/org.jetbrains.plugins.sample/PluginSampleBundle.properties create mode 100644 plugin_sample/src/org/jetbrains/plugins/sample/DummyApplicationComponent.java create mode 100644 plugin_sample/src/org/jetbrains/plugins/sample/DummyApplicationComponentImpl.java create mode 100644 plugin_sample/src/org/jetbrains/plugins/sample/DummyModuleComponent.java create mode 100644 plugin_sample/src/org/jetbrains/plugins/sample/DummyModuleComponentImpl.java create mode 100644 plugin_sample/src/org/jetbrains/plugins/sample/DummyProjectComponent.java create mode 100644 plugin_sample/src/org/jetbrains/plugins/sample/DummyProjectComponentImpl.java create mode 100644 plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java diff --git a/plugin_sample/META-INF/plugin.xml b/plugin_sample/META-INF/plugin.xml new file mode 100644 index 000000000..ea08927bd --- /dev/null +++ b/plugin_sample/META-INF/plugin.xml @@ -0,0 +1,90 @@ + + Tutorial + Basic plugin example + 1.0 + JetBrains + Samples + JetBrains + + most HTML tags may be used + ]]> + + most HTML tags may be used + ]]> + + + + + + + + com.intellij.modules.lang + + + + + + + + + + + org.jetbrains.plugins.sample.PluginSampleBundle + + + + + + org.jetbrains.plugins.sample.DummyApplicationComponent + + org.jetbrains.plugins.sample.DummyApplicationComponentImpl + + + + + + + + org.jetbrains.plugins.sample.DummyProjectComponent + org.jetbrains.plugins.sample.DummyProjectComponentImpl + + + + + + + + + org.jetbrains.plugins.sample.DummyModuleComponent + org.jetbrains.plugins.sample.DummyModuleComponentImpl + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugin_sample/PluginSample.iml b/plugin_sample/PluginSample.iml new file mode 100644 index 000000000..493dcb361 --- /dev/null +++ b/plugin_sample/PluginSample.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugin_sample/resources/org.jetbrains.plugins.sample/PluginSampleBundle.properties b/plugin_sample/resources/org.jetbrains.plugins.sample/PluginSampleBundle.properties new file mode 100644 index 000000000..4b1033298 --- /dev/null +++ b/plugin_sample/resources/org.jetbrains.plugins.sample/PluginSampleBundle.properties @@ -0,0 +1 @@ +key=value \ No newline at end of file diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/DummyApplicationComponent.java b/plugin_sample/src/org/jetbrains/plugins/sample/DummyApplicationComponent.java new file mode 100644 index 000000000..6b112948d --- /dev/null +++ b/plugin_sample/src/org/jetbrains/plugins/sample/DummyApplicationComponent.java @@ -0,0 +1,9 @@ +package org.jetbrains.plugins.sample; + +import com.intellij.openapi.components.ApplicationComponent; + +/** + * @author Anna Bulenkova + */ +interface DummyApplicationComponent extends ApplicationComponent{ +} diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/DummyApplicationComponentImpl.java b/plugin_sample/src/org/jetbrains/plugins/sample/DummyApplicationComponentImpl.java new file mode 100644 index 000000000..0069f88f6 --- /dev/null +++ b/plugin_sample/src/org/jetbrains/plugins/sample/DummyApplicationComponentImpl.java @@ -0,0 +1,24 @@ +package org.jetbrains.plugins.sample; + +import org.jetbrains.annotations.NotNull; + +/** + * @author Anna Bulenkova + */ +public class DummyApplicationComponentImpl implements DummyApplicationComponent { + @Override + public void initComponent() { + + } + + @Override + public void disposeComponent() { + + } + + @NotNull + @Override + public String getComponentName() { + return null; + } +} diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/DummyModuleComponent.java b/plugin_sample/src/org/jetbrains/plugins/sample/DummyModuleComponent.java new file mode 100644 index 000000000..68f1e9fbe --- /dev/null +++ b/plugin_sample/src/org/jetbrains/plugins/sample/DummyModuleComponent.java @@ -0,0 +1,9 @@ +package org.jetbrains.plugins.sample; + +import com.intellij.openapi.module.ModuleComponent; + +/** + * @author Anna Bulenkova + */ +public interface DummyModuleComponent extends ModuleComponent{ +} diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/DummyModuleComponentImpl.java b/plugin_sample/src/org/jetbrains/plugins/sample/DummyModuleComponentImpl.java new file mode 100644 index 000000000..9305c5acc --- /dev/null +++ b/plugin_sample/src/org/jetbrains/plugins/sample/DummyModuleComponentImpl.java @@ -0,0 +1,39 @@ +package org.jetbrains.plugins.sample; + +import org.jetbrains.annotations.NotNull; + +/** + * @author Anna Bulenkova + */ +public class DummyModuleComponentImpl implements DummyModuleComponent { + @Override + public void projectOpened() { + + } + + @Override + public void projectClosed() { + + } + + @Override + public void moduleAdded() { + + } + + @Override + public void initComponent() { + + } + + @Override + public void disposeComponent() { + + } + + @NotNull + @Override + public String getComponentName() { + return null; + } +} diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/DummyProjectComponent.java b/plugin_sample/src/org/jetbrains/plugins/sample/DummyProjectComponent.java new file mode 100644 index 000000000..fba925eeb --- /dev/null +++ b/plugin_sample/src/org/jetbrains/plugins/sample/DummyProjectComponent.java @@ -0,0 +1,9 @@ +package org.jetbrains.plugins.sample; + +import com.intellij.openapi.components.ProjectComponent; + +/** + * @author Anna Bulenkova + */ +public interface DummyProjectComponent extends ProjectComponent{ +} diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/DummyProjectComponentImpl.java b/plugin_sample/src/org/jetbrains/plugins/sample/DummyProjectComponentImpl.java new file mode 100644 index 000000000..488509e3c --- /dev/null +++ b/plugin_sample/src/org/jetbrains/plugins/sample/DummyProjectComponentImpl.java @@ -0,0 +1,34 @@ +package org.jetbrains.plugins.sample; + +import org.jetbrains.annotations.NotNull; + +/** + * @author Anna Bulenkova + */ +public class DummyProjectComponentImpl implements DummyProjectComponent { + @Override + public void projectOpened() { + + } + + @Override + public void projectClosed() { + + } + + @Override + public void initComponent() { + + } + + @Override + public void disposeComponent() { + + } + + @NotNull + @Override + public String getComponentName() { + return null; + } +} diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java b/plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java new file mode 100644 index 000000000..d955582f4 --- /dev/null +++ b/plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java @@ -0,0 +1,14 @@ +package org.jetbrains.plugins.sample; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; + +/** + * @author Anna Bulenkova + */ +public class SimpleAction extends AnAction { + @Override + public void actionPerformed(AnActionEvent anActionEvent) { + + } +} From 58d66d948c8f0d9fe52dac585bbe48598037b0f2 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Thu, 4 Dec 2014 13:41:27 +0100 Subject: [PATCH 002/104] Typo --- plugin_sample/META-INF/plugin.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/plugin_sample/META-INF/plugin.xml b/plugin_sample/META-INF/plugin.xml index ea08927bd..19c8ead34 100644 --- a/plugin_sample/META-INF/plugin.xml +++ b/plugin_sample/META-INF/plugin.xml @@ -4,7 +4,6 @@ 1.0 JetBrains Samples - JetBrains most HTML tags may be used From 2b586ac83237f266ad76b4fdc3f5a4c6adc589a9 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Thu, 4 Dec 2014 13:45:55 +0100 Subject: [PATCH 003/104] Typo --- plugin_sample/META-INF/plugin.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugin_sample/META-INF/plugin.xml b/plugin_sample/META-INF/plugin.xml index 19c8ead34..e59ce8307 100644 --- a/plugin_sample/META-INF/plugin.xml +++ b/plugin_sample/META-INF/plugin.xml @@ -14,8 +14,6 @@ ]]> - - From e115163ba8f8dac22cea681aaa9ee080b65a2995 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Thu, 4 Dec 2014 13:49:54 +0100 Subject: [PATCH 004/104] NPEs --- .../jetbrains/plugins/sample/DummyApplicationComponentImpl.java | 2 +- .../org/jetbrains/plugins/sample/DummyModuleComponentImpl.java | 2 +- .../org/jetbrains/plugins/sample/DummyProjectComponentImpl.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/DummyApplicationComponentImpl.java b/plugin_sample/src/org/jetbrains/plugins/sample/DummyApplicationComponentImpl.java index 0069f88f6..66b484c8d 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/DummyApplicationComponentImpl.java +++ b/plugin_sample/src/org/jetbrains/plugins/sample/DummyApplicationComponentImpl.java @@ -19,6 +19,6 @@ public class DummyApplicationComponentImpl implements DummyApplicationComponent @NotNull @Override public String getComponentName() { - return null; + return "DummyApplicationComponent"; } } diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/DummyModuleComponentImpl.java b/plugin_sample/src/org/jetbrains/plugins/sample/DummyModuleComponentImpl.java index 9305c5acc..f0b601e9a 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/DummyModuleComponentImpl.java +++ b/plugin_sample/src/org/jetbrains/plugins/sample/DummyModuleComponentImpl.java @@ -34,6 +34,6 @@ public class DummyModuleComponentImpl implements DummyModuleComponent { @NotNull @Override public String getComponentName() { - return null; + return "DummyModuleComponent"; } } diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/DummyProjectComponentImpl.java b/plugin_sample/src/org/jetbrains/plugins/sample/DummyProjectComponentImpl.java index 488509e3c..84f7f2272 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/DummyProjectComponentImpl.java +++ b/plugin_sample/src/org/jetbrains/plugins/sample/DummyProjectComponentImpl.java @@ -29,6 +29,6 @@ public class DummyProjectComponentImpl implements DummyProjectComponent { @NotNull @Override public String getComponentName() { - return null; + return "DummyProjectComponent"; } } From 9bfe28c0443937f48e9c8342898a85c808a91348 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Thu, 4 Dec 2014 15:00:32 +0100 Subject: [PATCH 005/104] Action attributes and comments added --- plugin_sample/META-INF/plugin.xml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/plugin_sample/META-INF/plugin.xml b/plugin_sample/META-INF/plugin.xml index e59ce8307..490d387f6 100644 --- a/plugin_sample/META-INF/plugin.xml +++ b/plugin_sample/META-INF/plugin.xml @@ -66,8 +66,35 @@ + + + + + + From 746ea04285698d15ab221108444022815b9adcdd Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Thu, 4 Dec 2014 15:14:18 +0100 Subject: [PATCH 006/104] Cleanup --- .../src/org/jetbrains/plugins/sample/SimpleAction.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java b/plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java index d955582f4..1a1e3b575 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java +++ b/plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java @@ -2,13 +2,14 @@ package org.jetbrains.plugins.sample; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; +import org.jetbrains.annotations.NotNull; /** * @author Anna Bulenkova */ public class SimpleAction extends AnAction { @Override - public void actionPerformed(AnActionEvent anActionEvent) { + public void actionPerformed(@NotNull AnActionEvent anActionEvent) { } } From 79f8efc5a6b5f7df5f65c062e94f1923293d994a Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Thu, 4 Dec 2014 15:46:19 +0100 Subject: [PATCH 007/104] action.update set to true --- .../src/org/jetbrains/plugins/sample/SimpleAction.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java b/plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java index 1a1e3b575..2a44cf883 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java +++ b/plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java @@ -10,6 +10,11 @@ import org.jetbrains.annotations.NotNull; public class SimpleAction extends AnAction { @Override public void actionPerformed(@NotNull AnActionEvent anActionEvent) { + } + @Override + public void update(@NotNull AnActionEvent e) { + e.getPresentation().setVisible(true); + e.getPresentation().setEnabled(true); } } From 9963948763ec473838b6a2986b1532918aed9e80 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Fri, 5 Dec 2014 14:16:23 +0100 Subject: [PATCH 008/104] better action.update --- .../src/org/jetbrains/plugins/sample/SimpleAction.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java b/plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java index 2a44cf883..09b18f64e 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java +++ b/plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java @@ -2,6 +2,7 @@ package org.jetbrains.plugins.sample; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; /** @@ -14,7 +15,10 @@ public class SimpleAction extends AnAction { @Override public void update(@NotNull AnActionEvent e) { - e.getPresentation().setVisible(true); - e.getPresentation().setEnabled(true); + //Make action visible and available only when project is defined + final Project project = e.getProject(); + boolean isAvailable = project != null; + e.getPresentation().setVisible(isAvailable); + e.getPresentation().setEnabled(isAvailable); } } From 7d78dd408598a569a636fd94e181591fc2b92681 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Fri, 5 Dec 2014 15:22:00 +0100 Subject: [PATCH 009/104] source: action group with one action and comments --- plugin_sample/META-INF/plugin.xml | 211 ++++++++++-------- .../plugins/sample/DummyActionGroup.java | 17 ++ .../plugins/sample/GroupedAction.java | 15 ++ 3 files changed, 149 insertions(+), 94 deletions(-) create mode 100644 plugin_sample/src/org/jetbrains/plugins/sample/DummyActionGroup.java create mode 100644 plugin_sample/src/org/jetbrains/plugins/sample/GroupedAction.java diff --git a/plugin_sample/META-INF/plugin.xml b/plugin_sample/META-INF/plugin.xml index 490d387f6..a508f6135 100644 --- a/plugin_sample/META-INF/plugin.xml +++ b/plugin_sample/META-INF/plugin.xml @@ -1,114 +1,137 @@ - Tutorial - Basic plugin example - 1.0 - JetBrains - Samples - Tutorial + Basic plugin example + 1.0 + JetBrains + Samples + most HTML tags may be used ]]> - most HTML tags may be used ]]> - + - - - - com.intellij.modules.lang - - + + + + com.intellij.modules.lang + + - - + + - - + + - - org.jetbrains.plugins.sample.PluginSampleBundle + + org.jetbrains.plugins.sample.PluginSampleBundle - - - - - org.jetbrains.plugins.sample.DummyApplicationComponent - - org.jetbrains.plugins.sample.DummyApplicationComponentImpl - - + + + + + org.jetbrains.plugins.sample.DummyApplicationComponent + + org.jetbrains.plugins.sample.DummyApplicationComponentImpl + + - - - - - org.jetbrains.plugins.sample.DummyProjectComponent - org.jetbrains.plugins.sample.DummyProjectComponentImpl - + + + + + org.jetbrains.plugins.sample.DummyProjectComponent + org.jetbrains.plugins.sample.DummyProjectComponentImpl + - - + + - - - - org.jetbrains.plugins.sample.DummyModuleComponent - org.jetbrains.plugins.sample.DummyModuleComponentImpl - - + + + + org.jetbrains.plugins.sample.DummyModuleComponent + org.jetbrains.plugins.sample.DummyModuleComponentImpl + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - + + + + - + - - - - + + + + \ No newline at end of file diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/DummyActionGroup.java b/plugin_sample/src/org/jetbrains/plugins/sample/DummyActionGroup.java new file mode 100644 index 000000000..388c3e307 --- /dev/null +++ b/plugin_sample/src/org/jetbrains/plugins/sample/DummyActionGroup.java @@ -0,0 +1,17 @@ +package org.jetbrains.plugins.sample; + +import com.intellij.openapi.actionSystem.ActionGroup; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import org.jetbrains.annotations.NotNull; + +/** + * @author Anna Bulenkova + */ +public class DummyActionGroup extends ActionGroup { + @NotNull + @Override + public AnAction[] getChildren(AnActionEvent anActionEvent) { + return new GroupedAction[0]; + } +} diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/GroupedAction.java b/plugin_sample/src/org/jetbrains/plugins/sample/GroupedAction.java new file mode 100644 index 000000000..d05935671 --- /dev/null +++ b/plugin_sample/src/org/jetbrains/plugins/sample/GroupedAction.java @@ -0,0 +1,15 @@ +package org.jetbrains.plugins.sample; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import org.jetbrains.annotations.NotNull; + +/** + * @author Anna Bulenkova + */ +public class GroupedAction extends AnAction { + @Override + public void actionPerformed(@NotNull AnActionEvent anActionEvent) { + + } +} From 8bdb19504bebb0d1178fcb0cc98d063266738152 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Fri, 5 Dec 2014 15:39:24 +0100 Subject: [PATCH 010/104] source + md: actions put to a separate package --- plugin_sample/META-INF/plugin.xml | 6 +++--- .../plugins/sample/{ => actions}/DummyActionGroup.java | 2 +- .../plugins/sample/{ => actions}/GroupedAction.java | 2 +- .../plugins/sample/{ => actions}/SimpleAction.java | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) rename plugin_sample/src/org/jetbrains/plugins/sample/{ => actions}/DummyActionGroup.java (90%) rename plugin_sample/src/org/jetbrains/plugins/sample/{ => actions}/GroupedAction.java (87%) rename plugin_sample/src/org/jetbrains/plugins/sample/{ => actions}/SimpleAction.java (93%) diff --git a/plugin_sample/META-INF/plugin.xml b/plugin_sample/META-INF/plugin.xml index a508f6135..44593fcdb 100644 --- a/plugin_sample/META-INF/plugin.xml +++ b/plugin_sample/META-INF/plugin.xml @@ -73,7 +73,7 @@ The optional "use-shortcut-of" attribute specifies the ID of the action whose keyboard shortcut this action will use. The optional "description" attribute specifies the text which is displayed in the status bar when the action is focused. The optional "icon" attribute specifies the icon which is displayed on the toolbar button or next to the menu item. --> - - - diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/DummyActionGroup.java b/plugin_sample/src/org/jetbrains/plugins/sample/actions/DummyActionGroup.java similarity index 90% rename from plugin_sample/src/org/jetbrains/plugins/sample/DummyActionGroup.java rename to plugin_sample/src/org/jetbrains/plugins/sample/actions/DummyActionGroup.java index 388c3e307..920e178df 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/DummyActionGroup.java +++ b/plugin_sample/src/org/jetbrains/plugins/sample/actions/DummyActionGroup.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.sample; +package org.jetbrains.plugins.sample.actions; import com.intellij.openapi.actionSystem.ActionGroup; import com.intellij.openapi.actionSystem.AnAction; diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/GroupedAction.java b/plugin_sample/src/org/jetbrains/plugins/sample/actions/GroupedAction.java similarity index 87% rename from plugin_sample/src/org/jetbrains/plugins/sample/GroupedAction.java rename to plugin_sample/src/org/jetbrains/plugins/sample/actions/GroupedAction.java index d05935671..5babf596b 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/GroupedAction.java +++ b/plugin_sample/src/org/jetbrains/plugins/sample/actions/GroupedAction.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.sample; +package org.jetbrains.plugins.sample.actions; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java b/plugin_sample/src/org/jetbrains/plugins/sample/actions/SimpleAction.java similarity index 93% rename from plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java rename to plugin_sample/src/org/jetbrains/plugins/sample/actions/SimpleAction.java index 09b18f64e..545c0d013 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/SimpleAction.java +++ b/plugin_sample/src/org/jetbrains/plugins/sample/actions/SimpleAction.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.sample; +package org.jetbrains.plugins.sample.actions; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; From e5ecd5b828d5edd9c46d1b16beee160f2f0aa892 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Mon, 8 Dec 2014 09:25:38 +0100 Subject: [PATCH 011/104] [code] DefaultActionGroup --- plugin_sample/META-INF/plugin.xml | 3 +++ .../sample/actions/GroupedToDefaultAction.java | 15 +++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 plugin_sample/src/org/jetbrains/plugins/sample/actions/GroupedToDefaultAction.java diff --git a/plugin_sample/META-INF/plugin.xml b/plugin_sample/META-INF/plugin.xml index 44593fcdb..ae26485e1 100644 --- a/plugin_sample/META-INF/plugin.xml +++ b/plugin_sample/META-INF/plugin.xml @@ -106,6 +106,9 @@ The optional "icon" attribute specifies the icon which is displayed on the toolbar button or next to the group. The optional "popup" attribute specifies how the group is presented in the menu. If a group has popup="true", actions in it are placed in a submenu; for popup="false", actions are displayed as a section of the same menu delimited by separators. --> + + + diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/actions/GroupedToDefaultAction.java b/plugin_sample/src/org/jetbrains/plugins/sample/actions/GroupedToDefaultAction.java new file mode 100644 index 000000000..f7f2b1acb --- /dev/null +++ b/plugin_sample/src/org/jetbrains/plugins/sample/actions/GroupedToDefaultAction.java @@ -0,0 +1,15 @@ +package org.jetbrains.plugins.sample.actions; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import org.jetbrains.annotations.NotNull; + +/** + * @author Anna Bulenkova + */ +public class GroupedToDefaultAction extends AnAction { + @Override + public void actionPerformed(@NotNull AnActionEvent anActionEvent) { + + } +} From 135050cf0e46afdd0a76f3aab91c5b6963d8695e Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 9 Dec 2014 13:27:32 +0100 Subject: [PATCH 012/104] id fixed --- plugin_sample/META-INF/plugin.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin_sample/META-INF/plugin.xml b/plugin_sample/META-INF/plugin.xml index ae26485e1..e8274ac02 100644 --- a/plugin_sample/META-INF/plugin.xml +++ b/plugin_sample/META-INF/plugin.xml @@ -1,5 +1,5 @@ - Tutorial + org.jetbrains.plugins.sample.PluginSample Basic plugin example 1.0 JetBrains From 2857c64fca3159ca3db2775178082565dcc2c661 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 9 Dec 2014 13:38:09 +0100 Subject: [PATCH 013/104] [code] Editor basics stub --- editor_basics/editor_basics.iml | 12 ++++++++ editor_basics/resources/META-INF/plugin.xml | 31 +++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 editor_basics/editor_basics.iml create mode 100644 editor_basics/resources/META-INF/plugin.xml diff --git a/editor_basics/editor_basics.iml b/editor_basics/editor_basics.iml new file mode 100644 index 000000000..4929ae2d1 --- /dev/null +++ b/editor_basics/editor_basics.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/editor_basics/resources/META-INF/plugin.xml b/editor_basics/resources/META-INF/plugin.xml new file mode 100644 index 000000000..8708b59e7 --- /dev/null +++ b/editor_basics/resources/META-INF/plugin.xml @@ -0,0 +1,31 @@ + + org.jetbrains.plugins.sample.EditorBasics + Editor basics + 1.0 + JetBrains + + Illustration editor basics + + Initial commit + + + + com.intellij.modules.lang + + + + + + + + + + + + + + + + + + \ No newline at end of file From d089824faccb033e1dc74c0fea9f0cc6b777bc8c Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 9 Dec 2014 14:21:22 +0100 Subject: [PATCH 014/104] SDK version update --- editor_basics/editor_basics.iml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editor_basics/editor_basics.iml b/editor_basics/editor_basics.iml index 4929ae2d1..9352fd5f7 100644 --- a/editor_basics/editor_basics.iml +++ b/editor_basics/editor_basics.iml @@ -6,7 +6,7 @@ - + \ No newline at end of file From 8a8b365b3aab4ac33f7b814c19c4acabe85b72de Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 9 Dec 2014 14:30:28 +0100 Subject: [PATCH 015/104] [md] Fatal error running a plugin --- plugin_sample/resources/rename_error.md | 68 +++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 plugin_sample/resources/rename_error.md diff --git a/plugin_sample/resources/rename_error.md b/plugin_sample/resources/rename_error.md new file mode 100644 index 000000000..dedd55ec6 --- /dev/null +++ b/plugin_sample/resources/rename_error.md @@ -0,0 +1,68 @@ + Internal error. Please report to http://youtrack.jetbrains.com + + java.lang.RuntimeException: com.intellij.ide.plugins.PluginManager$StartupAbortedException: Fatal error initializing 'com.intellij.openapi.actionSystem.ActionManager' + at com.intellij.idea.IdeaApplication.run(IdeaApplication.java:178) + at com.intellij.idea.MainImpl$1$1$1.run(MainImpl.java:64) + at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) + at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744) + at java.awt.EventQueue.access$400(EventQueue.java:97) + at java.awt.EventQueue$3.run(EventQueue.java:697) + at java.awt.EventQueue$3.run(EventQueue.java:691) + at java.security.AccessController.doPrivileged(Native Method) + at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) + at java.awt.EventQueue.dispatchEvent(EventQueue.java:714) + at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:363) + at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) + at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) + at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) + at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) + at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) + at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) + Caused by: com.intellij.ide.plugins.PluginManager$StartupAbortedException: Fatal error initializing 'com.intellij.openapi.actionSystem.ActionManager' + at com.intellij.ide.plugins.PluginManager.handleComponentError(PluginManager.java:248) + at com.intellij.openapi.components.impl.PlatformComponentManagerImpl.handleInitComponentError(PlatformComponentManagerImpl.java:39) + at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter$1.getComponentInstance(ComponentManagerImpl.java:587) + at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter.getComponentInstance(ComponentManagerImpl.java:607) + at com.intellij.util.pico.DefaultPicoContainer.getLocalInstance(DefaultPicoContainer.java:244) + at com.intellij.util.pico.DefaultPicoContainer.getComponentInstance(DefaultPicoContainer.java:210) + at org.picocontainer.defaults.BasicComponentParameter.resolveInstance(BasicComponentParameter.java:77) + at org.picocontainer.defaults.ComponentParameter.resolveInstance(ComponentParameter.java:114) + at org.picocontainer.defaults.ConstructorInjectionComponentAdapter.getConstructorArguments(ConstructorInjectionComponentAdapter.java:257) + at org.picocontainer.defaults.ConstructorInjectionComponentAdapter$1.run(ConstructorInjectionComponentAdapter.java:217) + at org.picocontainer.defaults.ThreadLocalCyclicDependencyGuard.observe(ThreadLocalCyclicDependencyGuard.java:53) + at org.picocontainer.defaults.ConstructorInjectionComponentAdapter.getComponentInstance(ConstructorInjectionComponentAdapter.java:248) + at com.intellij.util.pico.ConstructorInjectionComponentAdapter.getComponentInstance(ConstructorInjectionComponentAdapter.java:58) + at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter$1.getComponentInstance(ComponentManagerImpl.java:547) + at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter.getComponentInstance(ComponentManagerImpl.java:607) + at com.intellij.util.pico.DefaultPicoContainer.getLocalInstance(DefaultPicoContainer.java:244) + at com.intellij.util.pico.DefaultPicoContainer.getComponentInstance(DefaultPicoContainer.java:210) + at com.intellij.openapi.components.impl.ComponentManagerImpl.createComponent(ComponentManagerImpl.java:126) + at com.intellij.openapi.application.impl.ApplicationImpl.createComponent(ApplicationImpl.java:362) + at com.intellij.openapi.components.impl.ComponentManagerImpl.a(ComponentManagerImpl.java:117) + at com.intellij.openapi.components.impl.ComponentManagerImpl.init(ComponentManagerImpl.java:88) + at com.intellij.openapi.components.impl.stores.ApplicationStoreImpl.load(ApplicationStoreImpl.java:101) + at com.intellij.openapi.application.impl.ApplicationImpl.load(ApplicationImpl.java:507) + at com.intellij.openapi.application.impl.ApplicationImpl.load(ApplicationImpl.java:489) + at com.intellij.idea.IdeaApplication.run(IdeaApplication.java:170) + ... 16 more + Caused by: java.util.MissingResourceException: Can't find bundle for base name org.jetbrains.plugins.sample.PluginSampleBundle, locale en_US + at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1564) + at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1387) + at java.util.ResourceBundle.getBundle(ResourceBundle.java:1082) + at com.intellij.AbstractBundle.getResourceBundle(AbstractBundle.java:91) + at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.a(ActionManagerImpl.java:213) + at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.a(ActionManagerImpl.java:580) + at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.a(ActionManagerImpl.java:980) + at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.a(ActionManagerImpl.java:480) + at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.(ActionManagerImpl.java:144) + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:408) + at org.picocontainer.defaults.InstantiatingComponentAdapter.newInstance(InstantiatingComponentAdapter.java:193) + at org.picocontainer.defaults.ConstructorInjectionComponentAdapter$1.run(ConstructorInjectionComponentAdapter.java:220) + at org.picocontainer.defaults.ThreadLocalCyclicDependencyGuard.observe(ThreadLocalCyclicDependencyGuard.java:53) + at org.picocontainer.defaults.ConstructorInjectionComponentAdapter.getComponentInstance(ConstructorInjectionComponentAdapter.java:248) + at com.intellij.util.pico.ConstructorInjectionComponentAdapter.getComponentInstance(ConstructorInjectionComponentAdapter.java:58) + at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter$1.getComponentInstance(ComponentManagerImpl.java:547) + ... 38 more From 69939f0e8a5b6d5e3ffeeeef818aff59826f4086 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 9 Dec 2014 14:33:09 +0100 Subject: [PATCH 016/104] [md] file location fix --- plugin_sample/resources/rename_error.md | 68 ------------------------- 1 file changed, 68 deletions(-) delete mode 100644 plugin_sample/resources/rename_error.md diff --git a/plugin_sample/resources/rename_error.md b/plugin_sample/resources/rename_error.md deleted file mode 100644 index dedd55ec6..000000000 --- a/plugin_sample/resources/rename_error.md +++ /dev/null @@ -1,68 +0,0 @@ - Internal error. Please report to http://youtrack.jetbrains.com - - java.lang.RuntimeException: com.intellij.ide.plugins.PluginManager$StartupAbortedException: Fatal error initializing 'com.intellij.openapi.actionSystem.ActionManager' - at com.intellij.idea.IdeaApplication.run(IdeaApplication.java:178) - at com.intellij.idea.MainImpl$1$1$1.run(MainImpl.java:64) - at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) - at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744) - at java.awt.EventQueue.access$400(EventQueue.java:97) - at java.awt.EventQueue$3.run(EventQueue.java:697) - at java.awt.EventQueue$3.run(EventQueue.java:691) - at java.security.AccessController.doPrivileged(Native Method) - at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) - at java.awt.EventQueue.dispatchEvent(EventQueue.java:714) - at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:363) - at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) - at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) - at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) - at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) - at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) - at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) - Caused by: com.intellij.ide.plugins.PluginManager$StartupAbortedException: Fatal error initializing 'com.intellij.openapi.actionSystem.ActionManager' - at com.intellij.ide.plugins.PluginManager.handleComponentError(PluginManager.java:248) - at com.intellij.openapi.components.impl.PlatformComponentManagerImpl.handleInitComponentError(PlatformComponentManagerImpl.java:39) - at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter$1.getComponentInstance(ComponentManagerImpl.java:587) - at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter.getComponentInstance(ComponentManagerImpl.java:607) - at com.intellij.util.pico.DefaultPicoContainer.getLocalInstance(DefaultPicoContainer.java:244) - at com.intellij.util.pico.DefaultPicoContainer.getComponentInstance(DefaultPicoContainer.java:210) - at org.picocontainer.defaults.BasicComponentParameter.resolveInstance(BasicComponentParameter.java:77) - at org.picocontainer.defaults.ComponentParameter.resolveInstance(ComponentParameter.java:114) - at org.picocontainer.defaults.ConstructorInjectionComponentAdapter.getConstructorArguments(ConstructorInjectionComponentAdapter.java:257) - at org.picocontainer.defaults.ConstructorInjectionComponentAdapter$1.run(ConstructorInjectionComponentAdapter.java:217) - at org.picocontainer.defaults.ThreadLocalCyclicDependencyGuard.observe(ThreadLocalCyclicDependencyGuard.java:53) - at org.picocontainer.defaults.ConstructorInjectionComponentAdapter.getComponentInstance(ConstructorInjectionComponentAdapter.java:248) - at com.intellij.util.pico.ConstructorInjectionComponentAdapter.getComponentInstance(ConstructorInjectionComponentAdapter.java:58) - at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter$1.getComponentInstance(ComponentManagerImpl.java:547) - at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter.getComponentInstance(ComponentManagerImpl.java:607) - at com.intellij.util.pico.DefaultPicoContainer.getLocalInstance(DefaultPicoContainer.java:244) - at com.intellij.util.pico.DefaultPicoContainer.getComponentInstance(DefaultPicoContainer.java:210) - at com.intellij.openapi.components.impl.ComponentManagerImpl.createComponent(ComponentManagerImpl.java:126) - at com.intellij.openapi.application.impl.ApplicationImpl.createComponent(ApplicationImpl.java:362) - at com.intellij.openapi.components.impl.ComponentManagerImpl.a(ComponentManagerImpl.java:117) - at com.intellij.openapi.components.impl.ComponentManagerImpl.init(ComponentManagerImpl.java:88) - at com.intellij.openapi.components.impl.stores.ApplicationStoreImpl.load(ApplicationStoreImpl.java:101) - at com.intellij.openapi.application.impl.ApplicationImpl.load(ApplicationImpl.java:507) - at com.intellij.openapi.application.impl.ApplicationImpl.load(ApplicationImpl.java:489) - at com.intellij.idea.IdeaApplication.run(IdeaApplication.java:170) - ... 16 more - Caused by: java.util.MissingResourceException: Can't find bundle for base name org.jetbrains.plugins.sample.PluginSampleBundle, locale en_US - at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1564) - at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1387) - at java.util.ResourceBundle.getBundle(ResourceBundle.java:1082) - at com.intellij.AbstractBundle.getResourceBundle(AbstractBundle.java:91) - at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.a(ActionManagerImpl.java:213) - at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.a(ActionManagerImpl.java:580) - at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.a(ActionManagerImpl.java:980) - at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.a(ActionManagerImpl.java:480) - at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.(ActionManagerImpl.java:144) - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) - at java.lang.reflect.Constructor.newInstance(Constructor.java:408) - at org.picocontainer.defaults.InstantiatingComponentAdapter.newInstance(InstantiatingComponentAdapter.java:193) - at org.picocontainer.defaults.ConstructorInjectionComponentAdapter$1.run(ConstructorInjectionComponentAdapter.java:220) - at org.picocontainer.defaults.ThreadLocalCyclicDependencyGuard.observe(ThreadLocalCyclicDependencyGuard.java:53) - at org.picocontainer.defaults.ConstructorInjectionComponentAdapter.getComponentInstance(ConstructorInjectionComponentAdapter.java:248) - at com.intellij.util.pico.ConstructorInjectionComponentAdapter.getComponentInstance(ConstructorInjectionComponentAdapter.java:58) - at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter$1.getComponentInstance(ComponentManagerImpl.java:547) - ... 38 more From 2d63aafd52b5b0168df845b78a91b3f8255cb4e8 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 9 Dec 2014 15:22:52 +0100 Subject: [PATCH 017/104] [code] EditorIllustration action --- editor_basics/resources/META-INF/plugin.xml | 5 +++- .../editor/basics/EditorIllustration.java | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java diff --git a/editor_basics/resources/META-INF/plugin.xml b/editor_basics/resources/META-INF/plugin.xml index 8708b59e7..c919b7e3d 100644 --- a/editor_basics/resources/META-INF/plugin.xml +++ b/editor_basics/resources/META-INF/plugin.xml @@ -25,7 +25,10 @@ - + + + \ No newline at end of file diff --git a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java b/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java new file mode 100644 index 000000000..73f3605ec --- /dev/null +++ b/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java @@ -0,0 +1,23 @@ +package org.jetbrains.plugins.editor.basics; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.LangDataKeys; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; + +/** + * @author Anna Bulenkova + */ +public class EditorIllustration extends AnAction { + @Override + public void actionPerformed(AnActionEvent anActionEvent) { + + } + @Override + public void update(AnActionEvent e) { + final Project project = e.getData(LangDataKeys.PROJECT); + final Editor editor = e.getData(LangDataKeys.EDITOR); + e.getPresentation().setVisible((project != null && editor != null && editor.getSelectionModel().hasSelection())); + } +} From 3e9a8cadf8e389e08b41eefb8c8aeb9f49068242 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 9 Dec 2014 16:59:13 +0100 Subject: [PATCH 018/104] [code] LandDataKeys changes to CommonDataKeys --- .../jetbrains/plugins/editor/basics/EditorIllustration.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java b/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java index 73f3605ec..1ebbbcb3a 100644 --- a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java +++ b/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java @@ -2,7 +2,7 @@ package org.jetbrains.plugins.editor.basics; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.LangDataKeys; +import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; @@ -16,8 +16,8 @@ public class EditorIllustration extends AnAction { } @Override public void update(AnActionEvent e) { - final Project project = e.getData(LangDataKeys.PROJECT); - final Editor editor = e.getData(LangDataKeys.EDITOR); + final Project project = e.getData(CommonDataKeys.PROJECT); + final Editor editor = e.getData(CommonDataKeys.EDITOR); e.getPresentation().setVisible((project != null && editor != null && editor.getSelectionModel().hasSelection())); } } From 8ace7fde95d818711f77c699ea590bb45f2277c3 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 9 Dec 2014 17:26:30 +0100 Subject: [PATCH 019/104] [code + md] getting the active editor --- .../org/jetbrains/plugins/editor/basics/EditorIllustration.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java b/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java index 1ebbbcb3a..f46768a11 100644 --- a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java +++ b/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java @@ -16,8 +16,10 @@ public class EditorIllustration extends AnAction { } @Override public void update(AnActionEvent e) { + //Get required data keys final Project project = e.getData(CommonDataKeys.PROJECT); final Editor editor = e.getData(CommonDataKeys.EDITOR); + //Set visibility only in case of existing project and editor and if some text in the editor is selected e.getPresentation().setVisible((project != null && editor != null && editor.getSelectionModel().hasSelection())); } } From 7a6b8fbf7ce9e64d91f753f6359672f33edcc098 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 9 Dec 2014 17:33:27 +0100 Subject: [PATCH 020/104] cleanup - finals --- .../jetbrains/plugins/editor/basics/EditorIllustration.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java b/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java index f46768a11..0dddd47ef 100644 --- a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java +++ b/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java @@ -11,11 +11,11 @@ import com.intellij.openapi.project.Project; */ public class EditorIllustration extends AnAction { @Override - public void actionPerformed(AnActionEvent anActionEvent) { + public void actionPerformed(final AnActionEvent anActionEvent) { } @Override - public void update(AnActionEvent e) { + public void update(final AnActionEvent e) { //Get required data keys final Project project = e.getData(CommonDataKeys.PROJECT); final Editor editor = e.getData(CommonDataKeys.EDITOR); From abdb63531f0cc2fc27ddcf15bbbf1ae922f7df99 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 9 Dec 2014 18:04:47 +0100 Subject: [PATCH 021/104] [code] Editor - actionPerformed() --- .../editor/basics/EditorIllustration.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java b/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java index 0dddd47ef..77b56c73c 100644 --- a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java +++ b/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java @@ -3,7 +3,10 @@ package org.jetbrains.plugins.editor.basics; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.SelectionModel; import com.intellij.openapi.project.Project; /** @@ -12,7 +15,25 @@ import com.intellij.openapi.project.Project; public class EditorIllustration extends AnAction { @Override public void actionPerformed(final AnActionEvent anActionEvent) { + //Get all the required data from data keys + final Editor editor = anActionEvent.getRequiredData(CommonDataKeys.EDITOR); + final Project project = anActionEvent.getRequiredData(CommonDataKeys.PROJECT); + //Access document, caret, and selection + final Document document = editor.getDocument(); + final SelectionModel selectionModel = editor.getSelectionModel(); + final int start = selectionModel.getSelectionStart(); + final int end = selectionModel.getSelectionEnd(); + //New instance of Runnable to make a replacement + Runnable runnable = new Runnable() { + @Override + public void run() { + document.replaceString(start, end, "Replacement"); + } + }; + //Making the replacement + WriteCommandAction.runWriteCommandAction(project, runnable); + selectionModel.removeSelection(); } @Override public void update(final AnActionEvent e) { From 52da55257d1f0bbb652e08b745f85cb269046792 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Thu, 11 Dec 2014 15:18:00 +0100 Subject: [PATCH 022/104] [code] TypedActionHandler illustration --- .../editor/basics/EditorIllustration.java | 9 +++++++ .../plugins/editor/basics/MyTypedHandler.java | 27 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 editor_basics/src/org/jetbrains/plugins/editor/basics/MyTypedHandler.java diff --git a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java b/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java index 77b56c73c..a77dc4590 100644 --- a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java +++ b/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java @@ -7,12 +7,21 @@ import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.SelectionModel; +import com.intellij.openapi.editor.actionSystem.EditorActionManager; +import com.intellij.openapi.editor.actionSystem.TypedAction; import com.intellij.openapi.project.Project; /** * @author Anna Bulenkova */ public class EditorIllustration extends AnAction { + + static { + final EditorActionManager actionManager = EditorActionManager.getInstance(); + final TypedAction typedAction = actionManager.getTypedAction(); + typedAction.setupHandler(new MyTypedHandler()); + } + @Override public void actionPerformed(final AnActionEvent anActionEvent) { //Get all the required data from data keys diff --git a/editor_basics/src/org/jetbrains/plugins/editor/basics/MyTypedHandler.java b/editor_basics/src/org/jetbrains/plugins/editor/basics/MyTypedHandler.java new file mode 100644 index 000000000..0deb62dc8 --- /dev/null +++ b/editor_basics/src/org/jetbrains/plugins/editor/basics/MyTypedHandler.java @@ -0,0 +1,27 @@ +package org.jetbrains.plugins.editor.basics; + +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.actionSystem.TypedActionHandler; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; + +/** + * @author Anna Bulenkova + */ +public class MyTypedHandler implements TypedActionHandler { + @Override + public void execute(@NotNull Editor editor, char c, @NotNull DataContext dataContext) { + final Document document = editor.getDocument(); + Project project = editor.getProject(); + Runnable runnable = new Runnable() { + @Override + public void run() { + document.insertString(0, "Typed\n"); + } + }; + WriteCommandAction.runWriteCommandAction(project, runnable); + } +} From 19f82bfa378093dd1988b1127ea7098f6771a02e Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Thu, 11 Dec 2014 16:00:50 +0100 Subject: [PATCH 023/104] [code] EditorActionHandler illustration --- editor_basics/resources/META-INF/plugin.xml | 4 +++ .../basics/EditorHandlerIllustration.java | 31 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 editor_basics/src/org/jetbrains/plugins/editor/basics/EditorHandlerIllustration.java diff --git a/editor_basics/resources/META-INF/plugin.xml b/editor_basics/resources/META-INF/plugin.xml index c919b7e3d..c2a0976f2 100644 --- a/editor_basics/resources/META-INF/plugin.xml +++ b/editor_basics/resources/META-INF/plugin.xml @@ -29,6 +29,10 @@ description="Illustrates how to plug an action in"> + + + \ No newline at end of file diff --git a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorHandlerIllustration.java b/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorHandlerIllustration.java new file mode 100644 index 000000000..ae2917bd7 --- /dev/null +++ b/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorHandlerIllustration.java @@ -0,0 +1,31 @@ +package org.jetbrains.plugins.editor.basics; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.actionSystem.IdeActions; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.actionSystem.EditorActionHandler; +import com.intellij.openapi.editor.actionSystem.EditorActionManager; +import com.intellij.openapi.project.Project; + +/** + * @author Anna Bulenkova + */ +public class EditorHandlerIllustration extends AnAction { + @Override + public void actionPerformed(AnActionEvent anActionEvent) { + final Editor editor = anActionEvent.getRequiredData(CommonDataKeys.EDITOR); + EditorActionManager actionManager = EditorActionManager.getInstance(); + //Insert one more caret below the active caret + EditorActionHandler actionHandler = actionManager.getActionHandler(IdeActions.ACTION_EDITOR_CLONE_CARET_BELOW); + actionHandler.execute(editor, editor.getCaretModel().getCurrentCaret(), anActionEvent.getDataContext()); + } + @Override + public void update(final AnActionEvent e) { + //Set visible if at least one caret is available + final Project project = e.getData(CommonDataKeys.PROJECT); + final Editor editor = e.getData(CommonDataKeys.EDITOR); + e.getPresentation().setVisible((project != null && editor != null && !editor.getCaretModel().getAllCarets().isEmpty())); + } +} From 920a40de1e065ec70a14a380908f0ac2bacc604f Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Mon, 15 Dec 2014 10:23:11 +0100 Subject: [PATCH 024/104] [code] Project model stub --- project_model/META-INF/plugin.xml | 30 ++++++++++++++++++++++++++++++ project_model/project_model.iml | 12 ++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 project_model/META-INF/plugin.xml create mode 100644 project_model/project_model.iml diff --git a/project_model/META-INF/plugin.xml b/project_model/META-INF/plugin.xml new file mode 100644 index 000000000..c5911339e --- /dev/null +++ b/project_model/META-INF/plugin.xml @@ -0,0 +1,30 @@ + + org.jetbrains.plugins.sample.ProjectModel + Editor basics + 1.0 + JetBrains + + Project model illustration + + Initial commit + + + + com.intellij.modules.lang + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/project_model/project_model.iml b/project_model/project_model.iml new file mode 100644 index 000000000..4b05d8676 --- /dev/null +++ b/project_model/project_model.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file From 2aea928ffa17e0c0b419547525834928d65393af Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Mon, 15 Dec 2014 12:55:26 +0100 Subject: [PATCH 025/104] [code] Project roots illustration --- project_model/META-INF/plugin.xml | 5 ++- .../project/model/ShowSourceRootsActions.java | 33 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 project_model/src/com/intellij/plugins/project/model/ShowSourceRootsActions.java diff --git a/project_model/META-INF/plugin.xml b/project_model/META-INF/plugin.xml index c5911339e..1fe22e326 100644 --- a/project_model/META-INF/plugin.xml +++ b/project_model/META-INF/plugin.xml @@ -25,6 +25,9 @@ - + + + \ No newline at end of file diff --git a/project_model/src/com/intellij/plugins/project/model/ShowSourceRootsActions.java b/project_model/src/com/intellij/plugins/project/model/ShowSourceRootsActions.java new file mode 100644 index 000000000..aadc92f01 --- /dev/null +++ b/project_model/src/com/intellij/plugins/project/model/ShowSourceRootsActions.java @@ -0,0 +1,33 @@ +package com.intellij.plugins.project.model; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.vfs.VirtualFile; + +/** + * @author Anna Bulenkova + */ +public class ShowSourceRootsActions extends AnAction { + @Override + public void actionPerformed(final AnActionEvent anActionEvent) { + Project project = anActionEvent.getProject(); + if (project == null) return; + String projectName = project.getName(); + StringBuilder sourceRootsList = new StringBuilder(); + VirtualFile[] vFiles = ProjectRootManager.getInstance(project).getContentSourceRoots(); + for (VirtualFile file : vFiles) { + sourceRootsList.append(file.getUrl()).append("\n"); + } + Messages.showInfoMessage("Source roots for the " + projectName + " plugin:\n" + sourceRootsList, "Project Properties"); + } + + @Override + public void update(final AnActionEvent e) { + boolean visibility = e.getProject() != null; + e.getPresentation().setEnabled(visibility); + e.getPresentation().setVisible(visibility); + } +} From f1020ad145eed52a637795887e260b275ca99bdc Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Mon, 15 Dec 2014 14:57:06 +0100 Subject: [PATCH 026/104] [code] Belonging to source root, module, or directory --- project_model/META-INF/plugin.xml | 4 ++ .../model/ProjectFileIndexSampleAction.java | 54 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 project_model/src/com/intellij/plugins/project/model/ProjectFileIndexSampleAction.java diff --git a/project_model/META-INF/plugin.xml b/project_model/META-INF/plugin.xml index 1fe22e326..fe948d7a2 100644 --- a/project_model/META-INF/plugin.xml +++ b/project_model/META-INF/plugin.xml @@ -29,5 +29,9 @@ description="Illustrates how to get source roots"> + + + \ No newline at end of file diff --git a/project_model/src/com/intellij/plugins/project/model/ProjectFileIndexSampleAction.java b/project_model/src/com/intellij/plugins/project/model/ProjectFileIndexSampleAction.java new file mode 100644 index 000000000..a521d7f2e --- /dev/null +++ b/project_model/src/com/intellij/plugins/project/model/ProjectFileIndexSampleAction.java @@ -0,0 +1,54 @@ +package com.intellij.plugins.project.model; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.vfs.VirtualFile; + +/** + * @author Anna Bulenkova + */ +public class ProjectFileIndexSampleAction extends AnAction { + @Override + public void update(final AnActionEvent event) { + Project project = event.getProject(); + final Editor editor = event.getData(CommonDataKeys.EDITOR); + boolean visibility = project != null && editor != null; + event.getPresentation().setEnabledAndVisible(visibility); + } + + @Override + public void actionPerformed(final AnActionEvent event) { + Project project = event.getProject(); + final Editor editor = event.getData(CommonDataKeys.EDITOR); + if (project == null || editor == null) return; + Document document = editor.getDocument(); + FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance(); + VirtualFile virtualFile = fileDocumentManager.getFile(document); + ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex(); + if (virtualFile != null) { + Module module = projectFileIndex.getModuleForFile(virtualFile); + String moduleName; + moduleName = module != null ? module.getName() : "No module defined for file"; + + VirtualFile moduleContentRoot = projectFileIndex.getContentRootForFile(virtualFile); + boolean isLibraryFile = projectFileIndex.isLibraryClassFile(virtualFile); + boolean isInLibraryClasses = projectFileIndex.isInLibraryClasses(virtualFile); + boolean isInLibrarySource = projectFileIndex.isInLibrarySource(virtualFile); + Messages.showInfoMessage("Module: " + moduleName + "\n" + + "Module content root: " + moduleContentRoot + "\n" + + "Is library file: " + isLibraryFile + "\n" + + "Is in library classes" + isInLibraryClasses + + "Is in library source" + isInLibrarySource, + "Main File Info for" + virtualFile.getName()); + } + } +} From e4fdb48ae64e47d431cac62f30edd93c003c88bb Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Mon, 15 Dec 2014 15:25:32 +0100 Subject: [PATCH 027/104] [code] Project sdk sample --- project_model/META-INF/plugin.xml | 4 +++ .../project/model/ProjectSdkAction.java | 33 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 project_model/src/com/intellij/plugins/project/model/ProjectSdkAction.java diff --git a/project_model/META-INF/plugin.xml b/project_model/META-INF/plugin.xml index fe948d7a2..135be9e00 100644 --- a/project_model/META-INF/plugin.xml +++ b/project_model/META-INF/plugin.xml @@ -29,6 +29,10 @@ description="Illustrates how to get source roots"> + + + diff --git a/project_model/src/com/intellij/plugins/project/model/ProjectSdkAction.java b/project_model/src/com/intellij/plugins/project/model/ProjectSdkAction.java new file mode 100644 index 000000000..b4c416771 --- /dev/null +++ b/project_model/src/com/intellij/plugins/project/model/ProjectSdkAction.java @@ -0,0 +1,33 @@ +package com.intellij.plugins.project.model; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.ui.Messages; + +/** + * @author Anna Bulenkova + */ +public class ProjectSdkAction extends AnAction { + @Override + public void actionPerformed(final AnActionEvent e) { + Project project = e.getProject(); + if (project != null) { + String projectSDKName = ProjectRootManager.getInstance(project).getProjectSdkName(); + String newProjectSdkName = "New Sdk Name"; + ProjectRootManager.getInstance(project).setProjectSdkName(newProjectSdkName); + Messages.showInfoMessage(projectSDKName + " has changed to " + newProjectSdkName, "Project Sdk Info"); + } + } + + @Override + public void update(final AnActionEvent e) { + Project project = e.getProject(); + if (project != null) { + Sdk sdk = ProjectRootManager.getInstance(project).getProjectSdk(); + e.getPresentation().setEnabledAndVisible(sdk != null); + } + } +} From 36453ed153b7f3e5815c91537cff7453dde04748 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 16 Dec 2014 15:21:02 +0100 Subject: [PATCH 028/104] [code] Project modification --- project_model/META-INF/plugin.xml | 4 ++ .../project/model/ModificationAction.java | 47 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 project_model/src/com/intellij/plugins/project/model/ModificationAction.java diff --git a/project_model/META-INF/plugin.xml b/project_model/META-INF/plugin.xml index 135be9e00..79b2d2a00 100644 --- a/project_model/META-INF/plugin.xml +++ b/project_model/META-INF/plugin.xml @@ -37,5 +37,9 @@ description="Illustrates how to get source roots"> + + + \ No newline at end of file diff --git a/project_model/src/com/intellij/plugins/project/model/ModificationAction.java b/project_model/src/com/intellij/plugins/project/model/ModificationAction.java new file mode 100644 index 000000000..fa61936ef --- /dev/null +++ b/project_model/src/com/intellij/plugins/project/model/ModificationAction.java @@ -0,0 +1,47 @@ +package com.intellij.plugins.project.model; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.roots.ModuleRootModificationUtil; +import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.pom.Navigatable; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiFile; + +/** + * @author Anna Bulenkova + */ +public class ModificationAction extends AnAction { + @Override + public void actionPerformed(final AnActionEvent event) { + Project project = event.getProject(); + if (project == null) return; + Navigatable element = event.getData(CommonDataKeys.NAVIGATABLE); + if (element instanceof PsiClass) { + PsiFile file = ((PsiClass) element).getContainingFile(); + if (file == null) return; + final VirtualFile virtualFile = file.getVirtualFile(); + if (virtualFile == null) return; + final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); + final Module module = fileIndex.getModuleForFile(virtualFile); + if (module == null) return; + if (!ModuleRootManager.getInstance(module).getFileIndex().isInContent(virtualFile)) { + ModuleRootModificationUtil.addModuleLibrary(module, virtualFile.getUrl()); + } + } + + } + + @Override + public void update(final AnActionEvent event) { + Project project = event.getProject(); + Navigatable element = event.getData(CommonDataKeys.NAVIGATABLE); + event.getPresentation().setEnabledAndVisible(project != null && element != null); + } +} From bb6d645146908473a1c30150f61aa0363d9b62a0 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Wed, 17 Dec 2014 13:26:34 +0100 Subject: [PATCH 029/104] [code] Libraries sample --- project_model/META-INF/plugin.xml | 82 +++++++++++-------- .../project/model/LibrariesAction.java | 62 ++++++++++++++ 2 files changed, 108 insertions(+), 36 deletions(-) create mode 100644 project_model/src/com/intellij/plugins/project/model/LibrariesAction.java diff --git a/project_model/META-INF/plugin.xml b/project_model/META-INF/plugin.xml index 79b2d2a00..4f8fa8ffa 100644 --- a/project_model/META-INF/plugin.xml +++ b/project_model/META-INF/plugin.xml @@ -1,45 +1,55 @@ - org.jetbrains.plugins.sample.ProjectModel - Editor basics - 1.0 - JetBrains + org.jetbrains.plugins.sample.ProjectModel + Editor basics + 1.0 + JetBrains - Project model illustration + Project model illustration - Initial commit + Initial commit - - - com.intellij.modules.lang + + + com.intellij.modules.lang - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/project_model/src/com/intellij/plugins/project/model/LibrariesAction.java b/project_model/src/com/intellij/plugins/project/model/LibrariesAction.java new file mode 100644 index 000000000..85caba27f --- /dev/null +++ b/project_model/src/com/intellij/plugins/project/model/LibrariesAction.java @@ -0,0 +1,62 @@ +package com.intellij.plugins.project.model; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.*; +import com.intellij.openapi.roots.libraries.Library; +import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.pom.Navigatable; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiFile; + +/** + * @author Anna Bulenkova + */ +public class LibrariesAction extends AnAction { + @Override + public void update(final AnActionEvent event) { + Project project = event.getProject(); + if (project == null) return; + Navigatable element = event.getData(CommonDataKeys.NAVIGATABLE); + if (element instanceof PsiClass) { + PsiFile psiFile = ((PsiClass) element).getContainingFile(); + if (psiFile == null) return; + VirtualFile virtualFile = psiFile.getVirtualFile(); + if (virtualFile == null) return; + event.getPresentation().setEnabledAndVisible(true); + } + } + + @Override + public void actionPerformed(AnActionEvent event) { + Project project = event.getProject(); + if (project == null) return; + Navigatable element = event.getData(CommonDataKeys.NAVIGATABLE); + if (element instanceof PsiClass) { + PsiFile psiFile = ((PsiClass) element).getContainingFile(); + if (psiFile == null) return; + VirtualFile virtualFile = psiFile.getVirtualFile(); + if (virtualFile == null) return; + final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); + StringBuilder jars = new StringBuilder(); + for (OrderEntry orderEntry : fileIndex.getOrderEntriesForFile(virtualFile)) { + if (orderEntry instanceof LibraryOrderEntry) { + final LibraryOrderEntry libraryEntry = (LibraryOrderEntry) orderEntry; + final Library library = libraryEntry.getLibrary(); + if (library == null) continue; + VirtualFile[] files = library.getFiles(OrderRootType.CLASSES); + if (files.length == 0) continue; + for (VirtualFile jar : files) { + jars.append(jar.getName()).append(", "); + } + } + } + if (jars.length() > 0) { + Messages.showInfoMessage("Libraries for file " + virtualFile.getName() + ": " + jars.toString(), "Libraries Info"); + } + } + } +} From 2d017152fba71eb618ed236ec13bf40b41fb4882 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Fri, 19 Dec 2014 12:28:09 +0100 Subject: [PATCH 030/104] [code] facets basics stub --- facet_basics/META-INF/plugin.xml | 43 ++++++++++++++++++++++++++++++++ facet_basics/facet_basics.iml | 12 +++++++++ 2 files changed, 55 insertions(+) create mode 100644 facet_basics/META-INF/plugin.xml create mode 100644 facet_basics/facet_basics.iml diff --git a/facet_basics/META-INF/plugin.xml b/facet_basics/META-INF/plugin.xml new file mode 100644 index 000000000..01841ba44 --- /dev/null +++ b/facet_basics/META-INF/plugin.xml @@ -0,0 +1,43 @@ + + com.yourcompany.unique.plugin.id + Plugin display name here + 1.0 + YourCompany + + + most HTML tags may be used + ]]> + + + most HTML tags may be used + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/facet_basics/facet_basics.iml b/facet_basics/facet_basics.iml new file mode 100644 index 000000000..8ab62dee5 --- /dev/null +++ b/facet_basics/facet_basics.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file From 2ae2828aad626424e62c1944669dafa64738e7de Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Mon, 29 Dec 2014 13:12:14 +0100 Subject: [PATCH 031/104] [code] Logical and visual positions, offset --- editor_basics/resources/META-INF/plugin.xml | 4 +++ .../editor/basics/EditorAreaIllustration.java | 32 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 editor_basics/src/org/jetbrains/plugins/editor/basics/EditorAreaIllustration.java diff --git a/editor_basics/resources/META-INF/plugin.xml b/editor_basics/resources/META-INF/plugin.xml index c2a0976f2..bda6329d8 100644 --- a/editor_basics/resources/META-INF/plugin.xml +++ b/editor_basics/resources/META-INF/plugin.xml @@ -33,6 +33,10 @@ description="Illustrates how to plug an action in"> + + + \ No newline at end of file diff --git a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorAreaIllustration.java b/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorAreaIllustration.java new file mode 100644 index 000000000..49d9de1f0 --- /dev/null +++ b/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorAreaIllustration.java @@ -0,0 +1,32 @@ +package org.jetbrains.plugins.editor.basics; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.editor.*; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.Messages; + +/** + * @author Anna Bulenkova + */ +public class EditorAreaIllustration extends AnAction { + @Override + public void actionPerformed(AnActionEvent anActionEvent) { + final Editor editor = anActionEvent.getRequiredData(CommonDataKeys.EDITOR); + CaretModel caretModel = editor.getCaretModel(); + LogicalPosition logicalPosition = caretModel.getLogicalPosition(); + VisualPosition visualPosition = caretModel.getVisualPosition(); + int offset = caretModel.getOffset(); + Messages.showInfoMessage("Logical position: " + logicalPosition.toString() + "\n" + + "Visual position: " + visualPosition.toString() + "\n" + + "Offset: " + offset, "Caret Parameters Inside The Editor"); + } + + @Override + public void update(AnActionEvent e) { + final Project project = e.getData(CommonDataKeys.PROJECT); + final Editor editor = e.getData(CommonDataKeys.EDITOR); + e.getPresentation().setVisible(project != null && editor != null); + } +} From 0c4e9a11d32a1633b227b1626087bf6bff7a7bbc Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Mon, 29 Dec 2014 13:35:17 +0100 Subject: [PATCH 032/104] [code] Message formatting fixed --- .../plugins/editor/basics/EditorAreaIllustration.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorAreaIllustration.java b/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorAreaIllustration.java index 49d9de1f0..2f5cffc0f 100644 --- a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorAreaIllustration.java +++ b/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorAreaIllustration.java @@ -18,8 +18,8 @@ public class EditorAreaIllustration extends AnAction { LogicalPosition logicalPosition = caretModel.getLogicalPosition(); VisualPosition visualPosition = caretModel.getVisualPosition(); int offset = caretModel.getOffset(); - Messages.showInfoMessage("Logical position: " + logicalPosition.toString() + "\n" + - "Visual position: " + visualPosition.toString() + "\n" + + Messages.showInfoMessage(logicalPosition.toString() + "\n" + + visualPosition.toString() + "\n" + "Offset: " + offset, "Caret Parameters Inside The Editor"); } From c61fe28a388fec3e84b9cd708fc0a09ed642bcf6 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 30 Dec 2014 13:57:13 +0100 Subject: [PATCH 033/104] Custom tree structure provider stub --- .../sample/CustomTreeStructureProvider.java | 27 ++++++++++++++++ tree_structure_provider/META-INF/plugin.xml | 31 +++++++++++++++++++ .../tree_structure_provider.iml | 12 +++++++ 3 files changed, 70 insertions(+) create mode 100644 plugin_sample/src/org/jetbrains/plugins/sample/CustomTreeStructureProvider.java create mode 100644 tree_structure_provider/META-INF/plugin.xml create mode 100644 tree_structure_provider/tree_structure_provider.iml diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/CustomTreeStructureProvider.java b/plugin_sample/src/org/jetbrains/plugins/sample/CustomTreeStructureProvider.java new file mode 100644 index 000000000..ed2d5c310 --- /dev/null +++ b/plugin_sample/src/org/jetbrains/plugins/sample/CustomTreeStructureProvider.java @@ -0,0 +1,27 @@ +package org.jetbrains.plugins.sample; + +import com.intellij.ide.projectView.TreeStructureProvider; +import com.intellij.ide.projectView.ViewSettings; +import com.intellij.ide.util.treeView.AbstractTreeNode; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.Collections; + +/** + * @author Anna Bulenkova + */ +public class CustomTreeStructureProvider implements TreeStructureProvider { + @NotNull + @Override + public Collection modify(@NotNull AbstractTreeNode abstractTreeNode, @NotNull Collection collection, ViewSettings viewSettings) { + return Collections.emptyList(); + } + + @Nullable + @Override + public Object getData(Collection collection, String s) { + return null; + } +} diff --git a/tree_structure_provider/META-INF/plugin.xml b/tree_structure_provider/META-INF/plugin.xml new file mode 100644 index 000000000..e4498d56d --- /dev/null +++ b/tree_structure_provider/META-INF/plugin.xml @@ -0,0 +1,31 @@ + + org.jetbrains.plugins.sample.TreeStructure + Tree Structure Provider Demo + 1.0 + JetBrains + + Tree Structure Provider Demo + + Initial commit + + + + com.intellij.modules.lang + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tree_structure_provider/tree_structure_provider.iml b/tree_structure_provider/tree_structure_provider.iml new file mode 100644 index 000000000..8ab62dee5 --- /dev/null +++ b/tree_structure_provider/tree_structure_provider.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file From 3ec7054a89cbd3f2cb0cc743fe22fc72eaa33004 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Fri, 2 Jan 2015 12:45:00 +0100 Subject: [PATCH 034/104] Module tzpe fixed --- tree_structure_provider/tree_structure_provider.iml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tree_structure_provider/tree_structure_provider.iml b/tree_structure_provider/tree_structure_provider.iml index 8ab62dee5..32a4474ae 100644 --- a/tree_structure_provider/tree_structure_provider.iml +++ b/tree_structure_provider/tree_structure_provider.iml @@ -1,12 +1,12 @@ - + - + \ No newline at end of file From 30411d8d381b9a30833467515f3ed74d31f730ce Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Fri, 2 Jan 2015 12:46:03 +0100 Subject: [PATCH 035/104] Module type fix --- project_model/project_model.iml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_model/project_model.iml b/project_model/project_model.iml index 4b05d8676..de3c6c143 100644 --- a/project_model/project_model.iml +++ b/project_model/project_model.iml @@ -1,5 +1,5 @@ - + From 70e125cf4e18999948b7247abd1eb4fef61a4e65 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Fri, 2 Jan 2015 13:08:43 +0100 Subject: [PATCH 036/104] [code] custom tree structure provider stub --- tree_structure_provider/META-INF/plugin.xml | 2 +- .../plugins/sample/tree}/CustomTreeStructureProvider.java | 4 ++-- tree_structure_provider/tree_structure_provider.iml | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) rename {plugin_sample/src/org/jetbrains/plugins/sample => tree_structure_provider/scr/org/jetbrains/plugins/sample/tree}/CustomTreeStructureProvider.java (82%) diff --git a/tree_structure_provider/META-INF/plugin.xml b/tree_structure_provider/META-INF/plugin.xml index e4498d56d..84a10e209 100644 --- a/tree_structure_provider/META-INF/plugin.xml +++ b/tree_structure_provider/META-INF/plugin.xml @@ -13,7 +13,7 @@ com.intellij.modules.lang - + diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/CustomTreeStructureProvider.java b/tree_structure_provider/scr/org/jetbrains/plugins/sample/tree/CustomTreeStructureProvider.java similarity index 82% rename from plugin_sample/src/org/jetbrains/plugins/sample/CustomTreeStructureProvider.java rename to tree_structure_provider/scr/org/jetbrains/plugins/sample/tree/CustomTreeStructureProvider.java index ed2d5c310..75cf50a37 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/CustomTreeStructureProvider.java +++ b/tree_structure_provider/scr/org/jetbrains/plugins/sample/tree/CustomTreeStructureProvider.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.sample; +package org.jetbrains.plugins.sample.tree; import com.intellij.ide.projectView.TreeStructureProvider; import com.intellij.ide.projectView.ViewSettings; @@ -15,7 +15,7 @@ import java.util.Collections; public class CustomTreeStructureProvider implements TreeStructureProvider { @NotNull @Override - public Collection modify(@NotNull AbstractTreeNode abstractTreeNode, @NotNull Collection collection, ViewSettings viewSettings) { + public Collection modify(@NotNull AbstractTreeNode parent, @NotNull Collection children, ViewSettings viewSettings) { return Collections.emptyList(); } diff --git a/tree_structure_provider/tree_structure_provider.iml b/tree_structure_provider/tree_structure_provider.iml index 32a4474ae..e04b79911 100644 --- a/tree_structure_provider/tree_structure_provider.iml +++ b/tree_structure_provider/tree_structure_provider.iml @@ -5,6 +5,7 @@ + From f8d8bd568068c042ee3fc20c6f586802262c6b38 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Fri, 2 Jan 2015 13:23:17 +0100 Subject: [PATCH 037/104] module type changed --- facet_basics/facet_basics.iml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/facet_basics/facet_basics.iml b/facet_basics/facet_basics.iml index 8ab62dee5..32a4474ae 100644 --- a/facet_basics/facet_basics.iml +++ b/facet_basics/facet_basics.iml @@ -1,12 +1,12 @@ - + - + \ No newline at end of file From 1d608a3cfd380a8c46b6e25955e705ec7e2a432e Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Mon, 5 Jan 2015 13:20:24 +0100 Subject: [PATCH 038/104] [code] TreeStructureProvider example --- tree_structure_provider/META-INF/plugin.xml | 2 +- .../tree/CustomTreeStructureProvider.java | 27 ------------- .../tree/TextOnlyTreeStructureProvider.java | 40 +++++++++++++++++++ 3 files changed, 41 insertions(+), 28 deletions(-) delete mode 100644 tree_structure_provider/scr/org/jetbrains/plugins/sample/tree/CustomTreeStructureProvider.java create mode 100644 tree_structure_provider/scr/org/jetbrains/plugins/sample/tree/TextOnlyTreeStructureProvider.java diff --git a/tree_structure_provider/META-INF/plugin.xml b/tree_structure_provider/META-INF/plugin.xml index 84a10e209..cd4c1f7e3 100644 --- a/tree_structure_provider/META-INF/plugin.xml +++ b/tree_structure_provider/META-INF/plugin.xml @@ -13,7 +13,7 @@ com.intellij.modules.lang - + diff --git a/tree_structure_provider/scr/org/jetbrains/plugins/sample/tree/CustomTreeStructureProvider.java b/tree_structure_provider/scr/org/jetbrains/plugins/sample/tree/CustomTreeStructureProvider.java deleted file mode 100644 index 75cf50a37..000000000 --- a/tree_structure_provider/scr/org/jetbrains/plugins/sample/tree/CustomTreeStructureProvider.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.jetbrains.plugins.sample.tree; - -import com.intellij.ide.projectView.TreeStructureProvider; -import com.intellij.ide.projectView.ViewSettings; -import com.intellij.ide.util.treeView.AbstractTreeNode; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Collection; -import java.util.Collections; - -/** - * @author Anna Bulenkova - */ -public class CustomTreeStructureProvider implements TreeStructureProvider { - @NotNull - @Override - public Collection modify(@NotNull AbstractTreeNode parent, @NotNull Collection children, ViewSettings viewSettings) { - return Collections.emptyList(); - } - - @Nullable - @Override - public Object getData(Collection collection, String s) { - return null; - } -} diff --git a/tree_structure_provider/scr/org/jetbrains/plugins/sample/tree/TextOnlyTreeStructureProvider.java b/tree_structure_provider/scr/org/jetbrains/plugins/sample/tree/TextOnlyTreeStructureProvider.java new file mode 100644 index 000000000..d97f975c8 --- /dev/null +++ b/tree_structure_provider/scr/org/jetbrains/plugins/sample/tree/TextOnlyTreeStructureProvider.java @@ -0,0 +1,40 @@ +package org.jetbrains.plugins.sample.tree; + +import com.intellij.ide.projectView.TreeStructureProvider; +import com.intellij.ide.projectView.ViewSettings; +import com.intellij.ide.projectView.impl.nodes.PsiFileNode; +import com.intellij.ide.util.treeView.AbstractTreeNode; +import com.intellij.openapi.fileTypes.PlainTextFileType; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collection; + +/** + * @author Anna Bulenkova + */ +public class TextOnlyTreeStructureProvider implements TreeStructureProvider { + @NotNull + @Override + public Collection modify(@NotNull AbstractTreeNode parent, @NotNull Collection children, ViewSettings settings) { + ArrayList nodes = new ArrayList(); + for (AbstractTreeNode child : children) { + if (child instanceof PsiFileNode) { + VirtualFile file = ((PsiFileNode) child).getVirtualFile(); + if (file != null && !file.isDirectory() && !(file.getFileType() instanceof PlainTextFileType)) { + continue; + } + } + nodes.add(child); + } + return nodes; + } + + @Nullable + @Override + public Object getData(Collection collection, String s) { + return null; + } +} \ No newline at end of file From ac0668b84c65db81cd8445d662699735eb351b0e Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Thu, 8 Jan 2015 11:28:30 +0100 Subject: [PATCH 039/104] [code] project view pain stub --- project_view_pane/META-INF/plugin.xml | 29 +++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 project_view_pane/META-INF/plugin.xml diff --git a/project_view_pane/META-INF/plugin.xml b/project_view_pane/META-INF/plugin.xml new file mode 100644 index 000000000..758cf6ae1 --- /dev/null +++ b/project_view_pane/META-INF/plugin.xml @@ -0,0 +1,29 @@ + + org.jetbrains.plugins.sample.ProjectViewPane + Project View Pain Demo + 1.0 + JetBrains + + Project View Pain Demo + + Initial commit + + + + com.intellij.modules.lang + + + + + + + + + + + + + + + + \ No newline at end of file From d528124603d1bc509a0f0c527dd58fc47bb917a6 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Thu, 8 Jan 2015 11:29:32 +0100 Subject: [PATCH 040/104] [code] missing file --- project_view_pane/project_view_pane.iml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 project_view_pane/project_view_pane.iml diff --git a/project_view_pane/project_view_pane.iml b/project_view_pane/project_view_pane.iml new file mode 100644 index 000000000..8ab62dee5 --- /dev/null +++ b/project_view_pane/project_view_pane.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file From db119ed97b6bcaedacb88d76315da761a3d23c7e Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Thu, 8 Jan 2015 12:50:14 +0100 Subject: [PATCH 041/104] [code] module type corrected --- project_view_pane/project_view_pane.iml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_view_pane/project_view_pane.iml b/project_view_pane/project_view_pane.iml index 8ab62dee5..de3c6c143 100644 --- a/project_view_pane/project_view_pane.iml +++ b/project_view_pane/project_view_pane.iml @@ -1,5 +1,5 @@ - + From 44ace5ba8d6e26c80c7ee5586ee514912f88c301 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Thu, 8 Jan 2015 13:53:02 +0100 Subject: [PATCH 042/104] [code] custom project view pane - filtering images --- project_view_pane/META-INF/plugin.xml | 1 + .../sample/pane/ImagesProjectNode.java | 171 ++++++++++++++++++ .../sample/pane/ImagesProjectViewPane.java | 109 +++++++++++ 3 files changed, 281 insertions(+) create mode 100644 project_view_pane/src/org/jetbrains/plugins/sample/pane/ImagesProjectNode.java create mode 100644 project_view_pane/src/org/jetbrains/plugins/sample/pane/ImagesProjectViewPane.java diff --git a/project_view_pane/META-INF/plugin.xml b/project_view_pane/META-INF/plugin.xml index 758cf6ae1..9121c0ff1 100644 --- a/project_view_pane/META-INF/plugin.xml +++ b/project_view_pane/META-INF/plugin.xml @@ -13,6 +13,7 @@ com.intellij.modules.lang + diff --git a/project_view_pane/src/org/jetbrains/plugins/sample/pane/ImagesProjectNode.java b/project_view_pane/src/org/jetbrains/plugins/sample/pane/ImagesProjectNode.java new file mode 100644 index 000000000..43ea9f838 --- /dev/null +++ b/project_view_pane/src/org/jetbrains/plugins/sample/pane/ImagesProjectNode.java @@ -0,0 +1,171 @@ +package org.jetbrains.plugins.sample.pane; + +import com.intellij.icons.AllIcons; +import com.intellij.ide.projectView.PresentationData; +import com.intellij.ide.projectView.ProjectView; +import com.intellij.ide.projectView.impl.ProjectViewImpl; +import com.intellij.ide.util.treeView.AbstractTreeNode; +import com.intellij.openapi.Disposable; +import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileAdapter; +import com.intellij.openapi.vfs.VirtualFileEvent; +import com.intellij.psi.search.FilenameIndex; +import com.intellij.util.Alarm; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import java.util.*; + +/** + * @author Anna Bulenkova + */ +public class ImagesProjectNode extends AbstractTreeNode { + private static final Key> IMAGES_PROJECT_DIRS = Key.create("images.files.or.directories"); + + public ImagesProjectNode(final Project project) { + super(project, project.getBaseDir()); + scanImages(project); + + subscribeToVFS(project); + } + + public ImagesProjectNode(Project project, VirtualFile file) { + super(project, file); + } + + private void scanImages(Project project) { + addAllByExt(project, "png"); + addAllByExt(project, "jpg"); + } + + private void addAllByExt(Project project, String ext) { + final Set imagesFiles = getImagesFiles(project); + final VirtualFile projectDir = project.getBaseDir(); + for (VirtualFile file : FilenameIndex.getAllFilesByExt(project, ext)) { + while (file != null && !file.equals(projectDir)) { + imagesFiles.add(file); + file = file.getParent(); + } + } + } + + @NotNull + private Set getImagesFiles(Project project) { + Set files = project.getUserData(IMAGES_PROJECT_DIRS); + if (files == null) { + files = new HashSet(); + project.putUserData(IMAGES_PROJECT_DIRS, files); + } + return files; + } + + @Override + protected VirtualFile getVirtualFile() { + return getValue(); + } + + @NotNull + @Override + public Collection getChildren() { + final List files = new ArrayList(0); + for (VirtualFile file : getValue().getChildren()) { + if (getImagesFiles(myProject).contains(file)) { + files.add(file); + } + } + if (files.isEmpty()) return Collections.emptyList(); + final List nodes = new ArrayList(files.size()); + final boolean alwaysOnTop = ((ProjectViewImpl) ProjectView.getInstance(myProject)).isFoldersAlwaysOnTop(); + Collections.sort(files, new Comparator() { + @Override + public int compare(VirtualFile o1, VirtualFile o2) { + if (alwaysOnTop) { + final boolean d1 = o1.isDirectory(); + final boolean d2 = o2.isDirectory(); + if (d1 && !d2) return -1; + if (!d1 && d2) return 1; + } + + return StringUtil.naturalCompare(o1.getName(), o2.getName()); + } + }); + for (VirtualFile file : files) { + nodes.add(new ImagesProjectNode(myProject, file)); + } + return nodes; + } + + @Override + protected void update(PresentationData data) { + data.setIcon(getValue().isDirectory() ? AllIcons.Nodes.Folder : getValue().getFileType().getIcon()); + data.setPresentableText(getValue().getName()); + } + + + @Override + public boolean canNavigate() { + return !getValue().isDirectory(); + } + + @Override + public boolean canNavigateToSource() { + return canNavigate(); + } + + @Override + public void navigate(boolean requestFocus) { + FileEditorManager.getInstance(myProject).openFile(getValue(), false); + } + + private void subscribeToVFS(final Project project) { + final Alarm alarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, project); + LocalFileSystem.getInstance().addVirtualFileListener(new VirtualFileAdapter() { + { + final VirtualFileAdapter me = this; + Disposer.register(project, new Disposable() { + @Override + public void dispose() { + LocalFileSystem.getInstance().removeVirtualFileListener(me); + } + }); + } + + @Override + public void fileCreated(@NotNull VirtualFileEvent event) { + handle(event); + } + + @Override + public void fileDeleted(@NotNull VirtualFileEvent event) { + handle(event); + } + + void handle(VirtualFileEvent event) { + final String filename = event.getFileName().toLowerCase(); + if (filename.endsWith(".png") || filename.endsWith(".jpg")) { + alarm.cancelAllRequests(); + alarm.addRequest(new Runnable() { + public void run() { + getImagesFiles(project).clear(); + scanImages(project); + //noinspection SSBasedInspection + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + ProjectView.getInstance(myProject).getProjectViewPaneById(ImagesProjectViewPane.ID).updateFromRoot(true); + } + }); + } + }, 1000); + } + } + }); + } +} + diff --git a/project_view_pane/src/org/jetbrains/plugins/sample/pane/ImagesProjectViewPane.java b/project_view_pane/src/org/jetbrains/plugins/sample/pane/ImagesProjectViewPane.java new file mode 100644 index 000000000..7d5d902ed --- /dev/null +++ b/project_view_pane/src/org/jetbrains/plugins/sample/pane/ImagesProjectViewPane.java @@ -0,0 +1,109 @@ +package org.jetbrains.plugins.sample.pane; + +import com.intellij.icons.AllIcons; +import com.intellij.ide.SelectInTarget; +import com.intellij.ide.impl.ProjectViewSelectInTarget; +import com.intellij.ide.projectView.ViewSettings; +import com.intellij.ide.projectView.impl.AbstractProjectViewPSIPane; +import com.intellij.ide.projectView.impl.ProjectAbstractTreeStructureBase; +import com.intellij.ide.projectView.impl.ProjectTreeStructure; +import com.intellij.ide.projectView.impl.ProjectViewTree; +import com.intellij.ide.util.treeView.AbstractTreeBuilder; +import com.intellij.ide.util.treeView.AbstractTreeNode; +import com.intellij.ide.util.treeView.AbstractTreeUpdater; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeModel; + +/** + * @author Anna Bulenkova + */ +public class ImagesProjectViewPane extends AbstractProjectViewPSIPane { + public static final String ID = "IMAGES"; + + protected ImagesProjectViewPane(Project project) { + super(project); + } + + @Override + public String getTitle() { + return "Images"; + } + + @Override + public javax.swing.Icon getIcon() { + return AllIcons.FileTypes.Custom; + } + + @NotNull + @Override + public String getId() { + return ID; + } + + @Override + public int getWeight() { + return 10; + } + + @Override + public SelectInTarget createSelectInTarget() { + return new ProjectViewSelectInTarget(myProject) { + + @Override + public String toString() { + return "images"; + } + + @Nullable + @Override + public String getMinorViewId() { + return "images"; + } + + @Override + public float getWeight() { + return 10; + } + }; + } + + @Override + protected ProjectAbstractTreeStructureBase createStructure() { + return new ProjectTreeStructure(myProject, ID) { + @Override + protected AbstractTreeNode createRoot(Project project, ViewSettings settings) { + return new ImagesProjectNode(project); + } + + @Override + public Object[] getChildElements(Object element) { + return super.getChildElements(element); + } + }; + } + + @Override + protected ProjectViewTree createTree(DefaultTreeModel model) { + return new ProjectViewTree(myProject, model) { + @Override + public DefaultMutableTreeNode getSelectedNode() { + return ImagesProjectViewPane.this.getSelectedNode(); + } + + @Override + public boolean isRootVisible() { + return true; + } + }; + } + + @Override + protected AbstractTreeUpdater createTreeUpdater(AbstractTreeBuilder builder) { + return new AbstractTreeUpdater(builder); + } +} + From 5a5fd57851235860d7c98ee570118599816c8ee5 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Mon, 19 Jan 2015 09:57:15 +0100 Subject: [PATCH 043/104] [code] custom actions moved on top for better screen shots --- editor_basics/resources/META-INF/plugin.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/editor_basics/resources/META-INF/plugin.xml b/editor_basics/resources/META-INF/plugin.xml index bda6329d8..2e845ffa1 100644 --- a/editor_basics/resources/META-INF/plugin.xml +++ b/editor_basics/resources/META-INF/plugin.xml @@ -27,15 +27,15 @@ - + - + - + From e424535c32ab4c2763d6b7073c0ee1335a79b261 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Mon, 19 Jan 2015 14:18:05 +0100 Subject: [PATCH 044/104] [code] module name corrected --- plugin_sample/{PluginSample.iml => plugin_sample.iml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename plugin_sample/{PluginSample.iml => plugin_sample.iml} (100%) diff --git a/plugin_sample/PluginSample.iml b/plugin_sample/plugin_sample.iml similarity index 100% rename from plugin_sample/PluginSample.iml rename to plugin_sample/plugin_sample.iml From 4dd2722c607e590bfd6f6f106630e574bd07df83 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Mon, 19 Jan 2015 14:28:27 +0100 Subject: [PATCH 045/104] [code] register actions stub (this part needs to be extracted) --- register_actions/META-INF/plugin.xml | 37 +++++++++++++++++++++++++++ register_actions/register_actions.iml | 12 +++++++++ 2 files changed, 49 insertions(+) create mode 100644 register_actions/META-INF/plugin.xml create mode 100644 register_actions/register_actions.iml diff --git a/register_actions/META-INF/plugin.xml b/register_actions/META-INF/plugin.xml new file mode 100644 index 000000000..12a5e9254 --- /dev/null +++ b/register_actions/META-INF/plugin.xml @@ -0,0 +1,37 @@ + + org.jetbrains.plugins.sample.RegisterActions + Sample plugin for working with IntelliJ Action System + 1.0 + JetBrains + + Illustration of Action System + + Initial commit + + + + com.intellij.modules.lang + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/register_actions/register_actions.iml b/register_actions/register_actions.iml new file mode 100644 index 000000000..8ab62dee5 --- /dev/null +++ b/register_actions/register_actions.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file From 105146512335baa5e8db2c90ef150a094045024c Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Mon, 19 Jan 2015 14:30:48 +0100 Subject: [PATCH 046/104] [code] spelling --- editor_basics/resources/META-INF/plugin.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editor_basics/resources/META-INF/plugin.xml b/editor_basics/resources/META-INF/plugin.xml index 2e845ffa1..9aae58e91 100644 --- a/editor_basics/resources/META-INF/plugin.xml +++ b/editor_basics/resources/META-INF/plugin.xml @@ -4,7 +4,7 @@ 1.0 JetBrains - Illustration editor basics + Illustration of Editor's basics Initial commit From 9868eb9242b6cd2b3f7a9c95c1bd4fef52bd9270 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Mon, 19 Jan 2015 14:35:28 +0100 Subject: [PATCH 047/104] [code] package structure changed --- editor_basics/resources/META-INF/plugin.xml | 6 +++--- .../editor/basics/EditorAreaIllustration.java | 2 +- .../editor/basics/EditorHandlerIllustration.java | 2 +- .../editor/basics/EditorIllustration.java | 2 +- .../editor/basics/MyTypedHandler.java | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) rename editor_basics/src/org/jetbrains/{plugins => tutorials}/editor/basics/EditorAreaIllustration.java (96%) rename editor_basics/src/org/jetbrains/{plugins => tutorials}/editor/basics/EditorHandlerIllustration.java (96%) rename editor_basics/src/org/jetbrains/{plugins => tutorials}/editor/basics/EditorIllustration.java (98%) rename editor_basics/src/org/jetbrains/{plugins => tutorials}/editor/basics/MyTypedHandler.java (95%) diff --git a/editor_basics/resources/META-INF/plugin.xml b/editor_basics/resources/META-INF/plugin.xml index 9aae58e91..b25400a7d 100644 --- a/editor_basics/resources/META-INF/plugin.xml +++ b/editor_basics/resources/META-INF/plugin.xml @@ -25,15 +25,15 @@ - - - diff --git a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorAreaIllustration.java b/editor_basics/src/org/jetbrains/tutorials/editor/basics/EditorAreaIllustration.java similarity index 96% rename from editor_basics/src/org/jetbrains/plugins/editor/basics/EditorAreaIllustration.java rename to editor_basics/src/org/jetbrains/tutorials/editor/basics/EditorAreaIllustration.java index 2f5cffc0f..f8efe3eaf 100644 --- a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorAreaIllustration.java +++ b/editor_basics/src/org/jetbrains/tutorials/editor/basics/EditorAreaIllustration.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.editor.basics; +package org.jetbrains.tutorials.editor.basics; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; diff --git a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorHandlerIllustration.java b/editor_basics/src/org/jetbrains/tutorials/editor/basics/EditorHandlerIllustration.java similarity index 96% rename from editor_basics/src/org/jetbrains/plugins/editor/basics/EditorHandlerIllustration.java rename to editor_basics/src/org/jetbrains/tutorials/editor/basics/EditorHandlerIllustration.java index ae2917bd7..06c3da995 100644 --- a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorHandlerIllustration.java +++ b/editor_basics/src/org/jetbrains/tutorials/editor/basics/EditorHandlerIllustration.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.editor.basics; +package org.jetbrains.tutorials.editor.basics; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; diff --git a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java b/editor_basics/src/org/jetbrains/tutorials/editor/basics/EditorIllustration.java similarity index 98% rename from editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java rename to editor_basics/src/org/jetbrains/tutorials/editor/basics/EditorIllustration.java index a77dc4590..8185cd324 100644 --- a/editor_basics/src/org/jetbrains/plugins/editor/basics/EditorIllustration.java +++ b/editor_basics/src/org/jetbrains/tutorials/editor/basics/EditorIllustration.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.editor.basics; +package org.jetbrains.tutorials.editor.basics; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; diff --git a/editor_basics/src/org/jetbrains/plugins/editor/basics/MyTypedHandler.java b/editor_basics/src/org/jetbrains/tutorials/editor/basics/MyTypedHandler.java similarity index 95% rename from editor_basics/src/org/jetbrains/plugins/editor/basics/MyTypedHandler.java rename to editor_basics/src/org/jetbrains/tutorials/editor/basics/MyTypedHandler.java index 0deb62dc8..56f8218cf 100644 --- a/editor_basics/src/org/jetbrains/plugins/editor/basics/MyTypedHandler.java +++ b/editor_basics/src/org/jetbrains/tutorials/editor/basics/MyTypedHandler.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.editor.basics; +package org.jetbrains.tutorials.editor.basics; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.command.WriteCommandAction; From 525d7b5629d53f7671d3f93c371e6a4bedc5bbb4 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Mon, 19 Jan 2015 14:37:51 +0100 Subject: [PATCH 048/104] [code] package structure changed --- plugin_sample/META-INF/plugin.xml | 22 +++++++++---------- .../sample}/PluginSampleBundle.properties | 0 .../sample/DummyApplicationComponent.java | 2 +- .../sample/DummyApplicationComponentImpl.java | 2 +- .../sample/DummyModuleComponent.java | 2 +- .../sample/DummyModuleComponentImpl.java | 2 +- .../sample/DummyProjectComponent.java | 2 +- .../sample/DummyProjectComponentImpl.java | 2 +- .../sample/actions/DummyActionGroup.java | 2 +- .../sample/actions/GroupedAction.java | 2 +- .../actions/GroupedToDefaultAction.java | 2 +- .../sample/actions/SimpleAction.java | 2 +- project_view_pane/META-INF/plugin.xml | 2 +- .../sample/pane/ImagesProjectNode.java | 2 +- .../sample/pane/ImagesProjectViewPane.java | 2 +- tree_structure_provider/META-INF/plugin.xml | 2 +- .../tree/TextOnlyTreeStructureProvider.java | 2 +- 17 files changed, 26 insertions(+), 26 deletions(-) rename plugin_sample/resources/{org.jetbrains.plugins.sample => org/jetbrains/tutorials/sample}/PluginSampleBundle.properties (100%) rename plugin_sample/src/org/jetbrains/{plugins => tutorials}/sample/DummyApplicationComponent.java (80%) rename plugin_sample/src/org/jetbrains/{plugins => tutorials}/sample/DummyApplicationComponentImpl.java (90%) rename plugin_sample/src/org/jetbrains/{plugins => tutorials}/sample/DummyModuleComponent.java (79%) rename plugin_sample/src/org/jetbrains/{plugins => tutorials}/sample/DummyModuleComponentImpl.java (93%) rename plugin_sample/src/org/jetbrains/{plugins => tutorials}/sample/DummyProjectComponent.java (80%) rename plugin_sample/src/org/jetbrains/{plugins => tutorials}/sample/DummyProjectComponentImpl.java (92%) rename plugin_sample/src/org/jetbrains/{plugins => tutorials}/sample/actions/DummyActionGroup.java (89%) rename plugin_sample/src/org/jetbrains/{plugins => tutorials}/sample/actions/GroupedAction.java (87%) rename plugin_sample/src/org/jetbrains/{plugins => tutorials}/sample/actions/GroupedToDefaultAction.java (87%) rename plugin_sample/src/org/jetbrains/{plugins => tutorials}/sample/actions/SimpleAction.java (93%) rename project_view_pane/src/org/jetbrains/{plugins => tutorials}/sample/pane/ImagesProjectNode.java (99%) rename project_view_pane/src/org/jetbrains/{plugins => tutorials}/sample/pane/ImagesProjectViewPane.java (98%) rename tree_structure_provider/scr/org/jetbrains/{plugins => tutorials}/sample/tree/TextOnlyTreeStructureProvider.java (96%) diff --git a/plugin_sample/META-INF/plugin.xml b/plugin_sample/META-INF/plugin.xml index e8274ac02..96ef64d6c 100644 --- a/plugin_sample/META-INF/plugin.xml +++ b/plugin_sample/META-INF/plugin.xml @@ -29,15 +29,15 @@ - org.jetbrains.plugins.sample.PluginSampleBundle + org.jetbrains.tutorials.sample.PluginSampleBundle - org.jetbrains.plugins.sample.DummyApplicationComponent + org.jetbrains.tutorials.sample.DummyApplicationComponent - org.jetbrains.plugins.sample.DummyApplicationComponentImpl + org.jetbrains.tutorials.sample.DummyApplicationComponentImpl @@ -45,8 +45,8 @@ - org.jetbrains.plugins.sample.DummyProjectComponent - org.jetbrains.plugins.sample.DummyProjectComponentImpl + org.jetbrains.tutorials.sample.DummyProjectComponent + org.jetbrains.tutorials.sample.DummyProjectComponentImpl @@ -59,8 +59,8 @@ - org.jetbrains.plugins.sample.DummyModuleComponent - org.jetbrains.plugins.sample.DummyModuleComponentImpl + org.jetbrains.tutorials.sample.DummyModuleComponent + org.jetbrains.tutorials.sample.DummyModuleComponentImpl @@ -73,7 +73,7 @@ The optional "use-shortcut-of" attribute specifies the ID of the action whose keyboard shortcut this action will use. The optional "description" attribute specifies the text which is displayed in the status bar when the action is focused. The optional "icon" attribute specifies the icon which is displayed on the toolbar button or next to the menu item. --> - - + - - diff --git a/plugin_sample/resources/org.jetbrains.plugins.sample/PluginSampleBundle.properties b/plugin_sample/resources/org/jetbrains/tutorials/sample/PluginSampleBundle.properties similarity index 100% rename from plugin_sample/resources/org.jetbrains.plugins.sample/PluginSampleBundle.properties rename to plugin_sample/resources/org/jetbrains/tutorials/sample/PluginSampleBundle.properties diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/DummyApplicationComponent.java b/plugin_sample/src/org/jetbrains/tutorials/sample/DummyApplicationComponent.java similarity index 80% rename from plugin_sample/src/org/jetbrains/plugins/sample/DummyApplicationComponent.java rename to plugin_sample/src/org/jetbrains/tutorials/sample/DummyApplicationComponent.java index 6b112948d..9dc24acde 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/DummyApplicationComponent.java +++ b/plugin_sample/src/org/jetbrains/tutorials/sample/DummyApplicationComponent.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.sample; +package org.jetbrains.tutorials.sample; import com.intellij.openapi.components.ApplicationComponent; diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/DummyApplicationComponentImpl.java b/plugin_sample/src/org/jetbrains/tutorials/sample/DummyApplicationComponentImpl.java similarity index 90% rename from plugin_sample/src/org/jetbrains/plugins/sample/DummyApplicationComponentImpl.java rename to plugin_sample/src/org/jetbrains/tutorials/sample/DummyApplicationComponentImpl.java index 66b484c8d..2f4f7330b 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/DummyApplicationComponentImpl.java +++ b/plugin_sample/src/org/jetbrains/tutorials/sample/DummyApplicationComponentImpl.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.sample; +package org.jetbrains.tutorials.sample; import org.jetbrains.annotations.NotNull; diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/DummyModuleComponent.java b/plugin_sample/src/org/jetbrains/tutorials/sample/DummyModuleComponent.java similarity index 79% rename from plugin_sample/src/org/jetbrains/plugins/sample/DummyModuleComponent.java rename to plugin_sample/src/org/jetbrains/tutorials/sample/DummyModuleComponent.java index 68f1e9fbe..ae065c9c4 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/DummyModuleComponent.java +++ b/plugin_sample/src/org/jetbrains/tutorials/sample/DummyModuleComponent.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.sample; +package org.jetbrains.tutorials.sample; import com.intellij.openapi.module.ModuleComponent; diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/DummyModuleComponentImpl.java b/plugin_sample/src/org/jetbrains/tutorials/sample/DummyModuleComponentImpl.java similarity index 93% rename from plugin_sample/src/org/jetbrains/plugins/sample/DummyModuleComponentImpl.java rename to plugin_sample/src/org/jetbrains/tutorials/sample/DummyModuleComponentImpl.java index f0b601e9a..22231fd71 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/DummyModuleComponentImpl.java +++ b/plugin_sample/src/org/jetbrains/tutorials/sample/DummyModuleComponentImpl.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.sample; +package org.jetbrains.tutorials.sample; import org.jetbrains.annotations.NotNull; diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/DummyProjectComponent.java b/plugin_sample/src/org/jetbrains/tutorials/sample/DummyProjectComponent.java similarity index 80% rename from plugin_sample/src/org/jetbrains/plugins/sample/DummyProjectComponent.java rename to plugin_sample/src/org/jetbrains/tutorials/sample/DummyProjectComponent.java index fba925eeb..b49347acd 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/DummyProjectComponent.java +++ b/plugin_sample/src/org/jetbrains/tutorials/sample/DummyProjectComponent.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.sample; +package org.jetbrains.tutorials.sample; import com.intellij.openapi.components.ProjectComponent; diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/DummyProjectComponentImpl.java b/plugin_sample/src/org/jetbrains/tutorials/sample/DummyProjectComponentImpl.java similarity index 92% rename from plugin_sample/src/org/jetbrains/plugins/sample/DummyProjectComponentImpl.java rename to plugin_sample/src/org/jetbrains/tutorials/sample/DummyProjectComponentImpl.java index 84f7f2272..fac9b6bd0 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/DummyProjectComponentImpl.java +++ b/plugin_sample/src/org/jetbrains/tutorials/sample/DummyProjectComponentImpl.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.sample; +package org.jetbrains.tutorials.sample; import org.jetbrains.annotations.NotNull; diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/actions/DummyActionGroup.java b/plugin_sample/src/org/jetbrains/tutorials/sample/actions/DummyActionGroup.java similarity index 89% rename from plugin_sample/src/org/jetbrains/plugins/sample/actions/DummyActionGroup.java rename to plugin_sample/src/org/jetbrains/tutorials/sample/actions/DummyActionGroup.java index 920e178df..f55cfa613 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/actions/DummyActionGroup.java +++ b/plugin_sample/src/org/jetbrains/tutorials/sample/actions/DummyActionGroup.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.sample.actions; +package org.jetbrains.tutorials.sample.actions; import com.intellij.openapi.actionSystem.ActionGroup; import com.intellij.openapi.actionSystem.AnAction; diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/actions/GroupedAction.java b/plugin_sample/src/org/jetbrains/tutorials/sample/actions/GroupedAction.java similarity index 87% rename from plugin_sample/src/org/jetbrains/plugins/sample/actions/GroupedAction.java rename to plugin_sample/src/org/jetbrains/tutorials/sample/actions/GroupedAction.java index 5babf596b..7e665e74d 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/actions/GroupedAction.java +++ b/plugin_sample/src/org/jetbrains/tutorials/sample/actions/GroupedAction.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.sample.actions; +package org.jetbrains.tutorials.sample.actions; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/actions/GroupedToDefaultAction.java b/plugin_sample/src/org/jetbrains/tutorials/sample/actions/GroupedToDefaultAction.java similarity index 87% rename from plugin_sample/src/org/jetbrains/plugins/sample/actions/GroupedToDefaultAction.java rename to plugin_sample/src/org/jetbrains/tutorials/sample/actions/GroupedToDefaultAction.java index f7f2b1acb..7f99e2f10 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/actions/GroupedToDefaultAction.java +++ b/plugin_sample/src/org/jetbrains/tutorials/sample/actions/GroupedToDefaultAction.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.sample.actions; +package org.jetbrains.tutorials.sample.actions; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; diff --git a/plugin_sample/src/org/jetbrains/plugins/sample/actions/SimpleAction.java b/plugin_sample/src/org/jetbrains/tutorials/sample/actions/SimpleAction.java similarity index 93% rename from plugin_sample/src/org/jetbrains/plugins/sample/actions/SimpleAction.java rename to plugin_sample/src/org/jetbrains/tutorials/sample/actions/SimpleAction.java index 545c0d013..6484c780c 100644 --- a/plugin_sample/src/org/jetbrains/plugins/sample/actions/SimpleAction.java +++ b/plugin_sample/src/org/jetbrains/tutorials/sample/actions/SimpleAction.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.sample.actions; +package org.jetbrains.tutorials.sample.actions; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; diff --git a/project_view_pane/META-INF/plugin.xml b/project_view_pane/META-INF/plugin.xml index 9121c0ff1..ad58f7588 100644 --- a/project_view_pane/META-INF/plugin.xml +++ b/project_view_pane/META-INF/plugin.xml @@ -13,7 +13,7 @@ com.intellij.modules.lang - + diff --git a/project_view_pane/src/org/jetbrains/plugins/sample/pane/ImagesProjectNode.java b/project_view_pane/src/org/jetbrains/tutorials/sample/pane/ImagesProjectNode.java similarity index 99% rename from project_view_pane/src/org/jetbrains/plugins/sample/pane/ImagesProjectNode.java rename to project_view_pane/src/org/jetbrains/tutorials/sample/pane/ImagesProjectNode.java index 43ea9f838..a49e4ffba 100644 --- a/project_view_pane/src/org/jetbrains/plugins/sample/pane/ImagesProjectNode.java +++ b/project_view_pane/src/org/jetbrains/tutorials/sample/pane/ImagesProjectNode.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.sample.pane; +package org.jetbrains.tutorials.sample.pane; import com.intellij.icons.AllIcons; import com.intellij.ide.projectView.PresentationData; diff --git a/project_view_pane/src/org/jetbrains/plugins/sample/pane/ImagesProjectViewPane.java b/project_view_pane/src/org/jetbrains/tutorials/sample/pane/ImagesProjectViewPane.java similarity index 98% rename from project_view_pane/src/org/jetbrains/plugins/sample/pane/ImagesProjectViewPane.java rename to project_view_pane/src/org/jetbrains/tutorials/sample/pane/ImagesProjectViewPane.java index 7d5d902ed..0a47d08aa 100644 --- a/project_view_pane/src/org/jetbrains/plugins/sample/pane/ImagesProjectViewPane.java +++ b/project_view_pane/src/org/jetbrains/tutorials/sample/pane/ImagesProjectViewPane.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.sample.pane; +package org.jetbrains.tutorials.sample.pane; import com.intellij.icons.AllIcons; import com.intellij.ide.SelectInTarget; diff --git a/tree_structure_provider/META-INF/plugin.xml b/tree_structure_provider/META-INF/plugin.xml index cd4c1f7e3..6d686c6f5 100644 --- a/tree_structure_provider/META-INF/plugin.xml +++ b/tree_structure_provider/META-INF/plugin.xml @@ -13,7 +13,7 @@ com.intellij.modules.lang - + diff --git a/tree_structure_provider/scr/org/jetbrains/plugins/sample/tree/TextOnlyTreeStructureProvider.java b/tree_structure_provider/scr/org/jetbrains/tutorials/sample/tree/TextOnlyTreeStructureProvider.java similarity index 96% rename from tree_structure_provider/scr/org/jetbrains/plugins/sample/tree/TextOnlyTreeStructureProvider.java rename to tree_structure_provider/scr/org/jetbrains/tutorials/sample/tree/TextOnlyTreeStructureProvider.java index d97f975c8..1a387174b 100644 --- a/tree_structure_provider/scr/org/jetbrains/plugins/sample/tree/TextOnlyTreeStructureProvider.java +++ b/tree_structure_provider/scr/org/jetbrains/tutorials/sample/tree/TextOnlyTreeStructureProvider.java @@ -1,4 +1,4 @@ -package org.jetbrains.plugins.sample.tree; +package org.jetbrains.tutorials.sample.tree; import com.intellij.ide.projectView.TreeStructureProvider; import com.intellij.ide.projectView.ViewSettings; From 0153fb2e3b7c56771ba19bb2b127b4df717cb7b7 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Mon, 19 Jan 2015 14:38:32 +0100 Subject: [PATCH 049/104] [code] package structure changed --- project_model/META-INF/plugin.xml | 10 +++++----- .../project/model/LibrariesAction.java | 2 +- .../project/model/ModificationAction.java | 2 +- .../project/model/ProjectFileIndexSampleAction.java | 2 +- .../project/model/ProjectSdkAction.java | 2 +- .../project/model/ShowSourceRootsActions.java | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) rename project_model/src/com/intellij/{plugins => tutorials}/project/model/LibrariesAction.java (98%) rename project_model/src/com/intellij/{plugins => tutorials}/project/model/ModificationAction.java (97%) rename project_model/src/com/intellij/{plugins => tutorials}/project/model/ProjectFileIndexSampleAction.java (98%) rename project_model/src/com/intellij/{plugins => tutorials}/project/model/ProjectSdkAction.java (96%) rename project_model/src/com/intellij/{plugins => tutorials}/project/model/ShowSourceRootsActions.java (96%) diff --git a/project_model/META-INF/plugin.xml b/project_model/META-INF/plugin.xml index 4f8fa8ffa..0de45090a 100644 --- a/project_model/META-INF/plugin.xml +++ b/project_model/META-INF/plugin.xml @@ -25,28 +25,28 @@ - - - - diff --git a/project_model/src/com/intellij/plugins/project/model/LibrariesAction.java b/project_model/src/com/intellij/tutorials/project/model/LibrariesAction.java similarity index 98% rename from project_model/src/com/intellij/plugins/project/model/LibrariesAction.java rename to project_model/src/com/intellij/tutorials/project/model/LibrariesAction.java index 85caba27f..e09bdc788 100644 --- a/project_model/src/com/intellij/plugins/project/model/LibrariesAction.java +++ b/project_model/src/com/intellij/tutorials/project/model/LibrariesAction.java @@ -1,4 +1,4 @@ -package com.intellij.plugins.project.model; +package com.intellij.tutorials.project.model; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; diff --git a/project_model/src/com/intellij/plugins/project/model/ModificationAction.java b/project_model/src/com/intellij/tutorials/project/model/ModificationAction.java similarity index 97% rename from project_model/src/com/intellij/plugins/project/model/ModificationAction.java rename to project_model/src/com/intellij/tutorials/project/model/ModificationAction.java index fa61936ef..6171f67ad 100644 --- a/project_model/src/com/intellij/plugins/project/model/ModificationAction.java +++ b/project_model/src/com/intellij/tutorials/project/model/ModificationAction.java @@ -1,4 +1,4 @@ -package com.intellij.plugins.project.model; +package com.intellij.tutorials.project.model; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; diff --git a/project_model/src/com/intellij/plugins/project/model/ProjectFileIndexSampleAction.java b/project_model/src/com/intellij/tutorials/project/model/ProjectFileIndexSampleAction.java similarity index 98% rename from project_model/src/com/intellij/plugins/project/model/ProjectFileIndexSampleAction.java rename to project_model/src/com/intellij/tutorials/project/model/ProjectFileIndexSampleAction.java index a521d7f2e..f13d77a61 100644 --- a/project_model/src/com/intellij/plugins/project/model/ProjectFileIndexSampleAction.java +++ b/project_model/src/com/intellij/tutorials/project/model/ProjectFileIndexSampleAction.java @@ -1,4 +1,4 @@ -package com.intellij.plugins.project.model; +package com.intellij.tutorials.project.model; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; diff --git a/project_model/src/com/intellij/plugins/project/model/ProjectSdkAction.java b/project_model/src/com/intellij/tutorials/project/model/ProjectSdkAction.java similarity index 96% rename from project_model/src/com/intellij/plugins/project/model/ProjectSdkAction.java rename to project_model/src/com/intellij/tutorials/project/model/ProjectSdkAction.java index b4c416771..28b7960e9 100644 --- a/project_model/src/com/intellij/plugins/project/model/ProjectSdkAction.java +++ b/project_model/src/com/intellij/tutorials/project/model/ProjectSdkAction.java @@ -1,4 +1,4 @@ -package com.intellij.plugins.project.model; +package com.intellij.tutorials.project.model; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; diff --git a/project_model/src/com/intellij/plugins/project/model/ShowSourceRootsActions.java b/project_model/src/com/intellij/tutorials/project/model/ShowSourceRootsActions.java similarity index 96% rename from project_model/src/com/intellij/plugins/project/model/ShowSourceRootsActions.java rename to project_model/src/com/intellij/tutorials/project/model/ShowSourceRootsActions.java index aadc92f01..c325cb410 100644 --- a/project_model/src/com/intellij/plugins/project/model/ShowSourceRootsActions.java +++ b/project_model/src/com/intellij/tutorials/project/model/ShowSourceRootsActions.java @@ -1,4 +1,4 @@ -package com.intellij.plugins.project.model; +package com.intellij.tutorials.project.model; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; From e1aefa54d4eddc4c2926aeed6385a958fdfed28f Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Mon, 19 Jan 2015 14:39:11 +0100 Subject: [PATCH 050/104] [code] package structure changed --- project_view_pane/META-INF/plugin.xml | 2 +- .../tutorials/{sample => view}/pane/ImagesProjectNode.java | 2 +- .../tutorials/{sample => view}/pane/ImagesProjectViewPane.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename project_view_pane/src/org/jetbrains/tutorials/{sample => view}/pane/ImagesProjectNode.java (99%) rename project_view_pane/src/org/jetbrains/tutorials/{sample => view}/pane/ImagesProjectViewPane.java (98%) diff --git a/project_view_pane/META-INF/plugin.xml b/project_view_pane/META-INF/plugin.xml index ad58f7588..1a6ab3cd2 100644 --- a/project_view_pane/META-INF/plugin.xml +++ b/project_view_pane/META-INF/plugin.xml @@ -13,7 +13,7 @@ com.intellij.modules.lang - + diff --git a/project_view_pane/src/org/jetbrains/tutorials/sample/pane/ImagesProjectNode.java b/project_view_pane/src/org/jetbrains/tutorials/view/pane/ImagesProjectNode.java similarity index 99% rename from project_view_pane/src/org/jetbrains/tutorials/sample/pane/ImagesProjectNode.java rename to project_view_pane/src/org/jetbrains/tutorials/view/pane/ImagesProjectNode.java index a49e4ffba..6c44feb53 100644 --- a/project_view_pane/src/org/jetbrains/tutorials/sample/pane/ImagesProjectNode.java +++ b/project_view_pane/src/org/jetbrains/tutorials/view/pane/ImagesProjectNode.java @@ -1,4 +1,4 @@ -package org.jetbrains.tutorials.sample.pane; +package org.jetbrains.tutorials.view.pane; import com.intellij.icons.AllIcons; import com.intellij.ide.projectView.PresentationData; diff --git a/project_view_pane/src/org/jetbrains/tutorials/sample/pane/ImagesProjectViewPane.java b/project_view_pane/src/org/jetbrains/tutorials/view/pane/ImagesProjectViewPane.java similarity index 98% rename from project_view_pane/src/org/jetbrains/tutorials/sample/pane/ImagesProjectViewPane.java rename to project_view_pane/src/org/jetbrains/tutorials/view/pane/ImagesProjectViewPane.java index 0a47d08aa..b95985af1 100644 --- a/project_view_pane/src/org/jetbrains/tutorials/sample/pane/ImagesProjectViewPane.java +++ b/project_view_pane/src/org/jetbrains/tutorials/view/pane/ImagesProjectViewPane.java @@ -1,4 +1,4 @@ -package org.jetbrains.tutorials.sample.pane; +package org.jetbrains.tutorials.view.pane; import com.intellij.icons.AllIcons; import com.intellij.ide.SelectInTarget; From 3e2938e17354f3edc6714b34ad4fc20c210d40d5 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 20 Jan 2015 10:14:17 +0100 Subject: [PATCH 051/104] [code] module type set --- register_actions/register_actions.iml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/register_actions/register_actions.iml b/register_actions/register_actions.iml index 8ab62dee5..de3c6c143 100644 --- a/register_actions/register_actions.iml +++ b/register_actions/register_actions.iml @@ -1,5 +1,5 @@ - + From 4098bc9f6ec266946d0a021aa6c93e0e7c975cb9 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 20 Jan 2015 11:03:31 +0100 Subject: [PATCH 052/104] [code] action class. void. --- .../jetbrains/tutorials/actions/SimpleAction.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 register_actions/src/org/jetbrains/tutorials/actions/SimpleAction.java diff --git a/register_actions/src/org/jetbrains/tutorials/actions/SimpleAction.java b/register_actions/src/org/jetbrains/tutorials/actions/SimpleAction.java new file mode 100644 index 000000000..023ba06ec --- /dev/null +++ b/register_actions/src/org/jetbrains/tutorials/actions/SimpleAction.java @@ -0,0 +1,14 @@ +package org.jetbrains.tutorials.actions; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; + +/** + * @author Anna Bulenkova + */ +public class SimpleAction extends AnAction { + @Override + public void actionPerformed(AnActionEvent anActionEvent) { + + } +} From 0531b0dc1b8d5b25c0061a638372b0fce1300b9e Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 20 Jan 2015 11:16:17 +0100 Subject: [PATCH 053/104] [code] action registered --- register_actions/META-INF/plugin.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/register_actions/META-INF/plugin.xml b/register_actions/META-INF/plugin.xml index 12a5e9254..8db45e7f5 100644 --- a/register_actions/META-INF/plugin.xml +++ b/register_actions/META-INF/plugin.xml @@ -32,6 +32,10 @@ + + + \ No newline at end of file From aef2594a37254de1c6e4bf507b73fec425715902 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 20 Jan 2015 13:19:42 +0100 Subject: [PATCH 054/104] [code] additional attributes for the action --- register_actions/META-INF/plugin.xml | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/register_actions/META-INF/plugin.xml b/register_actions/META-INF/plugin.xml index 8db45e7f5..f6e55ed52 100644 --- a/register_actions/META-INF/plugin.xml +++ b/register_actions/META-INF/plugin.xml @@ -32,10 +32,36 @@ + + + + + + - \ No newline at end of file From 142cc00bc90de847cb1e71821826d3923bfa17de Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Wed, 21 Jan 2015 11:20:09 +0100 Subject: [PATCH 055/104] [code] action.update() sample --- .../jetbrains/tutorials/actions/SimpleAction.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/register_actions/src/org/jetbrains/tutorials/actions/SimpleAction.java b/register_actions/src/org/jetbrains/tutorials/actions/SimpleAction.java index 023ba06ec..a59cc6ea5 100644 --- a/register_actions/src/org/jetbrains/tutorials/actions/SimpleAction.java +++ b/register_actions/src/org/jetbrains/tutorials/actions/SimpleAction.java @@ -1,7 +1,7 @@ package org.jetbrains.tutorials.actions; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.project.Project; /** * @author Anna Bulenkova @@ -11,4 +11,13 @@ public class SimpleAction extends AnAction { public void actionPerformed(AnActionEvent anActionEvent) { } + + @Override + public void update(AnActionEvent anActionEvent) { + final Project project = anActionEvent.getData(CommonDataKeys.PROJECT); + if (project != null) + return; + Object navigatable = anActionEvent.getData(CommonDataKeys.NAVIGATABLE); + anActionEvent.getPresentation().setVisible(navigatable != null); + } } From 747b2bfde6b705bd8e2ab03648429c93977602b2 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Wed, 21 Jan 2015 12:25:55 +0100 Subject: [PATCH 056/104] [code] action.actionPerformed rewritten --- .../org/jetbrains/tutorials/actions/SimpleAction.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/register_actions/src/org/jetbrains/tutorials/actions/SimpleAction.java b/register_actions/src/org/jetbrains/tutorials/actions/SimpleAction.java index a59cc6ea5..48ba91cd8 100644 --- a/register_actions/src/org/jetbrains/tutorials/actions/SimpleAction.java +++ b/register_actions/src/org/jetbrains/tutorials/actions/SimpleAction.java @@ -1,7 +1,10 @@ package org.jetbrains.tutorials.actions; -import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.Messages; /** * @author Anna Bulenkova @@ -9,7 +12,10 @@ import com.intellij.openapi.project.Project; public class SimpleAction extends AnAction { @Override public void actionPerformed(AnActionEvent anActionEvent) { - + Object navigatable = anActionEvent.getData(CommonDataKeys.NAVIGATABLE); + if (navigatable != null) { + Messages.showDialog(navigatable.toString(), "Selected Element:", new String[]{"OK"}, -1, null); + } } @Override From 4dc158af905b3da20dfe1ee41afb30e03ad6bf5a Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Wed, 21 Jan 2015 15:46:42 +0100 Subject: [PATCH 057/104] [code] custom group of actions --- register_actions/META-INF/plugin.xml | 4 ++++ .../tutorials/actions/SimpleGroup.java | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 register_actions/src/org/jetbrains/tutorials/actions/SimpleGroup.java diff --git a/register_actions/META-INF/plugin.xml b/register_actions/META-INF/plugin.xml index f6e55ed52..790389cb1 100644 --- a/register_actions/META-INF/plugin.xml +++ b/register_actions/META-INF/plugin.xml @@ -63,5 +63,9 @@ the current action is inserted. --> + + + \ No newline at end of file diff --git a/register_actions/src/org/jetbrains/tutorials/actions/SimpleGroup.java b/register_actions/src/org/jetbrains/tutorials/actions/SimpleGroup.java new file mode 100644 index 000000000..001d18eaf --- /dev/null +++ b/register_actions/src/org/jetbrains/tutorials/actions/SimpleGroup.java @@ -0,0 +1,17 @@ +package org.jetbrains.tutorials.actions; + +import com.intellij.openapi.actionSystem.ActionGroup; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import org.jetbrains.annotations.NotNull; + +/** + *  @author Anna Bulenkova + */ +public class SimpleGroup extends ActionGroup { + @NotNull + @Override + public AnAction[] getChildren(AnActionEvent anActionEvent) { + return new AnAction[0]; + } +} From 175ea520e510406a2bf7e4ef86431f83ad6b9a7b Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Fri, 23 Jan 2015 10:27:51 +0100 Subject: [PATCH 058/104] [code] grouping action corrected --- register_actions/META-INF/plugin.xml | 8 +++++--- .../tutorials/actions/GroupedAction.java | 19 +++++++++++++++++++ .../tutorials/actions/SimpleGroup.java | 17 ----------------- 3 files changed, 24 insertions(+), 20 deletions(-) create mode 100644 register_actions/src/org/jetbrains/tutorials/actions/GroupedAction.java delete mode 100644 register_actions/src/org/jetbrains/tutorials/actions/SimpleGroup.java diff --git a/register_actions/META-INF/plugin.xml b/register_actions/META-INF/plugin.xml index 790389cb1..41019d804 100644 --- a/register_actions/META-INF/plugin.xml +++ b/register_actions/META-INF/plugin.xml @@ -63,9 +63,11 @@ the current action is inserted. --> - - + + + + \ No newline at end of file diff --git a/register_actions/src/org/jetbrains/tutorials/actions/GroupedAction.java b/register_actions/src/org/jetbrains/tutorials/actions/GroupedAction.java new file mode 100644 index 000000000..3d4163576 --- /dev/null +++ b/register_actions/src/org/jetbrains/tutorials/actions/GroupedAction.java @@ -0,0 +1,19 @@ +package org.jetbrains.tutorials.actions; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; + +/** + * @author Anna Bulenkova + */ +public class GroupedAction extends AnAction { + @Override + public void update(AnActionEvent e) { + e.getPresentation().setEnabledAndVisible(true); + } + + @Override + public void actionPerformed(AnActionEvent anActionEvent) { + + } +} diff --git a/register_actions/src/org/jetbrains/tutorials/actions/SimpleGroup.java b/register_actions/src/org/jetbrains/tutorials/actions/SimpleGroup.java deleted file mode 100644 index 001d18eaf..000000000 --- a/register_actions/src/org/jetbrains/tutorials/actions/SimpleGroup.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.jetbrains.tutorials.actions; - -import com.intellij.openapi.actionSystem.ActionGroup; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; -import org.jetbrains.annotations.NotNull; - -/** - *  @author Anna Bulenkova - */ -public class SimpleGroup extends ActionGroup { - @NotNull - @Override - public AnAction[] getChildren(AnActionEvent anActionEvent) { - return new AnAction[0]; - } -} From 35431792489dd43856e8293da4d3744c7eb2185a Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Fri, 23 Jan 2015 11:13:33 +0100 Subject: [PATCH 059/104] [code] comment --- .../org/jetbrains/tutorials/actions/GroupedAction.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/register_actions/src/org/jetbrains/tutorials/actions/GroupedAction.java b/register_actions/src/org/jetbrains/tutorials/actions/GroupedAction.java index 3d4163576..abdb9e824 100644 --- a/register_actions/src/org/jetbrains/tutorials/actions/GroupedAction.java +++ b/register_actions/src/org/jetbrains/tutorials/actions/GroupedAction.java @@ -8,12 +8,12 @@ import com.intellij.openapi.actionSystem.AnActionEvent; */ public class GroupedAction extends AnAction { @Override - public void update(AnActionEvent e) { - e.getPresentation().setEnabledAndVisible(true); + public void update(AnActionEvent event) { + event.getPresentation().setEnabledAndVisible(true); } @Override - public void actionPerformed(AnActionEvent anActionEvent) { - + public void actionPerformed(AnActionEvent event) { + //Does nothing } } From d9e90868872cac7b45fe7fa9bb6a0325b9539a90 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Fri, 23 Jan 2015 12:31:16 +0100 Subject: [PATCH 060/104] [code] extending DefaultActionGroup sample --- register_actions/META-INF/plugin.xml | 6 ++++++ .../actions/CustomDefaultActionGroup.java | 20 +++++++++++++++++++ .../actions/CustomGroupedAction.java | 14 +++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 register_actions/src/org/jetbrains/tutorials/actions/CustomDefaultActionGroup.java create mode 100644 register_actions/src/org/jetbrains/tutorials/actions/CustomGroupedAction.java diff --git a/register_actions/META-INF/plugin.xml b/register_actions/META-INF/plugin.xml index 41019d804..b295b0196 100644 --- a/register_actions/META-INF/plugin.xml +++ b/register_actions/META-INF/plugin.xml @@ -69,5 +69,11 @@ text="Grouped Action" description="Grouped Action Demo"> + + + + \ No newline at end of file diff --git a/register_actions/src/org/jetbrains/tutorials/actions/CustomDefaultActionGroup.java b/register_actions/src/org/jetbrains/tutorials/actions/CustomDefaultActionGroup.java new file mode 100644 index 000000000..cb24193af --- /dev/null +++ b/register_actions/src/org/jetbrains/tutorials/actions/CustomDefaultActionGroup.java @@ -0,0 +1,20 @@ +package org.jetbrains.tutorials.actions; + +import com.intellij.icons.AllIcons; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.actionSystem.DefaultActionGroup; +import com.intellij.openapi.editor.Editor; + +/** + * @author Anna Bulenkova + */ +public class CustomDefaultActionGroup extends DefaultActionGroup { + @Override + public void update(AnActionEvent event) { + Editor editor = event.getData(CommonDataKeys.EDITOR); + event.getPresentation().setVisible(true); + event.getPresentation().setEnabled(editor != null); + event.getPresentation().setIcon(AllIcons.General.Error); + } +} diff --git a/register_actions/src/org/jetbrains/tutorials/actions/CustomGroupedAction.java b/register_actions/src/org/jetbrains/tutorials/actions/CustomGroupedAction.java new file mode 100644 index 000000000..77444a508 --- /dev/null +++ b/register_actions/src/org/jetbrains/tutorials/actions/CustomGroupedAction.java @@ -0,0 +1,14 @@ +package org.jetbrains.tutorials.actions; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; + +/** + * @author Anna Bulenkova + */ +public class CustomGroupedAction extends AnAction { + @Override + public void actionPerformed(AnActionEvent anActionEvent) { + //Does nothing + } +} From 0d533e7c07bbd2d3f0abcc423946a4d15c1ca34b Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Mon, 26 Jan 2015 15:31:22 +0100 Subject: [PATCH 061/104] [code] cleanup - annotations, naming --- .../editor/basics/EditorHandlerIllustration.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/editor_basics/src/org/jetbrains/tutorials/editor/basics/EditorHandlerIllustration.java b/editor_basics/src/org/jetbrains/tutorials/editor/basics/EditorHandlerIllustration.java index 06c3da995..5232bb09a 100644 --- a/editor_basics/src/org/jetbrains/tutorials/editor/basics/EditorHandlerIllustration.java +++ b/editor_basics/src/org/jetbrains/tutorials/editor/basics/EditorHandlerIllustration.java @@ -8,13 +8,14 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.actionSystem.EditorActionHandler; import com.intellij.openapi.editor.actionSystem.EditorActionManager; import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; /** * @author Anna Bulenkova */ public class EditorHandlerIllustration extends AnAction { @Override - public void actionPerformed(AnActionEvent anActionEvent) { + public void actionPerformed(@NotNull AnActionEvent anActionEvent) { final Editor editor = anActionEvent.getRequiredData(CommonDataKeys.EDITOR); EditorActionManager actionManager = EditorActionManager.getInstance(); //Insert one more caret below the active caret @@ -22,10 +23,10 @@ public class EditorHandlerIllustration extends AnAction { actionHandler.execute(editor, editor.getCaretModel().getCurrentCaret(), anActionEvent.getDataContext()); } @Override - public void update(final AnActionEvent e) { + public void update(@NotNull final AnActionEvent anActionEvent) { //Set visible if at least one caret is available - final Project project = e.getData(CommonDataKeys.PROJECT); - final Editor editor = e.getData(CommonDataKeys.EDITOR); - e.getPresentation().setVisible((project != null && editor != null && !editor.getCaretModel().getAllCarets().isEmpty())); + final Project project = anActionEvent.getData(CommonDataKeys.PROJECT); + final Editor editor = anActionEvent.getData(CommonDataKeys.EDITOR); + anActionEvent.getPresentation().setVisible((project != null && editor != null && !editor.getCaretModel().getAllCarets().isEmpty())); } } From 1d2e179074663a6530e13859dbb2559f9b1a63af Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 27 Jan 2015 11:47:34 +0100 Subject: [PATCH 062/104] [code] ActionGroup demo --- register_actions/META-INF/plugin.xml | 4 +++ .../tutorials/actions/BaseActionGroup.java | 26 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 register_actions/src/org/jetbrains/tutorials/actions/BaseActionGroup.java diff --git a/register_actions/META-INF/plugin.xml b/register_actions/META-INF/plugin.xml index b295b0196..e775227eb 100644 --- a/register_actions/META-INF/plugin.xml +++ b/register_actions/META-INF/plugin.xml @@ -75,5 +75,9 @@ + + + \ No newline at end of file diff --git a/register_actions/src/org/jetbrains/tutorials/actions/BaseActionGroup.java b/register_actions/src/org/jetbrains/tutorials/actions/BaseActionGroup.java new file mode 100644 index 000000000..499e5bf72 --- /dev/null +++ b/register_actions/src/org/jetbrains/tutorials/actions/BaseActionGroup.java @@ -0,0 +1,26 @@ +package org.jetbrains.tutorials.actions; + +import com.intellij.openapi.actionSystem.ActionGroup; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import org.jetbrains.annotations.NotNull; + +/** + * @author Anna Bulenkova + */ +public class BaseActionGroup extends ActionGroup { + @NotNull + @Override + public AnAction[] getChildren(AnActionEvent anActionEvent) { + return new AnAction[]{new MyAction()}; + } + class MyAction extends AnAction { + public MyAction() { + super("Dynamically Added Action"); + } + @Override + public void actionPerformed(@NotNull AnActionEvent anActionEvent) { + //does nothing + } + } +} From 3c5b6e8c8c5b2146457e7aa994f8fc1ec92ecaa5 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 27 Jan 2015 14:28:06 +0100 Subject: [PATCH 063/104] [code] anchor changed for better screen shot --- register_actions/META-INF/plugin.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/register_actions/META-INF/plugin.xml b/register_actions/META-INF/plugin.xml index e775227eb..23142be67 100644 --- a/register_actions/META-INF/plugin.xml +++ b/register_actions/META-INF/plugin.xml @@ -77,7 +77,7 @@ - + \ No newline at end of file From f8ac7ad5b9553500ffbe9b3aec7738d22066cafe Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Fri, 30 Jan 2015 10:40:04 +0100 Subject: [PATCH 064/104] [code] framework sample --- framework/META-INF/plugin.xml | 43 +++++++++++ framework/framework.iml | 12 ++++ .../tutorials/framework/DemoFramework.java | 71 +++++++++++++++++++ 3 files changed, 126 insertions(+) create mode 100644 framework/META-INF/plugin.xml create mode 100644 framework/framework.iml create mode 100644 framework/src/com/intellij/tutorials/framework/DemoFramework.java diff --git a/framework/META-INF/plugin.xml b/framework/META-INF/plugin.xml new file mode 100644 index 000000000..3cc67f1d9 --- /dev/null +++ b/framework/META-INF/plugin.xml @@ -0,0 +1,43 @@ + + com.intellij.demo.framework + Framework example + 1.0 + YourCompany + + + most HTML tags may be used + ]]> + + + most HTML tags may be used + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/framework.iml b/framework/framework.iml new file mode 100644 index 000000000..de3c6c143 --- /dev/null +++ b/framework/framework.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/com/intellij/tutorials/framework/DemoFramework.java b/framework/src/com/intellij/tutorials/framework/DemoFramework.java new file mode 100644 index 000000000..6c4db74e7 --- /dev/null +++ b/framework/src/com/intellij/tutorials/framework/DemoFramework.java @@ -0,0 +1,71 @@ +package com.intellij.tutorials.framework; + +import com.intellij.framework.FrameworkTypeEx; +import com.intellij.framework.addSupport.FrameworkSupportInModuleConfigurable; +import com.intellij.framework.addSupport.FrameworkSupportInModuleProvider; +import com.intellij.icons.AllIcons; +import com.intellij.ide.util.frameworkSupport.FrameworkSupportModel; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleType; +import com.intellij.openapi.roots.ModifiableModelsProvider; +import com.intellij.openapi.roots.ModifiableRootModel; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +/** + * @author Anna Bulenkova + */ +public class DemoFramework extends FrameworkTypeEx { + public static final String FRAMEWORK_ID = "Demo"; + protected DemoFramework() { + super(FRAMEWORK_ID); + } + + @NotNull + @Override + public FrameworkSupportInModuleProvider createProvider() { + return new FrameworkSupportInModuleProvider() { + @NotNull + @Override + public FrameworkTypeEx getFrameworkType() { + return DemoFramework.this; + } + + @NotNull + @Override + public FrameworkSupportInModuleConfigurable createConfigurable(@NotNull FrameworkSupportModel model) { + return new FrameworkSupportInModuleConfigurable() { + @Nullable + @Override + public JComponent createComponent() { + return new JCheckBox("Extra Option"); + } + + @Override + public void addSupport(@NotNull Module module, @NotNull ModifiableRootModel model, @NotNull ModifiableModelsProvider provider) { + //do what you want here: setup a library, generate a specific file, etc + } + }; + } + + @Override + public boolean isEnabledForModuleType(@NotNull ModuleType type) { + return true; + } + }; + } + + @NotNull + @Override + public String getPresentableName() { + return "Demo Framework"; + } + + @NotNull + @Override + public Icon getIcon() { + return AllIcons.Providers.Apache; + } +} From 4a341a56e434721bf2ac78e69bbdaf203eeddcb1 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Mon, 2 Feb 2015 11:09:37 +0100 Subject: [PATCH 065/104] [code] xml fixed --- framework/META-INF/plugin.xml | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/framework/META-INF/plugin.xml b/framework/META-INF/plugin.xml index 3cc67f1d9..c79474e20 100644 --- a/framework/META-INF/plugin.xml +++ b/framework/META-INF/plugin.xml @@ -4,16 +4,9 @@ 1.0 YourCompany - - most HTML tags may be used - ]]> + Framework support tutorial - - most HTML tags may be used - ]]> - + Initial commit From 01b557b1cb088944bea26d2b740237ccc8a86895 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 3 Feb 2015 12:27:18 +0100 Subject: [PATCH 066/104] [code] project wizard stub --- project_wizard/META-INF/plugin.xml | 30 ++++++++++++++++++++++++++++++ project_wizard/project_wizard.iml | 12 ++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 project_wizard/META-INF/plugin.xml create mode 100644 project_wizard/project_wizard.iml diff --git a/project_wizard/META-INF/plugin.xml b/project_wizard/META-INF/plugin.xml new file mode 100644 index 000000000..5d536f7b8 --- /dev/null +++ b/project_wizard/META-INF/plugin.xml @@ -0,0 +1,30 @@ + + org.jetbrains.tutorials.ProjectWizard + Project Wizard Demo + 1.0 + JetBrains + + Illustration of working with Project Wizard + + Initial commit + + + + com.intellij.modules.lang + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/project_wizard/project_wizard.iml b/project_wizard/project_wizard.iml new file mode 100644 index 000000000..4b05d8676 --- /dev/null +++ b/project_wizard/project_wizard.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file From 1f8e6834ae09596c18840e5d71301bd27de9f45f Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 3 Feb 2015 14:13:05 +0100 Subject: [PATCH 067/104] [code] module type changed --- project_wizard/project_wizard.iml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_wizard/project_wizard.iml b/project_wizard/project_wizard.iml index 4b05d8676..de3c6c143 100644 --- a/project_wizard/project_wizard.iml +++ b/project_wizard/project_wizard.iml @@ -1,5 +1,5 @@ - + From 9ba36385dcaf304202693f6c780a5cde395dc2c8 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 3 Feb 2015 16:19:09 +0100 Subject: [PATCH 068/104] [code] custom module step --- project_wizard/META-INF/plugin.xml | 1 + .../project/wizard/DemoModuleBuilder.java | 24 ++++++++++ .../project/wizard/DemoModuleType.java | 44 +++++++++++++++++++ .../project/wizard/DemoModuleWizardStep.java | 25 +++++++++++ 4 files changed, 94 insertions(+) create mode 100644 project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleBuilder.java create mode 100644 project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleType.java create mode 100644 project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleWizardStep.java diff --git a/project_wizard/META-INF/plugin.xml b/project_wizard/META-INF/plugin.xml index 5d536f7b8..7df902cd7 100644 --- a/project_wizard/META-INF/plugin.xml +++ b/project_wizard/META-INF/plugin.xml @@ -14,6 +14,7 @@ + diff --git a/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleBuilder.java b/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleBuilder.java new file mode 100644 index 000000000..50a9014c0 --- /dev/null +++ b/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleBuilder.java @@ -0,0 +1,24 @@ +package org.jetbrains.tutorials.project.wizard; + +import com.intellij.ide.util.projectWizard.JavaModuleBuilder; +import com.intellij.ide.util.projectWizard.ModuleBuilderListener; +import com.intellij.ide.util.projectWizard.ModuleWizardStep; +import com.intellij.ide.util.projectWizard.WizardContext; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.roots.ui.configuration.ModulesProvider; +import org.jetbrains.annotations.NotNull; + +/** + * @author Anna Bulenkova + */ +public class DemoModuleBuilder extends JavaModuleBuilder implements ModuleBuilderListener { + @Override + public ModuleWizardStep[] createWizardSteps(@NotNull WizardContext wizardContext, @NotNull ModulesProvider modulesProvider) { + return new ModuleWizardStep[]{new DemoModuleWizardStep(this)}; + } + + @Override + public void moduleCreated(@NotNull Module module) { + + } +} diff --git a/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleType.java b/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleType.java new file mode 100644 index 000000000..62c444ecc --- /dev/null +++ b/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleType.java @@ -0,0 +1,44 @@ +package org.jetbrains.tutorials.project.wizard; + +import com.intellij.icons.AllIcons; +import com.intellij.openapi.module.ModuleType; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; + +/** + * @author Anna Bulenkova + */ +public class DemoModuleType extends ModuleType { + public DemoModuleType() { + super("DEMO_MODULE"); + } + + @NotNull + @Override + public DemoModuleBuilder createModuleBuilder() { + return new DemoModuleBuilder(); + } + + @NotNull + @Override + public String getName() { + return "Demo"; + } + + @NotNull + @Override + public String getDescription() { + return "Demo module for educational purposes"; + } + + @Override + public Icon getBigIcon() { + return null; + } + + @Override + public Icon getNodeIcon(@Deprecated boolean isOpened) { + return AllIcons.General.Information; + } +} diff --git a/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleWizardStep.java b/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleWizardStep.java new file mode 100644 index 000000000..fd169375c --- /dev/null +++ b/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleWizardStep.java @@ -0,0 +1,25 @@ +package org.jetbrains.tutorials.project.wizard; + +import com.intellij.ide.util.projectWizard.ModuleWizardStep; + +import javax.swing.*; + +/** + * @author Anna Bulenkova + */ +public class DemoModuleWizardStep extends ModuleWizardStep { + private DemoModuleBuilder myBuilder; + public DemoModuleWizardStep(DemoModuleBuilder builder) { + myBuilder = builder; + } + + @Override + public JComponent getComponent() { + return new JPanel(); + } + + @Override + public void updateDataModel() { + + } +} From c84e90c8afd379ca90a3ff27eb301620209ab6ca Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Wed, 4 Feb 2015 11:11:39 +0100 Subject: [PATCH 069/104] [code] project wizard step content changed --- project_wizard/META-INF/plugin.xml | 2 +- .../project/wizard/DemoModuleBuilder.java | 24 ---------- .../project/wizard/DemoModuleType.java | 44 ------------------- .../project/wizard/DemoModuleWizardStep.java | 33 ++++++++++---- 4 files changed, 25 insertions(+), 78 deletions(-) delete mode 100644 project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleBuilder.java delete mode 100644 project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleType.java diff --git a/project_wizard/META-INF/plugin.xml b/project_wizard/META-INF/plugin.xml index 7df902cd7..63ac241ac 100644 --- a/project_wizard/META-INF/plugin.xml +++ b/project_wizard/META-INF/plugin.xml @@ -14,7 +14,7 @@ - + diff --git a/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleBuilder.java b/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleBuilder.java deleted file mode 100644 index 50a9014c0..000000000 --- a/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleBuilder.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.jetbrains.tutorials.project.wizard; - -import com.intellij.ide.util.projectWizard.JavaModuleBuilder; -import com.intellij.ide.util.projectWizard.ModuleBuilderListener; -import com.intellij.ide.util.projectWizard.ModuleWizardStep; -import com.intellij.ide.util.projectWizard.WizardContext; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.roots.ui.configuration.ModulesProvider; -import org.jetbrains.annotations.NotNull; - -/** - * @author Anna Bulenkova - */ -public class DemoModuleBuilder extends JavaModuleBuilder implements ModuleBuilderListener { - @Override - public ModuleWizardStep[] createWizardSteps(@NotNull WizardContext wizardContext, @NotNull ModulesProvider modulesProvider) { - return new ModuleWizardStep[]{new DemoModuleWizardStep(this)}; - } - - @Override - public void moduleCreated(@NotNull Module module) { - - } -} diff --git a/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleType.java b/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleType.java deleted file mode 100644 index 62c444ecc..000000000 --- a/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleType.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.jetbrains.tutorials.project.wizard; - -import com.intellij.icons.AllIcons; -import com.intellij.openapi.module.ModuleType; -import org.jetbrains.annotations.NotNull; - -import javax.swing.*; - -/** - * @author Anna Bulenkova - */ -public class DemoModuleType extends ModuleType { - public DemoModuleType() { - super("DEMO_MODULE"); - } - - @NotNull - @Override - public DemoModuleBuilder createModuleBuilder() { - return new DemoModuleBuilder(); - } - - @NotNull - @Override - public String getName() { - return "Demo"; - } - - @NotNull - @Override - public String getDescription() { - return "Demo module for educational purposes"; - } - - @Override - public Icon getBigIcon() { - return null; - } - - @Override - public Icon getNodeIcon(@Deprecated boolean isOpened) { - return AllIcons.General.Information; - } -} diff --git a/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleWizardStep.java b/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleWizardStep.java index fd169375c..6fb234c78 100644 --- a/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleWizardStep.java +++ b/project_wizard/src/org/jetbrains/tutorials/project/wizard/DemoModuleWizardStep.java @@ -1,25 +1,40 @@ package org.jetbrains.tutorials.project.wizard; +import com.intellij.ide.util.projectWizard.ModuleBuilder; import com.intellij.ide.util.projectWizard.ModuleWizardStep; +import com.intellij.ide.util.projectWizard.WizardContext; +import com.intellij.openapi.module.ModuleType; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.roots.ModifiableRootModel; +import com.intellij.openapi.roots.ui.configuration.ModulesProvider; +import org.jetbrains.annotations.NotNull; import javax.swing.*; /** * @author Anna Bulenkova */ -public class DemoModuleWizardStep extends ModuleWizardStep { - private DemoModuleBuilder myBuilder; - public DemoModuleWizardStep(DemoModuleBuilder builder) { - myBuilder = builder; +public class DemoModuleWizardStep extends ModuleBuilder { + public void setupRootModel(ModifiableRootModel modifiableRootModel) throws ConfigurationException { + + } + + public ModuleType getModuleType() { + return ModuleType.EMPTY; //or it could be other module type } @Override - public JComponent getComponent() { - return new JPanel(); - } + public ModuleWizardStep[] createWizardSteps(@NotNull WizardContext wizardContext, @NotNull ModulesProvider modulesProvider) { + return new ModuleWizardStep[]{new ModuleWizardStep() { + @Override + public JComponent getComponent() { + return new JLabel("Put your content here"); + } - @Override - public void updateDataModel() { + @Override + public void updateDataModel() { + } + }}; } } From 9c6db9f8c778531890f676082c6bb645afdc5168 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Wed, 4 Feb 2015 11:27:49 +0100 Subject: [PATCH 070/104] [code] cleanup --- .../tutorials/project/model/LibrariesAction.java | 5 +++-- .../tutorials/project/model/ModificationAction.java | 5 +++-- .../project/model/ProjectFileIndexSampleAction.java | 5 +++-- .../tutorials/project/model/ProjectSdkAction.java | 11 ++++++----- .../project/model/ShowSourceRootsActions.java | 13 +++++++------ 5 files changed, 22 insertions(+), 17 deletions(-) diff --git a/project_model/src/com/intellij/tutorials/project/model/LibrariesAction.java b/project_model/src/com/intellij/tutorials/project/model/LibrariesAction.java index e09bdc788..dd53d59dd 100644 --- a/project_model/src/com/intellij/tutorials/project/model/LibrariesAction.java +++ b/project_model/src/com/intellij/tutorials/project/model/LibrariesAction.java @@ -11,13 +11,14 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.Navigatable; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NotNull; /** * @author Anna Bulenkova */ public class LibrariesAction extends AnAction { @Override - public void update(final AnActionEvent event) { + public void update(@NotNull final AnActionEvent event) { Project project = event.getProject(); if (project == null) return; Navigatable element = event.getData(CommonDataKeys.NAVIGATABLE); @@ -31,7 +32,7 @@ public class LibrariesAction extends AnAction { } @Override - public void actionPerformed(AnActionEvent event) { + public void actionPerformed(@NotNull AnActionEvent event) { Project project = event.getProject(); if (project == null) return; Navigatable element = event.getData(CommonDataKeys.NAVIGATABLE); diff --git a/project_model/src/com/intellij/tutorials/project/model/ModificationAction.java b/project_model/src/com/intellij/tutorials/project/model/ModificationAction.java index 6171f67ad..f3919faa6 100644 --- a/project_model/src/com/intellij/tutorials/project/model/ModificationAction.java +++ b/project_model/src/com/intellij/tutorials/project/model/ModificationAction.java @@ -13,13 +13,14 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.Navigatable; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NotNull; /** * @author Anna Bulenkova */ public class ModificationAction extends AnAction { @Override - public void actionPerformed(final AnActionEvent event) { + public void actionPerformed(@NotNull final AnActionEvent event) { Project project = event.getProject(); if (project == null) return; Navigatable element = event.getData(CommonDataKeys.NAVIGATABLE); @@ -39,7 +40,7 @@ public class ModificationAction extends AnAction { } @Override - public void update(final AnActionEvent event) { + public void update(@NotNull final AnActionEvent event) { Project project = event.getProject(); Navigatable element = event.getData(CommonDataKeys.NAVIGATABLE); event.getPresentation().setEnabledAndVisible(project != null && element != null); diff --git a/project_model/src/com/intellij/tutorials/project/model/ProjectFileIndexSampleAction.java b/project_model/src/com/intellij/tutorials/project/model/ProjectFileIndexSampleAction.java index f13d77a61..efe8c1da3 100644 --- a/project_model/src/com/intellij/tutorials/project/model/ProjectFileIndexSampleAction.java +++ b/project_model/src/com/intellij/tutorials/project/model/ProjectFileIndexSampleAction.java @@ -12,13 +12,14 @@ import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; /** * @author Anna Bulenkova */ public class ProjectFileIndexSampleAction extends AnAction { @Override - public void update(final AnActionEvent event) { + public void update(@NotNull final AnActionEvent event) { Project project = event.getProject(); final Editor editor = event.getData(CommonDataKeys.EDITOR); boolean visibility = project != null && editor != null; @@ -26,7 +27,7 @@ public class ProjectFileIndexSampleAction extends AnAction { } @Override - public void actionPerformed(final AnActionEvent event) { + public void actionPerformed(@NotNull final AnActionEvent event) { Project project = event.getProject(); final Editor editor = event.getData(CommonDataKeys.EDITOR); if (project == null || editor == null) return; diff --git a/project_model/src/com/intellij/tutorials/project/model/ProjectSdkAction.java b/project_model/src/com/intellij/tutorials/project/model/ProjectSdkAction.java index 28b7960e9..b030992f2 100644 --- a/project_model/src/com/intellij/tutorials/project/model/ProjectSdkAction.java +++ b/project_model/src/com/intellij/tutorials/project/model/ProjectSdkAction.java @@ -6,14 +6,15 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.ui.Messages; +import org.jetbrains.annotations.NotNull; /** * @author Anna Bulenkova */ public class ProjectSdkAction extends AnAction { @Override - public void actionPerformed(final AnActionEvent e) { - Project project = e.getProject(); + public void actionPerformed(@NotNull final AnActionEvent event) { + Project project = event.getProject(); if (project != null) { String projectSDKName = ProjectRootManager.getInstance(project).getProjectSdkName(); String newProjectSdkName = "New Sdk Name"; @@ -23,11 +24,11 @@ public class ProjectSdkAction extends AnAction { } @Override - public void update(final AnActionEvent e) { - Project project = e.getProject(); + public void update(@NotNull final AnActionEvent event) { + Project project = event.getProject(); if (project != null) { Sdk sdk = ProjectRootManager.getInstance(project).getProjectSdk(); - e.getPresentation().setEnabledAndVisible(sdk != null); + event.getPresentation().setEnabledAndVisible(sdk != null); } } } diff --git a/project_model/src/com/intellij/tutorials/project/model/ShowSourceRootsActions.java b/project_model/src/com/intellij/tutorials/project/model/ShowSourceRootsActions.java index c325cb410..2a7d5e527 100644 --- a/project_model/src/com/intellij/tutorials/project/model/ShowSourceRootsActions.java +++ b/project_model/src/com/intellij/tutorials/project/model/ShowSourceRootsActions.java @@ -6,14 +6,15 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; /** * @author Anna Bulenkova */ public class ShowSourceRootsActions extends AnAction { @Override - public void actionPerformed(final AnActionEvent anActionEvent) { - Project project = anActionEvent.getProject(); + public void actionPerformed(@NotNull final AnActionEvent event) { + Project project = event.getProject(); if (project == null) return; String projectName = project.getName(); StringBuilder sourceRootsList = new StringBuilder(); @@ -25,9 +26,9 @@ public class ShowSourceRootsActions extends AnAction { } @Override - public void update(final AnActionEvent e) { - boolean visibility = e.getProject() != null; - e.getPresentation().setEnabled(visibility); - e.getPresentation().setVisible(visibility); + public void update(@NotNull final AnActionEvent event) { + boolean visibility = event.getProject() != null; + event.getPresentation().setEnabled(visibility); + event.getPresentation().setVisible(visibility); } } From 3f4f6fe4b32d2f35289bf44818196311ef8439cc Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Wed, 4 Feb 2015 11:32:17 +0100 Subject: [PATCH 071/104] [code] cleanup --- tree_structure_provider/META-INF/plugin.xml | 2 +- .../tree => tree/structure}/TextOnlyTreeStructureProvider.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename tree_structure_provider/scr/org/jetbrains/tutorials/{sample/tree => tree/structure}/TextOnlyTreeStructureProvider.java (96%) diff --git a/tree_structure_provider/META-INF/plugin.xml b/tree_structure_provider/META-INF/plugin.xml index 6d686c6f5..c39427206 100644 --- a/tree_structure_provider/META-INF/plugin.xml +++ b/tree_structure_provider/META-INF/plugin.xml @@ -13,7 +13,7 @@ com.intellij.modules.lang - + diff --git a/tree_structure_provider/scr/org/jetbrains/tutorials/sample/tree/TextOnlyTreeStructureProvider.java b/tree_structure_provider/scr/org/jetbrains/tutorials/tree/structure/TextOnlyTreeStructureProvider.java similarity index 96% rename from tree_structure_provider/scr/org/jetbrains/tutorials/sample/tree/TextOnlyTreeStructureProvider.java rename to tree_structure_provider/scr/org/jetbrains/tutorials/tree/structure/TextOnlyTreeStructureProvider.java index 1a387174b..58fb2b216 100644 --- a/tree_structure_provider/scr/org/jetbrains/tutorials/sample/tree/TextOnlyTreeStructureProvider.java +++ b/tree_structure_provider/scr/org/jetbrains/tutorials/tree/structure/TextOnlyTreeStructureProvider.java @@ -1,4 +1,4 @@ -package org.jetbrains.tutorials.sample.tree; +package org.jetbrains.tutorials.tree.structure; import com.intellij.ide.projectView.TreeStructureProvider; import com.intellij.ide.projectView.ViewSettings; From e6cde7920edca575a8b28b59b7d029b92e8a0c34 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Wed, 4 Feb 2015 12:43:55 +0100 Subject: [PATCH 072/104] [code] simple custom run configuration --- run_configuration/META-INF/plugin.xml | 30 +++++++++++++ run_configuration/run_configuration.iml | 12 +++++ .../DemoConfigurationFactory.java | 27 ++++++++++++ .../configuration/DemoRunConfiguration.java | 36 +++++++++++++++ .../DemoRunConfigurationType.java | 39 ++++++++++++++++ .../run/configuration/DemoSettingsEditor.form | 29 ++++++++++++ .../run/configuration/DemoSettingsEditor.java | 44 +++++++++++++++++++ 7 files changed, 217 insertions(+) create mode 100644 run_configuration/META-INF/plugin.xml create mode 100644 run_configuration/run_configuration.iml create mode 100644 run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoConfigurationFactory.java create mode 100644 run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoRunConfiguration.java create mode 100644 run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoRunConfigurationType.java create mode 100644 run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoSettingsEditor.form create mode 100644 run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoSettingsEditor.java diff --git a/run_configuration/META-INF/plugin.xml b/run_configuration/META-INF/plugin.xml new file mode 100644 index 000000000..e29508754 --- /dev/null +++ b/run_configuration/META-INF/plugin.xml @@ -0,0 +1,30 @@ + + org.jetbrains.tutorials.run.configuration + Run Configuration + 1.0 + JetBrains + + Illustration of working with run configurations + + Initial commit + + + + com.intellij.modules.lang + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/run_configuration/run_configuration.iml b/run_configuration/run_configuration.iml new file mode 100644 index 000000000..de3c6c143 --- /dev/null +++ b/run_configuration/run_configuration.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoConfigurationFactory.java b/run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoConfigurationFactory.java new file mode 100644 index 000000000..a475e8373 --- /dev/null +++ b/run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoConfigurationFactory.java @@ -0,0 +1,27 @@ +package org.jetbrains.tutorials.run.configuration; + +import com.intellij.execution.configurations.ConfigurationFactory; +import com.intellij.execution.configurations.ConfigurationType; +import com.intellij.execution.configurations.RunConfiguration; +import com.intellij.openapi.project.Project; + +/** + * @author Anna Bulenkova + */ +public class DemoConfigurationFactory extends ConfigurationFactory { + private static final String FACTORY_NAME = "Demo configuration factory"; + + protected DemoConfigurationFactory(ConfigurationType type) { + super(type); + } + + @Override + public RunConfiguration createTemplateConfiguration(Project project) { + return new DemoRunConfiguration(project, this, "Demo"); + } + + @Override + public String getName() { + return FACTORY_NAME; + } +} diff --git a/run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoRunConfiguration.java b/run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoRunConfiguration.java new file mode 100644 index 000000000..1ab7c7de3 --- /dev/null +++ b/run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoRunConfiguration.java @@ -0,0 +1,36 @@ +package org.jetbrains.tutorials.run.configuration; + +import com.intellij.execution.ExecutionException; +import com.intellij.execution.Executor; +import com.intellij.execution.configurations.*; +import com.intellij.execution.runners.ExecutionEnvironment; +import com.intellij.openapi.options.SettingsEditor; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Anna Bulenkova + */ +public class DemoRunConfiguration extends RunConfigurationBase { + protected DemoRunConfiguration(Project project, ConfigurationFactory factory, String name) { + super(project, factory, name); + } + + @NotNull + @Override + public SettingsEditor getConfigurationEditor() { + return new DemoSettingsEditor(); + } + + @Override + public void checkConfiguration() throws RuntimeConfigurationException { + + } + + @Nullable + @Override + public RunProfileState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment executionEnvironment) throws ExecutionException { + return null; + } +} diff --git a/run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoRunConfigurationType.java b/run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoRunConfigurationType.java new file mode 100644 index 000000000..bac651411 --- /dev/null +++ b/run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoRunConfigurationType.java @@ -0,0 +1,39 @@ +package org.jetbrains.tutorials.run.configuration; + +import com.intellij.execution.configurations.ConfigurationFactory; +import com.intellij.execution.configurations.ConfigurationType; +import com.intellij.icons.AllIcons; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; + +/** + * @author Anna Bulenkova + */ +public class DemoRunConfigurationType implements ConfigurationType { + @Override + public String getDisplayName() { + return "Demo"; + } + + @Override + public String getConfigurationTypeDescription() { + return "Demo Run Configuration Type"; + } + + @Override + public Icon getIcon() { + return AllIcons.General.Information; + } + + @NotNull + @Override + public String getId() { + return "DEMO_RUN_CONFIGURATION"; + } + + @Override + public ConfigurationFactory[] getConfigurationFactories() { + return new ConfigurationFactory[]{new DemoConfigurationFactory(this)}; + } +} diff --git a/run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoSettingsEditor.form b/run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoSettingsEditor.form new file mode 100644 index 000000000..d9dd1f253 --- /dev/null +++ b/run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoSettingsEditor.form @@ -0,0 +1,29 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoSettingsEditor.java b/run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoSettingsEditor.java new file mode 100644 index 000000000..db66fec90 --- /dev/null +++ b/run_configuration/src/org/jetbrains/tutorials/run/configuration/DemoSettingsEditor.java @@ -0,0 +1,44 @@ +package org.jetbrains.tutorials.run.configuration; + +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.options.SettingsEditor; +import com.intellij.openapi.ui.ComponentWithBrowseButton; +import com.intellij.openapi.ui.LabeledComponent; +import com.intellij.openapi.ui.TextFieldWithBrowseButton; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; + +/** + * @author Anna Bulenkova + */ + +/** + * @author Anna Bulenkova + */ +public class DemoSettingsEditor extends SettingsEditor { + private JPanel myPanel; + private LabeledComponent myMainClass; + + @Override + protected void resetEditorFrom(DemoRunConfiguration demoRunConfiguration) { + + } + + @Override + protected void applyEditorTo(DemoRunConfiguration demoRunConfiguration) throws ConfigurationException { + + } + + @NotNull + @Override + protected JComponent createEditor() { + return myPanel; + } + + private void createUIComponents() { + myMainClass = new LabeledComponent(); + myMainClass.setComponent(new TextFieldWithBrowseButton()); + } +} + From e1356b3584be7a03cbf8495d501557a706bfca86 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Fri, 6 Feb 2015 11:34:19 +0100 Subject: [PATCH 073/104] [code] facet demo --- facet_basics/META-INF/plugin.xml | 57 ++++++------- .../intellij/tutorials/facet/DemoFacet.java | 16 ++++ .../facet/DemoFacetConfiguration.java | 79 +++++++++++++++++++ .../tutorials/facet/DemoFacetType.java | 43 ++++++++++ 4 files changed, 163 insertions(+), 32 deletions(-) create mode 100644 facet_basics/src/com/intellij/tutorials/facet/DemoFacet.java create mode 100644 facet_basics/src/com/intellij/tutorials/facet/DemoFacetConfiguration.java create mode 100644 facet_basics/src/com/intellij/tutorials/facet/DemoFacetType.java diff --git a/facet_basics/META-INF/plugin.xml b/facet_basics/META-INF/plugin.xml index 01841ba44..5b15982c7 100644 --- a/facet_basics/META-INF/plugin.xml +++ b/facet_basics/META-INF/plugin.xml @@ -1,43 +1,36 @@ - com.yourcompany.unique.plugin.id - Plugin display name here - 1.0 - YourCompany + com.intellij.tutorials.facet + Facet Demo + 1.0 + JetBrains - - most HTML tags may be used - ]]> + Basic example of working with facets - - most HTML tags may be used - ]]> - + Initial commit - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + \ No newline at end of file diff --git a/facet_basics/src/com/intellij/tutorials/facet/DemoFacet.java b/facet_basics/src/com/intellij/tutorials/facet/DemoFacet.java new file mode 100644 index 000000000..804f6d1a4 --- /dev/null +++ b/facet_basics/src/com/intellij/tutorials/facet/DemoFacet.java @@ -0,0 +1,16 @@ +package com.intellij.tutorials.facet; + +import com.intellij.facet.Facet; +import com.intellij.facet.FacetType; +import com.intellij.openapi.module.Module; + +/** + * @author Anna Bulenkova + */ +public class DemoFacet extends Facet { + public static final String ID = "DEMO_FACET_ID"; + + public DemoFacet(FacetType facetType, Module module, String name, DemoFacetConfiguration configuration, Facet underlyingFacet) { + super(facetType, module, name, configuration, underlyingFacet); + } +} diff --git a/facet_basics/src/com/intellij/tutorials/facet/DemoFacetConfiguration.java b/facet_basics/src/com/intellij/tutorials/facet/DemoFacetConfiguration.java new file mode 100644 index 000000000..8ba2f450b --- /dev/null +++ b/facet_basics/src/com/intellij/tutorials/facet/DemoFacetConfiguration.java @@ -0,0 +1,79 @@ +package com.intellij.tutorials.facet; + +import com.intellij.facet.FacetConfiguration; +import com.intellij.facet.ui.FacetEditorContext; +import com.intellij.facet.ui.FacetEditorTab; +import com.intellij.facet.ui.FacetValidatorsManager; +import com.intellij.openapi.util.InvalidDataException; +import com.intellij.openapi.util.WriteExternalException; +import org.jdom.Element; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import java.awt.*; + +/** + * @author Anna Bulenkova + */ +public class DemoFacetConfiguration implements FacetConfiguration { + public static final String DEMO_FACET_TAG_NAME = "DemoFacet"; + public static final String PATH_TO_SDK_ATTR_NAME = "pathToSdk"; + private String myPathToSdk = ""; + JTextField myPath = new JTextField(myPathToSdk); + @Override + public FacetEditorTab[] createEditorTabs(FacetEditorContext context, FacetValidatorsManager manager) { + return new FacetEditorTab[] { + new FacetEditorTab() { + + @NotNull + @Override + public JComponent createComponent() { + JPanel top = new JPanel(new BorderLayout()); + top.add(new JLabel("Path to SDK: "), BorderLayout.WEST); + top.add(myPath); + JPanel panel = new JPanel(new BorderLayout()); + panel.add(top, BorderLayout.NORTH); + return panel; + } + + @Nls + @Override + public String getDisplayName() { + return "Demo Framework"; + } + + @Override + public boolean isModified() { + return myPath.getText().equalsIgnoreCase(myPathToSdk); +// return !StringUtil.equalsIgnoreWhitespaces(myPath.getText(), myPathToSdk); + } + + @Override + public void reset() { + myPath.setText(myPathToSdk); + } + + @Override + public void disposeUIResources() { + } + } + }; + } + + @Override + public void readExternal(Element element) throws InvalidDataException { + Element facet = element.getChild(DEMO_FACET_TAG_NAME); + if (facet != null) { + myPathToSdk = facet.getAttributeValue(PATH_TO_SDK_ATTR_NAME, ""); + myPath.setText(myPathToSdk); + } + } + + @Override + public void writeExternal(Element element) throws WriteExternalException { + Element facet = new Element(DEMO_FACET_TAG_NAME); + facet.setAttribute(PATH_TO_SDK_ATTR_NAME, myPathToSdk); + element.addContent(facet); + } +} diff --git a/facet_basics/src/com/intellij/tutorials/facet/DemoFacetType.java b/facet_basics/src/com/intellij/tutorials/facet/DemoFacetType.java new file mode 100644 index 000000000..f1664fd45 --- /dev/null +++ b/facet_basics/src/com/intellij/tutorials/facet/DemoFacetType.java @@ -0,0 +1,43 @@ +package com.intellij.tutorials.facet; + +import com.intellij.facet.Facet; +import com.intellij.facet.FacetType; +import com.intellij.facet.FacetTypeId; +import com.intellij.icons.AllIcons; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +/** + * @author Anna Bulenkova + */ +public class DemoFacetType extends FacetType { + private static final FacetTypeId TYPE_ID = new FacetTypeId(DemoFacet.ID); + public DemoFacetType() { + super(TYPE_ID, DemoFacet.ID, "Demo Facet"); + } + + @Override + public DemoFacetConfiguration createDefaultConfiguration() { + return new DemoFacetConfiguration(); + } + + @Override + public DemoFacet createFacet(@NotNull Module module, String s, @NotNull DemoFacetConfiguration configuration, Facet facet) { + return new DemoFacet(this, module, s, configuration, facet); + } + + @Override + public boolean isSuitableModuleType(ModuleType type) { + return true; + } + + @Nullable + @Override + public Icon getIcon() { + return AllIcons.General.Information; + } +} From 7cee8b78316919c5b2c8eb606c2a83f62aabaa65 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Fri, 6 Feb 2015 11:46:28 +0100 Subject: [PATCH 074/104] [code] module demo stub --- module/META-INF/plugin.xml | 35 +++++++++++++++++++++++++++++++++++ module/module.iml | 12 ++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 module/META-INF/plugin.xml create mode 100644 module/module.iml diff --git a/module/META-INF/plugin.xml b/module/META-INF/plugin.xml new file mode 100644 index 000000000..21c3f65e0 --- /dev/null +++ b/module/META-INF/plugin.xml @@ -0,0 +1,35 @@ + + com.intellij.tutorials.module + Module Type Demo + 1.0 + JetBrains + + Basic example of working with module types + + Initial commit + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module/module.iml b/module/module.iml new file mode 100644 index 000000000..de3c6c143 --- /dev/null +++ b/module/module.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file From f185d1af733a5dea84de24b4231738e61232cde2 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Fri, 6 Feb 2015 14:34:28 +0100 Subject: [PATCH 075/104] [code] module demo --- module/META-INF/plugin.xml | 1 + .../tutorials/module/DemoModuleBuilder.java | 31 ++++++++++ .../tutorials/module/DemoModuleType.java | 60 +++++++++++++++++++ .../module/DemoModuleWizardStep.java | 20 +++++++ 4 files changed, 112 insertions(+) create mode 100644 module/src/com/intellij/tutorials/module/DemoModuleBuilder.java create mode 100644 module/src/com/intellij/tutorials/module/DemoModuleType.java create mode 100644 module/src/com/intellij/tutorials/module/DemoModuleWizardStep.java diff --git a/module/META-INF/plugin.xml b/module/META-INF/plugin.xml index 21c3f65e0..5c8f2e4a6 100644 --- a/module/META-INF/plugin.xml +++ b/module/META-INF/plugin.xml @@ -18,6 +18,7 @@ --> + diff --git a/module/src/com/intellij/tutorials/module/DemoModuleBuilder.java b/module/src/com/intellij/tutorials/module/DemoModuleBuilder.java new file mode 100644 index 000000000..23417dcbc --- /dev/null +++ b/module/src/com/intellij/tutorials/module/DemoModuleBuilder.java @@ -0,0 +1,31 @@ +package com.intellij.tutorials.module; + +import com.intellij.ide.util.projectWizard.ModuleBuilder; +import com.intellij.ide.util.projectWizard.ModuleWizardStep; +import com.intellij.ide.util.projectWizard.WizardContext; +import com.intellij.openapi.Disposable; +import com.intellij.openapi.module.ModuleType; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.roots.ModifiableRootModel; +import org.jetbrains.annotations.Nullable; + +/** + * @author Anna Bulenkova + */ +public class DemoModuleBuilder extends ModuleBuilder { + @Override + public void setupRootModel(ModifiableRootModel model) throws ConfigurationException { + + } + + @Override + public ModuleType getModuleType() { + return DemoModuleType.getInstance(); + } + + @Nullable + @Override + public ModuleWizardStep getCustomOptionsStep(WizardContext context, Disposable parentDisposable) { + return new DemoModuleWizardStep(); + } +} diff --git a/module/src/com/intellij/tutorials/module/DemoModuleType.java b/module/src/com/intellij/tutorials/module/DemoModuleType.java new file mode 100644 index 000000000..9733741f0 --- /dev/null +++ b/module/src/com/intellij/tutorials/module/DemoModuleType.java @@ -0,0 +1,60 @@ +package com.intellij.tutorials.module; + +import com.intellij.icons.AllIcons; +import com.intellij.ide.util.projectWizard.ModuleWizardStep; +import com.intellij.ide.util.projectWizard.WizardContext; +import com.intellij.openapi.module.ModuleType; +import com.intellij.openapi.module.ModuleTypeManager; +import com.intellij.openapi.roots.ui.configuration.ModulesProvider; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; + +/** + * @author Anna Bulenkova + */ +public class DemoModuleType extends ModuleType { + private static final String ID = "DEMO_MODULE_TYPE"; + + public DemoModuleType() { + super(ID); + } + + public static DemoModuleType getInstance() { + return (DemoModuleType) ModuleTypeManager.getInstance().findByID(ID); + } + + @NotNull + @Override + public DemoModuleBuilder createModuleBuilder() { + return new DemoModuleBuilder(); + } + + @NotNull + @Override + public String getName() { + return "Demo"; + } + + @NotNull + @Override + public String getDescription() { + return "Demo Module Type"; + } + + @Override + public Icon getBigIcon() { + return AllIcons.General.Information; + } + + @Override + public Icon getNodeIcon(@Deprecated boolean b) { + return AllIcons.General.Information; + } + + @NotNull + @Override + public ModuleWizardStep[] createWizardSteps(@NotNull WizardContext wizardContext, @NotNull DemoModuleBuilder moduleBuilder, @NotNull ModulesProvider modulesProvider) { + return super.createWizardSteps(wizardContext, moduleBuilder, modulesProvider); + } +} diff --git a/module/src/com/intellij/tutorials/module/DemoModuleWizardStep.java b/module/src/com/intellij/tutorials/module/DemoModuleWizardStep.java new file mode 100644 index 000000000..4227d9e4d --- /dev/null +++ b/module/src/com/intellij/tutorials/module/DemoModuleWizardStep.java @@ -0,0 +1,20 @@ +package com.intellij.tutorials.module; + +import com.intellij.ide.util.projectWizard.ModuleWizardStep; + +import javax.swing.*; + +/** + * @author Anna Bulenkova + */ +public class DemoModuleWizardStep extends ModuleWizardStep { + @Override + public JComponent getComponent() { + return new JLabel("Provide some setting here"); + } + + @Override + public void updateDataModel() { + //todo update model according to UI + } +} From e46b5164024495e731d5c637f40dfc63b900f52c Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 10 Feb 2015 11:50:57 +0100 Subject: [PATCH 076/104] [code] code inspection stub --- inspection/META-INF/plugin.xml | 35 ++++++++++++++++++++++++++++++++++ inspection/inspection.iml | 12 ++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 inspection/META-INF/plugin.xml create mode 100644 inspection/inspection.iml diff --git a/inspection/META-INF/plugin.xml b/inspection/META-INF/plugin.xml new file mode 100644 index 000000000..944074681 --- /dev/null +++ b/inspection/META-INF/plugin.xml @@ -0,0 +1,35 @@ + + com.intellij.tutorials.inspection + Module Type Demo + 1.0 + JetBrains + + Basic example of working with code inspections + + Initial commit + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/inspection/inspection.iml b/inspection/inspection.iml new file mode 100644 index 000000000..de3c6c143 --- /dev/null +++ b/inspection/inspection.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file From 95c98a91c5d9559f9fd3fbd530120f983cab4dee Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 10 Feb 2015 11:59:57 +0100 Subject: [PATCH 077/104] [code] typo --- module/META-INF/plugin.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/META-INF/plugin.xml b/module/META-INF/plugin.xml index 5c8f2e4a6..2b6c1bab7 100644 --- a/module/META-INF/plugin.xml +++ b/module/META-INF/plugin.xml @@ -2,7 +2,7 @@ com.intellij.tutorials.module Module Type Demo 1.0 - JetBrains + JetBrains Basic example of working with module types From db017b189ce677c412826a3972c000ae49ab2362 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Tue, 10 Feb 2015 12:03:24 +0100 Subject: [PATCH 078/104] Header fixed --- inspection/META-INF/plugin.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inspection/META-INF/plugin.xml b/inspection/META-INF/plugin.xml index 944074681..7e035030c 100644 --- a/inspection/META-INF/plugin.xml +++ b/inspection/META-INF/plugin.xml @@ -1,6 +1,6 @@ com.intellij.tutorials.inspection - Module Type Demo + Inspection Demo 1.0 JetBrains From a7f7dc988f04cf539e1d36581d9660976e53336e Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Fri, 8 May 2015 13:01:52 +0200 Subject: [PATCH 079/104] [source] link to confluence dropped --- tree_structure_provider/META-INF/plugin.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/tree_structure_provider/META-INF/plugin.xml b/tree_structure_provider/META-INF/plugin.xml index c39427206..8115e55c1 100644 --- a/tree_structure_provider/META-INF/plugin.xml +++ b/tree_structure_provider/META-INF/plugin.xml @@ -8,7 +8,6 @@ Initial commit - com.intellij.modules.lang From ef54820f3c7469353673b6d3c46ed2601be882a8 Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Wed, 13 May 2015 11:29:09 +0200 Subject: [PATCH 080/104] [code] "code inspections" sample stub --- inspection/META-INF/plugin.xml | 9 ++----- inspection/inspection.iml | 1 + .../inspection/DemoCodeInspection.java | 24 +++++++++++++++++++ .../DemoInspectionToolProvider.java | 12 ++++++++++ .../inspection/DemoInspectionVisitor.java | 20 ++++++++++++++++ .../scr/inspectionDescriptions/DemoCode.html | 7 ++++++ 6 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 inspection/scr/com/intellij/tutorials/inspection/DemoCodeInspection.java create mode 100644 inspection/scr/com/intellij/tutorials/inspection/DemoInspectionToolProvider.java create mode 100644 inspection/scr/com/intellij/tutorials/inspection/DemoInspectionVisitor.java create mode 100644 inspection/scr/inspectionDescriptions/DemoCode.html diff --git a/inspection/META-INF/plugin.xml b/inspection/META-INF/plugin.xml index 7e035030c..f978c00de 100644 --- a/inspection/META-INF/plugin.xml +++ b/inspection/META-INF/plugin.xml @@ -8,16 +8,11 @@ Initial commit - - - - + + diff --git a/inspection/inspection.iml b/inspection/inspection.iml index de3c6c143..ce87c095c 100644 --- a/inspection/inspection.iml +++ b/inspection/inspection.iml @@ -5,6 +5,7 @@ + diff --git a/inspection/scr/com/intellij/tutorials/inspection/DemoCodeInspection.java b/inspection/scr/com/intellij/tutorials/inspection/DemoCodeInspection.java new file mode 100644 index 000000000..7b88a1055 --- /dev/null +++ b/inspection/scr/com/intellij/tutorials/inspection/DemoCodeInspection.java @@ -0,0 +1,24 @@ +package com.intellij.tutorials.inspection; + +import com.intellij.codeInspection.LocalInspectionTool; +import com.intellij.codeInspection.ProblemsHolder; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; + +/** + * @author Anna Bulenkova + */ +public class DemoCodeInspection extends LocalInspectionTool { + @Nls + @NotNull + @Override + public String getDisplayName() { + return "Demo Inspection"; + } + + @NotNull + @Override + public DemoInspectionVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) { + return new DemoInspectionVisitor(); + } +} diff --git a/inspection/scr/com/intellij/tutorials/inspection/DemoInspectionToolProvider.java b/inspection/scr/com/intellij/tutorials/inspection/DemoInspectionToolProvider.java new file mode 100644 index 000000000..aad593a5c --- /dev/null +++ b/inspection/scr/com/intellij/tutorials/inspection/DemoInspectionToolProvider.java @@ -0,0 +1,12 @@ +package com.intellij.tutorials.inspection; + +import com.intellij.codeInspection.InspectionToolProvider; + +/** + * @author Anna Bulenkova + */ +public class DemoInspectionToolProvider implements InspectionToolProvider { + public Class[] getInspectionClasses() { + return new Class[] { DemoCodeInspection.class}; + } +} diff --git a/inspection/scr/com/intellij/tutorials/inspection/DemoInspectionVisitor.java b/inspection/scr/com/intellij/tutorials/inspection/DemoInspectionVisitor.java new file mode 100644 index 000000000..96e73fe5c --- /dev/null +++ b/inspection/scr/com/intellij/tutorials/inspection/DemoInspectionVisitor.java @@ -0,0 +1,20 @@ +package com.intellij.tutorials.inspection; + +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; +import com.intellij.psi.PsiPlainTextFile; + +/** + * @author Anna Bulenkova + */ +public class DemoInspectionVisitor extends PsiElementVisitor { + @Override + public void visitElement(PsiElement element) { + super.visitElement(element); + } + + @Override + public void visitPlainTextFile(PsiPlainTextFile file) { + super.visitPlainTextFile(file); + } +} diff --git a/inspection/scr/inspectionDescriptions/DemoCode.html b/inspection/scr/inspectionDescriptions/DemoCode.html new file mode 100644 index 000000000..942f318aa --- /dev/null +++ b/inspection/scr/inspectionDescriptions/DemoCode.html @@ -0,0 +1,7 @@ + + +Write your description here. + +Text after this comment will not be shown in tooltips. + + \ No newline at end of file From 17e8ddd12d8d782d24fb0af59a9ed6941515f6ab Mon Sep 17 00:00:00 2001 From: Anna Bulenkova Date: Wed, 13 May 2015 13:28:33 +0200 Subject: [PATCH 081/104] [code] cosmetics --- module/src/com/intellij/tutorials/module/DemoModuleType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/src/com/intellij/tutorials/module/DemoModuleType.java b/module/src/com/intellij/tutorials/module/DemoModuleType.java index 9733741f0..e43e92f80 100644 --- a/module/src/com/intellij/tutorials/module/DemoModuleType.java +++ b/module/src/com/intellij/tutorials/module/DemoModuleType.java @@ -33,7 +33,7 @@ public class DemoModuleType extends ModuleType { @NotNull @Override public String getName() { - return "Demo"; + return "Demo Module Type"; } @NotNull From 448e84526134bc7b190d3eff66c96d8ecec3f528 Mon Sep 17 00:00:00 2001 From: breandan Date: Wed, 19 Aug 2015 08:16:30 -0400 Subject: [PATCH 082/104] Fix untracked IDEA config files --- editor_basics/editor_basics.iml | 3 +-- facet_basics/facet_basics.iml | 3 +-- framework/framework.iml | 3 +-- inspection/inspection.iml | 3 +-- module/module.iml | 3 +-- plugin_sample/plugin_sample.iml | 3 +-- project_model/project_model.iml | 3 +-- project_view_pane/project_view_pane.iml | 3 +-- project_wizard/project_wizard.iml | 3 +-- register_actions/register_actions.iml | 3 +-- run_configuration/run_configuration.iml | 3 +-- tree_structure_provider/tree_structure_provider.iml | 3 +-- 12 files changed, 12 insertions(+), 24 deletions(-) diff --git a/editor_basics/editor_basics.iml b/editor_basics/editor_basics.iml index 9352fd5f7..a996ed895 100644 --- a/editor_basics/editor_basics.iml +++ b/editor_basics/editor_basics.iml @@ -1,8 +1,7 @@ - - + diff --git a/facet_basics/facet_basics.iml b/facet_basics/facet_basics.iml index 32a4474ae..4157f07aa 100644 --- a/facet_basics/facet_basics.iml +++ b/facet_basics/facet_basics.iml @@ -1,8 +1,7 @@ - - + diff --git a/framework/framework.iml b/framework/framework.iml index de3c6c143..8dc4df7da 100644 --- a/framework/framework.iml +++ b/framework/framework.iml @@ -1,8 +1,7 @@ - - + diff --git a/inspection/inspection.iml b/inspection/inspection.iml index ce87c095c..658dffd61 100644 --- a/inspection/inspection.iml +++ b/inspection/inspection.iml @@ -1,8 +1,7 @@ - - + diff --git a/module/module.iml b/module/module.iml index de3c6c143..8dc4df7da 100644 --- a/module/module.iml +++ b/module/module.iml @@ -1,8 +1,7 @@ - - + diff --git a/plugin_sample/plugin_sample.iml b/plugin_sample/plugin_sample.iml index 493dcb361..dde7c8295 100644 --- a/plugin_sample/plugin_sample.iml +++ b/plugin_sample/plugin_sample.iml @@ -1,8 +1,7 @@ - - + diff --git a/project_model/project_model.iml b/project_model/project_model.iml index de3c6c143..8dc4df7da 100644 --- a/project_model/project_model.iml +++ b/project_model/project_model.iml @@ -1,8 +1,7 @@ - - + diff --git a/project_view_pane/project_view_pane.iml b/project_view_pane/project_view_pane.iml index de3c6c143..8dc4df7da 100644 --- a/project_view_pane/project_view_pane.iml +++ b/project_view_pane/project_view_pane.iml @@ -1,8 +1,7 @@ - - + diff --git a/project_wizard/project_wizard.iml b/project_wizard/project_wizard.iml index de3c6c143..8dc4df7da 100644 --- a/project_wizard/project_wizard.iml +++ b/project_wizard/project_wizard.iml @@ -1,8 +1,7 @@ - - + diff --git a/register_actions/register_actions.iml b/register_actions/register_actions.iml index de3c6c143..8dc4df7da 100644 --- a/register_actions/register_actions.iml +++ b/register_actions/register_actions.iml @@ -1,8 +1,7 @@ - - + diff --git a/run_configuration/run_configuration.iml b/run_configuration/run_configuration.iml index de3c6c143..8dc4df7da 100644 --- a/run_configuration/run_configuration.iml +++ b/run_configuration/run_configuration.iml @@ -1,8 +1,7 @@ - - + diff --git a/tree_structure_provider/tree_structure_provider.iml b/tree_structure_provider/tree_structure_provider.iml index e04b79911..a94f873c1 100644 --- a/tree_structure_provider/tree_structure_provider.iml +++ b/tree_structure_provider/tree_structure_provider.iml @@ -1,8 +1,7 @@ - - + From 7fe9c621d59619140b5d1bfab1fd2831808490c1 Mon Sep 17 00:00:00 2001 From: cheptsov Date: Mon, 7 Sep 2015 19:13:20 +0300 Subject: [PATCH 083/104] Moved from its repository --- simple_plugin/.idea/.name | 1 + simple_plugin/.idea/ant.xml | 7 + simple_plugin/.idea/compiler.xml | 23 + .../.idea/copyright/profiles_settings.xml | 3 + simple_plugin/.idea/encodings.xml | 5 + simple_plugin/.idea/misc.xml | 17 + simple_plugin/.idea/modules.xml | 9 + .../.idea/runConfigurations/Plugin.xml | 17 + .../.idea/runConfigurations/Tests.xml | 31 ++ simple_plugin/.idea/scopes/scope_settings.xml | 5 + simple_plugin/.idea/vcs.xml | 7 + simple_plugin/JFlex.jar | Bin 0 -> 193380 bytes simple_plugin/META-INF/plugin.xml | 60 +++ simple_plugin/SimplePlugin.iml | 14 + .../com/simpleplugin/parser/SimpleParser.java | 104 ++++ .../com/simpleplugin/psi/SimpleProperty.java | 23 + .../gen/com/simpleplugin/psi/SimpleTypes.java | 28 + .../com/simpleplugin/psi/SimpleVisitor.java | 22 + .../psi/impl/SimplePropertyImpl.java | 49 ++ simple_plugin/idea-flex.skeleton | 251 +++++++++ .../simpleplugin/CreatePropertyQuickFix.java | 99 ++++ simple_plugin/src/com/simpleplugin/Simple.bnf | 23 + .../src/com/simpleplugin/Simple.flex | 46 ++ .../src/com/simpleplugin/SimpleAnnotator.java | 41 ++ .../src/com/simpleplugin/SimpleBlock.java | 57 ++ .../SimpleChooseByNameContributor.java | 33 ++ .../simpleplugin/SimpleCodeStyleSettings.java | 10 + .../SimpleCodeStyleSettingsProvider.java | 47 ++ .../simpleplugin/SimpleColorSettingsPage.java | 73 +++ .../src/com/simpleplugin/SimpleCommenter.java | 36 ++ .../SimpleCompletionContributor.java | 23 + .../src/com/simpleplugin/SimpleFileType.java | 39 ++ .../simpleplugin/SimpleFileTypeFactory.java | 12 + .../com/simpleplugin/SimpleFilterLexer.java | 19 + .../SimpleFindUsagesProvider.java | 65 +++ .../simpleplugin/SimpleFoldingBuilder.java | 65 +++ .../SimpleFormattingModelBuilder.java | 33 ++ .../src/com/simpleplugin/SimpleIcons.java | 9 + .../src/com/simpleplugin/SimpleIdIndexer.java | 17 + .../src/com/simpleplugin/SimpleLanguage.java | 11 + ...mpleLanguageCodeStyleSettingsProvider.java | 43 ++ .../src/com/simpleplugin/SimpleLexer.java | 509 ++++++++++++++++++ .../com/simpleplugin/SimpleLexerAdapter.java | 11 + .../SimpleLineMarkerProvider.java | 34 ++ .../simpleplugin/SimpleParserDefinition.java | 69 +++ .../SimpleRefactoringSupportProvider.java | 12 + .../src/com/simpleplugin/SimpleReference.java | 58 ++ .../SimpleReferenceContributor.java | 26 + .../SimpleStructureViewElement.java | 72 +++ .../SimpleStructureViewFactory.java | 24 + .../SimpleStructureViewModel.java | 32 ++ .../simpleplugin/SimpleSyntaxHighlighter.java | 52 ++ .../SimpleSyntaxHighlighterFactory.java | 15 + .../com/simpleplugin/SimpleTodoIndexer.java | 12 + .../src/com/simpleplugin/SimpleUtil.java | 57 ++ .../src/com/simpleplugin/icons/jar-gray.png | Bin 0 -> 729 bytes .../psi/SimpleElementFactory.java | 29 + .../simpleplugin/psi/SimpleElementType.java | 12 + .../src/com/simpleplugin/psi/SimpleFile.java | 32 ++ .../simpleplugin/psi/SimpleNamedElement.java | 6 + .../com/simpleplugin/psi/SimpleTokenType.java | 17 + .../psi/impl/SimpleNamedElementImpl.java | 12 + .../psi/impl/SimplePsiImplUtil.java | 81 +++ simple_plugin/testData/AnnotatorTestData.java | 7 + simple_plugin/testData/CompleteTestData.java | 5 + simple_plugin/testData/DefaultTestData.simple | 14 + .../testData/FindUsagesTestData.java | 5 + .../testData/FindUsagesTestData.simple | 13 + simple_plugin/testData/FoldingTestData.java | 11 + .../testData/FormatterTestData.simple | 15 + simple_plugin/testData/ParsingTestData.simple | 17 + simple_plugin/testData/ParsingTestData.txt | 63 +++ simple_plugin/testData/ReferenceTestData.java | 5 + simple_plugin/testData/RenameTestData.java | 5 + simple_plugin/testData/RenameTestData.simple | 13 + .../testData/RenameTestDataAfter.simple | 13 + .../simpleplugin/SimpleCodeInsightTest.java | 86 +++ .../com/simpleplugin/SimpleParsingTest.java | 28 + 78 files changed, 2949 insertions(+) create mode 100644 simple_plugin/.idea/.name create mode 100644 simple_plugin/.idea/ant.xml create mode 100644 simple_plugin/.idea/compiler.xml create mode 100644 simple_plugin/.idea/copyright/profiles_settings.xml create mode 100644 simple_plugin/.idea/encodings.xml create mode 100644 simple_plugin/.idea/misc.xml create mode 100644 simple_plugin/.idea/modules.xml create mode 100644 simple_plugin/.idea/runConfigurations/Plugin.xml create mode 100644 simple_plugin/.idea/runConfigurations/Tests.xml create mode 100644 simple_plugin/.idea/scopes/scope_settings.xml create mode 100644 simple_plugin/.idea/vcs.xml create mode 100644 simple_plugin/JFlex.jar create mode 100644 simple_plugin/META-INF/plugin.xml create mode 100644 simple_plugin/SimplePlugin.iml create mode 100644 simple_plugin/gen/com/simpleplugin/parser/SimpleParser.java create mode 100644 simple_plugin/gen/com/simpleplugin/psi/SimpleProperty.java create mode 100644 simple_plugin/gen/com/simpleplugin/psi/SimpleTypes.java create mode 100644 simple_plugin/gen/com/simpleplugin/psi/SimpleVisitor.java create mode 100644 simple_plugin/gen/com/simpleplugin/psi/impl/SimplePropertyImpl.java create mode 100644 simple_plugin/idea-flex.skeleton create mode 100644 simple_plugin/src/com/simpleplugin/CreatePropertyQuickFix.java create mode 100644 simple_plugin/src/com/simpleplugin/Simple.bnf create mode 100644 simple_plugin/src/com/simpleplugin/Simple.flex create mode 100644 simple_plugin/src/com/simpleplugin/SimpleAnnotator.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleBlock.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleChooseByNameContributor.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettings.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettingsProvider.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleColorSettingsPage.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleCommenter.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleCompletionContributor.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleFileType.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleFileTypeFactory.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleFilterLexer.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleFoldingBuilder.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleFormattingModelBuilder.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleIcons.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleIdIndexer.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleLanguage.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleLanguageCodeStyleSettingsProvider.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleLexer.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleLexerAdapter.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleLineMarkerProvider.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleParserDefinition.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleRefactoringSupportProvider.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleReference.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleReferenceContributor.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleStructureViewElement.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleStructureViewFactory.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleStructureViewModel.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighter.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighterFactory.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleTodoIndexer.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleUtil.java create mode 100644 simple_plugin/src/com/simpleplugin/icons/jar-gray.png create mode 100644 simple_plugin/src/com/simpleplugin/psi/SimpleElementFactory.java create mode 100644 simple_plugin/src/com/simpleplugin/psi/SimpleElementType.java create mode 100644 simple_plugin/src/com/simpleplugin/psi/SimpleFile.java create mode 100644 simple_plugin/src/com/simpleplugin/psi/SimpleNamedElement.java create mode 100644 simple_plugin/src/com/simpleplugin/psi/SimpleTokenType.java create mode 100644 simple_plugin/src/com/simpleplugin/psi/impl/SimpleNamedElementImpl.java create mode 100644 simple_plugin/src/com/simpleplugin/psi/impl/SimplePsiImplUtil.java create mode 100644 simple_plugin/testData/AnnotatorTestData.java create mode 100644 simple_plugin/testData/CompleteTestData.java create mode 100644 simple_plugin/testData/DefaultTestData.simple create mode 100644 simple_plugin/testData/FindUsagesTestData.java create mode 100644 simple_plugin/testData/FindUsagesTestData.simple create mode 100644 simple_plugin/testData/FoldingTestData.java create mode 100644 simple_plugin/testData/FormatterTestData.simple create mode 100644 simple_plugin/testData/ParsingTestData.simple create mode 100644 simple_plugin/testData/ParsingTestData.txt create mode 100644 simple_plugin/testData/ReferenceTestData.java create mode 100644 simple_plugin/testData/RenameTestData.java create mode 100644 simple_plugin/testData/RenameTestData.simple create mode 100644 simple_plugin/testData/RenameTestDataAfter.simple create mode 100644 simple_plugin/tests/com/simpleplugin/SimpleCodeInsightTest.java create mode 100644 simple_plugin/tests/com/simpleplugin/SimpleParsingTest.java diff --git a/simple_plugin/.idea/.name b/simple_plugin/.idea/.name new file mode 100644 index 000000000..316279c80 --- /dev/null +++ b/simple_plugin/.idea/.name @@ -0,0 +1 @@ +SimplePlugin \ No newline at end of file diff --git a/simple_plugin/.idea/ant.xml b/simple_plugin/.idea/ant.xml new file mode 100644 index 000000000..2581ca3fe --- /dev/null +++ b/simple_plugin/.idea/ant.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/simple_plugin/.idea/compiler.xml b/simple_plugin/.idea/compiler.xml new file mode 100644 index 000000000..217af471a --- /dev/null +++ b/simple_plugin/.idea/compiler.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/simple_plugin/.idea/copyright/profiles_settings.xml b/simple_plugin/.idea/copyright/profiles_settings.xml new file mode 100644 index 000000000..e7bedf337 --- /dev/null +++ b/simple_plugin/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/simple_plugin/.idea/encodings.xml b/simple_plugin/.idea/encodings.xml new file mode 100644 index 000000000..e206d70d8 --- /dev/null +++ b/simple_plugin/.idea/encodings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/simple_plugin/.idea/misc.xml b/simple_plugin/.idea/misc.xml new file mode 100644 index 000000000..1035ff89a --- /dev/null +++ b/simple_plugin/.idea/misc.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/simple_plugin/.idea/modules.xml b/simple_plugin/.idea/modules.xml new file mode 100644 index 000000000..c6008778a --- /dev/null +++ b/simple_plugin/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/simple_plugin/.idea/runConfigurations/Plugin.xml b/simple_plugin/.idea/runConfigurations/Plugin.xml new file mode 100644 index 000000000..da96a36dd --- /dev/null +++ b/simple_plugin/.idea/runConfigurations/Plugin.xml @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/simple_plugin/.idea/runConfigurations/Tests.xml b/simple_plugin/.idea/runConfigurations/Tests.xml new file mode 100644 index 000000000..78f9481d0 --- /dev/null +++ b/simple_plugin/.idea/runConfigurations/Tests.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/simple_plugin/.idea/scopes/scope_settings.xml b/simple_plugin/.idea/scopes/scope_settings.xml new file mode 100644 index 000000000..922003b84 --- /dev/null +++ b/simple_plugin/.idea/scopes/scope_settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/simple_plugin/.idea/vcs.xml b/simple_plugin/.idea/vcs.xml new file mode 100644 index 000000000..275077f82 --- /dev/null +++ b/simple_plugin/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/simple_plugin/JFlex.jar b/simple_plugin/JFlex.jar new file mode 100644 index 0000000000000000000000000000000000000000..8bef2fdbade41dad89b438eb73f7d8343cb8a4e2 GIT binary patch literal 193380 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 dT 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 + com.simpleplugin.unique.plugin.id + Simple + 1.0 + YourCompany + + + most HTML tags may be used + ]]> + + + most HTML tags may be used + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/simple_plugin/SimplePlugin.iml b/simple_plugin/SimplePlugin.iml new file mode 100644 index 000000000..7bc787656 --- /dev/null +++ b/simple_plugin/SimplePlugin.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/simple_plugin/gen/com/simpleplugin/parser/SimpleParser.java b/simple_plugin/gen/com/simpleplugin/parser/SimpleParser.java new file mode 100644 index 000000000..3e28b7da7 --- /dev/null +++ b/simple_plugin/gen/com/simpleplugin/parser/SimpleParser.java @@ -0,0 +1,104 @@ +// This is a generated file. Not intended for manual editing. +package com.simpleplugin.parser; + +import com.intellij.lang.PsiBuilder; +import com.intellij.lang.PsiBuilder.Marker; +import static com.simpleplugin.psi.SimpleTypes.*; +import static com.intellij.lang.parser.GeneratedParserUtilBase.*; +import com.intellij.psi.tree.IElementType; +import com.intellij.lang.ASTNode; +import com.intellij.psi.tree.TokenSet; +import com.intellij.lang.PsiParser; +import com.intellij.lang.LightPsiParser; + +@SuppressWarnings({"SimplifiableIfStatement", "UnusedAssignment"}) +public class SimpleParser implements PsiParser, LightPsiParser { + + public ASTNode parse(IElementType t, PsiBuilder b) { + parseLight(t, b); + return b.getTreeBuilt(); + } + + public void parseLight(IElementType t, PsiBuilder b) { + boolean r; + b = adapt_builder_(t, b, this, null); + Marker m = enter_section_(b, 0, _COLLAPSE_, null); + if (t == PROPERTY) { + r = property(b, 0); + } + else { + r = parse_root_(t, b, 0); + } + exit_section_(b, 0, m, t, r, true, TRUE_CONDITION); + } + + protected boolean parse_root_(IElementType t, PsiBuilder b, int l) { + return simpleFile(b, l + 1); + } + + /* ********************************************************** */ + // property|COMMENT|CRLF + static boolean item_(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "item_")) return false; + boolean r; + Marker m = enter_section_(b); + r = property(b, l + 1); + if (!r) r = consumeToken(b, COMMENT); + if (!r) r = consumeToken(b, CRLF); + exit_section_(b, m, null, r); + return r; + } + + /* ********************************************************** */ + // (KEY? SEPARATOR VALUE?) | KEY + public static boolean property(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "property")) return false; + if (!nextTokenIs(b, "", KEY, SEPARATOR)) return false; + boolean r; + Marker m = enter_section_(b, l, _NONE_, ""); + r = property_0(b, l + 1); + if (!r) r = consumeToken(b, KEY); + exit_section_(b, l, m, PROPERTY, r, false, null); + return r; + } + + // KEY? SEPARATOR VALUE? + private static boolean property_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "property_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = property_0_0(b, l + 1); + r = r && consumeToken(b, SEPARATOR); + r = r && property_0_2(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + + // KEY? + private static boolean property_0_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "property_0_0")) return false; + consumeToken(b, KEY); + return true; + } + + // VALUE? + private static boolean property_0_2(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "property_0_2")) return false; + consumeToken(b, VALUE); + return true; + } + + /* ********************************************************** */ + // item_* + static boolean simpleFile(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "simpleFile")) return false; + int c = current_position_(b); + while (true) { + if (!item_(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "simpleFile", c)) break; + c = current_position_(b); + } + return true; + } + +} diff --git a/simple_plugin/gen/com/simpleplugin/psi/SimpleProperty.java b/simple_plugin/gen/com/simpleplugin/psi/SimpleProperty.java new file mode 100644 index 000000000..2ff5df042 --- /dev/null +++ b/simple_plugin/gen/com/simpleplugin/psi/SimpleProperty.java @@ -0,0 +1,23 @@ +// This is a generated file. Not intended for manual editing. +package com.simpleplugin.psi; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.psi.PsiElement; +import com.intellij.navigation.ItemPresentation; + +public interface SimpleProperty extends SimpleNamedElement { + + String getKey(); + + String getValue(); + + String getName(); + + PsiElement setName(String newName); + + PsiElement getNameIdentifier(); + + ItemPresentation getPresentation(); + +} diff --git a/simple_plugin/gen/com/simpleplugin/psi/SimpleTypes.java b/simple_plugin/gen/com/simpleplugin/psi/SimpleTypes.java new file mode 100644 index 000000000..36792334c --- /dev/null +++ b/simple_plugin/gen/com/simpleplugin/psi/SimpleTypes.java @@ -0,0 +1,28 @@ +// This is a generated file. Not intended for manual editing. +package com.simpleplugin.psi; + +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.PsiElement; +import com.intellij.lang.ASTNode; +import com.simpleplugin.psi.impl.*; + +public interface SimpleTypes { + + IElementType PROPERTY = new SimpleElementType("PROPERTY"); + + IElementType COMMENT = new SimpleTokenType("COMMENT"); + IElementType CRLF = new SimpleTokenType("CRLF"); + IElementType KEY = new SimpleTokenType("KEY"); + IElementType SEPARATOR = new SimpleTokenType("SEPARATOR"); + IElementType VALUE = new SimpleTokenType("VALUE"); + + class Factory { + public static PsiElement createElement(ASTNode node) { + IElementType type = node.getElementType(); + if (type == PROPERTY) { + return new SimplePropertyImpl(node); + } + throw new AssertionError("Unknown element type: " + type); + } + } +} diff --git a/simple_plugin/gen/com/simpleplugin/psi/SimpleVisitor.java b/simple_plugin/gen/com/simpleplugin/psi/SimpleVisitor.java new file mode 100644 index 000000000..504829968 --- /dev/null +++ b/simple_plugin/gen/com/simpleplugin/psi/SimpleVisitor.java @@ -0,0 +1,22 @@ +// This is a generated file. Not intended for manual editing. +package com.simpleplugin.psi; + +import org.jetbrains.annotations.*; +import com.intellij.psi.PsiElementVisitor; +import com.intellij.psi.PsiElement; + +public class SimpleVisitor extends PsiElementVisitor { + + public void visitProperty(@NotNull SimpleProperty o) { + visitNamedElement(o); + } + + public void visitNamedElement(@NotNull SimpleNamedElement o) { + visitPsiElement(o); + } + + public void visitPsiElement(@NotNull PsiElement o) { + visitElement(o); + } + +} diff --git a/simple_plugin/gen/com/simpleplugin/psi/impl/SimplePropertyImpl.java b/simple_plugin/gen/com/simpleplugin/psi/impl/SimplePropertyImpl.java new file mode 100644 index 000000000..7c0abca71 --- /dev/null +++ b/simple_plugin/gen/com/simpleplugin/psi/impl/SimplePropertyImpl.java @@ -0,0 +1,49 @@ +// This is a generated file. Not intended for manual editing. +package com.simpleplugin.psi.impl; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; +import com.intellij.psi.util.PsiTreeUtil; +import static com.simpleplugin.psi.SimpleTypes.*; +import com.simpleplugin.psi.*; +import com.intellij.navigation.ItemPresentation; + +public class SimplePropertyImpl extends SimpleNamedElementImpl implements SimpleProperty { + + public SimplePropertyImpl(ASTNode node) { + super(node); + } + + public void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof SimpleVisitor) ((SimpleVisitor)visitor).visitProperty(this); + else super.accept(visitor); + } + + public String getKey() { + return SimplePsiImplUtil.getKey(this); + } + + public String getValue() { + return SimplePsiImplUtil.getValue(this); + } + + public String getName() { + return SimplePsiImplUtil.getName(this); + } + + public PsiElement setName(String newName) { + return SimplePsiImplUtil.setName(this, newName); + } + + public PsiElement getNameIdentifier() { + return SimplePsiImplUtil.getNameIdentifier(this); + } + + public ItemPresentation getPresentation() { + return SimplePsiImplUtil.getPresentation(this); + } + +} diff --git a/simple_plugin/idea-flex.skeleton b/simple_plugin/idea-flex.skeleton new file mode 100644 index 000000000..234a62c41 --- /dev/null +++ b/simple_plugin/idea-flex.skeleton @@ -0,0 +1,251 @@ + /** initial size of the lookahead buffer */ +--- private static final int ZZ_BUFFERSIZE = ...; + + /** lexical states */ +--- lexical states, charmap + + /* error codes */ + private static final int ZZ_UNKNOWN_ERROR = 0; + private static final int ZZ_NO_MATCH = 1; + private static final int ZZ_PUSHBACK_2BIG = 2; + private static final char[] EMPTY_BUFFER = new char[0]; + private static final int YYEOF = -1; + private static java.io.Reader zzReader = null; // Fake + + /* error messages for the codes above */ + private static final String ZZ_ERROR_MSG[] = { + "Unkown internal scanner error", + "Error: could not match input", + "Error: pushback value was too large" + }; + +--- isFinal list + /** the current state of the DFA */ + private int zzState; + + /** the current lexical state */ + private int zzLexicalState = YYINITIAL; + + /** this buffer contains the current text to be matched and is + the source of the yytext() string */ + private CharSequence zzBuffer = ""; + + /** this buffer may contains the current text array to be matched when it is cheap to acquire it */ + private char[] zzBufferArray; + + /** the textposition at the last accepting state */ + private int zzMarkedPos; + + /** the textposition at the last state to be included in yytext */ + private int zzPushbackPos; + + /** the current text position in the buffer */ + private int zzCurrentPos; + + /** startRead marks the beginning of the yytext() string in the buffer */ + private int zzStartRead; + + /** endRead marks the last character in the buffer, that has been read + from input */ + private int zzEndRead; + + /** + * zzAtBOL == true <=> the scanner is currently at the beginning of a line + */ + private boolean zzAtBOL = true; + + /** zzAtEOF == true <=> the scanner is at the EOF */ + private boolean zzAtEOF; + +--- user class code + +--- constructor declaration + + public final int getTokenStart(){ + return zzStartRead; + } + + public final int getTokenEnd(){ + return getTokenStart() + yylength(); + } + + public void reset(CharSequence buffer, int start, int end,int initialState){ + zzBuffer = buffer; + zzBufferArray = com.intellij.util.text.CharArrayUtil.fromSequenceWithoutCopying(buffer); + zzCurrentPos = zzMarkedPos = zzStartRead = start; + zzPushbackPos = 0; + zzAtEOF = false; + zzAtBOL = true; + zzEndRead = end; + yybegin(initialState); + } + + /** + * Refills the input buffer. + * + * @return false, iff there was new input. + * + * @exception java.io.IOException if any I/O-Error occurs + */ + private boolean zzRefill() throws java.io.IOException { + return true; + } + + + /** + * Returns the current lexical state. + */ + public final int yystate() { + return zzLexicalState; + } + + + /** + * Enters a new lexical state + * + * @param newState the new lexical state + */ + public final void yybegin(int newState) { + zzLexicalState = newState; + } + + + /** + * Returns the text matched by the current regular expression. + */ + public final CharSequence yytext() { + return zzBuffer.subSequence(zzStartRead, zzMarkedPos); + } + + + /** + * Returns the character at position pos from the + * matched text. + * + * It is equivalent to yytext().charAt(pos), but faster + * + * @param pos the position of the character to fetch. + * A value from 0 to yylength()-1. + * + * @return the character at position pos + */ + public final char yycharat(int pos) { + return zzBufferArray != null ? zzBufferArray[zzStartRead+pos]:zzBuffer.charAt(zzStartRead+pos); + } + + + /** + * Returns the length of the matched text region. + */ + public final int yylength() { + return zzMarkedPos-zzStartRead; + } + + + /** + * Reports an error that occured while scanning. + * + * In a wellformed scanner (no or only correct usage of + * yypushback(int) and a match-all fallback rule) this method + * will only be called with things that "Can't Possibly Happen". + * If this method is called, something is seriously wrong + * (e.g. a JFlex bug producing a faulty scanner etc.). + * + * Usual syntax/scanner level error handling should be done + * in error fallback rules. + * + * @param errorCode the code of the errormessage to display + */ +--- zzScanError declaration + String message; + try { + message = ZZ_ERROR_MSG[errorCode]; + } + catch (ArrayIndexOutOfBoundsException e) { + message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; + } + +--- throws clause + } + + + /** + * Pushes the specified amount of characters back into the input stream. + * + * They will be read again by then next call of the scanning method + * + * @param number the number of characters to be read again. + * This number must not be greater than yylength()! + */ +--- yypushback decl (contains zzScanError exception) + if ( number > yylength() ) + zzScanError(ZZ_PUSHBACK_2BIG); + + zzMarkedPos -= number; + } + + +--- zzDoEOF + /** + * Resumes scanning until the next regular expression is matched, + * the end of input is encountered or an I/O-Error occurs. + * + * @return the next token + * @exception java.io.IOException if any I/O-Error occurs + */ +--- yylex declaration + int zzInput; + int zzAction; + + // cached fields: + int zzCurrentPosL; + int zzMarkedPosL; + int zzEndReadL = zzEndRead; + CharSequence zzBufferL = zzBuffer; + char[] zzBufferArrayL = zzBufferArray; + char [] zzCMapL = ZZ_CMAP; + +--- local declarations + + while (true) { + zzMarkedPosL = zzMarkedPos; + +--- start admin (line, char, col count) + zzAction = -1; + + zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; + +--- start admin (lexstate etc) + + zzForAction: { + while (true) { + +--- next input, line, col, char count, next transition, isFinal action + zzAction = zzState; + zzMarkedPosL = zzCurrentPosL; +--- line count update + } + + } + } + + // store back cached position + zzMarkedPos = zzMarkedPosL; +--- char count update + +--- actions + default: + if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { + zzAtEOF = true; +--- eofvalue + } + else { +--- no match + } + } + } + } + +--- main + +} diff --git a/simple_plugin/src/com/simpleplugin/CreatePropertyQuickFix.java b/simple_plugin/src/com/simpleplugin/CreatePropertyQuickFix.java new file mode 100644 index 000000000..add125e7d --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/CreatePropertyQuickFix.java @@ -0,0 +1,99 @@ +package com.simpleplugin; + +import com.intellij.codeInsight.intention.impl.BaseIntentionAction; +import com.intellij.lang.ASTNode; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.editor.*; +import com.intellij.openapi.fileChooser.FileChooser; +import com.intellij.openapi.fileChooser.FileChooserDescriptor; +import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; +import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.pom.Navigatable; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import com.intellij.psi.search.FileTypeIndex; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.util.IncorrectOperationException; +import com.intellij.util.indexing.FileBasedIndex; +import com.simpleplugin.psi.SimpleElementFactory; +import com.simpleplugin.psi.SimpleFile; +import com.simpleplugin.psi.SimpleProperty; +import com.simpleplugin.psi.SimpleTypes; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; + +class CreatePropertyQuickFix extends BaseIntentionAction { + private String key; + + CreatePropertyQuickFix(String key) { + this.key = key; + } + + @NotNull + @Override + public String getText() { + return "Create property"; + } + + @NotNull + @Override + public String getFamilyName() { + return "Simple properties"; + } + + @Override + public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { + return true; + } + + @Override + public void invoke(@NotNull final Project project, final Editor editor, PsiFile file) throws IncorrectOperationException { + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + Collection virtualFiles = FileBasedIndex.getInstance().getContainingFiles(FileTypeIndex.NAME, SimpleFileType.INSTANCE, + GlobalSearchScope.allScope(project)); + if (virtualFiles.size() == 1) { + createProperty(project, virtualFiles.iterator().next()); + } else { + final FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileDescriptor(SimpleFileType.INSTANCE); + descriptor.setRoots(project.getBaseDir()); + final VirtualFile file = FileChooser.chooseFile(descriptor, project, null); + if (file != null) { + createProperty(project, file); + } + } + } + }); + } + + private void createProperty(final Project project, final VirtualFile file) { + new WriteCommandAction.Simple(project) { + @Override + public void run() { + SimpleFile simpleFile = (SimpleFile) PsiManager.getInstance(project).findFile(file); + ASTNode lastChildNode = simpleFile.getNode().getLastChildNode(); + if (lastChildNode != null && !lastChildNode.getElementType().equals(SimpleTypes.CRLF)) { + simpleFile.getNode().addChild(SimpleElementFactory.createCRLF(project).getNode()); + } + // IMPORTANT: change spaces to escaped spaces or the new node will only have the first word for the key + SimpleProperty property = SimpleElementFactory.createProperty(project, key.replaceAll(" ", "\\\\ "), ""); + simpleFile.getNode().addChild(property.getNode()); + ((Navigatable) property.getLastChild().getNavigationElement()).navigate(true); + FileEditorManager.getInstance(project).getSelectedTextEditor().getCaretModel(). + moveCaretRelatively(2, 0, false, false, false); + + // almost the same thing but manipulating plain text of the document instead of PSI +// FileEditorManager.getInstance(project).openFile(file, true); +// final Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor(); +// final Document document = editor.getDocument(); +// document.insertString(document.getTextLength(), "\n" + key.replaceAll(" ", "\\\\ ") + " = "); +// editor.getCaretModel().getPrimaryCaret().moveToOffset(document.getTextLength()); + } + }.execute(); + } +} diff --git a/simple_plugin/src/com/simpleplugin/Simple.bnf b/simple_plugin/src/com/simpleplugin/Simple.bnf new file mode 100644 index 000000000..d5ca3cef2 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/Simple.bnf @@ -0,0 +1,23 @@ +{ + parserClass="com.simpleplugin.parser.SimpleParser" + + extends="com.intellij.extapi.psi.ASTWrapperPsiElement" + + psiClassPrefix="Simple" + psiImplClassSuffix="Impl" + psiPackage="com.simpleplugin.psi" + psiImplPackage="com.simpleplugin.psi.impl" + + elementTypeHolderClass="com.simpleplugin.psi.SimpleTypes" + elementTypeClass="com.simpleplugin.psi.SimpleElementType" + tokenTypeClass="com.simpleplugin.psi.SimpleTokenType" + + psiImplUtilClass="com.simpleplugin.psi.impl.SimplePsiImplUtil" +} + +simpleFile ::= item_* + +private item_ ::= (property|COMMENT|CRLF) + +property ::= (KEY? SEPARATOR VALUE?) | KEY {mixin="com.simpleplugin.psi.impl.SimpleNamedElementImpl" + implements="com.simpleplugin.psi.SimpleNamedElement" methods=[getKey getValue getName setName getNameIdentifier getPresentation]} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/Simple.flex b/simple_plugin/src/com/simpleplugin/Simple.flex new file mode 100644 index 000000000..89dabf207 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/Simple.flex @@ -0,0 +1,46 @@ +package com.simpleplugin; + +import com.intellij.lexer.FlexLexer; +import com.intellij.psi.tree.IElementType; +import com.simpleplugin.psi.SimpleTypes; +import com.intellij.psi.TokenType; + +%% + +%class SimpleLexer +%implements FlexLexer +%unicode +%function advance +%type IElementType +%eof{ return; +%eof} + +CRLF= \n|\r|\r\n +WHITE_SPACE=[\ \t\f] +FIRST_VALUE_CHARACTER=[^ \n\r\f\\] | "\\"{CRLF} | "\\". +VALUE_CHARACTER=[^\n\r\f\\] | "\\"{CRLF} | "\\". +END_OF_LINE_COMMENT=("#"|"!")[^\r\n]* +SEPARATOR=[:=] +KEY_CHARACTER=[^:=\ \n\r\t\f\\] | "\\ " + +%state WAITING_VALUE + +%% + + {END_OF_LINE_COMMENT} { yybegin(YYINITIAL); return SimpleTypes.COMMENT; } + + {KEY_CHARACTER}+ { yybegin(YYINITIAL); return SimpleTypes.KEY; } + + {SEPARATOR} { yybegin(WAITING_VALUE); return SimpleTypes.SEPARATOR; } + + {CRLF}({CRLF}|{WHITE_SPACE})+ { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; } + + {WHITE_SPACE}+ { yybegin(WAITING_VALUE); return TokenType.WHITE_SPACE; } + + {FIRST_VALUE_CHARACTER}{VALUE_CHARACTER}* { yybegin(YYINITIAL); return SimpleTypes.VALUE; } + +({CRLF}|{WHITE_SPACE})+ { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; } + +{WHITE_SPACE}+ { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; } + +. { return TokenType.BAD_CHARACTER; } diff --git a/simple_plugin/src/com/simpleplugin/SimpleAnnotator.java b/simple_plugin/src/com/simpleplugin/SimpleAnnotator.java new file mode 100644 index 000000000..e0425c5cc --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleAnnotator.java @@ -0,0 +1,41 @@ +package com.simpleplugin; + +import com.intellij.lang.annotation.Annotation; +import com.intellij.lang.annotation.AnnotationHolder; +import com.intellij.lang.annotation.Annotator; +import com.intellij.openapi.editor.DefaultLanguageHighlighterColors; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiLiteralExpression; +import com.simpleplugin.psi.SimpleProperty; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class SimpleAnnotator implements Annotator { + @Override + public void annotate(@NotNull final PsiElement element, @NotNull AnnotationHolder holder) { + if (element instanceof PsiLiteralExpression) { + PsiLiteralExpression literalExpression = (PsiLiteralExpression) element; + String value = literalExpression.getValue() instanceof String ? (String)literalExpression.getValue() : null; + + if (value != null && value.startsWith("simple"+":")) { + Project project = element.getProject(); + String key = value.substring(7); + List properties = SimpleUtil.findProperties(project, key); + if (properties.size() == 1) { + TextRange range = new TextRange(element.getTextRange().getStartOffset() + 7, + element.getTextRange().getStartOffset() + 7); + Annotation annotation = holder.createInfoAnnotation(range, null); + annotation.setTextAttributes(DefaultLanguageHighlighterColors.LINE_COMMENT); + } else if (properties.size() == 0) { + TextRange range = new TextRange(element.getTextRange().getStartOffset() + 8, + element.getTextRange().getEndOffset()); + holder.createErrorAnnotation(range, "Unresolved property"). + registerFix(new CreatePropertyQuickFix(key)); + } + } + } + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleBlock.java b/simple_plugin/src/com/simpleplugin/SimpleBlock.java new file mode 100644 index 000000000..9c1b723a0 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleBlock.java @@ -0,0 +1,57 @@ +package com.simpleplugin; + +import com.intellij.formatting.*; +import com.intellij.lang.ASTNode; +import com.intellij.psi.TokenType; +import com.intellij.psi.formatter.common.AbstractBlock; +import com.simpleplugin.psi.SimpleTypes; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class SimpleBlock extends AbstractBlock { + private SpacingBuilder spacingBuilder; + + protected SimpleBlock(@NotNull ASTNode node, @Nullable Wrap wrap, @Nullable Alignment alignment, + SpacingBuilder spacingBuilder) { + super(node, wrap, alignment); + this.spacingBuilder = spacingBuilder; + } + + @Override + protected List buildChildren() { + List blocks = new ArrayList(); + ASTNode child = myNode.getFirstChildNode(); + ASTNode previousChild = null; + while (child != null) { + if (child.getElementType() != TokenType.WHITE_SPACE && + (previousChild == null || previousChild.getElementType() != SimpleTypes.CRLF || + child.getElementType() != SimpleTypes.CRLF)) { + Block block = new SimpleBlock(child, Wrap.createWrap(WrapType.NONE, false), Alignment.createAlignment(), + spacingBuilder); + blocks.add(block); + } + previousChild = child; + child = child.getTreeNext(); + } + return blocks; + } + + @Override + public Indent getIndent() { + return Indent.getNoneIndent(); + } + + @Nullable + @Override + public Spacing getSpacing(@Nullable Block child1, @NotNull Block child2) { + return spacingBuilder.getSpacing(this, child1, child2); + } + + @Override + public boolean isLeaf() { + return myNode.getFirstChildNode() == null; + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleChooseByNameContributor.java b/simple_plugin/src/com/simpleplugin/SimpleChooseByNameContributor.java new file mode 100644 index 000000000..1ec9f06ed --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleChooseByNameContributor.java @@ -0,0 +1,33 @@ +package com.simpleplugin; + +import com.intellij.navigation.ChooseByNameContributor; +import com.intellij.navigation.NavigationItem; +import com.intellij.openapi.project.Project; +import com.simpleplugin.psi.SimpleProperty; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class SimpleChooseByNameContributor implements ChooseByNameContributor { + @NotNull + @Override + public String[] getNames(Project project, boolean includeNonProjectItems) { + List properties = SimpleUtil.findProperties(project); + List names = new ArrayList(properties.size()); + for (SimpleProperty property : properties) { + if (property.getKey() != null && property.getKey().length() > 0) { + names.add(property.getKey()); + } + } + return names.toArray(new String[names.size()]); + } + + @NotNull + @Override + public NavigationItem[] getItemsByName(String name, String pattern, Project project, boolean includeNonProjectItems) { + // todo include non project items + List properties = SimpleUtil.findProperties(project, name); + return properties.toArray(new NavigationItem[properties.size()]); + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettings.java b/simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettings.java new file mode 100644 index 000000000..bb62cdb4c --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettings.java @@ -0,0 +1,10 @@ +package com.simpleplugin; + +import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.psi.codeStyle.CustomCodeStyleSettings; + +public class SimpleCodeStyleSettings extends CustomCodeStyleSettings { + public SimpleCodeStyleSettings(CodeStyleSettings settings) { + super("SimpleCodeStyleSettings", settings); + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettingsProvider.java b/simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettingsProvider.java new file mode 100644 index 000000000..f19dc35b8 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettingsProvider.java @@ -0,0 +1,47 @@ +package com.simpleplugin; + +import com.intellij.application.options.CodeStyleAbstractConfigurable; +import com.intellij.application.options.CodeStyleAbstractPanel; +import com.intellij.application.options.TabbedLanguageCodeStylePanel; +import com.intellij.openapi.options.Configurable; +import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.psi.codeStyle.CodeStyleSettingsProvider; +import com.intellij.psi.codeStyle.CustomCodeStyleSettings; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class SimpleCodeStyleSettingsProvider extends CodeStyleSettingsProvider { + @Override + public CustomCodeStyleSettings createCustomSettings(CodeStyleSettings settings) { + return new SimpleCodeStyleSettings(settings); + } + + @Nullable + @Override + public String getConfigurableDisplayName() { + return "Simple"; + } + + @NotNull + @Override + public Configurable createSettingsPage(CodeStyleSettings settings, CodeStyleSettings originalSettings) { + return new CodeStyleAbstractConfigurable(settings, originalSettings, "Simple") { + @Override + protected CodeStyleAbstractPanel createPanel(CodeStyleSettings settings) { + return new SimpleCodeStyleMainPanel(getCurrentSettings(), settings); + } + + @Nullable + @Override + public String getHelpTopic() { + return null; + } + }; + } + + private static class SimpleCodeStyleMainPanel extends TabbedLanguageCodeStylePanel { + public SimpleCodeStyleMainPanel(CodeStyleSettings currentSettings, CodeStyleSettings settings) { + super(SimpleLanguage.INSTANCE, currentSettings, settings); + } + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleColorSettingsPage.java b/simple_plugin/src/com/simpleplugin/SimpleColorSettingsPage.java new file mode 100644 index 000000000..489aede15 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleColorSettingsPage.java @@ -0,0 +1,73 @@ +package com.simpleplugin; + +import com.intellij.openapi.editor.colors.TextAttributesKey; +import com.intellij.openapi.fileTypes.SyntaxHighlighter; +import com.intellij.openapi.options.colors.AttributesDescriptor; +import com.intellij.openapi.options.colors.ColorDescriptor; +import com.intellij.openapi.options.colors.ColorSettingsPage; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.Map; + +public class SimpleColorSettingsPage implements ColorSettingsPage { + private static final AttributesDescriptor[] DESCRIPTORS = new AttributesDescriptor[]{ + new AttributesDescriptor("Key", SimpleSyntaxHighlighter.KEY), + new AttributesDescriptor("Separator", SimpleSyntaxHighlighter.SEPARATOR), + new AttributesDescriptor("Value", SimpleSyntaxHighlighter.VALUE), + }; + + @Nullable + @Override + public Icon getIcon() { + return SimpleIcons.FILE; + } + + @NotNull + @Override + public SyntaxHighlighter getHighlighter() { + return new SimpleSyntaxHighlighter(); + } + + @NotNull + @Override + public String getDemoText() { + return "# You are reading the \".properties\" entry.\n" + + "! The exclamation mark can also mark text as comments.\n" + + "website = http://en.wikipedia.org/\n" + + "language = English\n" + + "# The backslash below tells the application to continue reading\n" + + "# the value onto the next line.\n" + + "message = Welcome to \\\n" + + " Wikipedia!\n" + + "# Add spaces to the key\n" + + "key\\ with\\ spaces = This is the value that could be looked up with the key \"key with spaces\".\n" + + "# Unicode\n" + + "tab : \\u0009"; + } + + @Nullable + @Override + public Map getAdditionalHighlightingTagToDescriptorMap() { + return null; + } + + @NotNull + @Override + public AttributesDescriptor[] getAttributeDescriptors() { + return DESCRIPTORS; + } + + @NotNull + @Override + public ColorDescriptor[] getColorDescriptors() { + return ColorDescriptor.EMPTY_ARRAY; + } + + @NotNull + @Override + public String getDisplayName() { + return "Simple"; + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleCommenter.java b/simple_plugin/src/com/simpleplugin/SimpleCommenter.java new file mode 100644 index 000000000..f9f0e24a1 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleCommenter.java @@ -0,0 +1,36 @@ +package com.simpleplugin; + +import com.intellij.lang.Commenter; +import org.jetbrains.annotations.Nullable; + +public class SimpleCommenter implements Commenter { + @Nullable + @Override + public String getLineCommentPrefix() { + return "#"; + } + + @Nullable + @Override + public String getBlockCommentPrefix() { + return ""; + } + + @Nullable + @Override + public String getBlockCommentSuffix() { + return null; + } + + @Nullable + @Override + public String getCommentedBlockCommentPrefix() { + return null; + } + + @Nullable + @Override + public String getCommentedBlockCommentSuffix() { + return null; + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleCompletionContributor.java b/simple_plugin/src/com/simpleplugin/SimpleCompletionContributor.java new file mode 100644 index 000000000..1ca45e01e --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleCompletionContributor.java @@ -0,0 +1,23 @@ +package com.simpleplugin; + +import com.intellij.codeInsight.completion.*; +import com.intellij.codeInsight.lookup.LookupElementBuilder; +import com.intellij.patterns.PlatformPatterns; +import com.intellij.util.ProcessingContext; +import com.simpleplugin.psi.SimpleTypes; +import org.jetbrains.annotations.NotNull; + +public class SimpleCompletionContributor extends CompletionContributor { + public SimpleCompletionContributor() { + extend(CompletionType.BASIC, + PlatformPatterns.psiElement(SimpleTypes.VALUE).withLanguage(SimpleLanguage.INSTANCE), + new CompletionProvider() { + public void addCompletions(@NotNull CompletionParameters parameters, + ProcessingContext context, + @NotNull CompletionResultSet resultSet) { + resultSet.addElement(LookupElementBuilder.create("Hello")); + } + } + ); + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleFileType.java b/simple_plugin/src/com/simpleplugin/SimpleFileType.java new file mode 100644 index 000000000..3d3714b4d --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleFileType.java @@ -0,0 +1,39 @@ +package com.simpleplugin; + +import com.intellij.openapi.fileTypes.LanguageFileType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +public class SimpleFileType extends LanguageFileType { + public static final SimpleFileType INSTANCE = new SimpleFileType(); + + private SimpleFileType() { + super(SimpleLanguage.INSTANCE); + } + + @NotNull + @Override + public String getName() { + return "Simple file"; + } + + @NotNull + @Override + public String getDescription() { + return "Simple language file"; + } + + @NotNull + @Override + public String getDefaultExtension() { + return "simple"; + } + + @Nullable + @Override + public Icon getIcon() { + return SimpleIcons.FILE; + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleFileTypeFactory.java b/simple_plugin/src/com/simpleplugin/SimpleFileTypeFactory.java new file mode 100644 index 000000000..2a09d45be --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleFileTypeFactory.java @@ -0,0 +1,12 @@ +package com.simpleplugin; + +import com.intellij.openapi.fileTypes.FileTypeConsumer; +import com.intellij.openapi.fileTypes.FileTypeFactory; +import org.jetbrains.annotations.NotNull; + +public class SimpleFileTypeFactory extends FileTypeFactory{ + @Override + public void createFileTypes(@NotNull FileTypeConsumer fileTypeConsumer) { + fileTypeConsumer.consume(SimpleFileType.INSTANCE, "simple"); + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleFilterLexer.java b/simple_plugin/src/com/simpleplugin/SimpleFilterLexer.java new file mode 100644 index 000000000..78de00162 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleFilterLexer.java @@ -0,0 +1,19 @@ +package com.simpleplugin; + +import com.intellij.lexer.Lexer; +import com.intellij.psi.impl.cache.impl.BaseFilterLexer; +import com.intellij.psi.impl.cache.impl.OccurrenceConsumer; +import com.intellij.psi.search.UsageSearchContext; + +public class SimpleFilterLexer extends BaseFilterLexer { + public SimpleFilterLexer(final Lexer originalLexer, final OccurrenceConsumer table) { + super(originalLexer, table); + } + + @Override + public void advance() { + scanWordsInToken(UsageSearchContext.IN_COMMENTS, false, false); + advanceTodoItemCountsInToken(); + myDelegate.advance(); + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java b/simple_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java new file mode 100644 index 000000000..c766cd3b9 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java @@ -0,0 +1,65 @@ +package com.simpleplugin; + +import com.intellij.lang.cacheBuilder.DefaultWordsScanner; +import com.intellij.lang.cacheBuilder.WordsScanner; +import com.intellij.lang.findUsages.FindUsagesProvider; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiNamedElement; +import com.intellij.psi.tree.TokenSet; +import com.simpleplugin.psi.SimpleProperty; +import com.simpleplugin.psi.SimpleTypes; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class SimpleFindUsagesProvider implements FindUsagesProvider { + private static final DefaultWordsScanner WORDS_SCANNER = + new DefaultWordsScanner(new SimpleLexerAdapter(), + TokenSet.create(SimpleTypes.KEY), TokenSet.create(SimpleTypes.COMMENT), TokenSet.EMPTY); + + @Nullable + @Override + public WordsScanner getWordsScanner() { + return WORDS_SCANNER; + } + + @Override + public boolean canFindUsagesFor(@NotNull PsiElement psiElement) { + return psiElement instanceof PsiNamedElement; + } + + @Nullable + @Override + public String getHelpId(@NotNull PsiElement psiElement) { + return null; + } + + @NotNull + @Override + public String getType(@NotNull PsiElement element) { + if (element instanceof SimpleProperty) { + return "simple property"; + } else { + return ""; + } + } + + @NotNull + @Override + public String getDescriptiveName(@NotNull PsiElement element) { + if (element instanceof SimpleProperty) { + return ((SimpleProperty) element).getKey(); + } else { + return ""; + } + } + + @NotNull + @Override + public String getNodeText(@NotNull PsiElement element, boolean useFullName) { + if (element instanceof SimpleProperty) { + return ((SimpleProperty) element).getKey() + ":" + ((SimpleProperty) element).getValue(); + } else { + return ""; + } + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleFoldingBuilder.java b/simple_plugin/src/com/simpleplugin/SimpleFoldingBuilder.java new file mode 100644 index 000000000..745726933 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleFoldingBuilder.java @@ -0,0 +1,65 @@ +package com.simpleplugin; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.folding.FoldingBuilderEx; +import com.intellij.lang.folding.FoldingDescriptor; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.FoldingGroup; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiLiteralExpression; +import com.intellij.psi.util.PsiTreeUtil; +import com.simpleplugin.psi.SimpleProperty; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class SimpleFoldingBuilder extends FoldingBuilderEx { + @NotNull + @Override + public FoldingDescriptor[] buildFoldRegions(@NotNull PsiElement root, @NotNull Document document, boolean quick) { + FoldingGroup group = FoldingGroup.newGroup("simple"); + + List descriptors = new ArrayList(); + Collection literalExpressions = PsiTreeUtil.findChildrenOfType(root, PsiLiteralExpression.class); + for (final PsiLiteralExpression literalExpression : literalExpressions) { + String value = literalExpression.getValue() instanceof String ? (String)literalExpression.getValue() : null; + + if (value != null && value.startsWith("simple:")) { + Project project = literalExpression.getProject(); + String key = value.substring(7); + final List properties = SimpleUtil.findProperties(project, key); + if (properties.size() == 1) { + descriptors.add(new FoldingDescriptor(literalExpression.getNode(), + new TextRange(literalExpression.getTextRange().getStartOffset() + 1, + literalExpression.getTextRange().getEndOffset() - 1), group) { + @Nullable + @Override + public String getPlaceholderText() { + // IMPORTANT: keys can come with no values, so a test for null is needed + // IMPORTANT: Convert embedded \n to backslash n, so that the string will look like it has LF embedded in it and embedded " to escaped " + String valueOf = properties.get(0).getValue(); + return valueOf == null ? "" : valueOf.replaceAll("\n","\\n").replaceAll("\"","\\\\\""); + } + }); + } + } + } + return descriptors.toArray(new FoldingDescriptor[descriptors.size()]); + } + + @Nullable + @Override + public String getPlaceholderText(@NotNull ASTNode node) { + return "..."; + } + + @Override + public boolean isCollapsedByDefault(@NotNull ASTNode node) { + return true; + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleFormattingModelBuilder.java b/simple_plugin/src/com/simpleplugin/SimpleFormattingModelBuilder.java new file mode 100644 index 000000000..b20468c77 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleFormattingModelBuilder.java @@ -0,0 +1,33 @@ +package com.simpleplugin; + +import com.intellij.formatting.*; +import com.intellij.lang.ASTNode; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.simpleplugin.psi.SimpleTypes; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class SimpleFormattingModelBuilder implements FormattingModelBuilder { + @NotNull + @Override + public FormattingModel createModel(PsiElement element, CodeStyleSettings settings) { + return FormattingModelProvider.createFormattingModelForPsiFile(element.getContainingFile(), + new SimpleBlock(element.getNode(), Wrap.createWrap(WrapType.NONE, false), + Alignment.createAlignment(), createSpaceBuilder(settings)), settings); + } + + private static SpacingBuilder createSpaceBuilder(CodeStyleSettings settings) { + return new SpacingBuilder(settings, SimpleLanguage.INSTANCE). + around(SimpleTypes.SEPARATOR).spaceIf(settings.SPACE_AROUND_ASSIGNMENT_OPERATORS). + before(SimpleTypes.PROPERTY).none(); + } + + @Nullable + @Override + public TextRange getRangeAffectingIndent(PsiFile file, int offset, ASTNode elementAtOffset) { + return null; + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleIcons.java b/simple_plugin/src/com/simpleplugin/SimpleIcons.java new file mode 100644 index 000000000..2719cf69e --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleIcons.java @@ -0,0 +1,9 @@ +package com.simpleplugin; + +import com.intellij.openapi.util.IconLoader; + +import javax.swing.*; + +public class SimpleIcons { + public static final Icon FILE = IconLoader.getIcon("/com/simpleplugin/icons/jar-gray.png"); +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleIdIndexer.java b/simple_plugin/src/com/simpleplugin/SimpleIdIndexer.java new file mode 100644 index 000000000..bfc0a75ac --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleIdIndexer.java @@ -0,0 +1,17 @@ +package com.simpleplugin; + +import com.intellij.lexer.Lexer; +import com.intellij.psi.impl.cache.impl.OccurrenceConsumer; +import com.intellij.psi.impl.cache.impl.id.LexerBasedIdIndexer; + +public class SimpleIdIndexer extends LexerBasedIdIndexer { + + public static Lexer createIndexingLexer(OccurrenceConsumer consumer) { + return new SimpleFilterLexer(new SimpleLexerAdapter(), consumer); + } + + @Override + public Lexer createLexer(final OccurrenceConsumer consumer) { + return createIndexingLexer(consumer); + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleLanguage.java b/simple_plugin/src/com/simpleplugin/SimpleLanguage.java new file mode 100644 index 000000000..425e59019 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleLanguage.java @@ -0,0 +1,11 @@ +package com.simpleplugin; + +import com.intellij.lang.Language; + +public class SimpleLanguage extends Language { + public static final SimpleLanguage INSTANCE = new SimpleLanguage(); + + private SimpleLanguage() { + super("Simple"); + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleLanguageCodeStyleSettingsProvider.java b/simple_plugin/src/com/simpleplugin/SimpleLanguageCodeStyleSettingsProvider.java new file mode 100644 index 000000000..5df02eb89 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleLanguageCodeStyleSettingsProvider.java @@ -0,0 +1,43 @@ +package com.simpleplugin; + +import com.intellij.lang.Language; +import com.intellij.psi.codeStyle.CodeStyleSettingsCustomizable; +import com.intellij.psi.codeStyle.LanguageCodeStyleSettingsProvider; +import org.jetbrains.annotations.NotNull; + +public class SimpleLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSettingsProvider { + @NotNull + @Override + public Language getLanguage() { + return SimpleLanguage.INSTANCE; + } + + @Override + public void customizeSettings(@NotNull CodeStyleSettingsCustomizable consumer, @NotNull SettingsType settingsType) { + if (settingsType == SettingsType.SPACING_SETTINGS) { + consumer.showStandardOptions("SPACE_AROUND_ASSIGNMENT_OPERATORS"); + consumer.renameStandardOption("SPACE_AROUND_ASSIGNMENT_OPERATORS", "Separator"); + } else if (settingsType == SettingsType.BLANK_LINES_SETTINGS) { + consumer.showStandardOptions("KEEP_BLANK_LINES_IN_CODE"); + } + } + + @Override + public String getCodeSample(@NotNull SettingsType settingsType) { + return "# You are reading the \".properties\" entry.\n" + + "! The exclamation mark can also mark text as comments.\n" + + "website = http://en.wikipedia.org/\n" + + "\n" + + "\n" + + "\n" + + "language = English\n" + + "# The backslash below tells the application to continue reading\n" + + "# the value onto the next line.\n" + + "message = Welcome to \\\n" + + " Wikipedia!\n" + + "# Add spaces to the key\n" + + "key\\ with\\ spaces = This is the value that could be looked up with the key \"key with spaces\".\n" + + "# Unicode\n" + + "tab : \\u0009"; + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleLexer.java b/simple_plugin/src/com/simpleplugin/SimpleLexer.java new file mode 100644 index 000000000..b18e92e45 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleLexer.java @@ -0,0 +1,509 @@ +/* The following code was generated by JFlex 1.4.3 on 02/09/15 10:04 AM */ + +package com.simpleplugin; + +import com.intellij.lexer.FlexLexer; +import com.intellij.psi.tree.IElementType; +import com.simpleplugin.psi.SimpleTypes; +import com.intellij.psi.TokenType; + + +/** + * This class is a scanner generated by + * JFlex 1.4.3 + * on 02/09/15 10:04 AM from the specification file + * /Users/vlad/src/SimplePlugin/src/com/simpleplugin/Simple.flex + */ +class SimpleLexer implements FlexLexer { + /** initial size of the lookahead buffer */ + private static final int ZZ_BUFFERSIZE = 16384; + + /** lexical states */ + public static final int WAITING_VALUE = 2; + public static final int YYINITIAL = 0; + + /** + * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l + * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l + * at the beginning of a line + * l is of the form l = 2*k, k a non negative integer + */ + private static final int ZZ_LEXSTATE[] = { + 0, 0, 1, 1 + }; + + /** + * Translates characters to character classes + */ + private static final String ZZ_CMAP_PACKED = + "\11\0\1\3\1\1\1\0\1\6\1\2\22\0\1\5\1\7\1\0"+ + "\1\7\26\0\1\10\2\0\1\10\36\0\1\4\uffa3\0"; + + /** + * Translates characters to character classes + */ + private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); + + /** + * Translates DFA states to action switch labels. + */ + private static final int [] ZZ_ACTION = zzUnpackAction(); + + private static final String ZZ_ACTION_PACKED_0 = + "\2\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7"+ + "\1\3\1\7\2\0\1\6"; + + private static int [] zzUnpackAction() { + int [] result = new int[14]; + int offset = 0; + offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAction(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /** + * Translates a state to a row index in the transition table + */ + private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); + + private static final String ZZ_ROWMAP_PACKED_0 = + "\0\0\0\11\0\22\0\33\0\44\0\55\0\66\0\77"+ + "\0\110\0\121\0\132\0\44\0\121\0\143"; + + private static int [] zzUnpackRowMap() { + int [] result = new int[14]; + int offset = 0; + offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackRowMap(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int high = packed.charAt(i++) << 16; + result[j++] = high | packed.charAt(i++); + } + return j; + } + + /** + * The transition table of the DFA + */ + private static final int [] ZZ_TRANS = zzUnpackTrans(); + + private static final String ZZ_TRANS_PACKED_0 = + "\1\3\3\4\1\5\2\4\1\6\1\7\1\10\2\4"+ + "\1\11\1\12\2\13\2\10\1\3\3\0\1\14\2\0"+ + "\1\3\2\0\3\4\1\0\2\4\7\0\1\3\3\0"+ + "\1\6\2\0\6\6\11\0\1\10\2\0\1\10\1\15"+ + "\1\10\1\0\3\10\2\4\1\11\1\15\1\11\1\13"+ + "\4\10\1\16\6\10\1\0\2\4\1\13\1\0\2\13"+ + "\2\0\2\10\1\0\1\10\1\15\1\10\1\0\2\10"; + + private static int [] zzUnpackTrans() { + int [] result = new int[108]; + int offset = 0; + offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackTrans(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + value--; + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /* error codes */ + private static final int ZZ_UNKNOWN_ERROR = 0; + private static final int ZZ_NO_MATCH = 1; + private static final int ZZ_PUSHBACK_2BIG = 2; + private static final char[] EMPTY_BUFFER = new char[0]; + private static final int YYEOF = -1; + private static java.io.Reader zzReader = null; // Fake + + /* error messages for the codes above */ + private static final String ZZ_ERROR_MSG[] = { + "Unkown internal scanner error", + "Error: could not match input", + "Error: pushback value was too large" + }; + + /** + * ZZ_ATTRIBUTE[aState] contains the attributes of state aState + */ + private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); + + private static final String ZZ_ATTRIBUTE_PACKED_0 = + "\2\0\4\1\1\11\4\1\2\0\1\1"; + + private static int [] zzUnpackAttribute() { + int [] result = new int[14]; + int offset = 0; + offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAttribute(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + /** the current state of the DFA */ + private int zzState; + + /** the current lexical state */ + private int zzLexicalState = YYINITIAL; + + /** this buffer contains the current text to be matched and is + the source of the yytext() string */ + private CharSequence zzBuffer = ""; + + /** this buffer may contains the current text array to be matched when it is cheap to acquire it */ + private char[] zzBufferArray; + + /** the textposition at the last accepting state */ + private int zzMarkedPos; + + /** the textposition at the last state to be included in yytext */ + private int zzPushbackPos; + + /** the current text position in the buffer */ + private int zzCurrentPos; + + /** startRead marks the beginning of the yytext() string in the buffer */ + private int zzStartRead; + + /** endRead marks the last character in the buffer, that has been read + from input */ + private int zzEndRead; + + /** + * zzAtBOL == true <=> the scanner is currently at the beginning of a line + */ + private boolean zzAtBOL = true; + + /** zzAtEOF == true <=> the scanner is at the EOF */ + private boolean zzAtEOF; + + /** denotes if the user-EOF-code has already been executed */ + private boolean zzEOFDone; + + + SimpleLexer(java.io.Reader in) { + this.zzReader = in; + } + + /** + * Creates a new scanner. + * There is also java.io.Reader version of this constructor. + * + * @param in the java.io.Inputstream to read input from. + */ + SimpleLexer(java.io.InputStream in) { + this(new java.io.InputStreamReader(in)); + } + + /** + * Unpacks the compressed character translation table. + * + * @param packed the packed character translation table + * @return the unpacked character translation table + */ + private static char [] zzUnpackCMap(String packed) { + char [] map = new char[0x10000]; + int i = 0; /* index in packed string */ + int j = 0; /* index in unpacked array */ + while (i < 36) { + int count = packed.charAt(i++); + char value = packed.charAt(i++); + do map[j++] = value; while (--count > 0); + } + return map; + } + + public final int getTokenStart(){ + return zzStartRead; + } + + public final int getTokenEnd(){ + return getTokenStart() + yylength(); + } + + public void reset(CharSequence buffer, int start, int end,int initialState){ + zzBuffer = buffer; + zzBufferArray = com.intellij.util.text.CharArrayUtil.fromSequenceWithoutCopying(buffer); + zzCurrentPos = zzMarkedPos = zzStartRead = start; + zzPushbackPos = 0; + zzAtEOF = false; + zzAtBOL = true; + zzEndRead = end; + yybegin(initialState); + } + + /** + * Refills the input buffer. + * + * @return false, iff there was new input. + * + * @exception java.io.IOException if any I/O-Error occurs + */ + private boolean zzRefill() throws java.io.IOException { + return true; + } + + + /** + * Returns the current lexical state. + */ + public final int yystate() { + return zzLexicalState; + } + + + /** + * Enters a new lexical state + * + * @param newState the new lexical state + */ + public final void yybegin(int newState) { + zzLexicalState = newState; + } + + + /** + * Returns the text matched by the current regular expression. + */ + public final CharSequence yytext() { + return zzBuffer.subSequence(zzStartRead, zzMarkedPos); + } + + + /** + * Returns the character at position pos from the + * matched text. + * + * It is equivalent to yytext().charAt(pos), but faster + * + * @param pos the position of the character to fetch. + * A value from 0 to yylength()-1. + * + * @return the character at position pos + */ + public final char yycharat(int pos) { + return zzBufferArray != null ? zzBufferArray[zzStartRead+pos]:zzBuffer.charAt(zzStartRead+pos); + } + + + /** + * Returns the length of the matched text region. + */ + public final int yylength() { + return zzMarkedPos-zzStartRead; + } + + + /** + * Reports an error that occured while scanning. + * + * In a wellformed scanner (no or only correct usage of + * yypushback(int) and a match-all fallback rule) this method + * will only be called with things that "Can't Possibly Happen". + * If this method is called, something is seriously wrong + * (e.g. a JFlex bug producing a faulty scanner etc.). + * + * Usual syntax/scanner level error handling should be done + * in error fallback rules. + * + * @param errorCode the code of the errormessage to display + */ + private void zzScanError(int errorCode) { + String message; + try { + message = ZZ_ERROR_MSG[errorCode]; + } + catch (ArrayIndexOutOfBoundsException e) { + message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; + } + + throw new Error(message); + } + + + /** + * Pushes the specified amount of characters back into the input stream. + * + * They will be read again by then next call of the scanning method + * + * @param number the number of characters to be read again. + * This number must not be greater than yylength()! + */ + public void yypushback(int number) { + if ( number > yylength() ) + zzScanError(ZZ_PUSHBACK_2BIG); + + zzMarkedPos -= number; + } + + + /** + * Contains user EOF-code, which will be executed exactly once, + * when the end of file is reached + */ + private void zzDoEOF() { + if (!zzEOFDone) { + zzEOFDone = true; + + } + } + + + /** + * Resumes scanning until the next regular expression is matched, + * the end of input is encountered or an I/O-Error occurs. + * + * @return the next token + * @exception java.io.IOException if any I/O-Error occurs + */ + public IElementType advance() throws java.io.IOException { + int zzInput; + int zzAction; + + // cached fields: + int zzCurrentPosL; + int zzMarkedPosL; + int zzEndReadL = zzEndRead; + CharSequence zzBufferL = zzBuffer; + char[] zzBufferArrayL = zzBufferArray; + char [] zzCMapL = ZZ_CMAP; + + int [] zzTransL = ZZ_TRANS; + int [] zzRowMapL = ZZ_ROWMAP; + int [] zzAttrL = ZZ_ATTRIBUTE; + + while (true) { + zzMarkedPosL = zzMarkedPos; + + zzAction = -1; + + zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; + + zzState = ZZ_LEXSTATE[zzLexicalState]; + + + zzForAction: { + while (true) { + + if (zzCurrentPosL < zzEndReadL) + zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++)); + else if (zzAtEOF) { + zzInput = YYEOF; + break zzForAction; + } + else { + // store back cached positions + zzCurrentPos = zzCurrentPosL; + zzMarkedPos = zzMarkedPosL; + boolean eof = zzRefill(); + // get translated positions and possibly new buffer + zzCurrentPosL = zzCurrentPos; + zzMarkedPosL = zzMarkedPos; + zzBufferL = zzBuffer; + zzEndReadL = zzEndRead; + if (eof) { + zzInput = YYEOF; + break zzForAction; + } + else { + zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++)); + } + } + int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; + if (zzNext == -1) break zzForAction; + zzState = zzNext; + + int zzAttributes = zzAttrL[zzState]; + if ( (zzAttributes & 1) == 1 ) { + zzAction = zzState; + zzMarkedPosL = zzCurrentPosL; + if ( (zzAttributes & 8) == 8 ) break zzForAction; + } + + } + } + + // store back cached position + zzMarkedPos = zzMarkedPosL; + + switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { + case 6: + { yybegin(YYINITIAL); return SimpleTypes.VALUE; + } + case 8: break; + case 5: + { yybegin(WAITING_VALUE); return SimpleTypes.SEPARATOR; + } + case 9: break; + case 4: + { yybegin(YYINITIAL); return SimpleTypes.COMMENT; + } + case 10: break; + case 3: + { return TokenType.BAD_CHARACTER; + } + case 11: break; + case 2: + { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; + } + case 12: break; + case 7: + { yybegin(WAITING_VALUE); return TokenType.WHITE_SPACE; + } + case 13: break; + case 1: + { yybegin(YYINITIAL); return SimpleTypes.KEY; + } + case 14: break; + default: + if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { + zzAtEOF = true; + zzDoEOF(); + return null; + } + else { + zzScanError(ZZ_NO_MATCH); + } + } + } + } + + +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleLexerAdapter.java b/simple_plugin/src/com/simpleplugin/SimpleLexerAdapter.java new file mode 100644 index 000000000..662acb59a --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleLexerAdapter.java @@ -0,0 +1,11 @@ +package com.simpleplugin; + +import com.intellij.lexer.FlexAdapter; + +import java.io.Reader; + +public class SimpleLexerAdapter extends FlexAdapter { + public SimpleLexerAdapter() { + super(new SimpleLexer((Reader) null)); + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleLineMarkerProvider.java b/simple_plugin/src/com/simpleplugin/SimpleLineMarkerProvider.java new file mode 100644 index 000000000..d6dc43d96 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleLineMarkerProvider.java @@ -0,0 +1,34 @@ +package com.simpleplugin; + +import com.intellij.codeInsight.daemon.RelatedItemLineMarkerInfo; +import com.intellij.codeInsight.daemon.RelatedItemLineMarkerProvider; +import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiLiteralExpression; +import com.simpleplugin.psi.SimpleProperty; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.List; + +public class SimpleLineMarkerProvider extends RelatedItemLineMarkerProvider { + @Override + protected void collectNavigationMarkers(@NotNull PsiElement element, Collection result) { + if (element instanceof PsiLiteralExpression) { + PsiLiteralExpression literalExpression = (PsiLiteralExpression) element; + String value = literalExpression.getValue() instanceof String ? (String)literalExpression.getValue() : null; + if (value != null && value.startsWith("simple"+":")) { + Project project = element.getProject(); + final List properties = SimpleUtil.findProperties(project, value.substring(7)); + if (properties.size() > 0) { + NavigationGutterIconBuilder builder = + NavigationGutterIconBuilder.create(SimpleIcons.FILE). + setTargets(properties). + setTooltipText("Navigate to a simple property"); + result.add(builder.createLineMarkerInfo(element)); + } + } + } + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleParserDefinition.java b/simple_plugin/src/com/simpleplugin/SimpleParserDefinition.java new file mode 100644 index 000000000..c9de1df95 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleParserDefinition.java @@ -0,0 +1,69 @@ +package com.simpleplugin; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.Language; +import com.intellij.lang.ParserDefinition; +import com.intellij.lang.PsiParser; +import com.intellij.lexer.Lexer; +import com.intellij.openapi.project.Project; +import com.intellij.psi.FileViewProvider; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.TokenType; +import com.intellij.psi.tree.IFileElementType; +import com.intellij.psi.tree.TokenSet; +import com.simpleplugin.parser.SimpleParser; +import com.simpleplugin.psi.SimpleFile; +import com.simpleplugin.psi.SimpleTypes; +import org.jetbrains.annotations.NotNull; + +public class SimpleParserDefinition implements ParserDefinition{ + public static final TokenSet WHITE_SPACES = TokenSet.create(TokenType.WHITE_SPACE); + public static final TokenSet COMMENTS = TokenSet.create(SimpleTypes.COMMENT); + + public static final IFileElementType FILE = new IFileElementType(Language.findInstance(SimpleLanguage.class)); + + @NotNull + @Override + public Lexer createLexer(Project project) { + return new SimpleLexerAdapter(); + } + + @NotNull + public TokenSet getWhitespaceTokens() { + return WHITE_SPACES; + } + + @NotNull + public TokenSet getCommentTokens() { + return COMMENTS; + } + + @NotNull + public TokenSet getStringLiteralElements() { + return TokenSet.EMPTY; + } + + @NotNull + public PsiParser createParser(final Project project) { + return new SimpleParser(); + } + + @Override + public IFileElementType getFileNodeType() { + return FILE; + } + + public PsiFile createFile(FileViewProvider viewProvider) { + return new SimpleFile(viewProvider); + } + + public SpaceRequirements spaceExistanceTypeBetweenTokens(ASTNode left, ASTNode right) { + return SpaceRequirements.MAY; + } + + @NotNull + public PsiElement createElement(ASTNode node) { + return SimpleTypes.Factory.createElement(node); + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleRefactoringSupportProvider.java b/simple_plugin/src/com/simpleplugin/SimpleRefactoringSupportProvider.java new file mode 100644 index 000000000..8040801d7 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleRefactoringSupportProvider.java @@ -0,0 +1,12 @@ +package com.simpleplugin; + +import com.intellij.lang.refactoring.RefactoringSupportProvider; +import com.intellij.psi.PsiElement; +import com.simpleplugin.psi.SimpleProperty; + +public class SimpleRefactoringSupportProvider extends RefactoringSupportProvider { + @Override + public boolean isMemberInplaceRenameAvailable(PsiElement element, PsiElement context) { + return element instanceof SimpleProperty; + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleReference.java b/simple_plugin/src/com/simpleplugin/SimpleReference.java new file mode 100644 index 000000000..cbb9b295d --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleReference.java @@ -0,0 +1,58 @@ +package com.simpleplugin; + +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInsight.lookup.LookupElementBuilder; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.*; +import com.simpleplugin.psi.SimpleProperty; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class SimpleReference extends PsiReferenceBase implements PsiPolyVariantReference { + private String key; + + public SimpleReference(@NotNull PsiElement element, TextRange textRange) { + super(element, textRange); + key = element.getText().substring(textRange.getStartOffset(), textRange.getEndOffset()); + } + + @NotNull + @Override + public ResolveResult[] multiResolve(boolean incompleteCode) { + Project project = myElement.getProject(); + final List properties = SimpleUtil.findProperties(project, key); + List results = new ArrayList(); + for (SimpleProperty property : properties) { + results.add(new PsiElementResolveResult(property)); + } + return results.toArray(new ResolveResult[results.size()]); + } + + @Nullable + @Override + public PsiElement resolve() { + ResolveResult[] resolveResults = multiResolve(false); + return resolveResults.length == 1 ? resolveResults[0].getElement() : null; + } + + @NotNull + @Override + public Object[] getVariants() { + Project project = myElement.getProject(); + List properties = SimpleUtil.findProperties(project); + List variants = new ArrayList(); + for (final SimpleProperty property : properties) { + if (property.getKey() != null && property.getKey().length() > 0) { + variants.add(LookupElementBuilder.create(property). + withIcon(SimpleIcons.FILE). + withTypeText(property.getContainingFile().getName()) + ); + } + } + return variants.toArray(); + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleReferenceContributor.java b/simple_plugin/src/com/simpleplugin/SimpleReferenceContributor.java new file mode 100644 index 000000000..1e1dbb3a8 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleReferenceContributor.java @@ -0,0 +1,26 @@ +package com.simpleplugin; + +import com.intellij.openapi.util.TextRange; +import com.intellij.patterns.PlatformPatterns; +import com.intellij.psi.*; +import com.intellij.util.ProcessingContext; +import org.jetbrains.annotations.NotNull; + +public class SimpleReferenceContributor extends PsiReferenceContributor { + @Override + public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar) { + registrar.registerReferenceProvider(PlatformPatterns.psiElement(PsiLiteralExpression.class), + new PsiReferenceProvider() { + @NotNull + @Override + public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) { + PsiLiteralExpression literalExpression = (PsiLiteralExpression) element; + String value = literalExpression.getValue() instanceof String ? (String)literalExpression.getValue() : null; + if (value != null && value.startsWith("simple"+":")) { + return new PsiReference[]{new SimpleReference(element, new TextRange(8, value.length() + 1))}; + } + return new PsiReference[0]; + } + }); + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleStructureViewElement.java b/simple_plugin/src/com/simpleplugin/SimpleStructureViewElement.java new file mode 100644 index 000000000..29ba22956 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleStructureViewElement.java @@ -0,0 +1,72 @@ +package com.simpleplugin; + +import com.intellij.ide.structureView.StructureViewTreeElement; +import com.intellij.ide.util.treeView.smartTree.SortableTreeElement; +import com.intellij.ide.util.treeView.smartTree.TreeElement; +import com.intellij.navigation.ItemPresentation; +import com.intellij.navigation.NavigationItem; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiNamedElement; +import com.intellij.psi.util.PsiTreeUtil; +import com.simpleplugin.psi.SimpleFile; +import com.simpleplugin.psi.SimpleProperty; + +import java.util.ArrayList; +import java.util.List; + +public class SimpleStructureViewElement implements StructureViewTreeElement, SortableTreeElement { + private PsiElement element; + + public SimpleStructureViewElement(PsiElement element) { + this.element = element; + } + + @Override + public Object getValue() { + return element; + } + + @Override + public void navigate(boolean requestFocus) { + if (element instanceof NavigationItem) { + ((NavigationItem) element).navigate(requestFocus); + } + } + + @Override + public boolean canNavigate() { + return element instanceof NavigationItem && + ((NavigationItem)element).canNavigate(); + } + + @Override + public boolean canNavigateToSource() { + return element instanceof NavigationItem && + ((NavigationItem)element).canNavigateToSource(); + } + + @Override + public String getAlphaSortKey() { + return element instanceof PsiNamedElement ? ((PsiNamedElement) element).getName() : null; + } + + @Override + public ItemPresentation getPresentation() { + return element instanceof NavigationItem ? + ((NavigationItem) element).getPresentation() : null; + } + + @Override + public TreeElement[] getChildren() { + if (element instanceof SimpleFile) { + SimpleProperty[] properties = PsiTreeUtil.getChildrenOfType(element, SimpleProperty.class); + List treeElements = new ArrayList(properties.length); + for (SimpleProperty property : properties) { + treeElements.add(new SimpleStructureViewElement(property)); + } + return treeElements.toArray(new TreeElement[treeElements.size()]); + } else { + return EMPTY_ARRAY; + } + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleStructureViewFactory.java b/simple_plugin/src/com/simpleplugin/SimpleStructureViewFactory.java new file mode 100644 index 000000000..937fe85a6 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleStructureViewFactory.java @@ -0,0 +1,24 @@ +package com.simpleplugin; + +import com.intellij.ide.structureView.StructureViewBuilder; +import com.intellij.ide.structureView.StructureViewModel; +import com.intellij.ide.structureView.TreeBasedStructureViewBuilder; +import com.intellij.lang.PsiStructureViewFactory; +import com.intellij.openapi.editor.Editor; +import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class SimpleStructureViewFactory implements PsiStructureViewFactory { + @Nullable + @Override + public StructureViewBuilder getStructureViewBuilder(final PsiFile psiFile) { + return new TreeBasedStructureViewBuilder() { + @NotNull + @Override + public StructureViewModel createStructureViewModel(@Nullable Editor editor) { + return new SimpleStructureViewModel(psiFile); + } + }; + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleStructureViewModel.java b/simple_plugin/src/com/simpleplugin/SimpleStructureViewModel.java new file mode 100644 index 000000000..3d2318087 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleStructureViewModel.java @@ -0,0 +1,32 @@ +package com.simpleplugin; + +import com.intellij.ide.structureView.StructureViewModel; +import com.intellij.ide.structureView.StructureViewModelBase; +import com.intellij.ide.structureView.StructureViewTreeElement; +import com.intellij.ide.util.treeView.smartTree.Sorter; +import com.intellij.psi.PsiFile; +import com.simpleplugin.psi.SimpleFile; +import org.jetbrains.annotations.NotNull; + +public class SimpleStructureViewModel extends StructureViewModelBase implements + StructureViewModel.ElementInfoProvider { + public SimpleStructureViewModel(PsiFile psiFile) { + super(psiFile, new SimpleStructureViewElement(psiFile)); + } + + @NotNull + public Sorter[] getSorters() { + return new Sorter[] {Sorter.ALPHA_SORTER}; + } + + + @Override + public boolean isAlwaysShowsPlus(StructureViewTreeElement element) { + return false; + } + + @Override + public boolean isAlwaysLeaf(StructureViewTreeElement element) { + return element instanceof SimpleFile; + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighter.java b/simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighter.java new file mode 100644 index 000000000..530581d58 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighter.java @@ -0,0 +1,52 @@ +package com.simpleplugin; + +import com.intellij.lexer.Lexer; +import com.intellij.openapi.editor.DefaultLanguageHighlighterColors; +import com.intellij.openapi.editor.HighlighterColors; +import com.intellij.openapi.editor.colors.TextAttributesKey; +import com.intellij.openapi.fileTypes.SyntaxHighlighterBase; +import com.intellij.psi.TokenType; +import com.intellij.psi.tree.IElementType; +import com.simpleplugin.psi.SimpleTypes; +import org.jetbrains.annotations.NotNull; + +import static com.intellij.openapi.editor.colors.TextAttributesKey.createTextAttributesKey; + +public class SimpleSyntaxHighlighter extends SyntaxHighlighterBase { + public static final TextAttributesKey SEPARATOR = createTextAttributesKey("SIMPLE_SEPARATOR", DefaultLanguageHighlighterColors.OPERATION_SIGN); + public static final TextAttributesKey KEY = createTextAttributesKey("SIMPLE_KEY", DefaultLanguageHighlighterColors.KEYWORD); + public static final TextAttributesKey VALUE = createTextAttributesKey("SIMPLE_VALUE", DefaultLanguageHighlighterColors.STRING); + public static final TextAttributesKey COMMENT = createTextAttributesKey("SIMPLE_COMMENT", DefaultLanguageHighlighterColors.LINE_COMMENT); + public static final TextAttributesKey BAD_CHARACTER = createTextAttributesKey("SIMPLE_BAD_CHARACTER", HighlighterColors.BAD_CHARACTER); + + private static final TextAttributesKey[] BAD_CHAR_KEYS = new TextAttributesKey[]{BAD_CHARACTER}; + private static final TextAttributesKey[] SEPARATOR_KEYS = new TextAttributesKey[]{SEPARATOR}; + private static final TextAttributesKey[] KEY_KEYS = new TextAttributesKey[]{KEY}; + private static final TextAttributesKey[] VALUE_KEYS = new TextAttributesKey[]{VALUE}; + private static final TextAttributesKey[] COMMENT_KEYS = new TextAttributesKey[]{COMMENT}; + private static final TextAttributesKey[] EMPTY_KEYS = new TextAttributesKey[0]; + + @NotNull + @Override + public Lexer getHighlightingLexer() { + return new SimpleLexerAdapter(); + } + + @NotNull + @Override + public TextAttributesKey[] getTokenHighlights(IElementType tokenType) { + if (tokenType.equals(SimpleTypes.SEPARATOR)) { + return SEPARATOR_KEYS; + } else if (tokenType.equals(SimpleTypes.KEY)) { + return KEY_KEYS; + } else if (tokenType.equals(SimpleTypes.VALUE)) { + return VALUE_KEYS; + } else if (tokenType.equals(SimpleTypes.COMMENT)) { + return COMMENT_KEYS; + } else if (tokenType.equals(TokenType.BAD_CHARACTER)) { + return BAD_CHAR_KEYS; + } else { + return EMPTY_KEYS; + } + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighterFactory.java b/simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighterFactory.java new file mode 100644 index 000000000..e3a6fe428 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighterFactory.java @@ -0,0 +1,15 @@ +package com.simpleplugin; + +import com.intellij.openapi.fileTypes.SyntaxHighlighter; +import com.intellij.openapi.fileTypes.SyntaxHighlighterFactory; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; + +public class SimpleSyntaxHighlighterFactory extends SyntaxHighlighterFactory { + @NotNull + @Override + public SyntaxHighlighter getSyntaxHighlighter(Project project, VirtualFile virtualFile) { + return new SimpleSyntaxHighlighter(); + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleTodoIndexer.java b/simple_plugin/src/com/simpleplugin/SimpleTodoIndexer.java new file mode 100644 index 000000000..505c0acce --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleTodoIndexer.java @@ -0,0 +1,12 @@ +package com.simpleplugin; + +import com.intellij.lexer.Lexer; +import com.intellij.psi.impl.cache.impl.OccurrenceConsumer; +import com.intellij.psi.impl.cache.impl.todo.LexerBasedTodoIndexer; + +public class SimpleTodoIndexer extends LexerBasedTodoIndexer { + @Override + public Lexer createLexer(OccurrenceConsumer consumer) { + return SimpleIdIndexer.createIndexingLexer(consumer); + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleUtil.java b/simple_plugin/src/com/simpleplugin/SimpleUtil.java new file mode 100644 index 000000000..c2bb98218 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleUtil.java @@ -0,0 +1,57 @@ +package com.simpleplugin; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiManager; +import com.intellij.psi.search.FileTypeIndex; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.indexing.FileBasedIndex; +import com.simpleplugin.psi.SimpleFile; +import com.simpleplugin.psi.SimpleProperty; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +public class SimpleUtil { + public static List findProperties(Project project, String key) { + List result = null; + Collection virtualFiles = FileBasedIndex.getInstance().getContainingFiles(FileTypeIndex.NAME, SimpleFileType.INSTANCE, + GlobalSearchScope.allScope(project)); + for (VirtualFile virtualFile : virtualFiles) { + SimpleFile simpleFile = (SimpleFile) PsiManager.getInstance(project).findFile(virtualFile); + if (simpleFile != null) { + SimpleProperty[] properties = PsiTreeUtil.getChildrenOfType(simpleFile, SimpleProperty.class); + if (properties != null) { + for (SimpleProperty property : properties) { + if (key.equals(property.getKey())) { + if (result == null) { + result = new ArrayList(); + } + result.add(property); + } + } + } + } + } + return result != null ? result : Collections.emptyList(); + } + + public static List findProperties(Project project) { + List result = new ArrayList(); + Collection virtualFiles = FileBasedIndex.getInstance().getContainingFiles(FileTypeIndex.NAME, SimpleFileType.INSTANCE, + GlobalSearchScope.allScope(project)); + for (VirtualFile virtualFile : virtualFiles) { + SimpleFile simpleFile = (SimpleFile) PsiManager.getInstance(project).findFile(virtualFile); + if (simpleFile != null) { + SimpleProperty[] properties = PsiTreeUtil.getChildrenOfType(simpleFile, SimpleProperty.class); + if (properties != null) { + Collections.addAll(result, properties); + } + } + } + return result; + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/icons/jar-gray.png b/simple_plugin/src/com/simpleplugin/icons/jar-gray.png new file mode 100644 index 0000000000000000000000000000000000000000..4760e60a0314d426121957d2018c41b191c82474 GIT binary patch literal 729 zcmV;~0w(>5P)$LZLm>LXWxh1^NW~5I#a5z+0a|K?o$hv>*r~ znv(|)nN>8qSrgrLCo{7>v`|#-i)H?86eN|PkVcNpVKtOXf(q0^)(n{a2yBw`}@=|jOT!*r6mA> zVHil$6j2o2o}Qi}&vV?}-64u1xUP#*sRSX!jpun_j3LkS-+%=eWsJS8*X!T6wze9K zF=(wZolc1m0#ZtHc6Rn1zy|=w0G!W2^W}#3p4Z|>n5JGDW ztu>TV;^gF{cX)XC4ZsfoFlSZ(tZZ&>w!$#Hu`Elwu4`MCRT+&&gP8*W*x1-;9UL5V z=N)LR=Mf5p0tJu&0AsB3`1m-)i!n`;YOU$N0AzM37K?V4WyOBKU!F`RMZ++p@B5MC zI068))^jbHy_ zCbJIy?B?3PBE)fQbI$#Gy-qmikq`n|mVppL;y9+2O6C6%E-o&7#@MTJxm>Q*YF?h_ z=KA{jaO^gfV7^VQ2$@Qp!|H zAqWDHPNxITIfM{J09ajJjgF6xW6pUJ1i^4Roj!HD-RS7(C}NB~0e}#q$T>%+(}4+q z_If?H-EPalU=VL_Z+n!|8{4++X0sVfDT$Oao^{1JkCP;kywebsit"); + } +} diff --git a/simple_plugin/testData/CompleteTestData.java b/simple_plugin/testData/CompleteTestData.java new file mode 100644 index 000000000..4a883daec --- /dev/null +++ b/simple_plugin/testData/CompleteTestData.java @@ -0,0 +1,5 @@ +public class Test { + public static void main(String[] args) { + System.out.println("simple:"); + } +} diff --git a/simple_plugin/testData/DefaultTestData.simple b/simple_plugin/testData/DefaultTestData.simple new file mode 100644 index 000000000..ebe624812 --- /dev/null +++ b/simple_plugin/testData/DefaultTestData.simple @@ -0,0 +1,14 @@ +# You are reading the ".properties" entry. +! The exclamation mark can also mark text as comments. +website = http://en.wikipedia.org/ + + +language = English +# The backslash below tells the application to continue reading +# the value onto the next line. +message = Welcome to \ + Wikipedia! +# Add spaces to the key +key\ with\ spaces = This is the value that could be looked up with the key "key with spaces". +# Unicode +tab : \u0009 diff --git a/simple_plugin/testData/FindUsagesTestData.java b/simple_plugin/testData/FindUsagesTestData.java new file mode 100644 index 000000000..401d8c782 --- /dev/null +++ b/simple_plugin/testData/FindUsagesTestData.java @@ -0,0 +1,5 @@ +public class Test { + public static void main(String[] args) { + System.out.println("simple:key with spaces"); + } +} diff --git a/simple_plugin/testData/FindUsagesTestData.simple b/simple_plugin/testData/FindUsagesTestData.simple new file mode 100644 index 000000000..2f31ab9e2 --- /dev/null +++ b/simple_plugin/testData/FindUsagesTestData.simple @@ -0,0 +1,13 @@ +# You are reading the ".properties" entry. +! The exclamation mark can also mark text as comments. +website = http://en.wikipedia.org/ + +language = English +# The backslash below tells the application to continue reading +# the value onto the next line. +message = Welcome to \ + Wikipedia! +# Add spaces to the key +key\ with\ spaces = This is the value that could be looked up with the key "key with spaces". +# Unicode +tab : \u0009 diff --git a/simple_plugin/testData/FoldingTestData.java b/simple_plugin/testData/FoldingTestData.java new file mode 100644 index 000000000..1920b5fae --- /dev/null +++ b/simple_plugin/testData/FoldingTestData.java @@ -0,0 +1,11 @@ +public class Test { + public static void main(String[] args) { + System.out.println("simple:website"); + } + public static void main1(String[] args) { + System.out.println("simple:key with spaces"); + } + public static void main2(String[] args) { + System.out.println("simple:message"); + } +} diff --git a/simple_plugin/testData/FormatterTestData.simple b/simple_plugin/testData/FormatterTestData.simple new file mode 100644 index 000000000..44a78fa68 --- /dev/null +++ b/simple_plugin/testData/FormatterTestData.simple @@ -0,0 +1,15 @@ +# You are reading the ".properties" entry. +! The exclamation mark can also mark text as comments. +website=http://en.wikipedia.org/ + + + +language= English +# The backslash below tells the application to continue reading +# the value onto the next line. +message = Welcome to \ + Wikipedia! +# Add spaces to the key +key\ with\ spaces = This is the value that could be looked up with the key "key with spaces". +# Unicode +tab :\u0009 diff --git a/simple_plugin/testData/ParsingTestData.simple b/simple_plugin/testData/ParsingTestData.simple new file mode 100644 index 000000000..e11fdcef3 --- /dev/null +++ b/simple_plugin/testData/ParsingTestData.simple @@ -0,0 +1,17 @@ +# You are reading the ".properties" entry. +! The exclamation mark can also mark text as comments. +website = http://en.wikipedia.org/ + +language = English +# The backslash below tells the application to continue reading +# the value onto the next line. +message = Welcome to \ + Wikipedia! +# Add spaces to the key +key\ with\ spaces = This is the value that could be looked up with the key "key with spaces". +# Unicode +tab : \u0009 +# test for illegal key attempt +key\ +with\ +endofline = test diff --git a/simple_plugin/testData/ParsingTestData.txt b/simple_plugin/testData/ParsingTestData.txt new file mode 100644 index 000000000..ce7aa544e --- /dev/null +++ b/simple_plugin/testData/ParsingTestData.txt @@ -0,0 +1,63 @@ +Simple File(0,492) + PsiComment(SimpleTokenType.COMMENT)('# You are reading the ".properties" entry.')(0,42) + PsiWhiteSpace('\n')(42,43) + PsiComment(SimpleTokenType.COMMENT)('! The exclamation mark can also mark text as comments.')(43,97) + PsiWhiteSpace('\n')(97,98) + SimplePropertyImpl(PROPERTY)(98,132) + PsiElement(SimpleTokenType.KEY)('website')(98,105) + PsiWhiteSpace(' ')(105,106) + PsiElement(SimpleTokenType.SEPARATOR)('=')(106,107) + PsiWhiteSpace(' ')(107,108) + PsiElement(SimpleTokenType.VALUE)('http://en.wikipedia.org/')(108,132) + PsiWhiteSpace('\n\n')(132,134) + SimplePropertyImpl(PROPERTY)(134,152) + PsiElement(SimpleTokenType.KEY)('language')(134,142) + PsiWhiteSpace(' ')(142,143) + PsiElement(SimpleTokenType.SEPARATOR)('=')(143,144) + PsiWhiteSpace(' ')(144,145) + PsiElement(SimpleTokenType.VALUE)('English')(145,152) + PsiWhiteSpace('\n')(152,153) + PsiComment(SimpleTokenType.COMMENT)('# The backslash below tells the application to continue reading')(153,216) + PsiWhiteSpace('\n')(216,217) + PsiComment(SimpleTokenType.COMMENT)('# the value onto the next line.')(217,248) + PsiWhiteSpace('\n')(248,249) + SimplePropertyImpl(PROPERTY)(249,292) + PsiElement(SimpleTokenType.KEY)('message')(249,256) + PsiWhiteSpace(' ')(256,257) + PsiElement(SimpleTokenType.SEPARATOR)('=')(257,258) + PsiWhiteSpace(' ')(258,259) + PsiElement(SimpleTokenType.VALUE)('Welcome to \\n Wikipedia!')(259,292) + PsiWhiteSpace('\n')(292,293) + PsiComment(SimpleTokenType.COMMENT)('# Add spaces to the key')(293,316) + PsiWhiteSpace('\n')(316,317) + SimplePropertyImpl(PROPERTY)(317,410) + PsiElement(SimpleTokenType.KEY)('key\ with\ spaces')(317,334) + PsiWhiteSpace(' ')(334,335) + PsiElement(SimpleTokenType.SEPARATOR)('=')(335,336) + PsiWhiteSpace(' ')(336,337) + PsiElement(SimpleTokenType.VALUE)('This is the value that could be looked up with the key "key with spaces".')(337,410) + PsiWhiteSpace('\n')(410,411) + PsiComment(SimpleTokenType.COMMENT)('# Unicode')(411,420) + PsiWhiteSpace('\n')(420,421) + SimplePropertyImpl(PROPERTY)(421,433) + PsiElement(SimpleTokenType.KEY)('tab')(421,424) + PsiWhiteSpace(' ')(424,425) + PsiElement(SimpleTokenType.SEPARATOR)(':')(425,426) + PsiWhiteSpace(' ')(426,427) + PsiElement(SimpleTokenType.VALUE)('\u0009')(427,433) + PsiWhiteSpace('\n')(433,434) + PsiComment(SimpleTokenType.COMMENT)('# test for illegal key attempt')(434,464) + PsiWhiteSpace('\n')(464,465) + SimplePropertyImpl(PROPERTY)(465,468) + PsiElement(SimpleTokenType.KEY)('key')(465,468) + PsiErrorElement:, SimpleTokenType.COMMENT, SimpleTokenType.CRLF or SimpleTokenType.SEPARATOR expected, got '\'(468,469) + PsiElement(BAD_CHARACTER)('\')(468,469) + PsiWhiteSpace('\n')(469,470) + PsiElement(SimpleTokenType.KEY)('with')(470,474) + PsiElement(BAD_CHARACTER)('\')(474,475) + PsiWhiteSpace('\n')(475,476) + PsiElement(SimpleTokenType.KEY)('endofline')(476,485) + PsiWhiteSpace(' ')(485,486) + PsiElement(SimpleTokenType.SEPARATOR)('=')(486,487) + PsiWhiteSpace(' ')(487,488) + PsiElement(SimpleTokenType.VALUE)('test')(488,492) diff --git a/simple_plugin/testData/ReferenceTestData.java b/simple_plugin/testData/ReferenceTestData.java new file mode 100644 index 000000000..384347eda --- /dev/null +++ b/simple_plugin/testData/ReferenceTestData.java @@ -0,0 +1,5 @@ +public class Test { + public static void main(String[] args) { + System.out.println("simple:website"); + } +} diff --git a/simple_plugin/testData/RenameTestData.java b/simple_plugin/testData/RenameTestData.java new file mode 100644 index 000000000..384347eda --- /dev/null +++ b/simple_plugin/testData/RenameTestData.java @@ -0,0 +1,5 @@ +public class Test { + public static void main(String[] args) { + System.out.println("simple:website"); + } +} diff --git a/simple_plugin/testData/RenameTestData.simple b/simple_plugin/testData/RenameTestData.simple new file mode 100644 index 000000000..31492ca75 --- /dev/null +++ b/simple_plugin/testData/RenameTestData.simple @@ -0,0 +1,13 @@ +# You are reading the ".properties" entry. +! The exclamation mark can also mark text as comments. +website = http://en.wikipedia.org/ + +language = English +# The backslash below tells the application to continue reading +# the value onto the next line. +message = Welcome to \ + Wikipedia! +# Add spaces to the key +key\ with\ spaces = This is the value that could be looked up with the key "key with spaces". +# Unicode +tab : \u0009 \ No newline at end of file diff --git a/simple_plugin/testData/RenameTestDataAfter.simple b/simple_plugin/testData/RenameTestDataAfter.simple new file mode 100644 index 000000000..71bf7bf73 --- /dev/null +++ b/simple_plugin/testData/RenameTestDataAfter.simple @@ -0,0 +1,13 @@ +# You are reading the ".properties" entry. +! The exclamation mark can also mark text as comments. +websiteUrl = http://en.wikipedia.org/ + +language = English +# The backslash below tells the application to continue reading +# the value onto the next line. +message = Welcome to \ + Wikipedia! +# Add spaces to the key +key\ with\ spaces = This is the value that could be looked up with the key "key with spaces". +# Unicode +tab : \u0009 \ No newline at end of file diff --git a/simple_plugin/tests/com/simpleplugin/SimpleCodeInsightTest.java b/simple_plugin/tests/com/simpleplugin/SimpleCodeInsightTest.java new file mode 100644 index 000000000..29ecc65d6 --- /dev/null +++ b/simple_plugin/tests/com/simpleplugin/SimpleCodeInsightTest.java @@ -0,0 +1,86 @@ +package com.simpleplugin; + +import com.intellij.codeInsight.completion.CompletionType; +import com.intellij.codeInsight.generation.actions.CommentByLineCommentAction; +import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess; +import com.intellij.psi.PsiElement; +import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; +import com.intellij.usageView.UsageInfo; +import com.simpleplugin.psi.SimpleProperty; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +public class SimpleCodeInsightTest extends LightCodeInsightFixtureTestCase { + @Override + protected void setUp() throws Exception { + VfsRootAccess.SHOULD_PERFORM_ACCESS_CHECK = false; // TODO: a workaround for v15 + super.setUp(); + } + + @Override + protected String getTestDataPath() { + return "../../SimplePlugin/testData"; + } + + public void testCompletion() { + myFixture.configureByFiles("CompleteTestData.java", "DefaultTestData.simple"); + myFixture.complete(CompletionType.BASIC, 1); + List strings = myFixture.getLookupElementStrings(); + assertTrue(strings.containsAll(Arrays.asList("key with spaces", "language", "message", "tab", "website"))); + assertEquals(5, strings.size()); + } + + public void testAnnotator() { + myFixture.configureByFiles("AnnotatorTestData.java", "DefaultTestData.simple"); + myFixture.checkHighlighting(false, false, true); + } + + public void testFormatter() { + myFixture.configureByFiles("FormatterTestData.simple"); + CodeStyleSettingsManager.getSettings(getProject()).SPACE_AROUND_ASSIGNMENT_OPERATORS = true; + CodeStyleSettingsManager.getSettings(getProject()).KEEP_BLANK_LINES_IN_CODE = 2; + new WriteCommandAction.Simple(getProject()) { + @Override + protected void run() throws Throwable { + CodeStyleManager.getInstance(getProject()).reformat(myFixture.getFile()); + } + }.execute(); + myFixture.checkResultByFile("DefaultTestData.simple"); + } + + public void testRename() { + myFixture.configureByFiles("RenameTestData.java", "RenameTestData.simple"); + myFixture.renameElementAtCaret("websiteUrl"); + myFixture.checkResultByFile("RenameTestData.simple", "RenameTestDataAfter.simple", false); + } + + public void testFolding() { + myFixture.configureByFiles("DefaultTestData.simple"); + myFixture.testFolding(getTestDataPath() + "/FoldingTestData.java"); + } + + public void testFindUsages() { + Collection usageInfos = myFixture.testFindUsages("FindUsagesTestData.simple", "FindUsagesTestData.java"); + assertEquals(1, usageInfos.size()); + } + + public void testCommenter() { + myFixture.configureByText(SimpleFileType.INSTANCE, "website = http://en.wikipedia.org/"); + CommentByLineCommentAction commentAction = new CommentByLineCommentAction(); + commentAction.actionPerformedImpl(getProject(), myFixture.getEditor()); + myFixture.checkResult("#website = http://en.wikipedia.org/"); + commentAction.actionPerformedImpl(getProject(), myFixture.getEditor()); + myFixture.checkResult("website = http://en.wikipedia.org/"); + } + + public void testReference() { + myFixture.configureByFiles("ReferenceTestData.java", "DefaultTestData.simple"); + PsiElement element = myFixture.getFile().findElementAt(myFixture.getCaretOffset()).getParent(); + assertEquals("http://en.wikipedia.org/", ((SimpleProperty) element.getReferences()[0].resolve()).getValue()); + } +} diff --git a/simple_plugin/tests/com/simpleplugin/SimpleParsingTest.java b/simple_plugin/tests/com/simpleplugin/SimpleParsingTest.java new file mode 100644 index 000000000..52848cca2 --- /dev/null +++ b/simple_plugin/tests/com/simpleplugin/SimpleParsingTest.java @@ -0,0 +1,28 @@ +package com.simpleplugin; + +import com.intellij.testFramework.ParsingTestCase; + +public class SimpleParsingTest extends ParsingTestCase { + public SimpleParsingTest() { + super("", "simple", new SimpleParserDefinition()); + } + + public void testParsingTestData() { + doTest(true); + } + + @Override + protected String getTestDataPath() { + return "../../SimplePlugin/testData"; + } + + @Override + protected boolean skipSpaces() { + return false; + } + + @Override + protected boolean includeRanges() { + return true; + } +} From 77ee65c204ef2b74b79ba476262aff52b5591dc8 Mon Sep 17 00:00:00 2001 From: cheptsov Date: Mon, 7 Sep 2015 19:33:25 +0300 Subject: [PATCH 084/104] Renamed SimplePlugin to simple_language_plugin --- .../JFlex.jar | Bin .../META-INF/plugin.xml | 0 .../com/simpleplugin/parser/SimpleParser.java | 0 .../com/simpleplugin/psi/SimpleProperty.java | 0 .../gen/com/simpleplugin/psi/SimpleTypes.java | 0 .../com/simpleplugin/psi/SimpleVisitor.java | 0 .../psi/impl/SimplePropertyImpl.java | 0 .../idea-flex.skeleton | 0 .../simple_language_plugin.iml | 2 +- .../simpleplugin/CreatePropertyQuickFix.java | 0 .../src/com/simpleplugin/Simple.bnf | 0 .../src/com/simpleplugin/Simple.flex | 0 .../src/com/simpleplugin/SimpleAnnotator.java | 0 .../src/com/simpleplugin/SimpleBlock.java | 0 .../SimpleChooseByNameContributor.java | 0 .../simpleplugin/SimpleCodeStyleSettings.java | 0 .../SimpleCodeStyleSettingsProvider.java | 0 .../simpleplugin/SimpleColorSettingsPage.java | 0 .../src/com/simpleplugin/SimpleCommenter.java | 0 .../SimpleCompletionContributor.java | 0 .../src/com/simpleplugin/SimpleFileType.java | 0 .../simpleplugin/SimpleFileTypeFactory.java | 0 .../com/simpleplugin/SimpleFilterLexer.java | 0 .../SimpleFindUsagesProvider.java | 0 .../simpleplugin/SimpleFoldingBuilder.java | 0 .../SimpleFormattingModelBuilder.java | 0 .../src/com/simpleplugin/SimpleIcons.java | 0 .../src/com/simpleplugin/SimpleIdIndexer.java | 0 .../src/com/simpleplugin/SimpleLanguage.java | 0 ...mpleLanguageCodeStyleSettingsProvider.java | 0 .../src/com/simpleplugin/SimpleLexer.java | 0 .../com/simpleplugin/SimpleLexerAdapter.java | 0 .../SimpleLineMarkerProvider.java | 0 .../simpleplugin/SimpleParserDefinition.java | 0 .../SimpleRefactoringSupportProvider.java | 0 .../src/com/simpleplugin/SimpleReference.java | 0 .../SimpleReferenceContributor.java | 0 .../SimpleStructureViewElement.java | 0 .../SimpleStructureViewFactory.java | 0 .../SimpleStructureViewModel.java | 0 .../simpleplugin/SimpleSyntaxHighlighter.java | 0 .../SimpleSyntaxHighlighterFactory.java | 0 .../com/simpleplugin/SimpleTodoIndexer.java | 0 .../src/com/simpleplugin/SimpleUtil.java | 0 .../src/com/simpleplugin/icons/jar-gray.png | Bin .../psi/SimpleElementFactory.java | 0 .../simpleplugin/psi/SimpleElementType.java | 0 .../src/com/simpleplugin/psi/SimpleFile.java | 0 .../simpleplugin/psi/SimpleNamedElement.java | 0 .../com/simpleplugin/psi/SimpleTokenType.java | 0 .../psi/impl/SimpleNamedElementImpl.java | 0 .../psi/impl/SimplePsiImplUtil.java | 0 .../testData/AnnotatorTestData.java | 0 .../testData/CompleteTestData.java | 0 .../testData/DefaultTestData.simple | 0 .../testData/FindUsagesTestData.java | 0 .../testData/FindUsagesTestData.simple | 0 .../testData/FoldingTestData.java | 0 .../testData/FormatterTestData.simple | 0 .../testData/ParsingTestData.simple | 0 .../testData/ParsingTestData.txt | 0 .../testData/ReferenceTestData.java | 0 .../testData/RenameTestData.java | 0 .../testData/RenameTestData.simple | 0 .../testData/RenameTestDataAfter.simple | 0 .../simpleplugin/SimpleCodeInsightTest.java | 0 .../com/simpleplugin/SimpleParsingTest.java | 0 simple_plugin/.idea/.name | 1 - simple_plugin/.idea/ant.xml | 7 ---- simple_plugin/.idea/compiler.xml | 23 ------------- simple_plugin/.idea/encodings.xml | 5 --- simple_plugin/.idea/misc.xml | 17 ---------- simple_plugin/.idea/modules.xml | 9 ----- .../.idea/runConfigurations/Plugin.xml | 17 ---------- .../.idea/runConfigurations/Tests.xml | 31 ------------------ simple_plugin/.idea/scopes/scope_settings.xml | 5 --- simple_plugin/.idea/vcs.xml | 7 ---- 77 files changed, 1 insertion(+), 123 deletions(-) rename {simple_plugin => simple_language_plugin}/JFlex.jar (100%) rename {simple_plugin => simple_language_plugin}/META-INF/plugin.xml (100%) rename {simple_plugin => simple_language_plugin}/gen/com/simpleplugin/parser/SimpleParser.java (100%) rename {simple_plugin => simple_language_plugin}/gen/com/simpleplugin/psi/SimpleProperty.java (100%) rename {simple_plugin => simple_language_plugin}/gen/com/simpleplugin/psi/SimpleTypes.java (100%) rename {simple_plugin => simple_language_plugin}/gen/com/simpleplugin/psi/SimpleVisitor.java (100%) rename {simple_plugin => simple_language_plugin}/gen/com/simpleplugin/psi/impl/SimplePropertyImpl.java (100%) rename {simple_plugin => simple_language_plugin}/idea-flex.skeleton (100%) rename simple_plugin/SimplePlugin.iml => simple_language_plugin/simple_language_plugin.iml (85%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/CreatePropertyQuickFix.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/Simple.bnf (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/Simple.flex (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleAnnotator.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleBlock.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleChooseByNameContributor.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleCodeStyleSettings.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleCodeStyleSettingsProvider.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleColorSettingsPage.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleCommenter.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleCompletionContributor.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleFileType.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleFileTypeFactory.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleFilterLexer.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleFindUsagesProvider.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleFoldingBuilder.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleFormattingModelBuilder.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleIcons.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleIdIndexer.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleLanguage.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleLanguageCodeStyleSettingsProvider.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleLexer.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleLexerAdapter.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleLineMarkerProvider.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleParserDefinition.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleRefactoringSupportProvider.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleReference.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleReferenceContributor.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleStructureViewElement.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleStructureViewFactory.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleStructureViewModel.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleSyntaxHighlighter.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleSyntaxHighlighterFactory.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleTodoIndexer.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/SimpleUtil.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/icons/jar-gray.png (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/psi/SimpleElementFactory.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/psi/SimpleElementType.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/psi/SimpleFile.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/psi/SimpleNamedElement.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/psi/SimpleTokenType.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/psi/impl/SimpleNamedElementImpl.java (100%) rename {simple_plugin => simple_language_plugin}/src/com/simpleplugin/psi/impl/SimplePsiImplUtil.java (100%) rename {simple_plugin => simple_language_plugin}/testData/AnnotatorTestData.java (100%) rename {simple_plugin => simple_language_plugin}/testData/CompleteTestData.java (100%) rename {simple_plugin => simple_language_plugin}/testData/DefaultTestData.simple (100%) rename {simple_plugin => simple_language_plugin}/testData/FindUsagesTestData.java (100%) rename {simple_plugin => simple_language_plugin}/testData/FindUsagesTestData.simple (100%) rename {simple_plugin => simple_language_plugin}/testData/FoldingTestData.java (100%) rename {simple_plugin => simple_language_plugin}/testData/FormatterTestData.simple (100%) rename {simple_plugin => simple_language_plugin}/testData/ParsingTestData.simple (100%) rename {simple_plugin => simple_language_plugin}/testData/ParsingTestData.txt (100%) rename {simple_plugin => simple_language_plugin}/testData/ReferenceTestData.java (100%) rename {simple_plugin => simple_language_plugin}/testData/RenameTestData.java (100%) rename {simple_plugin => simple_language_plugin}/testData/RenameTestData.simple (100%) rename {simple_plugin => simple_language_plugin}/testData/RenameTestDataAfter.simple (100%) rename {simple_plugin => simple_language_plugin}/tests/com/simpleplugin/SimpleCodeInsightTest.java (100%) rename {simple_plugin => simple_language_plugin}/tests/com/simpleplugin/SimpleParsingTest.java (100%) delete mode 100644 simple_plugin/.idea/.name delete mode 100644 simple_plugin/.idea/ant.xml delete mode 100644 simple_plugin/.idea/compiler.xml delete mode 100644 simple_plugin/.idea/encodings.xml delete mode 100644 simple_plugin/.idea/misc.xml delete mode 100644 simple_plugin/.idea/modules.xml delete mode 100644 simple_plugin/.idea/runConfigurations/Plugin.xml delete mode 100644 simple_plugin/.idea/runConfigurations/Tests.xml delete mode 100644 simple_plugin/.idea/scopes/scope_settings.xml delete mode 100644 simple_plugin/.idea/vcs.xml diff --git a/simple_plugin/JFlex.jar b/simple_language_plugin/JFlex.jar similarity index 100% rename from simple_plugin/JFlex.jar rename to simple_language_plugin/JFlex.jar diff --git a/simple_plugin/META-INF/plugin.xml b/simple_language_plugin/META-INF/plugin.xml similarity index 100% rename from simple_plugin/META-INF/plugin.xml rename to simple_language_plugin/META-INF/plugin.xml diff --git a/simple_plugin/gen/com/simpleplugin/parser/SimpleParser.java b/simple_language_plugin/gen/com/simpleplugin/parser/SimpleParser.java similarity index 100% rename from simple_plugin/gen/com/simpleplugin/parser/SimpleParser.java rename to simple_language_plugin/gen/com/simpleplugin/parser/SimpleParser.java diff --git a/simple_plugin/gen/com/simpleplugin/psi/SimpleProperty.java b/simple_language_plugin/gen/com/simpleplugin/psi/SimpleProperty.java similarity index 100% rename from simple_plugin/gen/com/simpleplugin/psi/SimpleProperty.java rename to simple_language_plugin/gen/com/simpleplugin/psi/SimpleProperty.java diff --git a/simple_plugin/gen/com/simpleplugin/psi/SimpleTypes.java b/simple_language_plugin/gen/com/simpleplugin/psi/SimpleTypes.java similarity index 100% rename from simple_plugin/gen/com/simpleplugin/psi/SimpleTypes.java rename to simple_language_plugin/gen/com/simpleplugin/psi/SimpleTypes.java diff --git a/simple_plugin/gen/com/simpleplugin/psi/SimpleVisitor.java b/simple_language_plugin/gen/com/simpleplugin/psi/SimpleVisitor.java similarity index 100% rename from simple_plugin/gen/com/simpleplugin/psi/SimpleVisitor.java rename to simple_language_plugin/gen/com/simpleplugin/psi/SimpleVisitor.java diff --git a/simple_plugin/gen/com/simpleplugin/psi/impl/SimplePropertyImpl.java b/simple_language_plugin/gen/com/simpleplugin/psi/impl/SimplePropertyImpl.java similarity index 100% rename from simple_plugin/gen/com/simpleplugin/psi/impl/SimplePropertyImpl.java rename to simple_language_plugin/gen/com/simpleplugin/psi/impl/SimplePropertyImpl.java diff --git a/simple_plugin/idea-flex.skeleton b/simple_language_plugin/idea-flex.skeleton similarity index 100% rename from simple_plugin/idea-flex.skeleton rename to simple_language_plugin/idea-flex.skeleton diff --git a/simple_plugin/SimplePlugin.iml b/simple_language_plugin/simple_language_plugin.iml similarity index 85% rename from simple_plugin/SimplePlugin.iml rename to simple_language_plugin/simple_language_plugin.iml index 7bc787656..21a8f5c08 100644 --- a/simple_plugin/SimplePlugin.iml +++ b/simple_language_plugin/simple_language_plugin.iml @@ -8,7 +8,7 @@ - + \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/CreatePropertyQuickFix.java b/simple_language_plugin/src/com/simpleplugin/CreatePropertyQuickFix.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/CreatePropertyQuickFix.java rename to simple_language_plugin/src/com/simpleplugin/CreatePropertyQuickFix.java diff --git a/simple_plugin/src/com/simpleplugin/Simple.bnf b/simple_language_plugin/src/com/simpleplugin/Simple.bnf similarity index 100% rename from simple_plugin/src/com/simpleplugin/Simple.bnf rename to simple_language_plugin/src/com/simpleplugin/Simple.bnf diff --git a/simple_plugin/src/com/simpleplugin/Simple.flex b/simple_language_plugin/src/com/simpleplugin/Simple.flex similarity index 100% rename from simple_plugin/src/com/simpleplugin/Simple.flex rename to simple_language_plugin/src/com/simpleplugin/Simple.flex diff --git a/simple_plugin/src/com/simpleplugin/SimpleAnnotator.java b/simple_language_plugin/src/com/simpleplugin/SimpleAnnotator.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleAnnotator.java rename to simple_language_plugin/src/com/simpleplugin/SimpleAnnotator.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleBlock.java b/simple_language_plugin/src/com/simpleplugin/SimpleBlock.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleBlock.java rename to simple_language_plugin/src/com/simpleplugin/SimpleBlock.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleChooseByNameContributor.java b/simple_language_plugin/src/com/simpleplugin/SimpleChooseByNameContributor.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleChooseByNameContributor.java rename to simple_language_plugin/src/com/simpleplugin/SimpleChooseByNameContributor.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettings.java b/simple_language_plugin/src/com/simpleplugin/SimpleCodeStyleSettings.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettings.java rename to simple_language_plugin/src/com/simpleplugin/SimpleCodeStyleSettings.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettingsProvider.java b/simple_language_plugin/src/com/simpleplugin/SimpleCodeStyleSettingsProvider.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettingsProvider.java rename to simple_language_plugin/src/com/simpleplugin/SimpleCodeStyleSettingsProvider.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleColorSettingsPage.java b/simple_language_plugin/src/com/simpleplugin/SimpleColorSettingsPage.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleColorSettingsPage.java rename to simple_language_plugin/src/com/simpleplugin/SimpleColorSettingsPage.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleCommenter.java b/simple_language_plugin/src/com/simpleplugin/SimpleCommenter.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleCommenter.java rename to simple_language_plugin/src/com/simpleplugin/SimpleCommenter.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleCompletionContributor.java b/simple_language_plugin/src/com/simpleplugin/SimpleCompletionContributor.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleCompletionContributor.java rename to simple_language_plugin/src/com/simpleplugin/SimpleCompletionContributor.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleFileType.java b/simple_language_plugin/src/com/simpleplugin/SimpleFileType.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleFileType.java rename to simple_language_plugin/src/com/simpleplugin/SimpleFileType.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleFileTypeFactory.java b/simple_language_plugin/src/com/simpleplugin/SimpleFileTypeFactory.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleFileTypeFactory.java rename to simple_language_plugin/src/com/simpleplugin/SimpleFileTypeFactory.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleFilterLexer.java b/simple_language_plugin/src/com/simpleplugin/SimpleFilterLexer.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleFilterLexer.java rename to simple_language_plugin/src/com/simpleplugin/SimpleFilterLexer.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java b/simple_language_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java rename to simple_language_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleFoldingBuilder.java b/simple_language_plugin/src/com/simpleplugin/SimpleFoldingBuilder.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleFoldingBuilder.java rename to simple_language_plugin/src/com/simpleplugin/SimpleFoldingBuilder.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleFormattingModelBuilder.java b/simple_language_plugin/src/com/simpleplugin/SimpleFormattingModelBuilder.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleFormattingModelBuilder.java rename to simple_language_plugin/src/com/simpleplugin/SimpleFormattingModelBuilder.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleIcons.java b/simple_language_plugin/src/com/simpleplugin/SimpleIcons.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleIcons.java rename to simple_language_plugin/src/com/simpleplugin/SimpleIcons.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleIdIndexer.java b/simple_language_plugin/src/com/simpleplugin/SimpleIdIndexer.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleIdIndexer.java rename to simple_language_plugin/src/com/simpleplugin/SimpleIdIndexer.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleLanguage.java b/simple_language_plugin/src/com/simpleplugin/SimpleLanguage.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleLanguage.java rename to simple_language_plugin/src/com/simpleplugin/SimpleLanguage.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleLanguageCodeStyleSettingsProvider.java b/simple_language_plugin/src/com/simpleplugin/SimpleLanguageCodeStyleSettingsProvider.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleLanguageCodeStyleSettingsProvider.java rename to simple_language_plugin/src/com/simpleplugin/SimpleLanguageCodeStyleSettingsProvider.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleLexer.java b/simple_language_plugin/src/com/simpleplugin/SimpleLexer.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleLexer.java rename to simple_language_plugin/src/com/simpleplugin/SimpleLexer.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleLexerAdapter.java b/simple_language_plugin/src/com/simpleplugin/SimpleLexerAdapter.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleLexerAdapter.java rename to simple_language_plugin/src/com/simpleplugin/SimpleLexerAdapter.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleLineMarkerProvider.java b/simple_language_plugin/src/com/simpleplugin/SimpleLineMarkerProvider.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleLineMarkerProvider.java rename to simple_language_plugin/src/com/simpleplugin/SimpleLineMarkerProvider.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleParserDefinition.java b/simple_language_plugin/src/com/simpleplugin/SimpleParserDefinition.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleParserDefinition.java rename to simple_language_plugin/src/com/simpleplugin/SimpleParserDefinition.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleRefactoringSupportProvider.java b/simple_language_plugin/src/com/simpleplugin/SimpleRefactoringSupportProvider.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleRefactoringSupportProvider.java rename to simple_language_plugin/src/com/simpleplugin/SimpleRefactoringSupportProvider.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleReference.java b/simple_language_plugin/src/com/simpleplugin/SimpleReference.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleReference.java rename to simple_language_plugin/src/com/simpleplugin/SimpleReference.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleReferenceContributor.java b/simple_language_plugin/src/com/simpleplugin/SimpleReferenceContributor.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleReferenceContributor.java rename to simple_language_plugin/src/com/simpleplugin/SimpleReferenceContributor.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleStructureViewElement.java b/simple_language_plugin/src/com/simpleplugin/SimpleStructureViewElement.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleStructureViewElement.java rename to simple_language_plugin/src/com/simpleplugin/SimpleStructureViewElement.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleStructureViewFactory.java b/simple_language_plugin/src/com/simpleplugin/SimpleStructureViewFactory.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleStructureViewFactory.java rename to simple_language_plugin/src/com/simpleplugin/SimpleStructureViewFactory.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleStructureViewModel.java b/simple_language_plugin/src/com/simpleplugin/SimpleStructureViewModel.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleStructureViewModel.java rename to simple_language_plugin/src/com/simpleplugin/SimpleStructureViewModel.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighter.java b/simple_language_plugin/src/com/simpleplugin/SimpleSyntaxHighlighter.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighter.java rename to simple_language_plugin/src/com/simpleplugin/SimpleSyntaxHighlighter.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighterFactory.java b/simple_language_plugin/src/com/simpleplugin/SimpleSyntaxHighlighterFactory.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighterFactory.java rename to simple_language_plugin/src/com/simpleplugin/SimpleSyntaxHighlighterFactory.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleTodoIndexer.java b/simple_language_plugin/src/com/simpleplugin/SimpleTodoIndexer.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleTodoIndexer.java rename to simple_language_plugin/src/com/simpleplugin/SimpleTodoIndexer.java diff --git a/simple_plugin/src/com/simpleplugin/SimpleUtil.java b/simple_language_plugin/src/com/simpleplugin/SimpleUtil.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/SimpleUtil.java rename to simple_language_plugin/src/com/simpleplugin/SimpleUtil.java diff --git a/simple_plugin/src/com/simpleplugin/icons/jar-gray.png b/simple_language_plugin/src/com/simpleplugin/icons/jar-gray.png similarity index 100% rename from simple_plugin/src/com/simpleplugin/icons/jar-gray.png rename to simple_language_plugin/src/com/simpleplugin/icons/jar-gray.png diff --git a/simple_plugin/src/com/simpleplugin/psi/SimpleElementFactory.java b/simple_language_plugin/src/com/simpleplugin/psi/SimpleElementFactory.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/psi/SimpleElementFactory.java rename to simple_language_plugin/src/com/simpleplugin/psi/SimpleElementFactory.java diff --git a/simple_plugin/src/com/simpleplugin/psi/SimpleElementType.java b/simple_language_plugin/src/com/simpleplugin/psi/SimpleElementType.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/psi/SimpleElementType.java rename to simple_language_plugin/src/com/simpleplugin/psi/SimpleElementType.java diff --git a/simple_plugin/src/com/simpleplugin/psi/SimpleFile.java b/simple_language_plugin/src/com/simpleplugin/psi/SimpleFile.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/psi/SimpleFile.java rename to simple_language_plugin/src/com/simpleplugin/psi/SimpleFile.java diff --git a/simple_plugin/src/com/simpleplugin/psi/SimpleNamedElement.java b/simple_language_plugin/src/com/simpleplugin/psi/SimpleNamedElement.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/psi/SimpleNamedElement.java rename to simple_language_plugin/src/com/simpleplugin/psi/SimpleNamedElement.java diff --git a/simple_plugin/src/com/simpleplugin/psi/SimpleTokenType.java b/simple_language_plugin/src/com/simpleplugin/psi/SimpleTokenType.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/psi/SimpleTokenType.java rename to simple_language_plugin/src/com/simpleplugin/psi/SimpleTokenType.java diff --git a/simple_plugin/src/com/simpleplugin/psi/impl/SimpleNamedElementImpl.java b/simple_language_plugin/src/com/simpleplugin/psi/impl/SimpleNamedElementImpl.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/psi/impl/SimpleNamedElementImpl.java rename to simple_language_plugin/src/com/simpleplugin/psi/impl/SimpleNamedElementImpl.java diff --git a/simple_plugin/src/com/simpleplugin/psi/impl/SimplePsiImplUtil.java b/simple_language_plugin/src/com/simpleplugin/psi/impl/SimplePsiImplUtil.java similarity index 100% rename from simple_plugin/src/com/simpleplugin/psi/impl/SimplePsiImplUtil.java rename to simple_language_plugin/src/com/simpleplugin/psi/impl/SimplePsiImplUtil.java diff --git a/simple_plugin/testData/AnnotatorTestData.java b/simple_language_plugin/testData/AnnotatorTestData.java similarity index 100% rename from simple_plugin/testData/AnnotatorTestData.java rename to simple_language_plugin/testData/AnnotatorTestData.java diff --git a/simple_plugin/testData/CompleteTestData.java b/simple_language_plugin/testData/CompleteTestData.java similarity index 100% rename from simple_plugin/testData/CompleteTestData.java rename to simple_language_plugin/testData/CompleteTestData.java diff --git a/simple_plugin/testData/DefaultTestData.simple b/simple_language_plugin/testData/DefaultTestData.simple similarity index 100% rename from simple_plugin/testData/DefaultTestData.simple rename to simple_language_plugin/testData/DefaultTestData.simple diff --git a/simple_plugin/testData/FindUsagesTestData.java b/simple_language_plugin/testData/FindUsagesTestData.java similarity index 100% rename from simple_plugin/testData/FindUsagesTestData.java rename to simple_language_plugin/testData/FindUsagesTestData.java diff --git a/simple_plugin/testData/FindUsagesTestData.simple b/simple_language_plugin/testData/FindUsagesTestData.simple similarity index 100% rename from simple_plugin/testData/FindUsagesTestData.simple rename to simple_language_plugin/testData/FindUsagesTestData.simple diff --git a/simple_plugin/testData/FoldingTestData.java b/simple_language_plugin/testData/FoldingTestData.java similarity index 100% rename from simple_plugin/testData/FoldingTestData.java rename to simple_language_plugin/testData/FoldingTestData.java diff --git a/simple_plugin/testData/FormatterTestData.simple b/simple_language_plugin/testData/FormatterTestData.simple similarity index 100% rename from simple_plugin/testData/FormatterTestData.simple rename to simple_language_plugin/testData/FormatterTestData.simple diff --git a/simple_plugin/testData/ParsingTestData.simple b/simple_language_plugin/testData/ParsingTestData.simple similarity index 100% rename from simple_plugin/testData/ParsingTestData.simple rename to simple_language_plugin/testData/ParsingTestData.simple diff --git a/simple_plugin/testData/ParsingTestData.txt b/simple_language_plugin/testData/ParsingTestData.txt similarity index 100% rename from simple_plugin/testData/ParsingTestData.txt rename to simple_language_plugin/testData/ParsingTestData.txt diff --git a/simple_plugin/testData/ReferenceTestData.java b/simple_language_plugin/testData/ReferenceTestData.java similarity index 100% rename from simple_plugin/testData/ReferenceTestData.java rename to simple_language_plugin/testData/ReferenceTestData.java diff --git a/simple_plugin/testData/RenameTestData.java b/simple_language_plugin/testData/RenameTestData.java similarity index 100% rename from simple_plugin/testData/RenameTestData.java rename to simple_language_plugin/testData/RenameTestData.java diff --git a/simple_plugin/testData/RenameTestData.simple b/simple_language_plugin/testData/RenameTestData.simple similarity index 100% rename from simple_plugin/testData/RenameTestData.simple rename to simple_language_plugin/testData/RenameTestData.simple diff --git a/simple_plugin/testData/RenameTestDataAfter.simple b/simple_language_plugin/testData/RenameTestDataAfter.simple similarity index 100% rename from simple_plugin/testData/RenameTestDataAfter.simple rename to simple_language_plugin/testData/RenameTestDataAfter.simple diff --git a/simple_plugin/tests/com/simpleplugin/SimpleCodeInsightTest.java b/simple_language_plugin/tests/com/simpleplugin/SimpleCodeInsightTest.java similarity index 100% rename from simple_plugin/tests/com/simpleplugin/SimpleCodeInsightTest.java rename to simple_language_plugin/tests/com/simpleplugin/SimpleCodeInsightTest.java diff --git a/simple_plugin/tests/com/simpleplugin/SimpleParsingTest.java b/simple_language_plugin/tests/com/simpleplugin/SimpleParsingTest.java similarity index 100% rename from simple_plugin/tests/com/simpleplugin/SimpleParsingTest.java rename to simple_language_plugin/tests/com/simpleplugin/SimpleParsingTest.java diff --git a/simple_plugin/.idea/.name b/simple_plugin/.idea/.name deleted file mode 100644 index 316279c80..000000000 --- a/simple_plugin/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -SimplePlugin \ No newline at end of file diff --git a/simple_plugin/.idea/ant.xml b/simple_plugin/.idea/ant.xml deleted file mode 100644 index 2581ca3fe..000000000 --- a/simple_plugin/.idea/ant.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/simple_plugin/.idea/compiler.xml b/simple_plugin/.idea/compiler.xml deleted file mode 100644 index 217af471a..000000000 --- a/simple_plugin/.idea/compiler.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - diff --git a/simple_plugin/.idea/encodings.xml b/simple_plugin/.idea/encodings.xml deleted file mode 100644 index e206d70d8..000000000 --- a/simple_plugin/.idea/encodings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/simple_plugin/.idea/misc.xml b/simple_plugin/.idea/misc.xml deleted file mode 100644 index 1035ff89a..000000000 --- a/simple_plugin/.idea/misc.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/simple_plugin/.idea/modules.xml b/simple_plugin/.idea/modules.xml deleted file mode 100644 index c6008778a..000000000 --- a/simple_plugin/.idea/modules.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/simple_plugin/.idea/runConfigurations/Plugin.xml b/simple_plugin/.idea/runConfigurations/Plugin.xml deleted file mode 100644 index da96a36dd..000000000 --- a/simple_plugin/.idea/runConfigurations/Plugin.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - \ No newline at end of file diff --git a/simple_plugin/.idea/runConfigurations/Tests.xml b/simple_plugin/.idea/runConfigurations/Tests.xml deleted file mode 100644 index 78f9481d0..000000000 --- a/simple_plugin/.idea/runConfigurations/Tests.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/simple_plugin/.idea/scopes/scope_settings.xml b/simple_plugin/.idea/scopes/scope_settings.xml deleted file mode 100644 index 922003b84..000000000 --- a/simple_plugin/.idea/scopes/scope_settings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/simple_plugin/.idea/vcs.xml b/simple_plugin/.idea/vcs.xml deleted file mode 100644 index 275077f82..000000000 --- a/simple_plugin/.idea/vcs.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - From 77a019842ca1f29aa1e8495f70344e0089181a85 Mon Sep 17 00:00:00 2001 From: Vladimir Schneider Date: Wed, 16 Sep 2015 02:06:53 -0400 Subject: [PATCH 085/104] change FindUsages getWordScanner not to be static. If it is static then there are multi-threading issues. When indexing multiple threads are running and overwriting the lexer state that the word scanner uses. I copied the SimplePlugin find usages class and spent hours chasing index out range bugs. I also noticed that the SimplePlugin which I have installed in my plugin dev environment would once in a while cause an exception but I did not pay it much attention. The static word scanner is the source. --- .../src/com/simpleplugin/SimpleFindUsagesProvider.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/simple_language_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java b/simple_language_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java index c766cd3b9..b4b0ab12c 100644 --- a/simple_language_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java +++ b/simple_language_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java @@ -12,14 +12,11 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class SimpleFindUsagesProvider implements FindUsagesProvider { - private static final DefaultWordsScanner WORDS_SCANNER = - new DefaultWordsScanner(new SimpleLexerAdapter(), - TokenSet.create(SimpleTypes.KEY), TokenSet.create(SimpleTypes.COMMENT), TokenSet.EMPTY); - @Nullable @Override public WordsScanner getWordsScanner() { - return WORDS_SCANNER; + return new DefaultWordsScanner(new SimpleLexerAdapter(), + TokenSet.create(SimpleTypes.KEY), TokenSet.create(SimpleTypes.COMMENT), TokenSet.EMPTY);; } @Override @@ -62,4 +59,4 @@ public class SimpleFindUsagesProvider implements FindUsagesProvider { return ""; } } -} \ No newline at end of file +} From 9b3da1741670ebe4e6b50bf0ab37d5508a6592f8 Mon Sep 17 00:00:00 2001 From: breandan Date: Wed, 25 Nov 2015 10:48:50 -0500 Subject: [PATCH 086/104] Add preliminary Gradle build system tutorial. --- gradle_plugin_demo/.gitignore | 11 + gradle_plugin_demo/.idea/.name | 1 + gradle_plugin_demo/.idea/compiler.xml | 23 + gradle_plugin_demo/.idea/encodings.xml | 6 + gradle_plugin_demo/.idea/gradle.xml | 23 + gradle_plugin_demo/.idea/misc.xml | 19 + gradle_plugin_demo/.idea/modules.xml | 8 + gradle_plugin_demo/.idea/workspace.xml | 1028 +++++++++++++++++ gradle_plugin_demo/build.gradle | 31 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 52271 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + gradle_plugin_demo/gradle_plugin_demo.iml | 126 ++ gradle_plugin_demo/gradlew | 164 +++ gradle_plugin_demo/gradlew.bat | 90 ++ .../src/main/java/HelloAction.java | 19 + gradle_plugin_demo/src/main/main.iml | 11 + .../src/main/resources/META-INF/plugin.xml | 41 + 17 files changed, 1607 insertions(+) create mode 100644 gradle_plugin_demo/.gitignore create mode 100644 gradle_plugin_demo/.idea/.name create mode 100644 gradle_plugin_demo/.idea/compiler.xml create mode 100644 gradle_plugin_demo/.idea/encodings.xml create mode 100644 gradle_plugin_demo/.idea/gradle.xml create mode 100644 gradle_plugin_demo/.idea/misc.xml create mode 100644 gradle_plugin_demo/.idea/modules.xml create mode 100644 gradle_plugin_demo/.idea/workspace.xml create mode 100644 gradle_plugin_demo/build.gradle create mode 100644 gradle_plugin_demo/gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle_plugin_demo/gradle/wrapper/gradle-wrapper.properties create mode 100644 gradle_plugin_demo/gradle_plugin_demo.iml create mode 100644 gradle_plugin_demo/gradlew create mode 100644 gradle_plugin_demo/gradlew.bat create mode 100644 gradle_plugin_demo/src/main/java/HelloAction.java create mode 100644 gradle_plugin_demo/src/main/main.iml create mode 100644 gradle_plugin_demo/src/main/resources/META-INF/plugin.xml diff --git a/gradle_plugin_demo/.gitignore b/gradle_plugin_demo/.gitignore new file mode 100644 index 000000000..8388aebc6 --- /dev/null +++ b/gradle_plugin_demo/.gitignore @@ -0,0 +1,11 @@ +# Created by .ignore support plugin (hsz.mobi) +### Gradle template +.gradle +build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + diff --git a/gradle_plugin_demo/.idea/.name b/gradle_plugin_demo/.idea/.name new file mode 100644 index 000000000..98fe802cd --- /dev/null +++ b/gradle_plugin_demo/.idea/.name @@ -0,0 +1 @@ +gradle_plugin_demo \ No newline at end of file diff --git a/gradle_plugin_demo/.idea/compiler.xml b/gradle_plugin_demo/.idea/compiler.xml new file mode 100644 index 000000000..a85231498 --- /dev/null +++ b/gradle_plugin_demo/.idea/compiler.xml @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/gradle_plugin_demo/.idea/encodings.xml b/gradle_plugin_demo/.idea/encodings.xml new file mode 100644 index 000000000..97626ba45 --- /dev/null +++ b/gradle_plugin_demo/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/gradle_plugin_demo/.idea/gradle.xml b/gradle_plugin_demo/.idea/gradle.xml new file mode 100644 index 000000000..da780f060 --- /dev/null +++ b/gradle_plugin_demo/.idea/gradle.xml @@ -0,0 +1,23 @@ + + + + + + \ No newline at end of file diff --git a/gradle_plugin_demo/.idea/misc.xml b/gradle_plugin_demo/.idea/misc.xml new file mode 100644 index 000000000..5f8ff0664 --- /dev/null +++ b/gradle_plugin_demo/.idea/misc.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gradle_plugin_demo/.idea/modules.xml b/gradle_plugin_demo/.idea/modules.xml new file mode 100644 index 000000000..58d26865e --- /dev/null +++ b/gradle_plugin_demo/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/gradle_plugin_demo/.idea/workspace.xml b/gradle_plugin_demo/.idea/workspace.xml new file mode 100644 index 000000000..83cd15fd1 --- /dev/null +++ b/gradle_plugin_demo/.idea/workspace.xml @@ -0,0 +1,1028 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1448451439359 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No facets are configured + + + + + + + + sass-stdlib + + + + + + + + IntelliJ IDEA IU-143.381.42 + + + + + + + + gradle-plugin-demo + + + + + + + + Gradle: com.jetbrains:annotations:15.0.1 + + + + + + + + \ No newline at end of file diff --git a/gradle_plugin_demo/build.gradle b/gradle_plugin_demo/build.gradle new file mode 100644 index 000000000..33e6bee8d --- /dev/null +++ b/gradle_plugin_demo/build.gradle @@ -0,0 +1,31 @@ +buildscript { + repositories { + mavenCentral() + } +} + +plugins { + id "org.jetbrains.intellij" version "0.0.20" +} + +apply plugin: 'idea' +apply plugin: 'org.jetbrains.intellij' +apply plugin: 'java' + +compileJava { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 +} + +intellij { + version '15.0.1' + plugins 'coverage' + pluginName 'gradle_plugin_demo' +} + +group 'org.jetbrains' +version '0.0.1-SNAPSHOT' + +repositories { + mavenCentral () +} \ No newline at end of file diff --git a/gradle_plugin_demo/gradle/wrapper/gradle-wrapper.jar b/gradle_plugin_demo/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..30d399d8d2bf522ff5de94bf434a7cc43a9a74b5 GIT binary patch literal 52271 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 p + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gradle_plugin_demo/gradlew b/gradle_plugin_demo/gradlew new file mode 100644 index 000000000..91a7e269e --- /dev/null +++ b/gradle_plugin_demo/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradle_plugin_demo/gradlew.bat b/gradle_plugin_demo/gradlew.bat new file mode 100644 index 000000000..8a0b282aa --- /dev/null +++ b/gradle_plugin_demo/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/gradle_plugin_demo/src/main/java/HelloAction.java b/gradle_plugin_demo/src/main/java/HelloAction.java new file mode 100644 index 000000000..b0462638a --- /dev/null +++ b/gradle_plugin_demo/src/main/java/HelloAction.java @@ -0,0 +1,19 @@ +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.Messages; + +/** + * Created by breandan on 11/25/2015. + */ +public class HelloAction extends AnAction { + public HelloAction() { + super("Hello"); + } + + public void actionPerformed(AnActionEvent event) { + Project project = event.getData(PlatformDataKeys.PROJECT); + Messages.showMessageDialog(project, "Hello world!", "Greeting", Messages.getInformationIcon()); + } +} \ No newline at end of file diff --git a/gradle_plugin_demo/src/main/main.iml b/gradle_plugin_demo/src/main/main.iml new file mode 100644 index 000000000..908ad4f52 --- /dev/null +++ b/gradle_plugin_demo/src/main/main.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/gradle_plugin_demo/src/main/resources/META-INF/plugin.xml b/gradle_plugin_demo/src/main/resources/META-INF/plugin.xml new file mode 100644 index 000000000..6ff607a5a --- /dev/null +++ b/gradle_plugin_demo/src/main/resources/META-INF/plugin.xml @@ -0,0 +1,41 @@ + + org.jetbrains + gradle_plugin_demo + 0.0.1 + dummy + + + ]]> + + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 89c331076ba0483a96ba77d3450417d102131c28 Mon Sep 17 00:00:00 2001 From: breandan Date: Wed, 2 Dec 2015 01:07:44 -0500 Subject: [PATCH 087/104] Migrate tool window sample, fixes IJSDK-103 Migrate "Creation of Tool Windows" (https://confluence.jetbrains.com/display/IDEADEV/Creation+of+Tool+Windows) and associated code sample (http://git.jetbrains.org/?p=idea/community.git;a=commit;h=cca55289efa57e969f90c12a064dde3f388adaa1) to the SDK docs. --- tool_window/.idea/compiler.xml | 23 + .../.idea/copyright/profiles_settings.xml | 3 + tool_window/.idea/encodings.xml | 6 + .../inspectionProfiles/Project_Default.xml | 11 + .../inspectionProfiles/profiles_settings.xml | 7 + tool_window/.idea/misc.xml | 82 ++ tool_window/.idea/modules.xml | 8 + tool_window/.idea/uiDesigner.xml | 124 +++ tool_window/.idea/workspace.xml | 811 ++++++++++++++++++ tool_window/resources/META-INF/plugin.xml | 33 + .../src/myToolWindow/MyToolWindowFactory.java | 79 ++ tool_window/tool_window.iml | 15 + 12 files changed, 1202 insertions(+) create mode 100644 tool_window/.idea/compiler.xml create mode 100644 tool_window/.idea/copyright/profiles_settings.xml create mode 100644 tool_window/.idea/encodings.xml create mode 100644 tool_window/.idea/inspectionProfiles/Project_Default.xml create mode 100644 tool_window/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 tool_window/.idea/misc.xml create mode 100644 tool_window/.idea/modules.xml create mode 100644 tool_window/.idea/uiDesigner.xml create mode 100644 tool_window/.idea/workspace.xml create mode 100644 tool_window/resources/META-INF/plugin.xml create mode 100644 tool_window/src/myToolWindow/MyToolWindowFactory.java create mode 100644 tool_window/tool_window.iml diff --git a/tool_window/.idea/compiler.xml b/tool_window/.idea/compiler.xml new file mode 100644 index 000000000..a85231498 --- /dev/null +++ b/tool_window/.idea/compiler.xml @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/tool_window/.idea/copyright/profiles_settings.xml b/tool_window/.idea/copyright/profiles_settings.xml new file mode 100644 index 000000000..e7bedf337 --- /dev/null +++ b/tool_window/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/tool_window/.idea/encodings.xml b/tool_window/.idea/encodings.xml new file mode 100644 index 000000000..97626ba45 --- /dev/null +++ b/tool_window/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/tool_window/.idea/inspectionProfiles/Project_Default.xml b/tool_window/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 000000000..04a92ab1d --- /dev/null +++ b/tool_window/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/tool_window/.idea/inspectionProfiles/profiles_settings.xml b/tool_window/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 000000000..3b312839b --- /dev/null +++ b/tool_window/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/tool_window/.idea/misc.xml b/tool_window/.idea/misc.xml new file mode 100644 index 000000000..1d712c0fe --- /dev/null +++ b/tool_window/.idea/misc.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + sass-stdlib + + + + + + + + 1.8 + + + + + + + + 1.6 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tool_window/.idea/modules.xml b/tool_window/.idea/modules.xml new file mode 100644 index 000000000..3fa641aa0 --- /dev/null +++ b/tool_window/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/tool_window/.idea/uiDesigner.xml b/tool_window/.idea/uiDesigner.xml new file mode 100644 index 000000000..e96534fb2 --- /dev/null +++ b/tool_window/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tool_window/.idea/workspace.xml b/tool_window/.idea/workspace.xml new file mode 100644 index 000000000..2bc4f6746 --- /dev/null +++ b/tool_window/.idea/workspace.xml @@ -0,0 +1,811 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1449033553755 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tool_window/resources/META-INF/plugin.xml b/tool_window/resources/META-INF/plugin.xml new file mode 100644 index 000000000..332a2a997 --- /dev/null +++ b/tool_window/resources/META-INF/plugin.xml @@ -0,0 +1,33 @@ + + org.jetbrains.plugins.sample.ToolWindow + Tool Window + This sample plugin illustrates how to create your custom tool window. + 2.0 + YourCompany + + + most HTML tags may be used + ]]> + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tool_window/src/myToolWindow/MyToolWindowFactory.java b/tool_window/src/myToolWindow/MyToolWindowFactory.java new file mode 100644 index 000000000..1082183c6 --- /dev/null +++ b/tool_window/src/myToolWindow/MyToolWindowFactory.java @@ -0,0 +1,79 @@ +package myToolWindow; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.wm.ToolWindow; +import com.intellij.openapi.wm.ToolWindowFactory; +import com.intellij.ui.content.Content; +import com.intellij.ui.content.ContentFactory; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Calendar; + +/** + * Created by IntelliJ IDEA. + * User: Alexey.Chursin + * Date: Aug 25, 2010 + * Time: 2:09:00 PM + */ +public class MyToolWindowFactory implements ToolWindowFactory { + + private JButton refreshToolWindowButton; + private JButton hideToolWindowButton; + private JLabel currentDate; + private JLabel currentTime; + private JLabel timeZone; + private JPanel myToolWindowContent; + private ToolWindow myToolWindow; + + + public MyToolWindowFactory() { + hideToolWindowButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + myToolWindow.hide(null); + } + }); + refreshToolWindowButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + MyToolWindowFactory.this.currentDateTime(); + } + }); + } + + // Create the tool window content. + public void createToolWindowContent(Project project, ToolWindow toolWindow) { + myToolWindow = toolWindow; + this.currentDateTime(); + ContentFactory contentFactory = ContentFactory.SERVICE.getInstance(); + Content content = contentFactory.createContent(myToolWindowContent, "", false); + toolWindow.getContentManager().addContent(content); + + } + + public void currentDateTime() { + // Get current date and time + Calendar instance = Calendar.getInstance(); + currentDate.setText(String.valueOf(instance.get(Calendar.DAY_OF_MONTH)) + "/" + + String.valueOf(instance.get(Calendar.MONTH) + 1) + "/" + String.valueOf(instance.get(Calendar.YEAR))); + currentDate.setIcon(new ImageIcon(getClass().getResource("/myToolWindow/Calendar-icon.png"))); + int min = instance.get(Calendar.MINUTE); + String strMin; + if (min < 10) { + strMin = "0" + String.valueOf(min); + } else { + strMin = String.valueOf(min); + } + currentTime.setText(instance.get(Calendar.HOUR_OF_DAY) + ":" + strMin); + currentTime.setIcon(new ImageIcon(getClass().getResource("/myToolWindow/Time-icon.png"))); + // Get time zone + long gmt_Offset = instance.get(Calendar.ZONE_OFFSET); // offset from GMT in milliseconds + String str_gmt_Offset = String.valueOf(gmt_Offset / 3600000); + str_gmt_Offset = (gmt_Offset > 0) ? "GMT + " + str_gmt_Offset : "GMT - " + str_gmt_Offset; + timeZone.setText(str_gmt_Offset); + timeZone.setIcon(new ImageIcon(getClass().getResource("/myToolWindow/Time-zone-icon.png"))); + + + } + +} diff --git a/tool_window/tool_window.iml b/tool_window/tool_window.iml new file mode 100644 index 000000000..dd6e2bd1a --- /dev/null +++ b/tool_window/tool_window.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file From 26b5695c8b8eb2055d8a89d1b2df274f4fdcf602 Mon Sep 17 00:00:00 2001 From: breandan Date: Wed, 2 Dec 2015 12:32:13 -0500 Subject: [PATCH 088/104] Add missing files from IJSDK-103 --- tool_window/.gitignore | 31 +++++++++ .../src/myToolWindow/Calendar-icon.png | Bin 0 -> 2440 bytes .../src/myToolWindow/MyToolWindow.form | 63 ++++++++++++++++++ tool_window/src/myToolWindow/Time-icon.png | Bin 0 -> 3857 bytes .../src/myToolWindow/Time-zone-icon.png | Bin 0 -> 4185 bytes tool_window/src/myToolWindow/plus.png | Bin 0 -> 201 bytes 6 files changed, 94 insertions(+) create mode 100644 tool_window/.gitignore create mode 100644 tool_window/src/myToolWindow/Calendar-icon.png create mode 100644 tool_window/src/myToolWindow/MyToolWindow.form create mode 100644 tool_window/src/myToolWindow/Time-icon.png create mode 100644 tool_window/src/myToolWindow/Time-zone-icon.png create mode 100644 tool_window/src/myToolWindow/plus.png diff --git a/tool_window/.gitignore b/tool_window/.gitignore new file mode 100644 index 000000000..92314aa3c --- /dev/null +++ b/tool_window/.gitignore @@ -0,0 +1,31 @@ +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio + +## Directory-based project format: +#.idea/ +# if you remove the above rule, at least ignore the following: + +# User-specific stuff: + .idea/workspace.xml +# .idea/tasks.xml +# .idea/dictionaries + +# Sensitive or high-churn files: +# .idea/dataSources.ids +# .idea/dataSources.xml +# .idea/sqlDataSources.xml +# .idea/dynamic.xml + .idea/uiDesigner.xml + +# Gradle: +# .idea/gradle.xml +# .idea/libraries + +## File-based project format: +*.ipr +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ diff --git a/tool_window/src/myToolWindow/Calendar-icon.png b/tool_window/src/myToolWindow/Calendar-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5e4d507a7c611384532b7920cd7e0349b123dd0c GIT binary patch literal 2440 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 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/tool_window/src/myToolWindow/Time-icon.png b/tool_window/src/myToolWindow/Time-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b9cbf33cc11186804740100137ab7638ba45a668 GIT binary patch literal 3857 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 TCkK8t00000NkvXXu0mjfXz77v literal 0 HcmV?d00001 diff --git a/tool_window/src/myToolWindow/Time-zone-icon.png b/tool_window/src/myToolWindow/Time-zone-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..63843d352b376e0fdd3495504c99601d7039d36a GIT binary patch literal 4185 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 literal 0 HcmV?d00001 diff --git a/tool_window/src/myToolWindow/plus.png b/tool_window/src/myToolWindow/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..f5b3c6e3a4f60849d38a3e747caf5faa5659c823 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1SIo6Pjm-TEa{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5iY`5E5WxVPFxk sGiGGsaOH~>765X%kL-;2%E%(Y;2S9<>y*PA3bcm7)78&qol`;+07f!5>i_@% literal 0 HcmV?d00001 From 92f31335c76659ca55b5ebbbd7862a3254bedd5e Mon Sep 17 00:00:00 2001 From: breandan Date: Wed, 2 Dec 2015 12:44:49 -0500 Subject: [PATCH 089/104] Move *.png assets to resources/ --- .../resources/myToolWindow/Calendar-icon.png | Bin 0 -> 2440 bytes tool_window/resources/myToolWindow/Time-icon.png | Bin 0 -> 3857 bytes .../resources/myToolWindow/Time-zone-icon.png | Bin 0 -> 4185 bytes tool_window/resources/myToolWindow/plus.png | Bin 0 -> 201 bytes tool_window/tool_window.iml | 4 +--- 5 files changed, 1 insertion(+), 3 deletions(-) create mode 100644 tool_window/resources/myToolWindow/Calendar-icon.png create mode 100644 tool_window/resources/myToolWindow/Time-icon.png create mode 100644 tool_window/resources/myToolWindow/Time-zone-icon.png create mode 100644 tool_window/resources/myToolWindow/plus.png diff --git a/tool_window/resources/myToolWindow/Calendar-icon.png b/tool_window/resources/myToolWindow/Calendar-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5e4d507a7c611384532b7920cd7e0349b123dd0c GIT binary patch literal 2440 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 TCkK8t00000NkvXXu0mjfXz77v literal 0 HcmV?d00001 diff --git a/tool_window/resources/myToolWindow/Time-zone-icon.png b/tool_window/resources/myToolWindow/Time-zone-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..63843d352b376e0fdd3495504c99601d7039d36a GIT binary patch literal 4185 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 literal 0 HcmV?d00001 diff --git a/tool_window/resources/myToolWindow/plus.png b/tool_window/resources/myToolWindow/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..f5b3c6e3a4f60849d38a3e747caf5faa5659c823 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1SIo6Pjm-TEa{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5iY`5E5WxVPFxk sGiGGsaOH~>765X%kL-;2%E%(Y;2S9<>y*PA3bcm7)78&qol`;+07f!5>i_@% literal 0 HcmV?d00001 diff --git a/tool_window/tool_window.iml b/tool_window/tool_window.iml index dd6e2bd1a..59886e3c4 100644 --- a/tool_window/tool_window.iml +++ b/tool_window/tool_window.iml @@ -2,9 +2,7 @@ - - - + From 0bfab58cc8d37ce7ff0e597a655d3d8b24dba847 Mon Sep 17 00:00:00 2001 From: breandan Date: Thu, 3 Dec 2015 15:28:36 -0500 Subject: [PATCH 090/104] Add code_sample projects as sub-modules inside intellij-sdk-docs --- editor_basics/editor_basics.iml | 2 +- facet_basics/facet_basics.iml | 2 +- framework/framework.iml | 2 +- inspection/inspection.iml | 2 +- module/module.iml | 2 +- plugin_sample/plugin_sample.iml | 2 +- project_model/project_model.iml | 2 +- project_view_pane/project_view_pane.iml | 2 +- project_wizard/project_wizard.iml | 2 +- register_actions/register_actions.iml | 2 +- run_configuration/run_configuration.iml | 2 +- simple_language_plugin/simple_language_plugin.iml | 3 +-- tree_structure_provider/tree_structure_provider.iml | 2 +- 13 files changed, 13 insertions(+), 14 deletions(-) diff --git a/editor_basics/editor_basics.iml b/editor_basics/editor_basics.iml index a996ed895..1820d90c4 100644 --- a/editor_basics/editor_basics.iml +++ b/editor_basics/editor_basics.iml @@ -1,7 +1,7 @@ - + diff --git a/facet_basics/facet_basics.iml b/facet_basics/facet_basics.iml index 4157f07aa..c263a60ba 100644 --- a/facet_basics/facet_basics.iml +++ b/facet_basics/facet_basics.iml @@ -1,7 +1,7 @@ - + diff --git a/framework/framework.iml b/framework/framework.iml index 8dc4df7da..cc8a8a9d4 100644 --- a/framework/framework.iml +++ b/framework/framework.iml @@ -1,7 +1,7 @@ - + diff --git a/inspection/inspection.iml b/inspection/inspection.iml index 658dffd61..61dbfac62 100644 --- a/inspection/inspection.iml +++ b/inspection/inspection.iml @@ -1,7 +1,7 @@ - + diff --git a/module/module.iml b/module/module.iml index 8dc4df7da..cc8a8a9d4 100644 --- a/module/module.iml +++ b/module/module.iml @@ -1,7 +1,7 @@ - + diff --git a/plugin_sample/plugin_sample.iml b/plugin_sample/plugin_sample.iml index dde7c8295..b513413c1 100644 --- a/plugin_sample/plugin_sample.iml +++ b/plugin_sample/plugin_sample.iml @@ -1,7 +1,7 @@ - + diff --git a/project_model/project_model.iml b/project_model/project_model.iml index 8dc4df7da..cc8a8a9d4 100644 --- a/project_model/project_model.iml +++ b/project_model/project_model.iml @@ -1,7 +1,7 @@ - + diff --git a/project_view_pane/project_view_pane.iml b/project_view_pane/project_view_pane.iml index 8dc4df7da..cc8a8a9d4 100644 --- a/project_view_pane/project_view_pane.iml +++ b/project_view_pane/project_view_pane.iml @@ -1,7 +1,7 @@ - + diff --git a/project_wizard/project_wizard.iml b/project_wizard/project_wizard.iml index 8dc4df7da..cc8a8a9d4 100644 --- a/project_wizard/project_wizard.iml +++ b/project_wizard/project_wizard.iml @@ -1,7 +1,7 @@ - + diff --git a/register_actions/register_actions.iml b/register_actions/register_actions.iml index 8dc4df7da..cc8a8a9d4 100644 --- a/register_actions/register_actions.iml +++ b/register_actions/register_actions.iml @@ -1,7 +1,7 @@ - + diff --git a/run_configuration/run_configuration.iml b/run_configuration/run_configuration.iml index 8dc4df7da..cc8a8a9d4 100644 --- a/run_configuration/run_configuration.iml +++ b/run_configuration/run_configuration.iml @@ -1,7 +1,7 @@ - + diff --git a/simple_language_plugin/simple_language_plugin.iml b/simple_language_plugin/simple_language_plugin.iml index 21a8f5c08..4f37844bf 100644 --- a/simple_language_plugin/simple_language_plugin.iml +++ b/simple_language_plugin/simple_language_plugin.iml @@ -1,8 +1,7 @@ - - + diff --git a/tree_structure_provider/tree_structure_provider.iml b/tree_structure_provider/tree_structure_provider.iml index a94f873c1..0c175fd02 100644 --- a/tree_structure_provider/tree_structure_provider.iml +++ b/tree_structure_provider/tree_structure_provider.iml @@ -1,7 +1,7 @@ - + From aeb55b1a27312216955a8af9edc82026423488fd Mon Sep 17 00:00:00 2001 From: breandan Date: Thu, 3 Dec 2015 16:23:33 -0500 Subject: [PATCH 091/104] Share run configurations and inherit the project output path --- editor_basics/editor_basics.iml | 4 ++-- facet_basics/facet_basics.iml | 4 ++-- framework/framework.iml | 2 +- gradle_plugin_demo/gradle_plugin_demo.iml | 4 +--- inspection/inspection.iml | 3 +-- .../com/intellij/tutorials/inspection/DemoCodeInspection.java | 0 .../tutorials/inspection/DemoInspectionToolProvider.java | 0 .../intellij/tutorials/inspection/DemoInspectionVisitor.java | 0 inspection/{scr => src}/inspectionDescriptions/DemoCode.html | 0 module/module.iml | 2 +- plugin_sample/plugin_sample.iml | 4 ++-- project_model/project_model.iml | 2 +- project_view_pane/project_view_pane.iml | 2 +- project_wizard/project_wizard.iml | 2 +- register_actions/register_actions.iml | 2 +- run_configuration/run_configuration.iml | 2 +- simple_language_plugin/simple_language_plugin.iml | 4 ++-- tool_window/tool_window.iml | 3 +-- tree_structure_provider/tree_structure_provider.iml | 4 ++-- 19 files changed, 20 insertions(+), 24 deletions(-) rename inspection/{scr => src}/com/intellij/tutorials/inspection/DemoCodeInspection.java (100%) rename inspection/{scr => src}/com/intellij/tutorials/inspection/DemoInspectionToolProvider.java (100%) rename inspection/{scr => src}/com/intellij/tutorials/inspection/DemoInspectionVisitor.java (100%) rename inspection/{scr => src}/inspectionDescriptions/DemoCode.html (100%) diff --git a/editor_basics/editor_basics.iml b/editor_basics/editor_basics.iml index 1820d90c4..d1076ac92 100644 --- a/editor_basics/editor_basics.iml +++ b/editor_basics/editor_basics.iml @@ -1,11 +1,11 @@ - + - + \ No newline at end of file diff --git a/facet_basics/facet_basics.iml b/facet_basics/facet_basics.iml index c263a60ba..b1d6be3ab 100644 --- a/facet_basics/facet_basics.iml +++ b/facet_basics/facet_basics.iml @@ -1,11 +1,11 @@ - + - + \ No newline at end of file diff --git a/framework/framework.iml b/framework/framework.iml index cc8a8a9d4..b1d6be3ab 100644 --- a/framework/framework.iml +++ b/framework/framework.iml @@ -1,7 +1,7 @@ - + diff --git a/gradle_plugin_demo/gradle_plugin_demo.iml b/gradle_plugin_demo/gradle_plugin_demo.iml index d0b492653..386fdbbad 100644 --- a/gradle_plugin_demo/gradle_plugin_demo.iml +++ b/gradle_plugin_demo/gradle_plugin_demo.iml @@ -1,8 +1,6 @@ - - - + diff --git a/inspection/inspection.iml b/inspection/inspection.iml index 61dbfac62..b1d6be3ab 100644 --- a/inspection/inspection.iml +++ b/inspection/inspection.iml @@ -1,10 +1,9 @@ - + - diff --git a/inspection/scr/com/intellij/tutorials/inspection/DemoCodeInspection.java b/inspection/src/com/intellij/tutorials/inspection/DemoCodeInspection.java similarity index 100% rename from inspection/scr/com/intellij/tutorials/inspection/DemoCodeInspection.java rename to inspection/src/com/intellij/tutorials/inspection/DemoCodeInspection.java diff --git a/inspection/scr/com/intellij/tutorials/inspection/DemoInspectionToolProvider.java b/inspection/src/com/intellij/tutorials/inspection/DemoInspectionToolProvider.java similarity index 100% rename from inspection/scr/com/intellij/tutorials/inspection/DemoInspectionToolProvider.java rename to inspection/src/com/intellij/tutorials/inspection/DemoInspectionToolProvider.java diff --git a/inspection/scr/com/intellij/tutorials/inspection/DemoInspectionVisitor.java b/inspection/src/com/intellij/tutorials/inspection/DemoInspectionVisitor.java similarity index 100% rename from inspection/scr/com/intellij/tutorials/inspection/DemoInspectionVisitor.java rename to inspection/src/com/intellij/tutorials/inspection/DemoInspectionVisitor.java diff --git a/inspection/scr/inspectionDescriptions/DemoCode.html b/inspection/src/inspectionDescriptions/DemoCode.html similarity index 100% rename from inspection/scr/inspectionDescriptions/DemoCode.html rename to inspection/src/inspectionDescriptions/DemoCode.html diff --git a/module/module.iml b/module/module.iml index cc8a8a9d4..b1d6be3ab 100644 --- a/module/module.iml +++ b/module/module.iml @@ -1,7 +1,7 @@ - + diff --git a/plugin_sample/plugin_sample.iml b/plugin_sample/plugin_sample.iml index b513413c1..347e916d5 100644 --- a/plugin_sample/plugin_sample.iml +++ b/plugin_sample/plugin_sample.iml @@ -1,12 +1,12 @@ - + - + \ No newline at end of file diff --git a/project_model/project_model.iml b/project_model/project_model.iml index cc8a8a9d4..b1d6be3ab 100644 --- a/project_model/project_model.iml +++ b/project_model/project_model.iml @@ -1,7 +1,7 @@ - + diff --git a/project_view_pane/project_view_pane.iml b/project_view_pane/project_view_pane.iml index cc8a8a9d4..b1d6be3ab 100644 --- a/project_view_pane/project_view_pane.iml +++ b/project_view_pane/project_view_pane.iml @@ -1,7 +1,7 @@ - + diff --git a/project_wizard/project_wizard.iml b/project_wizard/project_wizard.iml index cc8a8a9d4..b1d6be3ab 100644 --- a/project_wizard/project_wizard.iml +++ b/project_wizard/project_wizard.iml @@ -1,7 +1,7 @@ - + diff --git a/register_actions/register_actions.iml b/register_actions/register_actions.iml index cc8a8a9d4..b1d6be3ab 100644 --- a/register_actions/register_actions.iml +++ b/register_actions/register_actions.iml @@ -1,7 +1,7 @@ - + diff --git a/run_configuration/run_configuration.iml b/run_configuration/run_configuration.iml index cc8a8a9d4..b1d6be3ab 100644 --- a/run_configuration/run_configuration.iml +++ b/run_configuration/run_configuration.iml @@ -1,7 +1,7 @@ - + diff --git a/simple_language_plugin/simple_language_plugin.iml b/simple_language_plugin/simple_language_plugin.iml index 4f37844bf..4d7e4548e 100644 --- a/simple_language_plugin/simple_language_plugin.iml +++ b/simple_language_plugin/simple_language_plugin.iml @@ -1,13 +1,13 @@ - + - + \ No newline at end of file diff --git a/tool_window/tool_window.iml b/tool_window/tool_window.iml index 59886e3c4..3700dfbf1 100644 --- a/tool_window/tool_window.iml +++ b/tool_window/tool_window.iml @@ -1,8 +1,7 @@ - - + diff --git a/tree_structure_provider/tree_structure_provider.iml b/tree_structure_provider/tree_structure_provider.iml index 0c175fd02..a033c1683 100644 --- a/tree_structure_provider/tree_structure_provider.iml +++ b/tree_structure_provider/tree_structure_provider.iml @@ -1,12 +1,12 @@ - + - + \ No newline at end of file From a7578232fc0ff89bac3522bafce7a107c8d9be48 Mon Sep 17 00:00:00 2001 From: breandan Date: Thu, 3 Dec 2015 16:34:46 -0500 Subject: [PATCH 092/104] Remove empty project --- simple_plugin/.idea/copyright/profiles_settings.xml | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 simple_plugin/.idea/copyright/profiles_settings.xml diff --git a/simple_plugin/.idea/copyright/profiles_settings.xml b/simple_plugin/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf337..000000000 --- a/simple_plugin/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file From 459c3d52a45c3bdf2fc59ff036d567b16d756cdd Mon Sep 17 00:00:00 2001 From: breandan Date: Thu, 3 Dec 2015 16:41:31 -0500 Subject: [PATCH 093/104] Fix compiler error --- .../src/com/simpleplugin/SimpleFindUsagesProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simple_language_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java b/simple_language_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java index b4b0ab12c..0d8160cab 100644 --- a/simple_language_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java +++ b/simple_language_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java @@ -16,7 +16,7 @@ public class SimpleFindUsagesProvider implements FindUsagesProvider { @Override public WordsScanner getWordsScanner() { return new DefaultWordsScanner(new SimpleLexerAdapter(), - TokenSet.create(SimpleTypes.KEY), TokenSet.create(SimpleTypes.COMMENT), TokenSet.EMPTY);; + TokenSet.create(SimpleTypes.KEY), TokenSet.create(SimpleTypes.COMMENT), TokenSet.EMPTY); } @Override From 74a64dbc5807356d7396ec72d1e425695b2c9036 Mon Sep 17 00:00:00 2001 From: breandan Date: Thu, 3 Dec 2015 17:21:16 -0500 Subject: [PATCH 094/104] Unzipped MaxOpenedProjects and added Gradle module --- MaxOpenedProjects/MaxOpenedProjects.iml | 12 +++++ MaxOpenedProjects/src/META-INF/plugin.xml | 29 ++++++++++ .../src/MyPackage/MaxProject.java | 54 +++++++++++++++++++ .../src/MyPackage/MyCounter.java | 29 ++++++++++ 4 files changed, 124 insertions(+) create mode 100644 MaxOpenedProjects/MaxOpenedProjects.iml create mode 100644 MaxOpenedProjects/src/META-INF/plugin.xml create mode 100644 MaxOpenedProjects/src/MyPackage/MaxProject.java create mode 100644 MaxOpenedProjects/src/MyPackage/MyCounter.java diff --git a/MaxOpenedProjects/MaxOpenedProjects.iml b/MaxOpenedProjects/MaxOpenedProjects.iml new file mode 100644 index 000000000..347e916d5 --- /dev/null +++ b/MaxOpenedProjects/MaxOpenedProjects.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/MaxOpenedProjects/src/META-INF/plugin.xml b/MaxOpenedProjects/src/META-INF/plugin.xml new file mode 100644 index 000000000..3e3ce844c --- /dev/null +++ b/MaxOpenedProjects/src/META-INF/plugin.xml @@ -0,0 +1,29 @@ + + Plugin name here + short description of the plugin + 1.0 + YourCompany + + + + + + + + + + MyPackage.MaxProject + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MaxOpenedProjects/src/MyPackage/MaxProject.java b/MaxOpenedProjects/src/MyPackage/MaxProject.java new file mode 100644 index 000000000..dbf179d55 --- /dev/null +++ b/MaxOpenedProjects/src/MyPackage/MaxProject.java @@ -0,0 +1,54 @@ +package MyPackage; + +import com.intellij.openapi.components.ProjectComponent; +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.ProjectManager; +import com.intellij.openapi.ui.Messages; +import org.jetbrains.annotations.NotNull; + +/** + * Created by IntelliJ IDEA. + * User: Alexey.Chursin + * Date: Aug 13, 2010 + * Time: 3:50:25 PM + * To change this template use File | Settings | File Templates. + */ +public class MaxProject implements ProjectComponent { + public MaxProject(Project project) { + } + + public void initComponent() { + // TODO: insert component initialization logic here + } + + public void disposeComponent() { + // TODO: insert component disposal logic here + } + + @NotNull + public String getComponentName() { + return "MaxProject"; + } + + public void projectOpened() { + // called when project is opened + MyCounter CommandCounter = ServiceManager.getService(MyCounter.class); + + if (CommandCounter.IncreaseCounter() == -1) { + Messages.showMessageDialog("The maximum number of opened projects exceeds " + String.valueOf(CommandCounter.MaxCount) + + " projects!", "Error", Messages.getErrorIcon()); + ProjectManager PM=ProjectManager.getInstance(); + Project[] AllProjects = PM.getOpenProjects(); + Project project = AllProjects[AllProjects.length-1]; + PM.closeProject(project); + } + } + + + public void projectClosed() { + // called when project is being closed + MyCounter CommandCounter = ServiceManager.getService(MyCounter.class); + CommandCounter.DecreaseCounter(); + } +} diff --git a/MaxOpenedProjects/src/MyPackage/MyCounter.java b/MaxOpenedProjects/src/MyPackage/MyCounter.java new file mode 100644 index 000000000..f2e5417a8 --- /dev/null +++ b/MaxOpenedProjects/src/MyPackage/MyCounter.java @@ -0,0 +1,29 @@ +package MyPackage; + +/** + * Created by IntelliJ IDEA. + * User: Alexey.Chursin + * Date: Aug 13, 2010 + * Time: 3:49:33 PM + * To change this template use File | Settings | File Templates. + */ +public class MyCounter { + private int Count = 0; + // Sets the maximum allowed number of opened projects. + public final int MaxCount = 3; + public MyCounter(){ + + + } + + public int IncreaseCounter() { + Count++; + return (Count > MaxCount) ? -1:Count; + } + + public int DecreaseCounter() { + Count--; + return (Count > MaxCount) ? -1:Count; + } + +} From 904dbd472c14a7a515afbe7c0675ddafbad2c3db Mon Sep 17 00:00:00 2001 From: breandan Date: Fri, 4 Dec 2015 05:52:16 -0500 Subject: [PATCH 095/104] Switch IJSDK to Community and fix typo in tree_structure_provider --- .../tutorials/tree/structure/TextOnlyTreeStructureProvider.java | 0 tree_structure_provider/tree_structure_provider.iml | 1 - 2 files changed, 1 deletion(-) rename tree_structure_provider/{scr => src}/org/jetbrains/tutorials/tree/structure/TextOnlyTreeStructureProvider.java (100%) diff --git a/tree_structure_provider/scr/org/jetbrains/tutorials/tree/structure/TextOnlyTreeStructureProvider.java b/tree_structure_provider/src/org/jetbrains/tutorials/tree/structure/TextOnlyTreeStructureProvider.java similarity index 100% rename from tree_structure_provider/scr/org/jetbrains/tutorials/tree/structure/TextOnlyTreeStructureProvider.java rename to tree_structure_provider/src/org/jetbrains/tutorials/tree/structure/TextOnlyTreeStructureProvider.java diff --git a/tree_structure_provider/tree_structure_provider.iml b/tree_structure_provider/tree_structure_provider.iml index a033c1683..b1d6be3ab 100644 --- a/tree_structure_provider/tree_structure_provider.iml +++ b/tree_structure_provider/tree_structure_provider.iml @@ -4,7 +4,6 @@ - From 2cf2e55eb9b291deb387f32208f376adab63bb00 Mon Sep 17 00:00:00 2001 From: breandan Date: Sat, 5 Dec 2015 08:56:10 -0500 Subject: [PATCH 096/104] Update plugin code samples to use canonical project structure --- MaxOpenedProjects/MaxOpenedProjects.iml | 2 +- .../{src => resources}/META-INF/plugin.xml | 0 editor_basics/editor_basics.iml | 1 + facet_basics/facet_basics.iml | 3 +- .../{ => resources}/META-INF/plugin.xml | 0 framework/framework.iml | 3 +- framework/{ => resources}/META-INF/plugin.xml | 0 gradle_plugin_demo/.idea/.name | 1 - gradle_plugin_demo/.idea/compiler.xml | 23 - gradle_plugin_demo/.idea/encodings.xml | 6 - gradle_plugin_demo/.idea/gradle.xml | 23 - gradle_plugin_demo/.idea/misc.xml | 19 - gradle_plugin_demo/.idea/modules.xml | 8 - gradle_plugin_demo/.idea/workspace.xml | 1028 ----------------- inspection/inspection.iml | 3 +- .../{ => resources}/META-INF/plugin.xml | 0 module/module.iml | 3 +- module/{ => resources}/META-INF/plugin.xml | 0 plugin_sample/plugin_sample.iml | 2 +- .../{ => resources}/META-INF/plugin.xml | 0 project_model/project_model.iml | 3 +- .../{ => resources}/META-INF/plugin.xml | 0 project_view_pane/project_view_pane.iml | 3 +- .../{ => resources}/META-INF/plugin.xml | 0 project_wizard/project_wizard.iml | 3 +- .../{ => resources}/META-INF/plugin.xml | 0 register_actions/register_actions.iml | 3 +- .../{ => resources}/META-INF/plugin.xml | 0 .../{ => resources}/META-INF/plugin.xml | 0 run_configuration/run_configuration.iml | 3 +- .../{ => resources}/META-INF/plugin.xml | 0 .../simple_language_plugin.iml | 3 +- tool_window/.idea/compiler.xml | 23 - .../.idea/copyright/profiles_settings.xml | 3 - tool_window/.idea/encodings.xml | 6 - .../inspectionProfiles/Project_Default.xml | 11 - .../inspectionProfiles/profiles_settings.xml | 7 - tool_window/.idea/misc.xml | 82 -- tool_window/.idea/modules.xml | 8 - tool_window/.idea/uiDesigner.xml | 124 -- tool_window/.idea/workspace.xml | 811 ------------- .../src/myToolWindow/Calendar-icon.png | Bin 2440 -> 0 bytes tool_window/src/myToolWindow/Time-icon.png | Bin 3857 -> 0 bytes .../src/myToolWindow/Time-zone-icon.png | Bin 4185 -> 0 bytes tool_window/src/myToolWindow/plus.png | Bin 201 -> 0 bytes .../{ => resources}/META-INF/plugin.xml | 0 .../tree_structure_provider.iml | 3 +- 47 files changed, 25 insertions(+), 2196 deletions(-) rename MaxOpenedProjects/{src => resources}/META-INF/plugin.xml (100%) rename facet_basics/{ => resources}/META-INF/plugin.xml (100%) rename framework/{ => resources}/META-INF/plugin.xml (100%) delete mode 100644 gradle_plugin_demo/.idea/.name delete mode 100644 gradle_plugin_demo/.idea/compiler.xml delete mode 100644 gradle_plugin_demo/.idea/encodings.xml delete mode 100644 gradle_plugin_demo/.idea/gradle.xml delete mode 100644 gradle_plugin_demo/.idea/misc.xml delete mode 100644 gradle_plugin_demo/.idea/modules.xml delete mode 100644 gradle_plugin_demo/.idea/workspace.xml rename inspection/{ => resources}/META-INF/plugin.xml (100%) rename module/{ => resources}/META-INF/plugin.xml (100%) rename plugin_sample/{ => resources}/META-INF/plugin.xml (100%) rename project_model/{ => resources}/META-INF/plugin.xml (100%) rename project_view_pane/{ => resources}/META-INF/plugin.xml (100%) rename project_wizard/{ => resources}/META-INF/plugin.xml (100%) rename register_actions/{ => resources}/META-INF/plugin.xml (100%) rename run_configuration/{ => resources}/META-INF/plugin.xml (100%) rename simple_language_plugin/{ => resources}/META-INF/plugin.xml (100%) delete mode 100644 tool_window/.idea/compiler.xml delete mode 100644 tool_window/.idea/copyright/profiles_settings.xml delete mode 100644 tool_window/.idea/encodings.xml delete mode 100644 tool_window/.idea/inspectionProfiles/Project_Default.xml delete mode 100644 tool_window/.idea/inspectionProfiles/profiles_settings.xml delete mode 100644 tool_window/.idea/misc.xml delete mode 100644 tool_window/.idea/modules.xml delete mode 100644 tool_window/.idea/uiDesigner.xml delete mode 100644 tool_window/.idea/workspace.xml delete mode 100644 tool_window/src/myToolWindow/Calendar-icon.png delete mode 100644 tool_window/src/myToolWindow/Time-icon.png delete mode 100644 tool_window/src/myToolWindow/Time-zone-icon.png delete mode 100644 tool_window/src/myToolWindow/plus.png rename tree_structure_provider/{ => resources}/META-INF/plugin.xml (100%) diff --git a/MaxOpenedProjects/MaxOpenedProjects.iml b/MaxOpenedProjects/MaxOpenedProjects.iml index 347e916d5..3700dfbf1 100644 --- a/MaxOpenedProjects/MaxOpenedProjects.iml +++ b/MaxOpenedProjects/MaxOpenedProjects.iml @@ -1,6 +1,6 @@ - + diff --git a/MaxOpenedProjects/src/META-INF/plugin.xml b/MaxOpenedProjects/resources/META-INF/plugin.xml similarity index 100% rename from MaxOpenedProjects/src/META-INF/plugin.xml rename to MaxOpenedProjects/resources/META-INF/plugin.xml diff --git a/editor_basics/editor_basics.iml b/editor_basics/editor_basics.iml index d1076ac92..3700dfbf1 100644 --- a/editor_basics/editor_basics.iml +++ b/editor_basics/editor_basics.iml @@ -4,6 +4,7 @@ + diff --git a/facet_basics/facet_basics.iml b/facet_basics/facet_basics.iml index b1d6be3ab..3700dfbf1 100644 --- a/facet_basics/facet_basics.iml +++ b/facet_basics/facet_basics.iml @@ -1,9 +1,10 @@ - + + diff --git a/facet_basics/META-INF/plugin.xml b/facet_basics/resources/META-INF/plugin.xml similarity index 100% rename from facet_basics/META-INF/plugin.xml rename to facet_basics/resources/META-INF/plugin.xml diff --git a/framework/framework.iml b/framework/framework.iml index b1d6be3ab..3700dfbf1 100644 --- a/framework/framework.iml +++ b/framework/framework.iml @@ -1,9 +1,10 @@ - + + diff --git a/framework/META-INF/plugin.xml b/framework/resources/META-INF/plugin.xml similarity index 100% rename from framework/META-INF/plugin.xml rename to framework/resources/META-INF/plugin.xml diff --git a/gradle_plugin_demo/.idea/.name b/gradle_plugin_demo/.idea/.name deleted file mode 100644 index 98fe802cd..000000000 --- a/gradle_plugin_demo/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -gradle_plugin_demo \ No newline at end of file diff --git a/gradle_plugin_demo/.idea/compiler.xml b/gradle_plugin_demo/.idea/compiler.xml deleted file mode 100644 index a85231498..000000000 --- a/gradle_plugin_demo/.idea/compiler.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - \ No newline at end of file diff --git a/gradle_plugin_demo/.idea/encodings.xml b/gradle_plugin_demo/.idea/encodings.xml deleted file mode 100644 index 97626ba45..000000000 --- a/gradle_plugin_demo/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/gradle_plugin_demo/.idea/gradle.xml b/gradle_plugin_demo/.idea/gradle.xml deleted file mode 100644 index da780f060..000000000 --- a/gradle_plugin_demo/.idea/gradle.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/gradle_plugin_demo/.idea/misc.xml b/gradle_plugin_demo/.idea/misc.xml deleted file mode 100644 index 5f8ff0664..000000000 --- a/gradle_plugin_demo/.idea/misc.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/gradle_plugin_demo/.idea/modules.xml b/gradle_plugin_demo/.idea/modules.xml deleted file mode 100644 index 58d26865e..000000000 --- a/gradle_plugin_demo/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/gradle_plugin_demo/.idea/workspace.xml b/gradle_plugin_demo/.idea/workspace.xml deleted file mode 100644 index 83cd15fd1..000000000 --- a/gradle_plugin_demo/.idea/workspace.xml +++ /dev/null @@ -1,1028 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1448451439359 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - No facets are configured - - - - - - - - sass-stdlib - - - - - - - - IntelliJ IDEA IU-143.381.42 - - - - - - - - gradle-plugin-demo - - - - - - - - Gradle: com.jetbrains:annotations:15.0.1 - - - - - - - - \ No newline at end of file diff --git a/inspection/inspection.iml b/inspection/inspection.iml index b1d6be3ab..3700dfbf1 100644 --- a/inspection/inspection.iml +++ b/inspection/inspection.iml @@ -1,9 +1,10 @@ - + + diff --git a/inspection/META-INF/plugin.xml b/inspection/resources/META-INF/plugin.xml similarity index 100% rename from inspection/META-INF/plugin.xml rename to inspection/resources/META-INF/plugin.xml diff --git a/module/module.iml b/module/module.iml index b1d6be3ab..3700dfbf1 100644 --- a/module/module.iml +++ b/module/module.iml @@ -1,9 +1,10 @@ - + + diff --git a/module/META-INF/plugin.xml b/module/resources/META-INF/plugin.xml similarity index 100% rename from module/META-INF/plugin.xml rename to module/resources/META-INF/plugin.xml diff --git a/plugin_sample/plugin_sample.iml b/plugin_sample/plugin_sample.iml index 347e916d5..3700dfbf1 100644 --- a/plugin_sample/plugin_sample.iml +++ b/plugin_sample/plugin_sample.iml @@ -1,6 +1,6 @@ - + diff --git a/plugin_sample/META-INF/plugin.xml b/plugin_sample/resources/META-INF/plugin.xml similarity index 100% rename from plugin_sample/META-INF/plugin.xml rename to plugin_sample/resources/META-INF/plugin.xml diff --git a/project_model/project_model.iml b/project_model/project_model.iml index b1d6be3ab..3700dfbf1 100644 --- a/project_model/project_model.iml +++ b/project_model/project_model.iml @@ -1,9 +1,10 @@ - + + diff --git a/project_model/META-INF/plugin.xml b/project_model/resources/META-INF/plugin.xml similarity index 100% rename from project_model/META-INF/plugin.xml rename to project_model/resources/META-INF/plugin.xml diff --git a/project_view_pane/project_view_pane.iml b/project_view_pane/project_view_pane.iml index b1d6be3ab..3700dfbf1 100644 --- a/project_view_pane/project_view_pane.iml +++ b/project_view_pane/project_view_pane.iml @@ -1,9 +1,10 @@ - + + diff --git a/project_view_pane/META-INF/plugin.xml b/project_view_pane/resources/META-INF/plugin.xml similarity index 100% rename from project_view_pane/META-INF/plugin.xml rename to project_view_pane/resources/META-INF/plugin.xml diff --git a/project_wizard/project_wizard.iml b/project_wizard/project_wizard.iml index b1d6be3ab..3700dfbf1 100644 --- a/project_wizard/project_wizard.iml +++ b/project_wizard/project_wizard.iml @@ -1,9 +1,10 @@ - + + diff --git a/project_wizard/META-INF/plugin.xml b/project_wizard/resources/META-INF/plugin.xml similarity index 100% rename from project_wizard/META-INF/plugin.xml rename to project_wizard/resources/META-INF/plugin.xml diff --git a/register_actions/register_actions.iml b/register_actions/register_actions.iml index b1d6be3ab..3700dfbf1 100644 --- a/register_actions/register_actions.iml +++ b/register_actions/register_actions.iml @@ -1,9 +1,10 @@ - + + diff --git a/register_actions/META-INF/plugin.xml b/register_actions/resources/META-INF/plugin.xml similarity index 100% rename from register_actions/META-INF/plugin.xml rename to register_actions/resources/META-INF/plugin.xml diff --git a/run_configuration/META-INF/plugin.xml b/run_configuration/resources/META-INF/plugin.xml similarity index 100% rename from run_configuration/META-INF/plugin.xml rename to run_configuration/resources/META-INF/plugin.xml diff --git a/run_configuration/run_configuration.iml b/run_configuration/run_configuration.iml index b1d6be3ab..3700dfbf1 100644 --- a/run_configuration/run_configuration.iml +++ b/run_configuration/run_configuration.iml @@ -1,9 +1,10 @@ - + + diff --git a/simple_language_plugin/META-INF/plugin.xml b/simple_language_plugin/resources/META-INF/plugin.xml similarity index 100% rename from simple_language_plugin/META-INF/plugin.xml rename to simple_language_plugin/resources/META-INF/plugin.xml diff --git a/simple_language_plugin/simple_language_plugin.iml b/simple_language_plugin/simple_language_plugin.iml index 4d7e4548e..b094a4bfc 100644 --- a/simple_language_plugin/simple_language_plugin.iml +++ b/simple_language_plugin/simple_language_plugin.iml @@ -1,11 +1,12 @@ - + + diff --git a/tool_window/.idea/compiler.xml b/tool_window/.idea/compiler.xml deleted file mode 100644 index a85231498..000000000 --- a/tool_window/.idea/compiler.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tool_window/.idea/copyright/profiles_settings.xml b/tool_window/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf337..000000000 --- a/tool_window/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/tool_window/.idea/encodings.xml b/tool_window/.idea/encodings.xml deleted file mode 100644 index 97626ba45..000000000 --- a/tool_window/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tool_window/.idea/inspectionProfiles/Project_Default.xml b/tool_window/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 04a92ab1d..000000000 --- a/tool_window/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - \ No newline at end of file diff --git a/tool_window/.idea/inspectionProfiles/profiles_settings.xml b/tool_window/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 3b312839b..000000000 --- a/tool_window/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/tool_window/.idea/misc.xml b/tool_window/.idea/misc.xml deleted file mode 100644 index 1d712c0fe..000000000 --- a/tool_window/.idea/misc.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - sass-stdlib - - - - - - - - 1.8 - - - - - - - - 1.6 - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tool_window/.idea/modules.xml b/tool_window/.idea/modules.xml deleted file mode 100644 index 3fa641aa0..000000000 --- a/tool_window/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/tool_window/.idea/uiDesigner.xml b/tool_window/.idea/uiDesigner.xml deleted file mode 100644 index e96534fb2..000000000 --- a/tool_window/.idea/uiDesigner.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tool_window/.idea/workspace.xml b/tool_window/.idea/workspace.xml deleted file mode 100644 index 2bc4f6746..000000000 --- a/tool_window/.idea/workspace.xml +++ /dev/null @@ -1,811 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1449033553755 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tool_window/src/myToolWindow/Calendar-icon.png b/tool_window/src/myToolWindow/Calendar-icon.png deleted file mode 100644 index 5e4d507a7c611384532b7920cd7e0349b123dd0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2440 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 TCkK8t00000NkvXXu0mjfXz77v diff --git a/tool_window/src/myToolWindow/Time-zone-icon.png b/tool_window/src/myToolWindow/Time-zone-icon.png deleted file mode 100644 index 63843d352b376e0fdd3495504c99601d7039d36a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4185 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 diff --git a/tool_window/src/myToolWindow/plus.png b/tool_window/src/myToolWindow/plus.png deleted file mode 100644 index f5b3c6e3a4f60849d38a3e747caf5faa5659c823..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1SIo6Pjm-TEa{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5iY`5E5WxVPFxk sGiGGsaOH~>765X%kL-;2%E%(Y;2S9<>y*PA3bcm7)78&qol`;+07f!5>i_@% diff --git a/tree_structure_provider/META-INF/plugin.xml b/tree_structure_provider/resources/META-INF/plugin.xml similarity index 100% rename from tree_structure_provider/META-INF/plugin.xml rename to tree_structure_provider/resources/META-INF/plugin.xml diff --git a/tree_structure_provider/tree_structure_provider.iml b/tree_structure_provider/tree_structure_provider.iml index b1d6be3ab..3700dfbf1 100644 --- a/tree_structure_provider/tree_structure_provider.iml +++ b/tree_structure_provider/tree_structure_provider.iml @@ -1,9 +1,10 @@ - + + From 583e3312065139f5e0759b24e849f01e2e317a52 Mon Sep 17 00:00:00 2001 From: breandan Date: Sat, 5 Dec 2015 11:47:23 -0500 Subject: [PATCH 097/104] Fix simple_language_plugin tests --- simple_language_plugin/simple_language_plugin.iml | 1 + .../tests/com/simpleplugin/SimpleCodeInsightTest.java | 2 +- .../tests/com/simpleplugin/SimpleParsingTest.java | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/simple_language_plugin/simple_language_plugin.iml b/simple_language_plugin/simple_language_plugin.iml index b094a4bfc..e3d6fef16 100644 --- a/simple_language_plugin/simple_language_plugin.iml +++ b/simple_language_plugin/simple_language_plugin.iml @@ -6,6 +6,7 @@ + diff --git a/simple_language_plugin/tests/com/simpleplugin/SimpleCodeInsightTest.java b/simple_language_plugin/tests/com/simpleplugin/SimpleCodeInsightTest.java index 29ecc65d6..f7a703264 100644 --- a/simple_language_plugin/tests/com/simpleplugin/SimpleCodeInsightTest.java +++ b/simple_language_plugin/tests/com/simpleplugin/SimpleCodeInsightTest.java @@ -24,7 +24,7 @@ public class SimpleCodeInsightTest extends LightCodeInsightFixtureTestCase { @Override protected String getTestDataPath() { - return "../../SimplePlugin/testData"; + return "code_samples/simple_language_plugin/testData"; } public void testCompletion() { diff --git a/simple_language_plugin/tests/com/simpleplugin/SimpleParsingTest.java b/simple_language_plugin/tests/com/simpleplugin/SimpleParsingTest.java index 52848cca2..83119a1a6 100644 --- a/simple_language_plugin/tests/com/simpleplugin/SimpleParsingTest.java +++ b/simple_language_plugin/tests/com/simpleplugin/SimpleParsingTest.java @@ -13,7 +13,7 @@ public class SimpleParsingTest extends ParsingTestCase { @Override protected String getTestDataPath() { - return "../../SimplePlugin/testData"; + return "code_samples/simple_language_plugin/testData"; } @Override From 87ee6b5c8dfca4fbb3475dc5157ff7a82a115521 Mon Sep 17 00:00:00 2001 From: breandan Date: Wed, 9 Dec 2015 10:12:40 -0500 Subject: [PATCH 098/104] Add Kotlin code sample --- kotlin_demo/kotlin_demo.iml | 12 +++++++ kotlin_demo/resources/META-INF/plugin.xml | 38 +++++++++++++++++++++++ kotlin_demo/src/HelloAction.kt | 11 +++++++ 3 files changed, 61 insertions(+) create mode 100644 kotlin_demo/kotlin_demo.iml create mode 100644 kotlin_demo/resources/META-INF/plugin.xml create mode 100644 kotlin_demo/src/HelloAction.kt diff --git a/kotlin_demo/kotlin_demo.iml b/kotlin_demo/kotlin_demo.iml new file mode 100644 index 000000000..3700dfbf1 --- /dev/null +++ b/kotlin_demo/kotlin_demo.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/kotlin_demo/resources/META-INF/plugin.xml b/kotlin_demo/resources/META-INF/plugin.xml new file mode 100644 index 000000000..a61f95cc8 --- /dev/null +++ b/kotlin_demo/resources/META-INF/plugin.xml @@ -0,0 +1,38 @@ + + org.jetbrains + kotlin_demo + 1.0 + YourCompany + + + most HTML tags may be used + ]]> + + + most HTML tags may be used + ]]> + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/kotlin_demo/src/HelloAction.kt b/kotlin_demo/src/HelloAction.kt new file mode 100644 index 000000000..d861598a6 --- /dev/null +++ b/kotlin_demo/src/HelloAction.kt @@ -0,0 +1,11 @@ +import com.intellij.openapi.actionSystem.AnAction +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.actionSystem.PlatformDataKeys +import com.intellij.openapi.ui.Messages + +class HelloAction : AnAction("Hello") { + override fun actionPerformed(event: AnActionEvent) { + val project = event.getData(PlatformDataKeys.PROJECT) + Messages.showMessageDialog(project, "Hello from Kotlin!", "Greeting", Messages.getInformationIcon()) + } +} \ No newline at end of file From 1793463daf78e69b3f9ccd6ef2cc892471018a14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yann=20C=C3=A9bron?= Date: Wed, 9 Dec 2015 20:27:56 +0100 Subject: [PATCH 099/104] simple_language_plugin: SimpleReferenceContributor cleanup --- .../src/com/simpleplugin/SimpleReferenceContributor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simple_language_plugin/src/com/simpleplugin/SimpleReferenceContributor.java b/simple_language_plugin/src/com/simpleplugin/SimpleReferenceContributor.java index 1e1dbb3a8..99806e74f 100644 --- a/simple_language_plugin/src/com/simpleplugin/SimpleReferenceContributor.java +++ b/simple_language_plugin/src/com/simpleplugin/SimpleReferenceContributor.java @@ -19,7 +19,7 @@ public class SimpleReferenceContributor extends PsiReferenceContributor { if (value != null && value.startsWith("simple"+":")) { return new PsiReference[]{new SimpleReference(element, new TextRange(8, value.length() + 1))}; } - return new PsiReference[0]; + return PsiReference.EMPTY_ARRAY; } }); } From d30c85e66c44a17a5494bddeb8cd0def8a26aa35 Mon Sep 17 00:00:00 2001 From: breandan Date: Fri, 11 Dec 2015 15:05:46 -0500 Subject: [PATCH 100/104] Migrate Intentions and Inspections tutorials from Confluence and minor fixes - https://confluence.jetbrains.com/display/IDEADEV/Creation+of+Intention+Action -https://confluence.jetbrains.com/display/IDEADEV/Inspection+of+Code+Source --- .../comparing_references_inspection.iml | 13 ++ .../source/META-INF/plugin.xml | 14 ++ .../ComparingReferencesInspection.java | 152 ++++++++++++++++++ .../ComparingReferencesProvider.java | 10 ++ .../ComparingReferences.html | 7 + .../testData/before.after.java | 6 + .../testData/before.java | 6 + .../testData/before1.after.java | 6 + .../testData/before1.java | 6 + .../testSource/testPlugin/TestThisPlugin.java | 67 ++++++++ .../META-INF/plugin.xml | 27 ++++ .../conditional_operator_intention.iml | 13 ++ .../source/META-INF/plugin.xml | 35 ++++ .../ConditionalOperatorConvertor.java | 110 +++++++++++++ .../after.java.template | 11 ++ .../before.java.template | 6 + .../description.html | 5 + .../testData/before.template.after.java | 11 ++ .../testData/before.template.java | 6 + .../testSource/testPlugin/YourTest.java | 62 +++++++ .../max_opened_projects.iml | 0 .../resources/META-INF/plugin.xml | 0 .../src/MyPackage/MaxProject.java | 0 .../src/MyPackage/MyCounter.java | 0 24 files changed, 573 insertions(+) create mode 100644 comparing_references_inspection/comparing_references_inspection.iml create mode 100644 comparing_references_inspection/source/META-INF/plugin.xml create mode 100644 comparing_references_inspection/source/com/intellij/codeInspection/ComparingReferencesInspection.java create mode 100644 comparing_references_inspection/source/com/intellij/codeInspection/ComparingReferencesProvider.java create mode 100644 comparing_references_inspection/source/inspectionDescriptions/ComparingReferences.html create mode 100644 comparing_references_inspection/testData/before.after.java create mode 100644 comparing_references_inspection/testData/before.java create mode 100644 comparing_references_inspection/testData/before1.after.java create mode 100644 comparing_references_inspection/testData/before1.java create mode 100644 comparing_references_inspection/testSource/testPlugin/TestThisPlugin.java create mode 100644 conditional_operator_intention/META-INF/plugin.xml create mode 100644 conditional_operator_intention/conditional_operator_intention.iml create mode 100644 conditional_operator_intention/source/META-INF/plugin.xml create mode 100644 conditional_operator_intention/source/com/intellij/codeInsight/intention/ConditionalOperatorConvertor.java create mode 100644 conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/after.java.template create mode 100644 conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/before.java.template create mode 100644 conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/description.html create mode 100644 conditional_operator_intention/testData/before.template.after.java create mode 100644 conditional_operator_intention/testData/before.template.java create mode 100644 conditional_operator_intention/testSource/testPlugin/YourTest.java rename MaxOpenedProjects/MaxOpenedProjects.iml => max_opened_projects/max_opened_projects.iml (100%) rename {MaxOpenedProjects => max_opened_projects}/resources/META-INF/plugin.xml (100%) rename {MaxOpenedProjects => max_opened_projects}/src/MyPackage/MaxProject.java (100%) rename {MaxOpenedProjects => max_opened_projects}/src/MyPackage/MyCounter.java (100%) diff --git a/comparing_references_inspection/comparing_references_inspection.iml b/comparing_references_inspection/comparing_references_inspection.iml new file mode 100644 index 000000000..3b8cfcf82 --- /dev/null +++ b/comparing_references_inspection/comparing_references_inspection.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/comparing_references_inspection/source/META-INF/plugin.xml b/comparing_references_inspection/source/META-INF/plugin.xml new file mode 100644 index 000000000..36bf3d61f --- /dev/null +++ b/comparing_references_inspection/source/META-INF/plugin.xml @@ -0,0 +1,14 @@ + + Comparing References Inspection + Inspection for (probably) inappropriate use of equality relation operation. + 1.0 + JetBrains + + + + + + + diff --git a/comparing_references_inspection/source/com/intellij/codeInspection/ComparingReferencesInspection.java b/comparing_references_inspection/source/com/intellij/codeInspection/ComparingReferencesInspection.java new file mode 100644 index 000000000..941fc702c --- /dev/null +++ b/comparing_references_inspection/source/com/intellij/codeInspection/ComparingReferencesInspection.java @@ -0,0 +1,152 @@ +package com.intellij.codeInspection; + +import com.intellij.codeInsight.daemon.GroupNames; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Ref; +import com.intellij.psi.*; +import com.intellij.psi.tree.IElementType; +import com.intellij.ui.DocumentAdapter; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import java.awt.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.StringTokenizer; + +/** + * @author max + */ +public class ComparingReferencesInspection extends BaseJavaLocalInspectionTool { + private static final Logger LOG = Logger.getInstance("#com.intellij.codeInspection.ComparingReferencesInspection"); + + private final LocalQuickFix myQuickFix = new MyQuickFix(); + + @SuppressWarnings({"WeakerAccess"}) @NonNls public String CHECKED_CLASSES = "java.lang.String;java.util.Date"; + @NonNls private static final String DESCRIPTION_TEMPLATE = InspectionsBundle.message("inspection.comparing.references.problem.descriptor"); + + @NotNull + public String getDisplayName() { + + return "'==' or '!=' instead of 'equals()'"; + } + + @NotNull + public String getGroupDisplayName() { + return GroupNames.BUGS_GROUP_NAME; + } + + @NotNull + public String getShortName() { + return "ComparingReferences"; + } + + private boolean isCheckedType(PsiType type) { + if (!(type instanceof PsiClassType)) return false; + + StringTokenizer tokenizer = new StringTokenizer(CHECKED_CLASSES, ";"); + while (tokenizer.hasMoreTokens()) { + String className = tokenizer.nextToken(); + if (type.equalsToText(className)) return true; + } + + return false; + } + + @NotNull + @Override + public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, boolean isOnTheFly) { + return new JavaElementVisitor() { + + @Override + public void visitReferenceExpression(PsiReferenceExpression psiReferenceExpression) { + } + + + @Override public void visitBinaryExpression(PsiBinaryExpression expression) { + super.visitBinaryExpression(expression); + IElementType opSign = expression.getOperationTokenType(); + if (opSign == JavaTokenType.EQEQ || opSign == JavaTokenType.NE) { + PsiExpression lOperand = expression.getLOperand(); + PsiExpression rOperand = expression.getROperand(); + if (rOperand == null || isNullLiteral(lOperand) || isNullLiteral(rOperand)) return; + + PsiType lType = lOperand.getType(); + PsiType rType = rOperand.getType(); + + if (isCheckedType(lType) || isCheckedType(rType)) { + holder.registerProblem(expression, + DESCRIPTION_TEMPLATE, myQuickFix); + } + } + } + }; + } + + private static boolean isNullLiteral(PsiExpression expr) { + return expr instanceof PsiLiteralExpression && "null".equals(expr.getText()); + } + + private static class MyQuickFix implements LocalQuickFix { + @NotNull + public String getName() { + // The test (see the TestThisPlugin class) uses this string to identify the quick fix action. + return InspectionsBundle.message("inspection.comparing.references.use.quickfix"); + } + + + public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { + try { + PsiBinaryExpression binaryExpression = (PsiBinaryExpression)descriptor.getPsiElement(); + IElementType opSign = binaryExpression.getOperationTokenType(); + PsiExpression lExpr = binaryExpression.getLOperand(); + PsiExpression rExpr = binaryExpression.getROperand(); + if (rExpr == null) + return; + + PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory(); + PsiMethodCallExpression equalsCall = (PsiMethodCallExpression)factory.createExpressionFromText("a.equals(b)", null); + + equalsCall.getMethodExpression().getQualifierExpression().replace(lExpr); + equalsCall.getArgumentList().getExpressions()[0].replace(rExpr); + + PsiExpression result = (PsiExpression)binaryExpression.replace(equalsCall); + + if (opSign == JavaTokenType.NE) { + PsiPrefixExpression negation = (PsiPrefixExpression)factory.createExpressionFromText("!a", null); + negation.getOperand().replace(result); + result.replace(negation); + } + } + catch (IncorrectOperationException e) { + LOG.error(e); + } + } + + @NotNull + public String getFamilyName() { + return getName(); + } + } + + public JComponent createOptionsPanel() { + JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + final JTextField checkedClasses = new JTextField(CHECKED_CLASSES); + checkedClasses.getDocument().addDocumentListener(new DocumentAdapter() { + public void textChanged(DocumentEvent event) { + CHECKED_CLASSES = checkedClasses.getText(); + } + }); + + panel.add(checkedClasses); + return panel; + } + + public boolean isEnabledByDefault() { + return true; + } +} diff --git a/comparing_references_inspection/source/com/intellij/codeInspection/ComparingReferencesProvider.java b/comparing_references_inspection/source/com/intellij/codeInspection/ComparingReferencesProvider.java new file mode 100644 index 000000000..37f091454 --- /dev/null +++ b/comparing_references_inspection/source/com/intellij/codeInspection/ComparingReferencesProvider.java @@ -0,0 +1,10 @@ +package com.intellij.codeInspection; + +/** + * @author max + */ +public class ComparingReferencesProvider implements InspectionToolProvider { + public Class[] getInspectionClasses() { + return new Class[] { ComparingReferencesInspection.class}; + } +} diff --git a/comparing_references_inspection/source/inspectionDescriptions/ComparingReferences.html b/comparing_references_inspection/source/inspectionDescriptions/ComparingReferences.html new file mode 100644 index 000000000..ca5f9d5ee --- /dev/null +++ b/comparing_references_inspection/source/inspectionDescriptions/ComparingReferences.html @@ -0,0 +1,7 @@ + + +This inspection reports when the '==' or '!=' operator was used between expressions of +reference types.
+In the text field below, specify the semicolon separated list of classes to be considered as suspicious. + + diff --git a/comparing_references_inspection/testData/before.after.java b/comparing_references_inspection/testData/before.after.java new file mode 100644 index 000000000..a3058effc --- /dev/null +++ b/comparing_references_inspection/testData/before.after.java @@ -0,0 +1,6 @@ +public class X { + public boolean compare2Strings(java.lang.String s1, java.lang.String s2) { + return (s1.equals(s2)); + } + +} \ No newline at end of file diff --git a/comparing_references_inspection/testData/before.java b/comparing_references_inspection/testData/before.java new file mode 100644 index 000000000..23095bcfa --- /dev/null +++ b/comparing_references_inspection/testData/before.java @@ -0,0 +1,6 @@ +public class X { + public boolean compare2Strings(java.lang.String s1, java.lang.String s2) { + return (s1 == s2); + } + +} \ No newline at end of file diff --git a/comparing_references_inspection/testData/before1.after.java b/comparing_references_inspection/testData/before1.after.java new file mode 100644 index 000000000..acedf90e0 --- /dev/null +++ b/comparing_references_inspection/testData/before1.after.java @@ -0,0 +1,6 @@ +public class X { +public boolean compare2Dates(java.util.Date dt1, java.util.Date dt2){ + return (!dt1.equals(dt2)); + } + +} \ No newline at end of file diff --git a/comparing_references_inspection/testData/before1.java b/comparing_references_inspection/testData/before1.java new file mode 100644 index 000000000..325c4ebf5 --- /dev/null +++ b/comparing_references_inspection/testData/before1.java @@ -0,0 +1,6 @@ +public class X { +public boolean compare2Dates(java.util.Date dt1, java.util.Date dt2){ + return (dt1 != dt2); + } + +} \ No newline at end of file diff --git a/comparing_references_inspection/testSource/testPlugin/TestThisPlugin.java b/comparing_references_inspection/testSource/testPlugin/TestThisPlugin.java new file mode 100644 index 000000000..bf3769c2a --- /dev/null +++ b/comparing_references_inspection/testSource/testPlugin/TestThisPlugin.java @@ -0,0 +1,67 @@ +package testPlugin; + + +import com.intellij.codeInsight.daemon.impl.HighlightInfo; +import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.codeInspection.ComparingReferencesInspection; +import com.intellij.testFramework.UsefulTestCase; +import com.intellij.testFramework.builders.JavaModuleFixtureBuilder; +import com.intellij.testFramework.fixtures.*; +import junit.framework.Assert; + +import java.util.List; + +/** + * @see JavaCodeInsightFixtureTestCase + * @see LightCodeInsightFixtureTestCase + */ +public class TestThisPlugin extends UsefulTestCase { + + protected CodeInsightTestFixture myFixture; + // Specify path to your test data directory + // e.g. final String dataPath = "c:\\users\\john.doe\\idea\\community\\samples\\ComparingReferences/testData"; + final String dataPath = "c:\\users\\John.Doe\\idea\\community\\samples\\comparingReferences/testData"; + + + public void setUp() throws Exception { + + final IdeaTestFixtureFactory fixtureFactory = IdeaTestFixtureFactory.getFixtureFactory(); + final TestFixtureBuilder testFixtureBuilder = fixtureFactory.createFixtureBuilder(getName()); + myFixture = JavaTestFixtureFactory.getFixtureFactory().createCodeInsightFixture(testFixtureBuilder.getFixture()); + myFixture.setTestDataPath(dataPath); + final JavaModuleFixtureBuilder builder = testFixtureBuilder.addModule(JavaModuleFixtureBuilder.class); + + builder.addContentRoot(myFixture.getTempDirPath()).addSourceRoot(""); + builder.setMockJdkLevel(JavaModuleFixtureBuilder.MockJdkLevel.jdk15); + myFixture.setUp(); + } + + public void tearDown() throws Exception { + myFixture.tearDown(); + myFixture = null; + } + + protected void doTest(String testName, String hint) throws Throwable { + myFixture.configureByFile(testName + ".java"); + myFixture.enableInspections(ComparingReferencesInspection.class); + List highlightInfos = myFixture.doHighlighting(); + Assert.assertTrue(!highlightInfos.isEmpty()); + + final IntentionAction action = myFixture.findSingleIntention(hint); + + Assert.assertNotNull(action); + myFixture.launchAction(action); + myFixture.checkResultByFile(testName + ".after.java"); + } + + // Test the "==" case + public void test() throws Throwable { + doTest("before", "Use equals()"); + } + + // Test the "!=" case + public void test1() throws Throwable { + doTest("before1", "Use equals()"); + } + +} diff --git a/conditional_operator_intention/META-INF/plugin.xml b/conditional_operator_intention/META-INF/plugin.xml new file mode 100644 index 000000000..17c55b92a --- /dev/null +++ b/conditional_operator_intention/META-INF/plugin.xml @@ -0,0 +1,27 @@ + + Conditional Operator Converter + ConditionalOperatorConverter + Intention action that suggests to convert a conditional operator into + 'if' block. + + 1.3 + JetBrains + + + + + com.intellij.codeInsight.intention.ConditionalOperatorConvertor + Conditional Operator + ConditionalOperatorConvertor + + + + + + + com.intellij.codeInsight.intention.ConditionalOperatorConvertor + + + diff --git a/conditional_operator_intention/conditional_operator_intention.iml b/conditional_operator_intention/conditional_operator_intention.iml new file mode 100644 index 000000000..3b8cfcf82 --- /dev/null +++ b/conditional_operator_intention/conditional_operator_intention.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/conditional_operator_intention/source/META-INF/plugin.xml b/conditional_operator_intention/source/META-INF/plugin.xml new file mode 100644 index 000000000..68ae2627b --- /dev/null +++ b/conditional_operator_intention/source/META-INF/plugin.xml @@ -0,0 +1,35 @@ + + com.your.company.unique.plugin.id + Plugin display name here + 1.0 + YourCompany + + + most HTML tags may be used + ]]> + + + most HTML tags may be used + ]]> + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/conditional_operator_intention/source/com/intellij/codeInsight/intention/ConditionalOperatorConvertor.java b/conditional_operator_intention/source/com/intellij/codeInsight/intention/ConditionalOperatorConvertor.java new file mode 100644 index 000000000..ffee0ad54 --- /dev/null +++ b/conditional_operator_intention/source/com/intellij/codeInsight/intention/ConditionalOperatorConvertor.java @@ -0,0 +1,110 @@ +package com.intellij.codeInsight.intention; + +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.*; +import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author dsl + */ +@NonNls public class ConditionalOperatorConvertor extends PsiElementBaseIntentionAction implements IntentionAction { + + @NotNull + public String getText() { + return "Convert ternary operator to if statement"; + } + + @NotNull + public String getFamilyName() { + return getText(); + } + + public boolean isAvailable(@NotNull Project project, Editor editor, @Nullable PsiElement element) { + if (element == null) return false; + if (!element.isWritable()) return false; + + if (element instanceof PsiJavaToken) { + final PsiJavaToken token = (PsiJavaToken)element; + if (token.getTokenType() != JavaTokenType.QUEST) return false; + if (token.getParent() instanceof PsiConditionalExpression) { + final PsiConditionalExpression conditionalExpression = (PsiConditionalExpression)token.getParent(); + if (conditionalExpression.getThenExpression() == null + || conditionalExpression.getElseExpression() == null) { + return false; + } + return true; + } + return false; + } + return false; + } + + public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + final int offset = editor.getCaretModel().getOffset(); + final PsiElement element = file.findElementAt(offset); + PsiConditionalExpression conditionalExpression = PsiTreeUtil.getParentOfType(element, + PsiConditionalExpression.class, false); + if (conditionalExpression == null) return; + if (conditionalExpression.getThenExpression() == null || conditionalExpression.getElseExpression() == null) return; + + final PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory(); + + PsiElement originalStatement = PsiTreeUtil.getParentOfType(conditionalExpression, PsiStatement.class, false); + while (originalStatement instanceof PsiForStatement) { + originalStatement = PsiTreeUtil.getParentOfType(originalStatement, PsiStatement.class, true); + } + if (originalStatement == null) return; + + // Maintain declrations + if (originalStatement instanceof PsiDeclarationStatement) { + final PsiDeclarationStatement declaration = (PsiDeclarationStatement)originalStatement; + final PsiElement[] declaredElements = declaration.getDeclaredElements(); + PsiLocalVariable variable = null; + for (PsiElement declaredElement : declaredElements) { + if (declaredElement instanceof PsiLocalVariable && PsiTreeUtil.isAncestor(declaredElement, conditionalExpression, true)) { + variable = (PsiLocalVariable)declaredElement; + break; + } + } + if (variable == null) return; + variable.normalizeDeclaration(); + final Object marker = new Object(); + PsiTreeUtil.mark(conditionalExpression, marker); + PsiExpressionStatement statement = + (PsiExpressionStatement)factory.createStatementFromText(variable.getName() + " = 0;", null); + statement = (PsiExpressionStatement)CodeStyleManager.getInstance(project).reformat(statement); + ((PsiAssignmentExpression)statement.getExpression()).getRExpression().replace(variable.getInitializer()); + variable.getInitializer().delete(); + final PsiElement variableParent = variable.getParent(); + originalStatement = variableParent.getParent().addAfter(statement, variableParent); + conditionalExpression = (PsiConditionalExpression)PsiTreeUtil.releaseMark(originalStatement, marker); + } + + // create then and else branches + final PsiElement[] originalElements = new PsiElement[]{originalStatement, conditionalExpression}; + final PsiExpression condition = (PsiExpression)conditionalExpression.getCondition().copy(); + final PsiElement[] thenElements = PsiTreeUtil.copyElements(originalElements); + final PsiElement[] elseElements = PsiTreeUtil.copyElements(originalElements); + thenElements[1].replace(conditionalExpression.getThenExpression()); + elseElements[1].replace(conditionalExpression.getElseExpression()); + + PsiIfStatement statement = (PsiIfStatement)factory.createStatementFromText("if (true) { a = b } else { c = d }", + null); + statement = (PsiIfStatement)CodeStyleManager.getInstance(project).reformat(statement); + statement.getCondition().replace(condition); + statement = (PsiIfStatement)originalStatement.replace(statement); + + ((PsiBlockStatement)statement.getThenBranch()).getCodeBlock().getStatements()[0].replace(thenElements[0]); + ((PsiBlockStatement)statement.getElseBranch()).getCodeBlock().getStatements()[0].replace(elseElements[0]); + } + + public boolean startInWriteAction() { + return true; + } +} diff --git a/conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/after.java.template b/conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/after.java.template new file mode 100644 index 000000000..9cf0cf2d2 --- /dev/null +++ b/conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/after.java.template @@ -0,0 +1,11 @@ +public class X { + void f(boolean isMale) { + String title; + if (isMale) { + title = "Mr."; + } else { + title = "Ms."; + } + System.out.println("title = " + title); + } +} diff --git a/conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/before.java.template b/conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/before.java.template new file mode 100644 index 000000000..ef611ed1c --- /dev/null +++ b/conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/before.java.template @@ -0,0 +1,6 @@ +public class X { + void f(boolean isMale) { + String title = isMale ? "Mr." : "Ms."; + System.out.println("title = " + title); + } +} \ No newline at end of file diff --git a/conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/description.html b/conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/description.html new file mode 100644 index 000000000..3d6efdd8d --- /dev/null +++ b/conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/description.html @@ -0,0 +1,5 @@ + + + This intention converts a ternary operator to a corresponding if statement.
+ + \ No newline at end of file diff --git a/conditional_operator_intention/testData/before.template.after.java b/conditional_operator_intention/testData/before.template.after.java new file mode 100644 index 000000000..6682628f7 --- /dev/null +++ b/conditional_operator_intention/testData/before.template.after.java @@ -0,0 +1,11 @@ +public class X { + void f(boolean isMale) { + String title; + if (isMale) { + title = "Mr."; + } else { + title = "Ms."; + } + System.out.println("title = " + title); + } +} \ No newline at end of file diff --git a/conditional_operator_intention/testData/before.template.java b/conditional_operator_intention/testData/before.template.java new file mode 100644 index 000000000..74107ea2d --- /dev/null +++ b/conditional_operator_intention/testData/before.template.java @@ -0,0 +1,6 @@ +public class X { + void f(boolean isMale) { + String title = isMale ? "Mr." : "Ms."; + System.out.println("title = " + title); + } +} \ No newline at end of file diff --git a/conditional_operator_intention/testSource/testPlugin/YourTest.java b/conditional_operator_intention/testSource/testPlugin/YourTest.java new file mode 100644 index 000000000..1b2114b71 --- /dev/null +++ b/conditional_operator_intention/testSource/testPlugin/YourTest.java @@ -0,0 +1,62 @@ +package testPlugin; + +import com.intellij.codeInsight.intention.IntentionAction; + +import com.intellij.testFramework.builders.JavaModuleFixtureBuilder; +import com.intellij.testFramework.fixtures.*; +import junit.framework.Assert; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by IntelliJ IDEA. + * User: Alexey.Chursin + * Date: Sep 13, 2010 + * Time: 9:35:50 PM + * To change this template use File | Settings | File Templates. + */ + +public class YourTest { + protected CodeInsightTestFixture myFixture; + // Specify path to your test data + // e.g. final String dataPath = "c:\\users\\john.doe\\idea\\community\\samples\\conditionalOperatorConvertor/testData"; + final String dataPath = "c:\\users\\John.Doe\\idea\\community\\samples\\conditionalOperatorConvertor/testData"; + + @Before + + public void setUp() throws Exception { + + final IdeaTestFixtureFactory fixtureFactory = IdeaTestFixtureFactory.getFixtureFactory(); + final TestFixtureBuilder testFixtureBuilder = fixtureFactory.createFixtureBuilder(); + myFixture = JavaTestFixtureFactory.getFixtureFactory().createCodeInsightFixture(testFixtureBuilder.getFixture()); + myFixture.setTestDataPath(dataPath); + final JavaModuleFixtureBuilder builder = testFixtureBuilder.addModule(JavaModuleFixtureBuilder.class); + + builder.addContentRoot(myFixture.getTempDirPath()).addSourceRoot(""); + builder.setMockJdkLevel(JavaModuleFixtureBuilder.MockJdkLevel.jdk15); + myFixture.setUp(); + + } + + @After + public void tearDown() throws Exception { + myFixture.tearDown(); + myFixture = null; + } + + protected void doTest(String testName, String hint) throws Throwable { + // Messages.showInfoMessage("Test started", "Info"); + myFixture.configureByFile(testName + ".java"); + final IntentionAction action = myFixture.findSingleIntention(hint); + Assert.assertNotNull(action); + myFixture.launchAction(action); + myFixture.checkResultByFile(testName + ".after.java"); + } + + @Test + public void test() throws Throwable { + doTest("before.template", "Convert ternary operator to if statement"); + } + +} diff --git a/MaxOpenedProjects/MaxOpenedProjects.iml b/max_opened_projects/max_opened_projects.iml similarity index 100% rename from MaxOpenedProjects/MaxOpenedProjects.iml rename to max_opened_projects/max_opened_projects.iml diff --git a/MaxOpenedProjects/resources/META-INF/plugin.xml b/max_opened_projects/resources/META-INF/plugin.xml similarity index 100% rename from MaxOpenedProjects/resources/META-INF/plugin.xml rename to max_opened_projects/resources/META-INF/plugin.xml diff --git a/MaxOpenedProjects/src/MyPackage/MaxProject.java b/max_opened_projects/src/MyPackage/MaxProject.java similarity index 100% rename from MaxOpenedProjects/src/MyPackage/MaxProject.java rename to max_opened_projects/src/MyPackage/MaxProject.java diff --git a/MaxOpenedProjects/src/MyPackage/MyCounter.java b/max_opened_projects/src/MyPackage/MyCounter.java similarity index 100% rename from MaxOpenedProjects/src/MyPackage/MyCounter.java rename to max_opened_projects/src/MyPackage/MyCounter.java From 93bea288e357666cd7ece886d510290b62a24958 Mon Sep 17 00:00:00 2001 From: breandan Date: Fri, 18 Dec 2015 07:01:01 -0500 Subject: [PATCH 101/104] Small fixes --- kotlin_demo/kotlin_demo.iml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/kotlin_demo/kotlin_demo.iml b/kotlin_demo/kotlin_demo.iml index 3700dfbf1..19f024b75 100644 --- a/kotlin_demo/kotlin_demo.iml +++ b/kotlin_demo/kotlin_demo.iml @@ -1,12 +1,14 @@ - + + + \ No newline at end of file From d2f6fdd4a72030752a97d4af72037fb2f94fdb58 Mon Sep 17 00:00:00 2001 From: breandan Date: Sat, 19 Dec 2015 03:35:55 -0500 Subject: [PATCH 102/104] Leverage caching to speed up Docker builds Implement technique described here: http://ilikestuffblog.com/2014/01/06/how-to-skip-bundle-install-when-deploying-a-rails-app-to-docker/ --- kotlin_demo/src/HelloAction.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/kotlin_demo/src/HelloAction.kt b/kotlin_demo/src/HelloAction.kt index d861598a6..7ddc6d7bb 100644 --- a/kotlin_demo/src/HelloAction.kt +++ b/kotlin_demo/src/HelloAction.kt @@ -3,6 +3,7 @@ import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.PlatformDataKeys import com.intellij.openapi.ui.Messages +//[Markdown reference](/tutorials/kotlin.md) class HelloAction : AnAction("Hello") { override fun actionPerformed(event: AnActionEvent) { val project = event.getData(PlatformDataKeys.PROJECT) From c1bd6fa8e65833de1ed0898ac98a8d69b7fc5cdc Mon Sep 17 00:00:00 2001 From: breandan Date: Tue, 12 Jan 2016 00:32:32 -0800 Subject: [PATCH 103/104] New Live Template tutorial --- live_templates/live_templates.iml | 13 +++++++ live_templates/resources/META-INF/plugin.xml | 35 +++++++++++++++++++ .../resources/liveTemplates/Markdown.xml | 9 +++++ live_templates/src/MarkdownContext.java | 7 ++++ .../src/MarkdownTemplateProvider.java | 7 ++++ 5 files changed, 71 insertions(+) create mode 100644 live_templates/live_templates.iml create mode 100644 live_templates/resources/META-INF/plugin.xml create mode 100644 live_templates/resources/liveTemplates/Markdown.xml create mode 100644 live_templates/src/MarkdownContext.java create mode 100644 live_templates/src/MarkdownTemplateProvider.java diff --git a/live_templates/live_templates.iml b/live_templates/live_templates.iml new file mode 100644 index 000000000..e025b203c --- /dev/null +++ b/live_templates/live_templates.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/live_templates/resources/META-INF/plugin.xml b/live_templates/resources/META-INF/plugin.xml new file mode 100644 index 000000000..68ae2627b --- /dev/null +++ b/live_templates/resources/META-INF/plugin.xml @@ -0,0 +1,35 @@ + + com.your.company.unique.plugin.id + Plugin display name here + 1.0 + YourCompany + + + most HTML tags may be used + ]]> + + + most HTML tags may be used + ]]> + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/live_templates/resources/liveTemplates/Markdown.xml b/live_templates/resources/liveTemplates/Markdown.xml new file mode 100644 index 000000000..c7788d82b --- /dev/null +++ b/live_templates/resources/liveTemplates/Markdown.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/live_templates/src/MarkdownContext.java b/live_templates/src/MarkdownContext.java new file mode 100644 index 000000000..4daf4df1a --- /dev/null +++ b/live_templates/src/MarkdownContext.java @@ -0,0 +1,7 @@ +import com.intellij.codeInsight.template.TemplateContextType; + +/** + * Created by breandan on 1/11/2016. + */ +public class MarkdownContext extends TemplateContextType { +} diff --git a/live_templates/src/MarkdownTemplateProvider.java b/live_templates/src/MarkdownTemplateProvider.java new file mode 100644 index 000000000..8926db4b1 --- /dev/null +++ b/live_templates/src/MarkdownTemplateProvider.java @@ -0,0 +1,7 @@ +import com.intellij.codeInsight.template.impl.DefaultLiveTemplatesProvider; + +/** + * Created by breandan on 1/11/2016. + */ +public class MarkdownTemplateProvider implements DefaultLiveTemplatesProvider { +} From 9c6f9f06bb78b87f8e56f3e3414dc1c1f0e7673f Mon Sep 17 00:00:00 2001 From: breandan Date: Tue, 12 Jan 2016 00:39:50 -0800 Subject: [PATCH 104/104] Live template tutorial pt. 2 --- live_templates/resources/META-INF/plugin.xml | 8 +++++--- live_templates/src/MarkdownContext.java | 16 +++++++++++++--- live_templates/src/MarkdownTemplateProvider.java | 15 ++++++++++++--- .../resources/META-INF/plugin.xml | 2 +- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/live_templates/resources/META-INF/plugin.xml b/live_templates/resources/META-INF/plugin.xml index 68ae2627b..1e2935c91 100644 --- a/live_templates/resources/META-INF/plugin.xml +++ b/live_templates/resources/META-INF/plugin.xml @@ -1,6 +1,6 @@ - com.your.company.unique.plugin.id - Plugin display name here + live_templates + live_templates 1.0 YourCompany @@ -25,7 +25,9 @@ --> - + + + diff --git a/live_templates/src/MarkdownContext.java b/live_templates/src/MarkdownContext.java index 4daf4df1a..1c1c05a6d 100644 --- a/live_templates/src/MarkdownContext.java +++ b/live_templates/src/MarkdownContext.java @@ -1,7 +1,17 @@ +import com.intellij.codeInsight.template.EverywhereContextType; import com.intellij.codeInsight.template.TemplateContextType; +import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -/** - * Created by breandan on 1/11/2016. - */ public class MarkdownContext extends TemplateContextType { + protected MarkdownContext() { + super("MARKDOWN", "Markdown"); + } + + @Override + public boolean isInContext(@NotNull PsiFile file, int offset) { + return file.getName().endsWith(".md"); + } } diff --git a/live_templates/src/MarkdownTemplateProvider.java b/live_templates/src/MarkdownTemplateProvider.java index 8926db4b1..c113accb3 100644 --- a/live_templates/src/MarkdownTemplateProvider.java +++ b/live_templates/src/MarkdownTemplateProvider.java @@ -1,7 +1,16 @@ import com.intellij.codeInsight.template.impl.DefaultLiveTemplatesProvider; +import org.jetbrains.annotations.Nullable; -/** - * Created by breandan on 1/11/2016. - */ public class MarkdownTemplateProvider implements DefaultLiveTemplatesProvider { + @Override + public String[] getDefaultLiveTemplateFiles() + { + return new String[] {"liveTemplates/Markdown"}; + } + + @Nullable + @Override + public String[] getHiddenLiveTemplateFiles() { + return new String[0]; + } } diff --git a/max_opened_projects/resources/META-INF/plugin.xml b/max_opened_projects/resources/META-INF/plugin.xml index 3e3ce844c..d844bd01e 100644 --- a/max_opened_projects/resources/META-INF/plugin.xml +++ b/max_opened_projects/resources/META-INF/plugin.xml @@ -1,5 +1,5 @@ - Plugin name here + max_opened_projects short description of the plugin 1.0 YourCompany