diff --git a/build.gradle.kts b/build.gradle.kts index 6329036..a9fda76 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.intellij.platform.gradle.extensions.intellijPlatform + plugins { id("org.jetbrains.kotlin.jvm") id("org.jetbrains.intellij.platform") @@ -30,5 +32,6 @@ intellijPlatform { } } -// 注意: 不强制 jvmToolchain,直接使用 Gradle JVM(IDE 自带的 JBR 17/21 均可)。 -// 需要的 JDK 版本: 17+(IntelliJ Platform 插件构建要求) \ No newline at end of file +kotlin { + jvmToolchain(17) +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 788cfdd..acb9509 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,16 +1,12 @@ pluginManagement { plugins { id("org.jetbrains.kotlin.jvm") version "2.0.21" + id("org.jetbrains.intellij.platform") version "2.1.0" + } + repositories { + mavenCentral() + gradlePluginPortal() } } -rootProject.name = "harmness-browser" - -dependencyResolutionManagement { - repositories { - mavenCentral() - intellijPlatform { - defaultRepositories() - } - } -} \ No newline at end of file +rootProject.name = "harmness-browser" \ No newline at end of file diff --git a/src/main/kotlin/com/harmness/toolwindow/HarmnessBrowserPanel.kt b/src/main/kotlin/com/harmness/toolwindow/HarmnessBrowserPanel.kt index df39607..1737f19 100644 --- a/src/main/kotlin/com/harmness/toolwindow/HarmnessBrowserPanel.kt +++ b/src/main/kotlin/com/harmness/toolwindow/HarmnessBrowserPanel.kt @@ -16,6 +16,7 @@ import org.cef.handler.CefLoadHandlerAdapter import java.awt.BorderLayout import java.awt.Desktop import java.awt.FlowLayout +import java.awt.event.ActionEvent import javax.swing.AbstractAction import javax.swing.JButton import javax.swing.JComponent @@ -56,22 +57,21 @@ class HarmnessBrowserPanel( "JCEF (Java Chromium Embedded Framework) is not supported in this IDE instance.\n" + "Please use an IDE build that bundles JCEF, or a compatible JDK.", 0), BorderLayout.CENTER) - return + } else { + browser = JBCefBrowser() + + // 布局:顶部工具栏 + 浏览器 + add(createToolbar(), BorderLayout.NORTH) + add(browser.component, BorderLayout.CENTER) + + // 设置弹窗处理 + setupPopupHandling() + // 设置 JS 桥 + setupBridge() + + // 初始加载 + loadCurrentUrl() } - - browser = JBCefBrowser() - - // 布局:顶部工具栏 + 浏览器 - add(createToolbar(), BorderLayout.NORTH) - add(browser.component, BorderLayout.CENTER) - - // 设置弹窗处理 - setupPopupHandling() - // 设置 JS 桥 - setupBridge() - - // 初始加载 - loadCurrentUrl() } // ------------------------------------------------------------------ @@ -81,15 +81,25 @@ class HarmnessBrowserPanel( private fun createToolbar(): JComponent { val cefBrowser = browser.cefBrowser - val back = JButton(AbstractAction("←") { - if (cefBrowser.canGoBack()) cefBrowser.goBack() + val back = JButton(object : AbstractAction("←") { + override fun actionPerformed(e: ActionEvent) { + if (cefBrowser.canGoBack()) cefBrowser.goBack() + } }) - val forward = JButton(AbstractAction("→") { - if (cefBrowser.canGoForward()) cefBrowser.goForward() + val forward = JButton(object : AbstractAction("→") { + override fun actionPerformed(e: ActionEvent) { + if (cefBrowser.canGoForward()) cefBrowser.goForward() + } + }) + val reload = JButton(object : AbstractAction("⟳") { + override fun actionPerformed(e: ActionEvent) { cefBrowser.reload() } + }) + val settingsBtn = JButton(object : AbstractAction("⚙") { + override fun actionPerformed(e: ActionEvent) { openSettings() } + }) + val externalBtn = JButton(object : AbstractAction("⧉") { + override fun actionPerformed(e: ActionEvent) { openInExternalBrowser() } }) - val reload = JButton(AbstractAction("⟳") { cefBrowser.reload() }) - val settingsBtn = JButton(AbstractAction("⚙") { openSettings() }) - val externalBtn = JButton(AbstractAction("⧉") { openInExternalBrowser() }) addressField = JTextField(settings.startUrl) addressField.toolTipText = "当前页面地址(可手动输入后回车跳转)" diff --git a/src/main/kotlin/com/harmness/toolwindow/HarmnessSettingsConfigurable.kt b/src/main/kotlin/com/harmness/toolwindow/HarmnessSettingsConfigurable.kt index 1c3d97d..b3fa402 100644 --- a/src/main/kotlin/com/harmness/toolwindow/HarmnessSettingsConfigurable.kt +++ b/src/main/kotlin/com/harmness/toolwindow/HarmnessSettingsConfigurable.kt @@ -1,14 +1,13 @@ package com.harmness.toolwindow import com.intellij.openapi.options.Configurable -import com.intellij.openapi.options.Configurable.WithEpName import javax.swing.JComponent /** * Settings configurable registered in plugin.xml. * Shows the HarmnessBrowserConfigurablePanel under Tools → Harmness Browser. */ -class HarmnessSettingsConfigurable : Configurable, WithEpName { +class HarmnessSettingsConfigurable : Configurable { private var panel: HarmnessBrowserConfigurablePanel? = null diff --git a/src/main/kotlin/com/harmness/toolwindow/HarmnessToolWindowFactory.kt b/src/main/kotlin/com/harmness/toolwindow/HarmnessToolWindowFactory.kt index 0088bb6..33509d0 100644 --- a/src/main/kotlin/com/harmness/toolwindow/HarmnessToolWindowFactory.kt +++ b/src/main/kotlin/com/harmness/toolwindow/HarmnessToolWindowFactory.kt @@ -5,9 +5,7 @@ import com.intellij.openapi.project.DumbAware import com.intellij.openapi.project.Project import com.intellij.openapi.wm.ToolWindow import com.intellij.openapi.wm.ToolWindowFactory -import com.intellij.openapi.wm.ToolWindowManager import com.intellij.ui.content.ContentFactory -import javax.swing.JComponent /** * 本插件的工具窗口工厂。 @@ -15,53 +13,28 @@ import javax.swing.JComponent * 工具窗口是 IntelliJ 侧边栏的区域(如 Project、Terminal、Version Control), * 由 IntelliJ 自动管理生命周期。我们在此创建一个自定义工具窗口 "Harmness Browser", * 其内容就是 [HarmnessBrowserPanel]。 - * - * plugin.xml 中通过扩展点注册本类: - * ``` - * - * ``` */ class HarmnessToolWindowFactory : ToolWindowFactory, DumbAware { override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) { LOG.info("Creating Harmness Browser tool window for project: ${project.name}") - // 检查 JCEF 支持 - if (!isJcefSupported()) { - LOG.warn("JCEF is not supported in this IDE instance. The Harmness Browser tool window will show an error message.") - } - val panel = HarmnessBrowserPanel(project, toolWindow.disposable) val content = ContentFactory.getInstance().createContent(panel, "Browser", false) toolWindow.contentManager.addContent(content) - // 注册工具窗口可见性监听器,用于通知 WindowFocusService - toolWindow.addContentManagerListener(object : com.intellij.ui.content.ContentManagerListener { - override fun selectionChanged(selectionChange: com.intellij.ui.content.ContentManagerEvent) { - val isActive = selectionChange.manager.selectedContent == selectionChange.content + // 当工具窗口被选中时刷新 + val contentMgr = toolWindow.contentManager + contentMgr.addContentManagerListener(object : com.intellij.ui.content.ContentManagerListener { + override fun selectionChanged(event: com.intellij.ui.content.ContentManagerEvent) { + val isActive = event.content == contentMgr.selectedContent WindowFocusService.getInstance().setActive(isActive) if (isActive) { - // 当工具窗口被选中时,触发面板刷新 panel.loadCurrentUrl() } } }) - - // 注册工具窗口可见性监听器(窗口获得/失去焦点) - toolWindow.addVisibleListener { visible -> - WindowFocusService.getInstance().setActive(visible) - } - } - - private fun isJcefSupported(): Boolean { - return try { - val clz = Class.forName("com.intellij.ui.jcef.JBCefApp") - val method = clz.getMethod("isSupported") - method.invoke(null) as Boolean - } catch (e: Exception) { - false - } } companion object {