diff --git a/plugins/devkit/devkit-core/resources/META-INF/plugin.xml b/plugins/devkit/devkit-core/resources/META-INF/plugin.xml index 9776625b9b92..b5d375e81e0d 100644 --- a/plugins/devkit/devkit-core/resources/META-INF/plugin.xml +++ b/plugins/devkit/devkit-core/resources/META-INF/plugin.xml @@ -267,11 +267,11 @@ - + @@ -347,6 +347,11 @@ + + + + + diff --git a/plugins/devkit/devkit-core/src/themes/ApplyThemeAction.java b/plugins/devkit/devkit-core/src/themes/ApplyThemeAction.java new file mode 100644 index 000000000000..b0130d793fa0 --- /dev/null +++ b/plugins/devkit/devkit-core/src/themes/ApplyThemeAction.java @@ -0,0 +1,69 @@ +// 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 org.jetbrains.idea.devkit.themes; + +import com.intellij.ide.ui.LafManager; +import com.intellij.ide.ui.UITheme; +import com.intellij.ide.ui.laf.UIThemeBasedLookAndFeelInfo; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.fileEditor.FileEditor; +import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.project.DumbAwareAction; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.ui.EditorNotificationPanel; +import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NotNull; + +import java.awt.*; +import java.awt.event.MouseEvent; +import java.io.IOException; + +/** + * @author Konstantin Bulenkov + */ +public class ApplyThemeAction extends DumbAwareAction { + @Override + public void actionPerformed(@NotNull AnActionEvent e) { + Project project = e.getProject(); + if (project == null) return; + VirtualFile file = fromMouseEvent(e); + + if (file == null) { + file = e.getData(CommonDataKeys.VIRTUAL_FILE); + if (file == null || !UITheme.isThemeFile(file)) { + for (FileEditor fileEditor : FileEditorManager.getInstance(project).getSelectedEditors()) { + if (UITheme.isThemeFile(fileEditor.getFile())) { + file = fileEditor.getFile(); + break; + } + } + } + } + + if (file != null && UITheme.isThemeFile(file)) { + applyTempTheme(file); + } + } + + private VirtualFile fromMouseEvent(AnActionEvent e) { + if (e.getInputEvent() instanceof MouseEvent) { + Component component = e.getInputEvent().getComponent(); + EditorNotificationPanel panel = UIUtil.getParentOfType(EditorNotificationPanel.class, component); + if (panel != null) { + } + } +return null; + } + + private static void applyTempTheme(@NotNull VirtualFile json) { + try { + FileDocumentManager.getInstance().saveAllDocuments(); + UITheme theme = UITheme.loadFromJson(json.getInputStream(), "Temp theme", null); + LafManager.getInstance().setCurrentLookAndFeel(new UIThemeBasedLookAndFeelInfo(theme)); + LafManager.getInstance().updateUI(); + } + catch (IOException ignore) {} + } +} diff --git a/plugins/devkit/devkit-core/src/themes/ApplyThemeLineMarkerProvider.java b/plugins/devkit/devkit-core/src/themes/ApplyThemeLineMarkerProvider.java deleted file mode 100644 index 9ce3f84748e1..000000000000 --- a/plugins/devkit/devkit-core/src/themes/ApplyThemeLineMarkerProvider.java +++ /dev/null @@ -1,68 +0,0 @@ -// 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 org.jetbrains.idea.devkit.themes; - -import com.intellij.codeInsight.daemon.LineMarkerInfo; -import com.intellij.execution.lineMarker.RunLineMarkerProvider; -import com.intellij.ide.ui.LafManager; -import com.intellij.ide.ui.UITheme; -import com.intellij.ide.ui.laf.UIThemeBasedLookAndFeelInfo; -import com.intellij.json.psi.JsonProperty; -import com.intellij.json.psi.JsonStringLiteral; -import com.intellij.json.psi.JsonValue; -import com.intellij.openapi.editor.markup.GutterIconRenderer; -import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.io.IOException; - -/** - * @author Konstantin Bulenkov - */ -public class ApplyThemeLineMarkerProvider extends RunLineMarkerProvider { - @NotNull - @Override - public String getName() { - return "Apply theme"; - } - - @Nullable - @Override - public LineMarkerInfo getLineMarkerInfo(@NotNull PsiElement psiElement) { - String name = psiElement.getContainingFile().getName(); - if (!name.endsWith(".theme.json")) { - return null; - } - PsiElement element = psiElement.getParent(); - if (element instanceof JsonStringLiteral && element.getText().equals("\"name\"")) { - return new LineMarkerInfo<>(psiElement, element.getTextRange(), getIcon(), - - psi -> { - PsiElement parent = psi.getParent().getParent(); - if (parent instanceof JsonProperty) { - JsonValue value = ((JsonProperty)parent).getValue(); - if (value != null) { - return "Apply '" + value.getText() + "' theme"; - } - } - return getName(); - }, - - (e, psi) -> applyTempTheme(psi.getContainingFile()), - GutterIconRenderer.Alignment.RIGHT); - } - return null; - } - - private static void applyTempTheme(@NotNull PsiFile json) { - try { - FileDocumentManager.getInstance().saveAllDocuments(); - UITheme theme = UITheme.loadFromJson(json.getVirtualFile().getInputStream(), "Temp theme", null); - LafManager.getInstance().setCurrentLookAndFeel(new UIThemeBasedLookAndFeelInfo(theme)); - LafManager.getInstance().updateUI(); - } - catch (IOException ignore) {} - } -} diff --git a/plugins/devkit/devkit-core/src/themes/ThemeEditorToolbar.java b/plugins/devkit/devkit-core/src/themes/ThemeEditorToolbar.java new file mode 100644 index 000000000000..1baf0ebc3d3f --- /dev/null +++ b/plugins/devkit/devkit-core/src/themes/ThemeEditorToolbar.java @@ -0,0 +1,54 @@ +// 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 org.jetbrains.idea.devkit.themes; + +import com.intellij.ide.DataManager; +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.actionSystem.DataProvider; +import com.intellij.openapi.actionSystem.DefaultActionGroup; +import com.intellij.openapi.fileEditor.FileEditor; +import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.ui.EditorNotificationPanel; +import com.intellij.ui.EditorNotifications; +import com.intellij.ui.JBColor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Konstantin Bulenkov + */ +public class ThemeEditorToolbar extends EditorNotifications.Provider implements DumbAware { + private static final Key KEY = Key.create("ThemeEditorToolbar"); + @NotNull + @Override + public Key getKey() { + return KEY; + } + + @Nullable + @Override + public EditorNotificationPanel createNotificationPanel(@NotNull VirtualFile file, @NotNull FileEditor fileEditor) { + if (StringUtil.endsWithIgnoreCase(file.getName(), ".theme.json")) { + EditorNotificationPanel panel = new EditorNotificationPanel(JBColor.PanelBackground); + panel.removeAll(); + DefaultActionGroup group = (DefaultActionGroup)ActionManager.getInstance().getAction("DevKit.ThemeEditorToolbar"); + panel.add(ActionManager.getInstance().createActionToolbar("ThemeEditor", group, true).getComponent()); + DataManager.registerDataProvider(panel, new DataProvider() { + @Nullable + @Override + public Object getData(@NotNull String dataId) { + if (CommonDataKeys.VIRTUAL_FILE.is(dataId)) { + return fileEditor.getFile(); + } + return null; + } + }); + return panel; + } + return null; + } + +}