package org.plantuml.idea.toolwindow; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.ui.JBColor; import com.intellij.ui.PopupHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.plantuml.idea.action.context.*; import org.plantuml.idea.rendering.ImageItem; import org.plantuml.idea.rendering.RenderRequest; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.URI; public class PlantUmlImageLabel extends JLabel { private static final AnAction[] AN_ACTIONS = { new SaveDiagramToFileContextAction(), new CopyDiagramToClipboardContextAction(), Separator.getInstance(), new CopyDiagramAsTxtToClipboardContextAction(), new CopyDiagramAsUnicodeTxtToClipboardContextAction(), Separator.getInstance(), new ExternalOpenDiagramAsPNGAction(), new ExternalOpenDiagramAsSVGAction(), Separator.getInstance(), new CopyPlantUmlServerLinkContextAction() }; private static final ActionPopupMenu ACTION_POPUP_MENU = ActionManager.getInstance().createActionPopupMenu(ActionPlaces.UNKNOWN, new ActionGroup() { @NotNull @Override public AnAction[] getChildren(@Nullable AnActionEvent e) { return AN_ACTIONS; } }); private static Logger logger = Logger.getInstance(PlantUmlImageLabel.class); private RenderRequest renderRequest; private ImageItem imageWithData; public PlantUmlImageLabel() { } public PlantUmlImageLabel(ImageItem imageWithData, int i, RenderRequest renderRequest) { this.imageWithData = imageWithData; setup(this.imageWithData, i, renderRequest); } public ImageItem getImageWithData() { return imageWithData; } public int getPage() { return imageWithData.getPage(); } public RenderRequest getRenderRequest() { return renderRequest; } public void setup(@NotNull ImageItem imageWithData, int i, RenderRequest renderRequest) { setOpaque(true); setBackground(JBColor.WHITE); if (imageWithData.hasImage()) { setDiagram(imageWithData, this, 100); } else { setText("page not rendered, probably plugin error, please report it and try to hit reload"); } this.renderRequest = renderRequest; } /** * Scales the image and sets it to label * * @param imageItem source image and url data * @param label destination label * @param zoom zoom factor */ private static void setDiagram(@NotNull final ImageItem imageItem, final JLabel label, int zoom) { Image image = imageItem.getImage(); int newWidth; int newHeight; Image scaledImage; if (zoom == 100) { // default zoom, no scaling newWidth = image.getWidth(label); newHeight = image.getHeight(label); scaledImage = image; } else { newWidth = Math.round(image.getWidth(label) * zoom / 100.0f); newHeight = Math.round(image.getHeight(label) * zoom / 100.0f); scaledImage = image.getScaledInstance(newWidth, newHeight, Image.SCALE_DEFAULT); } label.setIcon(new ImageIcon(scaledImage)); label.setPreferredSize(new Dimension(newWidth, newHeight)); label.addMouseListener(new PopupHandler() { @Override public void invokePopup(Component comp, int x, int y) { ACTION_POPUP_MENU.getComponent().show(comp, x, y); } }); //Removing all children from image label and creating transparent buttons for each item with url label.removeAll(); for (ImageItem.UrlData url : imageItem.getUrls()) { final URI uri = url.getUri(); JButton button = new JButton(); button.setContentAreaFilled(false); button.setBorder(null); button.setLocation(url.getClickArea().getLocation()); button.setSize(url.getClickArea().getSize()); button.setCursor(new Cursor(Cursor.HAND_CURSOR)); //When user clicks on item, url is opened in default system browser button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { try { Desktop.getDesktop().browse(uri); } catch (IOException e) { logger.warn(e); } } }); label.add(button); } } }