#include "gerber.h"

#include <X11/Xaw/Label.h>
#include <X11/Xaw/Cardinals.h>
#include <X11/Xaw/Viewport.h>
#include <X11/StringDefs.h>
#include <X11/Xaw/Command.h>
#include <X11/Xaw/Form.h>


Widget toplevel, viewport, label, form, message;
Display *dpy;

extern Bool mirrorx, mirrory, verbose;
extern int redisplay;
char *toolfile;
static GC white_gc;
Arg args[20];
int next_page = 0;


draw_object(obj,bitmap)
     object_t *obj;
     Pixmap bitmap;
{
  int x1, y1, x2, y2;

  x1 = MIL2PIXEL(MIRRORX(obj->start_x));
  y1 = MIL2PIXEL(MIRRORY(obj->start_y));
  x2 = MIL2PIXEL(MIRRORX(obj->end_x));
  y2 = MIL2PIXEL(MIRRORY(obj->end_y));

  if ((x1 == x2) && (y1 == y2)) {
    /* XDrawPoint(dpy, bitmap, (obj->tool->gc), x1, y1); */
    XDrawLine(dpy, bitmap, (obj->tool->gc), x1, y1, x1+1, y1);
  } else {
    XDrawLine(dpy, bitmap, (obj->tool->gc), x1, y1, x2, y2);
  }
}

void show_message(s)
     char *s;
{
  XtSetArg(args[0],XtNlabel,s);
  XtSetValues(message, args, ONE);
  XFlush(dpy);
}

void quitbutton_callback()
{
  exit(0);
}

void zoomin()
{
  scale *= 2;
  next_page = redisplay = 1;
  show_message("Zooming in..");
}

void zoomout()
{
  scale /= 2;
  next_page = redisplay = 1;
  show_message("Zooming out..");
}


void next_file()
{
  next_page = 1;
  redisplay = 0;
}

void ButtonPressed(w, event, params, num_params)
     Widget w;
     XEvent *event;
     String *params;
     Cardinal *num_params;
{
  next_page = 1;
  switch (**params) {
  case '1':
    zoomin();
    break;
  case '2':
    next_file();
    break;
  case '3':
    zoomout();
    break;
  }
}

XtAppContext app_con;
XtTranslations ptexttrans;
char texttrans[] = "#override\n\
                      <Btn1Down>: ButtonPressed(1)\n\
                      <Btn2Down>: ButtonPressed(2)\n\
                      <Btn3Down>: ButtonPressed(3)";

XtActionsRec actionTable[] = {
  {"ButtonPressed", ButtonPressed},
};

static XtResource resources[] = {
#if 1	/* DEBUG COMPILER ON 5.3 */
   {"scale",

 "Scale",

 XtRInt,

  sizeof(int),


      (Cardinal) 

		(
			&scale

		),
	/* FreeBSD-5.3: warning: initializer element is not computable at load time */

 XtRString, "100"

},
#else
   {"scale", "Scale", XtRInt,  sizeof(int),
      (Cardinal) &scale, XtRString, "100"},
#endif
   {"mirrorx", "Mirrorx", XtRBool, sizeof(Bool),
      (Cardinal) &mirrorx, XtRString, (caddr_t) "false"},
   {"mirrory", "Mirrory", XtRBool, sizeof(Bool),
      (Cardinal) &mirrory, XtRString, (caddr_t) "true"},
   {"nomirrorx", "Nomirrorx", XtRBool, sizeof(Bool),
      (Cardinal) &mirrorx, XtRString, (caddr_t) "false"},
   {"nomirrory", "Nomirrory", XtRBool, sizeof(Bool),
      (Cardinal) &mirrory, XtRString, (caddr_t) "true"},
   {"verbose", "Verbose", XtRBool, sizeof(Bool),
      (Cardinal) &verbose, XtRString, (caddr_t) "false"},
   {"toolfile", "Toolfile", XtRString, sizeof (char *),
      (Cardinal) &toolfile, XtRString, NULL},
 };

XrmOptionDescRec options[] = {
  {"-scale",     "scale",     XrmoptionSepArg,      NULL},
  {"-mirrorx",   "mirrorx",   XrmoptionNoArg,      "TRUE"},
  {"-mirrory",   "mirrory",   XrmoptionNoArg,      "TRUE"},
  {"-nomirrorx", "nomirrorx", XrmoptionNoArg,      "FALSE"},
  {"-nomirrory", "nomirrory", XrmoptionNoArg,      "FALSE"},
  {"-verbose",   "verbose",   XrmoptionNoArg,      "TRUE"},
  {"-toolfile",  "toolfile",  XrmoptionSepArg,      NULL},
};


init_xwin(argc,argv)
     int *argc;
     char *argv[];
{
  Widget tmpW;
  XtArgVal i;

  toplevel = XtAppInitialize(&app_con, "gerber", options, XtNumber(options),
			     argc, argv, NULL, NULL, ZERO);

  dpy = XtDisplay(toplevel);

  XtGetApplicationResources(toplevel, (caddr_t ) NULL,
			    resources, XtNumber(resources), 0, 0);

  XtAppAddActions(app_con, actionTable, XtNumber(actionTable));
  ptexttrans = XtParseTranslationTable(texttrans);

  /* A Form widget */
  i = 0;
  form = XtCreateManagedWidget("form",formWidgetClass, toplevel,
			       args, i);

  /* A Viewport widget */
  i = 0;
  XtSetArg(args[i], XtNheight, 400); i++;
  XtSetArg(args[i], XtNwidth,  400); i++;
  XtSetArg(args[i], XtNallowHoriz, True); i++;
  XtSetArg(args[i], XtNallowVert, True); i++;
  XtSetArg(args[i], XtNtranslations, ptexttrans); i++;
  viewport = XtCreateManagedWidget("vp", viewportWidgetClass, form,
				   args, i);

  /* A Quit button */
  i = 0;
  XtSetArg(args[i],XtNlabel,"Quit"); i++;
  XtSetArg(args[i],"fromVert",viewport); i++;
  tmpW = XtCreateManagedWidget("quitButton",commandWidgetClass, form,
			       args, i);
  XtAddCallback(tmpW, XtNcallback, quitbutton_callback, (XtPointer) tmpW);

  /* A ZoomIn button */
  i = 0;
  XtSetArg(args[i],XtNlabel,"ZoomIn"); i++;
  XtSetArg(args[i],"fromVert",viewport); i++;
  XtSetArg(args[i],"fromHoriz",tmpW); i++;
  tmpW = XtCreateManagedWidget("zoomInButton",commandWidgetClass, form,
			       args, i);
  XtAddCallback(tmpW, XtNcallback, zoomin, (XtPointer) tmpW);

  /* A ZoomOut button */
  i = 0;
  XtSetArg(args[i],XtNlabel,"ZoomOut"); i++;
  XtSetArg(args[i],"fromVert",viewport); i++;
  XtSetArg(args[i],"fromHoriz",tmpW); i++;
  tmpW = XtCreateManagedWidget("zoomOutButton",commandWidgetClass, form,
			       args, i);
  XtAddCallback(tmpW, XtNcallback, zoomout, (XtPointer) tmpW);

  /* A Next button */
  i = 0;
  XtSetArg(args[i],XtNlabel,"Next"); i++;
  XtSetArg(args[i],"fromVert",viewport); i++;
  XtSetArg(args[i],"fromHoriz",tmpW); i++;
  tmpW = XtCreateManagedWidget("nextButton",commandWidgetClass, form,
			       args, i);
  XtAddCallback(tmpW, XtNcallback, next_file, (XtPointer) tmpW);

  /* A label widget for messages */
  i = 0;
  XtSetArg(args[i],"borderWidth",0); i++;
  XtSetArg(args[i],"fromVert",viewport); i++;
  XtSetArg(args[i],"fromHoriz",tmpW); i++;
  XtSetArg(args[i],XtNlabel,"            "); i++;
  message = XtCreateManagedWidget("messageLabel", labelWidgetClass, form,
				args, i);
  /* show_message(" "); */


  /* A Label widget for the plotting*/
  i = 0;
  label = XtCreateManagedWidget("label", labelWidgetClass, viewport,
				args, i);
  

}

Pixmap make_bitmap()
{
  int r_width, r_height;
  XGCValues gc_values;
  unsigned long gc_mask;
  Pixmap bitmap;

  r_width = MIL2PIXEL(max_xpos) + 10;
  r_height = MIL2PIXEL(max_ypos) + 10;

  bitmap = XCreatePixmap(dpy, RootWindowOfScreen(XtScreen(toplevel)),
		       r_width, r_height, 1);

  gc_values.foreground = WhitePixelOfScreen(XtScreen(toplevel));
  gc_values.background = BlackPixelOfScreen(XtScreen(toplevel));
  gc_values.function = GXcopy;
  gc_values.line_width = 1;
  gc_values.fill_style = FillSolid;
  gc_mask = GCForeground|GCBackground|GCFunction;
  gc_mask = gc_mask|GCFillStyle|GCLineWidth;
    
  white_gc = XCreateGC(XtDisplay(toplevel),
		       bitmap,
		       gc_mask, &gc_values);


  XFillRectangle(dpy, bitmap, white_gc, 0, 0, r_width, r_height);

  return bitmap;
}

show_bitmap(fname,bitmap)
     char *fname;
     Pixmap bitmap;
{
  XEvent event;

  XtSetArg(args[0], XtNbitmap, bitmap);
  (void) XtSetValues(label, args, ONE);

  XtSetArg(args[0], XtNlabel, fname);
  (void) XtSetValues(toplevel, args, ONE);

  XtRealizeWidget(toplevel);

  show_message(" ");
  while (!next_page) {
    XtAppNextEvent(app_con, &event);
    XtDispatchEvent(&event);
  }
  next_page = 0;

}

deallocate_bitmap(b)
     Pixmap b;
{
  XFreePixmap(dpy,b);
}

