Fix compile errors; adopt plugin ID com.prepeep.harmness-browser and official Gradle wrapper; build success
This commit is contained in:
+5
-2
@@ -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 插件构建要求)
|
||||
kotlin {
|
||||
jvmToolchain(17)
|
||||
}
|
||||
+6
-10
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user