Skip to content

Commit 2cf141d

Browse files
authored
Merge pull request #2461 from digma-ai/reload-jcef
reload UI
2 parents e6ce69e + 6f8cdf7 commit 2cf141d

File tree

6 files changed

+157
-19
lines changed

6 files changed

+157
-19
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.digma.intellij.plugin.reload
2+
3+
import com.intellij.openapi.actionSystem.AnAction
4+
import com.intellij.openapi.actionSystem.AnActionEvent
5+
import com.intellij.openapi.components.service
6+
import org.digma.intellij.plugin.errorreporting.ErrorReporter
7+
8+
//devkit doesn't know that the action is registered because it looks for plugin.xml in the current project
9+
@Suppress("ComponentNotRegistered")
10+
class ReloadAction : AnAction() {
11+
override fun actionPerformed(p0: AnActionEvent) {
12+
try {
13+
service<ReloadService>().reload()
14+
} catch (e: Throwable) {
15+
ErrorReporter.getInstance().reportError("ReloadAction.actionPerformed", e)
16+
}
17+
}
18+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package org.digma.intellij.plugin.reload
2+
3+
import com.intellij.openapi.Disposable
4+
import com.intellij.openapi.components.Service
5+
import com.intellij.openapi.project.ProjectManager
6+
import com.intellij.openapi.util.Disposer
7+
import org.digma.intellij.plugin.common.EDT
8+
import org.digma.intellij.plugin.common.isProjectValid
9+
import org.digma.intellij.plugin.errorreporting.ErrorReporter
10+
import org.digma.intellij.plugin.ui.MainToolWindowCardsController
11+
import org.digma.intellij.plugin.ui.panels.ReloadablePanel
12+
13+
@Service(Service.Level.APP)
14+
class ReloadService {
15+
16+
private val reloadables = mutableListOf<ReloadablePanel>()
17+
18+
19+
fun register(reloadablePanel: ReloadablePanel, parentDisposable: Disposable) {
20+
reloadables.add(reloadablePanel)
21+
Disposer.register(parentDisposable) {
22+
remove(reloadablePanel)
23+
}
24+
}
25+
26+
fun remove(reloadablePanel: ReloadablePanel) {
27+
reloadables.remove(reloadablePanel)
28+
}
29+
30+
31+
fun reload() {
32+
ProjectManager.getInstance().openProjects.forEach {
33+
try {
34+
if (isProjectValid(it)) {
35+
MainToolWindowCardsController.getInstance(it).wizardFinished()
36+
}
37+
} catch (e: Throwable) {
38+
ErrorReporter.getInstance().reportError("ReloadService.reload", e)
39+
}
40+
}
41+
42+
reloadables.forEach {
43+
EDT.ensureEDT {
44+
try {
45+
it.reload()
46+
} catch (e: Throwable) {
47+
ErrorReporter.getInstance().reportError("ReloadService.reload", e)
48+
}
49+
}
50+
}
51+
}
52+
53+
54+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.digma.intellij.plugin.ui.panels
2+
3+
interface ReloadablePanel {
4+
fun reload()
5+
}

src/main/kotlin/org/digma/intellij/plugin/ui/mainapp/MainAppPanel.kt

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,41 @@
11
package org.digma.intellij.plugin.ui.mainapp
22

3+
import com.intellij.openapi.components.service
34
import com.intellij.openapi.project.Project
45
import com.intellij.openapi.util.Disposer
56
import com.intellij.ui.jcef.JBCefApp
67
import com.intellij.util.ui.JBUI
8+
import org.digma.intellij.plugin.reload.ReloadService
79
import org.digma.intellij.plugin.ui.insights.InsightsService
810
import org.digma.intellij.plugin.ui.jcef.DownloadHandlerAdapter
911
import org.digma.intellij.plugin.ui.jcef.JCefComponent
1012
import org.digma.intellij.plugin.ui.list.listBackground
1113
import org.digma.intellij.plugin.ui.navigation.CodeButtonCaretContextService
1214
import org.digma.intellij.plugin.ui.navigation.NavigationService
1315
import org.digma.intellij.plugin.ui.panels.DisposablePanel
16+
import org.digma.intellij.plugin.ui.panels.ReloadablePanel
1417
import org.digma.intellij.plugin.ui.tests.TestsUpdater
1518
import java.awt.BorderLayout
1619
import java.awt.Insets
1720
import javax.swing.JComponent
1821
import javax.swing.JLabel
1922

20-
class MainAppPanel(private val project: Project) : DisposablePanel() {
23+
class MainAppPanel(private val project: Project) : DisposablePanel(), ReloadablePanel {
24+
25+
private var jCefComponent: JCefComponent? = null
26+
27+
private var parentDisposable = Disposer.newDisposable()
2128

2229
init {
30+
jCefComponent = build()
31+
service<ReloadService>().register(this, MainAppService.getInstance(project))
32+
Disposer.register(MainAppService.getInstance(project)) {
33+
dispose()
34+
}
35+
}
36+
37+
38+
private fun build(): JCefComponent? {
2339

2440
val jCefComponent = createJcefComponent()
2541

@@ -30,12 +46,6 @@ class MainAppPanel(private val project: Project) : DisposablePanel() {
3046
add(jcefUiComponent, BorderLayout.CENTER)
3147
background = listBackground()
3248

33-
Disposer.register(MainAppService.getInstance(project)) {
34-
jCefComponent?.dispose()
35-
remove(jcefUiComponent)
36-
dispose()
37-
}
38-
3949
jCefComponent?.let {
4050
MainAppService.getInstance(project).setJCefComponent(it)
4151
TestsUpdater.getInstance(project).setJCefComponent(it)
@@ -44,12 +54,22 @@ class MainAppPanel(private val project: Project) : DisposablePanel() {
4454
CodeButtonCaretContextService.getInstance(project).setJCefComponent(it)
4555
}
4656

57+
return jCefComponent
4758
}
4859

60+
61+
override fun reload() {
62+
dispose()
63+
removeAll()
64+
parentDisposable = Disposer.newDisposable()
65+
jCefComponent = build()
66+
}
67+
68+
4969
private fun createJcefComponent(): JCefComponent? {
5070
return if (JBCefApp.isSupported()) {
5171
JCefComponent.JCefComponentBuilder(
52-
project, "Main", MainAppService.getInstance(project),
72+
project, "Main", parentDisposable,
5373
MAIN_APP_URL,
5474
MainAppMessageRouterHandler(project)
5575
)
@@ -66,6 +86,9 @@ class MainAppPanel(private val project: Project) : DisposablePanel() {
6686
}
6787

6888
override fun dispose() {
69-
//nothing to do
89+
Disposer.dispose(parentDisposable)
90+
jCefComponent?.let {
91+
Disposer.dispose(it)
92+
}
7093
}
7194
}

src/main/kotlin/org/digma/intellij/plugin/ui/recentactivity/RecentActivityPanel.kt

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,45 +5,66 @@ import com.intellij.openapi.project.Project
55
import com.intellij.openapi.util.Disposer
66
import com.intellij.ui.jcef.JBCefApp
77
import com.intellij.util.ui.JBUI
8+
import org.digma.intellij.plugin.reload.ReloadService
89
import org.digma.intellij.plugin.ui.jcef.JCefComponent
910
import org.digma.intellij.plugin.ui.jcef.JCefComponent.JCefComponentBuilder
1011
import org.digma.intellij.plugin.ui.list.listBackground
1112
import org.digma.intellij.plugin.ui.panels.DisposablePanel
13+
import org.digma.intellij.plugin.ui.panels.ReloadablePanel
1214
import java.awt.BorderLayout
15+
import java.awt.Insets
1316
import javax.swing.JComponent
1417
import javax.swing.JLabel
1518

16-
class RecentActivityPanel(private val project: Project) : DisposablePanel() {
19+
class RecentActivityPanel(private val project: Project) : DisposablePanel(), ReloadablePanel {
20+
21+
private var jCefComponent: JCefComponent? = null
22+
23+
private var parentDisposable = Disposer.newDisposable()
1724

1825
init {
26+
jCefComponent = build()
27+
service<ReloadService>().register(this, project.service<RecentActivityService>())
28+
Disposer.register(project.service<RecentActivityService>()) {
29+
dispose()
30+
}
31+
}
32+
33+
34+
private fun build(): JCefComponent? {
1935

2036
val jCefComponent = createJcefComponent()
2137

2238
val jcefUiComponent: JComponent = jCefComponent?.getComponent() ?: JLabel("JCEF not supported")
2339

2440
layout = BorderLayout()
2541
border = JBUI.Borders.empty()
26-
background = listBackground()
2742
add(jcefUiComponent, BorderLayout.CENTER)
28-
29-
Disposer.register(project.service<RecentActivityService>()) {
30-
jCefComponent?.dispose()
31-
remove(jcefUiComponent)
32-
dispose()
33-
}
43+
background = listBackground()
3444

3545
jCefComponent?.let {
3646
project.service<RecentActivityService>().setJcefComponent(it)
3747
project.service<RecentActivityUpdater>().setJcefComponent(it)
3848
project.service<LiveViewUpdater>().setJcefComponent(it)
3949
}
50+
51+
return jCefComponent
52+
}
53+
54+
55+
override fun reload() {
56+
project.service<LiveViewUpdater>().stopLiveView()
57+
dispose()
58+
removeAll()
59+
parentDisposable = Disposer.newDisposable()
60+
jCefComponent = build()
4061
}
4162

4263

4364
private fun createJcefComponent(): JCefComponent? {
4465
return if (JBCefApp.isSupported()) {
4566
JCefComponentBuilder(
46-
project, "RecentActivity", project.service<RecentActivityService>(),
67+
project, "RecentActivity", parentDisposable,
4768
RECENT_ACTIVITY_URL,
4869
RecentActivityMessageRouterHandler(project)
4970
)
@@ -54,7 +75,14 @@ class RecentActivityPanel(private val project: Project) : DisposablePanel() {
5475
}
5576

5677

78+
override fun getInsets(): Insets {
79+
return JBUI.emptyInsets()
80+
}
81+
5782
override fun dispose() {
58-
//nothing to do
83+
Disposer.dispose(parentDisposable)
84+
jCefComponent?.let {
85+
Disposer.dispose(it)
86+
}
5987
}
6088
}

src/main/resources/META-INF/plugin.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,4 +166,14 @@
166166
topic="com.intellij.openapi.project.ProjectCloseListener"/>
167167
</applicationListeners>
168168

169+
170+
<actions>
171+
<action id="org.digma.intellij.plugin.reload.ReloadAction" class="org.digma.intellij.plugin.reload.ReloadAction"
172+
text="Reload Digma UI" description="Reload Digma jcef browsers"
173+
icon="org.digma.intellij.plugin.icons.AppIcons.TOOL_WINDOW">
174+
<add-to-group group-id="HelpMenu" anchor="last"/>
175+
</action>
176+
</actions>
177+
178+
169179
</idea-plugin>

0 commit comments

Comments
 (0)