#include <stdio.h>
#include <Xm/Form.h>
#include <Xm/RowColumn.h>
#include <Xm/TextF.h>
#include <Xm/PushB.h>
#include "ComboTextField.h"
#include "ComboBox.h"

#define dprintf if (debug) fprintf

const char *const ComboTextField::listSelectCallback = "listSelectCallback";

ComboTextField::ComboTextField(const char *name, Widget parent, 
			       XmStringTable *listItems, int nItems)
  : TextField(name)
{
  _baseWidget = XtVaCreateWidget(name, xmFormWidgetClass, parent, NULL);
  installDestroyHandler();

  _comboBox =
    XtVaCreateManagedWidget("comboBox", xmComboBoxWidgetClass, _baseWidget,
			    XmNleftAttachment, XmATTACH_FORM,
			    XmNtopAttachment, XmATTACH_FORM,
			    XmNeditable, True,
			    NULL);

  XmComboBoxAddItems(_comboBox, *listItems, nItems, 1);
  
  XtAddCallback(_comboBox, XmNselectionCallback,
		&ComboTextField::selectCallback, (XtPointer )this);
  
  _text = _comboBox;
  
  XtAddCallback(_text, 
		XmNmodifyVerifyCallback,
		&TextField::typingCallback,
		(XtPointer )this);

  
  // Carriage return means accept input
  XtAddCallback(_comboBox, XmNactivateCallback,
		&TextField::okCallback, (XtPointer )this);

  _buttonMgr = 
    XtVaCreateWidget("buttonMgr", xmRowColumnWidgetClass, _baseWidget,
		     XmNpacking, XmPACK_COLUMN,
		     XmNnumColumns, 2,
		     XmNorientation, XmVERTICAL,
		     XmNleftAttachment, XmATTACH_WIDGET,
		     XmNleftWidget, _comboBox,
		     XmNtopAttachment, XmATTACH_FORM,
		     XmNrightAttachment, XmATTACH_FORM,
		     XmNbottomAttachment, XmATTACH_FORM,
		     NULL);
  
  _ok = 
    XtVaCreateManagedWidget("ok", xmPushButtonWidgetClass, _buttonMgr, NULL);

  XtAddCallback(_ok, XmNactivateCallback,
		&TextField::okCallback, (XtPointer )this);

  _cancel = 
    XtVaCreateManagedWidget("cancel", xmPushButtonWidgetClass, _buttonMgr, 
			    NULL);
  
  XtAddCallback(_cancel, XmNactivateCallback,
		&TextField::cancelCallback, (XtPointer )this);

  XtSetMappedWhenManaged(_buttonMgr, False);
  XtManageChild(_buttonMgr);


}


ComboTextField::~ComboTextField()
{
}
			       

void ComboTextField::selectCallback(Widget w, 
				    XtPointer clientData,
				    XtPointer callData)
{
  ComboTextField *obj = (ComboTextField *)clientData;
  XmListCallbackStruct *cbs = (XmListCallbackStruct *)callData;
  obj->showButtons();
  obj->callCallbacks(listSelectCallback, (void *)cbs->item_position);
}



void ComboTextField::verifyCallback(Widget w,
				    XtPointer clientData,
				    XtPointer callData)
{
  Boolean debug = False;
  
  XmTextVerifyCallbackStruct *cbs = 
    (XmTextVerifyCallbackStruct *)callData;
  
  if (!cbs->text->ptr)
    // Backspace
    return;
  
  dprintf(stderr, "ComboTextField::verifyCallback() - got char %d\n",
	  cbs->text->ptr[cbs->text->length - 1]);

  if (cbs->text->ptr[cbs->text->length - 1] == '\n')
  {
    dprintf(stderr, "ComboTextField::verifyCallback() - got newline\n");
  }
}


void ComboTextField::set(char *str)
{
  XmComboBoxSetString(_text, str);
}
