#include #include #include "sharp95.h" /* This is the command that the text gets piped to for printing You could even set up [n]enscript here if you wanted */ #define PRINTCOMMAND "lp" extern Widget toplevel; static Widget textdialog=NULL; static Widget savetextdialog=NULL; extern Widget GetTopShell(Widget w); void set_textareatext(char *bufr); void text_ok(Widget w, XtPointer client_data, XtPointer call_data); void text_cancel(Widget w, XtPointer client_data, XtPointer call_data); void text_reset(Widget w, XtPointer client_data, XtPointer call_data); void text_apply(Widget w, XtPointer client_data, XtPointer call_data); void text_save(Widget w, XtPointer client_data, XtPointer call_data); void text_toggled(Widget w, XtPointer client_data, XtPointer call_data); void text_print(Widget w, XtPointer client_data, XtPointer call_data); void get_textfile(Widget w, XtPointer client_data, XtPointer call_data); void showtextwin(Widget parent); void errordialog(Widget parent, char *msg); /************************************************************* * * * text window routines for Nsharp/Nflow * * * * * * Mike Kay * * Storm Prediction Center * * mkay@spc.noaa.gov * * 10/21/99 * *************************************************************/ void showtextwin(Widget parent) { Widget pane, text_w, form, button, toggle; Arg args[10]; int n=0; char *textptr=NULL; if (!textdialog) { /* Create dialog */ textdialog = XtVaCreatePopupShell("text_win", topLevelShellWidgetClass, parent, NULL); /* Create a pane to hold things (dialogs can only have 1 manager) */ pane = XtVaCreateWidget("text_pane", xmPanedWindowWidgetClass, textdialog, XmNsashWidth, 1, XmNsashHeight, 1, NULL); /* Create a form to hold the text area */ form = XtVaCreateWidget("text_form1", xmFormWidgetClass, pane, NULL); /* Create text area */ XtSetArg(args[n], XmNrows, 20); n++; XtSetArg(args[n], XmNcolumns, 70); n++; XtSetArg(args[n], XmNeditable, False); n++; XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++; text_w = XmCreateScrolledText(form, "text_w", args, n); /* Attach text area Note the parent here */ XtVaSetValues(XtParent(text_w), XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); XtManageChild(text_w); XtManageChild(form); /* A form to hold our toggle button */ form = XtVaCreateWidget("text_form2", xmFormWidgetClass, pane, NULL); /* make a radio button for editing */ toggle = XtVaCreateManagedWidget("Editable", xmToggleButtonWidgetClass, form, NULL); /* Store the text area */ XtVaSetValues(toggle, XmNuserData, text_w, NULL); XtVaSetValues(toggle, XmNleftAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); /* * We'll add the callback below since we need the Apply button * to be passed to the callback */ XtManageChild(form); /* Create a form to hold the buttons */ form = XtVaCreateWidget("text_form3", xmFormWidgetClass, pane, XmNfractionBase, 9, NULL); /* Create Buttons at the bottom */ /* OK, Apply, Cancel, Reset, Save */ button = XtVaCreateManagedWidget("OK", xmPushButtonWidgetClass, form, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 1, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 2, NULL); XtAddCallback(button, XmNactivateCallback, text_ok, NULL); button = XtVaCreateManagedWidget("Apply", xmPushButtonWidgetClass, form, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 2, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 3, NULL); XtAddCallback(button, XmNactivateCallback, text_apply, NULL); XtSetSensitive(button, False); XtAddCallback(toggle, XmNvalueChangedCallback, text_toggled, button); button = XtVaCreateManagedWidget("Cancel", xmPushButtonWidgetClass, form, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 3, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 4, NULL); XtAddCallback(button, XmNactivateCallback, text_cancel, NULL); button = XtVaCreateManagedWidget("Reset", xmPushButtonWidgetClass, form, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 4, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 5, NULL); XtAddCallback(button, XmNactivateCallback, text_reset, NULL); button = XtVaCreateManagedWidget("Save", xmPushButtonWidgetClass, form, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 5, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 6, NULL); XtAddCallback(button, XmNactivateCallback, text_save, NULL); button = XtVaCreateManagedWidget("Print", xmPushButtonWidgetClass, form, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 6, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 7, NULL); XtAddCallback(button, XmNactivateCallback, text_print, NULL); XtManageChild(form); /* Manage the pane or else nothing will show up */ XtManageChild(pane); } /* Populate the text window in case it is visible */ textptr = createtextsounding(); set_textareatext(textptr); free(textptr); /* Make it visible */ XtPopup(textdialog, XtGrabNone); } void text_ok(Widget w, XtPointer client_data, XtPointer call_data) { XtPopdown(GetTopShell(w)); } void text_cancel(Widget w, XtPointer client_data, XtPointer call_data) { text_ok(w, client_data, call_data); } void text_reset(Widget w, XtPointer client_data, XtPointer call_data) { } void text_apply(Widget w, XtPointer client_data, XtPointer call_data) { } void text_toggled(Widget w, XtPointer client_data, XtPointer call_data) { XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)call_data; Widget applybutton = (Widget)client_data; Widget text_area; /* Get text area which is stored as user data in the widget */ XtVaGetValues(w, XmNuserData, &text_area, NULL); if (state->set) { /* Turn on apply button */ XtSetSensitive(applybutton, True); /* Text area needs to be set editable as well */ XtVaSetValues(text_area, XmNeditable, True); } else { /* Turn off apply button */ XtSetSensitive(applybutton, False); XtVaSetValues(text_area, XmNeditable, False); } } void set_textareatext(char *bufr) { Widget text_w; /* This routine might get called before the window is created */ if (!textdialog) return; /* Get the text area */ text_w = XtNameToWidget(textdialog, "*text_w"); if (text_w) XmTextSetString(text_w, bufr); } void text_print(Widget w, XtPointer client_data, XtPointer call_data) { Widget text_w; char *text=NULL; FILE *mypipe; /* Get the text area */ text_w = XtNameToWidget(textdialog, "*text_w"); if (text_w) { text = XmTextGetString(text_w); if (text && *text) { /* Send to printer Check ENV for a printer variable */ if ((mypipe = popen(PRINTCOMMAND, "w"))) { fprintf(mypipe, "%s", text); pclose(mypipe); } XtFree(text); } } } void text_save(Widget w, XtPointer client_data, XtPointer call_data) { Widget child; char *ptr, bufr[256]; if (!savetextdialog) { savetextdialog = XmCreateFileSelectionDialog(GetTopShell(w), "textfile", NULL, 0); /* Get rid of Help button */ XtUnmanageChild(XmSelectionBoxGetChild(savetextdialog, XmDIALOG_HELP_BUTTON)); XtAddCallback(savetextdialog, XmNokCallback, get_textfile, NULL); XtAddCallback(savetextdialog, XmNcancelCallback, (XtCallbackProc)XtUnmanageChild, NULL); child = XmFileSelectionBoxGetChild(savetextdialog, XmDIALOG_TEXT); XtVaGetValues(child, XmNvalue, &ptr, NULL); /* bufr[0] = '\0'; if (ptr && *ptr) { strcpy(bufr, ptr); XtFree(ptr); } strcat(bufr,"Nsharp.txt"); */ } XtManageChild(savetextdialog); XtPopup(XtParent(savetextdialog), XtGrabNone); } void get_textfile(Widget w, XtPointer client_data, XtPointer call_data) { int i; char *file=NULL; XmFileSelectionBoxCallbackStruct *cbs = (XmFileSelectionBoxCallbackStruct *)call_data; /* Retrieve the string */ if (!XmStringGetLtoR(cbs->value, XmFONTLIST_DEFAULT_TAG, &file)) { errordialog(w, "No file specified!"); return; } /* Pop down the dialog box */ XtPopdown(XtParent(w)); /* * Make sure we have a sane filename and not just a directory path */ if (file[strlen(file)-1] == '/') { errordialog(w, "No file specified!"); } else { i = save_text(file); if (i == 1) { errordialog(w, "Unable to properly write text file."); } } /* Need to free file */ XtFree(file); }