@@ -27,12 +27,15 @@ import java.awt.event.ActionListener
2727import java.awt.event.FocusEvent
2828import java.awt.event.FocusListener
2929import java.text.DecimalFormat
30+ import java.util.ArrayList
3031import javax.swing.Box
3132import javax.swing.DefaultComboBoxModel
3233import javax.swing.JComboBox
3334import javax.swing.JComponent
3435import javax.swing.JLabel
36+ import javax.swing.JMenuItem
3537import javax.swing.JPanel
38+ import javax.swing.JPopupMenu
3639import javax.swing.JProgressBar
3740import javax.swing.JScrollPane
3841import javax.swing.JSplitPane
@@ -62,9 +65,9 @@ class RunnerPanel implements FocusListener, ActionListener {
6265 ToolbarButton refreshButton
6366 ToolbarButton rerunButton
6467 ToolbarButton rerunWorksheetButton
65- DefaultComboBoxModel<ComboBoxItem<String ,String > > runComboBoxModel
68+ DefaultComboBoxModel<ComboBoxItem<String , String > > runComboBoxModel
6669 ToolbarButton clearButton
67- JComboBox<ComboBoxItem<String ,String > > runComboBox
70+ JComboBox<ComboBoxItem<String , String > > runComboBox
6871 JLabel statusLabel
6972 JLabel testCounterValueLabel
7073 JLabel errorCounterValueLabel
@@ -75,6 +78,8 @@ class RunnerPanel implements FocusListener, ActionListener {
7578 JProgressBar progressBar;
7679 TestOverviewTableModel testOverviewTableModel
7780 JTable testOverviewTable
81+ JMenuItem testOverviewRunMenuItem
82+ JMenuItem testOverviewRunWorksheetMenuItem
7883 JTextArea testIdTextArea
7984 JTextField testOwnerTextField
8085 JTextField testPackageTextField
@@ -100,6 +105,8 @@ class RunnerPanel implements FocusListener, ActionListener {
100105
101106 private def resetDerived () {
102107 testOverviewTable. rowSorter. sortKeys = null
108+ testOverviewRunMenuItem. enabled = false
109+ testOverviewRunWorksheetMenuItem. enabled = false
103110 testIdTextArea. text = null
104111 testOwnerTextField. text = null
105112 testPackageTextField. text = null
@@ -141,7 +148,8 @@ class RunnerPanel implements FocusListener, ActionListener {
141148 currentRun = run
142149 testOverviewTableModel. model = run. tests
143150 resetDerived
144- runComboBox. selectedItem = run. name
151+ val item = new ComboBoxItem<String , String > (currentRun. reporterId, currentRun. name)
152+ runComboBox. selectedItem = item
145153 }
146154 }
147155
@@ -213,6 +221,16 @@ class RunnerPanel implements FocusListener, ActionListener {
213221 testErrorStackTextArea. caret. visible = false
214222 }
215223 }
224+
225+ private def getPathListFromSelectedTests () {
226+ val pathList = new ArrayList<String >
227+ for (row : testOverviewTable. selectedRows) {
228+ val test = testOverviewTableModel. getTest(row)
229+ val path = ' ' ' «test.ownerName».«test.objectName».«test.procedureName»' ' '
230+ pathList. add(path)
231+ }
232+ return pathList
233+ }
216234
217235 override actionPerformed (ActionEvent e ) {
218236 if (e. source == refreshButton) {
@@ -239,9 +257,15 @@ class RunnerPanel implements FocusListener, ActionListener {
239257 currentRun = null
240258 setModel(run)
241259 update(run. reporterId)
260+ } else if (e. source == testOverviewRunMenuItem) {
261+ val runner = new UtplsqlRunner (pathListFromSelectedTests, currentRun. connectionName)
262+ runner. runTestAsync
263+ } else if (e. source == testOverviewRunWorksheetMenuItem) {
264+ val worksheet = new UtplsqlWorksheetRunner (pathListFromSelectedTests, currentRun. connectionName)
265+ worksheet. runTestAsync
242266 }
243267 }
244-
268+
245269 private static def formatDateTime (String dateTime ) {
246270 if (dateTime == = null ) {
247271 return null
@@ -296,8 +320,10 @@ class RunnerPanel implements FocusListener, ActionListener {
296320 tabIndex = 0
297321 }
298322 p. testDetailTabbedPane. selectedIndex = tabIndex
323+ p. testOverviewRunMenuItem. enabled = true
324+ p. testOverviewRunWorksheetMenuItem. enabled = true
299325 }
300- }
326+ }
301327 }
302328
303329 static class FailuresRowListener implements ListSelectionListener {
@@ -552,7 +578,17 @@ class RunnerPanel implements FocusListener, ActionListener {
552578 val timeFormatRenderer = new TimeFormatRenderer
553579 timeFormatRenderer. horizontalAlignment = JLabel . RIGHT
554580 overviewTableTime. cellRenderer = timeFormatRenderer
555- val testOverviewScrollPane = new JScrollPane (testOverviewTable)
581+ val testOverviewScrollPane = new JScrollPane (testOverviewTable)
582+
583+ // Context menu for test overview
584+ val testOverviewPopupMenu = new JPopupMenu
585+ testOverviewRunMenuItem = new JMenuItem (" Run test" , UtplsqlResources . getIcon(" RUN_ICON" ));
586+ testOverviewRunMenuItem. addActionListener(this )
587+ testOverviewPopupMenu. add(testOverviewRunMenuItem)
588+ testOverviewRunWorksheetMenuItem = new JMenuItem (" Run test in new worksheet" , UtplsqlResources . getIcon(" RUN_WORKSHEET_ICON" ));
589+ testOverviewRunWorksheetMenuItem. addActionListener(this )
590+ testOverviewPopupMenu. add(testOverviewRunWorksheetMenuItem)
591+ testOverviewTable. componentPopupMenu = testOverviewPopupMenu
556592
557593 // Test tabbed pane (Test Properties)
558594 // - Id
@@ -663,7 +699,7 @@ class RunnerPanel implements FocusListener, ActionListener {
663699 c. gridy = 4
664700 c. gridwidth = 1
665701 c. gridheight = 1
666- c. insets = new Insets (5 , 5 , 0 , 0 ) // top, left, bottom, right
702+ c. insets = new Insets (5 , 10 , 0 , 0 ) // top, left, bottom, right
667703 c. anchor = GridBagConstraints :: NORTHWEST
668704 c. fill = GridBagConstraints :: NONE
669705 c. weightx = 0
0 commit comments