/* (C) 2000-2002, DIUF, http://www.unifr.ch/diuf
*
* 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 2 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, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package iiuf.xmillum.displayable;
import java.awt.AlphaComposite;
import java.awt.Composite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JComponent;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import iiuf.xmillum.ActionHandler;
import iiuf.xmillum.ActionHandlerFactory;
import iiuf.xmillum.BrowserContext;
import iiuf.xmillum.Displayable;
import iiuf.xmillum.DisplayableAppearance;
import iiuf.xmillum.DisplayableClass;
import iiuf.xmillum.FlagManager;
import iiuf.xmillum.Parameter;
import iiuf.xmillum.ParameterException;
import iiuf.xmillum.Style;
import iiuf.dom.DOMUtils;
/**
* Block
*
* Represents a rectangular block shown by xmillum.
*
* <p>ActionHandlers:
* <ul>
* <li>over: triggered when the mouse is over this object
* <li>click1: mouse button 1 clicked
* <li>click2: mouse button 2 clicked
* <li>click3: mouse button 3 clicked
* <li>press1: mouse button 1 press & hold
* <li>press2: mouse button 2 press & hold
* <li>press3: mouse button 3 press & hold
* </ul>
*
* @author $Author: ohitz $
* @version $Revision: 1.1 $
*/
public class Block extends DisplayableClass {
static Map parameters = new HashMap();
/**
* Set up the parameter handling functions.
*/
static {
parameters.put("style", new Parameter() {
public void setParam(BrowserContext c, Object o, String v) throws ParameterException {
Block b = (Block) o;
b.style = c.styleRegistry.getStyle(v);
}
});
parameters.put("click1", new Parameter() {
public void setParam(BrowserContext c, Object o, String v, String opt) throws ParameterException {
Block b = (Block) o;
b.click1Handler = v;
b.click1HandlerOpt = opt;
}
});
parameters.put("click2", new Parameter() {
public void setParam(BrowserContext c, Object o, String v, String opt) throws ParameterException {
Block b = (Block) o;
b.click2Handler = v;
b.click2HandlerOpt = opt;
}
});
parameters.put("click3", new Parameter() {
public void setParam(BrowserContext c, Object o, String v, String opt) throws ParameterException {
Block b = (Block) o;
b.click3Handler = v;
b.click3HandlerOpt = opt;
}
});
parameters.put("press1", new Parameter() {
public void setParam(BrowserContext c, Object o, String v, String opt) throws ParameterException {
Block b = (Block) o;
b.press1Handler = v;
b.press1HandlerOpt = opt;
}
});
parameters.put("press2", new Parameter() {
public void setParam(BrowserContext c, Object o, String v, String opt) throws ParameterException {
Block b = (Block) o;
b.press2Handler = v;
b.press2HandlerOpt = opt;
}
});
parameters.put("press3", new Parameter() {
public void setParam(BrowserContext c, Object o, String v, String opt) throws ParameterException {
Block b = (Block) o;
b.press3Handler = v;
b.press3HandlerOpt = opt;
}
});
parameters.put("over", new Parameter() {
public void setParam(BrowserContext c, Object o, String v, String opt) throws ParameterException {
Block b = (Block) o;
b.overHandler = v;
b.overHandlerOpt = opt;
}
});
}
/** Style */
Style style;
/** Mouse button 1 clicked */
String click1Handler = null;
String click1HandlerOpt = null;
/** Mouse button 2 clicked */
String click2Handler = null;
String click2HandlerOpt = null;
/** Mouse button 3 clicked */
String click3Handler = null;
String click3HandlerOpt = null;
/** Mouse button 1 pressed */
String press1Handler = null;
String press1HandlerOpt = null;
/** Mouse button 2 pressed */
String press2Handler = null;
String press2HandlerOpt = null;
/** Mouse button 3 pressed */
String press3Handler = null;
String press3HandlerOpt = null;
/** Mouse button over the object */
String overHandler = null;
String overHandlerOpt = null;
/** Holds the current browser context */
BrowserContext context;
/**
* Initializes this class of Displayable.
*/
public void initialize(BrowserContext c, Element e) {
context = c;
Parameter.setParameters(c, e, this, parameters);
}
/**
* Returns a Block displayable.
*/
public Displayable getDisplayable(Element element) {
// Create the new block
DisplayableBlock d = new DisplayableBlock(element);
try {
d.bounds = new Rectangle(Integer.parseInt(element.getAttribute("x")),
Integer.parseInt(element.getAttribute("y")),
Integer.parseInt(element.getAttribute("w")),
Integer.parseInt(element.getAttribute("h")));
} catch (NumberFormatException e) {
}
// Recursively build tree
d.childs = getChilds(element, context);
return d;
}
/**
* Represents a displayable block.
*/
private class DisplayableBlock extends Displayable {
public DisplayableBlock(Element e) {
super(e);
}
public Rectangle getBounds(double scale) {
if (bounds != null) {
return new Rectangle((int) (scale * bounds.x),
(int) (scale * bounds.y),
Math.max(1, (int) Math.ceil(scale * bounds.width)),
Math.max(1, (int) Math.ceil(scale * bounds.height)));
} else {
return new Rectangle();
}
}
public void paintObject(Graphics2D g, double scale) {
Rectangle b = getBounds(scale);
if (style != null) {
style.setStyle(g);
}
Style[] styles = context.flagger.getStyles(element);
for (int i = 0; i < styles.length; i++) {
styles[i].setStyle(g);
}
if ((style != null) && style.isFilled()) {
g.fill(b);
} else {
g.draw(b);
}
}
/**
* Mouse moved - calls the "over" handler
*
* @param context Current browser context
* @param event Mouse event
*/
public boolean mouseMovedAction(MouseEvent event) {
if (overHandler != null) {
context.actionFactory.handleAction(overHandler, overHandlerOpt, this, context);
return true;
}
return false;
}
/**
* Mouse clicked - calls the "clickX" handler
*
* @param context Current browser context
* @param event Mouse event
*/
public boolean mouseClickedAction(MouseEvent event) {
if ((click1Handler != null) && (0 != (event.getModifiers() & MouseEvent.BUTTON1_MASK))) {
context.actionFactory.handleAction(click1Handler, click1HandlerOpt, this, context);
return true;
}
if ((click2Handler != null) && (0 != (event.getModifiers() & MouseEvent.BUTTON2_MASK))) {
context.actionFactory.handleAction(click2Handler, click2HandlerOpt, this, context);
return true;
}
if ((click3Handler != null) && (0 != (event.getModifiers() & MouseEvent.BUTTON3_MASK))) {
context.actionFactory.handleAction(click3Handler, click3HandlerOpt, this, context);
return true;
}
return super.mouseClickedAction(event);
}
/**
* Mouse pressed - calls the "pressX" handler
*
* @param context Current browser context
* @param event Mouse event
*/
public boolean mousePressedAction(MouseEvent event) {
if ((press1Handler != null) && (0 != (event.getModifiers() & MouseEvent.BUTTON1_MASK))) {
context.actionFactory.handleAction(press1Handler, press1HandlerOpt, this, context);
return true;
}
if ((press2Handler != null) && (0 != (event.getModifiers() & MouseEvent.BUTTON2_MASK))) {
context.actionFactory.handleAction(press2Handler, press2HandlerOpt, this, context);
return true;
}
if ((press3Handler != null) && (0 != (event.getModifiers() & MouseEvent.BUTTON3_MASK))) {
context.actionFactory.handleAction(press3Handler, press3HandlerOpt, this, context);
return true;
}
return false;
}
}
}