#include "FractalExplorer.h"
#include "Events.h"
#include "Dialogs.h"

/**********************************************************************
 FUNCTION: preview_button_press_event
 *********************************************************************/

gint
preview_button_press_event (GtkWidget      *widget,
			    GdkEventButton *event)
{
  gdouble  left;
  gdouble  right;
  gdouble  bottom;
  gdouble  top;
  gdouble  dx;
  gdouble  dy;
  gint     px;
  gint     py;
  gint     x;
  gint     y;
  gushort  r;
  gushort  g;
  gushort  b;
  guchar  *p_ul;
  guchar  *i;
  guchar  *p;

  if (event->button == 1)
    {
      x_press = event->x;
      y_press = event->y;
      left = sel_x1;
      right = sel_x2 - 1;
      bottom = sel_y2 - 1;
      top = sel_y1;
      dx = (right - left) / (preview_width - 1);
      dy = (bottom - top) / (preview_height - 1);
      xbild = preview_width;
      ybild = preview_height;
      xdiff = (xmax - xmin) / xbild;
      ydiff = (ymax - ymin) / ybild;

      py = y_press;
      px = 0;
      p_ul = wint.wimage + 3 * (preview_width * py + 0);

      for (x = 0; x < preview_width; x++)
	{
	  i = wint.wimage + 3 * (preview_width * py + px);
	  r = (*i++) ^ 254;
	  g = (*i++) ^ 254;
	  b = (*i) ^ 254;
	  p_ul[0] = r;
	  p_ul[1] = g;
	  p_ul[2] = b;
	  p_ul += 3;
	  px += 1;
	}

      py = 0;
      p_ul = wint.wimage + 3 * (preview_width * 0 + (int) x_press);
      px = x_press;

      for (y = 0; y < preview_height; y++)
	{
	  i = wint.wimage + 3 * (preview_width * py + px);
	  r = (*i++) ^ 254;
	  g = (*i++) ^ 254;
	  b = (*i) ^ 254;
	  p_ul[0] = r;
	  p_ul[1] = g;
	  p_ul[2] = b;
	  p_ul += 3 * (preview_width);
	  py += 1;
	}

      p = wint.wimage;

      for (y = 0; y < preview_height; y++)
	{
	  gtk_preview_draw_row (GTK_PREVIEW (wint.preview), p,
				0, y, preview_width);
	  p += preview_width * 3;
	}

      gtk_widget_draw (wint.preview, NULL);
      gdk_flush ();
    }
  return TRUE;
}

/**********************************************************************
 FUNCTION: preview_motion_notify_event
 *********************************************************************/

gint
preview_motion_notify_event (GtkWidget      *widget,
			     GdkEventButton *event)
{
  gint     px;
  gint     py;
  gint     x;
  gint     y;
  gushort  r;
  gushort  g;
  gushort  b;
  guchar  *p_ul;
  guchar  *i;
  guchar  *p;

  ypos = oldypos;
  xpos = oldxpos;

  if (oldypos != -1)
    {
      py = ypos;
      px = 0;
      p_ul = wint.wimage + 3 * (preview_width * py + 0);

      for (x = 0; x < preview_width; x++)
	{
	  i = wint.wimage + 3 * (preview_width * py + px);
	  r = (*i++) ^ 254;
	  g = (*i++) ^ 254;
	  b = (*i) ^ 254;
	  p_ul[0] = r;
	  p_ul[1] = g;
	  p_ul[2] = b;
	  p_ul += 3;
	  px += 1;
	}

      py = 0;
      p_ul = wint.wimage + 3 * (preview_width * 0 + (int) xpos);
      px = xpos;

      for (y = 0; y < preview_height; y++)
	{
	  i = wint.wimage + 3 * (preview_width * py + px);
	  r = (*i++) ^ 254;
	  g = (*i++) ^ 254;
	  b = (*i) ^ 254;
	  p_ul[0] = r;
	  p_ul[1] = g;
	  p_ul[2] = b;
	  p_ul += 3 * (preview_width);
	  py += 1;
	}
    }
  oldxpos = xpos = event->x;
  oldypos = ypos = event->y;

  if ((xpos >= 0.0) &&
      (ypos >= 0.0) &&
      (xpos < preview_width) &&
      (ypos < preview_height))
    {
      py = ypos;
      px = 0;
      p_ul = wint.wimage + 3 * (preview_width * py + 0);

      for (x = 0; x < preview_width; x++)
	{
	  i = wint.wimage + 3 * (preview_width * py + px);
	  r = (*i++) ^ 254;
	  g = (*i++) ^ 254;
	  b = (*i) ^ 254;
	  p_ul[0] = r;
	  p_ul[1] = g;
	  p_ul[2] = b;
	  p_ul += 3;
	  px += 1;
	}

      py = 0;
      p_ul = wint.wimage + 3 * (preview_width * 0 + (int) xpos);
      px = xpos;

      for (y = 0; y < preview_height; y++)
	{
	    i = wint.wimage + 3 * (preview_width * py + px);
	    r = (*i++) ^ 254;
	    g = (*i++) ^ 254;
	    b = (*i) ^ 254;
	    p_ul[0] = r;
	    p_ul[1] = g;
	    p_ul[2] = b;
	    p_ul += 3 * (preview_width);
	    py += 1;
	}			/* for */
    }
  else
    {
      oldypos = -1;
      oldxpos = -1;
    }

  p = wint.wimage;

  for (y = 0; y < preview_height; y++)
    {
      gtk_preview_draw_row (GTK_PREVIEW (wint.preview), p, 0, y, preview_width);
      p += preview_width * 3;
    }

  gtk_widget_draw (wint.preview, NULL);
  gdk_flush ();

  return TRUE;
}

/**********************************************************************
 FUNCTION: preview_leave_notify_event
 *********************************************************************/

gint
preview_leave_notify_event (GtkWidget      *widget,
			    GdkEventButton *event)
{
  gint     px;
  gint     py;
  gint     x;
  gint     y;
  gushort  r;
  gushort  g;
  gushort  b;
  guchar  *p_ul;
  guchar  *i;
  guchar  *p;

  ypos = oldypos;
  xpos = oldxpos;

  if (oldypos != -1)
    {
      py = ypos;
      px = 0;
      p_ul = wint.wimage + 3 * (preview_width * py + 0);

      for (x = 0; x < preview_width; x++)
	{
	  i = wint.wimage + 3 * (preview_width * py + px);
	  r = (*i++) ^ 254;
	  g = (*i++) ^ 254;
	  b = (*i) ^ 254;
	  p_ul[0] = r;
	  p_ul[1] = g;
	  p_ul[2] = b;
	  p_ul += 3;
	  px += 1;
	}

      py = 0;
      p_ul = wint.wimage + 3 * (preview_width * 0 + (int) xpos);
      px = xpos;

      for (y = 0; y < preview_height; y++)
	{
	  i = wint.wimage + 3 * (preview_width * py + px);
	  r = (*i++) ^ 254;
	  g = (*i++) ^ 254;
	  b = (*i) ^ 254;
	  p_ul[0] = r;
	  p_ul[1] = g;
	  p_ul[2] = b;
	  p_ul += 3 * (preview_width);
	  py += 1;
	}
    }
  oldxpos = -1;
  oldypos = -1;

  p = wint.wimage;

  for (y = 0; y < preview_height; y++)
    {
      gtk_preview_draw_row (GTK_PREVIEW (wint.preview), p, 0, y, preview_width);
      p += preview_width * 3;
    }

  gtk_widget_draw (wint.preview, NULL);
  gdk_flush ();

  MyCursor = gdk_cursor_new (GDK_TOP_LEFT_ARROW);
  gdk_window_set_cursor (maindlg->window, MyCursor);

  return TRUE;
}

/**********************************************************************
 FUNCTION: preview_enter_notify_event
 *********************************************************************/

gint
preview_enter_notify_event (GtkWidget      *widget,
			    GdkEventButton *event)
{
  MyCursor = gdk_cursor_new (GDK_TCROSS);
  gdk_window_set_cursor (maindlg->window, MyCursor);

  return TRUE;
}

/**********************************************************************
 FUNCTION: preview_button_release_event
 *********************************************************************/

gint
preview_button_release_event (GtkWidget      *widget,
			      GdkEventButton *event)
{
  gdouble l_xmin;
  gdouble l_xmax;
  gdouble l_ymin;
  gdouble l_ymax;

  if (event->button == 1)
    {
      x_release = event->x;
      y_release = event->y;

      if ((x_press >= 0.0) && (y_press >= 0.0) &&
	  (x_release >= 0.0) && (y_release >= 0.0) &&
	  (x_press < preview_width) && (y_press < preview_height) &&
	  (x_release < preview_width) && (y_release < preview_height))
	{
	  l_xmin = (wvals.xmin +
		    (wvals.xmax - wvals.xmin) * (x_press / preview_width));
	  l_xmax = (wvals.xmin +
		    (wvals.xmax - wvals.xmin) * (x_release / preview_width));
	  l_ymin = (wvals.ymin +
		    (wvals.ymax - wvals.ymin) * (y_press / preview_height));
	  l_ymax = (wvals.ymin +
		    (wvals.ymax - wvals.ymin) * (y_release / preview_height));

	  zooms[zoomindex] = wvals;
	  zoomindex++;
	  if (zoomindex > 99)
	    zoomindex = 99;
	  zoommax = zoomindex;
	  wvals.xmin = l_xmin;
	  wvals.xmax = l_xmax;
	  wvals.ymin = l_ymin;
	  wvals.ymax = l_ymax;
	  dialog_change_scale ();
	  dialog_update_preview ();
	  oldypos = oldxpos = -1;
	}
    }

  return TRUE;
}
