/*********************************************************************** * mt4j Copyright (c) 2008 - 2009, C.Ruff, Fraunhofer-Gesellschaft All rights reserved. * * This program 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. * * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. * ***********************************************************************/ package org.mt4j.components.visibleComponents.widgets.buttons; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import org.mt4j.components.bounds.BoundsZPlaneRectangle; import org.mt4j.components.bounds.IBoundingShape; import org.mt4j.components.interfaces.IclickableButton; import org.mt4j.components.visibleComponents.shapes.AbstractShape; import org.mt4j.components.visibleComponents.shapes.MTRectangle; import org.mt4j.input.gestureAction.DefaultButtonClickAction; import org.mt4j.input.inputProcessors.componentProcessors.dragProcessor.DragProcessor; import org.mt4j.input.inputProcessors.componentProcessors.rotateProcessor.RotateProcessor; import org.mt4j.input.inputProcessors.componentProcessors.scaleProcessor.ScaleProcessor; import org.mt4j.input.inputProcessors.componentProcessors.tapProcessor.TapEvent; import org.mt4j.input.inputProcessors.componentProcessors.tapProcessor.TapProcessor; import processing.core.PApplet; import processing.core.PImage; /** * The Class MTImageButton. Can be used as a button displaying an image. * A tapprocessor is registered automatically. We can check if the button was * clicked by adding an actionlistener to it. * @author Christopher Ruff */ public class MTImageButton extends MTRectangle implements IclickableButton { /** The selected. */ private boolean selected; /** The registered action listeners. */ private ArrayList<ActionListener> registeredActionListeners; /** * Instantiates a new mT image button. * * @param texture the texture * @param pApplet the applet */ public MTImageButton(PImage texture, PApplet pApplet) { super(texture, pApplet); this.registeredActionListeners = new ArrayList<ActionListener>(); this.setName("Unnamed image button"); this.selected = false; this.setGestureAllowance(DragProcessor.class, false); this.setGestureAllowance(RotateProcessor.class, false); this.setGestureAllowance(ScaleProcessor.class, false); this.setEnabled(true); this.setBoundsBehaviour(AbstractShape.BOUNDS_ONLY_CHECK); //Make clickable this.setGestureAllowance(TapProcessor.class, true); this.registerInputProcessor(new TapProcessor(pApplet)); this.addGestureListener(TapProcessor.class, new DefaultButtonClickAction(this)); //Draw this component and its children above //everything previously drawn and avoid z-fighting this.setDepthBufferDisabled(true); } @Override protected void setDefaultGestureActions() { //Dont register the usual drag,scale,rot processors } @Override protected IBoundingShape computeDefaultBounds(){ return new BoundsZPlaneRectangle(this); } /** * Adds the action listener. * * @param listener the listener */ public synchronized void addActionListener(ActionListener listener){ if (!registeredActionListeners.contains(listener)){ registeredActionListeners.add(listener); } } /** * Removes the action listener. * * @param listener the listener */ public synchronized void removeActionListener(ActionListener listener){ if (registeredActionListeners.contains(listener)){ registeredActionListeners.remove(listener); } } /** * Gets the action listeners. * * @return the action listeners */ public synchronized ActionListener[] getActionListeners(){ return (ActionListener[])registeredActionListeners.toArray(new ActionListener[this.registeredActionListeners.size()]); } /** * Fire action performed. */ protected void fireActionPerformed() { ActionListener[] listeners = this.getActionListeners(); synchronized(listeners) { for (int i = 0; i < listeners.length; i++) { ActionListener listener = (ActionListener)listeners[i]; listener.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "action performed on tangible button")); } } } /** * fires an action event with a ClickEvent Id as its ID. * * @param ce the ce */ public void fireActionPerformed(TapEvent ce) { ActionListener[] listeners = this.getActionListeners(); synchronized(listeners) { for (int i = 0; i < listeners.length; i++) { ActionListener listener = (ActionListener)listeners[i]; listener.actionPerformed(new ActionEvent(this, ce.getTapID(), "action performed on tangible button")); } } } public boolean isSelected() { return selected; } public void setSelected(boolean selected) { this.selected = selected; // this.setStrokeWeight(selected ? this.getStrokeWeight() + 2 : 0); } }