| /* |
| * 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.testframework.ui; |
| |
| import com.intellij.execution.runners.ExecutionEnvironment; |
| import com.intellij.execution.testframework.TestConsoleProperties; |
| import com.intellij.execution.testframework.TestFrameworkPropertyListener; |
| import com.intellij.execution.testframework.ToolbarPanel; |
| import com.intellij.ide.util.PropertiesComponent; |
| import com.intellij.openapi.Disposable; |
| import com.intellij.openapi.actionSystem.*; |
| import com.intellij.openapi.ui.Splitter; |
| import com.intellij.openapi.util.Disposer; |
| import com.intellij.ui.ScrollPaneFactory; |
| import com.intellij.ui.SideBorder; |
| import com.intellij.util.ui.AwtVisitor; |
| import com.intellij.util.ui.UIUtil; |
| import org.jetbrains.annotations.NotNull; |
| |
| import javax.swing.*; |
| import java.awt.*; |
| import java.beans.PropertyChangeEvent; |
| import java.beans.PropertyChangeListener; |
| |
| /** |
| * @author yole |
| */ |
| public abstract class TestResultsPanel extends JPanel implements Disposable { |
| private JScrollPane myLeftPane; |
| private JComponent myStatisticsComponent; |
| private Splitter myStatisticsSplitter; |
| protected final JComponent myConsole; |
| protected ToolbarPanel myToolbarPanel; |
| protected final ExecutionEnvironment myEnvironment; |
| private final String mySplitterProportionProperty; |
| private final String myStatisticsSplitterProportionProperty; |
| private final float mySplitterDefaultProportion; |
| protected final AnAction[] myConsoleActions; |
| protected final TestConsoleProperties myProperties; |
| protected TestStatusLine myStatusLine; |
| |
| protected TestResultsPanel(@NotNull JComponent console, AnAction[] consoleActions, TestConsoleProperties properties, |
| ExecutionEnvironment environment, |
| String splitterProportionProperty, float splitterDefaultProportion) { |
| super(new BorderLayout(0,1)); |
| myConsole = console; |
| myConsoleActions = consoleActions; |
| myProperties = properties; |
| myEnvironment = environment; |
| mySplitterProportionProperty = splitterProportionProperty; |
| mySplitterDefaultProportion = splitterDefaultProportion; |
| myStatisticsSplitterProportionProperty = mySplitterProportionProperty + "_Statistics"; |
| } |
| |
| public void initUI() { |
| myLeftPane = ScrollPaneFactory.createScrollPane(); |
| myLeftPane.putClientProperty(UIUtil.KEEP_BORDER_SIDES, SideBorder.TOP | SideBorder.RIGHT); |
| myStatisticsComponent = createStatisticsPanel(); |
| myStatusLine = createStatusLine(); |
| JComponent testTreeView = createTestTreeView(); |
| myToolbarPanel = createToolbarPanel(); |
| Disposer.register(this, myToolbarPanel); |
| final Splitter splitter = createSplitter(mySplitterProportionProperty, mySplitterDefaultProportion); |
| Disposer.register(this, new Disposable(){ |
| @Override |
| public void dispose() { |
| remove(splitter); |
| splitter.dispose(); |
| } |
| }); |
| add(splitter, BorderLayout.CENTER); |
| final JPanel leftPanel = new JPanel(new BorderLayout()); |
| leftPanel.add(myLeftPane, BorderLayout.CENTER); |
| leftPanel.add(myToolbarPanel, BorderLayout.NORTH); |
| splitter.setFirstComponent(leftPanel); |
| myStatusLine.setMinimumSize(new Dimension(0, myStatusLine.getMinimumSize().height)); |
| myStatusLine.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); |
| final JPanel rightPanel = new JPanel(new BorderLayout()); |
| rightPanel.add(SameHeightPanel.wrap(myStatusLine, myToolbarPanel), BorderLayout.NORTH); |
| myStatisticsSplitter = createSplitter(myStatisticsSplitterProportionProperty, 0.5f); |
| new AwtVisitor(myConsole) { |
| @Override |
| public boolean visit(Component component) { |
| if (component instanceof JScrollPane) { |
| ((JScrollPane) component).putClientProperty(UIUtil.KEEP_BORDER_SIDES, SideBorder.TOP | SideBorder.LEFT); |
| return true; |
| } |
| return false; |
| } |
| }; |
| myStatisticsSplitter.setFirstComponent(createOutputTab(myConsole, myConsoleActions)); |
| if (TestConsoleProperties.SHOW_STATISTICS.value(myProperties)) { |
| showStatistics(); |
| } |
| myProperties.addListener(TestConsoleProperties.SHOW_STATISTICS, new TestFrameworkPropertyListener<Boolean>() { |
| @Override |
| public void onChanged(Boolean value) { |
| if (value.booleanValue()) { |
| showStatistics(); |
| } |
| else { |
| myStatisticsSplitter.setSecondComponent(null); |
| } |
| } |
| }); |
| rightPanel.add(myStatisticsSplitter, BorderLayout.CENTER); |
| splitter.setSecondComponent(rightPanel); |
| testTreeView.setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 0)); |
| setLeftComponent(testTreeView); |
| } |
| |
| private void showStatistics() { |
| myStatisticsSplitter.setSecondComponent(myStatisticsComponent); |
| } |
| |
| protected abstract JComponent createStatisticsPanel(); |
| |
| protected ToolbarPanel createToolbarPanel() { |
| return new ToolbarPanel(myProperties, myEnvironment, this); |
| } |
| |
| protected TestStatusLine createStatusLine() { |
| return new TestStatusLine(); |
| } |
| |
| protected abstract JComponent createTestTreeView(); |
| |
| private static JComponent createOutputTab(JComponent console, AnAction[] consoleActions) { |
| JPanel outputTab = new JPanel(new BorderLayout()); |
| console.setFocusable(true); |
| outputTab.add(console, BorderLayout.CENTER); |
| final DefaultActionGroup actionGroup = new DefaultActionGroup(consoleActions); |
| final ActionToolbar toolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, actionGroup, false); |
| outputTab.add(toolbar.getComponent(), BorderLayout.WEST); |
| return outputTab; |
| } |
| |
| @Override |
| public void dispose() { |
| } |
| |
| protected static Splitter createSplitter(final String proportionProperty, final float defaultProportion) { |
| final Splitter splitter = new Splitter(false); |
| splitter.setHonorComponentsMinimumSize(true); |
| final PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(); |
| float proportion; |
| final String value = propertiesComponent.getValue(proportionProperty); |
| if (value != null) { |
| try { |
| proportion = Float.parseFloat(value); |
| } |
| catch (NumberFormatException e) { |
| proportion = defaultProportion; |
| } |
| } |
| else { |
| proportion = defaultProportion; |
| } |
| |
| splitter.addPropertyChangeListener(new PropertyChangeListener() { |
| @Override |
| public void propertyChange(@NotNull final PropertyChangeEvent event) { |
| if (event.getPropertyName().equals(Splitter.PROP_PROPORTION)) { |
| propertiesComponent.setValue(proportionProperty, String.valueOf(splitter.getProportion())); |
| } |
| } |
| }); |
| splitter.setProportion(proportion); |
| return splitter; |
| } |
| |
| protected void setLeftComponent(final JComponent component) { |
| if (component != myLeftPane.getViewport().getView()) myLeftPane.setViewportView(component); |
| } |
| } |