// Convergence.java

package lt.ktu.gmj.analysis;

import java.awt.*;
import java.util.*;
import javax.swing.*;
import lt.monarch.chart.*;
import lt.monarch.chart.chart2D.*;
import lt.monarch.swing.*;
import lt.ktu.gmj.*;

public class Convergence extends ResultFrame {
 protected Chart2D chart;
 protected ConnectedSeries series;
 protected Provider provider;

 class Provider extends AbstractChartPointProvider {
   public int pointCount ()
   {
     return results.progressResultCount()+1;
   }

   public ChartPoint point (int i)
   {
     return i==0 ?
       new InvisibleDot ( new Double(0), new Double(results.maxValue()) ) :
       pointFromResult ( results.progressResultAt(i-1) );
   }

   public void newResult (Result r)
   {
     ChartPoint pt=pointFromResult(r);
     if (pt.registerOn (series))
         firePointsChanged (); 

     firePointAdded (pt);
   }

   protected ChartPoint pointFromResult (Result r)
   {
     ChartPoint pt=new InvisibleDot (
      new Double(r.iteration),
      new Double(r.value) );

     return pt;
   }
 };

 public Convergence ()
 {
   super ("Convergence");

   chart=new Chart2D();
   getContentPane().add(BorderLayout.CENTER, new JChartPanel(chart));
 }

 protected void setupChart ()
 {
   provider=new Provider ();

   MathAxisMapper yMapper=new MathAxisMapper();
   MathAxisMapper xMapper=new MathAxisMapper();
   Axis2DX axisX=new Axis2DX (xMapper);
   Axis2DY axisY=new Axis2DY (yMapper);
   series=new ConnectedSeries (provider, axisX, axisY);
   Grid grid=new Grid (axisX, axisY);
   axisY.setLabel ("f(x)");
   axisX.setLabel ("Iteration");

   yMapper.range.setRange (results.minValue(), results.maxValue());
   xMapper.range.setRange (0, results.method().iterations());

   if (System.getProperty("java.version").compareTo("1.2")>=0)
     series.setStroke (new BasicStroke(2));

   chart.reset ();
   chart.setLAxis (axisY);
   chart.setXAxis (axisX);
   chart.setObjects (new ChartObject[]{ grid, axisX, axisY, series });

   chart.invalidate ();
 }

 public void newResult (ResultRepository n)
 {
 }

 public void newProgressResult (ResultRepository n)
 {
   provider.newResult (n.lastResult());
 }

 public void finalResult (ResultRepository n)
 {
   newProgressResult (n);
 }

 public void prepare (ResultRepository results)
 {
   super.prepare (results);

   setupChart ();
   show ();

   results.addObserver (this);
 }

};

