package cn.yiiguxing.plugin.translate.ui; import com.intellij.ui.components.panels.NonOpaquePanel; import com.intellij.util.Consumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; /** * Icon Button. */ public class IconButton extends NonOpaquePanel { private final Icon icon; private final Icon pressIcon; private boolean isPressedByMouse; private boolean isActive = true; private final Consumer<MouseEvent> listener; public IconButton(@NotNull Icon icon, @Nullable Icon pressIcon, @NotNull Consumer<MouseEvent> listener) { this.icon = icon; this.pressIcon = pressIcon; this.listener = listener; addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent e) { IconButton.this.listener.consume(e); } @Override public void mousePressed(MouseEvent e) { isPressedByMouse = true; IconButton.this.repaint(); } @Override public void mouseReleased(MouseEvent e) { isPressedByMouse = false; IconButton.this.repaint(); } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { isPressedByMouse = false; IconButton.this.repaint(); } }); } @Override public Dimension getPreferredSize() { return new Dimension(icon.getIconWidth(), icon.getIconHeight()); } public void setActive(final boolean active) { this.isActive = active; this.repaint(); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (hasPaint()) { paintIcon(g, (!isActive || isPressedByMouse) && pressIcon != null ? pressIcon : icon); } } protected boolean hasPaint() { return getWidth() > 0; } protected void paintIcon(@NotNull Graphics g, @NotNull Icon icon) { icon.paintIcon(this, g, 0, (getHeight() - icon.getIconHeight()) / 2); } }