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;
+ }
+
+}