package hep.aida.ref.plotter;

import hep.aida.IPlotterRegion;
import hep.aida.IPlotterStyle;
import jas.util.layout.PercentLayout;

import java.awt.Color;
import java.awt.Dimension;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import org.freehep.swing.popup.GlobalMouseListener;
import org.freehep.swing.popup.GlobalPopupListener;

/**
 *
 * @author tonyj
 * @version $Id: Plotter.java 10546 2007-02-21 23:39:01Z duns $
 */
public class Plotter extends DummyPlotter
{
   private String name;
   private boolean isShowing = false;
   private JPanel panel;
   
   protected Plotter(String name) {
       this(name, null);
   }
   
   protected Plotter(String name, String options)
   {
      super(name, options);
      this.name = name;
    }

    public void setStyle(IPlotterStyle style) {
        super.setStyle(style);
    }
    
   protected PlotterRegion createPlotterRegion()
   {
      return new PlotterRegion(this);
   }
   protected void configurePanel(JPanel p)
   {
      p.setLayout(new PercentLayout());
      p.setBackground(Color.white);
      p.setPreferredSize(new Dimension(plotterWidth(),plotterHeight()));    
   }
   
   protected JPanel getPanel()
   {
       if ( panel == null ) {
          panel = new JPanel();
          configurePanel(panel);
       }
       panel.setPreferredSize(new Dimension(plotterWidth(),plotterHeight()));
       return panel;
   }

   public boolean isShowing() {
        return isShowing;
    }
    
    public JPanel panel() {
        return getPanel();
    }

   
   protected String getTitle()
   {
      return name;
   }
   public void show()
   {
      if (!isShowing)
      {
         JFrame frame = new JFrame(name);
         
         GlobalMouseListener gml = new GlobalMouseListener(frame);
         gml.addMouseListener(new GlobalPopupListener());
         
         frame.setContentPane(panel());
         frame.setDefaultCloseOperation(frame.DISPOSE_ON_CLOSE);
         frame.pack();
         panel().setVisible(true);
         frame.setVisible(true);
         isShowing = true;
      }
   }
   public void hide()
   {
      if (isShowing)
      {
         JFrame frame = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class,panel());
         panel().setVisible(false);
         if (frame != null) frame.dispose();
         isShowing = false;
      }
   }
   protected IPlotterRegion justCreateRegion(double x, double y, double width, double height)
   {
      CreateRegion cr = new CreateRegion(x,y,width,height);
      invokeOnSwingThread(cr);
      return cr.getRegion();
   }
   public void destroyRegions()
   {
      invokeOnSwingThread(new DestroyRegions());
      super.destroyRegions();
   }

   public void writeToFile(String file, String type) throws IOException {
       writeToFile(file, type, System.getProperties());
   }
   
   private class CreateRegion implements Runnable
   {
      private double x;
      private double y;
      private double width;
      private double height;
      private PlotterRegion region;
      
      CreateRegion(double x, double y, double width, double height)
      {
         this.x = x;
         this.y = y;
         this.width = width;
         this.height = height;
      }
      public void run()
      {
         region = createPlotterRegion();
         getPanel().add(region.getPanel(),new PercentLayout.Constraint(x*100,y*100,width*100,height*100));
      }
      IPlotterRegion getRegion()
      {
         return region;
      }
   }
      
//   private class CreateRegions implements Runnable
//   {
//      private int rows;
//      private int columns;
//      CreateRegions(int columns, int rows)
//      {
//         this.rows = rows;
//         this.columns = columns;
//      }
//      public void run()
//      {
//         panel.removeAll();
//      
//         if (rows*columns != 0)
//         {
//            double pcWidth = 100/columns;
//            double pcHeight = 100/rows;
//
//            for (int r=0; r 

Ads help maintain this website.