/** * * xform.c - (c) 1994 Copyright by John R. Punin * * ASHE * * This file has the routines to create the Form option menu. * * John R. Punin Jul - 24 - 1994 * */ #include "xhtml.h" #include "xform.h" #include "xheader.h" #include "xfile.h" static int ntype=0; static int check=0; static int multi=0; static int selec=0; MenuItem type_menu[] = { { "Text...", &xmPushButtonWidgetClass, 'T', NULL,NULL, form_text, 0, NULL}, { "Hidden...", &xmPushButtonWidgetClass, 'H', NULL, NULL,form_text, 0, NULL}, { "Password...", &xmPushButtonWidgetClass, 'P', NULL,NULL, form_text, 0, NULL}, { "", &xmSeparatorWidgetClass, (char)NULL, NULL,NULL, NULL, (int)NULL,NULL}, { "Checkbox...", &xmPushButtonWidgetClass, 'C', NULL, NULL, form_radio, 0, NULL}, { "Radio...", &xmPushButtonWidgetClass, 'a', NULL,NULL, form_radio, 0, NULL}, { "", &xmSeparatorWidgetClass, (char)NULL, NULL,NULL, NULL, (int)NULL,NULL}, { "Reset...", &xmPushButtonWidgetClass, 'R', NULL,NULL, form_reset, 0, NULL}, { "Submit...", &xmPushButtonWidgetClass, 'S', NULL,NULL, form_reset, 0, NULL}, NULL, }; MenuItem form_menu[] = { { "Form...", &xmPushButtonWidgetClass, 'F', NULL,NULL, set_form, 0, NULL}, { "Input", &xmCascadeButtonWidgetClass, 'I', NULL, NULL, 0, 0, type_menu}, { "Select...", &xmPushButtonWidgetClass, 'S', NULL, NULL, form_select, 0, NULL}, { "Option...", &xmPushButtonWidgetClass, 'O', NULL,NULL , form_option, 0, NULL}, { "Textarea...", &xmPushButtonWidgetClass, 'T', NULL,NULL,form_textarea,0,NULL}, NULL,}; Widget BuildPulldownMenu(Widget w, char *menu_title, char menu_mnemonic, Boolean tear_off, MenuItem *items,HTMLED *he) { Widget PullDown, cascade, widget; int i; XmString str; PullDown = XmCreatePulldownMenu(w,"pulldown", NULL,0); if (tear_off) XtVaSetValues(PullDown, XmNtearOffModel, XmTEAR_OFF_ENABLED, NULL); str = XmStringCreateLocalized(menu_title); cascade = XtVaCreateManagedWidget (menu_title,xmCascadeButtonWidgetClass, w, XmNsubMenuId, PullDown, XmNlabelString,str, XmNmnemonic, menu_mnemonic, NULL); XmStringFree(str); /* Now add the menu items */ for(i=0; items[i].label != NULL; i++) { /* If subitems exists, create the pull-right menu by calling this function recursively. Since the function returns a cascade button the widget returned is used.. */ if(items[i].subitems) widget = BuildPulldownMenu(PullDown, items[i].label, items[i].mnemonic, tear_off, items[i].subitems,he); else widget = XtVaCreateManagedWidget(items[i].label, *items[i].class, PullDown,NULL); /* Whether the item is a real item or a cascade button with a menu it can still have a mnemonic. */ if(items[i].mnemonic) XtVaSetValues(widget,XmNmnemonic, items[i].mnemonic,NULL); /* any item can have an accelerator, except cascade menus. But, I don't worry about that */ if(items[i].accelerator) { str = XmStringCreateLocalized (items[i].accel_text); XtVaSetValues(widget, XmNaccelerator,items[i].accelerator, XmNacceleratorText, str, NULL); XmStringFree(str); } else if(items[i].accel_text) { str = XmStringCreateLocalized (items[i].accel_text); XtVaSetValues(widget, XmNacceleratorText, str, NULL); XmStringFree(str); } items[i].callback_data = (XtPointer)he; if(items[i].callback) XtAddCallback(widget, (items[i].class == &xmToggleButtonWidgetClass) ? XmNvalueChangedCallback : /*Toggle Button class */ XmNactivateCallback, /*PushButton class */ items[i].callback, items[i].callback_data); } return cascade; } void set_form(Widget w, XtPointer client_data, XtPointer call_data) { HTMLED *he = (HTMLED *)client_data; Widget dialog,optionmenu,label_form,name_box; XmString label = XmStringCreateLtoR("FORM \n",XmSTRING_DEFAULT_CHARSET); XmString t = XmStringCreateLtoR("Action (URL) : \n",XmSTRING_DEFAULT_CHARSET); XmString clear =XmStringCreateSimple("Clear"); XmString method = XmStringCreateSimple("Method :"); XmString get =XmStringCreateSimple("Get"); XmString post =XmStringCreateSimple("Post"); XmString none =XmStringCreateSimple("None"); dialog = XmCreatePromptDialog(he->textarea,"Form_html",NULL,0); XtVaSetValues(dialog, XmNselectionLabelString,t, XmNapplyLabelString,clear,NULL); XmStringFree(clear); XmStringFree(t); name_box = XmCreateForm(dialog,"namebox",NULL,0); optionmenu = XmVaCreateSimpleOptionMenu(name_box,"option_menu", method,'\0',0 /* initial menu selection */,option_cb, XmVaPUSHBUTTON,get,'\0',NULL,NULL, XmVaPUSHBUTTON,post,'\0',NULL,NULL, XmVaPUSHBUTTON,none,'\0',NULL,NULL, XmNuserData,he, NULL); XmStringFree(get); XmStringFree(post); XmStringFree(none);XmStringFree(method); label_form = XmCreateLabel(name_box,"label_form",NULL,0); XtVaSetValues(label_form,XmNlabelString,label,NULL); XmStringFree(label); XtVaSetValues(optionmenu, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget,label_form, XmNleftAttachment, XmATTACH_FORM, NULL); XtVaSetValues(label_form, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, NULL); XtManageChild(optionmenu); XtManageChild(label_form); XtManageChild(name_box); /* When the user types the Reference name, call form_name()... */ XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)form_name,(XtPointer)he); /* If the user selects cancel, just detroy the dialog */ XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL); /* Clear button is available */ XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL); XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON)); /* No help is available */ XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON)); XtManageChild(dialog); XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea), XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)), 0,0,800,800,0,0); } void form_name(Widget w, XtPointer client_data, XtPointer call_data) { XmSelectionBoxCallbackStruct *cbs=(XmSelectionBoxCallbackStruct *)call_data; HTMLED *he = (HTMLED *)client_data; XmTextPosition left=0,right=0; int len=0,lsel = 0; char *str,*str2, *value,*ssel = NULL; he->last_command = FORM; if(XmTextGetSelectionPosition(he->textarea,&left,&right)) { if(right<=left) left = right = XmTextGetInsertionPosition(he->textarea); } else left = right = XmTextGetInsertionPosition(he->textarea); if(left!=right) { ssel = XmTextGetSelection(he->textarea); lsel = strlen(ssel); } if(cbs->value!=NULL) { XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&value); len = strlen(value); str = XtMalloc(len+40); } str2 = XtMalloc(20); if(he->method == GET) strcpy(str2," METHOD=\"GET\""); else if(he->method == POST) strcpy(str2," METHOD=\"POST\""); else { XtFree(str2); str2=NULL; } if(left!=right) { XmTextInsert(he->textarea,right,"\n"); if(str2) sprintf(str,"\n
"); XmTextInsert(he->textarea,left,str); XmTextSetInsertionPosition(he->textarea,left + strlen(str) - 8); XtFree(str); XtFree(str2); } XtFree(ssel); he->method = GET; XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT); } void option_cb(Widget w, XtPointer client_data, XtPointer call_data) { Widget parent = XtParent(w); HTMLED *he; int item_no = (int)client_data; XtVaGetValues(parent,XmNuserData,&he,NULL); he->method = item_no; } void form_text(Widget w, XtPointer client_data, XtPointer call_data) { HTMLED *he = (HTMLED *)client_data; Widget dialog,name_box,text_name,label_name; Widget label_maxl,text_maxl,label_size,text_size,label_input; XmString va = XmStringCreateSimple("Value :"); XmString na = XmStringCreateSimple("Name :"); XmString ml = XmStringCreateSimple("MaxLength :"); XmString si = XmStringCreateSimple("Size : "); XmString label = get_label_input(w); XmString clear = XmStringCreateSimple("Clear"); dialog = XmCreatePromptDialog(he->textarea,"Input_text",NULL,0); XtVaSetValues(dialog,XmNselectionLabelString,va, XmNapplyLabelString,clear,NULL); XmStringFree(va);XmStringFree(clear); name_box = XmCreateForm(dialog,"namebox",NULL,0); label_name = XmCreateLabel(name_box,"label_name",NULL,0); XtVaSetValues(label_name,XmNlabelString,na,NULL); XmStringFree(na); text_name = XmCreateText(name_box,"text_name",NULL,0); label_size = XmCreateLabel(name_box,"label_size",NULL,0); XtVaSetValues(label_size,XmNlabelString,si,NULL); XmStringFree(si); text_size = XmCreateText(name_box,"text_size",NULL,0); label_maxl = XmCreateLabel(name_box,"label_maxl",NULL,0); XtVaSetValues(label_maxl,XmNlabelString,ml,NULL); XmStringFree(ml); text_maxl = XmCreateText(name_box,"text_maxl",NULL,0); label_input = XmCreateLabel(name_box,"label_input",NULL,0); XtVaSetValues(label_input,XmNlabelString,label,NULL); XmStringFree(label); XtVaSetValues(text_name, XmNtopAttachment,XmATTACH_WIDGET, XmNtopWidget, label_name, XmNleftAttachment, XmATTACH_FORM, XmNcolumns,26, NULL); XtManageChild(text_name); XtVaSetValues(label_name, XmNtopAttachment,XmATTACH_WIDGET, XmNtopWidget, text_size, XmNleftAttachment, XmATTACH_FORM, NULL); XtManageChild(label_name); XtVaSetValues(text_size, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget,label_size, XmNleftAttachment, XmATTACH_FORM, XmNcolumns,12, NULL); XtVaSetValues(label_size, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget,label_input, XmNleftAttachment, XmATTACH_FORM, NULL); XtVaSetValues(label_input, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, NULL); XtVaSetValues(text_maxl, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget,label_maxl, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, text_size, XmNcolumns,12, NULL); XtVaSetValues(label_maxl, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget,label_input, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, label_size, NULL); XtManageChild(text_size); XtManageChild(label_size); XtManageChild(text_maxl); XtManageChild(label_maxl); XtManageChild(label_input); XtManageChild(name_box); /* When the user types the Value, call ok_input_text()... */ XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)ok_input_text,(XtPointer)he); /* If the user selects cancel, just detroy the dialog */ XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL); /* Clear button is available */ XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL); XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON)); /* No help is available */ XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON)); /* verify if these fields are numbers */ XtAddCallback(text_size,XmNmodifyVerifyCallback, (XtCallbackProc)check_number, (XtPointer)5); XtAddCallback(text_maxl,XmNmodifyVerifyCallback, (XtCallbackProc)check_number, (XtPointer)5); XtManageChild(dialog); XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea), XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)), 0,0,800,800,0,0); } void ok_input_text(Widget w, XtPointer client_data, XtPointer call_data) { HTMLED *he = (HTMLED *)client_data; XmSelectionBoxCallbackStruct *cbs=(XmSelectionBoxCallbackStruct *)call_data; Widget dialog,name_box,text_size,text_name,text_maxl; char *size,*name,*maxl,*value; int lsize, lname,lmaxl; int lvalue=0; XmTextPosition left = XmTextGetInsertionPosition(he->textarea); char *inputcom = NULL; dialog = XtNameToWidget(XtParent(w),"Input_text"); if(!dialog) dialog = XtNameToWidget(XtParent(w),"Input_check"); name_box = (dialog ? XtNameToWidget(dialog,"namebox"): NULL); text_size = (name_box ? XtNameToWidget(name_box,"text_size") : NULL); text_name = (name_box ? XtNameToWidget(name_box,"text_name") : NULL); text_maxl = (name_box ? XtNameToWidget(name_box,"text_maxl") : NULL); size = (text_size ? XmTextGetString(text_size) : NULL); name = (text_name ? XmTextGetString(text_name) : NULL); maxl = (text_maxl ? XmTextGetString(text_maxl) : NULL); value=NULL; lsize = (size ? strlen(size) : 0); lname = (name ? strlen(name): 0); lmaxl= (maxl ? strlen(maxl): 0); if(cbs->value) XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&value); lvalue = (value ? strlen(value): 0); inputcom=XtMalloc(lsize+lname+lmaxl+lvalue+80); he->last_command = INPUT; sprintf(inputcom,"\n"); XmTextInsert(he->textarea,left,inputcom); XmTextSetInsertionPosition(he->textarea,left+strlen(inputcom)); XtFree(inputcom);XtFree(size);XtFree(name);XtFree(maxl); XtFree(value); check = 0; XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT); } void form_radio(Widget w, XtPointer client_data, XtPointer call_data) { HTMLED *he = (HTMLED *)client_data; Widget dialog,name_box,text_name,label_name; Widget checked,label_input; XmString va = XmStringCreateSimple("Value :"); XmString na = XmStringCreateSimple("Name :"); XmString label = get_label_input(w); XmString clear = XmStringCreateSimple("Clear"); dialog = XmCreatePromptDialog(he->textarea,"Input_check",NULL,0); XtVaSetValues(dialog,XmNselectionLabelString,va, XmNapplyLabelString,clear,NULL); XmStringFree(va); XmStringFree(clear); name_box = XmCreateForm(dialog,"namebox",NULL,0); label_name = XmCreateLabel(name_box,"label_name",NULL,0); XtVaSetValues(label_name,XmNlabelString,na,NULL); XmStringFree(na); text_name = XmCreateText(name_box,"text_name",NULL,0); checked = XmCreateToggleButton(name_box,"Checked",NULL,0); label_input = XmCreateLabel(name_box,"label_input",NULL,0); XtVaSetValues(label_input,XmNlabelString,label,NULL); XmStringFree(label); XtVaSetValues(text_name, XmNtopAttachment,XmATTACH_WIDGET, XmNtopWidget, label_name, XmNleftAttachment, XmATTACH_FORM, XmNcolumns,26, NULL); XtManageChild(text_name); XtVaSetValues(label_name, XmNtopAttachment,XmATTACH_WIDGET, XmNtopWidget, checked, XmNleftAttachment, XmATTACH_FORM, NULL); XtManageChild(label_name); XtVaSetValues(checked, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget,label_input, XmNleftAttachment, XmATTACH_FORM, NULL); XtVaSetValues(label_input, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, NULL); XtManageChild(checked); XtManageChild(label_input); XtManageChild(name_box); /* When the user types the Value, call ok_input_text()... */ XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)ok_input_text,(XtPointer)he); /* If the user selects cancel, just detroy the dialog */ XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL); /* Clear button is available */ XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL); XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON)); /* No help is available */ XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON)); /* Callback of Check button */ XtAddCallback(checked,XmNvalueChangedCallback,(XtCallbackProc)checked_input,NULL); XtManageChild(dialog); XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea), XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)), 0,0,800,800,0,0); } void form_reset(Widget w, XtPointer client_data, XtPointer call_data) { HTMLED *he = (HTMLED *)client_data; Widget dialog,label_input; XmString label = get_label_input(w); XmString clear = XmStringCreateSimple("Clear"); XmString va = XmStringCreateSimple("Value :"); dialog = XmCreatePromptDialog(he->textarea,"Input_check",NULL,0); XtVaSetValues(dialog,XmNselectionLabelString,va, XmNapplyLabelString,clear,NULL); XmStringFree(va); XmStringFree(clear); label_input = XmCreateLabel(dialog,"label_input",NULL,0); XtVaSetValues(label_input,XmNlabelString,label,NULL); XmStringFree(label); XtManageChild(label_input); /* When the user types the Value, call ok_input_text()... */ XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)ok_input_text,(XtPointer)he); /* If the user selects cancel, just detroy the dialog */ XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL); /* Clear button is available */ XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL); XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON)); /* No help is available */ XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON)); XtManageChild(dialog); XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea), XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)), 0,0,800,800,0,0); } void form_select(Widget w, XtPointer client_data, XtPointer call_data) { HTMLED *he = (HTMLED *)client_data; Widget dialog,name_box,text_size,label_size; Widget multiple,label_select; XmString si = XmStringCreateSimple("Size :"); XmString na = XmStringCreateSimple("Name :"); XmString label=XmStringCreateLtoR("Select Field\n",XmSTRING_DEFAULT_CHARSET); XmString clear = XmStringCreateSimple("Clear"); dialog = XmCreatePromptDialog(he->textarea,"Select_field",NULL,0); XtVaSetValues(dialog,XmNselectionLabelString,na, XmNapplyLabelString,clear,NULL); XmStringFree(na); XmStringFree(clear); name_box = XmCreateForm(dialog,"namebox",NULL,0); label_size = XmCreateLabel(name_box,"label_size",NULL,0); XtVaSetValues(label_size,XmNlabelString,si,NULL); XmStringFree(si); text_size = XmCreateText(name_box,"text_size",NULL,0); multiple = XmCreateToggleButton(name_box,"Multiple",NULL,0); label_select = XmCreateLabel(name_box,"label_select",NULL,0); XtVaSetValues(label_select,XmNlabelString,label,NULL); XmStringFree(label); XtVaSetValues(text_size, XmNtopAttachment,XmATTACH_WIDGET, XmNtopWidget, label_size, XmNleftAttachment, XmATTACH_FORM, XmNcolumns,12, NULL); XtManageChild(text_size); XtVaSetValues(label_size, XmNtopAttachment,XmATTACH_WIDGET, XmNtopWidget, multiple, XmNleftAttachment, XmATTACH_FORM, NULL); XtManageChild(label_size); XtVaSetValues(multiple, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget,label_select, XmNleftAttachment, XmATTACH_FORM, NULL); XtVaSetValues(label_select, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, NULL); XtManageChild(multiple); XtManageChild(label_select); XtManageChild(name_box); /* When the user types the Value, call ok_input_text()... */ XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)ok_select,(XtPointer)he); /* If the user selects cancel, just detroy the dialog */ XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL); /* Clear button is available */ XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL); XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON)); /* No help is available */ XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON)); /* Callback of Multiple button */ XtAddCallback(multiple,XmNvalueChangedCallback,(XtCallbackProc)multiple_select,NULL); /* verify if these fields are numbers */ XtAddCallback(text_size,XmNmodifyVerifyCallback, (XtCallbackProc)check_number, (XtPointer)5); XtManageChild(dialog); XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea), XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)), 0,0,800,800,0,0); } void ok_select(Widget w, XtPointer client_data, XtPointer call_data) { XmSelectionBoxCallbackStruct *cbs=(XmSelectionBoxCallbackStruct *)call_data; HTMLED *he = (HTMLED *)client_data; XmTextPosition left=0,right=0; int len=0,lsel = 0; char *str, *name=NULL,*ssel = NULL; Widget dialog = XtNameToWidget(XtParent(w),"Select_field"); Widget name_box = (dialog ? XtNameToWidget(dialog,"namebox"): NULL); Widget text_size = (name_box ? XtNameToWidget(name_box,"text_size") : NULL); char *size = (text_size ? XmTextGetString(text_size) : NULL); int lsize = (size ? strlen(size) : 0); he->last_command = FORM; if(XmTextGetSelectionPosition(he->textarea,&left,&right)) { if(right<=left) left = right = XmTextGetInsertionPosition(he->textarea); } else left = right = XmTextGetInsertionPosition(he->textarea); if(left!=right) { ssel = XmTextGetSelection(he->textarea); lsel = strlen(ssel); } if(cbs->value!=NULL) { XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&name); len = strlen(name); str = XtMalloc(len+40); } if(left!=right) { XmTextInsert(he->textarea,right,"\n"); sprintf(str,"\n