blob: 6e65ede4e04e39b7fe5553c8dc6b6a095fb92324 [file] [log] [blame]
/*
* 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.
* 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.diagnostic.logging;
import com.intellij.execution.configurations.RunConfigurationBase;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.ui.RunnerLayoutUi;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.ComponentWithActions;
import com.intellij.openapi.util.Disposer;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentManagerAdapter;
import com.intellij.ui.content.ContentManagerEvent;
import com.intellij.util.ArrayUtil;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.io.File;
import java.nio.charset.Charset;
import java.util.Map;
public abstract class LogConsoleManagerBase implements LogConsoleManager, Disposable {
private final Project myProject;
private final Map<AdditionalTabComponent, Content> myAdditionalContent = new THashMap<AdditionalTabComponent, Content>();
private final GlobalSearchScope mySearchScope;
protected LogConsoleManagerBase(@NotNull Project project, @NotNull GlobalSearchScope searchScope) {
myProject = project;
mySearchScope = searchScope;
}
@Override
public void addLogConsole(@NotNull String name, @NotNull String path, @NotNull Charset charset, 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, @Nullable RunProfile runProfile) {
doAddLogConsole(new LogConsoleImpl(myProject, new File(path), charset, skippedContent, name, false, mySearchScope) {
@Override
public boolean isActive() {
return isConsoleActive(path);
}
}, path, icon, runProfile);
}
private void doAddLogConsole(@NotNull final LogConsoleBase log, String id, Icon icon, @Nullable RunProfile runProfile) {
if (runProfile instanceof RunConfigurationBase) {
((RunConfigurationBase)runProfile).customizeLogConsole(log);
}
log.attachStopLogConsoleTrackingListener(getProcessHandler());
addAdditionalTabComponent(log, id, icon);
getUi().addListener(new ContentManagerAdapter() {
@Override
public void selectionChanged(final ContentManagerEvent event) {
log.activate();
}
}, log);
}
private boolean isConsoleActive(String id) {
final Content content = getUi().findContent(id);
return content != null && content.isSelected();
}
@Override
public void removeLogConsole(@NotNull String path) {
Content content = getUi().findContent(path);
if (content != null) {
removeAdditionalTabComponent((LogConsoleBase)content.getComponent());
}
}
@Override
public void addAdditionalTabComponent(@NotNull AdditionalTabComponent tabComponent, @NotNull String id) {
addAdditionalTabComponent(tabComponent, id, getDefaultIcon());
}
public Content addAdditionalTabComponent(@NotNull AdditionalTabComponent tabComponent, @NotNull String id, @Nullable Icon icon) {
Content logContent = getUi().createContent(id, (ComponentWithActions)tabComponent, tabComponent.getTabTitle(), icon,
tabComponent.getPreferredFocusableComponent());
myAdditionalContent.put(tabComponent, logContent);
getUi().addContent(logContent);
return logContent;
}
@Override
public void removeAdditionalTabComponent(@NotNull AdditionalTabComponent component) {
Disposer.dispose(component);
final Content content = myAdditionalContent.remove(component);
if (!getUi().isDisposed()) {
getUi().removeContent(content, true);
}
}
@Override
public void dispose() {
for (AdditionalTabComponent component : ArrayUtil.toObjectArray(myAdditionalContent.keySet(), AdditionalTabComponent.class)) {
removeAdditionalTabComponent(component);
}
}
protected abstract Icon getDefaultIcon();
protected abstract RunnerLayoutUi getUi();
public abstract ProcessHandler getProcessHandler();
}