@@ -78,6 +78,8 @@ class McpConfigPopup {
78
78
loadingPanel.add(JBScrollPane (tree), BorderLayout .CENTER )
79
79
loadingPanel.preferredSize = Dimension (380 , 350 )
80
80
81
+ var currentPopup: com.intellij.openapi.ui.popup.JBPopup ? = null
82
+
81
83
// Button panel
82
84
val buttonPanel = JPanel ().apply {
83
85
layout = BoxLayout (this , BoxLayout .X_AXIS )
@@ -94,11 +96,15 @@ class McpConfigPopup {
94
96
val applyButton = JButton (" Apply" ).apply {
95
97
addActionListener {
96
98
saveSelectedTools(tree, configService)
97
- // Close popup - this will be handled by the popup framework
99
+ currentPopup?.cancel()
98
100
}
99
101
}
100
102
101
- val cancelButton = JButton (" Cancel" )
103
+ val cancelButton = JButton (" Cancel" ).apply {
104
+ addActionListener {
105
+ currentPopup?.cancel()
106
+ }
107
+ }
102
108
103
109
add(cancelButton)
104
110
add(Box .createHorizontalStrut(8 ))
@@ -120,7 +126,7 @@ class McpConfigPopup {
120
126
}
121
127
})
122
128
123
- val popup = JBPopupFactory .getInstance()
129
+ currentPopup = JBPopupFactory .getInstance()
124
130
.createComponentPopupBuilder(mainPanel, searchField)
125
131
.setTitle(" Configure MCP Tools" )
126
132
.setResizable(true )
@@ -129,9 +135,9 @@ class McpConfigPopup {
129
135
.createPopup()
130
136
131
137
if (component != null ) {
132
- popup .showUnderneathOf(component)
138
+ currentPopup .showUnderneathOf(component)
133
139
} else {
134
- popup .showCenteredInCurrentWindow(project)
140
+ currentPopup .showCenteredInCurrentWindow(project)
135
141
}
136
142
}
137
143
@@ -148,7 +154,7 @@ class McpConfigPopup {
148
154
149
155
loadToolsIntoTree(project, configService, rootNode, treeModel, tree, loadingPanel)
150
156
}
151
-
157
+
152
158
private fun loadToolsIntoTree (
153
159
project : Project ,
154
160
configService : McpConfigService ,
@@ -162,40 +168,43 @@ class McpConfigPopup {
162
168
rootNode.add(loadingNode)
163
169
treeModel.reload()
164
170
expandAllNodes(tree)
165
-
171
+
166
172
CoroutineScope (Dispatchers .IO ).launch {
167
173
try {
168
174
val mcpServerConfig = project.customizeSetting.mcpServerConfig
169
175
val allTools = configService.getAllAvailableTools(mcpServerConfig)
170
176
val selectedTools = configService.getSelectedTools()
171
-
177
+
172
178
invokeLater {
173
179
rootNode.removeAllChildren()
174
- loadingPanel.stopLoading()
175
-
180
+
176
181
allTools.forEach { (serverName, tools) ->
177
182
val serverNode = ServerTreeNode (serverName)
178
183
rootNode.add(serverNode)
179
-
184
+
180
185
tools.forEach { tool ->
181
186
val toolNode = ToolTreeNode (serverName, tool)
182
187
val isSelected = selectedTools[serverName]?.contains(tool.name) == true
183
188
toolNode.isChecked = isSelected
184
189
serverNode.add(toolNode)
185
190
}
186
191
}
187
-
192
+
188
193
treeModel.reload()
189
194
expandAllNodes(tree)
195
+ tree.repaint() // 添加显式重绘
196
+ loadingPanel.stopLoading()
197
+ loadingPanel.revalidate() // 确保布局更新
190
198
}
191
199
} catch (e: Exception ) {
192
200
invokeLater {
193
201
rootNode.removeAllChildren()
194
202
val errorNode = CheckedTreeNode (" Error loading tools: ${e.message} " )
195
203
rootNode.add(errorNode)
196
204
treeModel.reload()
197
-
205
+ tree.repaint() // 添加显式重绘
198
206
loadingPanel.stopLoading()
207
+ loadingPanel.revalidate() // 确保布局更新
199
208
}
200
209
}
201
210
}
@@ -230,5 +239,7 @@ class McpConfigPopup {
230
239
for (i in 0 until tree.rowCount) {
231
240
tree.expandRow(i)
232
241
}
242
+
243
+ tree.updateUI()
233
244
}
234
245
}
0 commit comments