#include <math.h>
#include "DrawWidget.h"
#include <iostream>

using namespace std;

// Override the handle method
int DrawWidget::handle(int e) { return 0; }

// Convert a pixel value into an X coordinate
float DrawWidget::uToX(int u) const {
  return (draw_width/widget_width)*static_cast<float>(u) + draw_min_x;
}

// Convert a pixel value into a Y coordinate.  Also flips the Y value
float DrawWidget::vToY(int v) const {
  return draw_height - 
    (draw_height/widget_height)*static_cast<float>(v) + draw_min_y;
}

// Convert a Y coordinate into a pixel value
int DrawWidget::xToU(float x) const {
  return static_cast<int>(rint((widget_width/draw_width)*(x-draw_min_x)));
}

// Convert a Y coordinate into a pixel value.  Also flips the Y value
int DrawWidget::yToV(float y) const {
  return static_cast<int>(widget_height) - 
    static_cast<int>(rint((widget_height/draw_height)*(y-draw_min_y)));
}

// Convert a width in X coordinates into a width in pixels
int DrawWidget::widthToU(float w) const {
  return static_cast<int>((w*(widget_width/draw_width)));
}

// Convert a height in Y coordinates into a height in pixels
int DrawWidget::heightToV(float h) const {
  return static_cast<int>((h*(widget_height/draw_height)));
}

// Helper function for handle().  
void DrawWidget::getClick(float & x, float & y) {
  int x_pos,y_pos;

  // Get the x,y position of the click
  x_pos=Fl::event_x()-(this->x());
  y_pos=Fl::event_y()-(this->y());
  // Compute the click position in world coordinates
  x = uToX(x_pos);
  y = vToY(y_pos);
}

// Constructor
DrawWidget::DrawWidget(int x, int y, 
		       int w, int h,
		       float min_x, float min_y, 
		       float max_x, float max_y,
		       const char * s) : Fl_Widget(x,y,w,h,s),
					 draw_min_x(min_x), 
					 draw_min_y(min_y), 
					 draw_max_x(max_x), 
					 draw_max_y(max_y) {
  widget_width = static_cast<float>(w);
  widget_height = static_cast<float>(h);
  draw_width = (draw_max_x - draw_min_x);
  draw_height = (draw_max_y - draw_min_y);
}

// Constructor
DrawWidget::DrawWidget(int x, int y, 
		       int w, int h,
		       const char * s) : Fl_Widget(x,y,w,h,s) {
  draw_min_x = static_cast<float>(x);
  draw_min_y = static_cast<float>(y);
  draw_max_x = static_cast<float>(x + w); 
  draw_max_y = static_cast<float>(y + h); 
  widget_width = static_cast<float>(w);
  widget_height = static_cast<float>(h);
  draw_width = (draw_max_x - draw_min_x);
  draw_height = (draw_max_y - draw_min_y);
}

// Set the bounds on the drawing
void DrawWidget::setDrawingBounds(float min_x, 
				  float min_y, 
				  float max_x, 
				  float max_y) {
  draw_min_x = min_x;
  draw_min_y = min_y;
  draw_max_x = max_x;
  draw_max_y = max_y;
  draw_width = (draw_max_x - draw_min_x);
  draw_height = (draw_max_y - draw_min_y);
}
