jhplot.gui.GHPanel.java Source code

Java tutorial

Introduction

Here is the source code for jhplot.gui.GHPanel.java

Source

// * This code is licensed under:
// * JHPlot License, Version 1.0
// * - for license details see http://hepforge.cedar.ac.uk/jhepwork/ 
// *
// * Copyright (c) 2005 by S.Chekanov (chekanov@mail.desy.de). 
// * All rights reserved.
package jhplot.gui;

import javax.swing.*;

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;

import javax.swing.BorderFactory;

import java.util.zip.*;

import jhplot.JHPlot;

import org.apache.fop.render.ps.EPSTranscoder;
import org.apache.fop.render.ps.PSTranscoder;
import org.apache.fop.svg.PDFTranscoder;
import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;

import org.apache.batik.transcoder.image.JPEGTranscoder;
// FREEHEP 
//import org.freehep.util.export.ExportDialog;
//import org.freehep.util.export.ExportFileType;
import org.freehep.graphicsbase.util.export.*;

/**
 * Class to build the global panel with graphics. It should be inserted to some
 * frame. It has 4 margins which can be obtained from this class.
 * 
 * @author S.Chekanov
 * 
 */

public class GHPanel implements ComponentListener, Serializable {
    /**
     * 
     */

    private static final long serialVersionUID = 1L;

    protected JPanel CanvasPanel;

    protected JPanel mainPanel; // keeps graphs

    protected GHMargin topPanel;// keeps mainPannel and margins

    protected int topSize;

    protected GHMargin leftPanel;

    protected int leftSize;

    protected GHMargin rightPanel;

    protected int rightSize;

    protected GHMargin bottomPanel;

    protected int bottomSize;

    protected Color backMargin;

    protected String gTitleText;

    protected Font gTitleFont;

    protected Color gTitleColor;

    protected int Width;

    protected int Height;

    private static final String rootKey = GHPanel.class.getName();
    private static final String SAVE_AS_TYPE = rootKey + ".SaveAsType";
    private static final String SAVE_AS_FILE = rootKey + ".SaveAsFile";

    /**
     * Create a panel with graphics. By default, all margins have size of 10
     * pixels. Background color is white. Initialization of JHPLot classes are
     * done here.
     * 
     * @param Width
     *            in pixels
     * @param Height
     *            in pixels
     */
    public GHPanel(int Width, int Height) {

        System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog");

        CanvasPanel = new JPanel();

        // build export file tipes
        // list = new List<ExportFileType>();
        // List<ExportFileType> list = ExportFileType.getExportFileTypes();
        // addAllExportFileTypes();

        this.Width = Width;
        this.Height = Height;

        // what if the screen size is smaller?
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int Sheight = screenSize.height;
        int Swidth = screenSize.width;
        if (Swidth < this.Width || Sheight < this.Height) {
            this.Width = (int) (0.5 * Swidth);
            this.Height = (int) (0.5 * Sheight);
        }

        CanvasPanel.addComponentListener(this);
        CanvasPanel.setPreferredSize(new Dimension(Width, Height));
        CanvasPanel.setMinimumSize(new Dimension(20, 20));

        leftSize = (int) (Width * 0.025);
        rightSize = (int) (Width * 0.025);
        bottomSize = (int) (Height * 0.025);
        topSize = (int) (Height * 0.025);

        backMargin = Color.white;

        mainPanel = new JPanel();

        topPanel = new GHMargin(this, "Top"); // left panel
        topPanel.setGBackground(backMargin);
        topPanel.setGRecBackground(backMargin);

        leftPanel = new GHMargin(this, "Left"); // left panel
        leftPanel.setGBackground(backMargin);
        leftPanel.setGRecBackground(backMargin);

        rightPanel = new GHMargin(this, "Right"); // right panel
        rightPanel.setGBackground(backMargin);
        rightPanel.setGRecBackground(backMargin);

        bottomPanel = new GHMargin(this, "Bottom"); // buttom panel
        bottomPanel.setGBackground(backMargin);
        rightPanel.setGRecBackground(backMargin);

        leftPanel.setSizeMargin(leftSize, Height);
        rightPanel.setSizeMargin(rightSize, Height);
        bottomPanel.setSizeMargin(Width, bottomSize);
        topPanel.setSizeMargin(Width, topSize);

        // invert to GridLayout(); Gaps are zero
        mainPanel.setBackground(Color.white);
        mainPanel.setBorder(BorderFactory.createEmptyBorder());

        CanvasPanel.setLayout(new BorderLayout());

        CanvasPanel.add(mainPanel, BorderLayout.CENTER);
        CanvasPanel.add(leftPanel, BorderLayout.WEST);
        CanvasPanel.add(rightPanel, BorderLayout.EAST);
        CanvasPanel.add(bottomPanel, BorderLayout.SOUTH);
        CanvasPanel.add(topPanel, BorderLayout.NORTH);

        // no boarder
        CanvasPanel.setBorder(BorderFactory.createEmptyBorder());

        // initialisation
        JHPlot.init();

    }

    /**
     * Export SVG to various image formats. Supported output: JPEG<br>
     * PNG <br>
     * PS <br>
     * EPS <br>
     * PDF <br>
     * SVGZ <br>
     * 
     * @param source
     *            Input file in SVG format
     * @param target
     *            Output file in designed format.
     */
    public void convertSVG(String source, String target) {
        jhplot.io.images.ConvertSVG.SVGTo(source, target, false);
    }

    /**
     * Export SVG to various image formats. Supported output: JPEG<br>
     * PNG <br>
     * PS <br>
     * EPS <br>
     * PDF <br>
     * SVGZ <br>
     * 
     * @param source
     *            Input file in SVG format
     * @param target
     *            Output file in designed format.
     * @param isRemove
     *            true if the source should be removed.
     */
    public void convertSVG(String source, String target, boolean isRemove) {
        jhplot.io.images.ConvertSVG.SVGTo(source, target, isRemove);
    }

    /**
     * Add a graph or any component in the location given by i1 and i2
     * 
     * @param i1
     *            location in x
     * @param i2
     *            location in y
     * @param a
     *            component
     */
    public void addGraph(int i1, int i2, Component a) {
        mainPanel.add(a);
    }

    /**
     * Set color for all global margins
     * 
     * @param backMargin
     */
    public void setMarginBackground(Color backMargin) {
        this.backMargin = backMargin;

        leftPanel.setGBackground(backMargin);
        leftPanel.setGRecBackground(backMargin);
        rightPanel.setGBackground(backMargin);
        rightPanel.setGRecBackground(backMargin);
        bottomPanel.setGBackground(backMargin);
        bottomPanel.setGRecBackground(backMargin);
        topPanel.setGBackground(backMargin);
        topPanel.setGRecBackground(backMargin);

    }

    /**
     * Registe all file types
     * 
     */

    /*
     * private void addAllExportFileTypes() {
     * 
     * list = ExportFileType.getExportFileTypes(); // List<ExportFileType>
     * exportFileTypes = ExportFileType.getExportFileTypes(); //
     * Collections.sort(exportFileTypes); // Iterator<ExportFileType> iterator =
     * exportFileTypes.iterator(); // while(iterator.hasNext()) { //
     * ExportFileType type = (ExportFileType)iterator.next(); //
     * list.addElement(type); // } }
     */

    /**
     * Get color for all global margins
     * 
     * @return color color of the margins
     */
    public Color getMarginBackground() {
        return backMargin;
    }

    /**
     * Add a component to the main panel
     * 
     * @param a
     *            Component
     */
    public void addComp(Component a) {

        mainPanel.add(a);

    }

    /**
     * Get the width of the main panel which keeps all margins and the central
     * panel (in pixels)
     * 
     * @return size in X direction (width)
     */

    public int getSizeX() {

        return CanvasPanel.getSize().width;

    }

    /**
     * Get the height of the main panel which keeps all margins and the central
     * panel (in pixels)
     * 
     * @return size in Y direction (height)
     */

    public int getSizeY() {

        return CanvasPanel.getSize().height;

    }

    /**
     * Sets the global title
     * 
     * @param sname
     *            Title
     * @param f
     *            Font
     * @param c
     *            Color
     */
    public void setGTitle(String sname, Font f, Color c) {

        setTextTop(sname, f, c);
        gTitleText = sname;
        gTitleFont = f;
        gTitleColor = c;

    }

    /**
     * Sets a text on global top margin
     * 
     * @param sname
     *            Title
     * @param f
     *            Font
     * @param c
     *            Color
     */
    public void setTextTop(String sname, Font f, Color c) {
        topPanel.setRotation(0);
        topPanel.setString(sname, f, c);
        setMarginSizeTop(0.1);
    }

    /**
     * Sets a text on global left margin
     * 
     * @param sname
     *            Title
     * @param f
     *            Font
     * @param c
     *            Color
     */
    public void setTextLeft(String sname, Font f, Color c) {
        leftPanel.setRotation(-90);
        leftPanel.setString(sname, f, c);
        setMarginSizeLeft(0.1);
    }

    /**
     * Sets a text on global right margin
     * 
     * @param sname
     *            Title
     * @param f
     *            Font
     * @param c
     *            Color
     */
    public void setTextRight(String sname, Font f, Color c) {
        rightPanel.setRotation(-90);
        rightPanel.setString(sname, f, c);
        setMarginSizeRight(0.1);
    }

    /**
     * Sets a text on global bottom margin.
     * 
     * @param sname
     *            Title
     * @param f
     *            Font
     * @param c
     *            Color
     */
    public void setTextBottom(String sname, Font f, Color c) {
        bottomPanel.setRotation(0);
        bottomPanel.setString(sname, f, c);
        setMarginSizeBottom(0.1);
    }

    /**
     * Get the text of bottom margin.
     * 
     * @return Text
     */

    public String getTextBottom() {
        return bottomPanel.getString();

    }

    /**
     * Get the font of bottom margin.
     * 
     * @return Font
     */

    public Font getTextBottomFont() {
        return bottomPanel.getMFont();

    }

    /**
     * Get the color of bottom margin for the text.
     * 
     * @return Color of text
     */

    public Color getTextBottomColor() {
        return bottomPanel.getMColor();

    }

    /**
     * Get the text of left margin.
     * 
     * @return Text
     */

    public String getTextLeft() {
        return leftPanel.getString();

    }

    /**
     * Get the font of left margin.
     * 
     * @return Font
     */

    public Font getTextLeftFont() {
        return leftPanel.getMFont();

    }

    /**
     * Fast export of the canvas to an image file. This depends on the
     * extension: <br>
     * SVG - Scalable Vector Graphics (SVG) <br>
     * SVGZ - compressed SVG<br>
     * JPG <br>
     * PNG <br>
     * PDF <br>
     * EPS <br>
     * PS. <br>
     * Note: EPS, PDF and PS are derived from SVG. Use SVGZ to have smaller file
     * sizes.
     * <p>
     * No questions will be asked and existing file will be rewritten
     * 
     * @param file
     *            Output file with the proper extension (SVG, SVGZ, JPG, PNG,
     *            PDF, EPS, PS). If no extension, PNG file is assumed.
     */

    public void export(final String file) {

        if (isBorderShown())
            showBorders(false);

        CanvasPanel.validate();

        jhplot.io.images.ExportVGraphics.export(CanvasPanel, rootKey, file);

    }

    /**
     * Get the color of bottom margin for the text.
     * 
     * @return Color of text
     */

    public Color getTextLeftColor() {
        return leftPanel.getMColor();

    }

    /**
     * Get text of top margin (title).
     * 
     * @return Text of the top margin
     */
    public String getTextTop() {
        return topPanel.getString();

    }

    /**
     * Get the font of top margin
     * 
     * @return Font
     */

    public Font getTextTopFont() {
        return topPanel.getMFont();

    }

    /**
     * Get the color of top margin for the text.
     * 
     * @return Color
     */

    public Color getTextTopColor() {
        return topPanel.getMColor();

    }

    /**
     * Get text of right margin.
     * 
     * @return text on the right panel
     */
    public String getTextRight() {
        return rightPanel.getString();

    }

    /**
     * Get the font of right margin.
     * 
     * @return Font of the right panel
     */

    public Font getTextRightFont() {
        return rightPanel.getMFont();

    }

    /**
     * Get the color of right margin for the text.
     * 
     * @return Color
     */

    public Color getTextRightColor() {
        return rightPanel.getMColor();

    }

    /**
     * Sets the global title using black color.
     * 
     * @param sname
     *            Title name
     * @param f
     *            Font
     */
    public void setGTitle(String sname, Font f) {
        setTextTop(sname, f, Color.black);
    }

    /**
     * Sets a text on global left margin using black color.
     * 
     * @param sname
     *            Title
     * @param f
     *            Font
     */
    public void setTextLeft(String sname, Font f) {
        setTextLeft(sname, f, Color.black);
    }

    /**
     * Sets a text on global top margin using black color.
     * 
     * @param sname
     *            Title
     * @param f
     *            Font
     */
    public void setTextTop(String sname, Font f) {
        setTextTop(sname, f, Color.black);
    }

    /**
     * Sets a text on global right margin using black color.
     * 
     * @param sname
     *            Title
     * @param f
     *            Font
     */
    public void setTextRight(String sname, Font f) {
        setTextRight(sname, f, Color.black);
    }

    /**
     * Sets a text on global bottom margin using black color.
     * 
     * @param sname
     *            Title
     * @param f
     *            Font
     */
    public void setTextBottom(String sname, Font f) {
        setTextBottom(sname, f, Color.black);
    }

    /**
     * Set the global title with default attributes. The default color is black.
     * The default font is ("Lucida Sans", Font.BOLD, 20)
     * 
     * @param sname
     *            Title
     */
    public void setGTitle(String sname) {
        setTextTop(sname, new Font("Lucida Sans", Font.BOLD, 18), Color.black);
    }

    /**
     * Set the global title with default attributes. The default color is black.
     * The default font is ("Lucida Sans", Font.BOLD, 20)
     * 
     * @param sname
     *            Title
     * @param space
     *            size of the top margin (0-1)
     */
    public void setGTitle(String sname, double space) {
        setTextTop(sname, new Font("Lucida Sans", Font.BOLD, 18), Color.black);
        setMarginSizeTop(space);
    }

    /**
     * Set the global left margin with default attributes. The default color is
     * black. The default font is ("Lucida Sans", Font.BOLD, 18)
     * 
     * @param sname
     *            Title
     */
    public void setTextLeft(String sname) {
        setTextLeft(sname, new Font("Lucida Sans", Font.BOLD, 16), Color.black);
    }

    /**
     * Set the global left margin with default attributes. The default color is
     * black. The default font is ("Lucida Sans", Font.BOLD, 18)
     * 
     * @param sname
     *            Title
     * @param space
     *            size of the left margin (0-1)
     */
    public void setTextLeft(String sname, double space) {
        setTextLeft(sname, new Font("Lucida Sans", Font.BOLD, 16), Color.black);
        setMarginSizeLeft(space);
    }

    /**
     * Set the global right margin with default attributes. The default color is
     * black. The default font is ("Lucida Sans", Font.BOLD, 18)
     * 
     * @param sname
     *            Title
     */
    public void setTextRight(String sname) {
        setTextRight(sname, new Font("Lucida Sans", Font.BOLD, 16), Color.black);
    }

    /**
     * Set the global right margin with default attributes. The default color is
     * black. The default font is ("Lucida Sans", Font.BOLD, 18)
     * 
     * @param sname
     *            Title
     * @param space
     *            size of the right margin (0-1)
     */
    public void setTextRight(String sname, double space) {
        setTextRight(sname, new Font("Lucida Sans", Font.BOLD, 16), Color.black);
        setMarginSizeRight(space);
    }

    /**
     * Set the global bottom margin with default attributes. The default color
     * is black. The default font is ("Lucida Sans", Font.BOLD, 18)
     * 
     * @param sname
     *            Title
     */
    public void setTextBottom(String sname) {
        setTextBottom(sname, new Font("Lucida Sans", Font.BOLD, 16), Color.black);
    }

    /**
     * Set the global top margin with default attributes. The default color is
     * black. The default font is ("Lucida Sans", Font.BOLD, 18)
     * 
     * @param sname
     *            Title
     */
    public void setTextTop(String sname) {
        setTextTop(sname, new Font("Lucida Sans", Font.BOLD, 16), Color.black);
    }

    /**
     * Reset all margins to the default values.
     * 
     */
    public void resetMargins() {

        setMarginSizeLeft(0.01);
        setMarginSizeRight(0.01);
        setMarginSizeBottom(0.01);
        setMarginSizeTop(0.01);
        setTextBottom(" ");
        setTextLeft(" ");
        setTextTop(" ");
        setTextRight(" ");

    }

    /**
     * Set the global bottom margin with default attributes. The default color
     * is black. The default font is ("Lucida Sans", Font.BOLD, 18)
     * 
     * @param sname
     *            Title
     * @param space
     *            size of the bottom margin (0-1)
     */
    public void setTextBottom(String sname, double space) {
        setTextBottom(sname, new Font("Lucida Sans", Font.BOLD, 16), Color.black);
        setMarginSizeBottom(space);
    }

    /**
     * Set the global title. The default font is ("Lucida Sans", Font.BOLD, 20)
     * 
     * @param sname
     *            Title
     * @param c
     *            Color
     */
    public void setGTitle(String sname, Color c) {
        // System.out.println("TESTT");
        setGTitle(sname, new Font("Lucida Sans", Font.BOLD, 20), c);
    }

    /**
     * get JPanel for left margin
     * 
     * @return JPanel
     */
    public JPanel getMarginPanelLeft() {

        return leftPanel;
    }

    /**
     * get JPanel for right margin
     * 
     * @return JPanel for right margin
     */
    public JPanel getMarginPanelRight() {

        return rightPanel;
    }

    /**
     * get JPanel for top margin
     * 
     * @return JPanel for top margin
     */
    public JPanel getMarginPanelTop() {

        return topPanel;
    }

    /**
     * get JPanel for bottom margin
     * 
     * @return JPanel for bottom margin
     */
    public JPanel getMarginPanelBottom() {

        return bottomPanel;
    }

    /**
     * get JPanel for central with drawings
     * 
     * @return central JPanel
     */
    public JPanel getMarginPanelCenter() {

        return mainPanel;
    }

    /**
     * get JPanel for the main panel which keeps the central panel and all 4
     * margins
     * 
     * @return JPanel Main panel
     */
    public JPanel getCanvasPanel() {

        return CanvasPanel;
    }

    /**
     * Set the text rotation for top margin
     * 
     * @param r
     *            rotation (0, 90, -90)
     */
    public void setTextRotationTop(int r) {

        topPanel.setRotation(r);

    }

    /**
     * Get the text rotation for top margin
     * 
     * @return rotation (0, 90, -90)
     */
    public int getTextRotationTop() {

        return topPanel.getRotation();

    }

    /**
     * Set the text rotation for left margin
     * 
     * @param r
     *            rotation (0, 90, -90)
     */
    public void setTextRotationLeft(int r) {

        leftPanel.setRotation(r);

    }

    /**
     * Get the text rotation for left margin
     * 
     * @return rotation (0, 90, -90)
     */
    public int getTextRotationLeft() {

        return leftPanel.getRotation();

    }

    /**
     * Set the text rotation for right margin
     * 
     * @param r
     *            rotation (0, 90, -90)
     */
    public void setTextRotationRight(int r) {

        rightPanel.setRotation(r);

    }

    /**
     * Get the text rotation for right margin
     * 
     * @return rotation (0, 90, -90)
     */
    public int getTextRotationRight() {

        return rightPanel.getRotation();

    }

    /**
     * Set the text rotation for bottom margin
     * 
     * @param r
     *            rotation (0, 90, -90)
     */
    public void setTextRotationBottom(int r) {

        bottomPanel.setRotation(r);

    }

    /**
     * Get the text rotation for bottom margin
     * 
     * @return rotation (0, 90, -90)
     */
    public int getTextRotationBottom() {

        return bottomPanel.getRotation();

    }

    /**
     * Set the text position in X relative to width for top margin
     * 
     * @param x
     *            position of text in X (from 0 to 1)
     */
    public void setTextPosTopX(double x) {

        topPanel.setStringPositionX(x);

    }

    /**
     * Set the text position in Y relative to width for top margin
     * 
     * @param y
     *            position of text in Y (from 0 to 1)
     */
    public void setTextPosTopY(double y) {

        topPanel.setStringPositionY(y);

    }

    /**
     * Get the text position in X relative to widths for top margin
     * 
     * @return position of text in X (from 0 to 1)
     */

    public double getTextPosTopX() {
        return topPanel.getStringPositionX();
    }

    /**
     * Get the text position in Y relative to widths for top margin
     * 
     * @return position of text in Y (from 0 to 1)
     */

    public double getTextPosTopY() {
        return topPanel.getStringPositionY();
    }

    /**
     * Set the text position in X relative to width for left margin
     * 
     * @param x
     *            position of text in X (from 0 to 1)
     */
    public void setTextPosLeftX(double x) {

        leftPanel.setStringPositionX(x);

    }

    /**
     * Set the text position in Y relative to width for left margin
     * 
     * @param y
     *            position of text in Y (from 0 to 1)
     */
    public void setTextPosLeftY(double y) {

        leftPanel.setStringPositionY(y);

    }

    /**
     * Get the text position in X relative to widths for left margin
     * 
     * @return position of text in X (from 0 to 1)
     */

    public double getTextPosLeftX() {
        return leftPanel.getStringPositionX();
    }

    /**
     * Get the text position in Y relative to widths for left margin
     * 
     * @return position of text in Y (from 0 to 1)
     */

    public double getTextPosLeftY() {
        return leftPanel.getStringPositionY();
    }

    /**
     * Set the text position in X relative to width for right margin
     * 
     * @param x
     *            position of text in X (from 0 to 1)
     */
    public void setTextPosRightX(double x) {

        rightPanel.setStringPositionX(x);

    }

    /**
     * Set the text position in Y relative to width for right margin
     * 
     * @param y
     *            position of text in Y (from 0 to 1)
     */
    public void setTextPosRightY(double y) {

        rightPanel.setStringPositionY(y);

    }

    /**
     * Get the text position in X relative to widths for right margin
     * 
     * @return position of text in X (from 0 to 1)
     */

    public double getTextPosRightX() {
        return rightPanel.getStringPositionX();
    }

    /**
     * Get the text position in Y relative to widths for right margin
     * 
     * @return position of text in Y (from 0 to 1)
     */

    public double getTextPosRightY() {
        return rightPanel.getStringPositionY();
    }

    /**
     * Set the text position in X relative to width for bottom margin
     * 
     * @param x
     *            position of text in X (from 0 to 1)
     */
    public void setTextPosBottomX(double x) {

        bottomPanel.setStringPositionX(x);

    }

    /**
     * Set the text position in Y relative to width for bottom margin
     * 
     * @param y
     *            position of text in Y (from 0 to 1)
     */
    public void setTextPosBottomY(double y) {

        bottomPanel.setStringPositionY(y);

    }

    /**
     * Get the text position in X relative to widths for bottom margin
     * 
     * @return position of text in X (from 0 to 1)
     */

    public double getTextPosBottomX() {
        return bottomPanel.getStringPositionX();
    }

    /**
     * Get the text position in Y relative to widths for bottom margin
     * 
     * @return position of text in Y (from 0 to 1)
     */

    public double getTextPosBottomY() {
        return bottomPanel.getStringPositionY();
    }

    /**
     * Get the background color of bottom margin
     * 
     * @return Color
     */

    public Color getTextBottomColorBack() {
        return bottomPanel.getGBackground();

    }

    /**
     * Get the background color of bottom margin
     * 
     * @param c
     *            Color
     */

    public void setTextBottomColorBack(Color c) {
        bottomPanel.setGBackground(c);

    }

    /**
     * Get the background color of top margin
     * 
     * @return Color
     */

    public Color getTextTopColorBack() {
        return topPanel.getGBackground();

    }

    /**
     * Get the background color of top margin
     * 
     * @param c
     *            Color
     */

    public void setTextTopColorBack(Color c) {
        topPanel.setGBackground(c);

    }

    /**
     * Get the background color of left margin
     * 
     * @return Color
     */

    public Color getTextLeftColorBack() {
        return leftPanel.getGBackground();

    }

    /**
     * Get the background color of left margin
     * 
     * @param c
     *            Color
     */

    public void setTextLeftColorBack(Color c) {
        leftPanel.setGBackground(c);

    }

    /**
     * Get the background color of right margin
     * 
     * @return Color
     */

    public Color getTextRightColorBack() {
        return rightPanel.getGBackground();

    }

    /**
     * Get the background color of left margin
     * 
     * @param c
     *            Color
     */

    public void setTextRightColorBack(Color c) {
        rightPanel.setGBackground(c);

    }

    /**
     * Remove all staff
     * 
     */

    protected void disposeGHPanel() {

        CanvasPanel.setVisible(false);
        leftPanel.disposeMe();
        rightPanel.disposeMe();
        bottomPanel.disposeMe();
        topPanel.disposeMe();
        mainPanel = null;
        gTitleColor = null;
        CanvasPanel = null;
        System.gc();

    }

    /**
     * Show borders of margins for edditing
     * 
     * @param show
     *            true if shown
     */
    public void showBorders(boolean show) {

        leftPanel.showBorderNoUpdate(show);
        topPanel.showBorderNoUpdate(show);
        bottomPanel.showBorderNoUpdate(show);
        rightPanel.showBorderNoUpdate(show);
        CanvasPanel.updateUI();
    }

    /**
     * is the boarder of margins shown?
     * 
     * @return true if shown.
     * 
     */
    public boolean isBorderShown() {

        if (leftPanel.isBorder())
            return true;
        if (rightPanel.isBorder())
            return true;
        if (topPanel.isBorder())
            return true;
        if (rightPanel.isBorder())
            return true;

        return false;

    }

    /**
     * Print the canvas
     * 
     */
    public void printGraph() {

        if (isBorderShown())
            showBorders(false);
        CanvasPanel.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        Thread t = new Thread() {
            public void run() {
                try {
                    PrinterJob prnJob = PrinterJob.getPrinterJob();
                    // set the Printable to the PrinterJob
                    prnJob.setPrintable(new Printable() {
                        public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
                            if (pageIndex == 0) {
                                Graphics2D g2d = (Graphics2D) graphics;
                                double ratioX = pageFormat.getImageableWidth() / CanvasPanel.getSize().width;
                                double ratioY = pageFormat.getImageableHeight() / CanvasPanel.getSize().height;
                                double factor = Math.min(ratioX, ratioY);
                                g2d.scale(factor, factor);
                                g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
                                disableDoubleBuffering(CanvasPanel);
                                CanvasPanel.print(g2d);
                                enableDoubleBuffering(CanvasPanel);
                                return Printable.PAGE_EXISTS;
                            }
                            return Printable.NO_SUCH_PAGE;
                        }
                    });

                    if (prnJob.printDialog()) {
                        JHPlot.showStatusBarText("Printing..");
                        prnJob.print();
                    }
                } catch (PrinterException e) {
                    e.printStackTrace();
                }
            }
        };
        t.start();
        CanvasPanel.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
    }

    /**
     * Set the size of right margin of the global canvas in terms of the ration
     * to the global panel in X
     * 
     * @param rightSize
     *            size of the right margin (from 0 to 1)
     */

    public void setMarginSizeRight(double rightSize) {
        if (rightSize > 1)
            rightSize = 1.0;
        if (rightSize < 0.01)
            rightSize = 0.01;

        this.rightSize = (int) (rightSize * getSizeX());

        rightPanel.setSizeMargin(this.rightSize, getSizeY());
        CanvasPanel.updateUI();

    }

    public static void disableDoubleBuffering(Component c) {
        RepaintManager currentManager = RepaintManager.currentManager(c);
        currentManager.setDoubleBufferingEnabled(false);
    }

    public static void enableDoubleBuffering(Component c) {
        RepaintManager currentManager = RepaintManager.currentManager(c);
        currentManager.setDoubleBufferingEnabled(true);
    }

    /**
     * Get the size of right margin of the global canvas in terms of the ratio
     * to thye global canvas
     * 
     * @return size of the margin from 0 to 1
     */
    public double getMarginSizeRight() {

        return (double) rightPanel.getSizeX() / getSizeX();
    }

    /**
     * Set the size of left margin in term of the ratio to the global panel
     * 
     * @param leftSize
     *            size of the margin from 0 to 1
     */

    public void setMarginSizeLeft(double leftSize) {
        if (leftSize > 1)
            leftSize = 1.0;
        if (leftSize < 0.01)
            leftSize = 0.01;

        this.leftSize = (int) (leftSize * getSizeX());
        leftPanel.setSizeMargin(this.leftSize, getSizeY());
        CanvasPanel.updateUI();

    }

    /**
     * Get the size of left margin terms of the ratio to the main panel
     * 
     * @return left margin size (from 0 to 1)
     */
    public double getMarginSizeLeft() {

        return (double) leftPanel.getSizeX() / getSizeX();
    }

    /**
     * Set size of the bottom margin of global canvas in terms of the ratio to
     * the size of the main panel
     * 
     * @param bottomSize
     *            size of the bottom margin from 0 to 1
     */
    public void setMarginSizeBottom(double bottomSize) {
        if (bottomSize > 1)
            bottomSize = 1.0;
        if (bottomSize < 0.01)
            bottomSize = 0.01;

        this.bottomSize = (int) (bottomSize * getSizeY());
        bottomPanel.setSizeMargin(getSizeX(), this.bottomSize);
        CanvasPanel.updateUI();
    }

    /**
     * Set size of the top margin of global canvas in terms of the ratio to the
     * size of the main panel
     * 
     * @param topSize
     *            size of the top margin from 0 to 1
     */
    public void setMarginSizeTop(double topSize) {
        if (topSize > 1)
            topSize = 1.0;
        if (topSize < 0.01)
            topSize = 0.01;
        this.topSize = (int) (topSize * getSizeY());
        topPanel.setSizeMargin(getSizeX(), this.topSize);
        CanvasPanel.updateUI();
    }

    /**
     * Get size of the bottom margin as ratio to the main panel
     * 
     * @return size of the bottom margin (from 0 to 1)
     */
    public double getMarginSizeBottom() {
        bottomSize = bottomPanel.getSizeY();
        return (double) bottomSize / getSizeY();

    }

    /**
     * Set the size of the global panel which keeps the central panel and the
     * margins
     * 
     * @param Width
     *            Width
     * @param Height
     *            Height
     */

    public void setSizePanel(int Width, int Height) {

        this.Width = Width;
        this.Width = Height;
        CanvasPanel.setPreferredSize(new Dimension(Width, Height));
        CanvasPanel.updateUI();
    }

    /**
     * Get size of the top margin of global canvas in terms of ratio to the main
     * panel
     * 
     * @return size of the top margin (from 0 to 1)
     */
    public double getMarginSizeTop() {
        return (double) topPanel.getSizeY() / getSizeY();
    }

    // Define the methods of the ComponentListener interface
    public void componentResized(ComponentEvent e) {
        // System.out.println("Resized\n" + e.getSource());
        topPanel.setDefault(e.getSource());
        leftPanel.setDefault();
        bottomPanel.setDefault();
        rightPanel.setDefault();

    }// end componentResized()

    public void componentMoved(ComponentEvent e) {
        // System.out.println("Moved\n" + e.getSource());
    }// end componentMoved()

    public void componentShown(ComponentEvent e) {
        // System.out.println("Shown\n" + e.getSource());
    }// end componentShown()

    public void componentHidden(ComponentEvent e) {
        // System.out.println("Hidden\n" + e.getSource());
    }// end componentHidden

}