#include "gui.h" #include "sharp95.h" extern char sta_id[5]; /* private functions */ void pfc_select_cb (Widget wdgt, XtPointer clnt, XtPointer call); void pfc_snd_load_gemfile(Widget wdgt, XtPointer clnt, XtPointer call); void pfc_time_select_cb (Widget wdgt, XtPointer clnt, XtPointer call); void mapprojpfc_cb (Widget wdgt, XtPointer clnt, XtPointer call); void mapunzoompfc_cb (Widget wdgt, XtPointer clnt, XtPointer call); void mapzoompfc_cb (Widget wdgt, XtPointer clnt, XtPointer call); Widget pfc_snd_dialog = NULL; Widget pfc_snd_timelist, pfc_snd_text, pfc_list; char pfcsoundfile[200], pfcsoundtime[20]; extern mapstruct pfc_map; extern Widget toplevel; extern char time_list[500][20]; void pfc_sounding_cb (Widget wdgt) /************************************************************************ * PFC_SOUNDING_CB * * * * Display Observed Sounding Map and get user selection. * ** * * Log: * * T. Piper/SAIC 2/02 freed mapmenu.label * * T. Piper/SAIC 01/04 removed NAWIPS_TABLES * * T. Piper/SAIC 01/04 added NxmWarn_show * ***********************************************************************/ { static Widget pfc_form, pfc_form2, pfc_form3, pfc_pane, pfc_snd_cancel, pfc_snd_help, pfc_lbl_time, pfc_lbl_station; static Widget menubar, maparea_zoom, maparea_unzoom, button, obssel_opt, obs_00_12, pfc_selW; XmString str, title_str; char gemdevice[72]; int ii, iret = 0, ier, nmap; Arg args[10]; Cardinal argcnt; static _NXMmenuItem mapmenu[30], *pfcmenu; static char map_winname[] = "mappfc"; if (!pfc_snd_dialog) { title_str = XmStringCreateLocalized ("Point Forecast Sounding Selection"); pfc_snd_dialog = XmCreateBulletinBoardDialog (toplevel, "pfc_panel", NULL, 0); XtVaSetValues (pfc_snd_dialog, XmNdialogTitle, title_str, NULL); XmStringFree (title_str); pfc_pane = XtVaCreateManagedWidget ("pfc_snd_pane", xmPanedWindowWidgetClass, pfc_snd_dialog, XmNsashWidth, 1, XmNsashHeight, 1, NULL); pfc_form2 = XtVaCreateWidget ("form", xmFormWidgetClass, pfc_pane, NULL); pfc_form3 = XtVaCreateWidget ("form", xmFormWidgetClass, pfc_pane, NULL); pfc_form = XtVaCreateWidget ("form", xmFormWidgetClass, pfc_pane, XmNfractionBase, 7, NULL); str = XmStringCreateLocalized ("Available PFC files:"); pfc_selW = XtVaCreateManagedWidget ("pfcfile_label", xmLabelWidgetClass, pfc_form3, XmNlabelString, str, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_FORM, NULL); XmStringFree (str); pfc_list = XmCreateScrolledList (pfc_form3, "pfc_files", NULL, 0); XtVaSetValues (pfc_list, XmNvisibleItemCount, 3, XmNselectionPolicy, XmEXTENDED_SELECT, NULL); XtVaSetValues (XtParent (pfc_list), XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, pfc_selW, /*XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 3, */ XmNwidth, 300, XmNbottomAttachment, XmATTACH_FORM, NULL); XtAddCallback (pfc_list, XmNextendedSelectionCallback, pfc_snd_load_gemfile, NULL); XtManageChild (pfc_list); XtManageChild (pfc_form3); title_str = XmStringCreateLocalized ("00Z and 12Z only:"); obs_00_12 = XtVaCreateManagedWidget ("obs_00_12", xmToggleButtonWidgetClass, pfc_form, XmNindicatorType, XmONE_OF_MANY, XmNlabelString, title_str, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_FORM, NULL); XmStringFree (title_str); XtAddCallback (obs_00_12, XmNvalueChangedCallback, pfc_snd_load_gemfile, NULL); title_str = XmStringCreateLocalized ("Sounding times:"); pfc_lbl_time = XtVaCreateManagedWidget ("obsfile_time", xmLabelWidgetClass, pfc_form, XmNlabelString, title_str, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, obs_00_12, XmNalignment, XmALIGNMENT_BEGINNING, NULL); XmStringFree (title_str); pfc_snd_timelist = XmCreateScrolledList (pfc_form, "times", NULL, 0); XtVaSetValues (pfc_snd_timelist, XmNvisibleItemCount, 20, XmNselectionPolicy, XmEXTENDED_SELECT, NULL); XtVaSetValues (XtParent (pfc_snd_timelist), XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, pfc_lbl_time, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 2, NULL); XtAddCallback (pfc_snd_timelist, XmNextendedSelectionCallback, pfc_time_select_cb, NULL); XtManageChild (pfc_snd_timelist); pfc_lbl_station = XtVaCreateManagedWidget ("obsmap", xmDrawingAreaWidgetClass, pfc_form, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 1, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 2, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNwidth, 560, XmNheight, 560, XmNbackground, pixels[0], NULL); XtAddCallback (pfc_lbl_station, XmNexposeCallback, (XtCallbackProc) mapw_exposeCb, NULL); plotData.mode = STNSELECT; XtAddEventHandler (pfc_lbl_station, ButtonPressMask, FALSE, (XtEventHandler) mapw_pickstnCb_pfc, NULL); XtManageChild (pfc_form); /* * create the menubar */ argcnt = 0; XtSetArg (args[argcnt], XmNtopAttachment, XmATTACH_FORM); argcnt++; XtSetArg (args[argcnt], XmNleftAttachment, XmATTACH_FORM); argcnt++; XtSetArg (args[argcnt], XmNrightAttachment, XmATTACH_FORM); argcnt++; menubar = XmCreateMenuBar (pfc_form2, "menubar", args, argcnt); argcnt = 0; XtSetArg (args[argcnt], XmNborderWidth, 1); argcnt++; pfcmenu = NULL; file_selection_menu (PFC_SND_TABLE, "nsharp", &pfcmenu, (XtCallbackProc)pfc_select_cb, &ier); if (ier != 0) { NxmWarn_show (pfc_form, "NSHARP: ERROR opening $GEMTBL/nsharp/nsharp_observed.tbl\nSee system administrator."); pfc_snd_dialog = NULL; return; } obssel_opt = NxmMenuPulldownBuild (menubar, NULL, "File", 0, pfcmenu); XtSetValues (obssel_opt, args, argcnt); free (pfcmenu); /* * Create Map pulldown menu * * Set the items for the menu bar for the map areas. */ nmap = nwxTable->nmap; for (ii = 0; ii < nmap; ii++) { mapmenu[ii].label = (char *) malloc (strlen (nwxTable->map_info[ii].name) + 1); strcpy (mapmenu[ii].label, nwxTable->map_info[ii].name); mapmenu[ii].class = &xmCascadeButtonGadgetClass; mapmenu[ii].mnemonic = 0; mapmenu[ii].accelerator = NULL; mapmenu[ii].accel_text = NULL; mapmenu[ii].callback = mapprojpfc_cb; mapmenu[ii].which_widget = (long)ii; mapmenu[ii].subitems = NULL; mapmenu[ii].sub_buttons = NULL; } mapmenu[nmap].label = NULL; mapmenu[nmap].class = &xmCascadeButtonGadgetClass; mapmenu[nmap].mnemonic = 0; mapmenu[nmap].accelerator = NULL; mapmenu[nmap].accel_text = NULL; mapmenu[nmap].callback = NULL; mapmenu[nmap].which_widget = (long)nmap; mapmenu[nmap].subitems = NULL; mapmenu[nmap].sub_buttons = NULL; NxmMenuPulldownBuild (menubar, NULL, "Area", 0, mapmenu); for (ii = 0; ii < nmap; ii++) free (mapmenu[ii].label); if ((button = XtNameToWidget (menubar, "Area"))) XtSetValues (button, args, argcnt); maparea_zoom = XmCreateCascadeButton (menubar, "Zoom", NULL, 0); XtAddCallback (maparea_zoom, XmNactivateCallback, (XtCallbackProc) mapzoompfc_cb, pfc_lbl_station); XtSetValues (maparea_zoom, args, argcnt); XtManageChild (maparea_zoom); maparea_unzoom = XmCreateCascadeButton (menubar, "UnZoom", NULL, 0); XtAddCallback (maparea_unzoom, XmNactivateCallback, (XtCallbackProc) mapunzoompfc_cb, NULL); XtSetValues (maparea_unzoom, args, argcnt); XtManageChild (maparea_unzoom); pfc_snd_cancel = XmCreateCascadeButton (menubar, "Cancel", NULL, 0); XtAddCallback (pfc_snd_cancel, XmNactivateCallback, (XtCallbackProc) popdown_cb, pfc_snd_dialog); XtSetValues (pfc_snd_cancel, args, argcnt); XtManageChild (pfc_snd_cancel); pfc_snd_help = XmCreateCascadeButton (menubar, "Help", NULL, 0); XtSetValues (pfc_snd_help, args, argcnt); XtAddCallback (pfc_snd_help, XmNactivateCallback, (XtCallbackProc) NxmHelp_helpBtnCb, (XtPointer) 3); XtManageChild (pfc_snd_help); XtVaSetValues (menubar, XmNmenuHelpWidget, pfc_snd_help, NULL); XtManageChild (menubar); XtManageChild (pfc_form2); XtManageChild (pfc_pane); XtManageChild (pfc_snd_dialog); pfc_map.mapindx = 0; pfc_map.zoomflg = 0; ii = nsharp_mapw_rgstr (pfc_lbl_station, map_winname); XtAddCallback (pfc_lbl_station, XmNresizeCallback, (XtCallbackProc) mapw_resizeCb, NULL); } /* draw the map accoring to mapw call back */ XtManageChild (pfc_snd_dialog); strcpy (gemdevice, map_winname); gslwin (gemdevice, &iret, strlen (gemdevice)); Load_stationlist_pfc (); } /*========================================================================*/ /* ARGSUSED */ void pfc_snd_load_gemfile (Widget wdgt, XtPointer clnt, XtPointer call) /*************************************************************/ /* pfc_snd_load_gemfile */ /*************************************************************/ { static int only_00_12 = 0; char *choice; int ii, sumtim, nlist; struct obs_file_times *olist; XmStringTable item_list; XmStringTable str_list; XtPointer userdata; if (XtIsSubclass (wdgt, xmToggleButtonWidgetClass)) { /* toggling 0Z and 12Z on/off */ Boolean is_set; XtVaGetValues (wdgt, XmNset, &is_set, NULL); if (is_set) only_00_12 = 1; else only_00_12 = 0; } /* selected files in pfc_list */ XtVaGetValues (pfc_list, XmNselectedItemCount, &nlist, XmNselectedItems, &item_list, NULL); if (nlist == 0) return; XtVaGetValues (pfc_snd_timelist, XmNuserData, &userdata, NULL); if (userdata == NULL) { printf ("error getting user data\n"); return; } olist = (struct obs_file_times *) userdata; sumtim = 0; for (ii = 0; ii < nlist; ii++) { int jj, ntimes, ier; choice = XmStringUnparse (item_list[ii], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_ALL); sprintf (pfcsoundfile, "%s/%s", olist->path, choice); XtFree (choice); get_gem_times (pfcsoundfile, &only_00_12, &time_list[sumtim], &ntimes, &ier, strlen (pfcsoundfile), 20 /*sizeof(time_list) */ ); if (ier == 0) { for (jj = 0; jj < ntimes; jj++) olist->posindex[sumtim + jj] = ii; sumtim += ntimes; } } str_list = (XmStringTable) XtMalloc ((size_t) sumtim * sizeof (XmString *)); for (ii = 0; ii < sumtim; ii++) { time_list[ii][11] = '\0'; str_list[ii] = XmStringCreateLocalized (time_list[ii]); } XtVaSetValues (pfc_snd_timelist, XmNitemCount, sumtim, XmNitems, str_list, NULL); XmListDeselectAllItems (pfc_snd_timelist); if (olist->selected_items != NULL) { free (olist->selected_items); olist->nitems = 0; olist->selected_items = NULL; } for (ii = 0; ii < sumtim; ii++) XmStringFree ((XmString) str_list[ii]); XtFree ((XtPointer) str_list); } /*========================================================================*/ /* ARGSUSED */ void pfc_select_cb (Widget wdgt, XtPointer clnt, XtPointer call) /*************************************************************/ /* pfc_snd_LOAD_GEMFILE */ /*************************************************************/ { int ier; char path[256], tmpl[256]; if (!XtIsSubclass (wdgt, xmFileSelectionBoxWidgetClass)) { /* Cascade menu entry */ char *choice; XmString label_str; XtVaGetValues (wdgt, XmNlabelString, &label_str, NULL); choice = XmStringUnparse (label_str, NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_ALL); XmStringFree (label_str); if ((choice[0] == '\0') || (strcmp (choice, "BROWSE") == 0)) { sprintf (tmpl, "*"); sprintf (path, "."); } else { get_file_alias (choice, path, tmpl, &ier, strlen (choice), sizeof (path), sizeof (tmpl)); if (ier != 0) { sprintf (tmpl, "*"); sprintf (path, "."); } } XtFree (choice); if (strcmp (tmpl, "*") == 0) { file_browse_popup (path, tmpl, toplevel, pfc_select_cb); return; } } else { /* file selection dialog entry of a single file */ char *choice; XmFileSelectionBoxCallbackStruct *cbs = (XmFileSelectionBoxCallbackStruct *)call; if (cbs) { char *cpos; choice = XmStringUnparse (cbs->value, NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_ALL); cpos = strrchr (choice, '/'); path[0] = '\0'; if (cpos != NULL) { strcpy (tmpl, cpos + 1); strncat (path, choice, cpos - choice); } else { strncat (path, ".", 1); strcpy (tmpl, choice); } XtFree (choice); } } { char sep = ';'; int plen, tlen, rorder = (-1), flen, nfil; int maxlen = MAX_LIST_LEN; XtPointer userdata; struct obs_file_times *olist; char *filstr; XtVaGetValues (pfc_snd_timelist, XmNuserData, &userdata, NULL); if (userdata == NULL) { olist = (struct obs_file_times *) malloc (sizeof (struct obs_file_times)); olist->filstr = (char *) malloc (maxlen); olist->filstr[0] = '\0'; olist->posindex = (int *) malloc (MAX_TIME_LIST * sizeof (int)); olist->selected_items = NULL; olist->nitems = 0; olist->path[0] = '\0'; XtVaSetValues (pfc_snd_timelist, XmNuserData, (XtPointer) olist, NULL); } else { olist = (struct obs_file_times *) userdata; } filstr = olist->filstr; if (!XtIsSubclass (wdgt, xmFileSelectionBoxWidgetClass)) { plen = strlen (path); tlen = strlen (tmpl); strcpy (olist->path, path); cfl_scnd (path, &plen, tmpl, &tlen, &sep, &maxlen, &rorder, filstr, &flen, &nfil, &ier); } else { ier = 0; strcpy (filstr, tmpl); strcpy (olist->path, path); } if (ier == -1) { printf ("too many files in directory\n"); } else { char *spos, *epos, tstr[256]; int posnum = 0; XmStringTable str_list; int nlist = 0; spos = filstr; while (spos != NULL) { str_list = (XmStringTable) XtMalloc ((size_t) 1 * sizeof (XmString *)); tstr[0] = '\0'; epos = strchr (spos, sep); if (epos != NULL) strncat (tstr, spos, epos - spos); else strcat (tstr, spos); str_list[0] = XmStringCreateLocalized (tstr); if (nlist == 0) XtVaSetValues (pfc_list, XmNitemCount, 1, XmNitems, str_list, NULL); else XmListAddItems (pfc_list, str_list, 1, nlist + 1); XmStringFree (str_list[0]); XtFree ((XtPointer) str_list); nlist++; spos = epos; if (spos != NULL) spos++; posnum++; } XmListDeselectAllItems (pfc_list); XmListDeleteAllItems (pfc_snd_timelist); if (XtIsSubclass (wdgt, xmFileSelectionBoxWidgetClass)) XmListSelectPos (pfc_list, 1, True); } } } /*========================================================================*/ /* ARGSUSED */ void pfc_time_select_cb (Widget wdgt, XtPointer clnt, XtPointer call) /*************************************************************/ /* PFC_TIME_SELECT_CB */ /*************************************************************/ { XmListCallbackStruct *cbs = (XmListCallbackStruct *) call; struct obs_file_times *olist; XtPointer userdata; char *choice; int top_item, fileindex; if (cbs->reason == XmCR_EXTENDED_SELECT) { if (cbs->selected_item_count == 0) return; top_item = cbs->selected_item_positions[0]; XtVaGetValues (pfc_snd_timelist, XmNuserData, &userdata, NULL); if (userdata != NULL) { int ier; char sep = ';'; olist = (struct obs_file_times *) userdata; fileindex = olist->posindex[top_item - 1]; sprintf (pfcsoundfile, "%s/", olist->path); get_listitem (olist->filstr, fileindex, sep, pfcsoundfile + strlen (pfcsoundfile), &ier); olist->nitems = cbs->selected_item_count; if (olist->selected_items != NULL) free (olist->selected_items); olist->selected_items = (int *) malloc (olist->nitems * sizeof (int)); memcpy (olist->selected_items, cbs->selected_item_positions, olist->nitems * sizeof (int)); } choice = XmStringUnparse (cbs->selected_items[0], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_ALL); } else { choice = XmStringUnparse (cbs->item, NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_ALL); } sprintf (pfcsoundtime, "%s", choice); XtFree (choice); Load_stationlist_pfc (); } void sta_select_cb_pfc (int which_sta) /*************************************************************/ /* STA_SELECT_CB */ /*************************************************************/ { char stanum[8], sta_tmp[12], snd_station[9] = ""; int ival; ival = sscanf (stnList.stnName[which_sta], "%s %s %s", sta_id, stanum, sta_tmp); if (ival == 2) sprintf (snd_station, "@%s", stanum); else if (ival == 1) sprintf (snd_station, "@%s", sta_id); Load_gem_sounding (pfc_snd_dialog, pfc_snd_timelist, snd_station, sta_id); } /*========================================================================*/ /* ARGSUSED */ void mapprojpfc_cb (Widget wdgt, XtPointer clnt, XtPointer call) { int item_no = (long)clnt; pfc_map.mapindx = item_no; pfc_map.zoomflg = 0; Load_stationlist_pfc (); } /*========================================================================*/ /* ARGSUSED */ void mapunzoompfc_cb (Widget wdgt, XtPointer clnt, XtPointer call) { pfc_map.zoomflg = 0; Load_stationlist_pfc (); } /*========================================================================*/ /* ARGSUSED */ void mapzoompfc_cb (Widget wdgt, XtPointer clnt, XtPointer call) { Widget mapCanvW = (Widget) clnt; _mapzoom_cb (mapCanvW, mapw_pickstnCb_pfc, &pfc_map, Load_stationlist_pfc); }