/*
 * Copyright 1990 by Baylor College of Medicine ALL RIGHTS RESERVED. 
 *
 * This program is subject to a license agreement between 
 * Baylor College of Medicine and MIT. Any use inconsistent with
 * said license and any use by persons other than the faculty, 
 * students and staff at MIT or any use on a computer not operated 
 * as part of the Athena Computing Environment (ACE) is expressly 
 * prohibited.
 */
#include <stdio.h>
#include <string.h>
#include <Xm/Xm.h>
#include <Xm/PushB.h>
#include <Xm/PushBG.h>
#include <Xm/Label.h>
#include <Xm/Text.h>
#include <Xm/ScrolledW.h>
#include <Xm/RowColumn.h>
#include <Xm/CascadeB.h>
#include <X11/Shell.h>

#include <X11/IntrinsicP.h>
#include <X11/StringDefs.h>

#include <VList.h>
#include <srvlib.h>

#include "VtP.h"

static char *types[6] = {
	"None Selected",
	"Enhancement Request",
	"Has WorkAround",
	"No Workaround",
	"Causes Crash",
	"Documentation Error"
};

typedef struct _bug_form
{
	Widget pop;
	Widget subject;
	Widget info;
	SrvContext *srv;
	int nid;
	int pid;
	int type;
	char *version;
} *BugForm;

/*
 * Callback for Send button
 */
static
void
sel_send(w,bf)
	Widget w;
	BugForm bf;
{
	Notebook_Info note_info;
	Page_Info page_info;
	FILE *pipe;
	char buf[1024];
	char *subject;
	char *info;
	char *host;
	char *db;
	int port;
	int proto_major;
	int proto_minor;
	int release;

	if (bf->type == 0)
	{
		VtMessage(bf->pop,"You must select a type before sending mail");
		return;
	}

	VtWatchOn(bf->pop);

	XtVaGetValues(bf->subject,
		XmNvalue,&subject,
		NULL);
	XtVaGetValues(bf->info,
		XmNvalue,&info,
		NULL);

	port = srv_port(bf->srv);
	host = srv_host(bf->srv);
	db = srv_database(bf->srv);

	srv_inq_notebook(bf->srv,bf->nid,&note_info);
	srv_inq_page(bf->srv,bf->nid,bf->pid,&page_info);

	sprintf(buf,"mail -s \"%s: %s\" vns-bugs ",types[bf->type],subject);

	pipe = popen(buf,"w");
	fprintf(pipe,"Bug Type: %s\n",types[bf->type]);
	fprintf(pipe,"Program : %s\n",bf->version);
	fprintf(pipe,"Server  : %s\n",host);
	fprintf(pipe,"Port    : %d\n",port);
	fprintf(pipe,"Database: %s\n",db);
	fprintf(pipe,"Notebook: %s (%d)\n",note_info.title,bf->nid);
	fprintf(pipe,"Page    : %s (%d)\n\n",page_info.title,bf->pid);
	fprintf(pipe,"%s",info);
	pclose(pipe);

	VtWatchOff(bf->pop);

	XtPopdown(bf->pop);
	XtDestroyWidget(bf->pop) ;

	XtFree(bf->version);
	XtFree(bf);
}

/*
 * Callback for Cancel button
 */
static
void
sel_cancel(wd,bf)
	Widget wd ;
	BugForm bf;
{
	XtDestroyWidget(bf->pop) ;
}

/*
 * Callback when the popup is destroyed. This callback
 * frees the memory allocated for the popup info.
 */
static
void
destroy(w,bf)
	Widget w;
	BugForm bf;
{
	free((char *)bf);
}

/*
 * Callback for Type selection
 */
static
void
sel_type(w,bf)
	Widget w;
	BugForm bf;
{
	int type;

	XtVaGetValues(w,
		XmNuserData,&type,
		NULL);

	bf->type = type;
}

/*
 * public function for activating bug report popup
 */
PUBLIC
void
VtSendBugReport(parent,srv,nid,pid,version)
	Widget parent;
	SrvContext *srv;
	int nid;
	int pid;
	char *version;
{
	BugForm bf = (BugForm)malloc(sizeof *bf);
	XmString xm_str;
	Widget frm;
	Arg args[10];
	int n;

	bf->pop = XtVaCreatePopupShell("BugReportPopup",
		vendorShellWidgetClass,parent,
		XmNtitle,"Bug Report",
		XmNwindowGroup,None,
		NULL) ;
	XtAddCallback(bf->pop,XmNdestroyCallback,destroy,(XtPointer)bf) ;

	frm = XtVaCreateManagedWidget("form",vListWidgetClass,bf->pop,
		XtNnumRows,4,
		XtNnumColumns,1,
		XtNrowPivot,3,
		XtNvSpacing,2,
		XtNhSpacing,2,
		NULL) ;
	{
		Widget row2, critical, work, idea;
		Widget row = XtVaCreateManagedWidget("info",vListWidgetClass,frm,
			XtNnumRows,1,
			XtNnumColumns,2,
			XtNborderWidth,0,
			XtNhSpacing,2,
			XtNvSpacing,2,
			XtNstretchHoriz,True,
			NULL) ;
		xm_str = XmStringCreateLtoR("Subject:",XmSTRING_DEFAULT_CHARSET);
		XtVaCreateManagedWidget("SubjectLabel",xmLabelWidgetClass,row,
			XmNlabelString,xm_str,
			NULL);
		XmStringFree(xm_str);
		bf->subject = XtVaCreateManagedWidget("editor",xmTextWidgetClass,row,
			XtNstretchHoriz,True,
			NULL) ;
	}
	{
		Widget menu, option;
		Widget pb1, pb2, pb3, pb4, pb5, pb6;

		n = 0;
		XtSetArg(args[n],XmNmarginWidth,2); n++;
		XtSetArg(args[n],XmNmarginHeight,2); n++;
		menu = XmCreatePulldownMenu(frm,"OptionsMenu",args,n);

		pb1 = XtVaCreateManagedWidget(types[0],xmPushButtonGadgetClass,menu,
			XmNuserData,0,
			NULL);
		pb2 = XtVaCreateManagedWidget(types[1],xmPushButtonGadgetClass,menu,
			XmNuserData,1,
			NULL);
		pb3 = XtVaCreateManagedWidget(types[2],xmPushButtonGadgetClass,menu,
			XmNuserData,2,
			NULL);
		pb4 = XtVaCreateManagedWidget(types[3],xmPushButtonGadgetClass,menu,
			XmNuserData,3,
			NULL);
		pb5 = XtVaCreateManagedWidget(types[4],xmPushButtonGadgetClass,menu,
			XmNuserData,4,
			NULL);
		pb6 = XtVaCreateManagedWidget(types[5],xmPushButtonGadgetClass,menu,
			XmNuserData,5,
			NULL);
		XtAddCallback(pb1,XmNactivateCallback,sel_type,(XtPointer)bf);
		XtAddCallback(pb2,XmNactivateCallback,sel_type,(XtPointer)bf);
		XtAddCallback(pb3,XmNactivateCallback,sel_type,(XtPointer)bf);
		XtAddCallback(pb4,XmNactivateCallback,sel_type,(XtPointer)bf);
		XtAddCallback(pb5,XmNactivateCallback,sel_type,(XtPointer)bf);
		XtAddCallback(pb6,XmNactivateCallback,sel_type,(XtPointer)bf);

		xm_str = XmStringCreateLtoR("Type:  ",XmSTRING_DEFAULT_CHARSET);

		n = 0;
		XtSetArg(args[n],XmNlabelString,xm_str); n++;
		XtSetArg(args[n],XmNsubMenuId,menu); n++;
		option = XmCreateOptionMenu(frm,"Options",args,n);

		XmStringFree(xm_str);

		XtManageChild(option);
		bf->type = 0;
	}
	{
		Widget row = XtVaCreateManagedWidget("SubjectInfo",vListWidgetClass,frm,
			XtNnumRows,2,
			XtNnumColumns,1,
			XtNborderWidth,0,
			XtNhSpacing,2,
			XtNvSpacing,2,
			XtNstretchHoriz,True,
			XtNstretchVert,True,
			NULL) ;
		xm_str = XmStringCreateLtoR("Bug Description",XmSTRING_DEFAULT_CHARSET);
		XtVaCreateManagedWidget("StatusLabel",xmLabelWidgetClass,row,
			XmNlabelString,xm_str,
			XtNstretchHoriz,True,
			NULL) ;
		XmStringFree(xm_str);

		n = 0;
		XtSetArg(args[n],XmNeditMode,XmMULTI_LINE_EDIT); ++n;
		XtSetArg(args[n],XmNeditable,True); ++n;
		XtSetArg(args[n],XmNwidth,580); ++n;
		XtSetArg(args[n],XmNheight,250); ++n;
		XtSetArg(args[n],XmNscrollHorizontal,False); ++n;
		XtSetArg(args[n],XmNwordWrap,True); ++n;
		XtSetArg(args[n],XtNstretchHoriz,True); ++n;
		XtSetArg(args[n],XtNstretchVert,True); ++n;
		bf->info = XmCreateScrolledText(row,"editor",args,n);
		XtManageChild(bf->info);
	}
	{
		Widget buttons = XtVaCreateManagedWidget("Buttons",vListWidgetClass,frm,
			XtNnumRows,1,
			XtNborderWidth,0,
			XtNhSpacing,2,
			XtNvSpacing,2,
			XtNstretchHoriz,True,
			NULL) ;
		Widget send = XtVaCreateManagedWidget("Send",xmPushButtonWidgetClass,buttons,
			NULL) ;
		Widget cancel = XtVaCreateManagedWidget("Cancel",xmPushButtonWidgetClass,buttons,
			NULL) ;
		XtAddCallback(send,XmNactivateCallback,sel_send,(XtPointer)bf);
		XtAddCallback(cancel,XmNactivateCallback,sel_cancel,(XtPointer)bf);
	}

	bf->srv = srv;
	bf->nid = nid;
	bf->pid = pid;
	bf->version = strdup(version);

	XtPopup(bf->pop,XtGrabNone);
}
