view src/samer/core_/util/heavy/VCanvas.java @ 0:bf79fb79ee13

Initial Mercurial check in.
author samer
date Tue, 17 Jan 2012 17:50:20 +0000
parents
children
line wrap: on
line source
/*
 *	Copyright (c) 2000, Samer Abdallah, King's College London.
 *	All rights reserved.
 *
 *	This software is provided AS iS and WITHOUT ANY WARRANTY; 
 *	without even the implied warranty of MERCHANTABILITY or 
 *	FITNESS FOR A PARTICULAR PURPOSE.
 */

package samer.core.util.heavy;
import  samer.core.*;
import  samer.core.util.Tools;
import  samer.core.util.MouseRetarget;
import  samer.core.util.swing.MenuBuilder;
import  samer.core.util.swing.DynamicPopupHandler;
import  java.awt.*;
import  java.awt.event.*;

/**
		<p>
		This is a Canvas which maintains a valid Graphics
		object. The Graphics associated with the Canvas
		becomes available only at a certain time (not
		during construction) so we have to setup the
		Graphics in response to some event. It seems that the 
		only event a component reliably gets after being
		realized is a size event. We use the first size
		event to get a Graphics and notify any derived
		classes through the <code>realized()</code>
		method which is there to be overridden.
	
 */

public class VCanvas extends Canvas implements Viewer
{
	public Graphics graphics=null;
	public int		 width, height;

	/**	<b><code>void realized()</code></b>
	  *	This is called when the cached Graphics object
	  *	(see GCanvas) is created. The component is probably still
	  *	invisible at this point, but we can get off-screen
	  *	Images and do other useful setting up things that
	  *	don't seem to work in the constructor
	  *
	  */
	protected void realized() {}
	protected void sized() {}

	public void clear() { clear(graphics); }
	public void clear(Graphics g) {
		g.setColor(getBackground());
		g.fillRect(0,0,width,height);
	}

	private void cacheGraphics()
	{
		if (graphics!=null) graphics.dispose();
		graphics=Tools.initGraphics(getGraphics());
	}
	
	public void removeNotify()
	{
		detach();
		// graphics=null; // this might cause a problem! synchronization?
		super.removeNotify();
	}

	public void addNotify()
	{
		super.addNotify();
		Dimension d = getSize();
		width=d.width; height=d.height;
		cacheGraphics();
		attach(); realized(); // ??
	}

	public Dimension getMinimumSize() {
		return new Dimension(0,0);
	}

	{	// initialisation code
		addMouseListener(MouseRetarget.listener);
		addComponentListener( new ComponentAdapter() {
			public void componentResized(ComponentEvent e) {
				Dimension d = getSize();
				width=d.width; height=d.height;
				cacheGraphics();
				sized();
			}
		} );

		setBackground(Shell.getColor("background",null));
		setForeground(Shell.getColor("foreground",null));
	}

	/* this is v cunning (actually - not really) */
	public Image createPixel() { return createPixel(1,1); }
	public Image createPixel(Color c) { return createPixel(c,1,1); }
	public Image createPixel(int w, int h) { return createPixel(getForeground(),w,h); }
	public Image createPixel(Color c, int w, int h)
	{
		Image img=createImage(w,h);
		Graphics g=img.getGraphics();
		g.setColor(c);
		g.fillRect(0,0,w,w);
		g.dispose();
		return img;
	}

	// ....... MenuAnchor bits .......................

	private DynamicPopupHandler thing=null;
	// private JPopupMenu thing=null;

	public Component	getComponent() { return this; }
	public void			attach() {}
	public void			detach() {}
	public void	exposeCommands(Agent agent) {
		// menu=MenuBuilder.showCommands(agent,getComponent(),menu);
		thing=MenuBuilder.showCommands(agent,getComponent(),thing);
	}

	protected void finalize() {
		if (graphics!=null) graphics.dispose();
	}

}