diff --git a/java/debugger/impl/src/com/intellij/debugger/DebugUIEnvironment.java b/java/debugger/impl/src/com/intellij/debugger/DebugUIEnvironment.java index 8c89bada270d..04f4d583cf99 100644 --- a/java/debugger/impl/src/com/intellij/debugger/DebugUIEnvironment.java +++ b/java/debugger/impl/src/com/intellij/debugger/DebugUIEnvironment.java @@ -15,7 +15,6 @@ */ package com.intellij.debugger; -import com.intellij.diagnostic.logging.LogFilesManager; import com.intellij.execution.configurations.RunProfile; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.openapi.actionSystem.DefaultActionGroup; @@ -37,8 +36,6 @@ public interface DebugUIEnvironment { @Nullable Icon getIcon(); - void initLogs(RunContentDescriptor content, LogFilesManager logFilesManager); - void initActions(RunContentDescriptor content, DefaultActionGroup actionGroup); @Nullable diff --git a/java/debugger/impl/src/com/intellij/debugger/DefaultDebugUIEnvironment.java b/java/debugger/impl/src/com/intellij/debugger/DefaultDebugUIEnvironment.java index f29f3bfe572d..6f8b13e4d06a 100644 --- a/java/debugger/impl/src/com/intellij/debugger/DefaultDebugUIEnvironment.java +++ b/java/debugger/impl/src/com/intellij/debugger/DefaultDebugUIEnvironment.java @@ -15,14 +15,10 @@ */ package com.intellij.debugger; -import com.intellij.diagnostic.logging.LogFilesManager; -import com.intellij.diagnostic.logging.OutputFileUtil; import com.intellij.execution.Executor; import com.intellij.execution.configurations.RemoteConnection; -import com.intellij.execution.configurations.RunConfigurationBase; import com.intellij.execution.configurations.RunProfile; import com.intellij.execution.configurations.RunProfileState; -import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.runners.RestartAction; import com.intellij.execution.ui.RunContentDescriptor; @@ -63,21 +59,6 @@ public class DefaultDebugUIEnvironment implements DebugUIEnvironment { return getRunProfile().getIcon(); } - @Override - public void initLogs(RunContentDescriptor content, LogFilesManager logFilesManager) { - ProcessHandler processHandler = content.getProcessHandler(); - if (getRunProfile() instanceof RunConfigurationBase) { - RunConfigurationBase runConfiguration = (RunConfigurationBase)getRunProfile(); - - logFilesManager.registerFileMatcher(runConfiguration); - - if (processHandler != null) { - logFilesManager.initLogConsoles(runConfiguration, processHandler); - OutputFileUtil.attachDumpListener(runConfiguration, processHandler, content.getExecutionConsole()); - } - } - } - @Override public void initActions(RunContentDescriptor content, DefaultActionGroup actionGroup) { Executor executor = myExecutionEnvironment.getExecutor(); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java index 600a605d0139..87d2f73124df 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java @@ -41,7 +41,6 @@ import com.intellij.execution.filters.TextConsoleBuilder; import com.intellij.execution.filters.TextConsoleBuilderFactory; import com.intellij.execution.ui.ConsoleView; import com.intellij.execution.ui.ExecutionConsoleEx; -import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.execution.ui.RunnerLayoutUi; import com.intellij.execution.ui.layout.PlaceInGrid; import com.intellij.icons.AllIcons; @@ -109,7 +108,7 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos if (XDebuggerSettingsManager.getInstanceImpl().getGeneralSettings().isHideDebuggerOnProcessTermination()) { try { - ExecutionManager.getInstance(getProject()).getContentManager().hideRunContent(DefaultDebugExecutor.getDebugExecutorInstance(), myRunContentDescriptor); + ExecutionManager.getInstance(project).getContentManager().hideRunContent(DefaultDebugExecutor.getDebugExecutorInstance(), myRunContentDescriptor); } catch (NullPointerException e) { //if we can get closeProcess after the project have been closed @@ -130,8 +129,8 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos topToolbar.add(Separator.getInstance(), new Constraints(Anchor.AFTER, DebuggerActions.POP_FRAME)); myUi.getOptions().setTopToolbar(topToolbar, ActionPlaces.DEBUGGER_TOOLBAR); - myWatchPanel = new MainWatchPanel(getProject(), getContextManager()); - myFramesPanel = new FramesPanel(getProject(), getContextManager()); + myWatchPanel = new MainWatchPanel(project, getContextManager()); + myFramesPanel = new FramesPanel(project, getContextManager()); final AlertIcon breakpointAlert = new AlertIcon(AllIcons.Debugger.BreakpointAlert); @@ -151,7 +150,7 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos myUi.addContent(framesContent, 0, PlaceInGrid.left, false); // variables - myVariablesPanel = new VariablesPanel(getProject(), myStateManager, this); + myVariablesPanel = new VariablesPanel(project, myStateManager, this); myVariablesPanel.getFrameTree().setAutoVariablesMode(debuggerSettings.AUTO_VARIABLES_MODE); Content vars = myUi.createContent(DebuggerContentInfo.VARIABLES_CONTENT, myVariablesPanel, XDebuggerBundle.message("debugger.session.tab.variables.title"), AllIcons.Debugger.Value, null); @@ -202,8 +201,8 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos ExecutionResult executionResult = debuggerSession.getProcess().getExecutionResult(); myConsole = executionResult.getExecutionConsole(); - myRunContentDescriptor = new RunContentDescriptor(myConsole, executionResult.getProcessHandler(), myUi.getComponent(), getSessionName(), - environment.getIcon()); +// myRunContentDescriptor = new RunContentDescriptor(myConsole, executionResult.getProcessHandler(), myUi.getComponent(), getSessionName(), +// environment.getIcon()); initUI(executionResult); } @@ -226,11 +225,6 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos return myWatchPanel; } - @Override - public RunContentDescriptor getRunContentDescriptor() { - return myRunContentDescriptor; - } - private void initUI(ExecutionResult executionResult) { if (ApplicationManager.getApplication().isUnitTestMode()) { return; diff --git a/java/execution/impl/src/com/intellij/execution/impl/DefaultJavaProgramRunner.java b/java/execution/impl/src/com/intellij/execution/impl/DefaultJavaProgramRunner.java index 626a47509144..7f5ae45f3348 100644 --- a/java/execution/impl/src/com/intellij/execution/impl/DefaultJavaProgramRunner.java +++ b/java/execution/impl/src/com/intellij/execution/impl/DefaultJavaProgramRunner.java @@ -97,11 +97,12 @@ public class DefaultJavaProgramRunner extends JavaPatchableProgramRunner { onProcessStarted(env.getRunnerSettings(), executionResult); final RunContentBuilder contentBuilder = new RunContentBuilder(executionResult, env); - Disposer.register(env.getProject(), contentBuilder); if (shouldAddDefaultActions) { addDefaultActions(contentBuilder); } - return contentBuilder.showRunContent(env.getContentToReuse()); + RunContentDescriptor contentDescriptor = contentBuilder.showRunContent(env.getContentToReuse()); + Disposer.register(env.getProject(), contentDescriptor); + return contentDescriptor; } @Deprecated @@ -116,7 +117,7 @@ public class DefaultJavaProgramRunner extends JavaPatchableProgramRunner { final ExecutionResult executionResult = contentBuilder.getExecutionResult(); final ExecutionConsole executionConsole = executionResult.getExecutionConsole(); final JComponent consoleComponent = executionConsole != null ? executionConsole.getComponent() : null; - final ControlBreakAction controlBreakAction = new ControlBreakAction(contentBuilder.getProcessHandler()); + final ControlBreakAction controlBreakAction = new ControlBreakAction(executionResult.getProcessHandler()); if (consoleComponent != null) { controlBreakAction.registerCustomShortcutSet(controlBreakAction.getShortcutSet(), consoleComponent); final ProcessHandler processHandler = executionResult.getProcessHandler(); @@ -130,7 +131,7 @@ public class DefaultJavaProgramRunner extends JavaPatchableProgramRunner { }); } contentBuilder.addAction(controlBreakAction); - contentBuilder.addAction(new SoftExitAction(contentBuilder.getProcessHandler())); + contentBuilder.addAction(new SoftExitAction(executionResult.getProcessHandler())); } diff --git a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/runtime/deployment/debug/JavaDebuggerLauncherImpl.java b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/runtime/deployment/debug/JavaDebuggerLauncherImpl.java index 0ff284e054dd..c56597c938c2 100644 --- a/java/remote-servers/impl/src/com/intellij/remoteServer/impl/runtime/deployment/debug/JavaDebuggerLauncherImpl.java +++ b/java/remote-servers/impl/src/com/intellij/remoteServer/impl/runtime/deployment/debug/JavaDebuggerLauncherImpl.java @@ -7,7 +7,6 @@ import com.intellij.debugger.engine.DebugProcess; import com.intellij.debugger.engine.DebugProcessAdapter; import com.intellij.debugger.engine.RemoteDebugProcessHandler; import com.intellij.debugger.ui.DebuggerPanelsManager; -import com.intellij.diagnostic.logging.LogFilesManager; import com.intellij.execution.*; import com.intellij.execution.configurations.RemoteConnection; import com.intellij.execution.configurations.RunProfile; @@ -97,10 +96,6 @@ public class JavaDebuggerLauncherImpl extends JavaDebuggerLauncher { return myExecutionEnvironment.getRunProfile().getIcon(); } - @Override - public void initLogs(RunContentDescriptor content, LogFilesManager logFilesManager) { - } - @Override public void initActions(RunContentDescriptor content, DefaultActionGroup actionGroup) { actionGroup.add(new CloseAction(myExecutionEnvironment.getExecutor(), content, myExecutionEnvironment.getProject())); diff --git a/platform/lang-api/src/com/intellij/execution/configurations/LogFileOptions.java b/platform/lang-api/src/com/intellij/execution/configurations/LogFileOptions.java index 6f23831c9e3a..0a4132d83a52 100644 --- a/platform/lang-api/src/com/intellij/execution/configurations/LogFileOptions.java +++ b/platform/lang-api/src/com/intellij/execution/configurations/LogFileOptions.java @@ -20,6 +20,8 @@ import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.JDOMExternalizable; import com.intellij.openapi.util.WriteExternalException; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.util.SmartList; +import com.intellij.util.containers.SmartHashSet; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -27,8 +29,7 @@ import org.jetbrains.annotations.Nullable; import java.io.File; import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.HashSet; +import java.util.Collections; import java.util.List; import java.util.Set; import java.util.regex.Pattern; @@ -80,46 +81,50 @@ public class LogFileOptions implements JDOMExternalizable { return myPathPattern; } + @NotNull public Set getPaths(){ - Set result = new HashSet(); - final File logFile = new File(myPathPattern); + File logFile = new File(myPathPattern); if (logFile.exists()){ - result.add(myPathPattern); + return Collections.singleton(myPathPattern); + } + + int dirIndex = myPathPattern.lastIndexOf(File.separator); + if (dirIndex == -1) { + return Collections.emptySet(); + } + + List files = new SmartList(); + collectMatchedFiles(new File(myPathPattern.substring(0, dirIndex)), Pattern.compile(FileUtil.convertAntToRegexp(myPathPattern.substring(dirIndex + File.separator.length()))), files); + if (files.isEmpty()) { + return Collections.emptySet(); + } + + if (myShowAll) { + SmartHashSet result = new SmartHashSet(); + result.ensureCapacity(files.size()); + for (File file : files) { + result.add(file.getPath()); + } return result; } - final int dirIndex = myPathPattern.lastIndexOf(File.separator); - if (dirIndex != -1) { - final ArrayList files = new ArrayList(); - final String basePath = myPathPattern.substring(0, dirIndex); - final String pattern = myPathPattern.substring(dirIndex + File.separator.length()); - collectMatchedFiles(new File(basePath), Pattern.compile(FileUtil.convertAntToRegexp(pattern)), files); - if (!files.isEmpty()) { - if (myShowAll) { - for (File file : files) { - result.add(file.getPath()); + else { + File lastFile = null; + for (File file : files) { + if (lastFile != null) { + if (file.lastModified() > lastFile.lastModified()) { + lastFile = file; } } else { - File lastFile = null; - for (File file : files) { - if (lastFile != null) { - if (file.lastModified() > lastFile.lastModified()) { - lastFile = file; - } - } - else { - lastFile = file; - } - } - assert lastFile != null; - result.add(lastFile.getPath()); + lastFile = file; } } + assert lastFile != null; + return Collections.singleton(lastFile.getPath()); } - return result; } - public static void collectMatchedFiles(final File root, final Pattern pattern, final List files) { + public static void collectMatchedFiles(@NotNull File root, @NotNull Pattern pattern, @NotNull List files) { final File[] dirs = root.listFiles(); if (dirs == null) return; for (File dir : dirs) { diff --git a/platform/lang-api/src/com/intellij/execution/configurations/RunConfigurationBase.java b/platform/lang-api/src/com/intellij/execution/configurations/RunConfigurationBase.java index 0e852c6c577a..0fbf78a09d8f 100644 --- a/platform/lang-api/src/com/intellij/execution/configurations/RunConfigurationBase.java +++ b/platform/lang-api/src/com/intellij/execution/configurations/RunConfigurationBase.java @@ -24,13 +24,13 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.openapi.util.WriteExternalException; +import com.intellij.util.SmartList; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.util.ArrayList; import java.util.List; /** @@ -44,8 +44,8 @@ public abstract class RunConfigurationBase extends UserDataHolderBase private final Project myProject; private String myName = ""; - private ArrayList myLogFiles = new ArrayList(); - private ArrayList myPredefinedLogFiles = new ArrayList(); + private List myLogFiles = new SmartList(); + private List myPredefinedLogFiles = new SmartList(); @NonNls private static final String LOG_FILE = "log_file"; @NonNls private static final String PREDEFINED_LOG_FILE_ELEMENT = "predefined_log_file"; @@ -127,8 +127,8 @@ public abstract class RunConfigurationBase extends UserDataHolderBase @Override public RunConfiguration clone() { final RunConfigurationBase runConfiguration = (RunConfigurationBase)super.clone(); - runConfiguration.myLogFiles = new ArrayList(myLogFiles); - runConfiguration.myPredefinedLogFiles = new ArrayList(myPredefinedLogFiles); + runConfiguration.myLogFiles = new SmartList(myLogFiles); + runConfiguration.myPredefinedLogFiles = new SmartList(myPredefinedLogFiles); runConfiguration.myFileOutputPath = myFileOutputPath; runConfiguration.mySaveOutput = mySaveOutput; runConfiguration.myShowConsoleOnStdOut = myShowConsoleOnStdOut; @@ -150,12 +150,13 @@ public abstract class RunConfigurationBase extends UserDataHolderBase myPredefinedLogFiles.add(predefinedLogFile); } - public ArrayList getPredefinedLogFiles() { + public List getPredefinedLogFiles() { return myPredefinedLogFiles; } - public ArrayList getAllLogFiles() { - final ArrayList list = new ArrayList(myLogFiles); + @NotNull + public List getAllLogFiles() { + List list = new SmartList(myLogFiles); for (PredefinedLogFile predefinedLogFile : myPredefinedLogFiles) { final LogFileOptions options = getOptionsForPredefinedLogFile(predefinedLogFile); if (options != null) { @@ -165,7 +166,7 @@ public abstract class RunConfigurationBase extends UserDataHolderBase return list; } - public ArrayList getLogFiles() { + public List getLogFiles() { return myLogFiles; } diff --git a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConfigurationPanel.java b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConfigurationPanel.java index b043b3e294a2..305af75de669 100644 --- a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConfigurationPanel.java +++ b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConfigurationPanel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.intellij.diagnostic.logging; import com.intellij.diagnostic.DiagnosticBundle; @@ -32,10 +31,12 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.*; import com.intellij.ui.components.JBCheckBox; import com.intellij.ui.table.TableView; +import com.intellij.util.SmartList; import com.intellij.util.ui.AbstractTableCellEditor; import com.intellij.util.ui.CellEditorComponentWithBrowseButton; import com.intellij.util.ui.ColumnInfo; import com.intellij.util.ui.ListTableModel; +import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -44,7 +45,6 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -61,19 +61,20 @@ public class LogConfigurationPanel extends Setti private TextFieldWithBrowseButton myOutputFile; private JCheckBox myShowConsoleOnStdOutCb; private JCheckBox myShowConsoleOnStdErrCb; - private final Map myLog2Predefined = new HashMap(); - private final List myUnresolvedPredefined = new ArrayList(); - - private final ColumnInfo IS_SHOW = new MyIsActiveColumnInfo(); - private final ColumnInfo FILE = new MyLogFileColumnInfo(); - private final ColumnInfo IS_SKIP_CONTENT = new MyIsSkipColumnInfo(); + private final Map myLog2Predefined = new THashMap(); + private final List myUnresolvedPredefined = new SmartList(); public LogConfigurationPanel() { + ColumnInfo IS_SHOW = new MyIsActiveColumnInfo(); + ColumnInfo FILE = new MyLogFileColumnInfo(); + ColumnInfo IS_SKIP_CONTENT = new MyIsSkipColumnInfo(); + myModel = new ListTableModel(IS_SHOW, FILE, IS_SKIP_CONTENT); myFilesTable = new TableView(myModel); myFilesTable.getEmptyText().setText(DiagnosticBundle.message("log.monitor.no.files")); final JTableHeader tableHeader = myFilesTable.getTableHeader(); + @SuppressWarnings("ConstantConditions") final FontMetrics fontMetrics = tableHeader.getFontMetrics(tableHeader.getFont()); int preferredWidth = fontMetrics.stringWidth(IS_SHOW.getName()) + 20; @@ -109,7 +110,7 @@ public class LogConfigurationPanel extends Setti public void run(AnActionButton button) { TableUtil.stopEditing(myFilesTable); final int[] selected = myFilesTable.getSelectedRows(); - if (selected == null || selected.length == 0) return; + if (selected.length == 0) return; for (int i = selected.length - 1; i >= 0; i--) { myModel.removeRow(selected[i]); } @@ -130,8 +131,8 @@ public class LogConfigurationPanel extends Setti @Override public void run(AnActionButton button) { final int selectedRow = myFilesTable.getSelectedRow(); - final LogFileOptions selectedOptions = myFilesTable.getSelectedObject(); - showEditorDialog(selectedOptions); + //noinspection ConstantConditions + showEditorDialog(myFilesTable.getSelectedObject()); myModel.fireTableDataChanged(); myFilesTable.setRowSelectionInterval(selectedRow, selectedRow); } @@ -156,7 +157,7 @@ public class LogConfigurationPanel extends Setti TextComponentAccessor.TEXT_FIELD_WHOLE_TEXT); myRedirectOutputCb.addActionListener(new ActionListener() { @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(@NotNull ActionEvent e) { myOutputFile.setEnabled(myRedirectOutputCb.isSelected()); } }); @@ -218,14 +219,14 @@ public class LogConfigurationPanel extends Setti @Override protected void resetEditorFrom(final RunConfigurationBase configuration) { ArrayList list = new ArrayList(); - final ArrayList logFiles = configuration.getLogFiles(); + final List logFiles = configuration.getLogFiles(); for (LogFileOptions setting : logFiles) { list.add( new LogFileOptions(setting.getName(), setting.getPathPattern(), setting.isEnabled(), setting.isSkipContent(), setting.isShowAll())); } myLog2Predefined.clear(); myUnresolvedPredefined.clear(); - final ArrayList predefinedLogFiles = configuration.getPredefinedLogFiles(); + final List predefinedLogFiles = configuration.getPredefinedLogFiles(); for (PredefinedLogFile predefinedLogFile : predefinedLogFiles) { PredefinedLogFile logFile = new PredefinedLogFile(predefinedLogFile); final LogFileOptions options = configuration.getOptionsForPredefinedLogFile(logFile); @@ -306,8 +307,9 @@ public class LogConfigurationPanel extends Setti @Override public TableCellRenderer getRenderer(final LogFileOptions p0) { return new DefaultTableCellRenderer() { + @NotNull @Override - public Component getTableCellRendererComponent(JTable table, + public Component getTableCellRendererComponent(@NotNull JTable table, Object value, boolean isSelected, boolean hasFocus, @@ -315,6 +317,7 @@ public class LogConfigurationPanel extends Setti int column) { final Component renderer = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); setText(((LogFileOptions)value).getName()); + //noinspection ConstantConditions setBackground(isSelected ? table.getSelectionBackground() : table.getBackground()); setBorder(null); return renderer; @@ -418,7 +421,7 @@ public class LogConfigurationPanel extends Setti getChildComponent().setBorder(null); myComponent.getComponentWithButton().getButton().addActionListener(new ActionListener() { @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(@NotNull ActionEvent e) { showEditorDialog(myLogFileOptions); JTextField textField = getChildComponent(); textField.setText(myLogFileOptions.getName()); diff --git a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleManager.java b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleManager.java index 08407236006d..5f96721185a9 100644 --- a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleManager.java +++ b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -13,22 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.intellij.diagnostic.logging; import com.intellij.execution.configurations.AdditionalTabComponentManager; +import com.intellij.execution.configurations.RunConfigurationBase; import org.jetbrains.annotations.NotNull; import java.nio.charset.Charset; -import java.io.Reader; - -/** - * User: anna - * Date: 01-Feb-2006 - */ public interface LogConsoleManager extends AdditionalTabComponentManager { - void addLogConsole(final String name, final String path, @NotNull Charset charset, final long skippedContent); - void addLogConsole(final String name, Reader reader, final String id); + void addLogConsole(String name, String path, @NotNull Charset charset, long skippedContent, @NotNull RunConfigurationBase runConfiguration); + void removeLogConsole(final String pathOrId); } diff --git a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleManagerBase.java b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleManagerBase.java index cb034daeaf5a..355f73f2a41e 100644 --- a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleManagerBase.java +++ b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleManagerBase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -16,8 +16,8 @@ package com.intellij.diagnostic.logging; import com.intellij.execution.configurations.RunConfigurationBase; +import com.intellij.execution.configurations.RunProfile; import com.intellij.execution.process.ProcessHandler; -import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.ui.RunnerLayoutUi; import com.intellij.openapi.Disposable; import com.intellij.openapi.project.Project; @@ -29,6 +29,7 @@ import com.intellij.ui.content.ContentManagerAdapter; import com.intellij.ui.content.ContentManagerEvent; import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.io.File; @@ -37,28 +38,13 @@ import java.nio.charset.Charset; import java.util.HashMap; import java.util.Map; -/** - * Created by IntelliJ IDEA. - * User: michael.golubev - */ public abstract class LogConsoleManagerBase implements LogConsoleManager, Disposable { - private final Project myProject; private final Map myAdditionalContent = new HashMap(); - private ExecutionEnvironment myEnvironment; private final GlobalSearchScope mySearchScope; - /** - * @deprecated use {@link #LogConsoleManagerBase(com.intellij.openapi.project.Project, com.intellij.psi.search.GlobalSearchScope)} - * to remove in IDEA 15 - */ - @SuppressWarnings("UnusedDeclaration") - protected LogConsoleManagerBase(@NotNull Project project) { - this(project, GlobalSearchScope.allScope(project)); - } - protected LogConsoleManagerBase(@NotNull Project project, @NotNull GlobalSearchScope searchScope) { myProject = project; mySearchScope = searchScope; @@ -68,35 +54,22 @@ public abstract class LogConsoleManagerBase implements LogConsoleManager, Dispos return myProject; } - public void setEnvironment(@NotNull ExecutionEnvironment environment) { - myEnvironment = environment; - } - - protected final ExecutionEnvironment getEnvironment() { - return myEnvironment; - } - @Override - public void addLogConsole(final String name, final String path, @NotNull Charset charset, final long skippedContent) { - addLogConsole(name, path, charset, skippedContent, getDefaultIcon()); + public void addLogConsole(final String name, final String path, @NotNull Charset charset, final long skippedContent, @NotNull RunConfigurationBase runConfiguration) { + addLogConsole(name, path, charset, skippedContent, getDefaultIcon(), runConfiguration); } - public void addLogConsole(final String name, final String path, @NotNull Charset charset, final long skippedContent, Icon icon) { + public void addLogConsole(final String name, final String path, @NotNull Charset charset, final long skippedContent, Icon icon, @Nullable RunProfile runProfile) { doAddLogConsole(new LogConsoleImpl(myProject, new File(path), charset, skippedContent, name, false, mySearchScope) { @Override public boolean isActive() { return isConsoleActive(path); } - }, path, icon); + }, path, icon, runProfile); } - @Override - public void addLogConsole(String name, Reader reader, final String id) { - addLogConsole(name, reader, id, getDefaultIcon()); - } - - public void addLogConsole(String name, Reader reader, final String id, Icon icon) { + public void addLogConsole(String name, Reader reader, final String id, Icon icon, @Nullable RunProfile runProfile) { doAddLogConsole(new LogConsoleBase(myProject, reader, name, @@ -107,14 +80,14 @@ public abstract class LogConsoleManagerBase implements LogConsoleManager, Dispos public boolean isActive() { return isConsoleActive(id); } - }, id, icon); + }, id, icon, runProfile); } private void doAddLogConsole(final LogConsoleBase log, final String id, - Icon icon) { - if (myEnvironment != null && myEnvironment.getRunProfile() instanceof RunConfigurationBase) { - ((RunConfigurationBase)myEnvironment.getRunProfile()).customizeLogConsole(log); + Icon icon, @Nullable RunProfile runProfile) { + if (runProfile instanceof RunConfigurationBase) { + ((RunConfigurationBase)runProfile).customizeLogConsole(log); } log.attachStopLogConsoleTrackingListener(getProcessHandler()); addAdditionalTabComponent(log, id, icon); diff --git a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogFilesManager.java b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogFilesManager.java index 28c66bbf364a..9259dad358c3 100644 --- a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogFilesManager.java +++ b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogFilesManager.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.intellij.diagnostic.logging; import com.intellij.execution.configurations.LogFileOptions; @@ -23,108 +22,57 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Conditions; -import com.intellij.util.Alarm; -import com.intellij.util.SingleAlarm; -import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import javax.swing.*; import java.io.File; -import java.util.*; +import java.util.Set; +import java.util.TreeMap; public class LogFilesManager { - private final Map> myLogFileManagerMap = new LinkedHashMap>(); private final LogConsoleManager myManager; - private final SingleAlarm myUpdateAlarm; public LogFilesManager(@NotNull final Project project, @NotNull LogConsoleManager manager, @NotNull Disposable parentDisposable) { myManager = manager; - - myUpdateAlarm = new SingleAlarm(new Runnable() { - @Override - public void run() { - if (project.isDisposed()) { - return; - } - - myUpdateAlarm.cancelAllRequests(); - for (final LogFileOptions logFile : myLogFileManagerMap.keySet()) { - final Set oldFiles = myLogFileManagerMap.get(logFile); - final Set newFiles = logFile.getPaths(); // should not be called in UI thread - myLogFileManagerMap.put(logFile, newFiles); - - final Set obsoleteFiles = new THashSet(oldFiles); - obsoleteFiles.removeAll(newFiles); - - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - if (project.isDisposed()) { - return; - } - - addConfigurationConsoles(logFile, new Condition() { - @Override - public boolean value(final String file) { - return !oldFiles.contains(file); - } - }, newFiles); - for (String each : obsoleteFiles) { - myManager.removeLogConsole(each); - } - myUpdateAlarm.request(); - } - }); - } - } - }, 500, Alarm.ThreadToUse.POOLED_THREAD, parentDisposable); } - public void registerFileMatcher(@NotNull RunConfigurationBase runConfiguration) { - final ArrayList logFiles = runConfiguration.getAllLogFiles(); - for (LogFileOptions logFile : logFiles) { - if (logFile.isEnabled()) { - myLogFileManagerMap.put(logFile, logFile.getPaths()); + public void addLogConsoles(@NotNull RunConfigurationBase runConfiguration, @Nullable ProcessHandler startedProcess) { + for (LogFileOptions logFileOptions : runConfiguration.getAllLogFiles()) { + if (logFileOptions.isEnabled()) { + addConfigurationConsoles(logFileOptions, Conditions.alwaysTrue(), logFileOptions.getPaths(), runConfiguration); } } - myUpdateAlarm.request(); + runConfiguration.createAdditionalTabComponents(myManager, startedProcess); } - public void initLogConsoles(@NotNull RunConfigurationBase base, ProcessHandler startedProcess) { - List logFiles = base.getAllLogFiles(); - for (LogFileOptions logFile : logFiles) { - if (logFile.isEnabled()) { - addConfigurationConsoles(logFile, Conditions.alwaysTrue(), logFile.getPaths()); + private void addConfigurationConsoles(@NotNull LogFileOptions logFile, @NotNull Condition shouldInclude, @NotNull Set paths, @NotNull RunConfigurationBase runConfiguration) { + if (paths.isEmpty()) { + return; + } + + TreeMap titleToPath = new TreeMap(); + if (paths.size() == 1) { + String path = paths.iterator().next(); + if (shouldInclude.value(path)) { + titleToPath.put(logFile.getName(), path); } } - base.createAdditionalTabComponents(myManager, startedProcess); - } - - private void addConfigurationConsoles(final LogFileOptions logFile, Condition shouldInclude, final Set paths) { - if (!paths.isEmpty()) { - final TreeMap title2Path = new TreeMap(); - if (paths.size() == 1) { - final String path = paths.iterator().next(); + else { + for (String path : paths) { if (shouldInclude.value(path)) { - title2Path.put(logFile.getName(), path); - } - } - else { - for (String path : paths) { - if (shouldInclude.value(path)) { - String title = new File(path).getName(); - if (title2Path.containsKey(title)) { - title = path; - } - title2Path.put(title, path); + String title = new File(path).getName(); + if (titleToPath.containsKey(title)) { + title = path; } + titleToPath.put(title, path); } } - for (final String title : title2Path.keySet()) { - final String path = title2Path.get(title); - assert path != null; - myManager.addLogConsole(title, path, logFile.getCharset(), logFile.isSkipContent() ? new File(path).length() : 0); - } + } + + for (String title : titleToPath.keySet()) { + String path = titleToPath.get(title); + assert path != null; + myManager.addLogConsole(title, path, logFile.getCharset(), logFile.isSkipContent() ? new File(path).length() : 0, runConfiguration); } } } diff --git a/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java b/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java index ff2d16a5bf3c..2893f3be5973 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java @@ -23,7 +23,6 @@ import com.intellij.execution.configurations.RunConfigurationBase; import com.intellij.execution.configurations.RunProfile; import com.intellij.execution.configurations.SearchScopeProvider; import com.intellij.execution.impl.ConsoleViewImpl; -import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.ui.*; import com.intellij.execution.ui.actions.CloseAction; import com.intellij.execution.ui.layout.PlaceInGrid; @@ -41,7 +40,6 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.swing.*; import java.util.Collection; import java.util.List; @@ -113,11 +111,9 @@ public class RunContentBuilder extends RunTab { @NotNull private RunContentDescriptor createDescriptor() { - final RunProfile profile = getEnvironment().getRunProfile(); + final RunProfile profile = myEnvironment.getRunProfile(); if (ApplicationManager.getApplication().isUnitTestMode()) { - RunContentDescriptor contentDescriptor = new RunContentDescriptor(profile, myExecutionResult, myUi); - Disposer.register(contentDescriptor, this); - return contentDescriptor; + return new RunContentDescriptor(profile, myExecutionResult, myUi); } final ExecutionConsole console = myExecutionResult.getExecutionConsole(); @@ -131,14 +127,13 @@ public class RunContentBuilder extends RunTab { } initLogConsoles(profile, contentDescriptor, console); } - Disposer.register(contentDescriptor, this); myUi.getOptions().setLeftToolbar(createActionToolbar(contentDescriptor), ActionPlaces.UNKNOWN); if (profile instanceof RunConfigurationBase) { if (console instanceof ObservableConsoleView && !ApplicationManager.getApplication().isUnitTestMode()) { ((ObservableConsoleView)console).addChangeListener(new ConsoleToFrontListener((RunConfigurationBase)profile, - getProject(), - getEnvironment().getExecutor(), + myProject, + myEnvironment.getExecutor(), contentDescriptor, myUi), this); @@ -215,37 +210,23 @@ public class RunContentBuilder extends RunTab { actionGroup.add(myUi.getOptions().getLayoutActions()); actionGroup.addSeparator(); actionGroup.add(PinToolwindowTabAction.getPinAction()); - actionGroup.add(new CloseAction(getEnvironment().getExecutor(), contentDescriptor, getProject())); + actionGroup.add(new CloseAction(myEnvironment.getExecutor(), contentDescriptor, myProject)); final String helpId = contentDescriptor.getHelpId(); - actionGroup.add(new ContextHelpAction(helpId != null ? helpId : getEnvironment().getExecutor().getHelpId())); + actionGroup.add(new ContextHelpAction(helpId != null ? helpId : myEnvironment.getExecutor().getHelpId())); return actionGroup; } - @Override - public ProcessHandler getProcessHandler() { - return myExecutionResult.getProcessHandler(); - } - /** * @param reuseContent see {@link RunContentDescriptor#myContent} */ public RunContentDescriptor showRunContent(@Nullable RunContentDescriptor reuseContent) { RunContentDescriptor descriptor = createDescriptor(); - RunContentManagerImpl.copyContentAndBehavior(descriptor, reuseContent); + Disposer.register(descriptor, this); myRunContentDescriptor = descriptor; + RunContentManagerImpl.copyContentAndBehavior(descriptor, reuseContent); return descriptor; } - @Override - protected RunnerLayoutUi getUi() { - return myUi; - } - - @Override - protected Icon getDefaultIcon() { - return AllIcons.Debugger.Console; - } - public static class ConsoleToFrontListener implements ConsoleViewImpl.ChangeListener { @NotNull private final RunConfigurationBase myRunConfigurationBase; @NotNull private final Project myProject; diff --git a/platform/lang-impl/src/com/intellij/execution/runners/RunTab.java b/platform/lang-impl/src/com/intellij/execution/runners/RunTab.java index 8fb293d1aefd..d6a6e136beae 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/RunTab.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/RunTab.java @@ -25,6 +25,8 @@ import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.ui.ExecutionConsole; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.execution.ui.RunnerLayoutUi; +import com.intellij.icons.AllIcons; +import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.project.Project; @@ -33,12 +35,20 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public abstract class RunTab extends LogConsoleManagerBase implements DataProvider { +import javax.swing.*; + +public abstract class RunTab implements DataProvider, Disposable { @NotNull protected final RunnerLayoutUi myUi; private LogFilesManager myManager; protected RunContentDescriptor myRunContentDescriptor; + protected ExecutionEnvironment myEnvironment; + protected final Project myProject; + private final GlobalSearchScope mySearchScope; + + private LogConsoleManagerBase logConsoleManager; + protected RunTab(@NotNull ExecutionEnvironment environment, @NotNull String runnerType) { this(environment.getProject(), SearchScopeProvider.createSearchScope(environment.getProject(), environment.getRunProfile()), @@ -46,13 +56,21 @@ public abstract class RunTab extends LogConsoleManagerBase implements DataProvid environment.getExecutor().getId(), environment.getRunProfile().getName()); - setEnvironment(environment); + myEnvironment = environment; + } + + @Override + public void dispose() { + myRunContentDescriptor = null; + myEnvironment = null; + logConsoleManager = null; } protected RunTab(@NotNull Project project, @NotNull GlobalSearchScope searchScope, @NotNull String runnerType, @NotNull String runnerTitle, @NotNull String sessionName) { - super(project, searchScope); + myProject = project; + mySearchScope = searchScope; - myUi = RunnerLayoutUi.Factory.getInstance(getProject()).create(runnerType, runnerTitle, sessionName, this); + myUi = RunnerLayoutUi.Factory.getInstance(project).create(runnerType, runnerTitle, sessionName, this); myUi.getContentManager().addDataProvider(this); } @@ -60,11 +78,10 @@ public abstract class RunTab extends LogConsoleManagerBase implements DataProvid @Override public Object getData(@NonNls String dataId) { if (LangDataKeys.RUN_PROFILE.is(dataId)) { - ExecutionEnvironment environment = getEnvironment(); - return environment == null ? null : environment.getRunProfile(); + return myEnvironment == null ? null : myEnvironment.getRunProfile(); } else if (LangDataKeys.EXECUTION_ENVIRONMENT.is(dataId)) { - return getEnvironment(); + return myEnvironment; } else if (LangDataKeys.RUN_CONTENT_DESCRIPTOR.is(dataId)) { return myRunContentDescriptor; @@ -72,17 +89,27 @@ public abstract class RunTab extends LogConsoleManagerBase implements DataProvid return null; } - @Override - public final void setEnvironment(@NotNull ExecutionEnvironment environment) { - super.setEnvironment(environment); + @NotNull + public LogConsoleManagerBase getLogConsoleManager() { + if (logConsoleManager == null) { + logConsoleManager = new LogConsoleManagerBase(myProject, mySearchScope) { + @Override + protected Icon getDefaultIcon() { + return AllIcons.Debugger.Console; + } - RunProfile profile = environment.getRunProfile(); - if (profile instanceof RunConfigurationBase) { - if (myManager == null) { - myManager = new LogFilesManager(getProject(), this, this); - } - myManager.registerFileMatcher((RunConfigurationBase)profile); + @Override + protected RunnerLayoutUi getUi() { + return myUi; + } + + @Override + public ProcessHandler getProcessHandler() { + return myRunContentDescriptor == null ? null : myRunContentDescriptor.getProcessHandler(); + } + }; } + return logConsoleManager; } protected final void initLogConsoles(@NotNull RunProfile runConfiguration, @NotNull RunContentDescriptor contentDescriptor, @Nullable ExecutionConsole console) { @@ -90,9 +117,9 @@ public abstract class RunTab extends LogConsoleManagerBase implements DataProvid if (runConfiguration instanceof RunConfigurationBase && processHandler != null) { RunConfigurationBase configuration = (RunConfigurationBase)runConfiguration; if (myManager == null) { - myManager = new LogFilesManager(getProject(), this, contentDescriptor); + myManager = new LogFilesManager(myProject, getLogConsoleManager(), contentDescriptor); } - myManager.initLogConsoles(configuration, processHandler); + myManager.addLogConsoles(configuration, processHandler); OutputFileUtil.attachDumpListener(configuration, processHandler, console); } } diff --git a/platform/testRunner/src/com/intellij/execution/testframework/actions/AbstractRerunFailedTestsAction.java b/platform/testRunner/src/com/intellij/execution/testframework/actions/AbstractRerunFailedTestsAction.java index 30f8599e2aaf..6d87bbb2fec3 100644 --- a/platform/testRunner/src/com/intellij/execution/testframework/actions/AbstractRerunFailedTestsAction.java +++ b/platform/testRunner/src/com/intellij/execution/testframework/actions/AbstractRerunFailedTestsAction.java @@ -347,17 +347,18 @@ public class AbstractRerunFailedTestsAction extends AnAction implements AnAction } @Override - public ArrayList getPredefinedLogFiles() { + public List getPredefinedLogFiles() { return myConfiguration.getPredefinedLogFiles(); } + @NotNull @Override - public ArrayList getAllLogFiles() { + public List getAllLogFiles() { return myConfiguration.getAllLogFiles(); } @Override - public ArrayList getLogFiles() { + public List getLogFiles() { return myConfiguration.getLogFiles(); } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerManagerImpl.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerManagerImpl.java index 2e6f91d43924..3618eabf4630 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerManagerImpl.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerManagerImpl.java @@ -24,7 +24,10 @@ import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.runners.ProgramRunner; import com.intellij.execution.runners.RunContentBuilder; -import com.intellij.execution.ui.*; +import com.intellij.execution.ui.ExecutionConsole; +import com.intellij.execution.ui.RunContentDescriptor; +import com.intellij.execution.ui.RunContentManager; +import com.intellij.execution.ui.RunContentWithExecutorListener; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.*; @@ -247,7 +250,7 @@ public class XDebuggerManagerImpl extends XDebuggerManager // in test-mode RunContentWithExecutorListener.contentRemoved events are not sent (see RunContentManagerImpl.showRunContent) // so we make sure the mySessions and mySessionData are cleared correctly when session is disposed - Disposer.register(sessionTab, new Disposable() { + Disposer.register(descriptor, new Disposable() { @Override public void dispose() { mySessionData.remove(descriptor); diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerSessionTabBase.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerSessionTabBase.java index 053f18dd14bf..2bdbb7faa80d 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerSessionTabBase.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerSessionTabBase.java @@ -16,26 +16,22 @@ package com.intellij.xdebugger.impl.ui; import com.intellij.debugger.ui.DebuggerContentInfo; -import com.intellij.diagnostic.logging.AdditionalTabComponent; -import com.intellij.diagnostic.logging.DebuggerLogConsoleManager; import com.intellij.execution.ExecutionManager; import com.intellij.execution.configurations.RunConfigurationBase; import com.intellij.execution.configurations.RunProfile; import com.intellij.execution.executors.DefaultDebugExecutor; -import com.intellij.execution.process.ProcessHandler; -import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.runners.RunContentBuilder; import com.intellij.execution.runners.RunTab; -import com.intellij.execution.ui.*; +import com.intellij.execution.ui.ConsoleViewContentType; +import com.intellij.execution.ui.ExecutionConsole; +import com.intellij.execution.ui.ObservableConsoleView; import com.intellij.execution.ui.layout.LayoutAttractionPolicy; import com.intellij.execution.ui.layout.LayoutViewOptions; -import com.intellij.icons.AllIcons; import com.intellij.ide.impl.ProjectUtil; import com.intellij.ide.ui.customization.CustomActionsSchema; import com.intellij.openapi.actionSystem.ActionGroup; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.registry.Registry; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.ui.AppIcon; @@ -44,20 +40,17 @@ import com.intellij.xdebugger.XDebuggerBundle; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.swing.*; import java.util.Collection; /** * @author nik */ -public abstract class DebuggerSessionTabBase extends RunTab implements DebuggerLogConsoleManager { +public abstract class DebuggerSessionTabBase extends RunTab { protected ExecutionConsole myConsole; public DebuggerSessionTabBase(@NotNull Project project, @NotNull String runnerId, @NotNull String sessionName, @NotNull GlobalSearchScope searchScope) { super(project, searchScope, runnerId, XDebuggerBundle.message("xdebugger.default.content.title"), sessionName); - Disposer.register(project, this); - myUi.getDefaults() .initTabDefaults(0, XDebuggerBundle.message("xdebugger.debugger.tab.title"), null) .initFocusContent(DebuggerContentInfo.FRAME_CONTENT, XDebuggerUIConstants.LAYOUT_VIEW_BREAKPOINT_CONDITION) @@ -68,32 +61,6 @@ public abstract class DebuggerSessionTabBase extends RunTab implements DebuggerL return (ActionGroup)CustomActionsSchema.getInstance().getCorrectedAction(id); } - public abstract RunContentDescriptor getRunContentDescriptor(); - - @Override - public ProcessHandler getProcessHandler() { - return getRunContentDescriptor().getProcessHandler(); - } - - @Override - protected Content createLogContent(AdditionalTabComponent tabComponent, String id, Icon icon) { - Content result = super.createLogContent(tabComponent, id, icon); - result.setCloseable(false); - result.setDescription(tabComponent.getTooltip()); - return result; - } - - @Override - protected Icon getDefaultIcon() { - return AllIcons.FileTypes.Text; - } - - @Override - @NotNull - public RunnerLayoutUi getUi() { - return myUi; - } - protected void attachNotificationTo(final Content content) { if (myConsole instanceof ObservableConsoleView) { ObservableConsoleView observable = (ObservableConsoleView)myConsole; @@ -107,12 +74,11 @@ public abstract class DebuggerSessionTabBase extends RunTab implements DebuggerL }, content); RunProfile profile = getRunProfile(); if (profile instanceof RunConfigurationBase && !ApplicationManager.getApplication().isUnitTestMode()) { - final RunConfigurationBase runConfigurationBase = (RunConfigurationBase)profile; - observable.addChangeListener(new RunContentBuilder.ConsoleToFrontListener(runConfigurationBase, - getProject(), + observable.addChangeListener(new RunContentBuilder.ConsoleToFrontListener((RunConfigurationBase)profile, + myProject, DefaultDebugExecutor.getDebugExecutorInstance(), myRunContentDescriptor, - getUi()), + myUi), content); } } @@ -120,21 +86,20 @@ public abstract class DebuggerSessionTabBase extends RunTab implements DebuggerL @Nullable protected RunProfile getRunProfile() { - ExecutionEnvironment environment = getEnvironment(); - return environment != null ? environment.getRunProfile() : null; + return myEnvironment != null ? myEnvironment.getRunProfile() : null; } public void toFront(boolean focus) { if (!ApplicationManager.getApplication().isUnitTestMode()) { - ExecutionManager.getInstance(getProject()).getContentManager().toFrontRunContent(DefaultDebugExecutor.getDebugExecutorInstance(), myRunContentDescriptor); + ExecutionManager.getInstance(myProject).getContentManager().toFrontRunContent(DefaultDebugExecutor.getDebugExecutorInstance(), myRunContentDescriptor); if (focus) { ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { boolean focusWnd = Registry.is("debugger.mayBringFrameToFrontOnBreakpoint"); - ProjectUtil.focusProjectWindow(getProject(), focusWnd); + ProjectUtil.focusProjectWindow(myProject, focusWnd); if (!focusWnd) { - AppIcon.getInstance().requestAttention(getProject(), true); + AppIcon.getInstance().requestAttention(myProject, true); } } }); diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java index 55342eed9f14..890f0c3e622f 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java @@ -22,6 +22,7 @@ import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.runners.RunContentBuilder; import com.intellij.execution.ui.ExecutionConsole; import com.intellij.execution.ui.RunContentDescriptor; +import com.intellij.execution.ui.RunnerLayoutUi; import com.intellij.execution.ui.actions.CloseAction; import com.intellij.execution.ui.layout.PlaceInGrid; import com.intellij.execution.ui.layout.impl.ViewImpl; @@ -83,6 +84,11 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { return new XDebugSessionTab(session, icon, environment); } + @NotNull + public RunnerLayoutUi getUi() { + return myUi; + } + private XDebugSessionTab(@NotNull XDebugSessionImpl session, @Nullable Icon icon, @Nullable ExecutionEnvironment environment) { @@ -95,7 +101,7 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { myUi.addContent(createWatchesContent(session), 0, PlaceInGrid.right, false); for (XDebugView view : myViews) { - Disposer.register(this, view); + Disposer.register(myRunContentDescriptor, view); } attachToSession(session); @@ -115,20 +121,18 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { } } } - }, this); + }, myRunContentDescriptor); rebuildViews(); } private void setSession(@NotNull XDebugSessionImpl session, @Nullable ExecutionEnvironment environment, @Nullable Icon icon) { - if (environment != null) { - setEnvironment(environment); - } - + myEnvironment = environment; mySession = session; mySessionData = session.getSessionData(); myConsole = session.getConsoleView(); myRunContentDescriptor = new RunContentDescriptor(myConsole, session.getDebugProcess().getProcessHandler(), myUi.getComponent(), session.getSessionName(), icon); + Disposer.register(myRunContentDescriptor, this); } @Nullable @@ -180,7 +184,7 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { @NotNull private Content createFramesContent() { - XFramesView framesView = new XFramesView(getProject()); + XFramesView framesView = new XFramesView(myProject); myViews.add(framesView); Content framesContent = myUi.createContent(DebuggerContentInfo.FRAME_CONTENT, framesView.getMainPanel(), XDebuggerBundle.message("debugger.session.tab.frames.title"), AllIcons.Debugger.Frame, null); @@ -193,7 +197,7 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { } public void rebuildViews() { - AppUIUtil.invokeLaterIfProjectAlive(getProject(), new Runnable() { + AppUIUtil.invokeLaterIfProjectAlive(myProject, new Runnable() { @Override public void run() { for (XDebugView view : myViews) { @@ -209,7 +213,7 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { private void attachToSession(@NotNull XDebugSessionImpl session) { for (XDebugView view : myViews) { - session.addSessionListener(new XDebugViewSessionListener(view), this); + session.addSessionListener(new XDebugViewSessionListener(view), myRunContentDescriptor); } XDebugTabLayouter layouter = session.getDebugProcess().createTabLayouter(); @@ -225,8 +229,7 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { DefaultActionGroup leftToolbar = new DefaultActionGroup(); final Executor debugExecutor = DefaultDebugExecutor.getDebugExecutorInstance(); - ExecutionEnvironment environment = getEnvironment(); - if (environment != null) { + if (myEnvironment != null) { leftToolbar.add(ActionManager.getInstance().getAction(IdeActions.ACTION_RERUN)); List additionalRestartActions = session.getRestartActions(); if (!additionalRestartActions.isEmpty()) { @@ -276,7 +279,7 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { leftToolbar.addSeparator(); leftToolbar.add(PinToolwindowTabAction.getPinAction()); - leftToolbar.add(new CloseAction(environment != null ? environment.getExecutor() : debugExecutor, myRunContentDescriptor, getProject())); + leftToolbar.add(new CloseAction(myEnvironment != null ? myEnvironment.getExecutor() : debugExecutor, myRunContentDescriptor, myProject)); leftToolbar.add(new ContextHelpAction(debugExecutor.getHelpId())); DefaultActionGroup topToolbar = new DefaultActionGroup(); @@ -286,8 +289,8 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { myUi.getOptions().setLeftToolbar(leftToolbar, ActionPlaces.DEBUGGER_TOOLBAR); myUi.getOptions().setTopToolbar(topToolbar, ActionPlaces.DEBUGGER_TOOLBAR); - if (environment != null) { - initLogConsoles(environment.getRunProfile(), myRunContentDescriptor, myConsole); + if (myEnvironment != null) { + initLogConsoles(myEnvironment.getRunProfile(), myRunContentDescriptor, myConsole); } } @@ -296,7 +299,6 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { mySession = null; } - @Override @Nullable public RunContentDescriptor getRunContentDescriptor() { return myRunContentDescriptor; diff --git a/plugins/devkit/src/run/PluginRunConfigurationEditor.java b/plugins/devkit/src/run/PluginRunConfigurationEditor.java index f65bd28a8fc4..9749d3adca18 100644 --- a/plugins/devkit/src/run/PluginRunConfigurationEditor.java +++ b/plugins/devkit/src/run/PluginRunConfigurationEditor.java @@ -15,6 +15,7 @@ */ package org.jetbrains.idea.devkit.run; +import com.intellij.application.options.ModulesComboBox; import com.intellij.execution.ExecutionBundle; import com.intellij.execution.configurations.LogFileOptions; import com.intellij.execution.ui.AlternativeJREPanel; @@ -24,7 +25,6 @@ import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.ModuleRootManager; -import com.intellij.application.options.ModulesComboBox; import com.intellij.openapi.ui.LabeledComponent; import com.intellij.ui.PanelWithAnchor; import com.intellij.ui.RawCommandLineEditor; @@ -46,7 +46,6 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; -import java.util.ArrayList; public class PluginRunConfigurationEditor extends SettingsEditor implements PanelWithAnchor { private final ModulesComboBox myModules = new ModulesComboBox(); @@ -54,7 +53,7 @@ public class PluginRunConfigurationEditor extends SettingsEditor myVMParameters = new LabeledComponent(); private final LabeledComponent myProgramParameters = new LabeledComponent(); private JComponent anchor; - private AlternativeJREPanel myAlternativeJREPanel = new AlternativeJREPanel(); + private final AlternativeJREPanel myAlternativeJREPanel = new AlternativeJREPanel(); @NonNls private final JCheckBox myShowLogs = new JCheckBox(DevKitBundle.message("show.smth", "idea.log")); @@ -65,12 +64,14 @@ public class PluginRunConfigurationEditor extends SettingsEditor logFiles = prc.getLogFiles(); - for (LogFileOptions logFile: logFiles) { + for (LogFileOptions logFile: prc.getLogFiles()) { logFile.setEnable(show); } } private static boolean isShow(PluginRunConfiguration prc){ - final ArrayList logFiles = prc.getLogFiles(); - for (LogFileOptions logFile : logFiles) { + for (LogFileOptions logFile : prc.getLogFiles()) { if (logFile.isEnabled()) return true; } return false; } + @Override public void resetEditorFrom(PluginRunConfiguration prc) { myModules.setSelectedModule(prc.getModule()); getVMParameters().setText(prc.VM_PARAMETERS); @@ -135,6 +135,7 @@ public class PluginRunConfigurationEditor extends SettingsEditor