@@ -24,8 +24,8 @@ import java.awt.GridBagLayout
2424import java.awt.Insets
2525import java.awt.event.ActionEvent
2626import java.awt.event.ActionListener
27- import java.awt.event.FocusEvent
28- import java.awt.event.FocusListener
27+ import java.awt.event.MouseEvent
28+ import java.awt.event.MouseListener
2929import java.text.DecimalFormat
3030import java.util.ArrayList
3131import javax.swing.Box
@@ -50,16 +50,20 @@ import javax.swing.event.ListSelectionEvent
5050import javax.swing.event.ListSelectionListener
5151import javax.swing.plaf.basic.BasicProgressBarUI
5252import javax.swing.table.DefaultTableCellRenderer
53+ import oracle.dbtools.raptor.controls.grid.DefaultDrillLink
54+ import oracle.dbtools.raptor.utils.Connections
5355import oracle.ide.config.Preferences
5456import oracle.javatools.ui.table.ToolbarButton
57+ import org.utplsql.sqldev.dal.UtplsqlDao
5558import org.utplsql.sqldev.model.LimitedLinkedHashMap
5659import org.utplsql.sqldev.model.preference.PreferenceModel
5760import org.utplsql.sqldev.model.runner.Run
61+ import org.utplsql.sqldev.parser.UtplsqlParser
5862import org.utplsql.sqldev.resources.UtplsqlResources
5963import org.utplsql.sqldev.runner.UtplsqlRunner
6064import org.utplsql.sqldev.runner.UtplsqlWorksheetRunner
6165
62- class RunnerPanel implements ActionListener {
66+ class RunnerPanel implements ActionListener , MouseListener {
6367 static val GREEN = new Color (0 , 153 , 0 )
6468 static val RED = new Color (153 , 0 , 0 )
6569 static val INDICATOR_WIDTH = 20
@@ -188,7 +192,38 @@ class RunnerPanel implements ActionListener {
188192 col. preferredWidth = 0
189193 }
190194 }
195+
196+ private def openSelectedTest () {
197+ val rowIndex = testOverviewTable. selectedRow
198+ if (rowIndex != - 1 ) {
199+ val row = testOverviewTable. convertRowIndexToModel(rowIndex)
200+ val test = testOverviewTableModel. getTest(row)
201+ val dao = new UtplsqlDao (Connections . instance. getConnection(currentRun. connectionName))
202+ val source = dao. getSource(test. ownerName, " PACKAGE" , test. objectName. toUpperCase). trim
203+ val parser = new UtplsqlParser (source)
204+ val line = parser. getLineOf(test. procedureName)
205+ openEditor(test. ownerName, " PACKAGE" , test. objectName. toUpperCase, line, 1 )
206+ }
207+ }
191208
209+ private def openSelectedFailure () {
210+ val rowIndex = failuresTable. selectedRow
211+ if (rowIndex != - 1 ) {
212+ val row = failuresTable. convertRowIndexToModel(rowIndex)
213+ val expectation = failuresTableModel. getExpectation(row)
214+ val test = testOverviewTableModel. getTest(testOverviewTable. convertRowIndexToModel(testOverviewTable. selectedRow))
215+ openEditor(test. ownerName, " PACKAGE BODY" , test. objectName. toUpperCase, expectation. callerLine, 1 )
216+ }
217+ }
218+
219+ private def openEditor (String owner , String type , String name , int line , int col ) {
220+ var drillLink = new DefaultDrillLink
221+ drillLink. connName = currentRun. connectionName
222+ // argument order is based on SQLDEV:LINK that can be used in SQL query result tables (editors, reports)
223+ drillLink. args = #[owner, type, name, String . valueOf(line), String . valueOf(col), " OpenEditor" , " oracle.dbtools.raptor.controls.grid.DefaultDrillLink" ]
224+ drillLink. performDrill
225+ }
226+
192227 private def syncDetailTab () {
193228 if (syncDetailTabCheckBoxMenuItem. selected) {
194229 val rowIndex = testOverviewTable. selectedRow
@@ -378,6 +413,35 @@ class RunnerPanel implements ActionListener {
378413 }
379414 }
380415
416+ override mouseClicked (MouseEvent e ) {
417+ if (e. clickCount == 2 ) {
418+ if (e. source == testOverviewTable) {
419+ if (failuresTable. selectedRowCount == 1 ) {
420+ openSelectedFailure
421+ } else {
422+ openSelectedTest
423+ }
424+
425+ } else if (e. source == failuresTable) {
426+ if (failuresTable. selectedRowCount == 1 ) {
427+ openSelectedFailure
428+ }
429+ }
430+ }
431+ }
432+
433+ override mouseEntered (MouseEvent e ) {
434+ }
435+
436+ override mouseExited (MouseEvent e ) {
437+ }
438+
439+ override mousePressed (MouseEvent e ) {
440+ }
441+
442+ override mouseReleased (MouseEvent e ) {
443+ }
444+
381445 private static def formatDateTime (String dateTime ) {
382446 if (dateTime == = null ) {
383447 return null
@@ -409,9 +473,9 @@ class RunnerPanel implements ActionListener {
409473 p. testIdTextArea. text = test. id
410474 p. testStartTextField. text = formatDateTime(test. startTime)
411475 p. failuresTableModel. model = test. failedExpectations
476+ p. failuresTableModel. fireTableDataChanged
412477 p. testFailureMessageTextArea. text = null
413478 if (test. failedExpectations !== null && test. failedExpectations. size > 0 ) {
414- p. failuresTableModel. fireTableDataChanged
415479 p. failuresTable. setRowSelectionInterval(0 , 0 )
416480 }
417481 p. testErrorStackTextArea. text = test. errorStack? . trim
@@ -663,7 +727,8 @@ class RunnerPanel implements ActionListener {
663727 testOverviewTable. autoCreateRowSorter = true
664728 testOverviewTable. rowHeight = OVERVIEW_TABLE_ROW_HEIGHT
665729 testOverviewTable. tableHeader. preferredSize = new Dimension (testOverviewTable. tableHeader. getPreferredSize. width, OVERVIEW_TABLE_ROW_HEIGHT )
666- testOverviewTable. selectionModel. addListSelectionListener(new TestOverviewRowListener (this ))
730+ testOverviewTable. selectionModel. addListSelectionListener(new TestOverviewRowListener (this ))
731+ testOverviewTable. addMouseListener(this )
667732 val testTableHeaderRenderer = new TestTableHeaderRenderer
668733 val overviewTableStatus = testOverviewTable. columnModel. getColumn(0 )
669734 overviewTableStatus. minWidth = INDICATOR_WIDTH
@@ -883,6 +948,7 @@ class RunnerPanel implements ActionListener {
883948 failuresTable = new JTable (failuresTableModel)
884949 failuresTable. tableHeader. reorderingAllowed = false
885950 failuresTable. selectionModel. addListSelectionListener(new FailuresRowListener (this ))
951+ failuresTable. addMouseListener(this )
886952 val failuresTableHeaderRenderer = new FailuresTableHeaderRenderer
887953 val failuresTableNumber = failuresTable. columnModel. getColumn(0 )
888954 failuresTableNumber. headerRenderer = failuresTableHeaderRenderer
0 commit comments