/* (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 at.ac.tuwien.dbai.pdfwrap.gui.displayable;
/**
* Based on original XMIllum code
*
* @author DIUF, Fribourg, CH
* @author Tamir Hassan, pdfanalyser@tamirhassan.com
* @version PDF Analyser GUI 0.9
*/
import iiuf.xmillum.BrowserContext;
import iiuf.xmillum.Displayable;
import iiuf.xmillum.DisplayableClass;
import iiuf.xmillum.Parameter;
import iiuf.xmillum.ParameterException;
import iiuf.xmillum.Style;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.util.HashMap;
import java.util.Map;
import org.w3c.dom.Element;
/**
* 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: hassan $
* @version $Revision: 1.2 $
*/
public class Block2 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
{
Block2 b = (Block2) 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
{
Block2 b = (Block2) 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
{
Block2 b = (Block2) 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
{
Block2 b = (Block2) 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
{
Block2 b = (Block2) 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
{
Block2 b = (Block2) 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
{
Block2 b = (Block2) 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
{
Block2 b = (Block2) 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);
}
// added 13.11.06
// TODO: consider changing this to numeric values
// to reflect the constants within TextBlock. Bear in
// mind, however, that this needs to be reconverted back
// from text as stored in the XSL (e.g. with parseInt --
// this would require some exception handling).
/*
if (element.getAttribute("type").equals("paragraph"))
g.setColor(Color.CYAN.darker());
else if (element.getAttribute("type").equals("other-text"))
g.setColor(Color.BLUE);
else if (element.getAttribute("type").equals("cell"))
g.setColor(Color.RED);
*/
// g.setColor(Color.MAGENTA.darker());
if ((style != null) && style.isFilled())
{
g.fill(b);
} else
{
g.draw(b);
}
}
//12.11.06 these two following methods commented out
// not sure what use they had, but they were not there in the
// original iiuf.xmillum.displayable.Block method, and were
// blocking the popup from appearing.
/*
public boolean mousePressed(MouseEvent event, double scale)
{
//System.out.println("mouse pressed; event = " + event);
return true;
}
public boolean mouseClicked(MouseEvent event, double scale)
{
//System.out.println("mouse clicked; event = " + event);
return true;
}
*/
/**
* 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)
{
// added 13.11.06
if (event.getModifiers() == MouseEvent.BUTTON1_MASK)
{
if (element.getAttribute("info") != null)
{
System.out.println(element.getAttribute("info"));
}
else
{
System.out.println("No information available for this item.");
}
}
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)
{
//System.out.println("in mousePressedAction");
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;
}
}
}