notify that wrong module was selected (IDEA-67795)

This commit is contained in:
anna
2011-04-12 19:19:10 +02:00
parent 4b392df708
commit 88c6cba90b
5 changed files with 125 additions and 2 deletions
@@ -18,6 +18,7 @@ package com.intellij.openapi.wm;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.ui.popup.Balloon;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -130,4 +131,7 @@ public abstract class ToolWindowManager {
public abstract void notifyByBalloon(@NotNull final String toolWindowId, @NotNull final MessageType type, @NotNull final String htmlBody, @Nullable final Icon icon,
@Nullable HyperlinkListener listener);
@Nullable
public abstract Balloon getToolWindowBalloon(String id);
}
@@ -27,6 +27,7 @@ import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.DataProvider;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.ui.popup.Balloon;
import com.intellij.openapi.util.ActionCallback;
import com.intellij.openapi.util.ActiveRunnable;
import com.intellij.openapi.util.Condition;
@@ -342,6 +343,11 @@ public class ToolWindowHeadlessManagerImpl extends ToolWindowManagerEx {
@Nullable final HyperlinkListener listener) {
}
@Override
public Balloon getToolWindowBalloon(String id) {
return null;
}
public void addToolWindowManagerListener(@NotNull ToolWindowManagerListener l) {
}
@@ -1364,6 +1364,11 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements
}
@Override
public Balloon getToolWindowBalloon(String id) {
return myWindow2Balloon.get(id);
}
public boolean isEditorComponentActive() {
ApplicationManager.getApplication().assertIsDispatchThread();
@@ -305,7 +305,7 @@ public abstract class TestObject implements JavaCommandLine {
unboundOutputRoot.flush();
packetsReceiver.checkTerminated();
final JUnitRunningModel model = packetsReceiver.getModel();
TestsUIUtil.notifyByBalloon(myProject, model != null ? model.getRoot() : null, consoleProperties);
notifyByBalloon(model, consoleProperties);
}
});
}
@@ -352,6 +352,10 @@ public abstract class TestObject implements JavaCommandLine {
return result;
}
protected void notifyByBalloon(JUnitRunningModel model, JUnitConsoleProperties consoleProperties) {
TestsUIUtil.notifyByBalloon(myProject, model != null ? model.getRoot() : null, consoleProperties);
}
protected JUnitProcessHandler createHandler() throws ExecutionException {
appendForkInfo();
return JUnitProcessHandler.runCommandLine(CommandLineBuilder.createFromJavaParameters(myJavaParameters, myProject, true));
@@ -21,41 +21,57 @@ import com.intellij.execution.configurations.ConfigurationPerRunnerSettings;
import com.intellij.execution.configurations.RunnerSettings;
import com.intellij.execution.configurations.RuntimeConfigurationException;
import com.intellij.execution.configurations.RuntimeConfigurationWarning;
import com.intellij.execution.executors.DefaultDebugExecutor;
import com.intellij.execution.executors.DefaultRunExecutor;
import com.intellij.execution.junit2.ui.model.JUnitRunningModel;
import com.intellij.execution.junit2.ui.properties.JUnitConsoleProperties;
import com.intellij.execution.process.ProcessAdapter;
import com.intellij.execution.process.ProcessEvent;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.runners.ProgramRunner;
import com.intellij.execution.testframework.SourceScope;
import com.intellij.execution.testframework.TestSearchScope;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.progress.impl.BackgroundableProcessIndicator;
import com.intellij.openapi.progress.impl.ProgressManagerImpl;
import com.intellij.openapi.project.DumbModeAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.ui.popup.Balloon;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.wm.ToolWindowId;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.PackageScope;
import com.intellij.refactoring.listeners.RefactoringElementListener;
import com.intellij.ui.HyperlinkAdapter;
import com.intellij.util.Function;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.event.HyperlinkEvent;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
public class TestPackage extends TestObject {
private BackgroundableProcessIndicator mySearchForTestsIndicator;
private ServerSocket myServerSocket;
private boolean myFoundTests = true;
public TestPackage(final Project project,
final JUnitConfiguration configuration,
@@ -249,6 +265,53 @@ public class TestPackage extends TestObject {
return ApplicationManager.getApplication().isUnitTestMode();
}
@Override
protected void notifyByBalloon(JUnitRunningModel model, final JUnitConsoleProperties consoleProperties) {
if (myFoundTests) {
super.notifyByBalloon(model, consoleProperties);
}
else {
final String packageName = myConfiguration.getPackage();
if (packageName == null) return;
final Project project = myConfiguration.getProject();
final PsiPackage aPackage = JavaPsiFacade.getInstance(project).findPackage(packageName);
if (aPackage == null) return;
final Module module = myConfiguration.getConfigurationModule().getModule();
if (module == null) return;
final Set<Module> modulesWithPackage = new HashSet<Module>();
final PsiDirectory[] directories = aPackage.getDirectories();
for (PsiDirectory directory : directories) {
final Module currentModule = ModuleUtil.findModuleForFile(directory.getVirtualFile(), project);
if (module != currentModule) {
modulesWithPackage.add(currentModule);
}
}
if (!modulesWithPackage.isEmpty()) {
final String testRunDebugId = consoleProperties.isDebug() ? ToolWindowId.DEBUG : ToolWindowId.RUN;
final ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(project);
final Function<Module, String> moduleNameRef = new Function<Module, String>() {
@Override
public String fun(Module module) {
final String moduleName = module.getName();
return "<a href=\"" + moduleName + "\">" + moduleName + "</a>";
}
};
String message = "Tests were not found in module \"" + module.getName() + "\".\n" +
"Use ";
if (modulesWithPackage.size() == 1) {
message += "module \"" + moduleNameRef.fun(modulesWithPackage.iterator().next()) + "\" ";
}
else {
message += "one of\n" + StringUtil.join(modulesWithPackage, moduleNameRef, "\n") + "\n";
}
message += "instead";
toolWindowManager.notifyByBalloon(testRunDebugId, MessageType.WARNING, message, null,
new ResetConfigurationModuleAdapter(project, consoleProperties, toolWindowManager,
testRunDebugId));
}
}
}
public interface FindCallback {
/**
* Invoked in dispatch thread
@@ -280,6 +343,7 @@ public class TestPackage extends TestObject {
LOG.info(e);
}
myJunit4[0] = ConfigurationUtil.findAllTestClasses(myClassFilter, myClasses);
myFoundTests = !myClasses.isEmpty();
}
@Override
@@ -324,4 +388,44 @@ public class TestPackage extends TestObject {
}
}
}
private class ResetConfigurationModuleAdapter extends HyperlinkAdapter {
private final Project myProject;
private final JUnitConsoleProperties myConsoleProperties;
private final ToolWindowManager myToolWindowManager;
private final String myTestRunDebugId;
public ResetConfigurationModuleAdapter(final Project project,
final JUnitConsoleProperties consoleProperties,
final ToolWindowManager toolWindowManager,
final String testRunDebugId) {
myProject = project;
myConsoleProperties = consoleProperties;
myToolWindowManager = toolWindowManager;
myTestRunDebugId = testRunDebugId;
}
@Override
protected void hyperlinkActivated(HyperlinkEvent e) {
final Module moduleByName = ModuleManager.getInstance(myProject).findModuleByName(e.getDescription());
if (moduleByName != null) {
myConfiguration.getConfigurationModule().setModule(moduleByName);
try {
final Executor executor = myConsoleProperties.isDebug() ? DefaultDebugExecutor.getDebugExecutorInstance()
: DefaultRunExecutor.getRunExecutorInstance();
final ProgramRunner runner = RunnerRegistry.getInstance().getRunner(executor.getId(), myConfiguration);
assert runner != null;
runner.execute(executor,
new ExecutionEnvironment(myConfiguration, myProject, getRunnerSettings(), getConfigurationSettings(), null));
final Balloon balloon = myToolWindowManager.getToolWindowBalloon(myTestRunDebugId);
if (balloon != null) {
balloon.hide();
}
}
catch (ExecutionException e1) {
LOG.error(e1);
}
}
}
}
}