diff --git a/plugins/gradle/resources/i18n/GradleBundle.properties b/plugins/gradle/resources/i18n/GradleBundle.properties
index be891458642a..0491c6ce225e 100644
--- a/plugins/gradle/resources/i18n/GradleBundle.properties
+++ b/plugins/gradle/resources/i18n/GradleBundle.properties
@@ -70,6 +70,8 @@ gradle.action.link.project.text=Link gradle project
gradle.action.link.project.description=Allows to link any gradle project to the current IDE project
gradle.action.refresh.project.text=Refresh gradle project
gradle.action.refresh.project.description=Allows to force linked gradle project refresh
+gradle.action.open.script.text=Open linked gradle project
+gradle.action.open.script.description=Allows to open project file of the linked gradle project at the editor
gradle.settings.color.text.sample.conflict.node.name=node-with-conflicting-setup
gradle.settings.color.text.sample.node.sync.name=node-with-same-setup
diff --git a/plugins/gradle/src/META-INF/plugin.xml b/plugins/gradle/src/META-INF/plugin.xml
index 36d93560b32e..aa9dc8db2165 100644
--- a/plugins/gradle/src/META-INF/plugin.xml
+++ b/plugins/gradle/src/META-INF/plugin.xml
@@ -67,9 +67,10 @@
+
-
+
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/action/AbstractGradleLinkedProjectAction.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/AbstractGradleLinkedProjectAction.java
new file mode 100644
index 000000000000..bbd49d974a04
--- /dev/null
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/AbstractGradleLinkedProjectAction.java
@@ -0,0 +1,64 @@
+package org.jetbrains.plugins.gradle.action;
+
+import com.intellij.openapi.actionSystem.*;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.text.StringUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.plugins.gradle.config.GradleSettings;
+
+import java.io.File;
+
+/**
+ * Common super class for gradle actions that require {@link GradleSettings#LINKED_PROJECT_FILE_PATH linked project}.
+ *
+ * Not thread-safe.
+ *
+ * @author Denis Zhdanov
+ * @since 1/31/12 5:36 PM
+ */
+public abstract class AbstractGradleLinkedProjectAction extends AnAction {
+
+ @Override
+ public void update(AnActionEvent e) {
+ final String path = getLinkedProjectPath(e.getDataContext());
+ final boolean visible = path != null;
+ e.getPresentation().setVisible(visible);
+ if (!visible) {
+ return;
+ }
+ doUpdate(e.getPresentation(), path);
+ }
+
+ @Override
+ public void actionPerformed(AnActionEvent e) {
+ final Project project = PlatformDataKeys.PROJECT.getData(e.getDataContext());
+ if (project == null) {
+ return;
+ }
+ final String path = getLinkedProjectPath(e.getDataContext());
+ if (path == null) {
+ e.getPresentation().setVisible(false);
+ return;
+ }
+ doActionPerformed(project, path);
+ }
+
+ @Nullable
+ protected static String getLinkedProjectPath(@Nullable DataContext context) {
+ if (context == null) {
+ return null;
+ }
+
+ final Project project = PlatformDataKeys.PROJECT.getData(context);
+ if (project == null) {
+ return null;
+ }
+
+ final String path = GradleSettings.getInstance(project).LINKED_PROJECT_FILE_PATH;
+ return (StringUtil.isEmpty(path) || !new File(path).isFile()) ? null : path;
+ }
+
+ protected abstract void doUpdate(@NotNull Presentation presentation, @NotNull String linkedProjectPath);
+ protected abstract void doActionPerformed(@NotNull Project project, @NotNull String linkedProjectPath);
+}
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleLinkToProjectAction.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleLinkToProjectAction.java
index d47e4b8efdd4..113156d0ecba 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleLinkToProjectAction.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleLinkToProjectAction.java
@@ -11,8 +11,6 @@ import org.jetbrains.plugins.gradle.config.GradleSettings;
import org.jetbrains.plugins.gradle.util.GradleBundle;
import org.jetbrains.plugins.gradle.util.GradleUtil;
-import java.io.File;
-
/**
* Allows to link gradle project to the current IntelliJ IDEA project.
*
@@ -28,17 +26,6 @@ public class GradleLinkToProjectAction extends AnAction implements DumbAware {
getTemplatePresentation().setDescription(GradleBundle.message("gradle.action.link.project.description"));
}
- @Override
- public void update(AnActionEvent e) {
- final Project project = PlatformDataKeys.PROJECT.getData(e.getDataContext());
- if (project == null) {
- e.getPresentation().setVisible(false);
- return;
- }
- final String path = GradleSettings.getInstance(project).LINKED_PROJECT_FILE_PATH;
- e.getPresentation().setVisible(path == null || !new File(path).isFile());
- }
-
@Override
public void actionPerformed(AnActionEvent e) {
final Project project = PlatformDataKeys.PROJECT.getData(e.getDataContext());
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleOpenScriptAction.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleOpenScriptAction.java
new file mode 100644
index 000000000000..c6922d692430
--- /dev/null
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleOpenScriptAction.java
@@ -0,0 +1,35 @@
+package org.jetbrains.plugins.gradle.action;
+
+import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.Presentation;
+import com.intellij.openapi.project.DumbAware;
+import com.intellij.openapi.project.Project;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.plugins.gradle.config.GradleSettings;
+import org.jetbrains.plugins.gradle.util.GradleBundle;
+
+/**
+ * Forces the IntelliJ IDEA to open {@link GradleSettings#LINKED_PROJECT_FILE_PATH linked gradle project} at the editor
+ *
+ * Not thread-safe.
+ *
+ * @author Denis Zhdanov
+ * @since 1/31/12 5:16 PM
+ */
+public class GradleOpenScriptAction extends AbstractGradleLinkedProjectAction implements DumbAware {
+
+ public GradleOpenScriptAction() {
+ getTemplatePresentation().setText(GradleBundle.message("gradle.action.open.script.text"));
+ getTemplatePresentation().setDescription(GradleBundle.message("gradle.action.open.script.description"));
+ }
+
+ @Override
+ protected void doUpdate(@NotNull Presentation presentation, @NotNull String linkedProjectPath) {
+ }
+
+ @Override
+ protected void doActionPerformed(@NotNull Project project, @NotNull String linkedProjectPath) {
+ // TODO den implement
+ }
+}
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleRefreshProjectAction.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleRefreshProjectAction.java
index d70525040139..17fa3a0fbc4e 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleRefreshProjectAction.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleRefreshProjectAction.java
@@ -1,8 +1,6 @@
package org.jetbrains.plugins.gradle.action;
-import com.intellij.openapi.actionSystem.AnAction;
-import com.intellij.openapi.actionSystem.AnActionEvent;
-import com.intellij.openapi.actionSystem.PlatformDataKeys;
+import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
@@ -13,7 +11,6 @@ import org.jetbrains.plugins.gradle.config.GradleSettings;
import org.jetbrains.plugins.gradle.task.GradleResolveProjectTask;
import org.jetbrains.plugins.gradle.util.GradleBundle;
-import java.io.File;
import java.util.concurrent.atomic.AtomicBoolean;
/**
@@ -24,7 +21,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
* @author Denis Zhdanov
* @since 1/23/12 3:48 PM
*/
-public class GradleRefreshProjectAction extends AnAction implements DumbAware {
+public class GradleRefreshProjectAction extends AbstractGradleLinkedProjectAction implements DumbAware {
private final AtomicBoolean myInProgress = new AtomicBoolean();
@@ -34,39 +31,24 @@ public class GradleRefreshProjectAction extends AnAction implements DumbAware {
}
@Override
- public void update(AnActionEvent e) {
- final Project project = PlatformDataKeys.PROJECT.getData(e.getDataContext());
- if (project == null) {
- e.getPresentation().setVisible(false);
- return;
- }
- final String path = GradleSettings.getInstance(project).LINKED_PROJECT_FILE_PATH;
- final boolean visible = path != null && new File(path).isFile();
- e.getPresentation().setVisible(visible);
- e.getPresentation().setEnabled(!myInProgress.get());
+ protected void doUpdate(@NotNull Presentation presentation, @NotNull String linkedProjectPath) {
+ presentation.setEnabled(!myInProgress.get());
}
@Override
- public void actionPerformed(AnActionEvent e) {
- final Project project = PlatformDataKeys.PROJECT.getData(e.getDataContext());
- if (project == null) {
- e.getPresentation().setVisible(false);
- return;
- }
- // Assuming that the linked project is available if this action is called (update() is successful)
- final String projectPath = GradleSettings.getInstance(project).LINKED_PROJECT_FILE_PATH;
+ protected void doActionPerformed(@NotNull final Project project, @NotNull final String linkedProjectPath) {
myInProgress.set(true);
ProgressManager.getInstance().run(new Task.Backgroundable(project, GradleBundle.message("gradle.sync.progress.text")) {
@Override
public void run(@NotNull final ProgressIndicator indicator) {
try {
- GradleResolveProjectTask task = new GradleResolveProjectTask(project, projectPath, true);
+ GradleResolveProjectTask task = new GradleResolveProjectTask(project, linkedProjectPath, true);
task.execute(indicator);
}
finally {
myInProgress.set(false);
}
}
- });
+ });
}
}
diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesModelTest.groovy b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesModelTest.groovy
index efb25809b82f..593ccb1821d1 100644
--- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesModelTest.groovy
+++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesModelTest.groovy
@@ -106,7 +106,7 @@ public class GradleProjectStructureChangesModelTest {
treeModel = container.getComponentInstance(GradleProjectStructureTreeModel) as GradleProjectStructureTreeModel
changesModel.addListener({ old, current ->
treeModel.update(current)
- treeModel.pruneObsoleteNodes(ContainerUtil.subtract(old, current));
+ treeModel.pruneObsoleteNodes(ContainerUtil.subtract(old, current));
} as GradleProjectStructureChangeListener)
changesModel.update(gradle.project)
}