/* 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.
  ========================================================================= */

#include <FL/Fl.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Group.H>
#include <FL/fl_draw.H>

#include "ImageViewer.h"

//====================================================================//

ImageViewer::ImageViewer(int x,int y,int w,int h) : 
  Fl_Box(x,y,w,h)
{
  curImg = NULL;

  zoomX = 1;
  zoomY = 1;
}

void ImageViewer::resize(int x,int y,int w,int h)
{
  Fl_Box::resize(x,y,w,h);
}

void ImageViewer::draw()
{
  if(curImg == NULL)
    return;

  int cx,cy,cw,ch;
  int zx,zy;
  SImage update;
  rgb bgc;

  fl_clip_box(x(),y(),w(),h(),
              cx,cy,cw,ch);

  //printf("drawing image (%d,%d) size (%d,%d), clip (%d,%d) size (%d,%d), zoom=(%d,%d)\n",
  //       x(),y(),w(),h(),cx,cy,cw,ch,zoomX,zoomY);

  zx = cx - x();
  zy = cy - y();
  bgc.red = bgc.green = bgc.blue = 96;

  //printf("curImg=%p size=(%d,%d)\n",curImg,curImg->w,curImg->h);
  update.allocate(cw,ch);
  //printf("performing zoom at (%d,%d) size (%d,%d) zoom (%d,%d)\n",
  //       zx,zy,cw,ch,zoomX,zoomY);
  update.zoom(*curImg,zx,zy,zoomX,zoomY,bgc);
  fl_draw_image((uchar*)update.img,cx,cy,cw,ch,3,0);

  Fl_Box::draw();
}

int ImageViewer::handle(int event)
{
  int bret,ret=0;
  int ix,iy;

  switch(event){
    case FL_ENTER:
      Fl::focus(this);
      break;

    case FL_PUSH:
    case FL_DRAG:
      ix = (Fl::event_x()-1 - x()) / zoomX;
      iy = (Fl::event_y()-1 - y()) / zoomY;

      switch(Fl::event_buttons()){
        case FL_BUTTON1:
	  break;
        case FL_BUTTON2:
	  break;
        case FL_BUTTON3:
	  break;
      }

      ret = 1;
      break;
    case FL_RELEASE:
      ret = 0;
      break;
    case FL_FOCUS:
    case FL_UNFOCUS:
      ret = 1;
      break;
    case FL_KEYDOWN:
      ret = 1;
      switch(Fl::event_key()){
        case '+':
        case '=':
          setZoom(min(zoomX+1,32),min(zoomY+1,32));
          break;
        case '_':
        case '-':
          setZoom(max(zoomX-1,1),max(zoomY-1,1));
          break;
        default:
          ret = 0;
      }
      break;
  }

  bret = Fl_Box::handle(event);
  return((ret != 0)? ret : bret);
}

void ImageViewer::setImage(const SImage *_cur_img)
{
  curImg = _cur_img;
  redraw();
}

void ImageViewer::setZoom(int _zoom_x,int _zoom_y)
{
  int base_w,base_h;

  base_w = w()/zoomX;
  base_h = h()/zoomY;

  zoomX = _zoom_x;
  zoomY = _zoom_y;

  resize(x(),y(),zoomX*base_w,zoomY*base_h);

  parent()->redraw();
}

void ImageViewer::translatePoint(int &_x,int &_y,int event_x,int event_y)
{
  _x = (event_x - x()) / zoomX;
  _y = (event_y - y()) / zoomY;
}
