Howto add/modify a plotter

You must create an XPlotter and an controller for it. Here is an example XPlotter:
import java.awt.*;

/** An example XPlotter 
 * The purpose of this class is to contain the bare minimum amount of information
 * necessary to do a plot (of this type). 
 * When a tile is saved to a file, the data saved will be 
 * 1) A word
 * 2) A color
 * 3) an XPlotter (say this XPlotter)
 * From this data McBilliards can reconstruct the tile in another session
 * using "plotter.plot(word, color, I, M);"
 * The moral is that an XPlotter should not hold unnecessary data
 * (e.g. a Manager) because that will make these saved files much bigger.
 * (Furthermore a Manager can not be recovered from a file)
public class XNewPlotter implements XPlotter, Serializable {
    // This int represents some plot setting
    public int some_int;
    /** default constructor */
    public XNewPlotter() {
    /** copy constructor */
    public XNewPlotter(XNewPlotter p) {
    /** plots the tile */
    public Tile plot(String word, Color C, Interrupter I, Manager M){
        // here you want to actually plot the tile
        // for example look at XFillPlotter.plot
        // you would probably want to use the plot settings (e.g. some_int) here
        return null;
    /** build a controlling canvas */
    public Component getController(Manager M) {
        return new XNewPlotterController(M, this);
    /** Return the name of the plot technique */
    public String getName() {
        return "new";
    /** Returns true if the plot can be run. This is useful for example
     * if the plot relies on C code which may or may not be available
    public boolean canRun() {
        return true;
    /** return the documentation for this plotter */
    public HelpDocument document(){
        return null;
    /** button color */
    public Color getColor() {

You must create a controller:
import java.awt.*;
import java.awt.event.*;

/** This class controlls an XNewPlotter
 * It allows editing an object of type XNewPlotter. Currently it controls a
 * single integer (some_int).

public class XNewPlotterController extends DBCanvas implements MouseListener {
    Manager M;
    IntegerSelector some_int; // level of detail
    /** this class now does the real work */
    XNewPlotter plotter;
    public XNewPlotterController(Manager M, XNewPlotter plotter) {
        // initialize the selector to plotter.some_int
        some_int=new IntegerSelector(7,23,32,16,plotter.some_int,1,25,1);
    /** draw the buttons etc. */
    public void paint(Graphics gfx){
        Graphics2D g=(Graphics2D) gfx;
        Color C1=new Color(250,0,255);
    /** Return smallest area that the drawing will take up.
     * You can change this to get more space. */
    public Dimension getPreferredSize() {
        return new Dimension(80,32);
    /** These are taken from MouseListener */
    public void mouseClicked(MouseEvent e){
        Point X=new Point();
        // when the Integer selector is changed, immediately propigate
        // the change to the plotter
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
    public void mousePressed(MouseEvent e){}
    public void mouseReleased(MouseEvent e){}

Then you need to let the PlotCanvas know about it. This should only require editing one line:
    XPlotter[] types={
        new XFillPlotter(),
        new XPackPlotter(),
        new XCoverPlotter(),
        new XZonePlotter(),
        new XBilliardLikePlotter(),
        new XNewPlotter()
Just add your new plotter there.