@@ -3,14 +3,12 @@ package cc.unitmesh.devti.mcp.ui
3
3
import cc.unitmesh.devti.mcp.ui.model.McpMessage
4
4
import cc.unitmesh.devti.mcp.ui.model.MessageType
5
5
import com.intellij.ui.JBColor
6
- import com.intellij.ui.components.JBLabel
7
6
import com.intellij.ui.components.JBScrollPane
8
7
import com.intellij.ui.table.JBTable
9
8
import com.intellij.util.ui.JBUI
10
9
import java.awt.BorderLayout
11
10
import java.awt.Component
12
11
import java.awt.Dimension
13
- import java.awt.Point
14
12
import java.time.format.DateTimeFormatter
15
13
import javax.swing.*
16
14
import javax.swing.table.DefaultTableCellRenderer
@@ -29,108 +27,64 @@ class McpMessageLogPanel : JPanel(BorderLayout()) {
29
27
autoCreateRowSorter = true
30
28
}
31
29
32
- private val toolNameLabel = JBLabel (" Tool Name:" ).apply {
33
- font = font.deriveFont(java.awt.Font .BOLD )
34
- border = JBUI .Borders .empty(10 , 10 , 5 , 10 )
35
- }
36
-
37
- private val toolNameTextArea = JTextArea ().apply {
38
- isEditable = false
39
- wrapStyleWord = true
40
- lineWrap = true
41
- border = JBUI .Borders .empty(5 , 10 , 10 , 10 )
42
- }
43
-
44
- private val parametersLabel = JBLabel (" Parameters:" ).apply {
45
- font = font.deriveFont(java.awt.Font .BOLD )
46
- border = JBUI .Borders .empty(10 , 10 , 5 , 10 )
47
- }
48
-
49
- private val parametersTextArea = JTextArea ().apply {
30
+ private val detailTextArea = JTextArea ().apply {
50
31
isEditable = false
51
32
wrapStyleWord = true
52
33
lineWrap = true
53
- border = JBUI .Borders .empty(5 , 10 , 10 , 10 )
34
+ border = JBUI .Borders .empty(10 )
54
35
}
55
-
56
- private val detailPanel = JPanel ().apply {
57
- layout = BoxLayout (this , BoxLayout .Y_AXIS )
58
- add(toolNameLabel)
59
- add(toolNameTextArea)
60
- add(parametersLabel)
61
- add(parametersTextArea)
62
- border = JBUI .Borders .empty(5 )
63
- }
64
-
65
- private val detailScrollPane = JBScrollPane (detailPanel)
66
36
67
37
init {
68
38
table.getColumnModel().getColumn(0 ).cellRenderer = TypeColumnRenderer ()
69
-
39
+
40
+ // Create split pane
70
41
val splitPane = JSplitPane (JSplitPane .HORIZONTAL_SPLIT ).apply {
71
42
leftComponent = JBScrollPane (table)
72
- rightComponent = detailScrollPane
43
+ rightComponent = JBScrollPane (detailTextArea)
73
44
dividerLocation = 600
74
45
resizeWeight = 0.5
75
46
}
76
-
47
+
77
48
add(splitPane, BorderLayout .CENTER )
78
49
table.selectionModel.addListSelectionListener { e ->
79
50
if (! e.valueIsAdjusting && table.selectedRow >= 0 ) {
80
51
val selectedIndex = table.convertRowIndexToModel(table.selectedRow)
81
52
if (selectedIndex >= 0 && selectedIndex < messages.size) {
82
- val message = messages[selectedIndex]
83
-
84
- // Parse content if toolName and parameters are not explicitly set
85
- val (toolName, params) = if (message.toolName != null && message.parameters != null ) {
86
- Pair (message.toolName, message.parameters)
87
- } else {
88
- McpMessage .parseContent(message.content)
89
- }
90
-
91
- toolNameTextArea.text = toolName ? : " N/A"
92
- toolNameTextArea.caretPosition = 0
93
-
94
- parametersTextArea.text = params ? : " N/A"
95
- parametersTextArea.caretPosition = 0
96
-
97
- detailPanel.revalidate()
98
- detailPanel.repaint()
99
- detailScrollPane.viewport.viewPosition = Point (0 , 0 )
53
+ detailTextArea.text = messages[selectedIndex].content
54
+ detailTextArea.caretPosition = 0
100
55
}
101
56
}
102
57
}
103
58
}
104
-
59
+
105
60
fun addMessage (message : McpMessage ) {
106
61
messages.add(message)
107
62
tableModel.fireTableDataChanged()
108
63
SwingUtilities .invokeLater {
109
64
table.setRowSelectionInterval(messages.size - 1 , messages.size - 1 )
110
65
}
111
66
}
112
-
67
+
113
68
fun clear () {
114
69
messages.clear()
115
70
tableModel.fireTableDataChanged()
116
- toolNameTextArea.text = " "
117
- parametersTextArea.text = " "
71
+ detailTextArea.text = " "
118
72
}
119
-
73
+
120
74
private inner class MessageTableModel : DefaultTableModel () {
121
75
private val columnNames = arrayOf(
122
76
" Type" ,
123
77
" Method" ,
124
78
" Timestamp" ,
125
79
" Duration"
126
80
)
127
-
81
+
128
82
override fun getColumnCount (): Int = columnNames.size
129
-
83
+
130
84
override fun getRowCount (): Int = messages.size
131
-
85
+
132
86
override fun getColumnName (column : Int ): String = columnNames[column]
133
-
87
+
134
88
override fun getValueAt (row : Int , column : Int ): Any {
135
89
val message = messages[row]
136
90
return when (column) {
@@ -141,10 +95,10 @@ class McpMessageLogPanel : JPanel(BorderLayout()) {
141
95
else -> " "
142
96
}
143
97
}
144
-
98
+
145
99
override fun isCellEditable (row : Int , column : Int ): Boolean = false
146
100
}
147
-
101
+
148
102
private class TypeColumnRenderer : DefaultTableCellRenderer () {
149
103
override fun getTableCellRendererComponent (
150
104
table : JTable ? ,
@@ -155,8 +109,8 @@ class McpMessageLogPanel : JPanel(BorderLayout()) {
155
109
column : Int
156
110
): Component {
157
111
val label = super .getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column) as JLabel
158
- label.horizontalAlignment = SwingConstants . CENTER
159
-
112
+ label.horizontalAlignment = CENTER
113
+
160
114
if (! isSelected) {
161
115
when (value) {
162
116
MessageType .REQUEST -> {
@@ -169,15 +123,15 @@ class McpMessageLogPanel : JPanel(BorderLayout()) {
169
123
}
170
124
}
171
125
}
172
-
126
+
173
127
label.text = when (value) {
174
128
MessageType .REQUEST -> " REQUEST"
175
129
MessageType .RESPONSE -> " RESPONSE"
176
130
else -> " "
177
131
}
178
-
132
+
179
133
label.border = JBUI .Borders .empty(3 , 5 )
180
-
134
+
181
135
return label
182
136
}
183
137
}
0 commit comments