line separators

This commit is contained in:
Eugene Zhuravlev
2010-11-07 12:17:00 +03:00
parent 74af332754
commit 44a51c200d
6 changed files with 3318 additions and 3318 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,309 +1,309 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.execution.process;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.vfs.encoding.EncodingManager;
import com.intellij.util.Consumer;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.nio.charset.Charset;
import java.util.concurrent.*;
public class OSProcessHandler extends ProcessHandler {
private static final Logger LOG = Logger.getInstance("#com.intellij.execution.process.OSProcessHandler");
private final Process myProcess;
private final String myCommandLine;
private final ProcessWaitFor myWaitFor;
private static class ExecutorServiceHolder {
private static final ExecutorService ourThreadExecutorsService = createServiceImpl();
private static ThreadPoolExecutor createServiceImpl() {
return new ThreadPoolExecutor(10, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), new ThreadFactory() {
@SuppressWarnings({"HardCodedStringLiteral"})
public Thread newThread(Runnable r) {
return new Thread(r, "OSProcessHandler pooled thread");
}
});
}
}
/**
* Override this method in order to execute the task with a custom pool
*
* @param task a task to run
*/
protected Future<?> executeOnPooledThread(Runnable task) {
final Application application = ApplicationManager.getApplication();
if (application != null) {
return application.executeOnPooledThread(task);
}
return ExecutorServiceHolder.ourThreadExecutorsService.submit(task);
}
public OSProcessHandler(final Process process, final String commandLine) {
myProcess = process;
myCommandLine = commandLine;
myWaitFor = new ProcessWaitFor(process);
}
private class ProcessWaitFor {
private final Future<?> myWaitForThreadFuture;
private final BlockingQueue<Consumer<Integer>> myTerminationCallback = new ArrayBlockingQueue<Consumer<Integer>>(1);
public void detach() {
myWaitForThreadFuture.cancel(true);
}
public ProcessWaitFor(final Process process) {
myWaitForThreadFuture = executeOnPooledThread(new Runnable() {
public void run() {
int exitCode = 0;
try {
exitCode = process.waitFor();
}
catch (InterruptedException ignored) {
}
finally {
try {
myTerminationCallback.take().consume(exitCode);
}
catch (InterruptedException e) {
// Ignore
}
}
}
});
}
public void setTerminationCallback(Consumer<Integer> r) {
myTerminationCallback.offer(r);
}
}
public Process getProcess() {
return myProcess;
}
public void startNotify() {
final ReadProcessThread stdoutThread = new ReadProcessThread(createProcessOutReader()) {
protected void textAvailable(String s) {
notifyTextAvailable(s, ProcessOutputTypes.STDOUT);
}
};
final ReadProcessThread stderrThread = new ReadProcessThread(createProcessErrReader()) {
protected void textAvailable(String s) {
notifyTextAvailable(s, ProcessOutputTypes.STDERR);
}
};
notifyTextAvailable(myCommandLine + '\n', ProcessOutputTypes.SYSTEM);
addProcessListener(new ProcessAdapter() {
public void startNotified(final ProcessEvent event) {
try {
final Future<?> stdOutReadingFuture = executeOnPooledThread(stdoutThread);
final Future<?> stdErrReadingFuture = executeOnPooledThread(stderrThread);
myWaitFor.setTerminationCallback(new Consumer<Integer>() {
@Override
public void consume(Integer exitCode) {
try {
// tell threads that no more attempts to read process' output should be made
stderrThread.setProcessTerminated(true);
stdoutThread.setProcessTerminated(true);
stdErrReadingFuture.get();
stdOutReadingFuture.get();
}
catch (InterruptedException ignored) {
}
catch (ExecutionException e) {
LOG.error(e);
}
finally {
onOSProcessTerminated(exitCode);
}
}
});
}
finally {
removeProcessListener(this);
}
}
});
super.startNotify();
}
protected void onOSProcessTerminated(final int exitCode) {
notifyProcessTerminated(exitCode);
}
protected Reader createProcessOutReader() {
return new InputStreamReader(myProcess.getInputStream(), getCharset());
}
protected Reader createProcessErrReader() {
return new InputStreamReader(myProcess.getErrorStream(), getCharset());
}
protected void destroyProcessImpl() {
try {
closeStreams();
}
finally {
myProcess.destroy();
}
}
protected void detachProcessImpl() {
final Runnable runnable = new Runnable() {
public void run() {
closeStreams();
myWaitFor.detach();
notifyProcessDetached();
}
};
executeOnPooledThread(runnable);
}
private void closeStreams() {
try {
myProcess.getOutputStream().close();
}
catch (IOException e) {
LOG.error(e);
}
}
public boolean detachIsDefault() {
return false;
}
public OutputStream getProcessInput() {
return myProcess.getOutputStream();
}
// todo: to remove
public String getCommandLine() {
return myCommandLine;
}
public Charset getCharset() {
return EncodingManager.getInstance().getDefaultCharset();
}
private abstract static class ReadProcessThread implements Runnable {
private final Reader myReader;
private boolean skipLF = false;
private boolean myIsProcessTerminated = false;
private final char[] myBuffer = new char[8192];
public ReadProcessThread(final Reader reader) {
myReader = reader;
}
public synchronized void setProcessTerminated(boolean isProcessTerminated) {
myIsProcessTerminated = isProcessTerminated;
}
public void run() {
try {
while (true) {
final int rc = readAvailable();
if (rc == DONE) break;
Thread.sleep(rc == READ_SOME ? 1L : 50L);
}
}
catch (InterruptedException ignore) {
}
catch (Exception e) {
LOG.error(e);
}
}
private static final int DONE = 0;
private static final int READ_SOME = 1;
private static final int READ_NONE = 2;
private synchronized int readAvailable() throws IOException {
char[] buffer = myBuffer;
StringBuilder token = new StringBuilder();
int rc = READ_NONE;
while (myReader.ready()) {
int n = myReader.read(buffer);
if (n <= 0) break;
rc = READ_SOME;
for (int i = 0; i < n; i++) {
char c = buffer[i];
if (skipLF && c != '\n') {
token.append('\r');
}
if (c == '\r') {
skipLF = true;
}
else {
skipLF = false;
token.append(c);
}
if (c == '\n') {
textAvailable(token.toString());
token.setLength(0);
}
}
}
if (token.length() != 0) {
textAvailable(token.toString());
token.setLength(0);
}
if (myIsProcessTerminated) {
try {
myReader.close();
}
catch (IOException e1) {
// supressed
}
return DONE;
}
return rc;
}
protected abstract void textAvailable(final String s);
}
}
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.execution.process;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.vfs.encoding.EncodingManager;
import com.intellij.util.Consumer;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.nio.charset.Charset;
import java.util.concurrent.*;
public class OSProcessHandler extends ProcessHandler {
private static final Logger LOG = Logger.getInstance("#com.intellij.execution.process.OSProcessHandler");
private final Process myProcess;
private final String myCommandLine;
private final ProcessWaitFor myWaitFor;
private static class ExecutorServiceHolder {
private static final ExecutorService ourThreadExecutorsService = createServiceImpl();
private static ThreadPoolExecutor createServiceImpl() {
return new ThreadPoolExecutor(10, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), new ThreadFactory() {
@SuppressWarnings({"HardCodedStringLiteral"})
public Thread newThread(Runnable r) {
return new Thread(r, "OSProcessHandler pooled thread");
}
});
}
}
/**
* Override this method in order to execute the task with a custom pool
*
* @param task a task to run
*/
protected Future<?> executeOnPooledThread(Runnable task) {
final Application application = ApplicationManager.getApplication();
if (application != null) {
return application.executeOnPooledThread(task);
}
return ExecutorServiceHolder.ourThreadExecutorsService.submit(task);
}
public OSProcessHandler(final Process process, final String commandLine) {
myProcess = process;
myCommandLine = commandLine;
myWaitFor = new ProcessWaitFor(process);
}
private class ProcessWaitFor {
private final Future<?> myWaitForThreadFuture;
private final BlockingQueue<Consumer<Integer>> myTerminationCallback = new ArrayBlockingQueue<Consumer<Integer>>(1);
public void detach() {
myWaitForThreadFuture.cancel(true);
}
public ProcessWaitFor(final Process process) {
myWaitForThreadFuture = executeOnPooledThread(new Runnable() {
public void run() {
int exitCode = 0;
try {
exitCode = process.waitFor();
}
catch (InterruptedException ignored) {
}
finally {
try {
myTerminationCallback.take().consume(exitCode);
}
catch (InterruptedException e) {
// Ignore
}
}
}
});
}
public void setTerminationCallback(Consumer<Integer> r) {
myTerminationCallback.offer(r);
}
}
public Process getProcess() {
return myProcess;
}
public void startNotify() {
final ReadProcessThread stdoutThread = new ReadProcessThread(createProcessOutReader()) {
protected void textAvailable(String s) {
notifyTextAvailable(s, ProcessOutputTypes.STDOUT);
}
};
final ReadProcessThread stderrThread = new ReadProcessThread(createProcessErrReader()) {
protected void textAvailable(String s) {
notifyTextAvailable(s, ProcessOutputTypes.STDERR);
}
};
notifyTextAvailable(myCommandLine + '\n', ProcessOutputTypes.SYSTEM);
addProcessListener(new ProcessAdapter() {
public void startNotified(final ProcessEvent event) {
try {
final Future<?> stdOutReadingFuture = executeOnPooledThread(stdoutThread);
final Future<?> stdErrReadingFuture = executeOnPooledThread(stderrThread);
myWaitFor.setTerminationCallback(new Consumer<Integer>() {
@Override
public void consume(Integer exitCode) {
try {
// tell threads that no more attempts to read process' output should be made
stderrThread.setProcessTerminated(true);
stdoutThread.setProcessTerminated(true);
stdErrReadingFuture.get();
stdOutReadingFuture.get();
}
catch (InterruptedException ignored) {
}
catch (ExecutionException e) {
LOG.error(e);
}
finally {
onOSProcessTerminated(exitCode);
}
}
});
}
finally {
removeProcessListener(this);
}
}
});
super.startNotify();
}
protected void onOSProcessTerminated(final int exitCode) {
notifyProcessTerminated(exitCode);
}
protected Reader createProcessOutReader() {
return new InputStreamReader(myProcess.getInputStream(), getCharset());
}
protected Reader createProcessErrReader() {
return new InputStreamReader(myProcess.getErrorStream(), getCharset());
}
protected void destroyProcessImpl() {
try {
closeStreams();
}
finally {
myProcess.destroy();
}
}
protected void detachProcessImpl() {
final Runnable runnable = new Runnable() {
public void run() {
closeStreams();
myWaitFor.detach();
notifyProcessDetached();
}
};
executeOnPooledThread(runnable);
}
private void closeStreams() {
try {
myProcess.getOutputStream().close();
}
catch (IOException e) {
LOG.error(e);
}
}
public boolean detachIsDefault() {
return false;
}
public OutputStream getProcessInput() {
return myProcess.getOutputStream();
}
// todo: to remove
public String getCommandLine() {
return myCommandLine;
}
public Charset getCharset() {
return EncodingManager.getInstance().getDefaultCharset();
}
private abstract static class ReadProcessThread implements Runnable {
private final Reader myReader;
private boolean skipLF = false;
private boolean myIsProcessTerminated = false;
private final char[] myBuffer = new char[8192];
public ReadProcessThread(final Reader reader) {
myReader = reader;
}
public synchronized void setProcessTerminated(boolean isProcessTerminated) {
myIsProcessTerminated = isProcessTerminated;
}
public void run() {
try {
while (true) {
final int rc = readAvailable();
if (rc == DONE) break;
Thread.sleep(rc == READ_SOME ? 1L : 50L);
}
}
catch (InterruptedException ignore) {
}
catch (Exception e) {
LOG.error(e);
}
}
private static final int DONE = 0;
private static final int READ_SOME = 1;
private static final int READ_NONE = 2;
private synchronized int readAvailable() throws IOException {
char[] buffer = myBuffer;
StringBuilder token = new StringBuilder();
int rc = READ_NONE;
while (myReader.ready()) {
int n = myReader.read(buffer);
if (n <= 0) break;
rc = READ_SOME;
for (int i = 0; i < n; i++) {
char c = buffer[i];
if (skipLF && c != '\n') {
token.append('\r');
}
if (c == '\r') {
skipLF = true;
}
else {
skipLF = false;
token.append(c);
}
if (c == '\n') {
textAvailable(token.toString());
token.setLength(0);
}
}
}
if (token.length() != 0) {
textAvailable(token.toString());
token.setLength(0);
}
if (myIsProcessTerminated) {
try {
myReader.close();
}
catch (IOException e1) {
// supressed
}
return DONE;
}
return rc;
}
protected abstract void textAvailable(final String s);
}
}
@@ -1,303 +1,303 @@
no.module.defined.error.message=No module defined
module.does.not.exist.error.message=Module ''{0}'' does not exist
no.jdk.for.module.error.message=No jdk for module ''{0}''
jdk.is.bad.configured.error.message=''{0}'' is bad configured
class.not.found.in.module.error.message=Class ''{0}'' not found in module ''{1}''
package.not.found.error.message=Package ''{0}'' not found
jdk.not.configured.error.message=Jdk ''{0}'' not configured
project.has.no.jdk.error.message=Project has no JDK
some.modules.has.circular.dependency.error.message=Some modules has circular dependency.
project.has.no.jdk.configured.error.message=Project has no JDK configured.
run.configuration.stop.action.name=Stop
warning.common.title=Warning
run.configuration.error.dialog.title=Run Configuration Error
no.jdk.specified..error.message=No JDK specified
home.directory.not.specified.for.jdk.error.message=Home directory is not specified for JDK
run.configuration.pause.output.action.name=Pause Output
main.class.is.not.specified.error.message=Main class is not specified
close.tab.action.name=Close
run.configuration.show.command.line.action.name=Show command line
#---
create.run.configuration.action.name=Create Run Configuration
create.run.configuration.for.item.action.name=Create {0}
create.run.configuration.for.item.dialog.title=Create Run/Debug Configuration: {0}
edit.configuration.action=&Edit Configurations
save.temporary.run.configuration.action.name=&Save ''{0}'' Configuration
choose.run.configuration.action.description=Open run/debug configurations dropdown
#action - run. debug,profile etc
perform.action.with.context.configuration.action.name={0} context configuration
error.common.title=Error
error.running.configuration.with.error.error.message=Error running {0}:<br>{1}
select.applet.policy.file.dialog.title=Select applet policy file
choose.html.file.dialog.title=Choose HTML File
html.file.not.specified.error.message=Html file not specified
jre.not.valid.error.message=''{0}'' is not valid JRE home
applet.configuration.description=Applet configuration
applet.configuration.name=Applet
application.configuration.description=Application configuration
application.configuration.name=Application
run.configuration.norunner.selected.label=No runner selected
run.configuration.configuration.tab.title=Configuration
run.configuration.startup.connection.rab.title=Startup/Connection
add.new.run.configuration.acrtion.name=Add New Configuration
add.new.run.configuration.action.name=Add New ''{0}'' Configuration
remove.run.configuration.action.name=Remove Configuration
run.configuration.edit.default.configuration.settings.button=Edit De&faults
default.settings.editor.dialog.title=Default Settings
clear.all.from.console.action.name=Clear All
copy.selected.content.action.name=Copy Selected Content
copy.content.action.name=Copy Content
run.debug.dialog.title=Run/Debug Configurations
run.configuration.display.settings.checkbox=Display settings &before launching
run.configurable.display.name=Run
apply.action.name=&Apply
invalid.data.dialog.title=Invalid Data
template.settings.configurable.display.name=Template Settings
default.run.configuration.name=<unnamed>
process.is.running.dialog.title=Process ''{0}'' is running
button.disconnect=Disconnect
disconnect.process.confirmation.text=Disconnect from the process ''{0}''?
terminate.after.disconnect.checkbox=Terminate the process after disconnect
copy.configuration.action.name=Copy Configuration
junit.configuration.display.name=JUnit
junit.configuration.description=JUnit test configuration
no.junit.error.message=No junit.jar
no.junit.in.scope.error.message=No junit.jar: {0}
junit.not.found.in.module.error.message=JUnit not found in module ''{0}''
cannot.browse.test.inheritors.dialog.title=Can't Browse TestCase Inheritors
seaching.test.progress.title=Searching For Tests...
configuration.not.speficied.message=Configuration test type not specified
test.in.scope.presentable.text=Tests in ''{0}''
all.tests.scope.presentable.text=All Tests
module.does.not.exists=Module ''{0}'' does not exist in project ''{1}''
select.working.directory.message=Select working directory
set.class.name.message=Set class name first
cannot.browse.method.dialog.title=Cannot Browse Methods
class.does.not.exists.error.message=Class {0} does not exist
choose.package.dialog.title=Choose Package
choose.test.class.dialog.title=Choose Test Class
choose.test.method.dialog.title=Choose Test Method
test.cases.count.message={0} test case(s)
diff.content.expected.title=Expected
diff.content.expected.for.file.title=Expected :
diff.content.actual.title=Actual
junit.actual.text.label=Actual :
junit.click.to.see.diff.link=<Click to see difference>
output.tab.title=Output
statistics.tab.title=Statistics
test.not.started.progress.text=Tests were not started
starting.jvm.progress.text=Starting JVM...
instantiating.tests.progress.text=Instantiating tests...
next.faled.test.action.name=Next Failed Test
prev.faled.test.action.name=Previous Failed Test
junit.runing.info.memory.available.kb.message={0} kb.
junit.runing.info.memory.available.mb.message={0} Mb.
junit.runing.info.time.sec.message={0} s
junit.runing.info.total.label=Total:
junit.runing.info.starting.label=Starting...
junit.runing.info.running.label=Running
junit.runing.info.passed.label=Passed
junit.runing.info.terminated.label=Terminated
junit.runing.info.assertion.tree.node=Assertion
junit.runing.info.error.tree.node=Error
junit.runing.info.ignored.label=Ignored
junit.runing.info.ignored.console.message=Test ''{0}.{1}'' ignored
junit.runing.info.left.to.run.count.tree.node=Left: {0}
junit.runing.info.failed.count.message=F:{0}
junit.runing.info.errors.count.message=E:{0}
junit.runing.info.passed.count.message=P:{0}
junit.runing.info.ignored.count.message=I:{0}
junit.runing.info.status.completed.from.total.failed={0} of {1} Failed: {2}
junit.runing.info.status.completed.from.total={0} of {1}
junit.runing.info.status.running.number.with.name=Running: {0} {1}
junit.runing.info.failed.to.start.error.message=Failed to start
junit.runing.info.tests.failed.label=Tests Failed
junit.runing.info.tests.passed.label=Tests Passed
tests.passed.with.warnings.message=Tests passed (with warnings)
junit.run.hide.passed.action.name=Hide Passed
junit.run.hide.passed.action.description=Hide passed tests
junit.runing.info.track.test.action.name=Track Running Test
junit.runing.info.track.test.action.description=Select currently running test in tree
junit.runing.info.collapse.test.action.name=Collapse all test suites
junit.runing.info.expand.test.action.name=Expand all test suites
junit.runing.info.select.first.failed.action.name=Select First Failed Test When Finished
junit.runing.info.scroll.to.stacktrace.action.name=Scroll to Stacktrace
junit.runing.info.scroll.to.stacktrace.action.description=Scroll console to beginning of assertion or exception stacktrace
junit.runing.info.open.source.at.exception.action.name=Open Source at Exception
junit.runing.info.open.source.at.exception.action.description=Go to line which caused exception when opening test source
junit.all.tests.passed.label=All Tests Passed
junit.tests.in.progress.label=Tests in Progress
junit.auto.scroll.to.source.action.name=Auto Scroll to Source
junit.open.text.in.editor.action.name=Open selected test in editor
run.configuration.java.vm.parameters.label=&VM parameters:
run.configuration.program.parameters=Program pa&rameters:
run.configuration.working.directory.label=&Working directory:
run.configuration.use.alternate.jre.checkbox=Use alternative &JRE:
run.configuration.select.alternate.jre.label=Select Alternative JRE
run.configuration.select.jre.dir.label=Select directory with JRE to run with
run.configuration.arguments.help.panel.copy.action.name=Copy
terminating.process.progress.title=Terminating ''{0}''
waiting.for.vm.detach.progress.text=Waiting for process detach
restart.error.message.title=Restart Error
rerun.configuration.action.name=Rerun {0}
run.configuration.dump.threads.action.name=Dump Threads
run.configuration.exit.action.name=Exit
run.error.message.title=Run Error
default.runner.start.action.text=R&un
remote.debug.configuration.description=Remote debug configuration
remote.debug.configuration.display.name=Remote
applet.configuration.url.label=&URL
applet.configuration.applet.class.border=Applet Class
applet.configuration.applet.parameters.label=Applet Parameters
applet.configuration.applet.class.label=Applet &class:
button.remove=&Remove
button.add=&Add
applet.configuration.height.label= &Height:
applet.configuration.width.label= &Width:
applet.configuration.url.html.file.label=URL/HTML &file:
applet.configuration.url.border=URL
applet.configuration.use.classpath.and.jdk.of.module.label=Use classpath and JDK of m&odule:
applet.configuration.vm.parameters.for.appletviewer.label=&VM parameters for appletviewer:
applet.configuration.policy.file.label=&Policy file:
applet.configuration.parameter.name.column=Name
applet.configuration.parameter.value.column=Value
class.not.specified.error.message=Class not specified.
failed.to.generate.wrapper.error.message=Failed to generate temporary html wrapper for applet class
application.configuration.use.classpath.and.jdk.of.module.label=Use classpath and JDK of m&odule:
application.configuration.main.class.label=Main &class:
jre.path.is.not.valid.jre.home.error.mesage=''{0}'' is not valid JRE home
main.method.not.found.in.class.error.message=Main method not found in class {0}
no.user.process.input.error.message=No process input
fix.run.configuration.problem.button=Fix
class.isnt.test.class.error.message={0} isn''t test class
class.isnt.inheritor.of.testcase.error.message={0} isn''t inheritor of TestCase
junit.jar.not.found.in.module.class.path.error.message=junit.jar not found in module ''{0}'' class path.
method.name.not.specified.error.message=Method name not specified
test.method.doesnt.exist.error.message=Test method ''{0}'' doesn''t exist
no.tests.found.in.package.error.message=No tests found in the package ''{0}''
package.does.not.exist.error.message=Package ''{0}'' does not exist
choose.main.class.dialog.title=Choose Main Class
choose.applet.class.dialog.title=Choose Applet Class
junit.configuration.test.runner.parameters.label=Test runner pa&rameters:
junit.configuration.use.classpath.and.jdk.of.module.label=Use classpath and JDK of m&odule:
junit.configuration.test.border=Test
junit.configuration.across.module.dependencies.radio=Across modu&le dependencies
junit.configuration.in.single.module.radio=In s&ingle module
junit.configuration.in.whole.project.radio=In &whole project
junit.configuration.search.for.tests.label=Search for tests:
junit.configuration.package.label=Packa&ge:
junit.configuration.method.label=M&ethod:
junit.configuration.class.label=&Class:
junit.configuration.configure.junit.test.label=Test:
junit.configuration.test.method.radio=Test Method
junit.configuration.test.class.radio=Test Class
junit.configuration.class.radio=C&lass
junit.configuration.method.radio=Me&thod
jnit.configuration.all.tests.in.package.radio=All Tests in Package
junit.configuration.all.in.package.radio=All in &Package
no.jdk.specified.for.module.warning.text=No JDK specified for module ''{0}''
module.not.specified.error.text=Module not specified
module.doesn.t.exist.in.project.error.text=Module ''{0}'' doesn''t exist in project
run.configuration.unnamed.name.prefix=Unnamed
no.applet.class.specified.error.message=No applet class specified
no.main.class.specified.error.text=No main class specified
action.name.save.configuration=Save Configuration
#2 - configuration type description
empty.run.configuration.panel.text.label=<html><body><br><br><font face=\"{0}\" size=\"-1\">Press the <a href=\"add\"><image src=\"{1}\" border=\"0\"></a> \\&nbsp; button \
to create a new {3} based on default settings.</font></body></html>
default.package.presentable.name=<default>
default.package.configuration.name=default package
no.test.class.specified.error.text=No test class specified
edit.run.configuration.run.configuration.name.label=&Name:
default.junit.configuration.name=<no-name>
strings.equal.failed.dialog.title=Comparison failure
junit.runing.info.test.column.name=Test
junit.runing.info.time.elapsed.column.name=Time elapsed
junit.runing.info.usage.delta.column.name=Usage Delta
junit.runing.info.usage.before.column.name=Usage Before
junit.runing.info.usage.after.column.name=Usage After
junit.runing.info.results.column.name=Results
junit.runing.info.loading.tree.node.text=loading
remote.configuration.settings.border=Settings
remote.configuration.transport.label=Transport:
remote.configuration.listen.radio=Listen
remote.configuration.attach.radio=Attach
remote.configuration.debugger.mode.label=Debugger mode:
remote.configuration.shared.memory.radio=Shared memory
remote.configuration.socket.radio=Socket
remote.configuration.shared.memory.address.label=Shared memory address:
remote.configuration.port.label=Port:
remote.configuration.host.label=Host:
remote.configuration.remote.debugging.allows.you.to.connect.idea.to.a.running.jvm.label=Remote debugging allows you to connect IDEA to a running JVM.
standard.runner.description=Run selected configuration
environment.variables.helper.use.arguments.label=<html><body>Use the following command line arguments for running remote JVM (you may copy and paste them)</body></html>
environment.variables.helper.use.arguments.jdk13.label=<html><body>If the application runs on JDK 1.3.x or earlier, use following arguments</body></html>
select.run.configuration.for.item.action.name=Select {0}
save.run.configuration.for.item.action.name=Save {0}
junit.runing.info.status.done.count=Done: {0}
junit.runing.info.status.terminated.count=Terminated: {0}
junit.runing.info.tests.in.progress.done.tree.node=Tests in Progress: Done
junit.runing.info.tests.in.progress.terminated.tre.node=Tests in Progress: Terminated
delete.confirmation.dialog.title=Delete Confirmation
move.up.action.name=Move Up
move.down.action.name=Move Down
memory.available.message={0} Kb
#code coverage
enable.coverage.with.emma=Record code &coverage information
merge.coverage.data=&Merge gathered coverage with suite chosen below
record.coverage.filters.title=Packages and classes to record coverage data
coverage.tab.title=Code Coverage
show.swing.inspector=&Enable capturing form snapshots
show.swing.inspector.disabled=&Enable capturing form snapshots (requires JRE 5.0 or higher)
before.run.property.make=Make
run.configuration.store.place.option=&Share configuration
run.configuration.default.type.description=configuration
#GeneralCommandLine
run.configuration.error.no.jdk.specified=No JDK specified
run.configuration.cannot.find.vm.executable=Cannot find VM executable
logs.tab.title=Logs
before.launch.panel.title=Before launch
action.name.save.as.configuration=Save As
default.junit.config.name.all.in.module=All in {0}
default.junit.config.name.all.in.package.in.module={0} in {1}
environment.variables.dialog.title=Environment Variables
environment.variables.component.title=&Environment Variables
down.the.stack.trace=Down the stack trace
up.the.stack.trace=Up the stack trace
configuration.action.chooser.title=Choose configuration type to run
env.vars.checkbox.title=&Include parent environment variables
before.launch.compile.step=Make
execute.before.run.debug.dialog.title=Execute {0} Before Run/Debug
export.test.results.filename=Test Results - {0}
export.test.results.succeeded=<html>Test results exported successfully to <a href="#a">{0}</a></html>
export.test.results.failed=Test results export failed: {0}
export.test.results.custom.template.chooser.title=Choose Custom Template
export.test.results.output.folder.chooser.title=Choose Output Folder
export.test.results.custom.template.path.empty=User-defined tempate path is empty
export.test.results.custom.template.not.found=User-defined tempate file ''{0}'' is not found
export.test.results.task.name=Exporting test results
export.test.results.open.editor=O&pen exported file in editor
export.test.results.open.browser=O&pen exported file in browser
export.test.results.dialog.title=Export Test Results
export.test.results.output.path.empty=Output path is empty
export.test.results.output.filename.empty=Output file name is empty
no.module.defined.error.message=No module defined
module.does.not.exist.error.message=Module ''{0}'' does not exist
no.jdk.for.module.error.message=No jdk for module ''{0}''
jdk.is.bad.configured.error.message=''{0}'' is bad configured
class.not.found.in.module.error.message=Class ''{0}'' not found in module ''{1}''
package.not.found.error.message=Package ''{0}'' not found
jdk.not.configured.error.message=Jdk ''{0}'' not configured
project.has.no.jdk.error.message=Project has no JDK
some.modules.has.circular.dependency.error.message=Some modules has circular dependency.
project.has.no.jdk.configured.error.message=Project has no JDK configured.
run.configuration.stop.action.name=Stop
warning.common.title=Warning
run.configuration.error.dialog.title=Run Configuration Error
no.jdk.specified..error.message=No JDK specified
home.directory.not.specified.for.jdk.error.message=Home directory is not specified for JDK
run.configuration.pause.output.action.name=Pause Output
main.class.is.not.specified.error.message=Main class is not specified
close.tab.action.name=Close
run.configuration.show.command.line.action.name=Show command line
#---
create.run.configuration.action.name=Create Run Configuration
create.run.configuration.for.item.action.name=Create {0}
create.run.configuration.for.item.dialog.title=Create Run/Debug Configuration: {0}
edit.configuration.action=&Edit Configurations
save.temporary.run.configuration.action.name=&Save ''{0}'' Configuration
choose.run.configuration.action.description=Open run/debug configurations dropdown
#action - run. debug,profile etc
perform.action.with.context.configuration.action.name={0} context configuration
error.common.title=Error
error.running.configuration.with.error.error.message=Error running {0}:<br>{1}
select.applet.policy.file.dialog.title=Select applet policy file
choose.html.file.dialog.title=Choose HTML File
html.file.not.specified.error.message=Html file not specified
jre.not.valid.error.message=''{0}'' is not valid JRE home
applet.configuration.description=Applet configuration
applet.configuration.name=Applet
application.configuration.description=Application configuration
application.configuration.name=Application
run.configuration.norunner.selected.label=No runner selected
run.configuration.configuration.tab.title=Configuration
run.configuration.startup.connection.rab.title=Startup/Connection
add.new.run.configuration.acrtion.name=Add New Configuration
add.new.run.configuration.action.name=Add New ''{0}'' Configuration
remove.run.configuration.action.name=Remove Configuration
run.configuration.edit.default.configuration.settings.button=Edit De&faults
default.settings.editor.dialog.title=Default Settings
clear.all.from.console.action.name=Clear All
copy.selected.content.action.name=Copy Selected Content
copy.content.action.name=Copy Content
run.debug.dialog.title=Run/Debug Configurations
run.configuration.display.settings.checkbox=Display settings &before launching
run.configurable.display.name=Run
apply.action.name=&Apply
invalid.data.dialog.title=Invalid Data
template.settings.configurable.display.name=Template Settings
default.run.configuration.name=<unnamed>
process.is.running.dialog.title=Process ''{0}'' is running
button.disconnect=Disconnect
disconnect.process.confirmation.text=Disconnect from the process ''{0}''?
terminate.after.disconnect.checkbox=Terminate the process after disconnect
copy.configuration.action.name=Copy Configuration
junit.configuration.display.name=JUnit
junit.configuration.description=JUnit test configuration
no.junit.error.message=No junit.jar
no.junit.in.scope.error.message=No junit.jar: {0}
junit.not.found.in.module.error.message=JUnit not found in module ''{0}''
cannot.browse.test.inheritors.dialog.title=Can't Browse TestCase Inheritors
seaching.test.progress.title=Searching For Tests...
configuration.not.speficied.message=Configuration test type not specified
test.in.scope.presentable.text=Tests in ''{0}''
all.tests.scope.presentable.text=All Tests
module.does.not.exists=Module ''{0}'' does not exist in project ''{1}''
select.working.directory.message=Select working directory
set.class.name.message=Set class name first
cannot.browse.method.dialog.title=Cannot Browse Methods
class.does.not.exists.error.message=Class {0} does not exist
choose.package.dialog.title=Choose Package
choose.test.class.dialog.title=Choose Test Class
choose.test.method.dialog.title=Choose Test Method
test.cases.count.message={0} test case(s)
diff.content.expected.title=Expected
diff.content.expected.for.file.title=Expected :
diff.content.actual.title=Actual
junit.actual.text.label=Actual :
junit.click.to.see.diff.link=<Click to see difference>
output.tab.title=Output
statistics.tab.title=Statistics
test.not.started.progress.text=Tests were not started
starting.jvm.progress.text=Starting JVM...
instantiating.tests.progress.text=Instantiating tests...
next.faled.test.action.name=Next Failed Test
prev.faled.test.action.name=Previous Failed Test
junit.runing.info.memory.available.kb.message={0} kb.
junit.runing.info.memory.available.mb.message={0} Mb.
junit.runing.info.time.sec.message={0} s
junit.runing.info.total.label=Total:
junit.runing.info.starting.label=Starting...
junit.runing.info.running.label=Running
junit.runing.info.passed.label=Passed
junit.runing.info.terminated.label=Terminated
junit.runing.info.assertion.tree.node=Assertion
junit.runing.info.error.tree.node=Error
junit.runing.info.ignored.label=Ignored
junit.runing.info.ignored.console.message=Test ''{0}.{1}'' ignored
junit.runing.info.left.to.run.count.tree.node=Left: {0}
junit.runing.info.failed.count.message=F:{0}
junit.runing.info.errors.count.message=E:{0}
junit.runing.info.passed.count.message=P:{0}
junit.runing.info.ignored.count.message=I:{0}
junit.runing.info.status.completed.from.total.failed={0} of {1} Failed: {2}
junit.runing.info.status.completed.from.total={0} of {1}
junit.runing.info.status.running.number.with.name=Running: {0} {1}
junit.runing.info.failed.to.start.error.message=Failed to start
junit.runing.info.tests.failed.label=Tests Failed
junit.runing.info.tests.passed.label=Tests Passed
tests.passed.with.warnings.message=Tests passed (with warnings)
junit.run.hide.passed.action.name=Hide Passed
junit.run.hide.passed.action.description=Hide passed tests
junit.runing.info.track.test.action.name=Track Running Test
junit.runing.info.track.test.action.description=Select currently running test in tree
junit.runing.info.collapse.test.action.name=Collapse all test suites
junit.runing.info.expand.test.action.name=Expand all test suites
junit.runing.info.select.first.failed.action.name=Select First Failed Test When Finished
junit.runing.info.scroll.to.stacktrace.action.name=Scroll to Stacktrace
junit.runing.info.scroll.to.stacktrace.action.description=Scroll console to beginning of assertion or exception stacktrace
junit.runing.info.open.source.at.exception.action.name=Open Source at Exception
junit.runing.info.open.source.at.exception.action.description=Go to line which caused exception when opening test source
junit.all.tests.passed.label=All Tests Passed
junit.tests.in.progress.label=Tests in Progress
junit.auto.scroll.to.source.action.name=Auto Scroll to Source
junit.open.text.in.editor.action.name=Open selected test in editor
run.configuration.java.vm.parameters.label=&VM parameters:
run.configuration.program.parameters=Program pa&rameters:
run.configuration.working.directory.label=&Working directory:
run.configuration.use.alternate.jre.checkbox=Use alternative &JRE:
run.configuration.select.alternate.jre.label=Select Alternative JRE
run.configuration.select.jre.dir.label=Select directory with JRE to run with
run.configuration.arguments.help.panel.copy.action.name=Copy
terminating.process.progress.title=Terminating ''{0}''
waiting.for.vm.detach.progress.text=Waiting for process detach
restart.error.message.title=Restart Error
rerun.configuration.action.name=Rerun {0}
run.configuration.dump.threads.action.name=Dump Threads
run.configuration.exit.action.name=Exit
run.error.message.title=Run Error
default.runner.start.action.text=R&un
remote.debug.configuration.description=Remote debug configuration
remote.debug.configuration.display.name=Remote
applet.configuration.url.label=&URL
applet.configuration.applet.class.border=Applet Class
applet.configuration.applet.parameters.label=Applet Parameters
applet.configuration.applet.class.label=Applet &class:
button.remove=&Remove
button.add=&Add
applet.configuration.height.label= &Height:
applet.configuration.width.label= &Width:
applet.configuration.url.html.file.label=URL/HTML &file:
applet.configuration.url.border=URL
applet.configuration.use.classpath.and.jdk.of.module.label=Use classpath and JDK of m&odule:
applet.configuration.vm.parameters.for.appletviewer.label=&VM parameters for appletviewer:
applet.configuration.policy.file.label=&Policy file:
applet.configuration.parameter.name.column=Name
applet.configuration.parameter.value.column=Value
class.not.specified.error.message=Class not specified.
failed.to.generate.wrapper.error.message=Failed to generate temporary html wrapper for applet class
application.configuration.use.classpath.and.jdk.of.module.label=Use classpath and JDK of m&odule:
application.configuration.main.class.label=Main &class:
jre.path.is.not.valid.jre.home.error.mesage=''{0}'' is not valid JRE home
main.method.not.found.in.class.error.message=Main method not found in class {0}
no.user.process.input.error.message=No process input
fix.run.configuration.problem.button=Fix
class.isnt.test.class.error.message={0} isn''t test class
class.isnt.inheritor.of.testcase.error.message={0} isn''t inheritor of TestCase
junit.jar.not.found.in.module.class.path.error.message=junit.jar not found in module ''{0}'' class path.
method.name.not.specified.error.message=Method name not specified
test.method.doesnt.exist.error.message=Test method ''{0}'' doesn''t exist
no.tests.found.in.package.error.message=No tests found in the package ''{0}''
package.does.not.exist.error.message=Package ''{0}'' does not exist
choose.main.class.dialog.title=Choose Main Class
choose.applet.class.dialog.title=Choose Applet Class
junit.configuration.test.runner.parameters.label=Test runner pa&rameters:
junit.configuration.use.classpath.and.jdk.of.module.label=Use classpath and JDK of m&odule:
junit.configuration.test.border=Test
junit.configuration.across.module.dependencies.radio=Across modu&le dependencies
junit.configuration.in.single.module.radio=In s&ingle module
junit.configuration.in.whole.project.radio=In &whole project
junit.configuration.search.for.tests.label=Search for tests:
junit.configuration.package.label=Packa&ge:
junit.configuration.method.label=M&ethod:
junit.configuration.class.label=&Class:
junit.configuration.configure.junit.test.label=Test:
junit.configuration.test.method.radio=Test Method
junit.configuration.test.class.radio=Test Class
junit.configuration.class.radio=C&lass
junit.configuration.method.radio=Me&thod
jnit.configuration.all.tests.in.package.radio=All Tests in Package
junit.configuration.all.in.package.radio=All in &Package
no.jdk.specified.for.module.warning.text=No JDK specified for module ''{0}''
module.not.specified.error.text=Module not specified
module.doesn.t.exist.in.project.error.text=Module ''{0}'' doesn''t exist in project
run.configuration.unnamed.name.prefix=Unnamed
no.applet.class.specified.error.message=No applet class specified
no.main.class.specified.error.text=No main class specified
action.name.save.configuration=Save Configuration
#2 - configuration type description
empty.run.configuration.panel.text.label=<html><body><br><br><font face=\"{0}\" size=\"-1\">Press the <a href=\"add\"><image src=\"{1}\" border=\"0\"></a> \\&nbsp; button \
to create a new {3} based on default settings.</font></body></html>
default.package.presentable.name=<default>
default.package.configuration.name=default package
no.test.class.specified.error.text=No test class specified
edit.run.configuration.run.configuration.name.label=&Name:
default.junit.configuration.name=<no-name>
strings.equal.failed.dialog.title=Comparison failure
junit.runing.info.test.column.name=Test
junit.runing.info.time.elapsed.column.name=Time elapsed
junit.runing.info.usage.delta.column.name=Usage Delta
junit.runing.info.usage.before.column.name=Usage Before
junit.runing.info.usage.after.column.name=Usage After
junit.runing.info.results.column.name=Results
junit.runing.info.loading.tree.node.text=loading
remote.configuration.settings.border=Settings
remote.configuration.transport.label=Transport:
remote.configuration.listen.radio=Listen
remote.configuration.attach.radio=Attach
remote.configuration.debugger.mode.label=Debugger mode:
remote.configuration.shared.memory.radio=Shared memory
remote.configuration.socket.radio=Socket
remote.configuration.shared.memory.address.label=Shared memory address:
remote.configuration.port.label=Port:
remote.configuration.host.label=Host:
remote.configuration.remote.debugging.allows.you.to.connect.idea.to.a.running.jvm.label=Remote debugging allows you to connect IDEA to a running JVM.
standard.runner.description=Run selected configuration
environment.variables.helper.use.arguments.label=<html><body>Use the following command line arguments for running remote JVM (you may copy and paste them)</body></html>
environment.variables.helper.use.arguments.jdk13.label=<html><body>If the application runs on JDK 1.3.x or earlier, use following arguments</body></html>
select.run.configuration.for.item.action.name=Select {0}
save.run.configuration.for.item.action.name=Save {0}
junit.runing.info.status.done.count=Done: {0}
junit.runing.info.status.terminated.count=Terminated: {0}
junit.runing.info.tests.in.progress.done.tree.node=Tests in Progress: Done
junit.runing.info.tests.in.progress.terminated.tre.node=Tests in Progress: Terminated
delete.confirmation.dialog.title=Delete Confirmation
move.up.action.name=Move Up
move.down.action.name=Move Down
memory.available.message={0} Kb
#code coverage
enable.coverage.with.emma=Record code &coverage information
merge.coverage.data=&Merge gathered coverage with suite chosen below
record.coverage.filters.title=Packages and classes to record coverage data
coverage.tab.title=Code Coverage
show.swing.inspector=&Enable capturing form snapshots
show.swing.inspector.disabled=&Enable capturing form snapshots (requires JRE 5.0 or higher)
before.run.property.make=Make
run.configuration.store.place.option=&Share configuration
run.configuration.default.type.description=configuration
#GeneralCommandLine
run.configuration.error.no.jdk.specified=No JDK specified
run.configuration.cannot.find.vm.executable=Cannot find VM executable
logs.tab.title=Logs
before.launch.panel.title=Before launch
action.name.save.as.configuration=Save As
default.junit.config.name.all.in.module=All in {0}
default.junit.config.name.all.in.package.in.module={0} in {1}
environment.variables.dialog.title=Environment Variables
environment.variables.component.title=&Environment Variables
down.the.stack.trace=Down the stack trace
up.the.stack.trace=Up the stack trace
configuration.action.chooser.title=Choose configuration type to run
env.vars.checkbox.title=&Include parent environment variables
before.launch.compile.step=Make
execute.before.run.debug.dialog.title=Execute {0} Before Run/Debug
export.test.results.filename=Test Results - {0}
export.test.results.succeeded=<html>Test results exported successfully to <a href="#a">{0}</a></html>
export.test.results.failed=Test results export failed: {0}
export.test.results.custom.template.chooser.title=Choose Custom Template
export.test.results.output.folder.chooser.title=Choose Output Folder
export.test.results.custom.template.path.empty=User-defined tempate path is empty
export.test.results.custom.template.not.found=User-defined tempate file ''{0}'' is not found
export.test.results.task.name=Exporting test results
export.test.results.open.editor=O&pen exported file in editor
export.test.results.open.browser=O&pen exported file in browser
export.test.results.dialog.title=Export Test Results
export.test.results.output.path.empty=Output path is empty
export.test.results.output.filename.empty=Output file name is empty
@@ -1,256 +1,256 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.xdebugger.impl.ui;
import com.intellij.debugger.ui.DebuggerContentInfo;
import com.intellij.execution.DefaultExecutionResult;
import com.intellij.execution.ExecutionResult;
import com.intellij.execution.Executor;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.executors.DefaultDebugExecutor;
import com.intellij.execution.process.ProcessAdapter;
import com.intellij.execution.process.ProcessEvent;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.runners.ProgramRunner;
import com.intellij.execution.runners.RestartAction;
import com.intellij.execution.runners.RunContentBuilder;
import com.intellij.execution.ui.*;
import com.intellij.execution.ui.actions.CloseAction;
import com.intellij.execution.ui.layout.PlaceInGrid;
import com.intellij.ide.CommonActionsManager;
import com.intellij.ide.actions.ContextHelpAction;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.tabs.PinToolwindowTabAction;
import com.intellij.util.ArrayUtil;
import com.intellij.xdebugger.XDebugProcess;
import com.intellij.xdebugger.XDebugSession;
import com.intellij.xdebugger.XDebuggerBundle;
import com.intellij.xdebugger.impl.XDebugSessionImpl;
import com.intellij.xdebugger.impl.actions.XDebuggerActions;
import com.intellij.xdebugger.impl.frame.XDebugViewBase;
import com.intellij.xdebugger.impl.frame.XFramesView;
import com.intellij.xdebugger.impl.frame.XVariablesView;
import com.intellij.xdebugger.impl.frame.XWatchesView;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* @author spleaner
*/
public class XDebugSessionTab extends DebuggerSessionTabBase {
private final String mySessionName;
private final RunnerLayoutUi myUi;
private XWatchesView myWatchesView;
private final List<XDebugViewBase> myViews = new ArrayList<XDebugViewBase>();
public XDebugSessionTab(@NotNull final Project project, @NotNull final String sessionName) {
super(project);
mySessionName = sessionName;
myUi = RunnerLayoutUi.Factory.getInstance(project).create("Debug", "unknown!", sessionName, this);
myUi.getDefaults().initTabDefaults(0, "Debug", null);
myUi.getOptions().setTopToolbar(createTopToolbar(), ActionPlaces.DEBUGGER_TOOLBAR);
}
private Content createConsoleContent() {
return myUi.createContent(DebuggerContentInfo.CONSOLE_CONTENT, myConsole.getComponent(),
XDebuggerBundle.message("debugger.session.tab.console.content.name"), XDebuggerUIConstants.CONSOLE_TAB_ICON,
myConsole.getPreferredFocusableComponent());
}
private Content createVariablesContent(final XDebugSession session) {
final XVariablesView variablesView = new XVariablesView(session, this);
myViews.add(variablesView);
return myUi.createContent(DebuggerContentInfo.VARIABLES_CONTENT, variablesView.getPanel(),
XDebuggerBundle.message("debugger.session.tab.variables.title"), XDebuggerUIConstants.VARIABLES_TAB_ICON, null);
}
private Content createWatchesContent(final XDebugSession session, final XDebugSessionData sessionData) {
myWatchesView = new XWatchesView(session, this, sessionData);
myViews.add(myWatchesView);
Content watchesContent = myUi.createContent(DebuggerContentInfo.WATCHES_CONTENT, myWatchesView.getMainPanel(),
XDebuggerBundle.message("debugger.session.tab.watches.title"), XDebuggerUIConstants.WATCHES_TAB_ICON, null);
ActionGroup group = (ActionGroup)ActionManager.getInstance().getAction(XDebuggerActions.WATCHES_TREE_TOOLBAR_GROUP);
watchesContent.setActions(group, ActionPlaces.DEBUGGER_TOOLBAR, myWatchesView.getTree());
return watchesContent;
}
private Content createFramesContent(final XDebugSession session) {
final XFramesView framesView = new XFramesView(session, this);
myViews.add(framesView);
Content framesContent = myUi.createContent(DebuggerContentInfo.FRAME_CONTENT, framesView.getMainPanel(),
XDebuggerBundle.message("debugger.session.tab.frames.title"), XDebuggerUIConstants.FRAMES_TAB_ICON, null);
final DefaultActionGroup framesGroup = new DefaultActionGroup();
CommonActionsManager actionsManager = CommonActionsManager.getInstance();
framesGroup.add(actionsManager.createPrevOccurenceAction(framesView.getFramesList()));
framesGroup.add(actionsManager.createNextOccurenceAction(framesView.getFramesList()));
framesContent.setActions(framesGroup, ActionPlaces.DEBUGGER_TOOLBAR, framesView.getFramesList());
return framesContent;
}
private static DefaultActionGroup createTopToolbar() {
DefaultActionGroup stepping = new DefaultActionGroup();
ActionManager actionManager = ActionManager.getInstance();
stepping.add(actionManager.getAction(XDebuggerActions.SHOW_EXECUTION_POINT));
stepping.addSeparator();
stepping.add(actionManager.getAction(XDebuggerActions.STEP_OVER));
stepping.add(actionManager.getAction(XDebuggerActions.STEP_INTO));
stepping.add(actionManager.getAction(XDebuggerActions.FORCE_STEP_INTO));
stepping.add(actionManager.getAction(XDebuggerActions.STEP_OUT));
stepping.addSeparator();
stepping.add(actionManager.getAction(XDebuggerActions.RUN_TO_CURSOR));
return stepping;
}
public XDebugSessionData saveData() {
final List<String> watchExpressions = myWatchesView.getWatchExpressions();
return new XDebugSessionData(ArrayUtil.toStringArray(watchExpressions));
}
public ExecutionConsole getConsole() {
return myConsole;
}
public String getSessionName() {
return mySessionName;
}
public void rebuildViews() {
for (XDebugViewBase view : myViews) {
view.rebuildView();
}
}
public RunContentDescriptor attachToSession(final @NotNull XDebugSession session, final @Nullable ProgramRunner runner,
final @Nullable ExecutionEnvironment env,
final @NotNull XDebugSessionData sessionData) {
return initUI(session, sessionData, env, runner);
}
@NotNull
private static ExecutionResult createExecutionResult(@NotNull final XDebugSession session) {
final XDebugProcess debugProcess = session.getDebugProcess();
ProcessHandler processHandler = debugProcess.getProcessHandler();
processHandler.addProcessListener(new ProcessAdapter() {
public void processTerminated(final ProcessEvent event) {
((XDebugSessionImpl)session).stopImpl();
}
});
return new DefaultExecutionResult(debugProcess.createConsole(), processHandler);
}
public XWatchesView getWatchesView() {
return myWatchesView;
}
private RunContentDescriptor initUI(final @NotNull XDebugSession session, final @NotNull XDebugSessionData sessionData,
final @Nullable ExecutionEnvironment environment, final @Nullable ProgramRunner runner) {
ExecutionResult executionResult = createExecutionResult(session);
myConsole = executionResult.getExecutionConsole();
myRunContentDescriptor = new RunContentDescriptor(myConsole, executionResult.getProcessHandler(), myUi.getComponent(), getSessionName());
myUi.addContent(createFramesContent(session), 0, PlaceInGrid.left, false);
myUi.addContent(createVariablesContent(session), 0, PlaceInGrid.center, false);
myUi.addContent(createWatchesContent(session, sessionData), 0, PlaceInGrid.right, false);
final Content consoleContent = createConsoleContent();
myUi.addContent(consoleContent, 1, PlaceInGrid.bottom, false);
if (myConsole instanceof ObservableConsoleView) {
ObservableConsoleView observable = (ObservableConsoleView)myConsole;
observable.addChangeListener(new ObservableConsoleView.ChangeListener() {
public void contentAdded(final Collection<ConsoleViewContentType> types) {
if (types.contains(ConsoleViewContentType.ERROR_OUTPUT) || types.contains(ConsoleViewContentType.SYSTEM_OUTPUT)) {
consoleContent.fireAlert();
}
}
}, consoleContent);
}
session.getDebugProcess().registerAdditionalContent(myUi);
RunContentBuilder.addAdditionalConsoleEditorActions(myConsole, consoleContent);
myUi.addContent(consoleContent, 0, PlaceInGrid.bottom, false);
if (ApplicationManager.getApplication().isUnitTestMode()) {
return myRunContentDescriptor;
}
DefaultActionGroup group = new DefaultActionGroup();
final Executor executor = DefaultDebugExecutor.getDebugExecutorInstance();
if (runner != null && environment != null) {
RestartAction restartAction = new RestartAction(executor, runner, myRunContentDescriptor.getProcessHandler(), XDebuggerUIConstants.DEBUG_AGAIN_ICON,
myRunContentDescriptor, environment);
group.add(restartAction);
restartAction.registerShortcut(myUi.getComponent());
}
addActionToGroup(group, XDebuggerActions.RESUME);
addActionToGroup(group, XDebuggerActions.PAUSE);
addActionToGroup(group, IdeActions.ACTION_STOP_PROGRAM);
group.addSeparator();
addActionToGroup(group, XDebuggerActions.VIEW_BREAKPOINTS);
addActionToGroup(group, XDebuggerActions.MUTE_BREAKPOINTS);
group.addSeparator();
//addAction(group, DebuggerActions.EXPORT_THREADS);
group.addSeparator();
group.add(myUi.getOptions().getLayoutActions());
group.addSeparator();
group.add(PinToolwindowTabAction.getPinAction());
group.add(new CloseAction(executor, myRunContentDescriptor, getProject()));
group.add(new ContextHelpAction(executor.getHelpId()));
myUi.getOptions().setLeftToolbar(group, ActionPlaces.DEBUGGER_TOOLBAR);
if (environment != null) {
final RunProfile runConfiguration = environment.getRunProfile();
registerFileMatcher(runConfiguration);
initLogConsoles(runConfiguration, myRunContentDescriptor.getProcessHandler());
}
rebuildViews();
return myRunContentDescriptor;
}
private static void addActionToGroup(final DefaultActionGroup group, final String actionId) {
AnAction action = ActionManager.getInstance().getAction(actionId);
if (action != null) group.add(action);
}
public RunnerLayoutUi getUi() {
return myUi;
}
@Nullable
public RunContentDescriptor getRunContentDescriptor() {
return myRunContentDescriptor;
}
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.xdebugger.impl.ui;
import com.intellij.debugger.ui.DebuggerContentInfo;
import com.intellij.execution.DefaultExecutionResult;
import com.intellij.execution.ExecutionResult;
import com.intellij.execution.Executor;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.executors.DefaultDebugExecutor;
import com.intellij.execution.process.ProcessAdapter;
import com.intellij.execution.process.ProcessEvent;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.runners.ProgramRunner;
import com.intellij.execution.runners.RestartAction;
import com.intellij.execution.runners.RunContentBuilder;
import com.intellij.execution.ui.*;
import com.intellij.execution.ui.actions.CloseAction;
import com.intellij.execution.ui.layout.PlaceInGrid;
import com.intellij.ide.CommonActionsManager;
import com.intellij.ide.actions.ContextHelpAction;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.tabs.PinToolwindowTabAction;
import com.intellij.util.ArrayUtil;
import com.intellij.xdebugger.XDebugProcess;
import com.intellij.xdebugger.XDebugSession;
import com.intellij.xdebugger.XDebuggerBundle;
import com.intellij.xdebugger.impl.XDebugSessionImpl;
import com.intellij.xdebugger.impl.actions.XDebuggerActions;
import com.intellij.xdebugger.impl.frame.XDebugViewBase;
import com.intellij.xdebugger.impl.frame.XFramesView;
import com.intellij.xdebugger.impl.frame.XVariablesView;
import com.intellij.xdebugger.impl.frame.XWatchesView;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* @author spleaner
*/
public class XDebugSessionTab extends DebuggerSessionTabBase {
private final String mySessionName;
private final RunnerLayoutUi myUi;
private XWatchesView myWatchesView;
private final List<XDebugViewBase> myViews = new ArrayList<XDebugViewBase>();
public XDebugSessionTab(@NotNull final Project project, @NotNull final String sessionName) {
super(project);
mySessionName = sessionName;
myUi = RunnerLayoutUi.Factory.getInstance(project).create("Debug", "unknown!", sessionName, this);
myUi.getDefaults().initTabDefaults(0, "Debug", null);
myUi.getOptions().setTopToolbar(createTopToolbar(), ActionPlaces.DEBUGGER_TOOLBAR);
}
private Content createConsoleContent() {
return myUi.createContent(DebuggerContentInfo.CONSOLE_CONTENT, myConsole.getComponent(),
XDebuggerBundle.message("debugger.session.tab.console.content.name"), XDebuggerUIConstants.CONSOLE_TAB_ICON,
myConsole.getPreferredFocusableComponent());
}
private Content createVariablesContent(final XDebugSession session) {
final XVariablesView variablesView = new XVariablesView(session, this);
myViews.add(variablesView);
return myUi.createContent(DebuggerContentInfo.VARIABLES_CONTENT, variablesView.getPanel(),
XDebuggerBundle.message("debugger.session.tab.variables.title"), XDebuggerUIConstants.VARIABLES_TAB_ICON, null);
}
private Content createWatchesContent(final XDebugSession session, final XDebugSessionData sessionData) {
myWatchesView = new XWatchesView(session, this, sessionData);
myViews.add(myWatchesView);
Content watchesContent = myUi.createContent(DebuggerContentInfo.WATCHES_CONTENT, myWatchesView.getMainPanel(),
XDebuggerBundle.message("debugger.session.tab.watches.title"), XDebuggerUIConstants.WATCHES_TAB_ICON, null);
ActionGroup group = (ActionGroup)ActionManager.getInstance().getAction(XDebuggerActions.WATCHES_TREE_TOOLBAR_GROUP);
watchesContent.setActions(group, ActionPlaces.DEBUGGER_TOOLBAR, myWatchesView.getTree());
return watchesContent;
}
private Content createFramesContent(final XDebugSession session) {
final XFramesView framesView = new XFramesView(session, this);
myViews.add(framesView);
Content framesContent = myUi.createContent(DebuggerContentInfo.FRAME_CONTENT, framesView.getMainPanel(),
XDebuggerBundle.message("debugger.session.tab.frames.title"), XDebuggerUIConstants.FRAMES_TAB_ICON, null);
final DefaultActionGroup framesGroup = new DefaultActionGroup();
CommonActionsManager actionsManager = CommonActionsManager.getInstance();
framesGroup.add(actionsManager.createPrevOccurenceAction(framesView.getFramesList()));
framesGroup.add(actionsManager.createNextOccurenceAction(framesView.getFramesList()));
framesContent.setActions(framesGroup, ActionPlaces.DEBUGGER_TOOLBAR, framesView.getFramesList());
return framesContent;
}
private static DefaultActionGroup createTopToolbar() {
DefaultActionGroup stepping = new DefaultActionGroup();
ActionManager actionManager = ActionManager.getInstance();
stepping.add(actionManager.getAction(XDebuggerActions.SHOW_EXECUTION_POINT));
stepping.addSeparator();
stepping.add(actionManager.getAction(XDebuggerActions.STEP_OVER));
stepping.add(actionManager.getAction(XDebuggerActions.STEP_INTO));
stepping.add(actionManager.getAction(XDebuggerActions.FORCE_STEP_INTO));
stepping.add(actionManager.getAction(XDebuggerActions.STEP_OUT));
stepping.addSeparator();
stepping.add(actionManager.getAction(XDebuggerActions.RUN_TO_CURSOR));
return stepping;
}
public XDebugSessionData saveData() {
final List<String> watchExpressions = myWatchesView.getWatchExpressions();
return new XDebugSessionData(ArrayUtil.toStringArray(watchExpressions));
}
public ExecutionConsole getConsole() {
return myConsole;
}
public String getSessionName() {
return mySessionName;
}
public void rebuildViews() {
for (XDebugViewBase view : myViews) {
view.rebuildView();
}
}
public RunContentDescriptor attachToSession(final @NotNull XDebugSession session, final @Nullable ProgramRunner runner,
final @Nullable ExecutionEnvironment env,
final @NotNull XDebugSessionData sessionData) {
return initUI(session, sessionData, env, runner);
}
@NotNull
private static ExecutionResult createExecutionResult(@NotNull final XDebugSession session) {
final XDebugProcess debugProcess = session.getDebugProcess();
ProcessHandler processHandler = debugProcess.getProcessHandler();
processHandler.addProcessListener(new ProcessAdapter() {
public void processTerminated(final ProcessEvent event) {
((XDebugSessionImpl)session).stopImpl();
}
});
return new DefaultExecutionResult(debugProcess.createConsole(), processHandler);
}
public XWatchesView getWatchesView() {
return myWatchesView;
}
private RunContentDescriptor initUI(final @NotNull XDebugSession session, final @NotNull XDebugSessionData sessionData,
final @Nullable ExecutionEnvironment environment, final @Nullable ProgramRunner runner) {
ExecutionResult executionResult = createExecutionResult(session);
myConsole = executionResult.getExecutionConsole();
myRunContentDescriptor = new RunContentDescriptor(myConsole, executionResult.getProcessHandler(), myUi.getComponent(), getSessionName());
myUi.addContent(createFramesContent(session), 0, PlaceInGrid.left, false);
myUi.addContent(createVariablesContent(session), 0, PlaceInGrid.center, false);
myUi.addContent(createWatchesContent(session, sessionData), 0, PlaceInGrid.right, false);
final Content consoleContent = createConsoleContent();
myUi.addContent(consoleContent, 1, PlaceInGrid.bottom, false);
if (myConsole instanceof ObservableConsoleView) {
ObservableConsoleView observable = (ObservableConsoleView)myConsole;
observable.addChangeListener(new ObservableConsoleView.ChangeListener() {
public void contentAdded(final Collection<ConsoleViewContentType> types) {
if (types.contains(ConsoleViewContentType.ERROR_OUTPUT) || types.contains(ConsoleViewContentType.SYSTEM_OUTPUT)) {
consoleContent.fireAlert();
}
}
}, consoleContent);
}
session.getDebugProcess().registerAdditionalContent(myUi);
RunContentBuilder.addAdditionalConsoleEditorActions(myConsole, consoleContent);
myUi.addContent(consoleContent, 0, PlaceInGrid.bottom, false);
if (ApplicationManager.getApplication().isUnitTestMode()) {
return myRunContentDescriptor;
}
DefaultActionGroup group = new DefaultActionGroup();
final Executor executor = DefaultDebugExecutor.getDebugExecutorInstance();
if (runner != null && environment != null) {
RestartAction restartAction = new RestartAction(executor, runner, myRunContentDescriptor.getProcessHandler(), XDebuggerUIConstants.DEBUG_AGAIN_ICON,
myRunContentDescriptor, environment);
group.add(restartAction);
restartAction.registerShortcut(myUi.getComponent());
}
addActionToGroup(group, XDebuggerActions.RESUME);
addActionToGroup(group, XDebuggerActions.PAUSE);
addActionToGroup(group, IdeActions.ACTION_STOP_PROGRAM);
group.addSeparator();
addActionToGroup(group, XDebuggerActions.VIEW_BREAKPOINTS);
addActionToGroup(group, XDebuggerActions.MUTE_BREAKPOINTS);
group.addSeparator();
//addAction(group, DebuggerActions.EXPORT_THREADS);
group.addSeparator();
group.add(myUi.getOptions().getLayoutActions());
group.addSeparator();
group.add(PinToolwindowTabAction.getPinAction());
group.add(new CloseAction(executor, myRunContentDescriptor, getProject()));
group.add(new ContextHelpAction(executor.getHelpId()));
myUi.getOptions().setLeftToolbar(group, ActionPlaces.DEBUGGER_TOOLBAR);
if (environment != null) {
final RunProfile runConfiguration = environment.getRunProfile();
registerFileMatcher(runConfiguration);
initLogConsoles(runConfiguration, myRunContentDescriptor.getProcessHandler());
}
rebuildViews();
return myRunContentDescriptor;
}
private static void addActionToGroup(final DefaultActionGroup group, final String actionId) {
AnAction action = ActionManager.getInstance().getAction(actionId);
if (action != null) group.add(action);
}
public RunnerLayoutUi getUi() {
return myUi;
}
@Nullable
public RunContentDescriptor getRunContentDescriptor() {
return myRunContentDescriptor;
}
}
@@ -1,85 +1,85 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.xdebugger.impl.ui.tree;
import com.intellij.codeInsight.hint.HintManager;
import com.intellij.ui.SimpleColoredComponent;
import com.intellij.xdebugger.frame.XValueModifier;
import com.intellij.xdebugger.impl.ui.DebuggerUIUtil;
import com.intellij.xdebugger.impl.ui.XDebuggerUIConstants;
import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
/**
* @author nik
*/
public class SetValueInplaceEditor extends XDebuggerTreeInplaceEditor {
private final JPanel myEditorPanel;
private final XValueModifier myModifier;
private final XValueNodeImpl myValueNode;
public SetValueInplaceEditor(final XValueNodeImpl node, @NotNull final String nodeName) {
super(node, "setValue");
myValueNode = node;
myModifier = myValueNode.getValueContainer().getModifier();
myEditorPanel = new JPanel();
myEditorPanel.setLayout(new BoxLayout(myEditorPanel, BoxLayout.X_AXIS));
SimpleColoredComponent nameLabel = new SimpleColoredComponent();
nameLabel.setIcon(getNode().getIcon());
nameLabel.append(nodeName, XDebuggerUIConstants.VALUE_NAME_ATTRIBUTES);
myEditorPanel.add(nameLabel);
myEditorPanel.add(myExpressionEditor.getComponent());
final String value = myModifier != null ? myModifier.getInitialValueEditorText() : null;
myExpressionEditor.setText(value != null ? value : "");
myExpressionEditor.selectAll();
}
protected JComponent createInplaceEditorComponent() {
return myEditorPanel;
}
public void doOKAction() {
if (myModifier == null) return;
myExpressionEditor.saveTextInHistory();
final XDebuggerTreeState treeState = XDebuggerTreeState.saveState(myTree);
myValueNode.setValueModificationStarted();
myModifier.setValue(myExpressionEditor.getText(), new XValueModifier.XModificationCallback() {
public void valueModified() {
DebuggerUIUtil.invokeOnEventDispatch(new Runnable() {
public void run() {
myTree.rebuildAndRestore(treeState);
}
});
}
public void errorOccurred(@NotNull final String errorMessage) {
DebuggerUIUtil.invokeOnEventDispatch(new Runnable() {
public void run() {
myTree.rebuildAndRestore(treeState);
HintManager.getInstance().showErrorHint(myExpressionEditor.getEditor(), errorMessage);
}
});
}
});
super.doOKAction();
}
}
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.xdebugger.impl.ui.tree;
import com.intellij.codeInsight.hint.HintManager;
import com.intellij.ui.SimpleColoredComponent;
import com.intellij.xdebugger.frame.XValueModifier;
import com.intellij.xdebugger.impl.ui.DebuggerUIUtil;
import com.intellij.xdebugger.impl.ui.XDebuggerUIConstants;
import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
/**
* @author nik
*/
public class SetValueInplaceEditor extends XDebuggerTreeInplaceEditor {
private final JPanel myEditorPanel;
private final XValueModifier myModifier;
private final XValueNodeImpl myValueNode;
public SetValueInplaceEditor(final XValueNodeImpl node, @NotNull final String nodeName) {
super(node, "setValue");
myValueNode = node;
myModifier = myValueNode.getValueContainer().getModifier();
myEditorPanel = new JPanel();
myEditorPanel.setLayout(new BoxLayout(myEditorPanel, BoxLayout.X_AXIS));
SimpleColoredComponent nameLabel = new SimpleColoredComponent();
nameLabel.setIcon(getNode().getIcon());
nameLabel.append(nodeName, XDebuggerUIConstants.VALUE_NAME_ATTRIBUTES);
myEditorPanel.add(nameLabel);
myEditorPanel.add(myExpressionEditor.getComponent());
final String value = myModifier != null ? myModifier.getInitialValueEditorText() : null;
myExpressionEditor.setText(value != null ? value : "");
myExpressionEditor.selectAll();
}
protected JComponent createInplaceEditorComponent() {
return myEditorPanel;
}
public void doOKAction() {
if (myModifier == null) return;
myExpressionEditor.saveTextInHistory();
final XDebuggerTreeState treeState = XDebuggerTreeState.saveState(myTree);
myValueNode.setValueModificationStarted();
myModifier.setValue(myExpressionEditor.getText(), new XValueModifier.XModificationCallback() {
public void valueModified() {
DebuggerUIUtil.invokeOnEventDispatch(new Runnable() {
public void run() {
myTree.rebuildAndRestore(treeState);
}
});
}
public void errorOccurred(@NotNull final String errorMessage) {
DebuggerUIUtil.invokeOnEventDispatch(new Runnable() {
public void run() {
myTree.rebuildAndRestore(treeState);
HintManager.getInstance().showErrorHint(myExpressionEditor.getEditor(), errorMessage);
}
});
}
});
super.doOKAction();
}
}