#include "Tools.h"

/***********************************************/
/* Fonction pour CheckBox                      */
/***********************************************/

void
InitCheckBox (struct XObj *xobj)
{
  unsigned long mask;
  XSetWindowAttributes Attr;
  int asc, desc, dir;
  XCharStruct struc;

  /* Enregistrement des couleurs et de la police */
  MyAllocNamedColor ( xobj->forecolor, &xobj->TabColor[fore]);
  MyAllocNamedColor ( xobj->backcolor, &xobj->TabColor[back]);
  MyAllocNamedColor ( xobj->licolor,   &xobj->TabColor[li]);
  MyAllocNamedColor ( xobj->shadcolor, &xobj->TabColor[shad]);
  MyAllocNamedColor ( "#000000", &xobj->TabColor[black]);
  MyAllocNamedColor ( "#FFFFFF", &xobj->TabColor[white]);

  mask = 0;
  Attr.background_pixel = xobj->TabColor[back].pixel;
  mask |= CWBackPixel;
  Attr.cursor = XCreateFontCursor (xobj->display, XC_hand2);
  mask |= CWCursor;		/* Curseur pour la fenetre */

  xobj->win = XCreateWindow (xobj->display, *xobj->ParentWin,
			     xobj->x, xobj->y, xobj->width, xobj->height, 0,
			     CopyFromParent, InputOutput, CopyFromParent,
			     mask, &Attr);
  xobj->gc = XCreateGC (xobj->display, xobj->win, 0, NULL);
  XSetForeground (xobj->display, xobj->gc, xobj->TabColor[fore].pixel);
  XSetBackground (xobj->display, xobj->gc, xobj->TabColor[back].pixel);
  if (!load_font (xobj->font, &xobj->xfont))
    fprintf (stderr, "Can't load font %s\n", xobj->font);
  else
    XSetFont (xobj->display, xobj->gc, xobj->xfont.font->fid);

  XSetLineAttributes (xobj->display, xobj->gc, 1, LineSolid, CapRound, JoinMiter);

  /* Redimensionnement du widget */
  XTextExtents (xobj->xfont.font, "lp", strlen ("lp"), &dir, &asc, &desc, &struc);
  xobj->height = asc + desc + 5;
  xobj->width = XTextWidth (xobj->xfont.font, xobj->title, strlen (xobj->title)) + 30;
  XResizeWindow (xobj->display, xobj->win, xobj->width, xobj->height);
}

void
DestroyCheckBox (struct XObj *xobj)
{
  unload_font (&xobj->xfont);
  XFreeGC (xobj->display, xobj->gc);
  XDestroyWindow (xobj->display, xobj->win);
}

void
DrawCheckBox (struct XObj *xobj)
{
  XSegment segm[2];
  int asc, desc, dir;
  XCharStruct struc;

  /* Dessin du rectangle arrondi */
  XTextExtents (xobj->xfont.font, "lp", strlen ("lp"), &dir, &asc, &desc, &struc);
  DrawReliefRect (0, asc - 11, 15, 15, xobj, xobj->TabColor[li].pixel,
		xobj->TabColor[shad].pixel, xobj->TabColor[black].pixel, 0);

  /* Calcul de la position de la chaine de charactere */
#ifdef I18N
  DrawString (xobj->display, xobj->gc, xobj->win, xobj->xfont.fontset, 23,
#else
  DrawString (xobj->display, xobj->gc, xobj->win, 23,
#endif
	      asc, xobj->title,
	      strlen (xobj->title), xobj->TabColor[fore].pixel,
	      xobj->TabColor[li].pixel, xobj->TabColor[back].pixel,
	      !xobj->flags[1]);
  /* Dessin de la croix */
  if (xobj->value)
    {
      XSetLineAttributes (xobj->display, xobj->gc, 2, LineSolid, CapProjecting, JoinMiter);
      segm[0].x1 = 5;
      segm[0].y1 = 5 + asc - 11;
      segm[0].x2 = 9;
      segm[0].y2 = 9 + asc - 11;
      segm[1].x1 = 5;
      segm[1].y1 = 9 + asc - 11;
      segm[1].x2 = 9;
      segm[1].y2 = 5 + asc - 11;
      XSetForeground (xobj->display, xobj->gc, xobj->TabColor[black].pixel);
      XDrawSegments (xobj->display, xobj->win, xobj->gc, segm, 2);
      XSetLineAttributes (xobj->display, xobj->gc, 1, LineSolid, CapRound, JoinMiter);
    }
}

void
EvtMouseCheckBox (struct XObj *xobj, XButtonEvent * EvtButton)
{
  static XEvent event;
  int End = 1;
  unsigned int modif;
  int x1, x2, y1, y2;
  Window Win1, Win2;
  Window WinBut = 0;
  int In = 0;
  XSegment segm[2];
  int asc, desc, dir;
  XCharStruct struc;

  while (End)
    {
      XNextEvent (xobj->display, &event);
      switch (event.type)
	{
	case EnterNotify:
	  XQueryPointer (xobj->display, *xobj->ParentWin,
			 &Win1, &Win2, &x1, &y1, &x2, &y2, &modif);
	  if (WinBut == 0)
	    {
	      WinBut = Win2;
	      /* Mouse on button */
	      XTextExtents (xobj->xfont.font, "lp", strlen ("lp"), &dir, &asc, &desc, &struc);
	      DrawReliefRect (0, asc - 11, 15, 15, xobj, xobj->TabColor[shad].pixel,
		  xobj->TabColor[li].pixel, xobj->TabColor[black].pixel, 0);
	      In = 1;
	    }
	  else
	    {
	      if (Win2 == WinBut)
		{
		  /* Mouse on button */
		  DrawReliefRect (0, asc - 11, 15, 15, xobj, xobj->TabColor[shad].pixel,
		  xobj->TabColor[li].pixel, xobj->TabColor[black].pixel, 0);
		  In = 1;
		}
	      else if (In)
		{
		  In = 0;
		  /* Mouse not on button */
		  DrawReliefRect (0, asc - 11, 15, 15, xobj, xobj->TabColor[li].pixel,
				  xobj->TabColor[shad].pixel, xobj->TabColor[black].pixel, 0);
		}
	    }
	  break;
	case LeaveNotify:
	  XQueryPointer (xobj->display, *xobj->ParentWin,
			 &Win1, &Win2, &x1, &y1, &x2, &y2, &modif);
	  if (Win2 == WinBut)
	    {
	      In = 1;
	      /* Mouse on button */
	      DrawReliefRect (0, asc - 11, 15, 15, xobj, xobj->TabColor[shad].pixel,
		  xobj->TabColor[li].pixel, xobj->TabColor[black].pixel, 0);
	    }
	  else if (In)
	    {
	      /* Mouse not on button */
	      DrawReliefRect (0, asc - 11, 15, 15, xobj, xobj->TabColor[li].pixel,
		xobj->TabColor[shad].pixel, xobj->TabColor[black].pixel, 0);
	      In = 0;
	    }
	  break;
	case ButtonRelease:
	  End = 0;
	  /* Mouse not on button */
	  if (In)
	    {
	      /* Envoie d'un message vide de type SingleClic pour un clique souris */
	      xobj->value = !xobj->value;
	      DrawReliefRect (0, asc - 11, 15, 15, xobj, xobj->TabColor[li].pixel,
		xobj->TabColor[shad].pixel, xobj->TabColor[black].pixel, 0);
	      SendMsg (xobj, SingleClic);
	    }
	  if (xobj->value)
	    {
	      XSetLineAttributes (xobj->display, xobj->gc, 2, LineSolid, CapProjecting, JoinMiter);
	      segm[0].x1 = 5;
	      segm[0].y1 = 5 + asc - 11;
	      segm[0].x2 = 9;
	      segm[0].y2 = 9 + asc - 11;
	      segm[1].x1 = 5;
	      segm[1].y1 = 9 + asc - 11;
	      segm[1].x2 = 9;
	      segm[1].y2 = 5 + asc - 11;
	      XSetForeground (xobj->display, xobj->gc, xobj->TabColor[black].pixel);
	      XDrawSegments (xobj->display, xobj->win, xobj->gc, segm, 2);
	      XSetLineAttributes (xobj->display, xobj->gc, 1, LineSolid, CapRound, JoinMiter);
	    }
	  else
	    {
	      XSetForeground (xobj->display, xobj->gc, xobj->TabColor[back].pixel);
	      XFillRectangle (xobj->display, xobj->win, xobj->gc, 3, asc - 8, 9, 9);
	    }
	  break;
	}
    }
}

void
EvtKeyCheckBox (struct XObj *xobj, XKeyEvent * EvtKey)
{
}


void
ProcessMsgCheckBox (struct XObj *xobj, unsigned long type, unsigned long *body)
{
}
