/* * JAME 6.2.1 * http://jame.sourceforge.net * * Copyright 2001, 2016 Andrea Medeghini * * This file is part of JAME. * * JAME is an application for creating fractals and other graphics artifacts. * * JAME is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * JAME 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with JAME. If not, see <http://www.gnu.org/licenses/>. * */ package net.sf.jame.core.swing; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Insets; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JComponent; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicButtonUI; import net.sf.jame.core.swing.util.GUIUtil; /** * @author Andrea Medeghini */ public class IconButtonUI extends BasicButtonUI { private IconButtonController listener; /** * @param c * @return */ public static ComponentUI createUI(final JComponent c) { return new IconButtonUI(); } /** * @see java.lang.Object#finalize() */ @Override public void finalize() throws Throwable { listener = null; super.finalize(); } /** * @see javax.swing.plaf.ComponentUI#installUI(javax.swing.JComponent) */ @Override public void installUI(final JComponent c) { super.installUI(c); c.setBorder(null); listener = new IconButtonController((IconButton) c); installListeners((IconButton) c); } /** * @see javax.swing.plaf.ComponentUI#uninstallUI(javax.swing.JComponent) */ @Override public void uninstallUI(final JComponent c) { uninstallListeners((IconButton) c); listener = null; super.uninstallUI(c); } private void installListeners(final IconButton c) { c.addMouseListener(listener); c.addFocusListener(listener); } private void uninstallListeners(final IconButton c) { c.removeMouseListener(listener); c.removeFocusListener(listener); } /** * @see javax.swing.plaf.ComponentUI#getPreferredSize(javax.swing.JComponent) */ @Override public Dimension getPreferredSize(final JComponent c) { final IconButton button = (IconButton) c; final Insets insets = c.getInsets(); final int w = button.getNormalImage().getWidth(null) + insets.left + insets.right; final int h = button.getNormalImage().getHeight(null) + insets.top + insets.bottom; return new Dimension(w, h); } /** * @see javax.swing.plaf.ComponentUI#getMinimumSize(javax.swing.JComponent) */ @Override public Dimension getMinimumSize(final JComponent c) { return getPreferredSize(c); } /** * @see javax.swing.plaf.ComponentUI#getMaximumSize(javax.swing.JComponent) */ @Override public Dimension getMaximumSize(final JComponent c) { return getPreferredSize(c); } /** * @see javax.swing.plaf.ComponentUI#paint(java.awt.Graphics, javax.swing.JComponent) */ @Override public void paint(final Graphics g, final JComponent c) { final IconButton button = (IconButton) c; // System.out.println(button.getModel().isPressed()); final Insets insets = c.getInsets(); // final Dimension size = c.getSize(); if (!button.getModel().isEnabled()) { g.drawImage(button.getDisabledImage(), insets.left, insets.top, null); } else if (button.getModel().isPressed()) { g.drawImage(button.getFocusedImage(), insets.left, insets.top, null); } else if (button.getModel().isRollover()) { g.drawImage(button.getPressedImage(), insets.left, insets.top, null); } else if (button.getModel().isSelected()) { g.drawImage(button.getPressedImage(), insets.left, insets.top, null); } else if (button.hasFocus()) { g.drawImage(button.getFocusedImage(), insets.left, insets.top, null); } else { g.drawImage(button.getNormalImage(), insets.left, insets.top, null); } } private class IconButtonController implements ChangeListener, MouseListener, FocusListener { private final RepeatTask task = new RepeatTask(); private final IconButton button; private Thread thread; private boolean running; private long repeatTime; /** * @param button */ public IconButtonController(final IconButton button) { this.button = button; } public void stateChanged(final ChangeEvent e) { } public void mouseClicked(final MouseEvent e) { } public void mouseEntered(final MouseEvent e) { button.getModel().setRollover(true); if (button.getModel().isPressed()) { button.getModel().setArmed(true); } button.repaint(); } public void mouseExited(final MouseEvent e) { if (thread != null) { running = false; thread.interrupt(); try { thread.join(); } catch (final InterruptedException x) { } thread = null; } button.getModel().setRollover(false); button.getModel().setArmed(false); button.repaint(); } public void mousePressed(final MouseEvent e) { button.getModel().setSelected(true); button.getModel().setPressed(true); button.getModel().setArmed(true); button.requestFocus(); button.repaint(); if (e.isShiftDown()) { repeatTime = button.getRepeatTime() / 4; } else { repeatTime = button.getRepeatTime(); } if ((repeatTime > 0) && (thread == null)) { thread = new Thread(task, "IconButtonUI Task"); thread.setPriority(Thread.MIN_PRIORITY); thread.setDaemon(true); running = true; thread.start(); } } public void mouseReleased(final MouseEvent e) { if (thread != null) { running = false; thread.interrupt(); try { thread.join(); } catch (final InterruptedException x) { } thread = null; } button.getModel().setSelected(false); button.getModel().setPressed(false); button.getModel().setArmed(false); button.repaint(); } public void focusGained(final FocusEvent e) { button.repaint(); } public void focusLost(final FocusEvent e) { button.repaint(); } private class RepeatTask implements Runnable { /** * @see java.lang.Runnable#run() */ public void run() { try { Thread.sleep(500); while (running) { GUIUtil.executeTask(new Runnable() { public void run() { button.getModel().setSelected(false); button.getModel().setPressed(false); button.getModel().setArmed(false); button.getModel().setSelected(true); button.getModel().setPressed(true); button.getModel().setArmed(true); } }, false); Thread.sleep(repeatTime); } } catch (final InterruptedException e) { Thread.currentThread().interrupt(); } } } } }