awips2/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/textwin.c
root 9f19e3f712 Initial revision of AWIPS2 11.9.0-7p5
Former-commit-id: 64fa9254b946eae7e61bbc3f513b7c3696c4f54f
2012-01-06 08:55:05 -06:00

459 lines
15 KiB
C

#include <stdio.h>
#include <stdlib.h>
#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 text_cvf(Widget w, XtPointer client_data, XtPointer call_data);
void get_textfile(Widget w, XtPointer client_data, XtPointer call_data);
void set_textfile(Widget w, XtPointer client_data, XtPointer call_data);
void write_file2( char *filename );
int SimpleMsgBox(Widget w, char *text);
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);
button = XtVaCreateManagedWidget("CSV", xmPushButtonWidgetClass,
form, XmNtopAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_POSITION,
XmNleftPosition, 7,
XmNrightAttachment, XmATTACH_POSITION,
XmNrightPosition, 8, NULL);
XtAddCallback(button, XmNactivateCallback, text_cvf, 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], nam1[256];
XmString namx;
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);
}
namx = XmStringCreateLocalized(raobsavefilename);
printf( "Setting Default Output File Name = %s\n", raobsavefilename);
XtVaSetValues( savetextdialog, XmNdirSpec, namx);
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));
XtUnmanageChild(savetextdialog);
savetextdialog = NULL;
XtFree(savetextdialog);
/*
* 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); */
write_file2(file);
if (i == 1) { errordialog(w, "Unable to properly write text file."); }
}
/* Need to free file */
XtFree(file);
}
void set_textfile(Widget w, XtPointer client_data, XtPointer call_data)
{
printf( "Popup set_textfile!!!!\n");
}
void text_cvf(Widget w, XtPointer client_data, XtPointer call_data)
{
char st[80], st2[80];
strcpy(st, "NSHARP text output file was written to /tmp/NSHARP.TXT");
strcpy(st2, "/tmp/NSHARP.TXT");
write_file2(st2);
SimpleMsgBox(w, st);
}
/*NP*/
void write_file2( char *filename )
/*************************************************************/
/* WRITE_FILE */
/* John Hart NSSFC KCMO */
/* */
/* Writes contents of sndg array into SHARP95 file. */
/*************************************************************/
{
short i, j;
short idx[7];
float sfctemp, sfcdwpt, sfcpres, j1, j2, ix1;
struct _parcel pcl;
char st[80];
FILE *fout;
idx[1] = getParmIndex("PRES");
idx[2] = getParmIndex("HGHT");
idx[3] = getParmIndex("TEMP");
idx[4] = getParmIndex("DWPT");
idx[5] = getParmIndex("DRCT");
idx[6] = getParmIndex("SPED");
fout = fopen( filename, "wt" );
if (fout==NULL)
{
printf("Unable to write output file!\n" );
return;
}
fputs( "%TITLE%\n", fout );
fputs( raobtitle, fout );
fputs( "\n\n", fout );
fprintf( fout, " LEVEL HGHT TEMP DWPT WDIR WSPD\n");
fprintf( fout, "-------------------------------------------------------------------\n");
fputs( "%RAW%\n", fout );
for(i=0; i<numlvl; i++)
{
for(j=1; j<=5; j++) fprintf( fout, "%8.2f, ", sndg[i][idx[j]]);
fprintf( fout, "%8.2f\n", sndg[i][idx[6]]);
}
fputs( "%END%\n\n", fout );
if ((numlvl<4) || (!qc(i_dwpt(700, I_PRES)))) return;
fprintf( fout, "----- Parcel Information-----\n");
/* ----- Calculate Parcel Data ----- */
sfctemp = lplvals.temp;
sfcdwpt = lplvals.dwpt;
sfcpres = lplvals.pres;
strcpy( st, "*** " );
strcat( st, lplvals.desc );
strcat( st, " ***" );
fprintf( fout, "%s\n", st);
ix1 = parcel( -1, -1, sfcpres, sfctemp, sfcdwpt, &pcl);
fprintf( fout, "LPL: P=%.0f T=%.0fF Td=%.0fF\n", sfcpres, ctof(sfctemp), ctof(sfcdwpt));
fprintf( fout, "CAPE: %6.0f J/kg\n", pcl.bplus);
fprintf( fout, "CINH: %6.0f J/kg\n", pcl.bminus);
fprintf( fout, "LI: %6.0f C\n", pcl.li5);
fprintf( fout, "LI(300mb): %6.0f C\n", pcl.li3);
fprintf( fout, "3km Cape: %6.0f J/kg\n", pcl.cape3km);
j1 = pcl.bplus;
j2 = i_hght(pcl.elpres, I_PRES) - i_hght(pcl.lfcpres, I_PRES);
fprintf( fout, "NCAPE: %6.2f m/s2\n\n", j1/j2);
fprintf( fout, "LCL: %6.0fmb %6.0fm\n", pcl.lclpres, agl(i_hght(pcl.lclpres, I_PRES)));
fprintf( fout, "LFC: %6.0fmb %6.0fm\n", pcl.lfcpres, agl(i_hght(pcl.lfcpres, I_PRES)));
fprintf( fout, "EL: %6.0fmb %6.0fm\n", pcl.elpres, agl(i_hght(pcl.elpres, I_PRES)));
fprintf( fout, "MPL: %6.0fmb %6.0fm\n", pcl.mplpres, agl(i_hght(pcl.mplpres, I_PRES)));
fprintf( fout, "All heights AGL\n\n" );
fprintf( fout, "----- Moisture -----\n" );
strcpy( st, qc2( precip_water( &ix1, -1, -1), " in", 2 ));
fprintf( fout, "Precip Water: %s\n", st);
strcpy( st, qc2( mean_mixratio( &ix1, -1, -1 ), " g/Kg", 1 ));
fprintf( fout, "Mean W: %s\n\n", st);
fprintf( fout, "----- Lapse Rates -----\n" );
j1 = delta_t(&ix1);
j2 = lapse_rate( &ix1, 700, 500);
fprintf( fout, "700-500mb %.0f C %.1f C/km\n", j1, j2);
j1 = vert_tot(&ix1);
j2 = lapse_rate( &ix1, 850, 500);
fprintf( fout, "850-500mb %.0f C %.1f C/km\n", j1, j2);
fclose( fout );
}
int SimpleMsgBox(Widget w, char *texta)
{
XmString xtext;
Arg args[10];
Widget dialog;
if (!w) { w = toplevel; }
xtext = XmStringCreateLocalized(texta);
XtSetArg (args[0], XmNmessageString, xtext);
dialog = XmCreateInformationDialog(w, "message", args, 1);
XtFree(xtext);
XtUnmanageChild( XmMessageBoxGetChild(dialog, XmDIALOG_CANCEL_BUTTON));
XtUnmanageChild( XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
XtVaSetValues(XtParent(dialog),
XmNtitle, "NSHARP",
XmNwidth, 1600,
NULL);
XtManageChild(dialog);
XtPopup(XtParent(dialog), XtGrabNone);
}