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 {
|
plugins {
|
||||||
id("org.jetbrains.kotlin.jvm")
|
id("org.jetbrains.kotlin.jvm")
|
||||||
id("org.jetbrains.intellij.platform")
|
id("org.jetbrains.intellij.platform")
|
||||||
@@ -30,5 +32,6 @@ intellijPlatform {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注意: 不强制 jvmToolchain,直接使用 Gradle JVM(IDE 自带的 JBR 17/21 均可)。
|
kotlin {
|
||||||
// 需要的 JDK 版本: 17+(IntelliJ Platform 插件构建要求)
|
jvmToolchain(17)
|
||||||
|
}
|
||||||
+6
-10
@@ -1,16 +1,12 @@
|
|||||||
pluginManagement {
|
pluginManagement {
|
||||||
plugins {
|
plugins {
|
||||||
id("org.jetbrains.kotlin.jvm") version "2.0.21"
|
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"
|
rootProject.name = "harmness-browser"
|
||||||
|
|
||||||
dependencyResolutionManagement {
|
|
||||||
repositories {
|
|
||||||
mavenCentral()
|
|
||||||
intellijPlatform {
|
|
||||||
defaultRepositories()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -16,6 +16,7 @@ import org.cef.handler.CefLoadHandlerAdapter
|
|||||||
import java.awt.BorderLayout
|
import java.awt.BorderLayout
|
||||||
import java.awt.Desktop
|
import java.awt.Desktop
|
||||||
import java.awt.FlowLayout
|
import java.awt.FlowLayout
|
||||||
|
import java.awt.event.ActionEvent
|
||||||
import javax.swing.AbstractAction
|
import javax.swing.AbstractAction
|
||||||
import javax.swing.JButton
|
import javax.swing.JButton
|
||||||
import javax.swing.JComponent
|
import javax.swing.JComponent
|
||||||
@@ -56,22 +57,21 @@ class HarmnessBrowserPanel(
|
|||||||
"JCEF (Java Chromium Embedded Framework) is not supported in this IDE instance.\n" +
|
"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),
|
"Please use an IDE build that bundles JCEF, or a compatible JDK.", 0),
|
||||||
BorderLayout.CENTER)
|
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 {
|
private fun createToolbar(): JComponent {
|
||||||
val cefBrowser = browser.cefBrowser
|
val cefBrowser = browser.cefBrowser
|
||||||
|
|
||||||
val back = JButton(AbstractAction("←") {
|
val back = JButton(object : AbstractAction("←") {
|
||||||
if (cefBrowser.canGoBack()) cefBrowser.goBack()
|
override fun actionPerformed(e: ActionEvent) {
|
||||||
|
if (cefBrowser.canGoBack()) cefBrowser.goBack()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
val forward = JButton(AbstractAction("→") {
|
val forward = JButton(object : AbstractAction("→") {
|
||||||
if (cefBrowser.canGoForward()) cefBrowser.goForward()
|
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 = JTextField(settings.startUrl)
|
||||||
addressField.toolTipText = "当前页面地址(可手动输入后回车跳转)"
|
addressField.toolTipText = "当前页面地址(可手动输入后回车跳转)"
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
package com.harmness.toolwindow
|
package com.harmness.toolwindow
|
||||||
|
|
||||||
import com.intellij.openapi.options.Configurable
|
import com.intellij.openapi.options.Configurable
|
||||||
import com.intellij.openapi.options.Configurable.WithEpName
|
|
||||||
import javax.swing.JComponent
|
import javax.swing.JComponent
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Settings configurable registered in plugin.xml.
|
* Settings configurable registered in plugin.xml.
|
||||||
* Shows the HarmnessBrowserConfigurablePanel under Tools → Harmness Browser.
|
* Shows the HarmnessBrowserConfigurablePanel under Tools → Harmness Browser.
|
||||||
*/
|
*/
|
||||||
class HarmnessSettingsConfigurable : Configurable, WithEpName {
|
class HarmnessSettingsConfigurable : Configurable {
|
||||||
|
|
||||||
private var panel: HarmnessBrowserConfigurablePanel? = null
|
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.project.Project
|
||||||
import com.intellij.openapi.wm.ToolWindow
|
import com.intellij.openapi.wm.ToolWindow
|
||||||
import com.intellij.openapi.wm.ToolWindowFactory
|
import com.intellij.openapi.wm.ToolWindowFactory
|
||||||
import com.intellij.openapi.wm.ToolWindowManager
|
|
||||||
import com.intellij.ui.content.ContentFactory
|
import com.intellij.ui.content.ContentFactory
|
||||||
import javax.swing.JComponent
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 本插件的工具窗口工厂。
|
* 本插件的工具窗口工厂。
|
||||||
@@ -15,53 +13,28 @@ import javax.swing.JComponent
|
|||||||
* 工具窗口是 IntelliJ 侧边栏的区域(如 Project、Terminal、Version Control),
|
* 工具窗口是 IntelliJ 侧边栏的区域(如 Project、Terminal、Version Control),
|
||||||
* 由 IntelliJ 自动管理生命周期。我们在此创建一个自定义工具窗口 "Harmness Browser",
|
* 由 IntelliJ 自动管理生命周期。我们在此创建一个自定义工具窗口 "Harmness Browser",
|
||||||
* 其内容就是 [HarmnessBrowserPanel]。
|
* 其内容就是 [HarmnessBrowserPanel]。
|
||||||
*
|
|
||||||
* plugin.xml 中通过扩展点注册本类:
|
|
||||||
* ```
|
|
||||||
* <toolWindow id="Harmness Browser" ... factoryClass="com.harmness.toolwindow.HarmnessToolWindowFactory"/>
|
|
||||||
* ```
|
|
||||||
*/
|
*/
|
||||||
class HarmnessToolWindowFactory : ToolWindowFactory, DumbAware {
|
class HarmnessToolWindowFactory : ToolWindowFactory, DumbAware {
|
||||||
|
|
||||||
override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) {
|
override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) {
|
||||||
LOG.info("Creating Harmness Browser tool window for project: ${project.name}")
|
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 panel = HarmnessBrowserPanel(project, toolWindow.disposable)
|
||||||
|
|
||||||
val content = ContentFactory.getInstance().createContent(panel, "Browser", false)
|
val content = ContentFactory.getInstance().createContent(panel, "Browser", false)
|
||||||
toolWindow.contentManager.addContent(content)
|
toolWindow.contentManager.addContent(content)
|
||||||
|
|
||||||
// 注册工具窗口可见性监听器,用于通知 WindowFocusService
|
// 当工具窗口被选中时刷新
|
||||||
toolWindow.addContentManagerListener(object : com.intellij.ui.content.ContentManagerListener {
|
val contentMgr = toolWindow.contentManager
|
||||||
override fun selectionChanged(selectionChange: com.intellij.ui.content.ContentManagerEvent) {
|
contentMgr.addContentManagerListener(object : com.intellij.ui.content.ContentManagerListener {
|
||||||
val isActive = selectionChange.manager.selectedContent == selectionChange.content
|
override fun selectionChanged(event: com.intellij.ui.content.ContentManagerEvent) {
|
||||||
|
val isActive = event.content == contentMgr.selectedContent
|
||||||
WindowFocusService.getInstance().setActive(isActive)
|
WindowFocusService.getInstance().setActive(isActive)
|
||||||
if (isActive) {
|
if (isActive) {
|
||||||
// 当工具窗口被选中时,触发面板刷新
|
|
||||||
panel.loadCurrentUrl()
|
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 {
|
companion object {
|
||||||
|
|||||||
Reference in New Issue
Block a user