#include "res.h"
#include "widgets.h"
#include "repop.h"
#include "RMFBuffer.h"
#include "rap.h"
#include "xstuff.h"
#include "ArgPack.h"
#include "repopargs.h"

NORET repop_CB PROTOTYPE((Widget,RapPack,caddr_t));
Bool repop_called;
VOIDP repop_return;

#define REPOP_CURSOR_NUMBER 58

/*--------------------------------------------------*/
VOIDP repop_Query(title,text_in,options_in)
char *title, *text_in, *options_in;
{
  RMFBuffer text=RMFBuffer_create(text_in,20);
  Widget shellW, formW, optionFormW, optionW, titleW, lastW, tbarW, pshellW;
  Display *dis;
  Window root, rrW, crW;
  int i,l,x,y,d1,d2,d3,width;
  ArgPack AP;
  char *line, *option;
  XEvent event;
  static Cursor RepopCursor=NULL;
  
  dis=XOpenDisplay(NULL);  /* get a connection to the default X server */
  if (dis==NULL)
    Al_fatal_error("repop: could not open a connection to the default X server.\n");

  /* get the root window */
  root=XDefaultRootWindow(dis);

  /* get x and y coordinates of pointer so we can pop yp a window. */
  XQueryPointer(dis,root,&rrW,&crW,
		&x,&y,
		&d1,&d2,&d3); /* return info that I don't need */

  AP=ArgPack_duplicate_args(repopShell); 
  shellW=XtCreateApplicationShell("repop_shell",
				  applicationShellWidgetClass,
				  ArgPack_the_args(AP),
				  ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_duplicate_args(repopShell);  /* popup where the pointer is */
  ArgPack_add_arg(AP,XtNx,(XtArgVal) x-20);  
  ArgPack_add_arg(AP,XtNy,(XtArgVal) y-40);
  pshellW=XtCreatePopupShell("repop_popup",
			     overrideShellWidgetClass,
			     shellW,
			     ArgPack_the_args(AP),
			     ArgPack_num_args(AP));
  ArgPack_delete(AP);
			     
  AP=ArgPack_duplicate_args(repopForm);
  formW=XtCreateManagedWidget("repop-form",
			      formWidgetClass,
			      pshellW,
			      ArgPack_the_args(AP),
			      ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_duplicate_args(repopForm);
  ArgPack_add_arg(AP,XtNfromVert,(XtArgVal) NULL);
  ArgPack_add_arg(AP,XtNfromHoriz,(XtArgVal) NULL);
  ArgPack_add_arg(AP,XtNborderWidth,(XtArgVal) 2);
  ArgPack_add_arg(AP,XtNdefaultDistance,(XtArgVal) 2);
  formW=XtCreateManagedWidget("repop-form",
			      formWidgetClass,
			      formW,
			      ArgPack_the_args(AP),
			      ArgPack_num_args(AP));
  ArgPack_delete(AP);
 
  AP=ArgPack_duplicate_args(repopTitle); 
  ArgPack_add_arg(AP,XtNfromVert,(XtArgVal) NULL);
  ArgPack_add_arg(AP,XtNfromHoriz,(XtArgVal) NULL);
  ArgPack_add_arg(AP,XtNlabel,(XtArgVal) title);
  ArgPack_add_arg(AP,XtNfont, (XtArgVal) AlUI_GetFont(shellW,
						      (int)ALUI_MAJOR_HEADING));
  titleW=XtCreateManagedWidget("assoc_labeel",
			       labelWidgetClass,
			       formW,
			       ArgPack_the_args(AP),
			       ArgPack_num_args(AP));
  ArgPack_delete(AP);
 
  lastW=titleW;

  /*
    *   ADD THE BODY OF TEXT
   */
  i=0;
  while ((line=RMFBuffer_get_next_chunk(text,'\n'))!=NULL) {
    AP=ArgPack_duplicate_args(repopTitle); 
    ArgPack_add_arg(AP,XtNfromVert,(XtArgVal) lastW);
    ArgPack_add_arg(AP,XtNfromHoriz,(XtArgVal) NULL);
    ArgPack_add_arg(AP,XtNlabel,(XtArgVal) line);
    ArgPack_add_arg(AP,XtNfont, (XtArgVal) AlUI_GetFont(shellW,
						   (int)ALUI_TEXT));
    ArgPack_add_arg(AP,XtNvertDistance,(XtArgVal) 
		    ((i==0) ? 10 : 2));
    lastW=XtCreateManagedWidget("assoc_line",
				labelWidgetClass,
				formW,
				ArgPack_the_args(AP),
				ArgPack_num_args(AP));
    ArgPack_delete(AP);
    RMFBuffer_destroy_chunk(text,line);
    i++;
  }
  RMFBuffer_destroy(text);
  
  /*
    *   ADD THE BUTTONS
   */
  AP=ArgPack_duplicate_args(repopOptionsTB);
  ArgPack_add_arg(AP,XtNfromVert,(XtArgVal) lastW);
  ArgPack_add_arg(AP,XtNfromHoriz,(XtArgVal) NULL);
  tbarW=XtCreateManagedWidget("repop_tbar",
			      XwtitlebarWidgetClass,
			      formW,
			      ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);
    
/*
  { XtNregion, (XtArgVal) XwALIGN_LEFT },
  { XtNposition, (XtArgVal) 0 },
*/

  text=RMFBuffer_create(options_in,20);
  i=0;
  while ((option=RMFBuffer_get_next_chunk(text,','))!=NULL) {
    AP=ArgPack_duplicate_args(repopOption);
    ArgPack_add_arg(AP,XtNlabel,(XtArgVal) option);
    ArgPack_add_arg(AP,XtNposition,(XtArgVal) i);
    ArgPack_add_arg(AP,XtNregion,(XtArgVal) XwALIGN_CENTER );
    ArgPack_add_arg(AP,XtNfont, 
		    (XtArgVal) AlUI_GetFont(shellW,
					    (int)ALUI_BUTTONS));
    optionW=XtCreateManagedWidget("repop_option",
				  commandWidgetClass,
				  tbarW,
				  ArgPack_the_args(AP),
				  ArgPack_num_args(AP));
    XtAddCallback(optionW,XtNcallback,repop_CB,
		  RapPack_create3((VOIDP)i,
				  (VOIDP)pshellW,
				  (VOIDP)shellW));
    ArgPack_delete(AP);
    RMFBuffer_destroy_chunk(text,option);
    i++;
  }
  RMFBuffer_destroy(text);


/*
  width=(int)Alxt_get_widget_feature(formW,XtNwidth);
  Alxt_SetArg(titleW,XtNwidth,(XtArgVal)width);
  Alxt_SetArg(tbarW,XtNwidth,(XtArgVal)width);
*/

  XtPopup(pshellW,XtGrabExclusive);

/*
  XSync(dis,0);
  if (RepopCursor==NULL) 
    RepopCursor=XCreateFontCursor(dis,(unsigned)REPOP_CURSOR_NUMBER);
  XDefineCursor(dis,XtWindow(formW),RepopCursor);
  
---------

  i=0;
  while (XGrabPointer(dis,
		      XtWindow(formW),
		      TRUE, 
		      NoEventMask,
		      GrabModeSync,
		      GrabModeAsync,
		      None,
		      RepopCursor,
		      CurrentTime)!=GrabSuccess) {
    if (i==0)
      printf("waiting to grab pointer...");
    i++;
  }
  if (i!=0)
    printf("\n");
*/

  repop_called=Bool_FALSE;
  while (repop_called==Bool_FALSE) {
    XtNextEvent(&event);
    XtDispatchEvent(&event);
  }
  return(repop_return);
}


/*--------------------------------------------------*/
NORET repop_CB(w,rp,cadda)
Widget w;
RapPack rp;
caddr_t cadda;
{
  int                i=(int)RapPack_get(rp,0);
  Widget pshellW=(Widget)RapPack_get(rp,1);
  Widget shellW=(Widget)RapPack_get(rp,2);

  XtPopdown(pshellW);
  XtDestroyWidget(shellW);

  repop_called=Bool_TRUE;
  repop_return=(VOIDP)i;
}
