blob: d4102d4df78497f2f85c96eaba503f466fabea13 [file] [log] [blame]
/*
* 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.junit2.ui;
import com.intellij.execution.ExecutionBundle;
import com.intellij.execution.junit2.TestProxy;
import com.intellij.execution.junit2.ui.actions.JUnitToolbarPanel;
import com.intellij.execution.junit2.ui.model.JUnitAdapter;
import com.intellij.execution.junit2.ui.model.JUnitRunningModel;
import com.intellij.execution.junit2.ui.properties.JUnitConsoleProperties;
import com.intellij.execution.process.ProcessAdapter;
import com.intellij.execution.process.ProcessEvent;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.testframework.PoolOfTestIcons;
import com.intellij.execution.testframework.Printer;
import com.intellij.execution.testframework.TestTreeView;
import com.intellij.execution.testframework.ToolbarPanel;
import com.intellij.execution.testframework.ui.TestResultsPanel;
import com.intellij.execution.testframework.ui.TestStatusLine;
import com.intellij.execution.testframework.ui.TestsOutputConsolePrinter;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.ui.SimpleColoredComponent;
import com.intellij.ui.SimpleTextAttributes;
import com.intellij.ui.treeStructure.Tree;
import com.intellij.util.Alarm;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;
import java.awt.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
public class ConsolePanel extends TestResultsPanel {
@NonNls private static final String PROPORTION_PROPERTY = "test_tree_console_proprtion";
private static final float DEFAULT_PROPORTION = 0.2f;
private JUnitStatusLine myStatusLine;
private StatisticsPanel myStatisticsPanel;
private TestTreeView myTreeView;
private TestsOutputConsolePrinter myPrinter;
private StartingProgress myStartingProgress;
public ConsolePanel(final JComponent console,
final TestsOutputConsolePrinter printer,
final JUnitConsoleProperties properties,
final ExecutionEnvironment environment,
AnAction[] consoleActions) {
super(console, consoleActions, properties, environment, PROPORTION_PROPERTY, DEFAULT_PROPORTION);
myPrinter = printer;
}
@Override
public void initUI() {
super.initUI();
myStartingProgress = new StartingProgress(myTreeView);
}
@Override
protected JComponent createStatisticsPanel() {
myStatisticsPanel = new StatisticsPanel();
return myStatisticsPanel;
}
@Override
protected ToolbarPanel createToolbarPanel() {
return new JUnitToolbarPanel(myProperties, myEnvironment, this);
}
@Override
protected TestStatusLine createStatusLine() {
myStatusLine = new JUnitStatusLine();
return myStatusLine;
}
@Override
protected JComponent createTestTreeView() {
myTreeView = new JUnitTestTreeView();
return myTreeView;
}
public void onProcessStarted(final ProcessHandler process) {
myStatusLine.onProcessStarted(process);
if (myStartingProgress == null) return;
myStartingProgress.start(process);
}
public void setModel(final JUnitRunningModel model) {
stopStartingProgress();
final TestTreeView treeView = model.getTreeView();
treeView.setLargeModel(true);
setLeftComponent(treeView);
myToolbarPanel.setModel(model);
myStatusLine.setModel(model);
model.addListener(new JUnitAdapter() {
@Override
public void onTestSelected(final TestProxy test) {
if (myPrinter != null) myPrinter.updateOnTestSelected(test);
}
});
myStatisticsPanel.attachTo(model);
}
private void stopStartingProgress() {
if (myStartingProgress != null) myStartingProgress.doStop();
myStartingProgress = null;
}
public TestTreeView getTreeView() {
return myTreeView;
}
public Printer getPrinter() {
return myPrinter;
}
@Override
public void dispose() {
stopStartingProgress();
myPrinter = null;
}
private static class StartingProgress implements Runnable {
private final Alarm myAlarm = new Alarm();
private final Tree myTree;
private final DefaultTreeModel myModel;
private final DefaultMutableTreeNode myRootNode = new DefaultMutableTreeNode();
private boolean myStarted = false;
private boolean myStopped = false;
private final SimpleColoredComponent myStartingLabel;
private ProcessHandler myProcess;
private long myStartedAt = System.currentTimeMillis();
private final ProcessAdapter myProcessListener = new ProcessAdapter() {
@Override
public void processTerminated(ProcessEvent event) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
doStop();
}
});
}
};
public StartingProgress(final Tree tree) {
myTree = tree;
myModel = new DefaultTreeModel(myRootNode);
myTree.setModel(myModel);
myStartingLabel = new SimpleColoredComponent();
myTree.setPaintBusy(true);
//myStartingLabel.setBackground(UIManager.getColor("Tree.background"));
myTree.setCellRenderer(new TreeCellRenderer() {
@NotNull
@Override
public Component getTreeCellRendererComponent(@NotNull final JTree tree, final Object value,
final boolean selected, final boolean expanded,
final boolean leaf, final int row, final boolean hasFocus) {
myStartingLabel.clear();
myStartingLabel.setIcon(PoolOfTestIcons.LOADING_ICON);
myStartingLabel.append(getProgressText(), SimpleTextAttributes.REGULAR_ATTRIBUTES);
if (!myStarted) postRepaint();
return myStartingLabel;
}
});
myTree.addPropertyChangeListener(JTree.TREE_MODEL_PROPERTY, new PropertyChangeListener() {
@Override
public void propertyChange(@NotNull final PropertyChangeEvent evt) {
myTree.removePropertyChangeListener(JTree.TREE_MODEL_PROPERTY, this);
doStop();
}
});
}
private void doStop() {
myStopped = true;
myTree.setPaintBusy(false);
myModel.nodeChanged(myRootNode);
myAlarm.cancelAllRequests();
if (myProcess != null) myProcess.removeProcessListener(myProcessListener);
myProcess = null;
}
@Override
public void run() {
myModel.nodeChanged(myRootNode);
postRepaint();
}
private void postRepaint() {
if (myStopped) return;
myStarted = true;
myAlarm.cancelAllRequests();
myAlarm.addRequest(this, 300, ModalityState.NON_MODAL);
}
public void start(final ProcessHandler process) {
if (process.isProcessTerminated()) return;
myProcess = process;
myStartedAt = System.currentTimeMillis();
process.addProcessListener(myProcessListener);
}
private String getProgressText() {
if (myStopped) return ExecutionBundle.message("test.not.started.progress.text");
final long millis = System.currentTimeMillis() - myStartedAt;
final String phaseName = myProcess == null ? ExecutionBundle.message("starting.jvm.progress.text") : ExecutionBundle.message("instantiating.tests.progress.text");
return phaseName + Formatters.printMinSec(millis);
}
}
}