package org.asciidoc.intellij.toolbar; import com.intellij.ide.DataManager; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.ActionGroup; import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.Separator; import com.intellij.openapi.editor.Editor; import com.intellij.ui.HyperlinkAdapter; import com.intellij.ui.HyperlinkLabel; import org.jetbrains.annotations.NotNull; import javax.swing.*; import javax.swing.event.HyperlinkEvent; import java.awt.*; /** inspired by {@link com.intellij.ui.EditorNotificationPanel} */ public class AsciiDocToolbarPanel extends JPanel implements Disposable { protected static final String ASCII_DOC_ACTION_GROUP_ID = "AsciiDoc.TextFormatting"; private Editor myEditor; private final JPanel myLinksPanel; public AsciiDocToolbarPanel(Editor editor) { super(new BorderLayout()); myEditor = editor; myEditor.putUserData(AsciiDocToolbarLoaderComponent.ASCII_DOC_TOOLBAR, this); myLinksPanel = new JPanel(new FlowLayout()); JPanel panel = new JPanel(new BorderLayout()); panel.setBorder(BorderFactory.createEmptyBorder(1, 5, 1, 5)); panel.add("West", this.myLinksPanel); panel.setMinimumSize(new Dimension(0, 0)); this.add("Center", panel); ActionGroup anAction = (ActionGroup)ActionManager.getInstance().getAction(ASCII_DOC_ACTION_GROUP_ID); addChildren(anAction); } private void addChildren(@NotNull ActionGroup anAction) { AnAction[] children = anAction.getChildren(null); for (AnAction child : children) { if (child instanceof ActionGroup) { addChildren(((ActionGroup)child)); } else if (child instanceof Separator) { } else { createActionLabel(child); } } } public HyperlinkLabel createActionLabel(@NotNull final AnAction anAction) { Icon icon = anAction.getTemplatePresentation().getIcon(); HyperlinkLabel label = new HyperlinkLabel(icon == null ? anAction.getTemplatePresentation().getText() : ""); if (icon != null) { label.setIcon(icon); label.setUseIconAsLink(true); } label.addHyperlinkListener(new HyperlinkAdapter() { protected void hyperlinkActivated(HyperlinkEvent e) { executeAction(anAction); } }); this.myLinksPanel.add(label); return label; } protected void executeAction(AnAction action) { AnActionEvent event = new AnActionEvent(null, DataManager.getInstance().getDataContext(this), "AsciiDocToolbarPanel", action.getTemplatePresentation(), ActionManager.getInstance(), 0); action.beforeActionPerformedUpdate(event); action.update(event); if (event.getPresentation().isEnabled() && event.getPresentation().isVisible()) { action.actionPerformed(event); } } @Override public void dispose() { myEditor.putUserData(AsciiDocToolbarLoaderComponent.ASCII_DOC_TOOLBAR, null); myEditor = null; } }