/* Copyright 2008-2010 Gephi Authors : Mathieu Bastian <mathieu.bastian@gephi.org> Website : http://www.gephi.org This file is part of Gephi. Gephi is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gephi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Gephi. If not, see <http://www.gnu.org/licenses/>. */ package org.gephi.ui.components; import java.awt.Component; import java.awt.Graphics; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import javax.swing.Icon; import javax.swing.JPopupMenu; import javax.swing.JToggleButton; import javax.swing.UIManager; //@author S. Aubrecht class JMenuToggleButton extends JToggleButton { private boolean mouseInArrowArea = false; /** Creates a new instance of MenuToggleButton */ public JMenuToggleButton(final Icon regIcon, Icon rollOverIcon, int arrowWidth) { assert null != regIcon; assert null != rollOverIcon; final Icon lineIcon = new LineIcon(rollOverIcon, arrowWidth); setIcon(regIcon); setRolloverIcon(lineIcon); setRolloverSelectedIcon(lineIcon); setFocusable(false); addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { mouseInArrowArea = isInArrowArea(e.getPoint()); setRolloverIcon(mouseInArrowArea ? regIcon : lineIcon); setRolloverSelectedIcon(mouseInArrowArea ? regIcon : lineIcon); } }); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (isInArrowArea(e.getPoint())) { JPopupMenu popup = getPopupMenu(); if (null != popup) { popup.show(JMenuToggleButton.this, 0, getHeight()); } } } public void mouseEntered(MouseEvent e) { mouseInArrowArea = isInArrowArea(e.getPoint()); setRolloverIcon(mouseInArrowArea ? regIcon : lineIcon); setRolloverSelectedIcon(mouseInArrowArea ? regIcon : lineIcon); } public void mouseExited(MouseEvent e) { mouseInArrowArea = false; setRolloverIcon(regIcon); setRolloverSelectedIcon(regIcon); } }); setModel(new Model()); } protected JPopupMenu getPopupMenu() { return null; } private boolean isInArrowArea(Point p) { return p.getLocation().x >= getWidth() - 3 - 2 - getInsets().right; } private static class LineIcon implements Icon { private Icon origIcon; private int arrowWidth; public LineIcon(Icon origIcon, int arrowWidth) { this.origIcon = origIcon; this.arrowWidth = arrowWidth; } public void paintIcon(Component c, Graphics g, int x, int y) { origIcon.paintIcon(c, g, x, y); g.setColor(UIManager.getColor("controlHighlight")); //NOI18N g.drawLine(x + origIcon.getIconWidth() - arrowWidth - 2, y, x + origIcon.getIconWidth() - arrowWidth - 2, y + getIconHeight()); g.setColor(UIManager.getColor("controlShadow")); //NOI18N g.drawLine(x + origIcon.getIconWidth() - arrowWidth - 3, y, x + origIcon.getIconWidth() - arrowWidth - 3, y + getIconHeight()); } public int getIconWidth() { return origIcon.getIconWidth(); } public int getIconHeight() { return origIcon.getIconHeight(); } } private class Model extends JToggleButton.ToggleButtonModel { public void setPressed(boolean b) { if (mouseInArrowArea) { return; } super.setPressed(b); } } }