/* Copyright 1993 by gregg hanna */
/*
 * Generated by the ICS builderXcessory (BX).
 *
 *
 * Builder Xcessory 1.0.1.
 *
 */
#include <stdio.h>
#include <X11/Intrinsic.h>
#include <X11/Xos.h>
#include <Xm/Xm.h>
#include <Xm/Text.h>
#include <Xm/List.h>
#include <Xm/ToggleB.h>
#include <string.h>
#include "compat.h"
#include "roloP.h"
#include "rolo.h"

int DisplayedCard;
int DialogForDelete = 0;

#define IsUp XtIsManaged
#define UpDialog XtManageChild
#define DownDialog XtUnmanageChild

void SetDialogDelete()
{
  Arg args[1];
  XmString xmstr;
  extern Widget confirmDialog;

  DialogForDelete = 1;

  xmstr = XmStringCreateSimple("Delete this card?");
  XtSetArg(args[0],XmNmessageString,xmstr);
  XtSetValues(confirmDialog,args,1);

  XmStringFree(xmstr);
}

void SetDialogUpdate()
{
  Arg args[2];
  XmString xmstr;
  extern Widget confirmDialog;

  DialogForDelete = 0;
  
  xmstr = XmStringCreateSimple("Save changes to this card?");
  XtSetArg(args[0],XmNmessageString,xmstr);
  XtSetValues(confirmDialog,args,1);

  XmStringFree(xmstr);
}

void PickChange(w,client,call)
     Widget w;
     caddr_t client, call;
{
  Boolean v;
  int n;
  XmToggleButtonCallbackStruct *event = (XmToggleButtonCallbackStruct*)call;

  n = (int)client;
  if ( n >= 0 && n < 4 ) {
    if ( event->set ) RoloSearch[n] = 1;
    else RoloSearch[n] = 0;
  }
}

void ManageArgAtClick(w,client,call)
     Widget w;
     caddr_t client, call;
{
  extern Widget picker;
  XmToggleButtonCallbackStruct *event = (XmToggleButtonCallbackStruct*)call;
  Widget wi = (Widget)client;
  XButtonEvent *bevent;
  Position x, y;

  UpDialog(picker);
}

void PickDone(w,client,call)
     Widget w;
     caddr_t client, call;
{
  Widget dialog;

  dialog = (Widget)client;
  DownDialog(dialog);
}

void
ActuallyDeleteCard(w, client, call)
Widget w;
caddr_t client;
caddr_t call;
{
  extern Widget cardForm, confirmDialog, ListForRolo;
  void OKCard();
  Arg arg[1];
  int n;

  DeleteRoloCard(DisplayedCard);
  if ( DialogForDelete ) { /* The dialog was a delete dialog */
    XmListDeletePos(ListForRolo,DisplayedCard+1);
    WriteRolo();
  } else {  /* we were using the delete dialog as an update dialog */
    XtSetArg(arg[0],XmNtopItemPosition,&n);
    XtGetValues(ListForRolo,arg,1);
    DisplayedCard = -1;
    OKCard((Widget)NULL,(caddr_t)NULL,(caddr_t)NULL); /* will re-add this rec and update */
    XmListSetPos(ListForRolo,n);
  }

  DownDialog(cardForm);
  DownDialog(confirmDialog);
}


void
AddCard(w, client, call)
Widget w;
caddr_t client;
caddr_t call;
{
  extern Widget nameText, numberText, numberText2, commentText, cardForm, deleteCardButton;
  Arg args[1];

  XmTextSetString(nameText,"");
  XmTextSetString(numberText,"");
  XmTextSetString(numberText2,"");
  XmTextSetString(commentText,"");

  XtSetArg(args[0],XmNsensitive,False);
  XtSetValues(deleteCardButton,args,1);

  DisplayedCard = -1;
  
  UpDialog(cardForm);
}

void
CancelCard(w, client, call)
Widget w;
caddr_t client;
caddr_t call;
{
  extern Widget cardForm, confirmDialog;
  DownDialog(cardForm);
  DownDialog(confirmDialog);
}

void
DeleteCard(w, client, call)
Widget w;
caddr_t client;
caddr_t call;
{
  extern Widget confirmDialog;
  SetDialogDelete();
  if ( IsUp(confirmDialog) ) DownDialog(confirmDialog);
  UpDialog(confirmDialog);
}

void
DontDeleteCard(w, client, call)
Widget w;
caddr_t client;
caddr_t call;
{
  extern Widget confirmDialog;
  DownDialog(confirmDialog);
}

void
OKCard(w, client, call)
Widget w;
caddr_t client;
caddr_t call;
{
  extern Widget nameText, numberText, numberText2, commentText, confirmDialog;
  extern Widget cardForm, ListForRolo;
  char *a, *b, *c, *d;
  int same;

  a = XmTextGetString(nameText);
  b = XmTextGetString(numberText);
  c = XmTextGetString(commentText);
  d = XmTextGetString(numberText2);

  if ( DisplayedCard < 0 ) {
    MakeNewRolo(a,b,d,c,1);
    WriteRolo();
    PutListOnScreen();
    DownDialog(cardForm);
    XmListSetPos(ListForRolo,GetIndex(a)+1);
  } else {
    same = ( strcmp(a,GetCardName(DisplayedCard)) == 0 ) &&
      ((!GetNumber(DisplayedCard) && !b[0]) ||
       (strcmp(b,GetNumber(DisplayedCard)) == 0 )) &&
      ((!GetNumber2(DisplayedCard) && !d[0]) ||
       (strcmp(d,GetNumber2(DisplayedCard)) == 0 )) &&
      ((GetText(DisplayedCard) && !c[0]) ||
       (strcmp(c,GetText(DisplayedCard)) == 0 ));
    if ( ! same ) {
      SetDialogUpdate();
      if ( IsUp(confirmDialog) ) DownDialog(confirmDialog);
      UpDialog(confirmDialog);
    } else {
      DownDialog(cardForm);
    }
  }
  if (a!=NULL) free(a);
  if (b!=NULL) free(b);
  if (c!=NULL) free(c);
  if (d!=NULL) free(d);
}

void
QuitProg(w, client, call)
Widget w;
caddr_t client;
caddr_t call;
{
  (void)exit(0);
}

void
Selected(w, client, call)
Widget w;
caddr_t client;
caddr_t call;
{
  XmListCallbackStruct *list=(XmListCallbackStruct*)call;
  extern Widget nameText, numberText, numberText2, commentText, cardForm, deleteCardButton;
  extern Widget filterText;
  Arg args[1];
  char *s;
  int n;

  n = list->item_position - 1;
  if ( n < 0 ) return;

  XmProcessTraversal(filterText,XmTRAVERSE_CURRENT);

  if (s = GetCardName(n))
    XmTextSetString(nameText,s);
  else
    XmTextSetString(nameText,"");
  if (s = GetNumber(n))
    XmTextSetString(numberText,s);
  else
    XmTextSetString(numberText,"");
  if (s = GetNumber2(n))
    XmTextSetString(numberText2,s);
  else
    XmTextSetString(numberText2,"");
  if (s = GetText(n))
    XmTextSetString(commentText,s);
  else
    XmTextSetString(commentText,"");

  XtSetArg(args[0],XmNsensitive,True);
  XtSetValues(deleteCardButton,args,1);

  DisplayedCard = n;
  
  UpDialog(cardForm);
}

void
SpinRolo(w, client, call)
Widget w;
caddr_t client;
caddr_t call;
{
  extern Widget ListForRolo;
  int n;

  n = GetIndex((char*)client);
  XmListSetPos(ListForRolo,n+1);
}


void ChangeFilter(w, client, call)
     Widget w;
     caddr_t client;
     caddr_t call;
{
  char *s;
  
  s = XmTextGetString(w);
  RoloFilter(s);
  PutListOnScreen();
}

void ClearFilter(w, client, call)
     Widget w;
     caddr_t client;
     caddr_t call;
{
  extern Widget filterText;

  XmTextSetString(filterText,"");
  RoloFilter((char*)NULL);
  PutListOnScreen();
}

void ReturnHit(w, client, call)
     Widget w;
     caddr_t client;
     caddr_t call;
{
  XmProcessTraversal(w,XmTRAVERSE_NEXT_TAB_GROUP);
}

