From a5a158d7a6e1f86a40f8b8ca0e65054abd83d12a Mon Sep 17 00:00:00 2001 From: "Dmitry.Krasilschikov" Date: Wed, 17 Jun 2020 17:40:29 +0300 Subject: [PATCH] IJP-755 load what's new from jb.com right into editor GitOrigin-RevId: 2faca6e424af2151336c89e0f62a24631f462431 --- .../fileEditor/impl/HTMLEditorProvider.kt | 2 +- .../openapi/fileEditor/impl/HTMLFileEditor.kt | 70 ++++++++++++++----- .../updateSettings/impl/UpdateInfoDialog.java | 9 ++- 3 files changed, 61 insertions(+), 20 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/HTMLEditorProvider.kt b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/HTMLEditorProvider.kt index d178957a4e98..bb21e4c031d1 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/HTMLEditorProvider.kt +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/HTMLEditorProvider.kt @@ -11,7 +11,7 @@ import com.intellij.openapi.util.KeyWithDefaultValue import com.intellij.openapi.vfs.VirtualFile class HTMLEditorProvider : FileEditorProvider, DumbAware { - override fun createEditor(project: Project, file: VirtualFile): FileEditor = HTMLFileEditor(file) + override fun createEditor(project: Project, file: VirtualFile): FileEditor = HTMLFileEditor() override fun accept(project: Project, file: VirtualFile) = file.getUserData(HTML_CONTENT_TYPE)!! diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/HTMLFileEditor.kt b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/HTMLFileEditor.kt index cd118ea711a1..f680f4596535 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/HTMLFileEditor.kt +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/HTMLFileEditor.kt @@ -1,31 +1,60 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.openapi.fileEditor.impl +import com.intellij.CommonBundle +import com.intellij.ide.plugins.MultiPanel +import com.intellij.openapi.application.invokeLater import com.intellij.openapi.fileEditor.FileEditor import com.intellij.openapi.fileEditor.FileEditorLocation import com.intellij.openapi.fileEditor.FileEditorState import com.intellij.openapi.util.Key -import com.intellij.openapi.vfs.VfsUtil -import com.intellij.openapi.vfs.VirtualFile -import com.intellij.ui.ScrollPaneFactory -import com.intellij.util.ui.JBUI -import com.intellij.util.ui.UIUtil +import com.intellij.ui.components.JBLoadingPanel +import com.intellij.ui.jcef.JCEFHtmlPanel +import org.cef.browser.CefBrowser +import org.cef.handler.CefLoadHandlerAdapter +import java.awt.BorderLayout import java.beans.PropertyChangeListener -import javax.swing.JComponent -import javax.swing.JEditorPane -class HTMLFileEditor(private val vFile: VirtualFile) : FileEditor { - private val component: JComponent = - ScrollPaneFactory.createScrollPane( - JEditorPane().also { - it.editorKit = UIUtil.getHTMLEditorKit() - it.text = VfsUtil.loadText(vFile) - it.border = JBUI.Borders.empty(8, 12) - it.isEditable = false - }) +class HTMLFileEditor : FileEditor { + private val htmlPanelComponent = JCEFHtmlPanel(null) + private val loadingPanel = JBLoadingPanel(BorderLayout(), this).apply { setLoadingText(CommonBundle.getLoadingTreeNodeText()) } - override fun getComponent(): JComponent = component - override fun getPreferredFocusedComponent() = component + private val multiPanel: MultiPanel = object : MultiPanel() { + override fun create(key: Int) = when (key) { + LOADING_KEY -> loadingPanel + CONTENT_KEY -> htmlPanelComponent.component + else -> throw UnsupportedOperationException("Unknown key") + } + } + + var url: String = "about:blank" + set(value) { + field = value + htmlPanelComponent.loadURL(value) + multiPanel.select(CONTENT_KEY, true) + } + + init { + htmlPanelComponent.jbCefClient.addLoadHandler(object : CefLoadHandlerAdapter() { + override fun onLoadingStateChange(browser: CefBrowser?, isLoading: Boolean, canGoBack: Boolean, canGoForward: Boolean) { + if (isLoading) { + invokeLater { + loadingPanel.startLoading() + multiPanel.select(LOADING_KEY, true) + } + } + else { + invokeLater { + loadingPanel.stopLoading() + multiPanel.select(CONTENT_KEY, true) + } + } + } + }, htmlPanelComponent.cefBrowser) + } + + override fun getComponent() = multiPanel + override fun getPreferredFocusedComponent() = multiPanel override fun getName() = "HTML Preview" override fun setState(state: FileEditorState) {} override fun isModified(): Boolean = false @@ -36,4 +65,9 @@ class HTMLFileEditor(private val vFile: VirtualFile) : FileEditor { override fun removePropertyChangeListener(listener: PropertyChangeListener) {} override fun getCurrentLocation(): FileEditorLocation? = null override fun dispose() {} + + companion object { + const val LOADING_KEY = 1 + const val CONTENT_KEY = 0 + } } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateInfoDialog.java b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateInfoDialog.java index ed3044bf8cb7..dd9d5eddfdb7 100644 --- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateInfoDialog.java +++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateInfoDialog.java @@ -13,8 +13,10 @@ import com.intellij.openapi.application.*; import com.intellij.openapi.application.ex.ApplicationEx; import com.intellij.openapi.application.impl.ApplicationImpl; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.fileEditor.impl.HTMLEditorProvider; +import com.intellij.openapi.fileEditor.impl.HTMLFileEditor; import com.intellij.openapi.progress.PerformInBackgroundOption; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; @@ -32,6 +34,7 @@ import com.intellij.util.SystemProperties; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.text.DateFormatUtil; import com.intellij.util.ui.JBUI; +import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -101,7 +104,11 @@ final class UpdateInfoDialog extends AbstractUpdateDialog { String title = IdeBundle.message("update.whats.new.file.name", ApplicationInfo.getInstance().getFullVersion()); LightVirtualFile file = new LightVirtualFile(title, myNewBuild.getMessage()); file.putUserData(HTMLEditorProvider.Companion.getHTML_CONTENT_TYPE(), true); - FileEditorManager.getInstance(project).openFile(file, true); + FileEditor[] fileEditors = FileEditorManager.getInstance(project).openFile(file, true); + if (fileEditors.length > 0 && fileEditors[0] instanceof HTMLFileEditor) { + ((HTMLFileEditor)fileEditors[0]) + .setUrl(myNewBuild.getBlogPost() + "/?var=embed" + (UIUtil.isUnderDarcula() ? "&theme=dark" : "")); + } close(OK_EXIT_CODE); } };