
#include "resizewidgetP.h"
#include "resizewidget.h"

void set_rsez_code(org_x_w, org_y_w, buttonx, buttony)
       int org_x_w, org_y_w, buttonx, buttony;
 {
   int a3rd_width, a3rd_height;

   /* Set the Resize Code, to indicate which area of widget is being changed */
   /* ---------------------------------------------------------------------- */
   a3rd_width = (int) (resz_width / 3.0);
   a3rd_height = (int) (resz_height / 3.0);
   if (buttony >= org_y_w + a3rd_height + a3rd_height)
     resz_code = LOW_LEFT;
   else if (buttony >= org_y_w + a3rd_height)
     resz_code = MID_LEFT;
   else
     resz_code = UP_LEFT;
   if (buttonx >= org_x_w + a3rd_width + a3rd_width)
     resz_code += 2;   /* RIGHT, rather than left */
   else if (buttonx >= org_x_w + a3rd_width)
     resz_code++;      /* MIDDLE, rather than left */
 };

/****************************************************************/

void StartResizing(widget, event, myWidgetInfo, num_myWidgetTypes)
     Widget widget;
     XEvent *event;
     String *myWidgetInfo;       /* array of strings, like "button", etc    */
     Cardinal num_myWidgetTypes; /* number of strings in myWidgetType array */
 {
   XButtonEvent *buttonevent;
   Position rootx, rooty;     /* Origin of parent, in root coordinates. */
   Position org_x_w, org_y_w; /* Origin of widget, in root coorditates. */
   int parent_widget_ID;
   Arg arg_list[10];

   /* Query some basic info from widget */
   /* --------------------------------- */
   XtSetArg(arg_list[0], XtNborderWidth, (XtArgVal) &resz_border_width);
   XtSetArg(arg_list[1], XtNwidth, (XtArgVal) &resz_width);
   XtSetArg(arg_list[2], XtNheight, (XtArgVal) &resz_height);
   XtSetArg(arg_list[3], NULL, (XtArgVal) NULL);
   XtGetValues(widget, arg_list, 3);

   sscanf(myWidgetInfo[0], "%d", &parent_widget_ID);

   /* Use x,y of button press event */
   /* ----------------------------- */
   buttonevent = (XButtonEvent *) event;

   /* Translate origin of widget into root coordinates. */
   /* ------------------------------------------------- */
   XtTranslateCoords(widget, (Position) 0, (Position) 0,
		     &org_x_w, &org_y_w);

   /* Translate origin of parent into root coordinates. */
   /* ------------------------------------------------- */
   XtTranslateCoords((Widget) parent_widget_ID, (Position) 0, (Position) 0,
		     &rootx, &rooty);

   /* Save initial offsets for later use in WidgetMover */
   /* ------------------------------------------------- */
   start_rootx = org_x_w - buttonevent->x_root - rootx;
   start_rooty = org_y_w - buttonevent->y_root - rooty;

   /* Set the Resize Code, to indicate which area of widget is being changed */
   /* ---------------------------------------------------------------------- */
   set_rsez_code((int) org_x_w, (int) org_y_w,
                 (int) buttonevent->x_root, (int) buttonevent->y_root);

   /* Set the correct initial state of a widget, to be moved within a form */
   /* -------------------------------------------------------------------- */
   XtSetArg(arg_list[0], XtNhorizDistance,
                        (XtArgVal) (buttonevent->x_root + start_rootx));
   XtSetArg(arg_list[1], XtNvertDistance,
	                (XtArgVal) (buttonevent->y_root + start_rooty));
   XtSetArg(arg_list[2], XtNtop, (XtArgVal) XtChainTop);
   XtSetArg(arg_list[3], XtNleft, (XtArgVal) XtChainLeft);
   XtSetArg(arg_list[4], XtNright, (XtArgVal) XtRubber);
   XtSetArg(arg_list[5], XtNbottom, (XtArgVal) XtRubber);
   XtSetArg(arg_list[6], XtNresizable, (XtArgVal) TRUE);
   XtSetArg(arg_list[7], XtNwidth, (XtArgVal) resz_width);
   XtSetArg(arg_list[8], XtNheight, (XtArgVal) resz_height);
   XtSetArg(arg_list[9], NULL, (XtArgVal) NULL);
   XtSetValues(widget, arg_list, 9);

 };         /* end of StartResizing() */

/****************************************************************/
void WidgetSizer(widget, event, myWidgetInfo, num_myWidgetTypes)
     Widget widget;
     XEvent *event;
     String *myWidgetInfo;       /* array of strings, like "button", etc    */
     Cardinal num_myWidgetTypes; /* number of strings in myWidgetType array */
 {
   XButtonEvent *buttonevent;
   Position org_x_w, org_y_w;
   int parent_widget_ID;
   Arg arg_list[10];

   /* Store x,y of button press relative to root window */
   /* ------------------------------------------------- */
   buttonevent = (XButtonEvent *) event;
   XtTranslateCoords((Widget) widget, (Position) 0, (Position) 0, 
		     &org_x_w, &org_y_w);

   /* Change the size (and maybe position) of the widget being resized */
   /* ---------------------------------------------------------------- */
   switch(resz_code)
     { case   UP_LEFT :  /*
                         if ((buttonevent->x_root < org_x_w) 
                             && (buttonevent->y_root < org_y_w))
	                   XtConfigureWidget(widget, 
                                           (buttonevent->x_root + start_rootx),
                                           (buttonevent->y_root + start_rooty),
                                           resz_width,
                                           resz_height,
                                           resz_border_width);
                         else if ((buttonevent->x_root == org_x_w)
                                  || (buttonevent->y == org_y_w)) */
                           ;  /* Do nothing, can't make a zero dimen widget. */
                        /* else if (buttonevent->y < 0)
                           resz_code = UP_RIGHT;
                         else if (buttonevent->x < 0)
                           resz_code = LOW_LEFT;
	                 break;
*/
       case UP_CENTER :  resz_code = LOW_RIGHT;
	                 break;

       case   UP_RIGHT:  resz_code = LOW_RIGHT;
	                 break;

       case   MID_LEFT:  resz_code = LOW_RIGHT;
	                 break;

       case MID_CENTER:  resz_code = LOW_RIGHT;
	                 break;

       case  MID_RIGHT:  resz_code = LOW_RIGHT;
	                 break;

       case   LOW_LEFT:  resz_code = LOW_RIGHT;
	                 break;

       case LOW_CENTER:  resz_code = LOW_RIGHT;
	                 break;

       case  LOW_RIGHT:  if ((buttonevent->x_root > org_x_w)
                             && (buttonevent->y_root > org_y_w)
                             && (buttonevent->x > 0)
                             && (buttonevent->y > 0))
	                   { XtResizeWidget(widget,
                                          buttonevent->x, buttonevent->y,
                                          resz_border_width);
                             resz_width = (int) buttonevent->x;
                             resz_height = (int) buttonevent->y;
			   }
                         else if ((buttonevent->x_root == org_x_w)
                                  || (buttonevent->y_root == org_y_w))
                           ;  /* Do nothing, can't make a zero dimen widget. */
                         else if (buttonevent->y_root < org_y_w)
                           resz_code = UP_RIGHT;
                         else if (buttonevent->x_root < org_x_w)
                           resz_code = LOW_LEFT;
	                 break;

               default:  resz_code = LOW_RIGHT;
	                 break;
     };

 };         /* end of WidgetSizer() */

/****************************************************************/

void DoneSizing(widget, event, myWidgetInfo, num_myWidgetTypes)
     Widget widget;
     XEvent *event;
     String *myWidgetInfo;       /* array of strings, like "button", etc    */
     Cardinal num_myWidgetTypes; /* number of strings in myWidgetType array */
 {
   int parent_widget_ID;
   Arg arg_list[10];

   /* Change the width and height of the widget */
   /* ----------------------------------------- */
    XtSetArg(arg_list[0], XtNwidth, (XtArgVal) resz_width);
    XtSetArg(arg_list[1], XtNheight, (XtArgVal) resz_height);
    XtSetArg(arg_list[2], XtNtop, (XtArgVal) XtChainTop);
    XtSetArg(arg_list[3], XtNleft, (XtArgVal) XtChainLeft);
    XtSetArg(arg_list[4], XtNright, (XtArgVal) XtRubber);
    XtSetArg(arg_list[5], XtNbottom, (XtArgVal) XtRubber);
    XtSetArg(arg_list[6], XtNresizable, (XtArgVal) TRUE);
    XtSetArg(arg_list[7], NULL, (XtArgVal) NULL);
    XtSetValues(widget, arg_list, 7);

   /* Re-adjust the parent widget */
   /* --------------------------- */
   sscanf(myWidgetInfo[0], "%d", &parent_widget_ID);

   XtSetArg(arg_list[0], XtNresizable, (XtArgVal) TRUE);
   XtSetArg(arg_list[1], NULL, (XtArgVal) NULL);
   XtSetValues((Widget) parent_widget_ID, arg_list, 1);
/*    XtUnmapWidget((Widget) parent_widget_ID);
      XtMapWidget((Widget) parent_widget_ID); */
   XtUnmanageChild(widget);
   XtManageChild(widget);

   /* Change the width and height of the widget */
   /* ----------------------------------------- */
    XtSetArg(arg_list[0], XtNwidth, (XtArgVal) resz_width);
    XtSetArg(arg_list[1], XtNheight, (XtArgVal) resz_height);
    XtSetArg(arg_list[2], XtNtop, (XtArgVal) XtChainTop);
    XtSetArg(arg_list[3], XtNleft, (XtArgVal) XtChainLeft);
    XtSetArg(arg_list[4], XtNright, (XtArgVal) XtRubber);
    XtSetArg(arg_list[5], XtNbottom, (XtArgVal) XtRubber);
    XtSetArg(arg_list[6], XtNresizable, (XtArgVal) TRUE);
    XtSetArg(arg_list[7], NULL, (XtArgVal) NULL);
    XtSetValues(widget, arg_list, 7);

 };         /* end of DoneSizing() */

/****************************************************************/
