Fix compile errors; adopt plugin ID com.prepeep.harmness-browser and official Gradle wrapper; build success

This commit is contained in:
harmness
2026-09-10 17:34:56 +08:00
parent c9c6744cc0
commit e795320845
5 changed files with 49 additions and 68 deletions
+5 -2
View File
@@ -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 JVMIDE 自带的 JBR 17/21 均可)。
// 需要的 JDK 版本: 17+IntelliJ Platform 插件构建要求)
kotlin {
jvmToolchain(17)
}
+6 -10
View File
@@ -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()
}
}
}
rootProject.name = "harmness-browser"
@@ -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 = "当前页面地址(可手动输入后回车跳转)"
@@ -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
@@ -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 中通过扩展点注册本类:
* ```
* <toolWindow id="Harmness Browser" ... factoryClass="com.harmness.toolwindow.HarmnessToolWindowFactory"/>
* ```
*/
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 {