Ruby test runner: Navigation from tests tree to statistics tab was improoved. Now...
[fedora-idea.git] / plugins / ruby / src / org / jetbrains / plugins / ruby / testing / testunit / runner / ui / statistics / RTestUnitStatisticsPanel.java
blobb595dbfc37a909d9b526b4d2ac7482f886d7f139
1 package org.jetbrains.plugins.ruby.testing.testunit.runner.ui.statistics;
3 import com.intellij.execution.testframework.TestsUIUtil;
4 import com.intellij.ui.table.TableView;
5 import org.jetbrains.annotations.Nullable;
6 import org.jetbrains.plugins.ruby.support.UIUtil;
7 import org.jetbrains.plugins.ruby.testing.testunit.runner.RTestUnitEventsListener;
8 import org.jetbrains.plugins.ruby.testing.testunit.runner.RTestUnitTestProxy;
9 import org.jetbrains.plugins.ruby.testing.testunit.runner.ui.RTestUnitResultsForm;
10 import org.jetbrains.plugins.ruby.testing.testunit.runner.ui.RTestUnitTestProxySelectionChangedListener;
12 import javax.swing.*;
13 import java.awt.event.InputEvent;
14 import java.awt.event.KeyEvent;
15 import java.awt.event.MouseAdapter;
16 import java.awt.event.MouseEvent;
17 import java.util.ArrayList;
18 import java.util.Collection;
19 import java.util.List;
21 /**
22 * @author Roman Chernyatchik
24 public class RTestUnitStatisticsPanel extends JPanel {
25 public static final Icon STATISTICS_TAB_ICON = TestsUIUtil.loadIcon("testStatistics");
27 private TableView<RTestUnitTestProxy> myStatisticsTableView;
28 private JPanel myContentPane;
30 private RTestUnitStatisticsTableModel myTableModel;
31 private final List<RTestUnitTestProxySelectionChangedListener> myChangeSelectionListeners = new ArrayList<RTestUnitTestProxySelectionChangedListener>();
33 public RTestUnitStatisticsPanel() {
34 myTableModel = new RTestUnitStatisticsTableModel();
35 myStatisticsTableView.setModel(myTableModel);
36 myStatisticsTableView.addMouseListener(new MouseAdapter(){
37 @Override
38 public void mouseClicked(final MouseEvent e) {
39 if (e.getClickCount() == 2) {
40 final Collection<RTestUnitTestProxy> proxies = myStatisticsTableView.getSelection();
41 if (proxies.isEmpty()) {
42 return;
45 fireOnSelectionChanged(proxies.iterator().next());
48 });
50 // Fire selection changed and move focus on SHIFT+ENTER
51 final KeyStroke shiftEnterKey = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.SHIFT_MASK);
52 UIUtil.registerAsAction(shiftEnterKey, "change-selection-on-test-proxy",
53 createChangeSelectionAction(),
54 myStatisticsTableView);
56 // Expand selected or go to parent on ENTER
57 final KeyStroke enterKey = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
58 UIUtil.registerAsAction(enterKey, "go-to-selected-suite-or-parent",
59 createGotoSuiteOrParentAction(),
60 myStatisticsTableView);
63 public JPanel getContentPane() {
64 return myContentPane;
67 /**
68 * Show and selects suite in table by event
69 * @return
71 public RTestUnitResultsForm.FormSelectionListener createSelectionListener() {
72 return myTableModel.createSelectionListener(myStatisticsTableView);
75 public RTestUnitEventsListener createTestEventsListener() {
76 return myTableModel.createTestEventsListener();
79 public void addChangeSelectionListener(final RTestUnitTestProxySelectionChangedListener listener) {
80 myChangeSelectionListeners.add(listener);
83 protected Runnable createChangeSelectionAction() {
84 // Change selection
85 return new Runnable() {
86 public void run() {
87 final Collection<RTestUnitTestProxy> proxies = myStatisticsTableView.getSelection();
88 if (proxies.isEmpty()) {
89 return;
91 final RTestUnitTestProxy proxy = proxies.iterator().next();
92 myStatisticsTableView.clearSelection();
93 fireOnSelectionChanged(proxy);
98 protected Runnable createGotoSuiteOrParentAction() {
99 final RTestUnitResultsForm.FormSelectionListener selectionListener = createSelectionListener();
101 // Expand selected or go to parent
102 return new Runnable() {
103 public void run() {
104 final RTestUnitTestProxy selectedProxy = getSelectedItem();
105 if (selectedProxy == null) {
106 return;
109 final int i = myStatisticsTableView.getSelectedRow();
110 assert i >= 0; //because something is selected
112 // If first line is selected we should go to parent suite
113 if (ColumnTest.TestsCellRenderer.isFirstLine(i)) {
114 final RTestUnitTestProxy parentSuite = selectedProxy.getParent();
115 if (parentSuite != null) {
116 showInTableAndSelectFirstRow(parentSuite, selectionListener);
118 } else {
119 // if selected element is suite - we should expand it
120 if (selectedProxy.isSuite()) {
121 showInTableAndSelectFirstRow(selectedProxy, selectionListener);
129 * Selects row in table
130 * @param rowIndex Row's index
132 protected void selectRow(final int rowIndex) {
133 UIUtil.addToInvokeLater(new Runnable() {
134 public void run() {
135 // updates model
136 myStatisticsTableView.setRowSelectionInterval(rowIndex, rowIndex);
141 @Nullable
142 protected RTestUnitTestProxy getSelectedItem() {
143 return myStatisticsTableView.getSelectedObject();
146 private void fireOnSelectionChanged(final RTestUnitTestProxy selectedTestProxy) {
147 for (RTestUnitTestProxySelectionChangedListener listener : myChangeSelectionListeners) {
148 listener.onChangeSelection(selectedTestProxy, true);
152 private void createUIComponents() {
153 myStatisticsTableView = new TableView<RTestUnitTestProxy>();
156 private void showInTableAndSelectFirstRow(final RTestUnitTestProxy suite,
157 final RTestUnitResultsForm.FormSelectionListener selectionListener) {
158 selectionListener.onSelectedRequest(suite);
159 selectRow(0);
163 * On event change selection and probably requests focus. Is used when we want
164 * navigate from other component to this
165 * @return Listener
167 public RTestUnitTestProxySelectionChangedListener createOnChangeSelectionListener() {
168 final RTestUnitResultsForm.FormSelectionListener selectionListener = createSelectionListener();
170 return new RTestUnitTestProxySelectionChangedListener() {
171 public void onChangeSelection(@Nullable final RTestUnitTestProxy selectedTestProxy, final boolean requestFocus) {
172 if (requestFocus) {
173 selectionListener.onSelectedRequest(selectedTestProxy);
174 UIUtil.addToInvokeLater(new Runnable() {
175 public void run() {
176 myStatisticsTableView.requestFocusInWindow();