/* uvwwidget.c */ /* * Vis5D system for visualizing five dimensional gridded data sets. * Copyright (C) 1990 - 2000 Bill Hibbard, Johan Kellum, Brian Paul, * Dave Santek, and Andre Battaiola. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception to the terms of the GNU General Public * License, you are permitted to link Vis5D with (and distribute the * resulting source and executables) the LUI library (copyright by * Stellar Computer Inc. and licensed for distribution with Vis5D), * the McIDAS library, and/or the NetCDF library, where those * libraries are governed by the terms of their own licenses. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "../config.h" /* * U, V, W variable widget window. * * This widget is used to specify which variables to use for the trajectory, * and wind slices' U, V, and W components. */ #include #include #include #include #include "../lui5/lui.h" #include "api.h" #include "gui.h" static int current_ctx; int return_ctxindex( int gindex, char *varname ) { int yo; char thenumber[10]; GuiContext gtx = get_gui_gtx( gindex ); if (gtx->how_many_regular_contexts == 1){ return gtx->array_of_ctxs[0]; } thenumber[0] = '\0'; for (yo = 0; yo < 18; yo ++){ /* WLH 20 Oct 98 */ if (varname[yo] == '\0') break; if (varname[yo] == '.'){ /* WLH 20 Oct 98 if (varname[yo+1] >= '0' || varname[yo+1] <= '9'){ */ /* WLH 20 Oct 98 */ if (varname[yo+1] >= '0' && varname[yo+1] <= '9'){ thenumber[0] = varname[yo+1]; thenumber[1] = '\0'; if (yo < 17 && varname[yo+2] >= '0' && varname[yo+2] <= '9' ){ thenumber[1] = varname[yo+2]; thenumber[2] = '\0'; if (yo < 16 && varname[yo+3] >= '0' && varname[yo+3] <= '9'){ thenumber[2] = varname[yo+3]; thenumber[3] = '\0'; } } } yo = 69; } } if (thenumber[0] == '\0'){ return -1; } else{ return atoi(thenumber); } } char *return_ctx_var( char *name) { int yo; static char thevar[20]; for (yo = 0; yo < 18; yo ++){ /* WLH 16 Oct 98 if (name[yo] == '.'){ */ /* WLH 16 Oct 98 */ if (name[yo] == '.' || name[yo] == '\0'){ thevar[yo] = '\0'; return thevar; } thevar[yo] = name[yo]; } return thevar; } char *return_var_and_index( char *vname, int index ) { int yo; /* WLH 14 Oct 98 - function cannot return a string from the stack char whole[20]; */ /* WLH 14 Oct 98 */ char *whole; char num[20]; /* WLH 14 Oct 98 */ whole = malloc(20); if (index <0 || vname[0] == 0){ whole[0] = 0; return whole; } for (yo = 0; yo < 17; yo++){ if (vname[yo] == '\0' || vname[yo] == ' '){ yo -=1; whole[yo+1] = '.'; sprintf(num, "%d\n", index ); if (index > 99 && yo < 15){ whole[yo+2] = num[0]; whole[yo+3] = num[1]; whole[yo+4] = num[2]; whole[yo+5] = '\0'; return whole; } else if ( index > 9 && yo < 16){ whole[yo+2] = num[0]; whole[yo+3] = num[1]; whole[yo+4] = '\0'; return whole; } else{ whole[yo+2] = num[0]; whole[yo+3] = '\0'; return whole; } } whole[yo] = vname[yo]; } whole[yo] = '\0'; return whole; } static void read_uvw_widgets( GuiContext gtx ) { int index = gtx->context_index; char varname[30]; int u1, v1, w1, u2, v2, w2, traju, trajv, trajw; int lp; char rap[30]; LUI_FieldGetText( gtx->u1_field, varname ); if (varname[0] != 0){ gtx->u1owner = return_ctxindex(index, varname); lp = return_ctxindex(index, varname); strcpy(rap, return_ctx_var(varname)); u1 = vis5d_find_var( lp, rap ); } else{ gtx->u1owner = -1; } LUI_FieldGetText( gtx->v1_field, varname ); if (varname[0] != 0){ gtx->v1owner = return_ctxindex(index, varname); lp = return_ctxindex(index, varname); strcpy(rap, return_ctx_var(varname)); v1 = vis5d_find_var( lp, rap ); } else { gtx->v1owner = -1; } LUI_FieldGetText( gtx->w1_field, varname ); if (varname[0] != 0){ gtx->w1owner = return_ctxindex(index,varname); lp = return_ctxindex(index, varname); strcpy(rap, return_ctx_var(varname)); w1 = vis5d_find_var( lp, rap ); } else { gtx->w1owner= -1; } LUI_FieldGetText( gtx->u2_field, varname ); if (varname[0] != 0){ gtx->u2owner = return_ctxindex(index,varname); lp = return_ctxindex(index, varname); strcpy(rap, return_ctx_var(varname)); u2 = vis5d_find_var( lp, rap ); } else { gtx->u2owner= -1; } LUI_FieldGetText( gtx->v2_field, varname ); if (varname[0] != 0){ gtx->v2owner = return_ctxindex(index,varname); lp = return_ctxindex(index, varname); strcpy(rap, return_ctx_var(varname)); v2 = vis5d_find_var( lp, rap ); } else { gtx->v2owner= -1; } LUI_FieldGetText( gtx->w2_field, varname ); if (varname[0] != 0){ gtx->w2owner = return_ctxindex(index,varname); lp = return_ctxindex(index, varname); strcpy(rap, return_ctx_var(varname)); w2 = vis5d_find_var( lp, rap ); } else { gtx->w2owner= -1; } LUI_FieldGetText( gtx->traju_field, varname ); if (varname[0] != 0){ gtx->tuowner = return_ctxindex(index,varname); lp = return_ctxindex(index, varname); strcpy(rap, return_ctx_var(varname)); traju = vis5d_find_var( lp, rap ); } else { gtx->tuowner= -1; } LUI_FieldGetText( gtx->trajv_field, varname ); if (varname[0] != 0){ gtx->tvowner = return_ctxindex(index,varname); lp = return_ctxindex(index, varname); strcpy(rap, return_ctx_var(varname)); trajv = vis5d_find_var( lp, rap ); } else { gtx->tvowner= -1; } LUI_FieldGetText( gtx->trajw_field, varname ); if (varname[0] != 0){ gtx->twowner = return_ctxindex(index,varname); lp = return_ctxindex(index, varname); strcpy(rap, return_ctx_var(varname)); trajw = vis5d_find_var( lp, rap ); } else { gtx->twowner = -1; } vis5d_set_wind_vars( index, gtx->u1owner, u1, gtx->v1owner, v1, gtx->w1owner, w1, gtx->u2owner, u2, gtx->v2owner, v2, gtx->w2owner, w2, gtx->tuowner, traju, gtx->tvowner, trajv, gtx->twowner, trajw ); gtx->cur_hwind = gtx->cur_vwind = -1; gtx->cur_hstream = gtx->cur_vstream -1; } /* called when Cancel button is pressed: just close window */ static int cancel_cb( LUI_NEWBUTTON *b, int state ) { int index = b->context_index; GuiContext gtx = get_gui_gtx( index ); XUnmapWindow( GuiDpy, gtx->uvw_window ); gtx->uvw_map = 0; return 0; } /* called when apply button is pressed: use new variables, keep window open */ static int apply_cb( LUI_NEWBUTTON *b, int state ) { int index = b->context_index; GuiContext gtx = get_gui_gtx( index ); read_uvw_widgets( gtx ); /* recompute graphics here??? */ return 0; } /* called when ok button is pressed: use new vars, close window */ static int ok_cb( LUI_NEWBUTTON *b, int state ) { int index = b->context_index; GuiContext gtx = get_gui_gtx( index ); read_uvw_widgets( gtx ); XSync(GuiDpy, 0); /* recompute graphics here??? */ XUnmapWindow( GuiDpy, gtx->uvw_window ); gtx->uvw_map = 0; return 0; } /* called when the text in a field changes */ static int field_cb( LUI_FIELD *f, char *text ) { #ifdef LEAVEOUT int index = f->context_index; GuiContext gtx = get_gui_gtx( index ); int var, numvars, *varptr; char varname[20]; if (f==gtx->traju_field) { varptr = >x->traju_var; } else if (f==gtx->trajv_field) { varptr = >x->trajv_var; } else if (f==gtx->trajw_field) { varptr = >x->trajw_var; } else if (f==gtx->u1_field) { varptr = >x->u1_var; } else if (f==gtx->v1_field) { varptr = >x->v1_var; } else if (f==gtx->w1_field) { varptr = >x->w1_var; } else if (f==gtx->u2_field) { varptr = >x->u2_var; } else if (f==gtx->v2_field) { varptr = >x->v2_var; } else if (f==gtx->w2_field) { varptr = >x->w2_var; } else { /* this should never happen! */ abort(); } /* Be sure the varname entered is valid and determine the corresponding * var number. */ var = vis5d_find_var( index, text ); if (var>=0) { *varptr = var; /* recompute graphics? */ return 0; } /* If we get here, that means the user entered an invalid varname so * restore previous name. */ if (*varptr>=0) { vis5d_get_ctx_var_name( index, *varptr, varname ); LUI_FieldSetText( f, varname ); } else { LUI_FieldSetText( f, "" ); } #endif return 0; } /* * Make the U,V,W widget window. */ void make_uvw_widget( GuiContext gtx ) { LUI_NEWBUTTON *apply, *ok, *cancel; Window w; current_ctx = gtx->context_index; w = LUI_CreateWindowAt( LUI_RootWindow, 150, 400, 210, 310 ); gtx->uvw_window = w; LUI_BorderWidth( 2 ); LUI_NewLabelCreate( w, LUI_LEFT, LUI_TOP, 380, 20, "Trajectory Vars:" ); LUI_NewLabelCreate( w, LUI_LEFT, LUI_NEXT_Y, 120, 20, " East/West:" ); gtx->traju_field = LUI_FieldCreate( w, LUI_NEXT_X, LUI_SAME_Y, 80, 20 ); LUI_NewLabelCreate( w, LUI_LEFT, LUI_NEXT_Y, 120, 20, " North/South:" ); gtx->trajv_field = LUI_FieldCreate( w, LUI_NEXT_X, LUI_SAME_Y, 80, 20 ); LUI_NewLabelCreate( w, LUI_LEFT, LUI_NEXT_Y, 120, 20, " Vertical:" ); gtx->trajw_field = LUI_FieldCreate( w, LUI_NEXT_X, LUI_SAME_Y, 80, 20 ); LUI_NewLabelCreate( w, LUI_LEFT, LUI_NEXT_Y, 380, 20, "Wind, Stream slice 1:" ); LUI_NewLabelCreate( w, LUI_LEFT, LUI_NEXT_Y, 120, 20, " East/West:" ); gtx->u1_field = LUI_FieldCreate( w, LUI_NEXT_X, LUI_SAME_Y, 80, 20 ); LUI_NewLabelCreate( w, LUI_LEFT, LUI_NEXT_Y, 120, 20, " North/South:" ); gtx->v1_field = LUI_FieldCreate( w, LUI_NEXT_X, LUI_SAME_Y, 80, 20 ); LUI_NewLabelCreate( w, LUI_LEFT, LUI_NEXT_Y, 120, 20, " Vertical:" ); gtx->w1_field = LUI_FieldCreate( w, LUI_NEXT_X, LUI_SAME_Y, 80, 20 ); LUI_NewLabelCreate( w, LUI_LEFT, LUI_NEXT_Y, 380, 20, "Wind, Stream slice 2:" ); LUI_NewLabelCreate( w, LUI_LEFT, LUI_NEXT_Y, 120, 20, " East/West:" ); gtx->u2_field = LUI_FieldCreate( w, LUI_NEXT_X, LUI_SAME_Y, 80, 20 ); LUI_NewLabelCreate( w, LUI_LEFT, LUI_NEXT_Y, 120, 20, " North/South:" ); gtx->v2_field = LUI_FieldCreate( w, LUI_NEXT_X, LUI_SAME_Y, 80, 20 ); LUI_NewLabelCreate( w, LUI_LEFT, LUI_NEXT_Y, 120, 20, " Vertical:" ); gtx->w2_field = LUI_FieldCreate( w, LUI_NEXT_X, LUI_SAME_Y, 80, 20 ); /* Link fields together for TABing */ LUI_FieldLink( gtx->traju_field, gtx->trajv_field ); LUI_FieldLink( gtx->trajv_field, gtx->trajw_field ); LUI_FieldLink( gtx->trajw_field, gtx->u1_field ); LUI_FieldLink( gtx->u1_field, gtx->v1_field ); LUI_FieldLink( gtx->v1_field, gtx->w1_field ); LUI_FieldLink( gtx->w1_field, gtx->u2_field ); LUI_FieldLink( gtx->u2_field, gtx->v2_field ); LUI_FieldLink( gtx->v2_field, gtx->w2_field ); LUI_NewLabelCreate( w, LUI_LEFT, LUI_NEXT_Y, 10, 5, "" ); /* spacer */ apply = LUI_PushButtonCreate( w, LUI_LEFT, LUI_NEXT_Y, 66, 20, "Apply" ); LUI_ButtonCallback( apply, apply_cb ); ok = LUI_PushButtonCreate( w, LUI_NEXT_X, LUI_SAME_Y, 66, 20, "OK" ); LUI_ButtonCallback( ok, ok_cb ); cancel = LUI_PushButtonCreate( w, LUI_NEXT_X, LUI_SAME_Y, 66, 20, "Cancel"); LUI_ButtonCallback( cancel, cancel_cb ); apply->context_index = gtx->context_index; ok->context_index = gtx->context_index; cancel->context_index = gtx->context_index; } /* * Update all the text fields with the names of the current U,V,W variables. */ static void load_uvw_widgets( GuiContext gtx ) { int index = gtx->context_index; char varname[20]; int u1, v1, w1, u2, v2, w2, traju, trajv, trajw; int owner[9]; char rap[30]; vis5d_get_wind_vars( index, &owner[0], &u1, &owner[1], &v1, &owner[2], &w1, &owner[3], &u2, &owner[4], &v2, &owner[5], &w2, &owner[6], &traju, &owner[7], &trajv, &owner[8], &trajw ); /*** Traj vars ***/ if (traju>=0) { vis5d_get_ctx_var_name( owner[6], traju, varname ); } else { varname[0] = 0; } strcpy( rap, return_var_and_index(varname, owner[6])); LUI_FieldSetText( gtx->traju_field, rap ); if (trajv>=0) { vis5d_get_ctx_var_name( owner[7], trajv, varname ); } else { varname[0] = 0; } strcpy( rap, return_var_and_index(varname, owner[7])); LUI_FieldSetText( gtx->trajv_field, rap); if (trajw>=0) { vis5d_get_ctx_var_name( owner[8], trajw, varname ); } else { varname[0] = 0; } strcpy( rap, return_var_and_index(varname, owner[8])); LUI_FieldSetText( gtx->trajw_field, rap ); /*** First set of slices ****/ if (u1>=0) { vis5d_get_ctx_var_name( owner[0], u1, varname ); } else { varname[0] = 0; } strcpy( rap, return_var_and_index(varname, owner[0])); LUI_FieldSetText( gtx->u1_field, rap); if (v1>=0) { vis5d_get_ctx_var_name( owner[1], v1, varname ); } else { varname[0] = 0; } strcpy( rap, return_var_and_index(varname, owner[1])); LUI_FieldSetText( gtx->v1_field, rap); if (w1>=0) { vis5d_get_ctx_var_name( owner[2], w1, varname ); } else { varname[0] = 0; } strcpy( rap, return_var_and_index(varname, owner[2])); LUI_FieldSetText( gtx->w1_field, rap); /*** First set of slices ****/ if (u2>=0) { vis5d_get_ctx_var_name( owner[3], u2, varname ); } else { varname[0] = 0; } strcpy( rap, return_var_and_index(varname, owner[3])); LUI_FieldSetText( gtx->u2_field, rap); if (v2>=0) { vis5d_get_ctx_var_name( owner[4], v2, varname ); } else { varname[0] = 0; } strcpy( rap, return_var_and_index(varname, owner[4])); LUI_FieldSetText( gtx->v2_field, rap); if (w2>=0) { vis5d_get_ctx_var_name( owner[5], w2, varname ); } else { varname[0] = 0; } strcpy( rap, return_var_and_index(varname, owner[5])); LUI_FieldSetText( gtx->w2_field, rap); } void show_uvw_widget( GuiContext gtx ) { int index = gtx->context_index; /* create the widget if needed */ if (!gtx->uvw_window) { make_uvw_widget( gtx ); } /* map the window */ XMapWindow( GuiDpy, gtx->uvw_window ); gtx->uvw_map = 1; /* update the text fields */ load_uvw_widgets( gtx ); read_uvw_widgets( gtx ); }