diff --git a/src/main/kotlin/com/smallcloud/refactai/panes/sharedchat/browser/ChatWebView.kt b/src/main/kotlin/com/smallcloud/refactai/panes/sharedchat/browser/ChatWebView.kt index b9d98a9c..e4c164e5 100644 --- a/src/main/kotlin/com/smallcloud/refactai/panes/sharedchat/browser/ChatWebView.kt +++ b/src/main/kotlin/com/smallcloud/refactai/panes/sharedchat/browser/ChatWebView.kt @@ -3,24 +3,20 @@ package com.smallcloud.refactai.panes.sharedchat.browser import com.google.gson.Gson import com.intellij.ide.BrowserUtil import com.intellij.openapi.Disposable -import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.keymap.Keymap import com.intellij.openapi.keymap.KeymapManager +import com.intellij.openapi.keymap.KeymapUtil import com.intellij.ui.jcef.* -import com.intellij.util.messages.MessageBus import com.intellij.util.ui.UIUtil import com.smallcloud.refactai.PluginState -import com.smallcloud.refactai.account.AccountManagerChangedNotifier +import com.smallcloud.refactai.lsp.LSPCapabilities +import com.smallcloud.refactai.lsp.LSPProcessHolderChangedNotifier +import com.smallcloud.refactai.panes.sharedchat.Editor import com.smallcloud.refactai.panes.sharedchat.Events -import com.smallcloud.refactai.settings.AppSettingsState import org.cef.CefApp import org.cef.browser.CefBrowser import org.cef.handler.CefLoadHandlerAdapter import javax.swing.JComponent -import com.intellij.openapi.keymap.KeymapUtil -import com.smallcloud.refactai.panes.sharedchat.Editor -import javax.swing.JFrame -import javax.swing.JWindow fun getActionKeybinding(actionId: String): String { @@ -36,7 +32,7 @@ fun getActionKeybinding(actionId: String): String { return KeymapUtil.getShortcutText(shortcuts[0]) } -class ChatWebView(val editor: Editor , val messageHandler: (event: Events.FromChat) -> Unit): Disposable { +class ChatWebView(val editor: Editor, val messageHandler: (event: Events.FromChat) -> Unit) : Disposable { private val jsPoolSize = "200" init { @@ -45,8 +41,16 @@ class ChatWebView(val editor: Editor , val messageHandler: (event: Events.FromC fun setStyle() { val isDarkMode = UIUtil.isUnderDarcula() - val mode = if (isDarkMode) { "dark" } else { "light" } - val bodyClass = if (isDarkMode) { "vscode-dark" } else { "vscode-light" } + val mode = if (isDarkMode) { + "dark" + } else { + "light" + } + val bodyClass = if (isDarkMode) { + "vscode-dark" + } else { + "vscode-light" + } val backgroundColour = UIUtil.getPanelBackground() val red = backgroundColour.red val green = backgroundColour.green @@ -68,6 +72,7 @@ class ChatWebView(val editor: Editor , val messageHandler: (event: Events.FromC val browser = JBCefBrowser .createBuilder() + .setEnableOpenDevToolsMenuItem(true) .setUrl("http://refactai/index.html") .setOffScreenRendering(useOsr) .build() @@ -76,7 +81,9 @@ class ChatWebView(val editor: Editor , val messageHandler: (event: Events.FromC JBCefClient.Properties.JS_QUERY_POOL_SIZE, jsPoolSize, ) - browser.setProperty(JBCefBrowserBase.Properties.NO_CONTEXT_MENU, true) + if (System.getenv("REFACT_DEBUG") != "1") { + browser.setProperty(JBCefBrowserBase.Properties.NO_CONTEXT_MENU, true) + } CefApp.getInstance().registerSchemeHandlerFactory("http", "refactai", RequestHandlerFactory()) @@ -85,7 +92,7 @@ class ChatWebView(val editor: Editor , val messageHandler: (event: Events.FromC val myJSQueryOpenInBrowserRedirectHyperlink = JBCefJSQuery.create((browser as JBCefBrowserBase?)!!) myJSQueryOpenInBrowserRedirectHyperlink.addHandler { href -> - if(href.isNotEmpty()) { + if (href.isNotEmpty()) { BrowserUtil.browse(href) } null @@ -94,18 +101,18 @@ class ChatWebView(val editor: Editor , val messageHandler: (event: Events.FromC var installedScript = false var setupReact = false - browser.jbCefClient.addLoadHandler(object: CefLoadHandlerAdapter() { + browser.jbCefClient.addLoadHandler(object : CefLoadHandlerAdapter() { override fun onLoadingStateChange( browser: CefBrowser, isLoading: Boolean, canGoBack: Boolean, canGoForward: Boolean ) { - if(isLoading) { + if (isLoading) { return; } - if(!installedScript) { + if (!installedScript) { installedScript = setUpJavaScriptMessageBus(browser, myJSQueryOpenInBrowser) } @@ -120,11 +127,9 @@ class ChatWebView(val editor: Editor , val messageHandler: (event: Events.FromC }, browser.cefBrowser) - val messageBus: MessageBus = ApplicationManager.getApplication().messageBus - messageBus - .connect(PluginState.instance) - .subscribe(AccountManagerChangedNotifier.TOPIC, object : AccountManagerChangedNotifier { - override fun apiKeyChanged(newApiKey: String?) { + editor.project.messageBus.connect(PluginState.instance) + .subscribe(LSPProcessHolderChangedNotifier.TOPIC, object : LSPProcessHolderChangedNotifier { + override fun capabilitiesChanged(newCaps: LSPCapabilities) { setupReact = false installedScript = false browser.cefBrowser.reload() @@ -133,12 +138,6 @@ class ChatWebView(val editor: Editor , val messageHandler: (event: Events.FromC }) browser.createImmediately() - - -// val dev = JBCefBrowser.createBuilder().setCefBrowser(browser.cefBrowser).setClient(browser.jbCefClient).build() -// JFrame().add(dev.component) -// dev.openDevtools() - browser } @@ -146,7 +145,7 @@ class ChatWebView(val editor: Editor , val messageHandler: (event: Events.FromC myJSQueryOpenInBrowser.addHandler { msg -> val event = Events.parse(msg) - if(event != null) { + if (event != null) { messageHandler(event) } null @@ -201,7 +200,7 @@ class ChatWebView(val editor: Editor , val messageHandler: (event: Events.FromC const msg = JSON.stringify(event); ${myJSQueryOpenInBrowser.inject("msg")} }""".trimIndent() - if(browser != null) { + if (browser != null) { browser.executeJavaScript(script, browser.url, 0); return true } @@ -209,7 +208,7 @@ class ChatWebView(val editor: Editor , val messageHandler: (event: Events.FromC } fun postMessage(message: Events.ToChat<*>?) { - if(message != null) { + if (message != null) { val json = Events.stringify(message) println("post message json: $json") this.postMessage(json)