/* LICENSE:
  =========================================================================
    CMPack'04 Source Code Release for OPEN-R SDK 1.1.5-r2 for ERS7
    Copyright (C) 2004 Multirobot Lab [Project Head: Manuela Veloso]
    School of Computer Science, Carnegie Mellon University
    All rights reserved.
  ========================================================================= */

#ifndef INCLUDED_local_model_test_h
#define INCLUDED_local_model_test_h

#include <stdlib.h>
#include <stdio.h>

#include <FL/Fl_Double_Window.H>

#include "headers/Geometry.h"
#include "Localization/SRL/Sampler.h"

#include "LocalizationTester.h"

class AppWindow;

class Canvas {
public:
  int w,h;
  vector2f minv,maxv;

  // functions for going from world coordinates to screen coordinates
  int transform_x(float x);
  int transform_y(float y);
  int scale_x(float x);
  int scale_y(float y);
  vector2i operator()(vector2f world_coor);

  // functions for going from screen coordinates to world coordinates
  float reverse_transform_x(int x);
  float reverse_transform_y(int y);
  vector2f reverse_transform(vector2i screen_coor);

public:
  void set_size(int _w,int _h);
  void set_range(vector2f _minv,vector2f _maxv);

  void point(float xc,float yc);
  void dot(float xc,float yc,int d);
  void line(float x1,float y1,float x2,float y2);
  // x1 <= x2 and y1 <= y2
  void rectf(float x1,float y1,float x2,float y2);
  void rectf_wh(float x,float y,float w,float h);
  void circle(float xc,float yc,float r);
  void circlef(float xc,float yc,float r);
};

class SamplerTester {
private:
  Sampler sampler;

public:
  SamplerTester();
  ~SamplerTester();

  void init();

  bool step(int step_cnt);
  void reset();

  void draw_data(AppWindow *win,Canvas &canvas);
};

class AppWindow : public Fl_Double_Window {
private:
  bool keep_running;
  bool LocalizationMode;

  SamplerTester sampler_tester;
  LocalizationTester localization_tester;

  Canvas canvas;

public:
  AppWindow(const char *log_file);
  ~AppWindow();

  virtual void resize(int x,int y,int w,int h);
  virtual void draw();
  virtual int handle(int event);
  void run();
};


#endif
