00001 #include "SUMA_suma.h"
00002  
00003 
00004 
00005 #define SUMA_USE_WITHDRAW
00006 
00007 extern SUMA_SurfaceViewer *SUMAg_SVv; 
00008 
00009 extern int SUMAg_N_SVv; 
00010   
00011 extern int SUMAg_N_DOv; 
00012 extern SUMA_DO *SUMAg_DOv;
00013 extern SUMA_CommonFields *SUMAg_CF; 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 static int snglBuf[] = {GLX_RGBA, GLX_DEPTH_SIZE, 16,
00030    GLX_RED_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_GREEN_SIZE, 1,  None};
00031 static int dblBuf[] = {GLX_RGBA, GLX_DEPTH_SIZE, 16,
00032   GLX_RED_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_DOUBLEBUFFER, None};
00033 
00034 static String fallbackResources_default[] = {
00035    "*glxarea*width: 300", "*glxarea*height: 300",
00036    "*frame*x: 20", "*frame*y: 20",
00037    "*frame*topOffset: 20", "*frame*bottomOffset: 20",
00038    "*frame*rightOffset: 20", "*frame*leftOffset: 20",
00039    "*frame*shadowType: SHADOW_IN", 
00040    "*fontList:              9x15bold=charset1"    ,
00041    "*pbar*fontList:         6x10=charset1"        ,
00042    "*imseq*fontList:        7x13=charset1"        ,
00043    "*background:            gray50"               ,
00044    "*menu*background:       gray30"               ,
00045    "*borderColor:           gray30"               ,
00046    "*foreground:            black"               ,
00047    "*borderWidth:           0"                    ,
00048    "*troughColor:           green"                ,
00049    "*XmLabel.translations:  #override<Btn2Down>:" , 
00050    "*help*background:       black"                ,
00051    "*help*foreground:       yellow"               ,
00052    "*help*helpborder:       False"                ,
00053    "*help*waitPeriod:       1066"                 ,
00054    "*help*fontList:         9x15bold=charset1"    ,
00055    "*cluefont:              9x15bold"             ,
00056    "*help*cancelWaitPeriod: 50"                   ,
00057   NULL
00058 }; 
00059 
00060 static String fallbackResources_AFNI[] = {
00061    "*glxarea*width: 300", "*glxarea*height: 300",
00062    "*frame*x: 20", "*frame*y: 20",
00063    "*frame*topOffset: 20", "*frame*bottomOffset: 20",
00064    "*frame*rightOffset: 20", "*frame*leftOffset: 20",
00065    "*frame*shadowType: SHADOW_IN", 
00066    "*fontList:              9x15bold=charset1"    ,
00067    "*pbar*fontList:         6x10=charset1"        ,
00068    "*imseq*fontList:        7x13=charset1"        ,
00069    "*background:            gray30"               ,
00070    "*menu*background:       gray30"               ,
00071    "*borderColor:           gray30"               ,
00072    "*foreground:            yellow"               ,
00073    "*borderWidth:           0"                    ,
00074    "*troughColor:           green"                ,
00075    "*XmLabel.translations:  #override<Btn2Down>:" , 
00076    "*help*background:       black"                ,
00077    "*help*foreground:       yellow"               ,
00078    "*help*helpborder:       False"                ,
00079    "*help*waitPeriod:       1066"                 ,
00080    "*help*fontList:         9x15bold=charset1"    ,
00081    "*cluefont:              9x15bold"             ,
00082    "*help*cancelWaitPeriod: 50"                   ,
00083   NULL
00084 }; 
00085 
00086 static String fallbackResources_EURO[] = {
00087    "*glxarea*width: 300", "*glxarea*height: 300",
00088    "*frame*x: 20", "*frame*y: 20",
00089    "*frame*topOffset: 20", "*frame*bottomOffset: 20",
00090    "*frame*rightOffset: 20", "*frame*leftOffset: 20",
00091    "*frame*shadowType: SHADOW_IN", 
00092    "*fontList:              9x15=charset1"    ,
00093    "*pbar*fontList:         6x10=charset1"        ,
00094    "*imseq*fontList:        7x13=charset1"        ,
00095    "*background:            black"               ,
00096    "*menu*background:       gray70"               ,
00097    "*borderColor:           gray70"               ,
00098    "*foreground:            white"               ,
00099    "*borderWidth:           0"                    ,
00100    "*troughColor:           LightCyan2"                ,
00101    "*XmLabel.translations:  #override<Btn2Down>:" , 
00102    "*help*background:       black"                ,
00103    "*help*foreground:       yellow"               ,
00104    "*help*helpborder:       False"                ,
00105    "*help*waitPeriod:       1066"                 ,
00106    "*help*fontList:         9x15=charset1"    ,
00107    "*cluefont:              9x15"             ,
00108    "*help*cancelWaitPeriod: 50"                   ,
00109    "*hotcolor:              blue2"               , 
00110   NULL
00111 }; 
00112 
00113 static String fallbackResources_Bonaire[] = {
00114    "*glxarea*width: 300", "*glxarea*height: 300",
00115    "*frame*x: 20", "*frame*y: 20",
00116    "*frame*topOffset: 20", "*frame*bottomOffset: 20",
00117    "*frame*rightOffset: 20", "*frame*leftOffset: 20",
00118    "*frame*shadowType: SHADOW_IN", 
00119    "*fontList:              9x15bold=charset1"    ,
00120    "*pbar*fontList:         6x10=charset1"        ,
00121    "*imseq*fontList:        7x13=charset1"        ,
00122    "*background:            navy"               ,
00123    "*menu*background:       gray30"               ,
00124    "*borderColor:           gray30"               ,
00125    "*foreground:            LightCyan2"               ,
00126    "*borderWidth:           0"                    ,
00127    "*troughColor:           green"                ,
00128    "*XmLabel.translations:  #override<Btn2Down>:" , 
00129    "*help*background:       black"                ,
00130    "*help*foreground:       yellow"               ,
00131    "*help*helpborder:       False"                ,
00132    "*help*waitPeriod:       1066"                 ,
00133    "*help*fontList:         9x15bold=charset1"    ,
00134    "*cluefont:              9x15bold"             ,
00135    "*help*cancelWaitPeriod: 50"                   ,
00136    "*hotcolor:              azure"               , 
00137   NULL
00138 }; 
00139 
00140 
00141 
00142 
00143 
00144 
00145 String *SUMA_get_fallbackResources ()
00146 {
00147    static char FuncName[]={"SUMA_get_fallbackResources"};
00148    
00149    SUMA_ENTRY;
00150 
00151    switch (SUMAg_CF->X->X_Resources) {
00152       case SXR_Afni:
00153          SUMA_RETURN (fallbackResources_AFNI);
00154          break;
00155       case SXR_Euro:
00156          SUMA_RETURN (fallbackResources_EURO);
00157          break;
00158       case SXR_Bonaire:
00159          SUMA_RETURN (fallbackResources_Bonaire);
00160          break;
00161       case SXR_default:
00162       default:
00163          SUMA_RETURN (fallbackResources_default);
00164    }
00165 
00166 }
00167 
00168 static SUMA_Boolean PleaseDoMakeCurrent;
00169 
00170 void SUMA_SiSi_I_Insist(void)
00171 {
00172    PleaseDoMakeCurrent = YUP;
00173 }
00174 
00175 Boolean
00176 SUMA_handleRedisplay(XtPointer closure)
00177 {
00178    static char FuncName[]={"SUMA_handleRedisplay"};
00179    static int Last_isv = -1;
00180    int isv;
00181    SUMA_SurfaceViewer *sv;
00182    SUMA_Boolean LocalHead = NOPE;
00183    
00184    SUMA_ENTRY;
00185 
00186    if (LocalHead) {
00187       SUMA_REPORT_WICH_WIDGET_SV ((Widget)closure);
00188    }
00189    
00190    
00191    SUMA_ANY_WIDGET2SV((Widget)closure, sv, isv);
00192    if (isv < 0) {
00193       fprintf (SUMA_STDERR, "Error %s: Failed in macro SUMA_ANY_WIDGET2SV.\n", FuncName);
00194       SUMA_RETURN(NOPE);
00195    }
00196    
00197    if (Last_isv >= 0) { 
00198       if (isv != Last_isv) {
00199          if (!sv->Open) {
00200             if (LocalHead) fprintf (SUMA_STDERR, "%s: Redisplay request for a closed window. Skipping.\n", FuncName);
00201             SUMA_RETURN(NOPE);
00202          }else {
00203             PleaseDoMakeCurrent = YUP;
00204          }
00205       }
00206    } 
00207    
00208    if (PleaseDoMakeCurrent) {
00209       
00210       
00211 
00212 
00213       if (!glXMakeCurrent (sv->X->DPY, XtWindow((Widget)closure), sv->X->GLXCONTEXT)) {
00214                fprintf (SUMA_STDERR, "Error %s: Failed in glXMakeCurrent.\n \tContinuing ...\n", FuncName);
00215       }
00216       PleaseDoMakeCurrent = NOPE;
00217    }
00218    
00219    Last_isv = isv; 
00220    
00221    if (LocalHead) fprintf (SUMA_STDERR, "%s: Calling SUMA_display with SV[%d], Pointer %p.\n", FuncName, isv, sv); 
00222    SUMA_display(sv, SUMAg_DOv);
00223    sv->X->REDISPLAYPENDING = 0;
00224    
00225    if (SUMAg_N_SVv > 1) {
00226       if (LocalHead) fprintf (SUMA_STDERR, "%s: Forcing display to finish.\n", FuncName);
00227       
00228 
00229 
00230 
00231 
00232 
00233       glFinish();
00234    }
00235 
00236    SUMA_RETURN(YUP);
00237 }
00238 
00239 
00240 
00241 
00242 
00243 
00244 
00245 
00246 void
00247 SUMA_postRedisplay(Widget w,
00248   XtPointer clientData, XtPointer call)
00249 {
00250    static char FuncName[]={"SUMA_postRedisplay"};
00251    static XtPointer elvis;
00252    int isv;
00253    SUMA_SurfaceViewer *sv;
00254    SUMA_Boolean LocalHead = NOPE;
00255    
00256    SUMA_ENTRY;
00257 
00258    
00259    SUMA_ANY_WIDGET2SV(w, sv, isv);
00260    if (isv < 0) {
00261       fprintf (SUMA_STDERR, "Error %s: Failed in macro SUMA_ANY_WIDGET2SV.\n", FuncName);
00262       SUMA_RETURNe;
00263    } else {
00264       if (LocalHead) fprintf (SUMA_STDERR, "%s: Redisplay Pending registered for viewer %d.\n", FuncName, isv);
00265    }
00266 
00267    if(!sv->X->REDISPLAYPENDING) {
00268     
00269     SUMA_register_workproc( SUMA_handleRedisplay , (XtPointer)sv->X->GLXAREA );
00270     sv->X->REDISPLAYPENDING = 1;
00271    }
00272    
00273    SUMA_RETURNe;
00274 }
00275 
00276 void SUMA_LoadSegDO (char *s, void *csvp)
00277 {
00278    static char FuncName[]={"SUMA_LoadSegDO"};
00279    SUMA_SegmentDO *SDO = NULL;
00280    SUMA_SurfaceViewer *sv;
00281    
00282    SUMA_ENTRY;
00283    
00284    sv = (SUMA_SurfaceViewer *)csvp;
00285    
00286    if (!s) { SUMA_RETURNe; }
00287    
00288    if (!(SDO = SUMA_ReadSegDO(s))) {
00289       SUMA_SL_Err("Failed to read segment file.\n");
00290       SUMA_RETURNe;
00291    }
00292    
00293    
00294    if (!SUMA_AddDO(SUMAg_DOv, &SUMAg_N_DOv, (void *)SDO, LS_type, SUMA_LOCAL)) {
00295       fprintf(SUMA_STDERR,"Error %s: Failed in SUMA_AddDO.\n", FuncName);
00296       SUMA_RETURNe;
00297    }
00298 
00299    
00300    if (!SUMA_RegisterDO(SUMAg_N_DOv-1, sv)) {
00301       fprintf(SUMA_STDERR,"Error %s: Failed in SUMA_RegisterDO.\n", FuncName);
00302       SUMA_RETURNe;
00303    }
00304 
00305    
00306    sv->ResetGLStateVariables = YUP;
00307    SUMA_handleRedisplay((XtPointer)sv->X->GLXAREA);
00308                
00309    SUMA_RETURNe;
00310 }
00311 
00312 
00313 
00314 
00315 
00316 
00317 
00318 
00319 
00320 #define SUMA_S2FV_ATTR(m_nel, m_attr, m_fv, m_n, m_fail) {\
00321    char *m_atmp = NULL; \
00322    int m_nr = 0; \
00323    m_fail = 0; \
00324    m_atmp = NI_get_attribute(m_nel, m_attr); \
00325    if (!m_atmp) {   \
00326       fprintf(SUMA_STDERR,"Error %s:\nNo such attribute (%s).", FuncName, m_attr);  \
00327       m_fail = 1; \
00328    }  \
00329    m_nr = SUMA_StringToNum(m_atmp, m_fv, m_n);  \
00330    if (m_nr != m_n) {  \
00331       fprintf(SUMA_STDERR,"Error %s:\nBad attribute (%s) length.\nExpected %d, found %d\n",   \
00332                            FuncName, m_attr, m_n, m_nr);  \
00333       m_fail = 2; \
00334    }  \
00335 }
00336 
00337 #define SUMA_FV2S_ATTR_TMP_STR   3000
00338 
00339 
00340 
00341 
00342 
00343 
00344 
00345 #define SUMA_FV2S_ATTR(m_nel, m_attr, m_fv, m_n, m_fail) {\
00346    int m_i; \
00347    char m_stmp[SUMA_FV2S_ATTR_TMP_STR], m_val[50];   \
00348    m_fail = 0; \
00349    m_i = 0; \
00350    m_stmp[0] = '\0'; \
00351    while (m_i < m_n && !(m_fail)) { \
00352       sprintf(m_val,"%f ", m_fv[m_i]); \
00353       if (strlen(m_stmp) + strlen(m_val) >= SUMA_FV2S_ATTR_TMP_STR -1) {   \
00354          fprintf(SUMA_STDERR,"Error %s\nVector exceeded buffer length.\n", FuncName);  \
00355          m_fail = 1; \
00356       } else { \
00357          strcat (m_stmp, m_val); \
00358          ++ m_i;  \
00359       }\
00360    }  \
00361    NI_set_attribute (m_nel, m_attr, m_stmp);      \
00362 }
00363       
00364 
00365 
00366 
00367 
00368 
00369 void SUMA_SaveVisualState(char *fname, void *csvp )
00370 {
00371    static char FuncName[]={"SUMA_SaveVisualState"};
00372    NI_element *nel = NULL;
00373    NI_stream nstdout;
00374    char stmp[500];
00375    char *fnamestmp=NULL, *fnamestmp2=NULL;
00376    int feyl;
00377    SUMA_SurfaceViewer *csv;
00378    SUMA_Boolean LocalHead = NOPE;
00379    
00380    SUMA_ENTRY;
00381    
00382    csv = (SUMA_SurfaceViewer *)csvp;
00383    
00384    if (!csv) { SUMA_RETURNe; }
00385    
00386    if (csv->StdView < 0 || csv->iState < 0 ) { SUMA_RETURNe; }
00387    
00388    SUMA_allow_nel_use(1);
00389    nel = SUMA_NewNel (  SUMA_VIEWER_SETTING, 
00390                         NULL, 
00391                         NULL, 
00392                         0,
00393                         NULL,
00394                         NULL); 
00395    if (!nel) {
00396       SUMA_SL_Err("Failed to create nel.");
00397       SUMA_RETURNe;
00398    }
00399    
00400    
00401    SUMA_FV2S_ATTR(nel, "currentQuat", csv->GVS[csv->StdView].currentQuat, 4, feyl); if (feyl) { SUMA_RETURNe; }
00402    SUMA_FV2S_ATTR(nel, "translateVec", csv->GVS[csv->StdView].translateVec, 2, feyl); if (feyl) { SUMA_RETURNe; }
00403    SUMA_FV2S_ATTR(nel, "clear_color", csv->clear_color, 4, feyl); if (feyl) { SUMA_RETURNe; }
00404    sprintf(stmp, "%f", csv->FOV[csv->iState]);
00405    NI_set_attribute (nel, "FOV", stmp);
00406    sprintf(stmp, "%f", csv->Aspect);
00407    NI_set_attribute (nel, "Aspect", stmp);
00408    sprintf(stmp, "%d", csv->WindWidth);
00409    NI_set_attribute (nel, "WindWidth", stmp);
00410    sprintf(stmp, "%d", csv->WindHeight);
00411    NI_set_attribute (nel, "WindHeight", stmp);
00412    sprintf(stmp, "%d", (int)csv->BF_Cull);
00413    NI_set_attribute (nel, "BF_Cull", stmp);
00414    sprintf(stmp, "%f", csv->Back_Modfact);
00415    NI_set_attribute (nel, "Back_Modfact", stmp);
00416    sprintf(stmp, "%d", (int)csv->PolyMode);
00417    NI_set_attribute (nel, "PolyMode", stmp);
00418    sprintf(stmp, "%d", csv->ShowEyeAxis);
00419    NI_set_attribute (nel, "ShowEyeAxis", stmp);
00420    sprintf(stmp, "%d", csv->ShowMeshAxis);
00421    NI_set_attribute (nel, "ShowMeshAxis", stmp);
00422    sprintf(stmp, "%d", csv->ShowWorldAxis);
00423    NI_set_attribute (nel, "ShowWorldAxis", stmp);
00424    sprintf(stmp, "%d", csv->ShowCrossHair);
00425    NI_set_attribute (nel, "ShowCrossHair", stmp);
00426    sprintf(stmp, "%d", (int)csv->ShowForeground);
00427    NI_set_attribute (nel, "ShowForeground", stmp);
00428    sprintf(stmp, "%d", (int)csv->ShowBackground);
00429    NI_set_attribute (nel, "ShowBackground", stmp);
00430    
00431    
00432    if (!fname) {
00433       nstdout = NI_stream_open( "file:test.niml.vvs","w");
00434    } else {
00435       fnamestmp = SUMA_append_string("file:", fname);
00436       fnamestmp2 = SUMA_Extension(fnamestmp, ".niml.vvs", NOPE);
00437       nstdout = NI_stream_open( fnamestmp2,"w");
00438       SUMA_free(fnamestmp); fnamestmp = NULL;
00439       SUMA_free(fnamestmp2); fnamestmp2 = NULL;
00440    }
00441    if( nstdout == NULL ){ 
00442       fprintf(stderr,"%s: Can't open file\n", FuncName); 
00443       SUMA_RETURNe; 
00444    }
00445    NI_write_element( nstdout , nel , NI_TEXT_MODE | NI_HEADERSHARP_FLAG) ;               
00446    NI_stream_close(nstdout);
00447    NI_free_element(nel) ; nel = NULL;
00448     
00449    SUMA_RETURNe;
00450 }
00451 
00452 
00453 
00454 
00455 void SUMA_LoadVisualState(char *fname, void *csvp)
00456 {
00457    static char FuncName[]={"SUMA_LoadVisualState"};
00458    NI_element *nel = NULL;
00459    int feyl;
00460    char *fnamestmp=NULL, *fnamestmp2=NULL;
00461    float quat[4], Aspect[1], FOV[1], tran[2],
00462          WindWidth[1], WindHeight[1], clear_color[4], 
00463          BF_Cull[1], Back_Modfact[1], PolyMode[1], ShowEyeAxis[1], ShowWorldAxis[1],
00464          ShowMeshAxis[1], ShowCrossHair[1], ShowForeground[1], 
00465          ShowBackground[1];   char *atmp;
00466    NI_stream nstdin;
00467    SUMA_SurfaceViewer *csv;
00468    SUMA_Boolean LocalHead = NOPE;
00469    
00470    SUMA_ENTRY;
00471    
00472    csv = (SUMA_SurfaceViewer *)csvp;
00473    if (!csv) { SUMA_RETURNe; }
00474    
00475    if (!fname) {
00476       nstdin = NI_stream_open( "file:test.niml.vvs","r");
00477    } else {
00478       fnamestmp = SUMA_append_string("file:", fname);
00479       fnamestmp2 = SUMA_Extension(fnamestmp, ".niml.vvs", NOPE);
00480       nstdin = NI_stream_open( fnamestmp2,"r");
00481       SUMA_free(fnamestmp); fnamestmp = NULL;
00482       SUMA_free(fnamestmp2); fnamestmp2 = NULL;
00483    }
00484    if( nstdin == NULL ){ 
00485       fprintf(stderr,"%s: Can't open file\n", FuncName); 
00486       SUMA_RETURNe; 
00487    }
00488    nel = NI_read_element (nstdin, 1);
00489    if (!nel) {
00490       SUMA_SL_Err("Failed to read nel.\n");
00491       SUMA_RETURNe;
00492    }
00493 
00494    
00495    SUMA_S2FV_ATTR(nel, "currentQuat", quat, 4, feyl); if (feyl) {SUMA_BEEP};
00496    SUMA_S2FV_ATTR(nel, "translateVec", tran, 2, feyl); if (feyl) {SUMA_BEEP};
00497    SUMA_S2FV_ATTR(nel, "FOV", FOV, 1, feyl); if (feyl) {SUMA_BEEP};
00498    SUMA_S2FV_ATTR(nel, "Aspect", Aspect, 1, feyl); if (feyl) {SUMA_BEEP};
00499    SUMA_S2FV_ATTR(nel, "WindWidth", WindWidth, 1, feyl); if (feyl) {SUMA_BEEP};
00500    SUMA_S2FV_ATTR(nel, "WindHeight", WindHeight, 1, feyl); if (feyl) {SUMA_BEEP};
00501    SUMA_S2FV_ATTR(nel, "clear_color", clear_color, 4, feyl); if (feyl) {SUMA_BEEP};
00502    SUMA_S2FV_ATTR(nel, "BF_Cull", BF_Cull, 1, feyl); if (feyl) {SUMA_BEEP};
00503    SUMA_S2FV_ATTR(nel, "Back_Modfact", Back_Modfact, 1, feyl); if (feyl) {SUMA_BEEP};
00504    SUMA_S2FV_ATTR(nel, "PolyMode", PolyMode, 1, feyl); if (feyl) {SUMA_BEEP};
00505    SUMA_S2FV_ATTR(nel, "ShowEyeAxis", ShowEyeAxis, 1, feyl); if (feyl) {SUMA_BEEP};
00506    SUMA_S2FV_ATTR(nel, "ShowMeshAxis", ShowMeshAxis, 1, feyl); if (feyl) {SUMA_BEEP};
00507    SUMA_S2FV_ATTR(nel, "ShowWorldAxis", ShowWorldAxis, 1, feyl); if (feyl) {SUMA_BEEP};
00508    SUMA_S2FV_ATTR(nel, "ShowCrossHair", ShowCrossHair, 1, feyl); if (feyl) {SUMA_BEEP};
00509    SUMA_S2FV_ATTR(nel, "ShowForeground", ShowForeground, 1, feyl); if (feyl) {SUMA_BEEP};
00510    SUMA_S2FV_ATTR(nel, "ShowBackground", ShowBackground, 1, feyl); if (feyl) {SUMA_BEEP};
00511    
00512    NI_free_element(nel); nel = NULL;
00513    NI_stream_close(nstdin); 
00514    
00515    
00516    SUMA_COPY_VEC(quat, csv->GVS[csv->StdView].currentQuat, 4, float, float);
00517    SUMA_COPY_VEC(tran, csv->GVS[csv->StdView].translateVec, 2, float, float);
00518    csv->FOV[csv->iState] = FOV[0];
00519    csv->Aspect = Aspect[0]; 
00520    csv->WindWidth = (int)WindWidth[0]; 
00521    csv->WindHeight = (int)WindHeight[0]; 
00522    SUMA_COPY_VEC(clear_color, csv->clear_color, 4, float, float);
00523    csv->BF_Cull = (SUMA_Boolean)BF_Cull[0];
00524    csv->Back_Modfact = Back_Modfact[0];
00525    csv->PolyMode = (SUMA_RENDER_MODES)PolyMode[0];
00526    csv->ShowEyeAxis = (int)ShowEyeAxis[0];
00527    csv->ShowMeshAxis = (int)ShowMeshAxis[0];
00528    csv->ShowWorldAxis = (int)ShowWorldAxis[0];
00529    csv->ShowCrossHair = (int)ShowCrossHair[0];
00530    csv->ShowForeground = (SUMA_Boolean)ShowForeground[0];
00531    csv->ShowForeground = (SUMA_Boolean)ShowForeground[0];
00532    
00533    
00534 
00535    SUMA_WidgetResize (csv->X->TOPLEVEL , csv->WindWidth, csv->WindHeight); 
00536 
00537 
00538    SUMA_RETURNe;
00539 }
00540 
00541 void SUMA_display(SUMA_SurfaceViewer *csv, SUMA_DO *dov)
00542 {   
00543    int i;
00544    static int xList[1], yList[1];
00545    SUMA_SurfaceObject *SO=NULL;
00546    GLfloat rotationMatrix[4][4];
00547    static char FuncName[]={"SUMA_display"};
00548    SUMA_Boolean LocalHead = NOPE;    
00549     
00550    SUMA_ENTRY;
00551    
00552    
00553    glClearColor (csv->clear_color[0], csv->clear_color[1], csv->clear_color[2], csv->clear_color[3]);
00554    
00555    if (csv->NewGeom) { 
00556       
00557       SUMA_NewGeometryInViewer(SUMAg_DOv, SUMAg_N_DOv, csv);
00558       csv->NewGeom = NOPE;
00559       csv->ResetGLStateVariables = NOPE; 
00560 
00561    } else {
00562       
00563 
00564 
00565 
00566 
00567  
00568 
00569       if (SUMAg_N_SVv > 1 || csv->ResetGLStateVariables) {
00570          if (LocalHead) fprintf(SUMA_STDERR, "%s: Calling SUMA_OpenGLStateReset.\n", FuncName);
00571          SUMA_OpenGLStateReset (SUMAg_DOv, SUMAg_N_DOv, csv);
00572          csv->ResetGLStateVariables = NOPE;
00573       }
00574    }
00575    
00576    
00577    if (csv->ShowMeshAxis || csv->ShowWorldAxis) {
00578       yList[0] = csv->WindHeight;
00579       xList[0] = 0;
00580       SUMA_GetSelectionLine (csv, csv->WindWidth/2, csv->WindHeight/2, csv->Pcenter_close, csv->Pcenter_far, 1, xList, yList, csv->Plist_close);
00581    }
00582    
00583    if (!SUMA_MixColors (csv)) {
00584       fprintf(SUMA_STDERR,"Error %s: Failed in SUMA_MixColors. Aborting.\n", FuncName);
00585       exit(1);
00586    }
00587    
00588    if (LocalHead) fprintf (SUMA_STDOUT,"%s: Building Rotation matrix ...\n", FuncName);
00589    SUMA_build_rotmatrix(rotationMatrix, csv->GVS[csv->StdView].currentQuat);
00590     
00591    if (LocalHead) fprintf (SUMA_STDOUT,"%s: performing glClear ...\n", FuncName);
00592    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
00593    
00594    SUMA_SET_GL_PROJECTION(csv);
00595    
00596 
00597    
00598    if (LocalHead) fprintf (SUMA_STDOUT,"%s: Creating objects with fixed coordinates ...\n", FuncName);
00599    i = 0;
00600    while (i < csv->N_DO) {
00601       if (dov[csv->RegisteredDO[i]].CoordType == SUMA_SCREEN) {
00602          switch (dov[csv->RegisteredDO[i]].ObjectType) {
00603             case SO_type:
00604                break;
00605             case AO_type:
00606                if (csv->ShowEyeAxis){
00607                   if (!SUMA_DrawAxis ((SUMA_Axis*)dov[csv->RegisteredDO[i]].OP, csv)) {
00608                      fprintf(SUMA_STDERR,"Error %s: Could not display EYE AXIS\n", FuncName);
00609                   }
00610                }
00611                break;
00612             case GO_type:
00613                break;
00614             case ROIdO_type:
00615                
00616                break;
00617             case ROIO_type:
00618                
00619                break;
00620             case LS_type:
00621                if (!SUMA_DrawSegmentDO ((SUMA_SegmentDO *)dov[csv->RegisteredDO[i]].OP)) {
00622                   fprintf(SUMA_STDERR, "Error %s: Failed in SUMA_DrawSegmentDO.\n", FuncName);
00623                }
00624                break;
00625          }
00626       }
00627       ++i;
00628    }
00629    
00630    SUMA_SET_GL_MODELVIEW(csv);
00631 
00632    
00633    if (LocalHead) fprintf (SUMA_STDOUT,"%s: Creating objects with local coordinates ...\n", FuncName);
00634 
00635    i = 0;
00636    while (i < csv->N_DO) {
00637       if (dov[csv->RegisteredDO[i]].CoordType == SUMA_LOCAL) {
00638          switch (dov[csv->RegisteredDO[i]].ObjectType) {
00639             case SO_type:
00640                SO = (SUMA_SurfaceObject *)dov[csv->RegisteredDO[i]].OP;
00641                if (SO->Show) {
00642                   if (  (SO->Side == SUMA_LEFT && csv->ShowLeft) || 
00643                         (SO->Side == SUMA_RIGHT && csv->ShowRight) ||
00644                         SO->Side == SUMA_NO_SIDE) {
00645                         SUMA_DrawMesh(SO, csv); 
00646                   }
00647                }
00648                break;
00649             case AO_type:
00650                if (csv->ShowMeshAxis) {
00651                   if (!SUMA_DrawAxis ((SUMA_Axis*)dov[csv->RegisteredDO[i]].OP, csv)) {
00652                      fprintf(stderr,"display error: Could not display Mesh AXIS\n");
00653                   }
00654                }
00655                break;
00656             case GO_type:
00657                break;
00658             case ROIdO_type:
00659                
00660                break;
00661             case ROIO_type:
00662                
00663                break;
00664             case LS_type:
00665                if (!SUMA_DrawSegmentDO ((SUMA_SegmentDO *)dov[csv->RegisteredDO[i]].OP)) {
00666                   fprintf(SUMA_STDERR, "Error %s: Failed in SUMA_DrawSegmentDO.\n", FuncName);
00667                }
00668                break;
00669          }
00670       }
00671       ++i;
00672    }
00673    
00674    
00675    if (csv->ShowCrossHair) {
00676       
00677       if (!SUMA_DrawCrossHair (csv->Ch)) {
00678          fprintf(stderr,"display error: Failed to Create Cross Hair\n");
00679       }
00680    }
00681    
00682    
00683    if (csv->ShowWorldAxis) {
00684       
00685       if (!SUMA_DrawAxis (csv->WAx, csv)) {
00686          fprintf(stderr,"display error: Failed to Create WAx\n");
00687       }
00688    }
00689 
00690 
00691    #if 0
00692    
00693     {
00694       static GLfloat NoColor[] = {0.0, 0.0, 0.0, 0.0};
00695       static GLfloat LineColor[] = {1.0, 0.0, 1.0, 0.0};
00696       glLineWidth(1.0);
00697       glEnable(GL_LINE_STIPPLE);
00698       glLineStipple (1, 0x1C47); 
00699       glBegin(GL_LINES);
00700       glMaterialfv(GL_FRONT, GL_EMISSION, LineColor); 
00701       glVertex3f(csv->Pick0[0], csv->Pick0[1], csv->Pick0[2]);
00702       glVertex3f(csv->Pick1[0], csv->Pick1[1], csv->Pick1[2]);
00703       glMaterialfv(GL_FRONT, GL_EMISSION, NoColor); 
00704       glEnd();
00705       glDisable(GL_LINE_STIPPLE);
00706    }
00707    #endif
00708       
00709    glPopMatrix();   
00710 
00711    if (LocalHead) fprintf (SUMA_STDOUT,"%s: Flushing or swapping ...\n", FuncName);
00712    if (csv->X->DOUBLEBUFFER)
00713     glXSwapBuffers(csv->X->DPY, XtWindow(csv->X->GLXAREA));
00714    else
00715     glFlush();
00716 
00717   
00718   if (!glXIsDirect(csv->X->DPY, csv->X->GLXCONTEXT))
00719     glFinish();
00720   
00721   
00722   if (csv->Record) {
00723       if (csv->rdc < SUMA_RDC_X_START || csv->rdc > SUMA_RDC_X_END) {
00724          glFinish();
00725          glXWaitX();
00726       #ifdef DARWIN
00727          { GLvoid *pixels;
00728            pixels = SUMA_grabPixels(1, csv->X->WIDTH, csv->X->HEIGHT);
00729            if (pixels) {
00730              ISQ_snapsave( csv->X->WIDTH, -csv->X->HEIGHT,
00731                            (unsigned char *)pixels, csv->X->GLXAREA );
00732              SUMA_free(pixels);
00733            }
00734          }
00735       #else
00736          ISQ_snapshot ( csv->X->GLXAREA );
00737       #endif
00738       }
00739   }
00740   
00741   
00742   csv->rdc = SUMA_RDC_NOT_SET;
00743   
00744    SUMA_RETURNe;
00745 }
00746 
00747 void
00748 SUMA_graphicsInit(Widget w, XtPointer clientData, XtPointer call)
00749 {
00750    
00751    XVisualInfo *SUMAg_cVISINFO;
00752    static char FuncName[]={"SUMA_graphicsInit"};
00753    int isv;
00754    SUMA_SurfaceViewer *sv;
00755    
00756    SUMA_ENTRY;
00757 
00758    
00759    SUMA_ANY_WIDGET2SV((Widget)w, sv, isv);
00760    if (isv < 0) {
00761       fprintf (SUMA_STDERR, "Error %s: Failed in macro SUMA_ANY_WIDGET2SV.\n", FuncName);
00762       SUMA_RETURNe;
00763    }
00764 
00765    
00766    XtVaGetValues(w, GLwNvisualInfo, &SUMAg_cVISINFO, NULL);
00767    sv->X->GLXCONTEXT = glXCreateContext(XtDisplay(w), SUMAg_cVISINFO,
00768     0,                  
00769     True);              
00770 
00771    
00772    if (!glXMakeCurrent(XtDisplay(w), XtWindow(w), sv->X->GLXCONTEXT)) {
00773       fprintf (SUMA_STDERR, "Error %s: Failed in glXMakeCurrent.\n \tContinuing ...\n", FuncName);
00774    }
00775    
00776       
00777    SUMA_context_Init(sv);
00778 
00779    SUMA_RETURNe;
00780    
00781 }
00782 
00783 void 
00784 SUMA_context_Init(SUMA_SurfaceViewer *sv)
00785 {
00786    static char FuncName[]={"SUMA_context_Init"};
00787    GLfloat mat_specular[] = { SUMA_MAT_SPECULAR_INIT};
00788    GLfloat mat_shininess[] = { SUMA_MAT_SHININESS_INIT };
00789    GLfloat mat_ambient[] = { SUMA_MAT_AMBIENT_INIT};
00790    GLfloat mat_diffuse[] = { SUMA_MAT_DIFFUSE_INIT };
00791    GLfloat mat_emission[] = { SUMA_MAT_EMISSION_INIT  };
00792    
00793    GLfloat light0_color[] = { SUMA_LIGHT0_COLOR_INIT};
00794    
00795    
00796    GLfloat lmodel_ambient[] = {SUMA_LMODEL_AMBIENT};
00797 
00798    SUMA_ENTRY;
00799 
00800    glClearColor (sv->clear_color[0], sv->clear_color[1], sv->clear_color[2], sv->clear_color[3]);
00801    glShadeModel (GL_SMOOTH);
00802 
00803    SUMA_SET_GL_RENDER_MODE(sv->PolyMode); 
00804    
00805       
00806    
00807    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
00808    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
00809    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
00810    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
00811    glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
00812    
00813    
00814    glLightfv(GL_LIGHT0, GL_POSITION, sv->light0_position);
00815    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_color);
00816    glLightfv(GL_LIGHT0, GL_SPECULAR, light0_color);
00817 
00818    
00819 
00820 
00821    
00822    
00823    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
00824  
00825    glEnable(GL_LIGHTING); 
00826    glEnable(GL_LIGHT0); 
00827    
00828    glEnable(GL_DEPTH_TEST);
00829    
00830    
00831    if (sv->BF_Cull) {
00832       glCullFace (GL_BACK);
00833       glEnable (GL_CULL_FACE);
00834    }
00835    
00836    
00837 
00838    glMatrixMode(GL_MODELVIEW);
00839    glLoadIdentity();
00840    gluLookAt (   sv->GVS[sv->StdView].ViewFrom[0], sv->GVS[sv->StdView].ViewFrom[1], 
00841                sv->GVS[sv->StdView].ViewFrom[2], sv->GVS[sv->StdView].ViewCenter[0], 
00842                sv->GVS[sv->StdView].ViewCenter[1], sv->GVS[sv->StdView].ViewCenter[2], 
00843                sv->GVS[sv->StdView].ViewCamUp[0], sv->GVS[sv->StdView].ViewCamUp[1], 
00844                sv->GVS[sv->StdView].ViewCamUp[2] );
00845 
00846    
00847    
00848 
00849    SUMA_RETURNe;
00850 
00851 }
00852 
00853    
00854 void
00855 SUMA_resize(Widget w,
00856   XtPointer clientData, XtPointer call)
00857 {
00858    static char FuncName[]={"SUMA_resize"};
00859    GLwDrawingAreaCallbackStruct *callData;
00860    SUMA_SurfaceViewer *sv;
00861    int isv;
00862    
00863    SUMA_ENTRY;
00864 
00865    
00866    SUMA_ANY_WIDGET2SV(w, sv, isv);
00867    if (isv < 0) {
00868       fprintf (SUMA_STDERR, "Error %s: Failed in macro SUMA_ANY_WIDGET2SV.\n", FuncName);
00869       SUMA_RETURNe;
00870    }
00871 
00872    
00873    callData = (GLwDrawingAreaCallbackStruct *) call;
00874    if (!glXMakeCurrent(XtDisplay(w), XtWindow(w), sv->X->GLXCONTEXT)) {
00875       fprintf (SUMA_STDERR, "Error %s: Failed in glXMakeCurrent.\n \tContinuing ...\n", FuncName);
00876    }
00877 
00878    glXWaitX();
00879    sv->X->WIDTH = callData->width;
00880    sv->X->HEIGHT = callData->height;
00881    glViewport(0, 0, callData->width, callData->height);
00882 
00883    glMatrixMode(GL_MODELVIEW);
00884    glLoadIdentity();
00885    gluLookAt (   sv->GVS[sv->StdView].ViewFrom[0], sv->GVS[sv->StdView].ViewFrom[1], 
00886                sv->GVS[sv->StdView].ViewFrom[2], sv->GVS[sv->StdView].ViewCenter[0], 
00887                sv->GVS[sv->StdView].ViewCenter[1], sv->GVS[sv->StdView].ViewCenter[2], 
00888                sv->GVS[sv->StdView].ViewCamUp[0], sv->GVS[sv->StdView].ViewCamUp[1], 
00889                sv->GVS[sv->StdView].ViewCamUp[2]);
00890    sv->Aspect = (GLfloat) callData->width/(GLfloat) callData->height;
00891    sv->WindWidth = callData->width; sv->WindHeight = callData->height;
00892    
00893    sv->rdc = SUMA_RDC_X_RESIZE;
00894    SUMA_postRedisplay(w, clientData, call);
00895    
00896    SUMA_RETURNe;
00897 }
00898 
00899 
00900 void
00901 SUMA_expose(Widget w,
00902   XtPointer clientData, XtPointer call)
00903 {
00904   static char FuncName[]={"SUMA_expose"};
00905   int isv;
00906   SUMA_SurfaceViewer *sv;
00907   SUMA_Boolean LocalHead = NOPE;
00908   
00909    SUMA_LH("Called");
00910    
00911   
00912   
00913    
00914    SUMA_ANY_WIDGET2SV(w, sv, isv);
00915    if (isv < 0) {
00916       fprintf (SUMA_STDERR, "Error %s: Failed in macro SUMA_ANY_WIDGET2SV.\n", FuncName);
00917       SUMA_RETURNe;
00918    }
00919    
00920    sv->rdc = SUMA_RDC_X_EXPOSE;
00921    
00922    
00923    sv->ResetGLStateVariables = YUP;
00924    SUMA_postRedisplay(w, NULL, NULL);
00925 
00926 }
00927 
00928 void
00929 SUMA_mapStateChanged(Widget w, XtPointer clientData,
00930   XEvent * event, Boolean * cont)
00931 {
00932 
00933    static char FuncName[]={"SUMA_mapStateChanged"};
00934    int isv;
00935    SUMA_SurfaceViewer *sv;
00936    SUMA_Boolean LocalHead = NOPE;
00937    
00938    SUMA_ENTRY;
00939    
00940    SUMA_LH("Called");
00941    
00942    
00943    SUMA_ANY_WIDGET2SV(w, sv, isv);
00944    if (isv < 0) {
00945       fprintf (SUMA_STDERR, "Error %s: Failed in macro SUMA_ANY_WIDGET2SV.\n", FuncName);
00946       SUMA_RETURNe;
00947    }
00948 
00949    sv->rdc = SUMA_RDC_X_MAPSTATE;
00950    
00951    
00952    sv->ResetGLStateVariables = YUP;
00953 
00954    
00955    switch (event->type) {
00956    case MapNotify:
00957       sv->isShaded = NOPE;
00958       if (sv->GVS[sv->StdView].ApplyMomentum)
00959          sv->X->MOMENTUMID = XtAppAddTimeOut(SUMAg_CF->X->App, 1, SUMA_momentum, (XtPointer)w);
00960       break;
00961    case UnmapNotify:
00962       sv->isShaded = YUP;
00963       if (sv->GVS[sv->StdView].ApplyMomentum) {
00964          if (sv->X->MOMENTUMID) XtRemoveTimeOut(sv->X->MOMENTUMID);
00965          sv->X->MOMENTUMID = 0;
00966       }
00967       break;
00968    }
00969   
00970   SUMA_postRedisplay(w, clientData, NULL);
00971   
00972   SUMA_RETURNe;
00973 }
00974 
00975 
00976 
00977 
00978 
00979 
00980 
00981 
00982 
00983 
00984 
00985 
00986 
00987 
00988 
00989 
00990 
00991 
00992 
00993 
00994 
00995 
00996 
00997 
00998 
00999 
01000 
01001 
01002 
01003 
01004 
01005 static int i_wid = 0;
01006 static int N_wid = 0;
01007 static int nchar = 0;
01008 
01009 void SUMA_BuildMenuReset(int n_max)
01010 {
01011    static char FuncName[]={"SUMA_BuildMenuReset"};
01012    SUMA_ENTRY;
01013    i_wid = 0;
01014    N_wid = 0;
01015    nchar = n_max;
01016    SUMA_RETURNe;
01017 }
01018 
01019 int SUMA_BuildMenu(Widget parent, int menu_type, char *menu_title, 
01020                      char menu_mnemonic, SUMA_Boolean tear_off, SUMA_MenuItem *items, 
01021                      void *ContID, 
01022                      char *hint, char *help,
01023                      Widget *MenuWidgets )
01024 {
01025    static char FuncName[]={"SUMA_BuildMenu"};
01026    char nlabel[300];
01027    Widget menu = NULL, cascade = NULL;
01028    XmString str;
01029    int i;
01030    SUMA_Boolean LocalHead = NOPE;
01031    
01032    SUMA_ENTRY;
01033 
01034    if (LocalHead) fprintf (SUMA_STDERR, "%s: Here.\n", FuncName);
01035       
01036    if (menu_type == XmMENU_PULLDOWN || menu_type == XmMENU_OPTION)
01037      menu = XmCreatePulldownMenu (parent, "_pulldown", NULL, 0);
01038    else if (menu_type == XmMENU_POPUP)
01039      menu = XmCreatePopupMenu (parent, "_popup", NULL, 0);
01040    else {
01041      XtWarning ("Invalid menu type passed to BuildMenu()");
01042      SUMA_RETURN(-1);
01043    }
01044    
01045 
01046    if (tear_off)
01047      XtVaSetValues (menu, XmNtearOffModel, XmTEAR_OFF_ENABLED, NULL);
01048 
01049    
01050    if (menu_type == XmMENU_PULLDOWN) {
01051      str = XmStringCreateLocalized (menu_title);
01052      cascade = XtVaCreateManagedWidget (menu_title,
01053          xmCascadeButtonWidgetClass, parent,
01054          XmNsubMenuId,   menu,
01055          XmNlabelString, str,
01056          XmNmnemonic,    menu_mnemonic,
01057          XmNmarginHeight, 0,
01058          XmNmarginTop, 0,
01059          XmNmarginBottom, 0,
01060          NULL);
01061      XmStringFree (str);
01062    } 
01063    else if (menu_type == XmMENU_OPTION) {
01064      
01065      Arg args[10];
01066      int n = 0;
01067      SUMA_LH("Here");
01068      str = XmStringCreateLocalized (menu_title);
01069      XtSetArg (args[n], XmNsubMenuId, menu); n++;
01070      XtSetArg (args[n], XmNlabelString, str); n++;
01071      XtSetArg (args[n], XmNmarginHeight, 0); n++;
01072      XtSetArg (args[n], XmNmarginTop, 0 ); n++;
01073      XtSetArg (args[n], XmNmarginBottom, 0 ); n++;
01074      
01075      
01076 
01077 
01078      cascade = XmCreateOptionMenu (parent, menu_title, args, n);
01079      XmStringFree (str);
01080    }
01081    
01082    
01083    if (menu_type == XmMENU_POPUP) {  MenuWidgets[i_wid] = menu; }
01084    else { MenuWidgets[i_wid] = cascade; } 
01085    
01086    if (hint) MCW_register_hint(MenuWidgets[i_wid], hint);
01087    if (help) MCW_reghelp_children(MenuWidgets[i_wid], help);
01088    
01089    ++i_wid;
01090    
01091    
01092    for (i = 0; items[i].label != NULL; i++) {
01093       if (LocalHead) fprintf (SUMA_STDERR, "%s: Adding label # %d - %s\n", FuncName, i, items[i].label);
01094      
01095 
01096 
01097 
01098      if (items[i].subitems)
01099          if (menu_type == XmMENU_OPTION) {
01100              XtWarning ("You can't have submenus from option menu items.");
01101              continue;
01102          } 
01103          else {
01104              if (LocalHead) fprintf (SUMA_STDERR, "%s: Going for sub-menu.\n", FuncName);
01105              SUMA_BuildMenu (menu, XmMENU_PULLDOWN, items[i].label, 
01106                  items[i].mnemonic, tear_off, items[i].subitems, ContID, hint, help, MenuWidgets);
01107          }
01108      else {
01109          if (LocalHead) fprintf (SUMA_STDERR, "%s: Creating widgets MenuWidgets[%d]\n", FuncName, (int)items[i].callback_data);
01110          if (nchar > 0) {
01111             snprintf(nlabel, nchar*sizeof(char), "%s", items[i].label);
01112             MenuWidgets[i_wid] = XtVaCreateManagedWidget (nlabel,
01113                 *items[i].class, menu,
01114                 NULL);
01115          } else {
01116             MenuWidgets[i_wid] = XtVaCreateManagedWidget (items[i].label,
01117                 *items[i].class, menu,
01118                 NULL);
01119          }
01120       }
01121 
01122       
01123       
01124 
01125 
01126       if (LocalHead) fprintf (SUMA_STDERR, "%s: Setting Mnemonic ...\n", FuncName);
01127       if (items[i].mnemonic)
01128          XtVaSetValues (MenuWidgets[i_wid], XmNmnemonic, items[i].mnemonic, NULL);
01129 
01130       
01131 
01132 
01133 
01134       if (LocalHead) fprintf (SUMA_STDERR, "%s: Setting accelerator ...\n", FuncName);
01135       if (items[i].accelerator) {
01136          str = XmStringCreateLocalized (items[i].accel_text);
01137          XtVaSetValues (MenuWidgets[i_wid],
01138              XmNaccelerator, items[i].accelerator,
01139              XmNacceleratorText, str,
01140              NULL);
01141          XmStringFree (str);
01142       }
01143 
01144       if (items[i].class == &xmToggleButtonWidgetClass ||
01145               items[i].class == &xmToggleButtonWidgetClass) {
01146          Pixel fg_pix;
01147          XtVaGetValues (MenuWidgets[i_wid], XmNforeground, &fg_pix, NULL);
01148          XtVaSetValues (MenuWidgets[i_wid], XmNselectColor, fg_pix, NULL); 
01149           
01150       }
01151      
01152       if (LocalHead) fprintf (SUMA_STDERR, "%s: Setting callback ...\n", FuncName);
01153       if (items[i].callback) {
01154          SUMA_MenuCallBackData *CBp=NULL;
01155          CBp = (SUMA_MenuCallBackData *)malloc (sizeof(SUMA_MenuCallBackData)); 
01156          
01157          CBp->callback_data = (XtPointer) items[i].callback_data;
01158          CBp->ContID = ContID;
01159          XtAddCallback (MenuWidgets[i_wid],
01160              (items[i].class == &xmToggleButtonWidgetClass ||
01161               items[i].class == &xmToggleButtonWidgetClass) ?
01162                  XmNvalueChangedCallback : 
01163                  XmNactivateCallback,      
01164              items[i].callback, (XtPointer)CBp);
01165       }
01166       ++i_wid;
01167    }
01168 
01169    #if 0
01170     {
01171       SUMA_LH("Adding event handler. Crashes when dealing with File: cascade buttons ....");
01172       if (menu_type == XmMENU_POPUP) {
01173          SUMA_ShowMeTheChildren(menu);
01174       } else {
01175          SUMA_ShowMeTheChildren(cascade);
01176       }
01177       
01178 
01179       if (0) {
01180       SUMA_ShowMeTheChildren(menu);
01181       XtInsertEventHandler(   cascade ,      
01182                            ButtonPressMask ,  
01183                            FALSE ,            
01184                            SUMA_optmenu_EV ,  
01185                            (XtPointer) cascade ,   
01186                            XtListTail ) ;     
01187      } 
01188 
01189    }
01190    #endif
01191    
01192 
01193 
01194 
01195    if (LocalHead) fprintf (SUMA_STDERR, "%s: Returning %d widgets created.\n", FuncName, i_wid);
01196    SUMA_RETURN (i_wid);
01197 }
01198 
01199 Widget mainw, menubar, menupane, btn, sep, cascade, frame;
01200 Arg menuPaneArgs[1], args[1];
01201 
01202 SUMA_MenuItem FileOpen_menu[] = {
01203    {  "OpenSpec", &xmPushButtonWidgetClass, \
01204       'p', "Ctrl<Key>p", "Ctrl+p", \
01205       SUMA_cb_FileOpenSpec, (XtPointer) SW_FileOpenSpec, NULL},
01206    
01207    {  "OpenSurf", &xmPushButtonWidgetClass, \
01208       'o', "Ctrl<Key>o", "Ctrl+o", \
01209       SUMA_cb_FileOpenSurf, (XtPointer) SW_FileOpenSurf, NULL},
01210    
01211    {NULL} ,
01212 };
01213 
01214 SUMA_MenuItem File_menu[] = {
01215    
01216 
01217 
01218 
01219    {  "Save View", &xmPushButtonWidgetClass, \
01220       '\0', NULL, NULL, \
01221       SUMA_cb_FileSaveView, (XtPointer) SW_FileSaveView, NULL},
01222    
01223    {  "Load View", &xmPushButtonWidgetClass, \
01224       '\0', NULL, NULL, \
01225       SUMA_cb_FileLoadView, (XtPointer) SW_FileLoadView, NULL},
01226       
01227    
01228    {  "Close", &xmPushButtonWidgetClass, \
01229       'C', NULL, "Esc", \
01230       SUMA_cb_FileClose, (XtPointer) SW_FileClose, NULL},
01231    
01232    {NULL},
01233 };
01234  
01235 
01236 
01237 
01238 
01239 
01240 
01241 
01242 
01243 
01244 
01245 
01246 
01247 
01248 SUMA_MenuItem View_menu[] = {
01249    {  "SUMA Controller", &xmPushButtonWidgetClass, \
01250       'U', "Ctrl<Key>u", "Ctrl+u", \
01251       SUMA_cb_viewSumaCont, (XtPointer) SW_ViewSumaCont, NULL },
01252    
01253    {  "Surface Controller", &xmPushButtonWidgetClass, \
01254       'S', "Ctrl<Key>s", "Ctrl+s", \
01255       SUMA_cb_viewSurfaceCont, (XtPointer) SW_ViewSurfCont, NULL },
01256    
01257    {  "Viewer Controller", &xmPushButtonWidgetClass, \
01258       'V', "Ctrl<Key>v", "Ctrl+v", \
01259       SUMA_cb_viewViewerCont, (XtPointer) SW_ViewViewCont, NULL },
01260    
01261    {  "Separator 1", &xmSeparatorWidgetClass, \
01262       '\0', NULL, NULL, \
01263       NULL, (XtPointer) SW_ViewSep1, NULL },
01264    
01265    {  "Cross Hair", &xmToggleButtonWidgetClass, \
01266       'C', "<Key>F3", "F3",  \
01267       SUMA_cb_toggle_crosshair, (XtPointer) SW_ViewCrossHair, NULL },
01268    
01269    {  "Node in Focus", &xmToggleButtonWidgetClass, \
01270       'N', "<Key>F4", "F4", \
01271       SUMA_cb_toggle_node_in_focus, (XtPointer) SW_ViewNodeInFocus, NULL },
01272       
01273    {  "Selected Faceset", &xmToggleButtonWidgetClass, \
01274       'F', "<Key>F5", "F5", \
01275       SUMA_cb_toggle_selected_faceset, (XtPointer) SW_ViewSelectedFaceset, NULL },
01276       
01277    {NULL},
01278 };
01279 
01280 SUMA_MenuItem Tools_menu[] = {
01281    {  "Draw ROI", &xmPushButtonWidgetClass, \
01282       'D', "Ctrl <Key>d", "Ctrl+d", \
01283       SUMA_cb_ToolsDrawROI, (XtPointer) SW_ToolsDrawROI, NULL },
01284    
01285    {NULL},
01286 
01287 };
01288 
01289 
01290 SUMA_MenuItem Help_menu[] = {
01291    {  "Usage", &xmPushButtonWidgetClass, \
01292       'U', "Ctrl <Key>h", "Ctrl+h", \
01293       SUMA_cb_helpUsage, (XtPointer) SW_HelpUsage, NULL},
01294       
01295    {  "Message Log", &xmPushButtonWidgetClass, \
01296       'L', NULL, NULL, \
01297       SUMA_cb_helpMessageLog, (XtPointer) SW_HelpMessageLog, NULL},
01298       
01299    {  "Separator 1", &xmSeparatorWidgetClass, \
01300       '\0', NULL, NULL, \
01301       NULL, (XtPointer) SW_HelpSep1, NULL }, 
01302    
01303    {  "SUMA Global", &xmPushButtonWidgetClass, \
01304       'G', NULL, NULL, \
01305       SUMA_cb_helpSUMAGlobal, (XtPointer) SW_HelpSUMAGlobal, NULL},
01306    
01307    {  "Viewer struct", &xmPushButtonWidgetClass, \
01308       'V', NULL, NULL, \
01309       SUMA_cb_helpViewerStruct, (XtPointer) SW_HelpViewerStruct, NULL},
01310    
01311    {  "Surface struct", &xmPushButtonWidgetClass, \
01312       'S', NULL, NULL, \
01313       SUMA_cb_helpSurfaceStruct, (XtPointer) SW_HelpSurfaceStruct, NULL},
01314    
01315    {  "Separator 2", &xmSeparatorWidgetClass, \
01316       '\0', NULL, NULL, \
01317       NULL, (XtPointer) SW_HelpSep2, NULL },    
01318    
01319    {  "InOut Notify", &xmToggleButtonWidgetClass, \
01320       'I', NULL, NULL, \
01321       SUMA_cb_helpIO_notify, (XtPointer) SW_HelpIONotify, NULL},
01322       
01323    {  "MemTrace", &xmToggleButtonWidgetClass, \
01324       'M', NULL, NULL, \
01325       SUMA_cb_helpMemTrace, (XtPointer) SW_HelpMemTrace, NULL},
01326    {NULL},
01327 };
01328 
01329 SUMA_MenuItem RenderMode_Menu[] = {
01330    {  "Viewer", &xmPushButtonWidgetClass, 
01331       '\0', NULL, NULL, 
01332       SUMA_cb_SetRenderMode, (XtPointer) SW_SurfCont_RenderViewerDefault, NULL},
01333       
01334    {  "Fill", &xmPushButtonWidgetClass, 
01335       '\0', NULL, NULL, 
01336       SUMA_cb_SetRenderMode, (XtPointer) SW_SurfCont_RenderFill, NULL},
01337    
01338    {  "Line", &xmPushButtonWidgetClass, 
01339       '\0', NULL, NULL, 
01340       SUMA_cb_SetRenderMode, (XtPointer) SW_SurfCont_RenderLine, NULL},
01341     
01342    {  "Points", &xmPushButtonWidgetClass, 
01343       '\0', NULL, NULL, 
01344       SUMA_cb_SetRenderMode, (XtPointer) SW_SurfCont_RenderPoints, NULL},
01345         
01346    {NULL},
01347 };
01348 
01349 SUMA_MenuItem DrawROI_SaveMode_Menu[]= {
01350    {  "1D", &xmPushButtonWidgetClass, 
01351       '\0', NULL, NULL, 
01352       SUMA_cb_SetDrawROI_SaveMode, (XtPointer) SW_DrawROI_SaveMode1D, NULL},
01353    
01354    {  "NIML", &xmPushButtonWidgetClass, 
01355       '\0', NULL, NULL, 
01356       SUMA_cb_SetDrawROI_SaveMode, (XtPointer) SW_DrawROI_SaveModeNIML, NULL},
01357    
01358    {NULL},
01359 };
01360 
01361 SUMA_MenuItem DrawROI_SaveWhat_Menu[]= {
01362    {  "This", &xmPushButtonWidgetClass, 
01363       '\0', NULL, NULL, 
01364       SUMA_cb_SetDrawROI_SaveWhat, (XtPointer) SW_DrawROI_SaveWhatThis, NULL},
01365    
01366    {  "All", &xmPushButtonWidgetClass, 
01367       '\0', NULL, NULL, 
01368       SUMA_cb_SetDrawROI_SaveWhat, (XtPointer) SW_DrawROI_SaveWhatRelated, NULL},
01369          
01370    {NULL},
01371 };
01372 
01373 SUMA_MenuItem DrawROI_WhatDist_Menu[]= {
01374    {  "----", &xmPushButtonWidgetClass, 
01375       '\0', NULL, NULL, 
01376       SUMA_cb_SetDrawROI_WhatDist, (XtPointer) SW_DrawROI_WhatDistNothing, NULL},
01377    
01378    {  "trace", &xmPushButtonWidgetClass, 
01379       '\0', NULL, NULL, 
01380       SUMA_cb_SetDrawROI_WhatDist, (XtPointer) SW_DrawROI_WhatDistTrace, NULL},
01381    
01382    {  "all", &xmPushButtonWidgetClass, 
01383       '\0', NULL, NULL, 
01384       SUMA_cb_SetDrawROI_WhatDist, (XtPointer) SW_DrawROI_WhatDistAll, NULL},
01385          
01386    {NULL},
01387 };      
01388 SUMA_Boolean SUMA_X_SurfaceViewer_Create (void)
01389 {
01390    static char FuncName[]={"SUMA_X_SurfaceViewer_Create"};
01391    static int CallNum = 0;
01392    int ic = 0;
01393    char *vargv[1]={ "[A] SUMA" };
01394    int cargc = 1;
01395    SUMA_Boolean NewCreation = NOPE, Found, Inherit = NOPE;
01396    SUMA_Boolean LocalHead = NOPE;
01397    char slabel[20]; 
01398        
01399    SUMA_ENTRY;
01400 
01401    
01402    if (CallNum == 0) { 
01403       SUMAg_CF->N_OpenSV = 0;
01404       SUMAg_SVv[ic].X->TOPLEVEL = XtAppInitialize(&SUMAg_CF->X->App, "SUMA", NULL, 0, &cargc, vargv,
01405        SUMA_get_fallbackResources(), NULL, 0);
01406       SUMAg_SVv[ic].X->DPY = XtDisplay(SUMAg_SVv[ic].X->TOPLEVEL);
01407       
01408       SUMAg_CF->X->DPY_controller1 = SUMAg_SVv[ic].X->DPY;
01409       NewCreation = YUP;
01410       Inherit = NOPE;
01411    } else {
01412       ic = 0;
01413       Found = NOPE;
01414       while (ic < SUMA_MAX_SURF_VIEWERS && !Found) {
01415          if (!SUMAg_SVv[ic].Open) {
01416             Found = YUP;
01417          } else {
01418             ++ic;
01419          }
01420       }
01421       if (!Found) { 
01422          fprintf (SUMA_STDERR,"Error %s: Cannot open more than %d viewers.\n", FuncName, SUMA_MAX_SURF_VIEWERS);
01423          SUMA_RETURN (NOPE);
01424       }
01425       
01426       
01427       if (SUMAg_SVv[ic].X->TOPLEVEL == NULL) {
01428          
01429          SUMAg_SVv[ic].X->DPY = SUMAg_CF->X->DPY_controller1;
01430          SUMAg_SVv[ic].X->TOPLEVEL = XtVaAppCreateShell("SUMA" , "Suma" ,
01431                    topLevelShellWidgetClass , SUMAg_SVv[ic].X->DPY ,
01432                    XmNinitialResourcesPersistent , False ,
01433                    NULL ) ;
01434          NewCreation = YUP;
01435          Inherit = YUP;
01436       } else { 
01437          NewCreation = NOPE;
01438       }
01439    }
01440 
01441    if (NewCreation) { 
01442       
01443       XtAddEventHandler(SUMAg_SVv[ic].X->TOPLEVEL, StructureNotifyMask,
01444        False, SUMA_mapStateChanged, NULL);
01445       XtAddEventHandler(SUMAg_SVv[ic].X->TOPLEVEL, EnterWindowMask,
01446        False, SUMA_SetcSV, NULL);
01447       XtAddEventHandler(SUMAg_SVv[ic].X->TOPLEVEL, LeaveWindowMask,
01448        False, SUMA_unSetcSV, NULL); 
01449 
01450       
01451       if (!Inherit) {
01452          if (LocalHead) fprintf(stdout, "trying for cool double buffer visual\n");
01453          SUMAg_SVv[ic].X->VISINFO = glXChooseVisual(SUMAg_SVv[ic].X->DPY, DefaultScreen(SUMAg_SVv[ic].X->DPY), dblBuf);
01454          if (SUMAg_SVv[ic].X->VISINFO == NULL) {
01455          fprintf(stdout, "trying lame single buffer visual\n");
01456           XtAppWarning(SUMAg_CF->X->App, "trying lame single buffer visual");
01457           SUMAg_SVv[ic].X->VISINFO = glXChooseVisual(SUMAg_SVv[ic].X->DPY, DefaultScreen(SUMAg_SVv[ic].X->DPY), snglBuf);
01458           if (SUMAg_SVv[ic].X->VISINFO == NULL) {
01459             XtAppError(SUMAg_CF->X->App, "no good visual");
01460             SUMA_RETURN (NOPE);
01461             }
01462           SUMAg_SVv[ic].X->DOUBLEBUFFER = False;
01463          }
01464       } else {
01465          SUMA_LH("This is new. Inheriting");
01466          SUMAg_SVv[ic].X->VISINFO = SUMAg_SVv[0].X->VISINFO;
01467          SUMAg_SVv[ic].X->DOUBLEBUFFER = SUMAg_SVv[0].X->DOUBLEBUFFER;
01468       }
01469                 
01470       
01471          
01472          
01473          mainw = XmCreateMainWindow (SUMAg_SVv[ic].X->TOPLEVEL, "mainw", NULL, 0);
01474          XtManageChild (mainw);      
01475          
01476          menubar = XmCreateMenuBar (mainw, "menubar", NULL, 0);
01477          XtManageChild (menubar);
01478          
01479          
01480          SUMA_BuildMenuReset(0);
01481          SUMA_BuildMenu(menubar, XmMENU_PULLDOWN, 
01482                                  "File", 'F', YUP, File_menu, 
01483                                  (void *)ic, NULL, NULL,  
01484                                  SUMAg_SVv[ic].X->FileMenu );
01485          
01486          
01487          SUMA_BuildMenuReset(0);
01488          SUMA_BuildMenu(menubar, XmMENU_PULLDOWN, 
01489                                  "View", 'V', YUP, View_menu, 
01490                                  (void *)ic, NULL, NULL,  
01491                                  SUMAg_SVv[ic].X->ViewMenu );
01492          
01493          
01494          SUMA_BuildMenuReset(0);
01495          SUMA_BuildMenu(menubar, XmMENU_PULLDOWN, 
01496                                  "Tools", 'T', YUP, Tools_menu, 
01497                                  (void *)ic, NULL, NULL,  
01498                                  SUMAg_SVv[ic].X->ToolsMenu );
01499          
01500          
01501          SUMA_BuildMenuReset(0);
01502          SUMA_BuildMenu(menubar, XmMENU_PULLDOWN, 
01503                                  "Help", 'H', YUP, Help_menu,
01504                                  (void *)ic, NULL, NULL,  
01505                                  SUMAg_SVv[ic].X->HelpMenu );
01506          
01507          XtVaSetValues (menubar, XmNmenuHelpWidget, SUMAg_SVv[ic].X->HelpMenu[SW_Help], NULL);
01508                                  
01509          
01510          XmToggleButtonSetState (SUMAg_SVv[ic].X->ViewMenu[SW_ViewCrossHair], 
01511             SUMAg_SVv[ic].ShowCrossHair, NOPE);
01512          
01513          XmToggleButtonSetState (SUMAg_SVv[ic].X->HelpMenu[SW_HelpMemTrace], 
01514             SUMAg_CF->MemTrace, NOPE);
01515          if (SUMAg_CF->MemTrace) {  XtSetSensitive (SUMAg_SVv[ic].X->HelpMenu[SW_HelpMemTrace], 0); }
01516 
01517          XmToggleButtonSetState (SUMAg_SVv[ic].X->HelpMenu[SW_HelpIONotify], 
01518             SUMAg_CF->InOut_Notify, NOPE);
01519          
01520  
01521          
01522       #ifdef SUMA_MOTIF_GLXAREA
01523         
01524         SUMAg_SVv[ic].X->FORM = XmCreateForm(SUMAg_SVv[ic].X->TOPLEVEL, "form", NULL, 0);
01525         XtManageChild(SUMAg_SVv[ic].X->FORM);
01526         SUMAg_SVv[ic].X->FRAME = XmCreateFrame(SUMAg_SVv[ic].X->FORM, "frame", NULL, 0);
01527         XtVaSetValues(SUMAg_SVv[ic].X->FRAME,
01528           XmNbottomAttachment, XmATTACH_FORM,
01529           XmNtopAttachment, XmATTACH_FORM,
01530           XmNleftAttachment, XmATTACH_FORM,
01531           XmNrightAttachment, XmATTACH_FORM,
01532           NULL);
01533         XtManageChild(SUMAg_SVv[ic].X->FRAME);
01534 
01535         
01536         SUMAg_SVv[ic].X->CMAP = SUMA_getShareableColormap(&(SUMAg_SVv[ic]));
01537 
01538         
01539          
01540          SUMAg_SVv[ic].X->GLXAREA = XtVaCreateManagedWidget("glxarea",
01541           glwMDrawingAreaWidgetClass, SUMAg_SVv[ic].X->FRAME,
01542           GLwNvisualInfo, SUMAg_SVv[ic].X->VISINFO,
01543           XtNcolormap, SUMAg_SVv[ic].X->CMAP,
01544           NULL);
01545       #else
01546       
01547          SUMAg_SVv[ic].X->CMAP = SUMA_getShareableColormap(&(SUMAg_SVv[ic]));
01548 
01549          
01550          SUMAg_SVv[ic].X->FRAME  = XmCreateFrame (mainw, "frame", NULL, 0);
01551          XtManageChild(SUMAg_SVv[ic].X->FRAME);
01552 
01553          
01554          SUMAg_SVv[ic].X->GLXAREA = XtVaCreateManagedWidget("glxarea",
01555           glwDrawingAreaWidgetClass, SUMAg_SVv[ic].X->FRAME,
01556           GLwNvisualInfo, SUMAg_SVv[ic].X->VISINFO,
01557           XtNcolormap, SUMAg_SVv[ic].X->CMAP,
01558           NULL);
01559       
01560       #endif
01561 
01562           
01563       
01564       XtAddCallback(SUMAg_SVv[ic].X->GLXAREA, GLwNginitCallback, SUMA_graphicsInit, NULL);
01565       XtAddCallback(SUMAg_SVv[ic].X->GLXAREA, GLwNexposeCallback, SUMA_expose, NULL);
01566       XtAddCallback(SUMAg_SVv[ic].X->GLXAREA, GLwNresizeCallback, SUMA_resize, NULL);
01567       XtAddCallback(SUMAg_SVv[ic].X->GLXAREA, GLwNinputCallback, SUMA_input, NULL);
01568 
01569       
01570       
01571       
01572        XtVaSetValues( SUMAg_SVv[ic].X->TOPLEVEL,
01573            XmNdeleteResponse, XmDO_NOTHING,
01574            NULL);      
01575          
01576       XmAddWMProtocolCallback(           
01577            SUMAg_SVv[ic].X->TOPLEVEL,
01578            XmInternAtom( SUMAg_SVv[ic].X->DPY , "WM_DELETE_WINDOW" , False ) ,
01579            SUMA_ButtClose_pushed , NULL ) ;
01580            
01581       
01582       XtRealizeWidget(SUMAg_SVv[ic].X->TOPLEVEL);
01583       
01584       
01585       {  
01586          XGCValues gcv; 
01587          gcv.foreground = BlackPixelOfScreen (XtScreen (SUMAg_SVv[ic].X->GLXAREA));
01588          SUMAg_SVv[ic].X->gc = XCreateGC (SUMAg_SVv[ic].X->DPY,
01589                                           XtWindow (SUMAg_SVv[ic].X->GLXAREA), 
01590                                           GCForeground, &gcv);
01591          SUMA_SetSVForegroundColor (&SUMAg_SVv[ic], "Green");
01592 
01593       }
01594       
01595       SUMAg_N_SVv += 1;
01596              
01597    } else { 
01598       
01599       #ifdef SUMA_USE_WITHDRAW
01600          XMapRaised(SUMAg_SVv[ic].X->DPY, XtWindow(SUMAg_SVv[ic].X->TOPLEVEL));      
01601       #endif
01602       
01603       
01604       SUMA_register_workproc( SUMA_handleRedisplay, SUMAg_SVv[ic].X->GLXAREA );
01605       SUMAg_SVv[ic].X->REDISPLAYPENDING = 0;
01606    }
01607 
01608    SUMAg_SVv[ic].Open = YUP;
01609    ++SUMAg_CF->N_OpenSV;
01610    ++CallNum;
01611    
01612    SUMA_UpdateViewerCursor (&(SUMAg_SVv[ic]));
01613    SUMA_UpdateViewerTitle (&(SUMAg_SVv[ic]));
01614 
01615    SUMA_RETURN (YUP);
01616 }
01617 
01618 void SUMA_ButtOpen_pushed (Widget w, XtPointer cd1, XtPointer cd2)
01619 {
01620    static char FuncName[]={"SUMA_ButtOpen_pushed"};
01621    
01622    SUMA_ENTRY;
01623 
01624    if (!SUMA_X_SurfaceViewer_Create ()) {
01625       fprintf (SUMA_STDERR,"Error %s: Failed in SUMA_X_SurfaceViewer_Create.\n", FuncName);
01626    } 
01627    SUMA_RETURNe;
01628 }
01629 
01630 void SUMA_cb_FileOpenSpec (Widget w, XtPointer data, XtPointer calldata) 
01631 {
01632    static char FuncName[]={"SUMA_cb_FileOpenSpec"};
01633    
01634    SUMA_ENTRY;
01635    
01636    fprintf (SUMA_STDERR, "%s: called.\n", FuncName);
01637    SUMA_RETURNe;
01638 }
01639 
01640 void SUMA_cb_FileOpenSurf (Widget w, XtPointer data, XtPointer calldata) 
01641 {
01642    static char FuncName[]={"SUMA_cb_FileOpenSurf"};
01643    
01644    SUMA_ENTRY;
01645    
01646    fprintf (SUMA_STDERR, "%s: called.\n", FuncName);
01647    SUMA_RETURNe;
01648 }
01649 
01650 void SUMA_cb_FileSaveView (Widget w, XtPointer data, XtPointer calldata) 
01651 {
01652    static char FuncName[]={"SUMA_cb_FileSaveView"};
01653    int isv, widtype;
01654    SUMA_EngineData *ED = NULL; 
01655    DList *list = NULL;
01656    SUMA_SurfaceViewer *sv;
01657    
01658    SUMA_ENTRY;
01659    
01660    
01661    SUMA_VIEWER_FROM_FILEMENU_CALLBACK(data, isv, widtype);
01662    if (widtype != SW_FileSaveView) {
01663       fprintf (SUMA_STDERR, "Error %s: Something really bad has happened.\n", FuncName);
01664       SUMA_RETURNe;
01665    }   
01666 
01667    sv = &SUMAg_SVv[isv];
01668    
01669    if (!list) list = SUMA_CreateList();
01670    ED = SUMA_InitializeEngineListData (SE_SaveViewFileSelection);
01671    if (!SUMA_RegisterEngineListCommand (  list, ED,
01672                                           SEF_ip, sv->X->TOPLEVEL,
01673                                           SES_Suma, (void *)sv, NOPE,
01674                                           SEI_Head, NULL)) {
01675       fprintf (SUMA_STDERR, "Error %s: Failed to register command.\n", FuncName);
01676    }
01677    if (!SUMA_Engine (&list)) {
01678       fprintf(SUMA_STDERR, "Error %s: SUMA_Engine call failed.\n", FuncName);
01679    }
01680    
01681    
01682 
01683 
01684 
01685 
01686 
01687    
01688    SUMA_RETURNe;
01689 }
01690 
01691 void SUMA_cb_FileLoadView (Widget w, XtPointer data, XtPointer calldata) 
01692 {
01693    static char FuncName[]={"SUMA_cb_FileLoadView"};
01694    int isv, widtype;
01695    SUMA_EngineData *ED = NULL; 
01696    DList *list = NULL;
01697    SUMA_SurfaceViewer *sv;
01698    
01699    SUMA_ENTRY;
01700    
01701    
01702    SUMA_VIEWER_FROM_FILEMENU_CALLBACK(data, isv, widtype);
01703    if (widtype != SW_FileLoadView) {
01704       fprintf (SUMA_STDERR, "Error %s: Something really bad has happened.\n", FuncName);
01705       SUMA_RETURNe;
01706    }   
01707 
01708    sv = &SUMAg_SVv[isv];
01709    
01710    if (!list) list = SUMA_CreateList();
01711    ED = SUMA_InitializeEngineListData (SE_LoadViewFileSelection);
01712    if (!SUMA_RegisterEngineListCommand (  list, ED,
01713                                           SEF_ip, sv->X->TOPLEVEL,
01714                                           SES_Suma, (void *)sv, NOPE,
01715                                           SEI_Head, NULL)) {
01716       fprintf (SUMA_STDERR, "Error %s: Failed to register command.\n", FuncName);
01717    }
01718    if (!SUMA_Engine (&list)) {
01719       fprintf(SUMA_STDERR, "Error %s: SUMA_Engine call failed.\n", FuncName);
01720    }
01721    
01722    
01723 
01724 
01725 
01726 
01727 
01728    
01729    SUMA_RETURNe;
01730 }
01731 
01732 
01733 void SUMA_cb_FileClose (Widget w, XtPointer data, XtPointer calldata) 
01734 {
01735    static char FuncName[]={"SUMA_cb_FileClose"};
01736    int isv, widtype;
01737    SUMA_SurfaceViewer *sv;
01738    
01739    SUMA_ENTRY;
01740    
01741    
01742    SUMA_VIEWER_FROM_FILEMENU_CALLBACK(data, isv, widtype);
01743    if (widtype != SW_FileClose) {
01744       fprintf (SUMA_STDERR, "Error %s: Something really bad has happened.\n", FuncName);
01745       SUMA_RETURNe;
01746    }   
01747 
01748    sv = &SUMAg_SVv[isv];
01749    SUMA_ButtClose_pushed (sv->X->GLXAREA, data, calldata);
01750       
01751    SUMA_RETURNe;
01752 }
01753 
01754 
01755 
01756 
01757 
01758 void SUMA_ButtClose_pushed (Widget w, XtPointer cd1, XtPointer cd2)
01759 {
01760    static char FuncName[]={"SUMA_ButtClose_pushed"};
01761    int ic, Found;
01762    SUMA_Boolean LocalHead = NOPE;
01763    
01764    SUMA_ENTRY;
01765 
01766    SUMA_LH("Called");
01767    ic = 0;
01768    Found = 0;
01769    while (ic < SUMA_MAX_SURF_VIEWERS && !Found) {
01770       #if 0 
01771       
01772       if (SUMAg_SVv[ic].X->ButtClose == w) {
01773          if (LocalHead) fprintf (SUMA_STDERR,"%s: Close order from button.\n", FuncName);
01774          Found = 1;
01775       }
01776       #endif
01777       if (SUMAg_SVv[ic].X->TOPLEVEL == w) {
01778          if (LocalHead) fprintf (SUMA_STDERR,"%s: Close order from window manager.\n", FuncName);
01779          Found = 1;
01780       }else if (SUMAg_SVv[ic].X->GLXAREA == w) { 
01781          if (LocalHead) fprintf (SUMA_STDERR,"%s: Close order from GLX area.\n", FuncName);
01782          Found = 1;
01783       }
01784       
01785       if (!Found) ++ic;
01786    }
01787    
01788    if (Found) {
01789          if (LocalHead) fprintf (SUMA_STDERR,"%s: Widget Found\n", FuncName);
01790          
01791          
01792          
01793          if (LocalHead) fprintf (SUMA_STDERR,"%s: Turning off workprocesses and timeouts ...\n", FuncName);
01794          if (SUMAg_SVv[ic].GVS[SUMAg_SVv[ic].StdView].ApplyMomentum) {
01795             if (SUMAg_SVv[ic].X->MOMENTUMID) XtRemoveTimeOut(SUMAg_SVv[ic].X->MOMENTUMID); 
01796             SUMAg_SVv[ic].X->MOMENTUMID = 0;
01797          }
01798          
01799          
01800          SUMA_remove_workproc2( SUMA_handleRedisplay, SUMAg_SVv[ic].X->GLXAREA );
01801          
01802          
01803          if (SUMAg_SVv[ic].X->DOUBLEBUFFER)
01804              glXSwapBuffers(SUMAg_SVv[ic].X->DPY, XtWindow(SUMAg_SVv[ic].X->GLXAREA));
01805           else
01806             glFlush();
01807          
01808          
01809          
01810 
01811 
01812 
01813 
01814 
01815          #ifdef SUMA_USE_WITHDRAW 
01816             if (LocalHead) fprintf (SUMA_STDERR,"%s: Withdrawing it.\n", FuncName);
01817             XWithdrawWindow(SUMAg_SVv[ic].X->DPY, 
01818                XtWindow(SUMAg_SVv[ic].X->TOPLEVEL), 
01819                XScreenNumberOfScreen(XtScreen(SUMAg_SVv[ic].X->TOPLEVEL)));
01820             if (SUMAg_SVv[ic].X->ViewCont->TopLevelShell) {
01821                XWithdrawWindow(SUMAg_SVv[ic].X->DPY, 
01822                XtWindow(SUMAg_SVv[ic].X->ViewCont->TopLevelShell),
01823                XScreenNumberOfScreen(XtScreen(SUMAg_SVv[ic].X->ViewCont->TopLevelShell)));
01824             }
01825          #endif
01826          #ifdef SUMA_USE_DESTROY 
01827             if (LocalHead) fprintf (SUMA_STDERR,"%s: Destroying it.\n", FuncName);
01828             XtDestroyWidget(SUMAg_SVv[ic].X->TOPLEVEL);
01829             SUMAg_SVv[ic].X->TOPLEVEL = NULL;      
01830             
01831             
01832             SUMAg_SVv[ic].X->ViewCont->TopLevelShell = NULL;
01833             
01834             
01835             SUMAg_N_SVv -= 1;
01836 
01837          #endif
01838 
01839          SUMAg_SVv[ic].Open = NOPE;
01840          --SUMAg_CF->N_OpenSV;
01841          if (SUMAg_CF->N_OpenSV == 0) {
01842             if (LocalHead) fprintf (SUMA_STDERR,"%s: No more viewers, exiting.\n", FuncName);
01843             
01844             if (SUMAg_CF->X->SumaCont->AppShell) {
01845                XtDestroyWidget(SUMAg_CF->X->SumaCont->AppShell);
01846             }
01847             exit(0);
01848          }
01849    } else {
01850       fprintf (SUMA_STDERR,"Error %s: Widget not Found!.\n", FuncName);
01851    }
01852    
01853     SUMA_RETURNe;
01854 }
01855 
01856 Colormap SUMA_getShareableColormap_Eng (XVisualInfo * vi, Display *dpy) 
01857 {
01858    Status status;
01859    XStandardColormap *standardCmaps;
01860    int i, numCmaps;
01861    Colormap cmap;
01862    SUMA_Boolean LocalHead = NOPE;
01863    static char FuncName[]={"SUMA_getShareableColormap_Eng"};
01864    
01865    SUMA_ENTRY;
01866 
01867    
01868 #if defined(__cplusplus) || defined(c_plusplus)
01869    if (vi->c_class != TrueColor) {
01870       SUMA_S_Crit("SUMA has no support for non-TrueColor visual");
01871       exit(1);
01872    }
01873 #else 
01874    if (vi->class != TrueColor) {
01875       SUMA_S_Crit("SUMA has no no support for non-TrueColor visual");
01876       exit(1);
01877    }
01878 #endif
01879 
01880    
01881 
01882    status = XmuLookupStandardColormap(dpy, vi->screen, vi->visualid,
01883     vi->depth, XA_RGB_DEFAULT_MAP,
01884     False,              
01885     True);              
01886    if (status == 1) {
01887     status = XGetRGBColormaps(dpy, RootWindow(dpy, vi->screen),
01888       &standardCmaps, &numCmaps, XA_RGB_DEFAULT_MAP);
01889     if (status == 1)
01890       for (i = 0; i < numCmaps; i++)
01891         if (standardCmaps[i].visualid == vi->visualid) {
01892           cmap = standardCmaps[i].colormap;
01893           XFree(standardCmaps);
01894           SUMA_RETURN(cmap);
01895         }
01896    }
01897   cmap = XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual, AllocNone);
01898 
01899   SUMA_RETURN(cmap);
01900 
01901 }
01902 Colormap
01903 SUMA_getShareableColormap(SUMA_SurfaceViewer *csv)
01904 {
01905    SUMA_Boolean LocalHead = NOPE;
01906    static char FuncName[]={"SUMA_getShareableColormap"};
01907    
01908    SUMA_ENTRY;
01909 
01910    SUMA_RETURN(SUMA_getShareableColormap_Eng(csv->X->VISINFO, csv->X->DPY));
01911 }
01912 
01913 void SUMA_SetcSV (Widget w, XtPointer clientData, XEvent * event, Boolean * cont)
01914 {
01915    static char FuncName[]={"SUMA_SetcSV"};
01916    SUMA_SurfaceViewer *sv;
01917    int isv;
01918    SUMA_Boolean LocalHead = NOPE;
01919    
01920    SUMA_ENTRY;
01921    
01922    if (LocalHead) fprintf(SUMA_STDERR,"%s:\n Called, w = %p\n", FuncName, w);
01923    
01924 
01925    
01926    SUMA_ANY_WIDGET2SV(w, sv, isv);
01927    if (isv < 0) {
01928       fprintf (SUMA_STDERR, "Error %s: Failed in macro SUMA_ANY_WIDGET2SV.\n", FuncName);
01929       SUMA_RETURNe;
01930    }
01931 
01932    #ifdef DARWIN
01933       
01934 
01935 
01936 
01937 
01938       
01939 
01940 
01941 
01942 
01943 
01944 
01945 
01946 
01947 
01948 
01949 
01950 
01951 
01952       XSetInputFocus(sv->X->DPY, XtWindow(w), RevertToPointerRoot, CurrentTime);
01953    #endif
01954 
01955    sv->rdc = SUMA_RDC_X_ENTER_WINDOW;
01956    
01957    if (LocalHead) fprintf (SUMA_STDERR, "%s: in Surface Viewer #%d.\n", FuncName, isv);
01958    sv->ResetGLStateVariables = YUP;  
01959 
01960    SUMA_postRedisplay(w, clientData, NULL);
01961 
01962    
01963    SUMA_RETURNe;
01964 }
01965 
01966 void SUMA_unSetcSV (Widget w, XtPointer clientData, XEvent * event, Boolean * cont)
01967 {
01968    static char FuncName[]={"SUMA_unSetcSV"};
01969    
01970    SUMA_ENTRY;
01971    SUMA_RETURNe;
01972 }
01973 
01974 
01975 
01976 
01977 
01978 
01979 
01980 
01981 
01982 
01983 
01984 
01985 
01986 
01987 
01988 
01989 
01990 int
01991 SUMA_generateEPS(char *filename, int inColor, unsigned int width, unsigned int height)
01992 {
01993    FILE *fp;
01994    GLvoid *pixels;
01995    unsigned char *curpix;
01996    int components, pos, i;
01997    static char FuncName[]={"SUMA_generateEPS"};
01998    
01999    SUMA_ENTRY;
02000 
02001    pixels = SUMA_grabPixels(inColor, width, height);
02002    
02003    if (pixels == NULL)
02004     SUMA_RETURN (1);
02005    if (inColor)
02006     components = 3;     
02007    else
02008     components = 1;     
02009 
02010    fp = fopen(filename, "w");
02011    if (fp == NULL) {
02012     SUMA_RETURN (2);
02013    }
02014    fprintf(fp, "%%!PS-Adobe-2.0 EPSF-1.2\n");
02015    fprintf(fp, "%%%%Creator: OpenGL pixmap render output\n");
02016    fprintf(fp, "%%%%BoundingBox: 0 0 %d %d\n", width, height);
02017    fprintf(fp, "%%%%EndComments\n");
02018    fprintf(fp, "gsave\n");
02019    fprintf(fp, "/bwproc {\n");
02020    fprintf(fp, "    rgbproc\n");
02021    fprintf(fp, "    dup length 3 idiv string 0 3 0\n");
02022    fprintf(fp, "    5 -1 roll {\n");
02023    fprintf(fp, "    add 2 1 roll 1 sub dup 0 eq\n");
02024    fprintf(fp, "    { pop 3 idiv 3 -1 roll dup 4 -1 roll dup\n");
02025    fprintf(fp, "        3 1 roll 5 -1 roll put 1 add 3 0 }\n");
02026    fprintf(fp, "    { 2 1 roll } ifelse\n");
02027    fprintf(fp, "    } forall\n");
02028    fprintf(fp, "    pop pop pop\n");
02029    fprintf(fp, "} def\n");
02030    fprintf(fp, "systemdict /colorimage known not {\n");
02031    fprintf(fp, "    /colorimage {\n");
02032    fprintf(fp, "        pop\n");
02033    fprintf(fp, "        pop\n");
02034    fprintf(fp, "        /rgbproc exch def\n");
02035    fprintf(fp, "        { bwproc } image\n");
02036    fprintf(fp, "    } def\n");
02037    fprintf(fp, "} if\n");
02038    fprintf(fp, "/picstr %d string def\n", width * components);
02039    fprintf(fp, "%d %d scale\n", width, height);
02040    fprintf(fp, "%d %d %d\n", width, height, 8);
02041    fprintf(fp, "[%d 0 0 %d 0 0]\n", width, height);
02042    fprintf(fp, "{currentfile picstr readhexstring pop}\n");
02043    fprintf(fp, "false %d\n", components);
02044    fprintf(fp, "colorimage\n");
02045 
02046    curpix = (unsigned char *) pixels;
02047    pos = 0;
02048    for (i = width * height * components; i > 0; i--) {
02049     fprintf(fp, "%02hx", *curpix++);
02050     if (++pos >= 32) {
02051       fprintf(fp, "\n");
02052       pos = 0;
02053     }
02054    }
02055    if (pos)
02056     fprintf(fp, "\n");
02057 
02058    fprintf(fp, "grestore\n");
02059    SUMA_free(pixels);
02060    fclose(fp);
02061    SUMA_RETURN (0);
02062 }
02063 
02064 GLvoid *
02065 SUMA_grabPixels(int inColor, unsigned int width, unsigned int height)
02066 {
02067    GLvoid *buffer;
02068    GLint swapbytes, lsbfirst, rowlength;
02069    GLint skiprows, skippixels, alignment;
02070    GLenum format;
02071    unsigned int size;
02072    static char FuncName[]={"SUMA_grabPixels"};
02073 
02074    SUMA_ENTRY;
02075    
02076    if (inColor) {
02077     format = GL_RGB;
02078     size = width * height * 3;
02079    } else {
02080     format = GL_LUMINANCE;
02081     size = width * height * 1;
02082    }
02083 
02084    buffer = (GLvoid *) SUMA_malloc(size);
02085    if (buffer == NULL)
02086     SUMA_RETURN (buffer);
02087 
02088    
02089    glGetIntegerv(GL_PACK_SWAP_BYTES, &swapbytes);
02090    glGetIntegerv(GL_PACK_LSB_FIRST, &lsbfirst);
02091    glGetIntegerv(GL_PACK_ROW_LENGTH, &rowlength);
02092    glGetIntegerv(GL_PACK_SKIP_ROWS, &skiprows);
02093    glGetIntegerv(GL_PACK_SKIP_PIXELS, &skippixels);
02094    glGetIntegerv(GL_PACK_ALIGNMENT, &alignment);
02095    
02096 
02097 
02098 
02099    glPixelStorei(GL_PACK_SWAP_BYTES, GL_TRUE);
02100    glPixelStorei(GL_PACK_LSB_FIRST, GL_TRUE);
02101    glPixelStorei(GL_PACK_ROW_LENGTH, 0);
02102    glPixelStorei(GL_PACK_SKIP_ROWS, 0);
02103    glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
02104    glPixelStorei(GL_PACK_ALIGNMENT, 1);
02105 
02106    
02107    glReadPixels(0, 0, width, height, format,
02108     GL_UNSIGNED_BYTE, (GLvoid *) buffer);
02109 
02110    
02111    glPixelStorei(GL_PACK_SWAP_BYTES, swapbytes);
02112    glPixelStorei(GL_PACK_LSB_FIRST, lsbfirst);
02113    glPixelStorei(GL_PACK_ROW_LENGTH, rowlength);
02114    glPixelStorei(GL_PACK_SKIP_ROWS, skiprows);
02115    glPixelStorei(GL_PACK_SKIP_PIXELS, skippixels);
02116    glPixelStorei(GL_PACK_ALIGNMENT, alignment);
02117    SUMA_RETURN (buffer);
02118 }
02119  
02120 
02121 SUMA_Boolean SUMA_RenderToPixMap (SUMA_SurfaceViewer *csv, SUMA_DO *dov) 
02122 {
02123    static int configuration[] = { GLX_DOUBLEBUFFER, GLX_RGBA, GLX_DEPTH_SIZE, 16,
02124    GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, None};
02125    Display *dpy;
02126    XVisualInfo *vi;
02127    GLXContext cx;
02128    Pixmap pmap;
02129    GLXPixmap glxpmap;
02130    static char FuncName[]={"SUMA_RenderToPixMap"};
02131 
02132    SUMA_ENTRY;
02133 
02134    dpy = XOpenDisplay(NULL);
02135    if (dpy == NULL)
02136     fprintf(SUMA_STDERR,"Error %s: could not open display", FuncName);
02137 
02138    if (!glXQueryExtension(dpy, NULL, NULL))
02139     fprintf(SUMA_STDERR,"Error %s: X server has no OpenGL GLX extension", FuncName);
02140 
02141    
02142    #if 1  
02143    vi = glXChooseVisual(dpy, DefaultScreen(dpy), &configuration[1]);
02144    if (vi == NULL) {
02145    
02146     vi = glXChooseVisual(dpy, DefaultScreen(dpy), &configuration[0]);
02147     if (vi == NULL) {
02148       fprintf(SUMA_STDERR,"Error %s: no appropriate RGB visual with depth buffer", FuncName);
02149     }
02150    }
02151    #else
02152    vi = csv->X->VISINFO;
02153    #endif
02154 
02155 
02156    
02157    cx = glXCreateContext(dpy, vi,
02158     NULL,               
02159     False);             
02160    if (cx == NULL)
02161     fprintf(SUMA_STDERR,"Error %s: could not create rendering context", FuncName);
02162 
02163    pmap = XCreatePixmap(dpy, RootWindow(dpy, vi->screen),
02164     csv->X->WIDTH, csv->X->HEIGHT, vi->depth);
02165    glxpmap = glXCreateGLXPixmap(dpy, vi, pmap);
02166    if (!glXMakeCurrent(dpy, glxpmap, cx)) {
02167       fprintf (SUMA_STDERR, "Error %s: Failed in glXMakeCurrent.\n \tContinuing ...\n", FuncName);
02168    }
02169 
02170    SUMA_context_Init(csv);
02171    glViewport(0, 0, csv->X->WIDTH, csv->X->HEIGHT);
02172    SUMA_display(csv, dov);
02173 
02174    glFinish (); 
02175 
02176    
02177    {
02178         char tmpprfx[100], *padprfx, *padname;
02179       int cntindx=0;
02180       SUMA_SurfaceObject *SO;
02181       SUMA_Boolean OKname = NOPE;
02182       
02183       
02184       if (csv->Focus_SO_ID >= 0) {
02185          SO = (SUMA_SurfaceObject *)(SUMAg_DOv[csv->Focus_SO_ID].OP);
02186       }else {
02187          SO = NULL;
02188       }
02189       
02190       if (!SO){
02191          padname = (char *)SUMA_calloc(100, sizeof(char));
02192       }else {
02193          if (!SO->Label) { 
02194             padname = (char *)SUMA_calloc(100, sizeof(char));
02195          } else {
02196             padname = (char *)SUMA_calloc(strlen(SO->Label)+10, sizeof(char));
02197          }
02198       }
02199       while (!OKname) {
02200          sprintf (tmpprfx, "%d", cntindx);
02201          padprfx = SUMA_pad_str (tmpprfx, '0', 4, 0);
02202          if (!SO) {
02203             sprintf(padname,"suma_img%s.eps", padprfx);
02204          }else {
02205             sprintf(padname,"%s_%s.eps", SO->Label, padprfx);
02206          }
02207          if (SUMA_filexists(padname)) {
02208             ++cntindx;
02209          } else { OKname = YUP; }
02210 
02211          SUMA_free(padprfx);
02212       }
02213 
02214      fprintf (SUMA_STDOUT,"%s: Writing image to %s ...", FuncName, padname);
02215      SUMA_generateEPS(padname,  1, csv->X->WIDTH, csv->X->HEIGHT);
02216      fprintf (SUMA_STDOUT,"Done.\n");
02217      SUMA_free(padname);
02218    }
02219 
02220    
02221    if (!glXMakeCurrent(XtDisplay(csv->X->GLXAREA), XtWindow(csv->X->GLXAREA),  csv->X->GLXCONTEXT)) {
02222       fprintf (SUMA_STDERR, "Error %s: Failed in glXMakeCurrent.\n \tContinuing ...\n", FuncName);   
02223    }
02224 
02225    SUMA_RETURN (YUP);
02226 }
02227 
02228 
02229 
02230 
02231 
02232 
02233 
02234 
02235 
02236 
02237 SUMA_Boolean SUMA_World2ScreenCoords (SUMA_SurfaceViewer *sv, int N_List, double *WorldList, 
02238                               double *ScreenList, int *Quad, SUMA_Boolean ApplyXform)
02239 {
02240    static char FuncName[]={"SUMA_World2ScreenCoords"};
02241    GLfloat rotationMatrix[4][4];
02242    GLint viewport[4];
02243    GLdouble mvmatrix[16], projmatrix[16];
02244    int i, i3;
02245    char CommString[100];
02246    SUMA_Boolean LocalHead = NOPE;
02247    
02248    SUMA_ENTRY;
02249    
02250    if (LocalHead) {
02251       fprintf (SUMA_STDERR, "%s: Current Quat: %.4f, %.4f, %.4f, %.4f.\n", \
02252        FuncName, sv->GVS[sv->StdView].currentQuat[0], sv->GVS[sv->StdView].currentQuat[1], \
02253        sv->GVS[sv->StdView].currentQuat[2],sv->GVS[sv->StdView].currentQuat[3]);
02254       fprintf (SUMA_STDERR, "%s: Translation Vector of view #%d: %.4f, %.4f, %.4f\n", \
02255          FuncName, sv->StdView, sv->GVS[sv->StdView].translateVec[0], sv->GVS[sv->StdView].translateVec[1], \
02256          sv->GVS[sv->StdView].translateVec[2]);
02257       fprintf (SUMA_STDERR, "%s: RotaCenter of view #%d: %.4f, %.4f, %.4f\n", \
02258          FuncName, sv->StdView, sv->GVS[sv->StdView].RotaCenter[0], sv->GVS[sv->StdView].RotaCenter[1], \
02259          sv->GVS[sv->StdView].RotaCenter[2]);
02260    }
02261       
02262    
02263    if (ApplyXform) {
02264       
02265 
02266       SUMA_build_rotmatrix(rotationMatrix, sv->GVS[sv->StdView].currentQuat);
02267       glMatrixMode(GL_MODELVIEW);
02268       
02269 
02270 
02271 
02272 
02273   
02274          glGetDoublev(GL_MODELVIEW_MATRIX, mvmatrix);
02275          if (LocalHead) {
02276             int itmp = 0;
02277             fprintf (SUMA_STDERR, "%s: Initial Modelview:\nMV=[ ", FuncName);
02278             while (itmp < 16) { fprintf (SUMA_STDERR, "%.4f, ", mvmatrix[itmp]); ++itmp;}
02279             fprintf (SUMA_STDERR, "]\n");
02280          }
02281       glPushMatrix();
02282       glTranslatef (sv->GVS[sv->StdView].translateVec[0], sv->GVS[sv->StdView].translateVec[1], 0.0);
02283       glTranslatef (sv->GVS[sv->StdView].RotaCenter[0], sv->GVS[sv->StdView].RotaCenter[1], sv->GVS[sv->StdView].RotaCenter[2]);
02284       glMultMatrixf(&rotationMatrix[0][0]);
02285          glGetDoublev(GL_MODELVIEW_MATRIX, mvmatrix);
02286          if (LocalHead) {
02287             int itmp = 0;
02288             fprintf (SUMA_STDERR, "%s: Modelview After Translation & Rotation:\nMVtr=[ ", FuncName);
02289             while (itmp < 16) { fprintf (SUMA_STDERR, "%.4f, ", mvmatrix[itmp]); ++itmp;}
02290             fprintf (SUMA_STDERR, "]\n");
02291          }
02292       glTranslatef (-sv->GVS[sv->StdView].RotaCenter[0], -sv->GVS[sv->StdView].RotaCenter[1], -sv->GVS[sv->StdView].RotaCenter[2]);
02293    } 
02294    glGetIntegerv(GL_VIEWPORT, viewport);
02295    glGetDoublev(GL_MODELVIEW_MATRIX, mvmatrix);
02296    glGetDoublev(GL_PROJECTION_MATRIX, projmatrix);
02297    
02298    for (i=0;i<N_List; ++i) {
02299       i3 = 3*i;
02300       gluProject( (GLdouble)WorldList[i3], (GLdouble)WorldList[i3+1], (GLdouble)WorldList[i3+2],  
02301                   mvmatrix, projmatrix, viewport, \
02302                   (GLdouble*)(&(ScreenList[i3])), (GLdouble*)(&(ScreenList[i3+1])), (GLdouble*)(&(ScreenList[i3+2])) );
02303       ScreenList[i3+1] = viewport[3] - ScreenList[i3+1] - 1; 
02304       if (ScreenList[i3] < sv->WindWidth/2) {
02305          if (ScreenList[i3+1] > sv->WindHeight/2) Quad[i] = SUMA_LOWER_LEFT_SCREEN;
02306          else Quad[i] = SUMA_UPPER_LEFT_SCREEN;
02307       } else {
02308          if (ScreenList[i3+1] > sv->WindHeight/2) Quad[i] = SUMA_LOWER_RIGHT_SCREEN;
02309          else Quad[i] = SUMA_UPPER_RIGHT_SCREEN;
02310       }
02311       if (LocalHead) fprintf (SUMA_STDOUT, "%s: World: [%.2f %.2f %.2f] \t Screen [%.2f %.2f %.2f] \t Quad %d\n", 
02312                               FuncName, WorldList[i3],WorldList[i3+1], WorldList[i3+2], 
02313                               ScreenList[i3], ScreenList[i3+1],ScreenList[i3+2], Quad[i]);
02314    
02315    }
02316 
02317    if (ApplyXform) glPopMatrix();
02318 
02319    SUMA_RETURN (YUP);
02320 }
02321 
02322 
02323 
02324 
02325 
02326 
02327 
02328 
02329 
02330 
02331 
02332 
02333 
02334 
02335 
02336 
02337 
02338 
02339 SUMA_Boolean SUMA_GetSelectionLine (SUMA_SurfaceViewer *sv, int x, int y, GLdouble *Pick0, GLdouble *Pick1, 
02340                                     int N_List, int *xList, int *yList, GLdouble *Pick0List)
02341 {
02342    static char FuncName[]={"SUMA_GetSelectionLine"};
02343    GLfloat rotationMatrix[4][4];
02344    GLint viewport[4];
02345    GLdouble mvmatrix[16], projmatrix[16];
02346    GLint realy; 
02347    char CommString[100];
02348    SUMA_Boolean LocalHead = NOPE;
02349    
02350    SUMA_ENTRY;
02351    
02352    
02353    
02354    if (LocalHead) {
02355       fprintf (SUMA_STDERR, "%s: Current Quat: %.4f, %.4f, %.4f, %.4f.\n", \
02356        FuncName, sv->GVS[sv->StdView].currentQuat[0], sv->GVS[sv->StdView].currentQuat[1], \
02357        sv->GVS[sv->StdView].currentQuat[2],sv->GVS[sv->StdView].currentQuat[3]);
02358       fprintf (SUMA_STDERR, "%s: Translation Vector of view #%d: %.4f, %.4f, %.4f\n", \
02359          FuncName, sv->StdView, sv->GVS[sv->StdView].translateVec[0], sv->GVS[sv->StdView].translateVec[1], \
02360          sv->GVS[sv->StdView].translateVec[2]);
02361       fprintf (SUMA_STDERR, "%s: RotaCenter of view #%d: %.4f, %.4f, %.4f\n", \
02362          FuncName, sv->StdView, sv->GVS[sv->StdView].RotaCenter[0], sv->GVS[sv->StdView].RotaCenter[1], \
02363          sv->GVS[sv->StdView].RotaCenter[2]);
02364    }
02365       
02366    
02367    
02368 
02369    SUMA_build_rotmatrix(rotationMatrix, sv->GVS[sv->StdView].currentQuat);
02370    glMatrixMode(GL_MODELVIEW);
02371    
02372 
02373 
02374 
02375 
02376   
02377       glGetDoublev(GL_MODELVIEW_MATRIX, mvmatrix);
02378       if (LocalHead) {
02379          int itmp = 0;
02380          fprintf (SUMA_STDERR, "%s: Initial Modelview:\nMV=[ ", FuncName);
02381          while (itmp < 16) { fprintf (SUMA_STDERR, "%.4f, ", mvmatrix[itmp]); ++itmp;}
02382          fprintf (SUMA_STDERR, "]\n");
02383       }
02384    glPushMatrix();
02385    glTranslatef (sv->GVS[sv->StdView].translateVec[0], sv->GVS[sv->StdView].translateVec[1], 0.0);
02386    glTranslatef (sv->GVS[sv->StdView].RotaCenter[0], sv->GVS[sv->StdView].RotaCenter[1], sv->GVS[sv->StdView].RotaCenter[2]);
02387    glMultMatrixf(&rotationMatrix[0][0]);
02388       glGetDoublev(GL_MODELVIEW_MATRIX, mvmatrix);
02389       if (LocalHead) {
02390          int itmp = 0;
02391          fprintf (SUMA_STDERR, "%s: Modelview After Translation & Rotation:\nMVtr=[ ", FuncName);
02392          while (itmp < 16) { fprintf (SUMA_STDERR, "%.4f, ", mvmatrix[itmp]); ++itmp;}
02393          fprintf (SUMA_STDERR, "]\n");
02394       }
02395    glTranslatef (-sv->GVS[sv->StdView].RotaCenter[0], -sv->GVS[sv->StdView].RotaCenter[1], -sv->GVS[sv->StdView].RotaCenter[2]);
02396 
02397    glGetIntegerv(GL_VIEWPORT, viewport);
02398    glGetDoublev(GL_MODELVIEW_MATRIX, mvmatrix);
02399    glGetDoublev(GL_PROJECTION_MATRIX, projmatrix);
02400    
02401    realy = viewport[3] - (GLint)y -1;
02402 
02403    if (LocalHead) fprintf (SUMA_STDOUT, "%s: Coordinates at cursor are (%4d, %4d)\n", FuncName, x, realy);
02404 
02405    
02406    if (Pick0) {
02407       gluUnProject((GLdouble)x, (GLdouble)realy, 0.0,\
02408          mvmatrix, projmatrix, viewport, \
02409          &(Pick0[0]), &(Pick0[1]), &(Pick0[2]));
02410       if (LocalHead) fprintf (SUMA_STDOUT, "World Coords at z=0.0 (near clip plane) are (%f, %f, %f)\n",\
02411          (Pick0[0]), (Pick0[1]), (Pick0[2]));
02412    }
02413    if (Pick1) {
02414       gluUnProject((GLdouble)x, (GLdouble)realy, 1.0,\
02415          mvmatrix, projmatrix, viewport, \
02416          &(Pick1[0]), &(Pick1[1]), &(Pick1[2]));
02417       if (LocalHead) fprintf (SUMA_STDOUT, "World Coords at z=1.0 (far clip plane) are (%f, %f, %f)\n",\
02418          (Pick1[0]), (Pick1[1]), (Pick1[2]));
02419    }
02420 
02421    if (N_List > 0) {
02422       SUMA_LH("Doing the list thing");
02423       if (!Pick0List || !xList || !yList) { SUMA_S_Err("Null Pick0List or xlist or ylist with non 0 N_List.\nPickList ignored."); }
02424       else {
02425          int i, i3;
02426          for (i=0; i<N_List; ++i) {
02427             i3 = 3*i;
02428             realy = viewport[3] - (GLint)yList[i] -1;
02429             gluUnProject((GLdouble)xList[i], (GLdouble)realy, 0.0,\
02430                            mvmatrix, projmatrix, viewport, \
02431                            &(Pick0List[i3+0]), &(Pick0List[i3+1]), &(Pick0List[i3+2]));
02432          }
02433       }  
02434    }
02435    glPopMatrix();
02436 
02437    SUMA_RETURN (YUP);
02438 }
02439 
02440 
02441 
02442 
02443 SUMA_Boolean SUMA_DrawWindowLine(SUMA_SurfaceViewer *sv, int x0, int y0, int x1, int y1, int meth)
02444 {
02445    static char FuncName[]={"SUMA_DrawWindowLine"};
02446    GLfloat rotationMatrix[4][4];
02447    static GLfloat LineCol[]={ SUMA_RED_GL };
02448    static int xlist[2], ylist[2];
02449    GLdouble Pick0[3], Pick1[3], PickList[6];
02450    static GLfloat NoColor[] = {0.0, 0.0, 0.0, 0.0};   
02451    SUMA_Boolean LocalHead  = NOPE;
02452    SUMA_ENTRY;
02453 
02454    switch (meth) {
02455       case 0: 
02456          XDrawLine (sv->X->DPY, XtWindow(sv->X->GLXAREA), sv->X->gc, 
02457            (int)x0, (int)y0,
02458            (int)x1, (int)y1);
02459          break;
02460       case 1:
02461          SUMA_build_rotmatrix(rotationMatrix, sv->GVS[sv->StdView].currentQuat);
02462          xlist[0] = x0; xlist[1] = x1;
02463          ylist[0] = y0; ylist[1] = y1;
02464          SUMA_GetSelectionLine (sv, x0, y0, NULL, NULL, 2, xlist, ylist, PickList);
02465          SUMA_SET_GL_PROJECTION(sv);
02466          SUMA_SET_GL_MODELVIEW(sv);
02467          glMaterialfv(GL_FRONT, GL_EMISSION, LineCol);
02468          glLineWidth(SUMA_CROSS_HAIR_LINE_WIDTH);
02469          if (LocalHead) {
02470             fprintf(SUMA_STDERR,"%s:PickList\n[%.3f %.3f %.3f\n %.3f %.3f %.3f]\n", FuncName,
02471                      PickList[0],PickList[1],PickList[2],PickList[3], PickList[4],PickList[5] );
02472          }
02473          glBegin(GL_LINES);
02474          glVertex3d(PickList[0], PickList[1], PickList[2]-0.001); 
02475          glVertex3d(PickList[3], PickList[4], PickList[5]-0.001);
02476          glVertex3d(PickList[0], PickList[1], PickList[2]+0.001); 
02477          glVertex3d(PickList[3], PickList[4], PickList[5]+0.001);
02478          glEnd();
02479          glMaterialfv(GL_FRONT, GL_EMISSION, NoColor);
02480          glPopMatrix();   
02481          if (sv->X->DOUBLEBUFFER)
02482              glXSwapBuffers(sv->X->DPY, XtWindow(sv->X->GLXAREA));
02483           else
02484             glFlush();         
02485          break;
02486       default:
02487          break;
02488    }
02489 
02490    SUMA_RETURN(YUP);
02491 }
02492 
02493 
02494 
02495 
02496 
02497 
02498 void SUMA_cb_helpUsage (Widget w, XtPointer data, XtPointer callData)
02499 {
02500    static char FuncName[] = {"SUMA_cb_helpUsage"};
02501    DList *list = NULL;
02502    
02503    SUMA_ENTRY;
02504    if (!list) list = SUMA_CreateList();
02505    SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, SE_Help, SES_Suma, NULL); 
02506    if (!SUMA_Engine (&list)) {
02507       fprintf(stderr, "Error %s: SUMA_Engine call failed.\n", FuncName);
02508    }
02509    
02510    SUMA_RETURNe;
02511 
02512 }
02513 
02514 
02515 
02516 
02517 
02518 void SUMA_cb_helpMessageLog (Widget w, XtPointer data, XtPointer callData)
02519 {
02520    static char FuncName[] = {"SUMA_cb_helpMessageLog"};
02521    DList *list = NULL;
02522    
02523    SUMA_ENTRY;
02524    if (!list) list = SUMA_CreateList();
02525    SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, SE_Log, SES_Suma, NULL); 
02526    if (!SUMA_Engine (&list)) {
02527       fprintf(stderr, "Error %s: SUMA_Engine call failed.\n", FuncName);
02528    }
02529    
02530    SUMA_RETURNe;
02531 
02532 }
02533 
02534 
02535 
02536 
02537 
02538 void SUMA_cb_helpViewerStruct (Widget w, XtPointer data, XtPointer callData)
02539 {
02540    static char FuncName[] = {"SUMA_cb_helpViewerStruct"};
02541    SUMA_MenuCallBackData *datap=NULL;
02542    SUMA_SurfaceViewer *sv = NULL;
02543    
02544    SUMA_ENTRY;
02545    
02546    datap = (SUMA_MenuCallBackData *)data;
02547    sv = &(SUMAg_SVv[(int)datap->ContID]);
02548    
02549    if (!sv->X->ViewCont->TopLevelShell) { 
02550       SUMA_cb_createViewerCont( w, (XtPointer)sv, callData);
02551       SUMA_cb_closeViewerCont ( w, (XtPointer)sv, callData); 
02552    }
02553    
02554    SUMA_cb_moreViewerInfo (w, (XtPointer)sv, callData);
02555 
02556    
02557    SUMA_RETURNe;
02558 
02559 }
02560 
02561 
02562 
02563 
02564 
02565 void SUMA_cb_helpSurfaceStruct (Widget w, XtPointer data, XtPointer callData)
02566 {
02567    static char FuncName[] = {"SUMA_cb_helpSurfaceStruct"};
02568    SUMA_MenuCallBackData *datap=NULL;
02569    SUMA_SurfaceViewer *sv = NULL;
02570    SUMA_SurfaceObject *SO = NULL;
02571    
02572    SUMA_ENTRY;
02573    
02574    datap = (SUMA_MenuCallBackData *)data;
02575    sv = &(SUMAg_SVv[(int)datap->ContID]);
02576    if (sv->Focus_SO_ID >= 0) {
02577       SO = (SUMA_SurfaceObject *)SUMAg_DOv[sv->Focus_SO_ID].OP;
02578    }else {
02579       SUMA_SLP_Err("No surface object in focus.\n");
02580       SUMA_RETURNe;
02581    }
02582 
02583    if (!SO->SurfCont->TopLevelShell) {
02584       
02585 
02586       SUMA_cb_createSurfaceCont( w, (XtPointer)SO, callData);
02587       
02588 
02589 
02590       SUMA_cb_closeSurfaceCont ( w, (XtPointer)SO, callData); 
02591    }
02592    
02593    
02594    SUMA_cb_moreSurfInfo (w, (XtPointer)SO->SurfCont->curSOp, callData);
02595 
02596    SUMA_RETURNe;
02597 
02598 }
02599 
02600 void SUMA_cb_helpSUMAGlobal (Widget w, XtPointer data, XtPointer callData)
02601 {
02602    static char FuncName[] = {"SUMA_cb_helpSUMAGlobal"};
02603    
02604    SUMA_ENTRY;
02605    
02606    if (!SUMAg_CF->X->SumaCont->AppShell) { 
02607       SUMA_cb_createSumaCont( w, data, callData);
02608       SUMA_cb_closeSumaCont ( w, data, callData);
02609    }
02610    
02611    
02612    SUMA_cb_moreSumaInfo (w, data, callData);
02613    
02614    SUMA_RETURNe;
02615 }
02616 
02617 
02618 
02619 
02620   
02621 void SUMA_cb_helpIO_notify(Widget w, XtPointer data, XtPointer callData)
02622 {
02623    static char FuncName[] = {"SUMA_cb_helpIO_notify"};
02624    int ii;
02625    
02626    SUMA_ENTRY;
02627    
02628    SUMA_INOUT_NOTIFY_TOGGLE;
02629    
02630    
02631    for (ii=0; ii<SUMAg_N_SVv; ++ii) {
02632       if (!SUMAg_SVv[ii].isShaded && SUMAg_SVv[ii].X->TOPLEVEL) {
02633          
02634 
02635          if (w != SUMAg_SVv[ii].X->HelpMenu[SW_HelpIONotify]) {
02636             XmToggleButtonSetState (SUMAg_SVv[ii].X->HelpMenu[SW_HelpIONotify], 
02637                SUMAg_CF->InOut_Notify, NOPE);
02638          }
02639       }
02640    }
02641    
02642     
02643    SUMA_RETURNe; 
02644 }
02645 
02646 
02647 
02648 
02649   
02650 void SUMA_cb_helpMemTrace(Widget w, XtPointer data, XtPointer callData)
02651 {
02652    static char FuncName[] = {"SUMA_cb_helpIO_notify"};
02653    int ii;
02654    
02655    SUMA_ENTRY;
02656    
02657    SUMA_MEMTRACE_TOGGLE;
02658    
02659    
02660    for (ii=0; ii<SUMAg_N_SVv; ++ii) {
02661       if (!SUMAg_SVv[ii].isShaded && SUMAg_SVv[ii].X->TOPLEVEL) {
02662          
02663 
02664          XmToggleButtonSetState (SUMAg_SVv[ii].X->HelpMenu[SW_HelpMemTrace], 
02665             SUMAg_CF->MemTrace, NOPE);
02666          if (SUMAg_CF->MemTrace) {
02667             
02668              XtSetSensitive (SUMAg_SVv[ii].X->HelpMenu[SW_HelpMemTrace], 0);
02669          }
02670       }
02671    }
02672    
02673    SUMA_RETURNe; 
02674 }
02675 
02676 
02677 
02678 
02679 
02680 void SUMA_cb_viewSumaCont(Widget w, XtPointer data, XtPointer callData)
02681 {
02682    static char FuncName[] = {"SUMA_cb_viewSumaCont"};
02683    Boolean LocalHead = NOPE;
02684    
02685    SUMA_ENTRY;
02686    
02687    if (!SUMAg_CF->X->SumaCont->AppShell) { 
02688       if (LocalHead) fprintf (SUMA_STDERR,"%s: creating controller \n", FuncName);
02689       SUMA_cb_createSumaCont( w, data, callData);
02690    }else {
02691       
02692       #ifdef SUMA_USE_WITHDRAW
02693          if (LocalHead) fprintf (SUMA_STDERR,"%s: raising SUMA controller \n", FuncName);
02694          XMapRaised(SUMAg_CF->X->DPY_controller1, XtWindow(SUMAg_CF->X->SumaCont->AppShell));
02695       #endif
02696    }
02697 
02698    SUMA_RETURNe;
02699 }
02700 
02701 
02702 
02703 
02704 
02705 
02706  
02707 void SUMA_cb_viewSurfaceCont(Widget w, XtPointer data, XtPointer callData)
02708 {
02709    SUMA_SurfaceObject *SO;
02710    SUMA_SurfaceViewer *sv;
02711    int isv, widtype;
02712    static char FuncName[] = {"SUMA_cb_viewSurfaceCont"};
02713    SUMA_Boolean LocalHead = NOPE;
02714    
02715    SUMA_ENTRY;
02716    
02717    SUMA_VIEWER_FROM_VIEWMENU_CALLBACK (data, isv, widtype);
02718    
02719    if (LocalHead) fprintf (SUMA_STDERR,"%s: A call from viewer %d, widget %d.\n", FuncName, isv, widtype);
02720    
02721    sv = &SUMAg_SVv[isv];
02722    if (sv->Focus_SO_ID >= 0) {
02723     SO = (SUMA_SurfaceObject *)SUMAg_DOv[sv->Focus_SO_ID].OP;
02724    }else {
02725       fprintf (SUMA_STDERR,"%s: No surface object in focus.\n", FuncName);
02726       SUMA_RETURNe;
02727    }
02728    
02729    
02730    if (!SO->SurfCont->TopLevelShell) {
02731       if (LocalHead) fprintf (SUMA_STDERR,"%s: Calling SUMA_cb_createSurfaceCont.\n", FuncName);
02732       SUMA_cb_createSurfaceCont( w, (XtPointer)SO, callData);
02733    }else {
02734       
02735       #ifdef SUMA_USE_WITHDRAW
02736          if (LocalHead) fprintf (SUMA_STDERR,"%s: Controller already created, Raising it.\n", FuncName);
02737          XMapRaised(SUMAg_CF->X->DPY_controller1, XtWindow(SO->SurfCont->TopLevelShell));      
02738       #endif
02739 
02740    }
02741    
02742    SUMA_Init_SurfCont_SurfParam(SO);
02743    SUMA_Init_SurfCont_CrossHair(SO);
02744    
02745    if (SO->SurfCont->PosRef != sv->X->TOPLEVEL) {
02746       SO->SurfCont->PosRef = sv->X->TOPLEVEL;
02747       SUMA_PositionWindowRelative (SO->SurfCont->TopLevelShell, SO->SurfCont->PosRef, SWP_TOP_RIGHT);   
02748    } 
02749 
02750    SUMA_RETURNe;
02751 }
02752 
02753 
02754 
02755 
02756 void SUMA_cb_viewViewerCont(Widget w, XtPointer data, XtPointer callData)
02757 {
02758    int isv, widtype;
02759    SUMA_SurfaceViewer *sv;
02760    SUMA_Boolean LocalHead = NOPE;
02761    static char FuncName[] = {"SUMA_cb_viewViewerCont"};
02762    
02763    SUMA_ENTRY;
02764    
02765    SUMA_VIEWER_FROM_VIEWMENU_CALLBACK (data, isv, widtype);
02766    
02767    sv = &SUMAg_SVv[isv];
02768 
02769    if (!sv->X->ViewCont->TopLevelShell) {
02770       if (LocalHead) fprintf (SUMA_STDERR,"%s: Calling SUMA_cb_createViewerCont.\n", FuncName);
02771       SUMA_cb_createViewerCont( w, sv, callData);
02772    }else {
02773       
02774       
02775       #ifdef SUMA_USE_WITHDRAW
02776          if (LocalHead) fprintf (SUMA_STDERR,"%s: Controller already created, Raising it.\n", FuncName);
02777          XMapRaised(sv->X->DPY, XtWindow(sv->X->ViewCont->TopLevelShell));      
02778       #endif
02779 
02780    }
02781    
02782    SUMA_RETURNe;
02783 }
02784 
02785 
02786 
02787 
02788 
02789 void SUMA_cb_toggle_crosshair(Widget w, XtPointer data, XtPointer callData)
02790 {
02791    static char FuncName[] = {"SUMA_cb_toggle_crosshair"};
02792    int isv, widtype;
02793    DList *list = NULL;
02794    SUMA_SurfaceViewer *sv;
02795       
02796    SUMA_ENTRY;
02797    
02798    SUMA_VIEWER_FROM_VIEWMENU_CALLBACK (data, isv, widtype);
02799    
02800    sv = &SUMAg_SVv[isv];
02801       
02802    if (!list) list = SUMA_CreateList();
02803    SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, SE_ToggleCrossHair, SES_SumaWidget, sv);
02804    SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, SE_Redisplay, SES_SumaWidget, sv);
02805 
02806    if (!SUMA_Engine (&list)) {
02807       fprintf(stderr,"Error %s: Failed SUMA_Engine\n", FuncName);
02808    }
02809    
02810    SUMA_RETURNe;
02811 }
02812  
02813 void SUMA_cb_toggle_node_in_focus(Widget w, XtPointer data, XtPointer callData)
02814 {
02815    static char FuncName[] = {"SUMA_cb_toggle_node_in_focus"};
02816    int isv, widtype;
02817    DList *list = NULL;
02818    SUMA_SurfaceViewer *sv;
02819    
02820    SUMA_ENTRY;
02821    
02822    SUMA_VIEWER_FROM_VIEWMENU_CALLBACK (data, isv, widtype);
02823    
02824    sv = &SUMAg_SVv[isv];
02825       
02826    if (!list) list = SUMA_CreateList();
02827    SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, SE_ToggleShowSelectedNode, SES_SumaWidget, sv);
02828    SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, SE_Redisplay, SES_SumaWidget, sv);
02829 
02830    if (!SUMA_Engine (&list)) {
02831       fprintf(stderr,"Error %s: Failed SUMA_Engine\n", FuncName);
02832    }
02833 
02834    SUMA_RETURNe;
02835 }
02836 
02837 void SUMA_cb_toggle_selected_faceset(Widget w, XtPointer data, XtPointer callData)
02838 {
02839    static char FuncName[] = {"SUMA_cb_toggle_selected_faceset"};
02840    int isv, widtype;
02841    DList *list = NULL;
02842    SUMA_SurfaceViewer *sv;
02843    
02844    SUMA_ENTRY;
02845    
02846    SUMA_VIEWER_FROM_VIEWMENU_CALLBACK (data, isv, widtype);
02847    
02848    sv = &SUMAg_SVv[isv];
02849       
02850    if (!list) list = SUMA_CreateList();
02851    SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, SE_ToggleShowSelectedFaceSet, SES_SumaWidget, sv);
02852    SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, SE_Redisplay, SES_SumaWidget, sv);
02853 
02854    if (!SUMA_Engine (&list)) {
02855       fprintf(stderr,"Error %s: Failed SUMA_Engine\n", FuncName);
02856    }
02857 
02858    
02859    SUMA_RETURNe;
02860 }         
02861 
02862 
02863 
02864 #define SUMA_CONTROLLER_AS_DIALOG 0 
02865 
02866 
02867 
02868 
02869 
02870 
02871 
02872 void SUMA_cb_createViewerCont(Widget w, XtPointer data, XtPointer callData)
02873 {
02874    static char FuncName[] = {"SUMA_cb_createViewerCont"};
02875    Widget tl, rc, pb, ViewerFrame, SwitchFrame, QuitFrame, rc_left, rc_right, rc_mamma;
02876    Display *dpy;
02877    SUMA_SurfaceViewer *sv;
02878    int isv;    
02879    char slabel[100]; 
02880    SUMA_Boolean LocalHead = NOPE;
02881    
02882    SUMA_ENTRY;
02883    
02884    sv = (SUMA_SurfaceViewer *)data;
02885    isv = SUMA_WhichSV(sv, SUMAg_SVv, SUMAg_N_SVv);
02886    
02887    if (sv->X->ViewCont->TopLevelShell) {
02888       fprintf (SUMA_STDERR,"Error %s: sv->X->ViewCont->TopLevelShell!=NULL. Should not be here.\n", FuncName);
02889       SUMA_RETURNe;
02890    }
02891    tl = SUMA_GetTopShell(w); 
02892    dpy = XtDisplay(tl);
02893    
02894    sprintf(slabel,"[%c] Viewer Controller", 65+isv);
02895    
02896    
02897    #if SUMA_CONTROLLER_AS_DIALOG 
02898    SUMA_LH("Create a popup");
02899    sv->X->ViewCont->TopLevelShell = XtVaCreatePopupShell (slabel,
02900       xmDialogShellWidgetClass, tl,
02901       XmNallowShellResize, True, 
02902       XmNdeleteResponse, XmDO_NOTHING,
02903       NULL);    
02904    #else
02905    SUMA_LH("Create an App");
02906 
02907 
02908    sv->X->ViewCont->TopLevelShell = XtVaAppCreateShell (slabel, "Suma",
02909       topLevelShellWidgetClass, SUMAg_CF->X->DPY_controller1 ,
02910       XmNdeleteResponse, XmDO_NOTHING,
02911       NULL);   
02912    #endif
02913    
02914    
02915    XtVaSetValues (sv->X->ViewCont->TopLevelShell, 
02916          XmNresizePolicy , XmRESIZE_NONE , 
02917          XmNallowShellResize , True ,       
02918          NULL);
02919    
02920    
02921    XmAddWMProtocolCallback(
02922       sv->X->ViewCont->TopLevelShell,
02923       XmInternAtom( dpy , "WM_DELETE_WINDOW" , False ) ,
02924       SUMA_cb_closeViewerCont, (XtPointer) sv) ;
02925    
02926    
02927    sv->X->ViewCont->Mainform = XtVaCreateWidget ("dialog", 
02928       xmFormWidgetClass, sv->X->ViewCont->TopLevelShell,
02929       XmNborderWidth , 0 ,
02930       XmNmarginHeight , SUMA_MARGIN ,
02931       XmNmarginWidth  , SUMA_MARGIN ,
02932       XmNshadowThickness, 2,
02933       XmNshadowType, XmSHADOW_ETCHED_IN,
02934       NULL); 
02935    
02936    rc_mamma = XtVaCreateWidget ("rowcolumn",
02937             xmRowColumnWidgetClass, sv->X->ViewCont->Mainform,
02938             XmNpacking, XmPACK_TIGHT, 
02939             XmNorientation , XmHORIZONTAL ,
02940             XmNmarginHeight, SUMA_MARGIN ,
02941             XmNmarginWidth , SUMA_MARGIN ,
02942             XmNleftAttachment , XmATTACH_FORM ,
02943             XmNtopAttachment  , XmATTACH_FORM ,
02944             XmNrightAttachment , XmATTACH_FORM ,
02945             NULL);
02946             
02947    rc_left = XtVaCreateWidget ("rowcolumn",
02948             xmRowColumnWidgetClass, rc_mamma,
02949             XmNpacking, XmPACK_TIGHT, 
02950             XmNorientation , XmVERTICAL ,
02951             XmNmarginHeight, SUMA_MARGIN ,
02952             XmNmarginWidth , SUMA_MARGIN ,
02953             NULL);
02954    
02955    rc_right = XtVaCreateWidget ("rowcolumn",
02956             xmRowColumnWidgetClass, rc_mamma,
02957             XmNpacking, XmPACK_TIGHT, 
02958             XmNorientation , XmVERTICAL ,
02959             XmNmarginHeight, SUMA_MARGIN ,
02960             XmNmarginWidth , SUMA_MARGIN ,
02961             NULL); 
02962    
02963    { 
02964       Widget rc, pb, label;
02965       
02966       
02967       ViewerFrame = XtVaCreateWidget ("dialog",
02968          xmFrameWidgetClass, rc_left,
02969          XmNshadowType , XmSHADOW_ETCHED_IN ,
02970          XmNshadowThickness , 5 ,
02971          XmNtraversalOn , False ,
02972          NULL); 
02973          
02974       
02975       rc = XtVaCreateWidget ("rowcolumn",
02976             xmRowColumnWidgetClass, ViewerFrame,
02977             XmNpacking, XmPACK_TIGHT, 
02978             XmNorientation , XmHORIZONTAL ,
02979             XmNmarginHeight, SUMA_MARGIN ,
02980             XmNmarginWidth , SUMA_MARGIN ,
02981             NULL);
02982 
02983       
02984       snprintf(slabel, 40*sizeof(char), "Group: %s, State: %s", sv->CurGroupName, sv->State);
02985       sv->X->ViewCont->Info_lb = XtVaCreateManagedWidget (slabel, 
02986                xmLabelWidgetClass, rc,
02987                NULL);
02988                
02989       XtVaCreateManagedWidget (  "sep", 
02990                                  xmSeparatorWidgetClass, rc, 
02991                                  XmNorientation, XmVERTICAL,NULL);
02992 
02993       sv->X->ViewCont->ViewerInfo_pb = XtVaCreateWidget ("more", 
02994          xmPushButtonWidgetClass, rc, 
02995          NULL);   
02996       XtAddCallback (sv->X->ViewCont->ViewerInfo_pb, XmNactivateCallback, SUMA_cb_moreViewerInfo, (XtPointer) sv);
02997       XtVaSetValues (sv->X->ViewCont->ViewerInfo_pb, XmNuserData, (XtPointer)sv, NULL); 
02998 
02999 
03000 
03001 
03002 
03003 
03004 
03005 
03006       MCW_register_hint( sv->X->ViewCont->ViewerInfo_pb , "More info on Viewer" ) ;
03007       MCW_register_help( sv->X->ViewCont->ViewerInfo_pb , SUMA_moreViewerInfo_help ) ;
03008       XtManageChild (sv->X->ViewCont->ViewerInfo_pb); 
03009 
03010       XtManageChild (rc);
03011       
03012       XtManageChild (ViewerFrame);
03013    
03014    }
03015    { 
03016       Widget rc, pb, label;
03017       
03018       SwitchFrame = XtVaCreateWidget ("dialog",
03019          xmFrameWidgetClass, rc_left,
03020          XmNshadowType , XmSHADOW_ETCHED_IN ,
03021          XmNshadowThickness , 5 ,
03022          XmNtraversalOn , False ,
03023          NULL); 
03024          
03025       
03026       rc = XtVaCreateWidget ("rowcolumn",
03027             xmRowColumnWidgetClass, SwitchFrame,
03028             XmNpacking, XmPACK_TIGHT, 
03029             XmNorientation , XmHORIZONTAL ,
03030             XmNmarginHeight, SUMA_MARGIN ,
03031             XmNmarginWidth , SUMA_MARGIN ,
03032             NULL);
03033 
03034       
03035       snprintf(slabel, 40*sizeof(char), "Switch:");
03036       label = XtVaCreateManagedWidget (slabel, 
03037                xmLabelWidgetClass, rc,
03038                NULL);
03039 
03040       
03041       
03042       snprintf(slabel, 40*sizeof(char), "[%c] Switch Group", 65 + isv);
03043       sv->X->ViewCont->SwitchGrouplst = SUMA_AllocateScrolledList (slabel, SUMA_LSP_SINGLE, 
03044                               NOPE, YUP,
03045                               sv->X->ViewCont->TopLevelShell, SWP_TOP_LEFT,
03046                               SUMA_cb_SelectSwitchGroup, (void *)sv,
03047                               SUMA_cb_SelectSwitchGroup, (void *)sv,
03048                               SUMA_cb_CloseSwitchGroup, (void *)sv);
03049     
03050 
03051       pb = XtVaCreateWidget ("Group", 
03052          xmPushButtonWidgetClass, rc, 
03053          NULL);
03054       XtAddCallback (pb, XmNactivateCallback, SUMA_cb_ViewerCont_SwitchGroup, (XtPointer) sv);
03055       MCW_register_hint( pb , "Switch Group" ) ;
03056       MCW_register_help( pb , "Switch Group" ) ;
03057       XtManageChild (pb);
03058 
03059       
03060       pb = XtVaCreateWidget ("State", 
03061          xmPushButtonWidgetClass, rc, 
03062          NULL);
03063       XtAddCallback (pb, XmNactivateCallback, SUMA_cb_ViewerCont_SwitchState, (XtPointer) sv);
03064       MCW_register_hint( pb , "Switch State" ) ;
03065       MCW_register_help( pb , "Switch State" ) ;
03066       XtManageChild (pb);
03067       
03068       
03069       
03070       XtManageChild (rc);
03071 
03072       
03073       XtManageChild (SwitchFrame);
03074    }               
03075    
03076    { 
03077       Widget rc, pb_close, pb_bhelp;
03078       
03079       
03080       QuitFrame = XtVaCreateWidget ("dialog",
03081          xmFrameWidgetClass, sv->X->ViewCont->Mainform,
03082          XmNleftAttachment , XmATTACH_FORM ,
03083          XmNtopAttachment  , XmATTACH_WIDGET ,
03084          XmNtopWidget, SwitchFrame,
03085          XmNshadowType , XmSHADOW_ETCHED_IN ,
03086          XmNshadowThickness , 5 ,
03087          XmNtraversalOn , False ,
03088          NULL); 
03089 
03090          
03091       #if 0
03092       
03093       
03094       XtVaCreateManagedWidget ("Disp. Cont.",
03095             xmLabelWidgetClass, QuitFrame, 
03096             XmNchildType, XmFRAME_TITLE_CHILD,
03097             XmNchildHorizontalAlignment, XmALIGNMENT_BEGINNING,
03098             NULL);
03099       #endif
03100       
03101       
03102       rc = XtVaCreateWidget ("rowcolumn",
03103             xmRowColumnWidgetClass, QuitFrame,
03104             XmNpacking, XmPACK_TIGHT, 
03105             XmNorientation , XmHORIZONTAL ,
03106             XmNmarginHeight, SUMA_MARGIN ,
03107             XmNmarginWidth , SUMA_MARGIN ,
03108             NULL);
03109 
03110       pb_close = XtVaCreateWidget ("Close", 
03111          xmPushButtonWidgetClass, rc, 
03112          NULL);   
03113       XtAddCallback (pb_close, XmNactivateCallback, SUMA_cb_closeViewerCont, (XtPointer) sv);
03114       MCW_register_hint( pb_close , "Close Viewer controller" ) ;
03115       MCW_register_help( pb_close , SUMA_closeViewerCont_help ) ;
03116       XtManageChild (pb_close); 
03117 
03118       pb_bhelp = XtVaCreateWidget ("BHelp", 
03119          xmPushButtonWidgetClass, rc, 
03120          NULL);
03121       XtAddCallback (pb_bhelp, XmNactivateCallback, MCW_click_help_CB, NULL);
03122       MCW_register_help(pb_bhelp , SUMA_help_help ) ;
03123       MCW_register_hint(pb_bhelp  , "Press this button then click on a button/label/menu for more help." ) ;
03124 
03125       XtManageChild (pb_bhelp); 
03126 
03127 
03128 
03129       
03130       XtManageChild (rc);
03131 
03132       
03133       XtManageChild (QuitFrame);
03134    }
03135       
03136    XtManageChild (rc_right);
03137    XtManageChild (rc_left);
03138    XtManageChild (rc_mamma);
03139    XtManageChild (sv->X->ViewCont->Mainform);
03140    
03141    #if SUMA_CONTROLLER_AS_DIALOG    
03142    #else
03143 
03144 
03145    XtPopup(sv->X->ViewCont->TopLevelShell, XtGrabNone);
03146    #endif
03147    
03148    
03149    XtRealizeWidget (sv->X->ViewCont->TopLevelShell);
03150    
03151    SUMA_RETURNe;
03152 }
03153 
03154 
03155 
03156 
03157 void SUMA_cb_closeViewerCont(Widget w, XtPointer data, XtPointer callData)
03158 {
03159    static char FuncName[] = {"SUMA_cb_closeViewerCont"};
03160    SUMA_SurfaceViewer *sv;
03161    SUMA_Boolean LocalHead = NOPE;
03162    
03163    SUMA_ENTRY;
03164    
03165    sv = (SUMA_SurfaceViewer *)data;
03166    
03167    if (!sv->X->ViewCont->TopLevelShell) SUMA_RETURNe;
03168 
03169    #ifdef SUMA_USE_WITHDRAW 
03170       if (LocalHead) fprintf (SUMA_STDERR,"%s: Withdrawing Viewer Controller...\n", FuncName);
03171       
03172       XWithdrawWindow(sv->X->DPY, 
03173          XtWindow(sv->X->ViewCont->TopLevelShell),
03174          XScreenNumberOfScreen(XtScreen(sv->X->ViewCont->TopLevelShell)));
03175    #endif
03176    #ifdef SUMA_USE_DESTROY 
03177       if (LocalHead) fprintf (SUMA_STDERR,"%s: Destroying Viewer Controller...\n", FuncName);
03178       XtDestroyWidget(sv->X->ViewCont->TopLevelShell);
03179       sv->X->ViewCont->TopLevelShell = NULL;
03180    #endif
03181 
03182     
03183    SUMA_RETURNe;
03184 
03185 }
03186 
03187 
03188 
03189 
03190 
03191 
03192 void SUMA_cb_createSurfaceCont(Widget w, XtPointer data, XtPointer callData)
03193 {
03194    Widget tl, pb, form, DispFrame, SurfFrame, rc_left, rc_right, rc_mamma;
03195    Display *dpy;
03196    SUMA_SurfaceObject *SO;
03197    char *slabel, *lbl30; 
03198    SUMA_Boolean LocalHead = NOPE;
03199    static char FuncName[] = {"SUMA_cb_createSurfaceCont"};
03200    
03201    SUMA_ENTRY;
03202    
03203    SO = (SUMA_SurfaceObject *)data;
03204    *(SO->SurfCont->curSOp) = (void *)SO;
03205    
03206    if (SO->SurfCont->TopLevelShell) {
03207       fprintf (SUMA_STDERR,"Error %s: SO->SurfCont->TopLevelShell!=NULL. Should not be here.\n", FuncName);
03208       SUMA_RETURNe;
03209    }
03210    tl = SUMA_GetTopShell(w); 
03211    dpy = XtDisplay(tl);
03212    
03213    slabel = (char *)SUMA_malloc (sizeof(char) * (strlen(SO->Label) + 100));
03214    if (strlen(SO->Label) > 40) {
03215       char *tmpstr=NULL;
03216       tmpstr = SUMA_truncate_string(SO->Label, 40);
03217       if (tmpstr) { 
03218          sprintf(slabel,"[%s] Surface Controller", tmpstr);
03219          free(tmpstr); tmpstr=NULL;
03220       }
03221    } else {
03222       sprintf(slabel,"[%s] Surface Controller", SO->Label);
03223    }
03224    
03225    #if SUMA_CONTROLLER_AS_DIALOG 
03226    if (LocalHead) fprintf(SUMA_STDERR, "%s: Creating dialog shell.\n", FuncName);
03227    SO->SurfCont->TopLevelShell = XtVaCreatePopupShell (slabel,
03228       xmDialogShellWidgetClass, tl,
03229       XmNallowShellResize, True, 
03230       XmNdeleteResponse, XmDO_NOTHING,
03231       NULL);    
03232    #else
03233    if (LocalHead) fprintf(SUMA_STDERR, "%s: Creating toplevel shell.\n", FuncName);
03234 
03235 
03236 
03237    SO->SurfCont->TopLevelShell = XtVaAppCreateShell (slabel, "Suma",
03238       topLevelShellWidgetClass, SUMAg_CF->X->DPY_controller1 ,
03239       XmNdeleteResponse, XmDO_NOTHING,
03240       NULL);   
03241    #endif
03242    
03243    
03244    XtVaSetValues (SO->SurfCont->TopLevelShell, 
03245          XmNresizePolicy , XmRESIZE_NONE , 
03246          XmNallowShellResize , True ,       
03247          NULL);
03248     
03249    
03250    XmAddWMProtocolCallback(
03251       SO->SurfCont->TopLevelShell,
03252       XmInternAtom( dpy , "WM_DELETE_WINDOW" , False ) ,
03253       SUMA_cb_closeSurfaceCont, (XtPointer) SO) ;
03254    
03255    
03256    SO->SurfCont->Mainform = XtVaCreateWidget ("dialog", 
03257       xmFormWidgetClass, SO->SurfCont->TopLevelShell,
03258       XmNborderWidth , 0 ,
03259       XmNmarginHeight , SUMA_MARGIN ,
03260       XmNmarginWidth  , SUMA_MARGIN ,
03261       XmNshadowThickness, 2,
03262       XmNshadowType, XmSHADOW_ETCHED_IN,
03263       NULL); 
03264    
03265    rc_mamma = XtVaCreateWidget ("rowcolumn",
03266             xmRowColumnWidgetClass, SO->SurfCont->Mainform,
03267             XmNpacking, XmPACK_TIGHT, 
03268             XmNorientation , XmHORIZONTAL ,
03269             XmNmarginHeight, SUMA_MARGIN ,
03270             XmNmarginWidth , SUMA_MARGIN ,
03271             XmNleftAttachment , XmATTACH_FORM ,
03272             XmNtopAttachment  , XmATTACH_FORM ,
03273             XmNrightAttachment , XmATTACH_FORM ,
03274             NULL);
03275             
03276    rc_left = XtVaCreateWidget ("rowcolumn",
03277             xmRowColumnWidgetClass, rc_mamma,
03278             XmNpacking, XmPACK_TIGHT, 
03279             XmNorientation , XmVERTICAL ,
03280             XmNmarginHeight, SUMA_MARGIN ,
03281             XmNmarginWidth , SUMA_MARGIN ,
03282             XmNwidth, 317,
03283             XmNresizeWidth, False,
03284             NULL);
03285    
03286    rc_right = XtVaCreateWidget ("rowcolumn",
03287             xmRowColumnWidgetClass, rc_mamma,
03288             XmNpacking, XmPACK_TIGHT, 
03289             XmNorientation , XmVERTICAL ,
03290             XmNmarginHeight, SUMA_MARGIN ,
03291             XmNmarginWidth , SUMA_MARGIN ,
03292             NULL); 
03293                     
03294    
03295    { 
03296       Widget rc, label, rc_SurfProp, pb;
03297      
03298       
03299       SurfFrame = XtVaCreateWidget ("dialog",
03300          xmFrameWidgetClass, rc_left,
03301          XmNshadowType , XmSHADOW_ETCHED_IN ,
03302          XmNshadowThickness , 5 ,
03303          XmNtraversalOn , False ,
03304          NULL); 
03305       
03306       XtVaCreateManagedWidget ("Surface Properties",
03307             xmLabelWidgetClass, SurfFrame, 
03308             XmNchildType, XmFRAME_TITLE_CHILD,
03309             XmNchildHorizontalAlignment, XmALIGNMENT_BEGINNING,
03310             NULL);
03311       
03312       rc_SurfProp = XtVaCreateWidget ("rowcolumn",
03313             xmRowColumnWidgetClass, SurfFrame,
03314             XmNpacking, XmPACK_TIGHT, 
03315             XmNorientation , XmVERTICAL ,
03316             XmNmarginHeight, 0 ,
03317             XmNmarginWidth , 0 ,
03318             NULL); 
03319       
03320       rc = XtVaCreateWidget ("rowcolumn",
03321             xmRowColumnWidgetClass, rc_SurfProp,
03322             XmNpacking, XmPACK_TIGHT, 
03323             XmNorientation , XmHORIZONTAL ,
03324             XmNmarginHeight, 0 ,
03325             XmNmarginWidth , 0 ,
03326             NULL);
03327 
03328       
03329       lbl30 = SUMA_set_string_length(SO->Label, ' ', 27);
03330       if (lbl30) {
03331          sprintf(slabel,"%s\n%d nodes: %d tri.", lbl30, SO->N_Node, SO->N_FaceSet); 
03332          SUMA_free(lbl30); lbl30 = NULL;
03333       } else {
03334          sprintf(slabel,"???\n%d nodes: %d tri.", SO->N_Node, SO->N_FaceSet); 
03335       }
03336       SO->SurfCont->SurfInfo_label = XtVaCreateManagedWidget (slabel, 
03337                xmLabelWidgetClass, rc,
03338                NULL);
03339 
03340       XtVaCreateManagedWidget (  "sep", 
03341                                  xmSeparatorWidgetClass, rc, 
03342                                  XmNorientation, XmVERTICAL,NULL);
03343 
03344       SO->SurfCont->SurfInfo_pb = XtVaCreateWidget ("more", 
03345          xmPushButtonWidgetClass, rc, 
03346          NULL);   
03347       XtAddCallback (SO->SurfCont->SurfInfo_pb, XmNactivateCallback, SUMA_cb_moreSurfInfo, (XtPointer)SO->SurfCont->curSOp);
03348       XtVaSetValues (SO->SurfCont->SurfInfo_pb, XmNuserData, (XtPointer)SO->SurfCont->curSOp, NULL); 
03349 
03350 
03351 
03352 
03353 
03354 
03355 
03356 
03357 
03358 
03359 
03360       MCW_register_hint( SO->SurfCont->SurfInfo_pb , "More info on Surface" ) ;
03361       MCW_register_help( SO->SurfCont->SurfInfo_pb , SUMA_SurfContHelp_more ) ;
03362       XtManageChild (SO->SurfCont->SurfInfo_pb); 
03363 
03364       XtManageChild (rc);
03365       
03366       XtVaCreateManagedWidget (  "sep", 
03367                                  xmSeparatorWidgetClass, rc_SurfProp, 
03368                                  XmNorientation, XmHORIZONTAL,NULL);
03369 
03370       rc = XtVaCreateWidget ("rowcolumn",
03371             xmRowColumnWidgetClass, rc_SurfProp,
03372             XmNpacking, XmPACK_TIGHT, 
03373             XmNorientation , XmHORIZONTAL ,
03374             XmNmarginHeight, SUMA_MARGIN ,
03375             XmNmarginWidth , SUMA_MARGIN ,
03376             NULL);
03377 
03378       
03379       SUMA_BuildMenuReset(0);
03380       SUMA_BuildMenu (rc, XmMENU_OPTION, 
03381                                  "RenderMode", '\0', YUP, RenderMode_Menu, 
03382                                  (void *)(SO->SurfCont->curSOp), 
03383                                  "Choose the rendering mode for this surface.",
03384                                  SUMA_SurfContHelp_RenderMode, 
03385                                  SO->SurfCont->RenderModeMenu );
03386       XtManageChild (SO->SurfCont->RenderModeMenu[SW_SurfCont_Render]);
03387       
03388       pb = XtVaCreateWidget ("Dsets", 
03389          xmPushButtonWidgetClass, rc, 
03390          NULL);   
03391       XtAddCallback (pb, XmNactivateCallback, SUMA_cb_UnmanageWidget, (XtPointer) SO->SurfCont->curSOp);
03392       MCW_register_hint( pb , "Show/Hide Dataset (previously Color Plane) controllers" ) ;
03393       MCW_register_help( pb , SUMA_SurfContHelp_Dsets ) ;
03394       XtManageChild (pb);
03395       
03396       XtManageChild (rc);
03397 
03398       XtManageChild (rc_SurfProp);
03399       XtManageChild (SurfFrame);
03400    }  
03401    
03402    {  
03403       Widget rcv;
03404       
03405       SO->SurfCont->Xhair_fr = XtVaCreateWidget ("dialog",
03406          xmFrameWidgetClass, rc_left,
03407          XmNshadowType , XmSHADOW_ETCHED_IN ,
03408          XmNshadowThickness , 5 ,
03409          XmNtraversalOn , False ,
03410          NULL); 
03411       
03412       XtVaCreateManagedWidget ("Xhair Info",
03413             xmLabelWidgetClass, SO->SurfCont->Xhair_fr, 
03414             XmNchildType, XmFRAME_TITLE_CHILD,
03415             XmNchildHorizontalAlignment, XmALIGNMENT_BEGINNING,
03416             NULL);
03417             
03418       
03419       rcv = XtVaCreateWidget ("rowcolumn",
03420             xmRowColumnWidgetClass, SO->SurfCont->Xhair_fr,
03421             XmNpacking, XmPACK_TIGHT, 
03422             XmNorientation , XmVERTICAL ,
03423             XmNmarginHeight, 0 ,
03424             XmNmarginWidth , 0 ,
03425             NULL);
03426 
03427       
03428       SUMA_CreateXhairWidgets(rcv, SO);
03429 
03430       
03431       XtManageChild(rcv);
03432       XtManageChild(SO->SurfCont->Xhair_fr);
03433    }  
03434     
03435    {  
03436       Widget rcv;
03437       
03438       SO->SurfCont->DsetMap_fr = XtVaCreateWidget ("dialog",
03439          xmFrameWidgetClass, rc_right,
03440          XmNrightAttachment , XmATTACH_FORM ,
03441          XmNleftAttachment, XmATTACH_WIDGET,
03442          XmNleftWidget, SurfFrame,
03443          XmNtopAttachment  , XmATTACH_FORM ,
03444          XmNshadowType , XmSHADOW_ETCHED_IN ,
03445          XmNshadowThickness , 5 ,
03446          XmNtraversalOn , False ,
03447          NULL); 
03448       
03449       XtVaCreateManagedWidget ("Dset Mapping",
03450             xmLabelWidgetClass, SO->SurfCont->DsetMap_fr, 
03451             XmNchildType, XmFRAME_TITLE_CHILD,
03452             XmNchildHorizontalAlignment, XmALIGNMENT_BEGINNING,
03453             NULL);
03454             
03455       
03456       rcv = XtVaCreateWidget ("rowcolumn",
03457             xmRowColumnWidgetClass, SO->SurfCont->DsetMap_fr,
03458             XmNpacking, XmPACK_TIGHT, 
03459             XmNorientation , XmVERTICAL ,
03460             XmNmarginHeight, 0 ,
03461             XmNmarginWidth , 0 ,
03462             NULL);
03463 
03464       
03465       SUMA_CreateCmapWidgets(rcv, SO);
03466       
03467       XtManageChild(rcv);
03468       XtManageChild(SO->SurfCont->DsetMap_fr);
03469    }
03470 
03471    
03472    {
03473        Widget rc, rcv, pb;
03474      
03475       
03476       
03477       SO->SurfCont->ColPlane_fr = XtVaCreateWidget ("dialog",
03478          xmFrameWidgetClass, rc_left,
03479          XmNshadowType , XmSHADOW_ETCHED_IN ,
03480          XmNshadowThickness , 5 ,
03481          XmNtraversalOn , False ,
03482          NULL); 
03483       
03484       XtVaCreateManagedWidget ("Dset Controls",
03485             xmLabelWidgetClass, SO->SurfCont->ColPlane_fr, 
03486             XmNchildType, XmFRAME_TITLE_CHILD,
03487             XmNchildHorizontalAlignment, XmALIGNMENT_BEGINNING,
03488             NULL);
03489             
03490       
03491       rcv = XtVaCreateWidget ("rowcolumn",
03492             xmRowColumnWidgetClass, SO->SurfCont->ColPlane_fr,
03493             XmNpacking, XmPACK_TIGHT, 
03494             XmNorientation , XmVERTICAL ,
03495             XmNmarginHeight, 0 ,
03496             XmNmarginWidth , 0 ,
03497             NULL);
03498             
03499       
03500       rc = XtVaCreateWidget ("rowcolumn",
03501             xmRowColumnWidgetClass, rcv,
03502             XmNpacking, XmPACK_TIGHT, 
03503             XmNorientation , XmHORIZONTAL ,
03504             XmNmarginHeight, 0 ,
03505             XmNmarginWidth , 0 ,
03506             NULL);
03507       
03508       
03509       {
03510          char *Dset_tit[]  =  {  "Lbl", "Par", NULL };
03511          char *Dset_hint[] =  {  "Label of Dset", 
03512                                  "Parent surface of Dset", NULL };
03513          char *Dset_help[] =  {  SUMA_SurfContHelp_DsetLblTblr0, 
03514                                  SUMA_SurfContHelp_DsetLblTblr1, NULL };
03515          int colw[]={ 3, 27};
03516          SUMA_CreateTable(rc, 
03517             2, 2,
03518             Dset_tit, NULL,
03519             Dset_hint, NULL,
03520             Dset_help, NULL,
03521             colw, NOPE, SUMA_string,
03522             NULL, NULL,
03523             NULL, NULL,
03524             NULL, NULL, 
03525             SO->SurfCont->ColPlaneLabelTable);
03526       }
03527       XtManageChild (rc);
03528       
03529       
03530       rc = XtVaCreateWidget ("rowcolumn",
03531          xmRowColumnWidgetClass, rcv,
03532          XmNpacking, XmPACK_TIGHT, 
03533          XmNorientation , XmHORIZONTAL ,
03534          NULL);
03535    
03536       SUMA_CreateArrowField ( rc, "Ord:",
03537                            1, 0, 20, 1,
03538                            2, SUMA_int,
03539                            NOPE,
03540                            SUMA_ColPlane_NewOrder, (void *)SO,
03541                            SUMA_SurfCont_ColPlaneOrder_hint, SUMA_SurfContHelp_DsetOrd,
03542                            SO->SurfCont->ColPlaneOrder);
03543                              
03544       SUMA_CreateArrowField ( rc, "Opa:",
03545                            1, 0.0, 1.0, 0.1,
03546                            3, SUMA_float,
03547                            NOPE,
03548                            SUMA_ColPlane_NewOpacity, (void *)SO,
03549                            SUMA_SurfCont_ColPlaneOpacity_hint, SUMA_SurfContHelp_DsetOpa,
03550                            SO->SurfCont->ColPlaneOpacity);
03551 
03552       
03553       XtManageChild (rc);
03554       
03555       
03556       rc = XtVaCreateWidget ("rowcolumn",
03557          xmRowColumnWidgetClass, rcv,
03558          XmNpacking, XmPACK_TIGHT, 
03559          XmNorientation , XmHORIZONTAL ,
03560          NULL);
03561    
03562       SUMA_CreateArrowField ( rc, "Dim:",
03563                            1, 0.1, 1, 0.1,
03564                            3, SUMA_float,
03565                            YUP,
03566                            SUMA_ColPlane_NewDimFact, (void *)SO, 
03567                            SUMA_SurfCont_ColPlaneDim_hint, SUMA_SurfContHelp_DsetDim,
03568                            SO->SurfCont->ColPlaneDimFact);
03569            
03570       SO->SurfCont->ColPlaneShow_tb = XtVaCreateManagedWidget("view", 
03571             xmToggleButtonWidgetClass, rc, NULL);
03572       XmToggleButtonSetState (SO->SurfCont->ColPlaneShow_tb, YUP, NOPE);
03573       XtAddCallback (SO->SurfCont->ColPlaneShow_tb, 
03574                   XmNvalueChangedCallback, SUMA_cb_ColPlaneShow_toggled, SO);
03575                   
03576       MCW_register_help(SO->SurfCont->ColPlaneShow_tb , SUMA_SurfContHelp_DsetView ) ;
03577       MCW_register_hint(SO->SurfCont->ColPlaneShow_tb , "Shows/Hides Dset." ) ;
03578       SUMA_SET_SELECT_COLOR(SO->SurfCont->ColPlaneShow_tb);
03579       
03580       SO->SurfCont->ColPlaneShowOne_tb = XtVaCreateManagedWidget("1 Only", 
03581             xmToggleButtonWidgetClass, rc, NULL);
03582       XmToggleButtonSetState (SO->SurfCont->ColPlaneShowOne_tb, SO->SurfCont->ShowCurOnly, NOPE);
03583       XtAddCallback (SO->SurfCont->ColPlaneShowOne_tb, 
03584                   XmNvalueChangedCallback, SUMA_cb_ColPlaneShowOne_toggled, SO);
03585                   
03586       MCW_register_help(SO->SurfCont->ColPlaneShowOne_tb , SUMA_SurfContHelp_DsetViewOne ) ;
03587       MCW_register_hint(SO->SurfCont->ColPlaneShowOne_tb , "Shows ONLY selected Dset from foreground stack." ) ;
03588       SUMA_SET_SELECT_COLOR(SO->SurfCont->ColPlaneShowOne_tb);
03589            
03590       
03591       XtManageChild (rc);
03592       
03593       XtVaCreateManagedWidget (  "sep", 
03594                                  xmSeparatorWidgetClass, rcv, 
03595                                  XmNorientation, XmHORIZONTAL,NULL);
03596 
03597       
03598       rc = XtVaCreateWidget ("rowcolumn",
03599          xmRowColumnWidgetClass, rcv,
03600          XmNpacking, XmPACK_TIGHT, 
03601          XmNorientation , XmHORIZONTAL ,
03602          NULL);
03603          
03604       
03605       SO->SurfCont->SwitchDsetlst = SUMA_AllocateScrolledList ("Switch Dset", SUMA_LSP_SINGLE, 
03606                                  NOPE, NOPE,  
03607                                  SO->SurfCont->TopLevelShell, SWP_POINTER,
03608                                  SUMA_cb_SelectSwitchColPlane, (void *)SO,
03609                                  SUMA_cb_SelectSwitchColPlane, (void *)SO,
03610                                  SUMA_cb_CloseSwitchColPlane, NULL);
03611 
03612 
03613       pb = XtVaCreateWidget ("Switch Dset", 
03614          xmPushButtonWidgetClass, rc, 
03615          NULL);   
03616       XtAddCallback (pb, XmNactivateCallback, SUMA_cb_SurfCont_SwitchColPlane, (XtPointer)SO);
03617       MCW_register_hint(pb , "Switch between datasets" ) ;
03618       MCW_register_help(pb , SUMA_SurfContHelp_DsetSwitch ) ;
03619       XtManageChild (pb);
03620       
03621       pb = XtVaCreateWidget ("Load Dset", 
03622             xmPushButtonWidgetClass, rc, 
03623             NULL);   
03624          XtAddCallback (pb, XmNactivateCallback, SUMA_cb_Dset_Load, (XtPointer) SO);
03625          MCW_register_hint(pb ,  "Load a new dataset (much more with BHelp)" ) ;
03626          MCW_register_help(pb ,  SUMA_SurfContHelp_DsetLoad ) ;
03627          XtManageChild (pb);
03628       
03629       pb = XtVaCreateWidget ("Delete", 
03630          xmPushButtonWidgetClass, rc, 
03631          NULL);   
03632       XtAddCallback (pb, XmNactivateCallback, SUMA_cb_ColPlane_Delete, (XtPointer) SO);
03633        
03634 
03635       pb = XtVaCreateWidget ("Load Col", 
03636          xmPushButtonWidgetClass, rc, 
03637          NULL);   
03638       XtAddCallback (pb, XmNactivateCallback, SUMA_cb_ColPlane_Load, (XtPointer) SO);
03639       MCW_register_hint(pb , "Load a new color plane (same as ctrl+c)" ) ;
03640       MCW_register_help(pb , SUMA_SurfContHelp_DsetLoadCol  ) ;
03641       XtManageChild (pb);
03642       
03643        
03644       XtManageChild (rc);
03645       
03646       
03647       XtManageChild (rcv);
03648       
03649       XtManageChild (SO->SurfCont->ColPlane_fr);
03650    }
03651    
03652    
03653    if (1){ 
03654       Widget rc, pb_close, pb_bhelp;
03655       
03656       
03657       DispFrame = XtVaCreateWidget ("dialog",
03658          xmFrameWidgetClass, rc_left,
03659          XmNleftAttachment , XmATTACH_FORM ,
03660          XmNbottomAttachment  , XmATTACH_WIDGET ,
03661          XmNbottomWidget, rc_left,
03662          XmNshadowType , XmSHADOW_ETCHED_IN ,
03663          XmNshadowThickness , 5 ,
03664          XmNtraversalOn , False ,
03665          NULL); 
03666 
03667          
03668       
03669          XtVaCreateManagedWidget ("Disp. Cont.",
03670             xmLabelWidgetClass, DispFrame, 
03671             XmNchildType, XmFRAME_TITLE_CHILD,
03672             XmNchildHorizontalAlignment, XmALIGNMENT_BEGINNING,
03673             NULL);
03674 
03675       
03676       rc = XtVaCreateWidget ("rowcolumn",
03677             xmRowColumnWidgetClass, DispFrame,
03678             XmNpacking, XmPACK_TIGHT, 
03679             XmNorientation , XmHORIZONTAL ,
03680             XmNmarginHeight, SUMA_MARGIN ,
03681             XmNmarginWidth , SUMA_MARGIN ,
03682             NULL);
03683 
03684       pb_close = XtVaCreateWidget ("Close", 
03685          xmPushButtonWidgetClass, rc, 
03686          NULL);   
03687       XtAddCallback (pb_close, XmNactivateCallback, SUMA_cb_closeSurfaceCont, (XtPointer) SO);
03688       MCW_register_hint( pb_close , "Close Surface controller" ) ;
03689       MCW_register_help( pb_close , SUMA_closeSurfaceCont_help ) ;
03690       XtManageChild (pb_close); 
03691 
03692       pb_bhelp = XtVaCreateWidget ("BHelp", 
03693          xmPushButtonWidgetClass, rc, 
03694          NULL);
03695       XtAddCallback (pb_bhelp, XmNactivateCallback, MCW_click_help_CB, NULL);
03696       MCW_register_help(pb_bhelp , SUMA_help_help ) ;
03697       MCW_register_hint(pb_bhelp  , "Press this button then click on a button/label/menu for more help." ) ;
03698 
03699       XtManageChild (pb_bhelp); 
03700 
03701 
03702 
03703       
03704       XtManageChild (rc);
03705 
03706       
03707       XtManageChild (DispFrame);
03708    }
03709    
03710    XtManageChild (rc_right);
03711    XtManageChild (rc_left);
03712    XtManageChild (rc_mamma);
03713    XtManageChild (SO->SurfCont->Mainform);
03714    
03715    #if SUMA_CONTROLLER_AS_DIALOG    
03716    #else
03717 
03718 
03719    XtPopup(SO->SurfCont->TopLevelShell, XtGrabNone);
03720    #endif
03721    
03722    
03723    XtRealizeWidget (SO->SurfCont->TopLevelShell);
03724    
03725    SUMA_free (slabel);
03726    
03727    
03728    
03729    
03730    
03731 
03732 
03733    if (!SO->Overlays[0]) {
03734       SUMA_SurfaceObject *SOp=NULL;
03735       if (LocalHead) fprintf(SUMA_STDERR,"%s:\n"
03736                            "NO Overlays yet for this surface\n", FuncName);
03737       
03738 
03739 
03740       SOp = SUMA_findSOp_inDOv(SO->LocalDomainParentID, SUMAg_DOv, SUMAg_N_DOv);
03741       if (!SOp) {
03742          SUMA_SL_Err("Failed to find parent, should not be.");
03743       }
03744 
03745       if (!SUMA_GetOverlaysFromParent(SO, SOp)) {
03746          SUMA_SL_Err("Failed to copy overlays!");
03747          SUMA_RETURNe;
03748       }
03749    }
03750    
03751    if (SO->N_Overlays) {
03752       SUMA_InitializeColPlaneShell(SO, SO->Overlays[0]);
03753    }
03754    
03755    SUMA_RETURNe;
03756 }
03757 
03758 
03759 
03760 
03761 void SUMA_cb_closeSurfaceCont(Widget w, XtPointer data, XtPointer callData)
03762 {
03763    static char FuncName[] = {"SUMA_cb_closeSurfaceCont"};
03764    SUMA_SurfaceObject *SO;
03765    SUMA_Boolean LocalHead = NOPE;
03766    
03767    SUMA_ENTRY;
03768    
03769    SO = (SUMA_SurfaceObject *)data;
03770    
03771    if (!SO->SurfCont->TopLevelShell) SUMA_RETURNe;
03772 
03773    #ifdef SUMA_USE_WITHDRAW 
03774       if (LocalHead) fprintf (SUMA_STDERR,"%s: Withdrawing Surface Controller...\n", FuncName);
03775       
03776       XWithdrawWindow(SUMAg_CF->X->DPY_controller1, 
03777          XtWindow(SO->SurfCont->TopLevelShell),
03778          XScreenNumberOfScreen(XtScreen(SO->SurfCont->TopLevelShell)));
03779    #endif
03780    #ifdef SUMA_USE_DESTROY 
03781       if (LocalHead) fprintf (SUMA_STDERR,"%s: Destroying Surface Controller...\n", FuncName);
03782       XtDestroyWidget(SO->SurfCont->TopLevelShell);
03783       SO->SurfCont->TopLevelShell = NULL;
03784    #endif
03785 
03786     
03787    SUMA_RETURNe;
03788 
03789 }
03790 
03791 
03792 
03793 
03794 SUMA_Boolean SUMA_Init_SurfCont_SurfParam(SUMA_SurfaceObject *SO)
03795 {
03796    static char FuncName[]={"SUMA_Init_SurfCont_SurfParam"};
03797    char *slabel = NULL, *Name, *lbl30 = NULL;
03798    int i, imenu;
03799    Widget *w=NULL, whist=NULL;
03800    XmString string;
03801    SUMA_SurfaceObject *oSO;
03802    SUMA_Boolean SameSurface = NOPE;
03803    SUMA_Boolean LocalHead = NOPE;
03804    
03805    SUMA_ENTRY;
03806    oSO = *(SO->SurfCont->curSOp);
03807    if (oSO == SO) {
03808       SameSurface = YUP;
03809    } else {
03810       SameSurface = NOPE;
03811    }
03812    
03813    
03814    *(SO->SurfCont->curSOp) = (void *)SO;
03815    
03816    if (!SameSurface) {
03817       
03818       slabel = (char *)SUMA_malloc (sizeof(char) * (strlen(SO->Label) + 100));
03819       if (strlen(SO->Label) > 40) {
03820          char *tmpstr=NULL;
03821          tmpstr = SUMA_truncate_string(SO->Label, 40);
03822          if (tmpstr) { 
03823             sprintf(slabel,"[%s] Surface Controller", tmpstr);
03824             free(tmpstr); tmpstr=NULL;
03825          }
03826       } else {
03827          sprintf(slabel,"[%s] Surface Controller", SO->Label);
03828       }
03829       SUMA_LH("Setting title");
03830       XtVaSetValues(SO->SurfCont->TopLevelShell, XtNtitle, slabel, NULL);
03831 
03832       
03833          
03834          lbl30 = SUMA_set_string_length(SO->Label, ' ', 27);
03835          if (lbl30) {
03836             sprintf(slabel,"%s\n%d nodes: %d tri.", lbl30, SO->N_Node, SO->N_FaceSet); 
03837             SUMA_free(lbl30); lbl30 = NULL;
03838          } else {
03839             sprintf(slabel,"???\n%d nodes: %d tri.", SO->N_Node, SO->N_FaceSet); 
03840          }
03841          SUMA_LH("Setting label");
03842          string = XmStringCreateLocalized (slabel);
03843          XtVaSetValues(SO->SurfCont->SurfInfo_label, XmNlabelString, string, NULL);
03844          XmStringFree (string);
03845 
03846       if (slabel) SUMA_free(slabel); slabel = NULL;
03847       
03848 
03849 
03850 
03851       SUMA_LH("Setting RenderMode");
03852       
03853       imenu = -1;
03854       switch (SO->PolyMode) {
03855          case SRM_ViewerDefault:
03856             imenu = SW_SurfCont_RenderViewerDefault;
03857             break;
03858          case SRM_Fill:
03859             imenu = SW_SurfCont_RenderFill;
03860             break;
03861          case SRM_Line:
03862             imenu = SW_SurfCont_RenderLine;
03863             break;
03864          case SRM_Points:
03865             imenu = SW_SurfCont_RenderPoints;
03866             break;
03867          default: 
03868             fprintf (SUMA_STDERR, "Error %s: Unexpected something.\n", FuncName);
03869             break;
03870       }
03871       
03872       i = 0;
03873       Name = NULL;
03874       while (&(RenderMode_Menu[i])) {
03875          if ((int)RenderMode_Menu[i].callback_data == imenu) {
03876             Name = RenderMode_Menu[i].label;
03877             if (LocalHead) fprintf (SUMA_STDERR,"Looking for %s\n", Name);
03878             
03879             w = SO->SurfCont->RenderModeMenu;
03880             for (i=0; i< SW_N_SurfCont_Render; ++i) {
03881                if (LocalHead) fprintf (SUMA_STDERR,"I have %s\n", XtName(w[i]));
03882                if (strcmp(Name, XtName(w[i])) == 0) {
03883                   SUMA_LH("Match!");
03884                   XtVaSetValues(  w[0], XmNmenuHistory , w[i] , NULL ) ;  
03885                   SUMA_RETURN(YUP);
03886               }
03887             }
03888          }
03889          ++i;
03890       }
03891    } 
03892    
03893     
03894     
03895    SUMA_RETURN(YUP);
03896 }
03897 
03898 
03899 
03900 
03901 
03902 
03903 
03904 SUMA_Boolean SUMA_OpenDrawROIWindow (SUMA_DRAWN_ROI *DrawnROI)
03905 {
03906    static char FuncName[] = {"SUMA_OpenDrawROIWindow"};
03907    SUMA_Boolean LocalHead = NOPE;
03908    
03909    SUMA_ENTRY;
03910    
03911    if (!SUMAg_CF->X->DrawROI->AppShell) { 
03912       SUMA_CreateDrawROIWindow ();
03913    } else {
03914       
03915       #ifdef SUMA_USE_WITHDRAW
03916          if (LocalHead) fprintf (SUMA_STDERR,"%s: raising DrawROI window \n", FuncName);
03917          XMapRaised(SUMAg_CF->X->DPY_controller1, XtWindow(SUMAg_CF->X->DrawROI->AppShell));
03918       #endif
03919    }
03920    
03921    if (DrawnROI) {
03922       
03923       SUMA_InitializeDrawROIWindow (DrawnROI);
03924    } 
03925    
03926    SUMA_RETURN(YUP);
03927 }
03928  
03929 
03930 
03931 
03932 SUMA_Boolean SUMA_InitializeDrawROIWindow (SUMA_DRAWN_ROI *DrawnROI)
03933 {
03934    static char FuncName[] = {"SUMA_InitializeDrawROIWindow"};
03935    SUMA_SurfaceObject *SOp = NULL;
03936    char sbuf[SUMA_MAX_LABEL_LENGTH];
03937    SUMA_Boolean LocalHead = NOPE;
03938    
03939    SUMA_ENTRY;
03940    
03941    if (!DrawnROI) {
03942       if (LocalHead) fprintf (SUMA_STDERR, "%s: Initializing with NULL.\n", FuncName);
03943       SUMA_SET_LABEL(SUMAg_CF->X->DrawROI->ParentLabel_lb, "Parent: -");
03944       SUMA_SET_TEXT_FIELD(SUMAg_CF->X->DrawROI->ROIlbl->textfield, "-");
03945       SUMA_SET_TEXT_FIELD(SUMAg_CF->X->DrawROI->ROIval->textfield, "0");
03946    }else {
03947       if (LocalHead) fprintf (SUMA_STDERR, "%s: Initializing with %p.\n", FuncName, DrawnROI);
03948       SOp = SUMA_findSOp_inDOv(DrawnROI->Parent_idcode_str, SUMAg_DOv, SUMAg_N_DOv);
03949       sprintf (sbuf, "Parent: %s", SOp->Label);
03950       if (SOp) {
03951          SUMA_SET_LABEL(SUMAg_CF->X->DrawROI->ParentLabel_lb, sbuf);
03952       } else {
03953          SUMA_SET_LABEL(SUMAg_CF->X->DrawROI->ParentLabel_lb, "Parent: Not Found");
03954       }  
03955 
03956       SUMAg_CF->X->DrawROI->curDrawnROI = DrawnROI; 
03957 
03958       SUMA_SET_TEXT_FIELD(SUMAg_CF->X->DrawROI->ROIlbl->textfield, DrawnROI->Label);
03959       
03960       SUMAg_CF->X->DrawROI->ROIval->value = DrawnROI->iLabel;
03961       sprintf(sbuf,"%d", DrawnROI->iLabel);
03962       SUMA_SET_TEXT_FIELD(SUMAg_CF->X->DrawROI->ROIval->textfield, sbuf);
03963    }
03964    SUMA_RETURN (YUP);
03965 }
03966 
03967 
03968 
03969 
03970 SUMA_Boolean SUMA_InitializeColPlaneShell(SUMA_SurfaceObject *SO, SUMA_OVERLAYS *ColPlane)
03971 {
03972    static char FuncName[] = {"SUMA_InitializeColPlaneShell"};
03973    char sbuf[SUMA_MAX_LABEL_LENGTH];
03974    float range[2];
03975    int loc[2], i;
03976    
03977    SUMA_Boolean LocalHead = NOPE;
03978    
03979    SUMA_ENTRY;
03980    
03981    SUMA_LH("Called");
03982    if (!SO->SurfCont->ColPlane_fr) SUMA_RETURN(YUP);
03983    
03984    if (!ColPlane) {
03985       SUMA_LH("Initializing with NULL");
03986       SUMA_INSERT_CELL_STRING(SO->SurfCont->ColPlaneLabelTable, 0, 1, "-");
03987       SUMA_INSERT_CELL_STRING(SO->SurfCont->ColPlaneLabelTable, 1, 1, "-");
03988       SUMA_SET_TEXT_FIELD(SO->SurfCont->ColPlaneOrder->textfield, "-");
03989       SUMA_SET_TEXT_FIELD(SO->SurfCont->ColPlaneOpacity->textfield,"-");
03990       SUMA_SET_TEXT_FIELD(SO->SurfCont->ColPlaneDimFact->textfield,"-");
03991    }else {
03992       SUMA_LH("Initializing for real");
03993       if (strlen(ColPlane->Label) + strlen(SO->Label) +25 > SUMA_MAX_LABEL_LENGTH) {
03994          SUMA_SL_Warn("Surface Labels too long!");
03995          SUMA_INSERT_CELL_STRING(SO->SurfCont->ColPlaneLabelTable, 0, 1, "Surface Labels too long!");
03996          SUMA_INSERT_CELL_STRING(SO->SurfCont->ColPlaneLabelTable, 1, 1, "Surface Labels too long!");
03997       } else {
03998          if (strlen(SO->Label) > 40) {
03999             char *tmpstr=NULL;
04000             tmpstr = SUMA_truncate_string(SO->Label, 40);
04001             if (tmpstr) { 
04002                sprintf (sbuf, "Label: %s\nParent: %s", ColPlane->Label, tmpstr);
04003                free(tmpstr); tmpstr = NULL;
04004             }
04005             SUMA_INSERT_CELL_STRING(SO->SurfCont->ColPlaneLabelTable, 0, 1, ColPlane->Label);
04006             SUMA_INSERT_CELL_STRING(SO->SurfCont->ColPlaneLabelTable, 1, 1, tmpstr);
04007          } else {
04008             sprintf (sbuf, "Label: %s\nParent: %s", ColPlane->Label, SO->Label);
04009          }
04010          SUMA_INSERT_CELL_STRING(SO->SurfCont->ColPlaneLabelTable, 0, 1, ColPlane->Label);
04011          SUMA_INSERT_CELL_STRING(SO->SurfCont->ColPlaneLabelTable, 1, 1, SO->Label);
04012       }
04013       
04014       SO->SurfCont->ColPlaneOrder->value = ColPlane->PlaneOrder;
04015       sprintf(sbuf,"%d", ColPlane->PlaneOrder);
04016       SUMA_SET_TEXT_FIELD(SO->SurfCont->ColPlaneOrder->textfield, sbuf);
04017       
04018       SO->SurfCont->ColPlaneOpacity->value = ColPlane->GlobalOpacity;
04019       sprintf(sbuf,"%.1f", ColPlane->GlobalOpacity);
04020       SUMA_SET_TEXT_FIELD(SO->SurfCont->ColPlaneOpacity->textfield, sbuf);
04021       
04022       if (ColPlane->OptScl) SO->SurfCont->ColPlaneDimFact->value = ColPlane->OptScl->BrightFact;
04023       else SO->SurfCont->ColPlaneDimFact->value = ColPlane->DimFact;
04024       sprintf(sbuf,"%.1f", SO->SurfCont->ColPlaneDimFact->value);
04025       SUMA_SET_TEXT_FIELD(SO->SurfCont->ColPlaneDimFact->textfield, sbuf);
04026       
04027    }
04028    
04029    XmToggleButtonSetState (SO->SurfCont->ColPlaneShow_tb, ColPlane->Show, NOPE);
04030 
04031    SO->SurfCont->curColPlane = ColPlane;
04032       
04033    
04034    SUMA_Init_SurfCont_CrossHair(SO);
04035    
04036    
04037    if (SO->SurfCont->cmp_ren->cmap_context) {
04038       if (strcmp(SO->SurfCont->curColPlane->cmapname, "explicit") == 0) {
04039          if (XtIsManaged(SO->SurfCont->DsetMap_fr)) {
04040             SUMA_LH("An RGB dset, no surface controls to be seen");
04041             XtUnmanageChild(SO->SurfCont->DsetMap_fr);
04042             XtUnmanageChild(XtParent(SO->SurfCont->DsetMap_fr));
04043          }
04044       } else {
04045          if (!XtIsManaged(SO->SurfCont->DsetMap_fr)) {
04046             SUMA_LH("A non RGB dset, surface controls need to be seen\nBut only when ColPlane_fr is also shown (frame may be hidden by Dsets button action)");
04047             if (XtIsManaged(SO->SurfCont->ColPlane_fr)) {
04048                XtManageChild(XtParent(SO->SurfCont->DsetMap_fr));
04049                XtManageChild(SO->SurfCont->DsetMap_fr);
04050             }
04051          }
04052          SUMA_cmap_wid_handleRedisplay((XtPointer) SO); 
04053 
04054          
04055          SUMA_set_cmap_options(SO, YUP, NOPE);
04056 
04057          
04058          SUMA_SetCmapMenuChoice(SO, ColPlane->cmapname);
04059 
04060          
04061          if (SUMA_GetDsetColRange(SO->SurfCont->curColPlane->dset_link, SO->SurfCont->curColPlane->OptScl->tind, range, loc)) {   
04062             SUMA_SetScaleRange(SO, range );
04063          }
04064       }
04065    } else {
04066       SUMA_LH("cmap_context was NULL");
04067    }
04068    
04069    
04070    SUMA_RETURN (YUP);
04071 }
04072 
04073 
04074 
04075 
04076 
04077 
04078 SUMA_Boolean SUMA_UpdateColPlaneShellAsNeeded(SUMA_SurfaceObject *SO)
04079 {
04080    static char FuncName[] = {"SUMA_UpdateColPlaneShellAsNeeded"};
04081    int i=-1;
04082    SUMA_SurfaceObject *SOi=NULL;
04083    SUMA_Boolean LocalHead = NOPE;
04084    
04085    SUMA_ENTRY;
04086    
04087    SUMA_LH("Called");
04088    
04089    for (i=0; i<SUMAg_N_DOv; ++i) {
04090       if (SUMA_isSO(SUMAg_DOv[i])) {
04091          SOi = (SUMA_SurfaceObject *)SUMAg_DOv[i].OP;
04092          if (SOi != SO && SUMA_isRelated (SOi, SO, 1)) { 
04093             if (SOi->SurfCont) {
04094                if (SOi->SurfCont != SO->SurfCont && SOi->SurfCont->ColPlane_fr && SOi->SurfCont->curColPlane == SO->SurfCont->curColPlane) {
04095                   SUMA_InitializeColPlaneShell(SOi, SOi->SurfCont->curColPlane);
04096                }
04097             }
04098          }
04099       }
04100    }
04101    
04102    SUMA_RETURN(YUP);
04103 }
04104 
04105 
04106 
04107 
04108 void SUMA_CreateDrawROIWindow(void)
04109 {
04110    static char FuncName[] = {"SUMA_CreateDrawROIWindow"};
04111    Widget form, frame, rc, pb, rc_ur, rcv, rc_switch, rc_save;
04112    int i;
04113    SUMA_Boolean LocalHead = NOPE;
04114    
04115    SUMA_ENTRY;
04116 
04117    if (SUMAg_CF->X->DrawROI->AppShell) {
04118       fprintf (SUMA_STDERR,"Error %s: SUMAg_CF->X->DrawROI->AppShell!=NULL. Should not be here.\n", FuncName);
04119       SUMA_RETURNe;
04120    }
04121     
04122    
04123 
04124    SUMAg_CF->X->DrawROI->AppShell = XtVaAppCreateShell("Draw ROI" , "Suma" ,
04125       topLevelShellWidgetClass , SUMAg_CF->X->DPY_controller1 ,
04126       NULL ) ;
04127    
04128    
04129    XtVaSetValues( SUMAg_CF->X->DrawROI->AppShell,
04130            XmNdeleteResponse, XmDO_NOTHING,
04131            NULL);  
04132              
04133    
04134    XmAddWMProtocolCallback(
04135       SUMAg_CF->X->DrawROI->AppShell,
04136       XmInternAtom( SUMAg_CF->X->DPY_controller1 , "WM_DELETE_WINDOW" , False ) ,
04137       SUMA_cb_CloseDrawROIWindow, NULL) ;
04138    
04139    
04140    form = XtVaCreateWidget ("dialog", 
04141       xmFormWidgetClass, SUMAg_CF->X->DrawROI->AppShell,
04142       XmNborderWidth , 0 ,
04143       XmNmarginHeight , SUMA_MARGIN ,
04144       XmNmarginWidth  , SUMA_MARGIN ,
04145       XmNshadowThickness, 2,
04146       XmNshadowType, XmSHADOW_ETCHED_IN,
04147       NULL); 
04148    
04149    
04150    frame = XtVaCreateWidget ("dialog",
04151       xmFrameWidgetClass, form,
04152       XmNleftAttachment , XmATTACH_FORM ,
04153       XmNtopAttachment  , XmATTACH_FORM ,
04154       XmNshadowType , XmSHADOW_ETCHED_IN ,
04155       XmNshadowThickness , 5 ,
04156       XmNtraversalOn , False ,
04157       NULL); 
04158    
04159    XtVaCreateManagedWidget ("ROI",
04160       xmLabelWidgetClass, frame, 
04161       XmNchildType, XmFRAME_TITLE_CHILD,
04162       XmNchildHorizontalAlignment, XmALIGNMENT_BEGINNING,
04163       NULL);
04164    
04165    
04166    
04167    rcv = XtVaCreateWidget ("rowcolumn",
04168          xmRowColumnWidgetClass, frame,
04169          XmNorientation , XmVERTICAL ,
04170          XmNmarginHeight, 0 ,
04171          XmNmarginWidth , 0 ,
04172          NULL);
04173          
04174    
04175    rc = XtVaCreateWidget ("rowcolumn",
04176          xmRowColumnWidgetClass, rcv,
04177          XmNpacking, XmPACK_TIGHT, 
04178          XmNorientation , XmHORIZONTAL ,
04179          XmNmarginHeight, 0 ,
04180          XmNmarginWidth , 0 ,
04181          NULL);
04182    
04183    
04184    SUMAg_CF->X->DrawROI->ParentLabel_lb = XtVaCreateManagedWidget ("Parent: N/A", 
04185             xmLabelWidgetClass, rc,
04186             NULL);
04187    MCW_register_help(SUMAg_CF->X->DrawROI->ParentLabel_lb , SUMA_DrawROI_ParentLabel_help ) ;
04188    MCW_register_hint(SUMAg_CF->X->DrawROI->ParentLabel_lb , "Label of the ROI's parent surface" ) ;
04189    
04190    XtManageChild(rc);
04191    
04192    
04193    rc = XtVaCreateWidget ("rowcolumn",
04194          xmRowColumnWidgetClass, rcv,
04195          XmNpacking, XmPACK_TIGHT, 
04196          XmNorientation , XmHORIZONTAL ,
04197          XmNmarginHeight, 0 ,
04198          XmNmarginWidth , 0 ,
04199          NULL);
04200 
04201    
04202    
04203    SUMAg_CF->ROI_mode = YUP;
04204    
04205    SUMA_UpdateAllViewerCursor(); 
04206    SUMAg_CF->X->DrawROI->DrawROImode_tb = XtVaCreateManagedWidget("Draw Mode", 
04207       xmToggleButtonWidgetClass, rc, NULL);
04208    XmToggleButtonSetState (SUMAg_CF->X->DrawROI->DrawROImode_tb, SUMAg_CF->ROI_mode, NOPE);
04209    XtAddCallback (SUMAg_CF->X->DrawROI->DrawROImode_tb, 
04210                   XmNvalueChangedCallback, SUMA_cb_DrawROImode_toggled, 
04211                   NULL);
04212    MCW_register_help(SUMAg_CF->X->DrawROI->DrawROImode_tb , SUMA_DrawROI_DrawROIMode_help ) ;
04213    MCW_register_hint(SUMAg_CF->X->DrawROI->DrawROImode_tb , "Toggles ROI drawing mode" ) ;
04214 
04215    
04216    SUMA_SET_SELECT_COLOR(SUMAg_CF->X->DrawROI->DrawROImode_tb);
04217    
04218    
04219    SUMAg_CF->X->DrawROI->Penmode_tb = XtVaCreateManagedWidget("Pen", 
04220       xmToggleButtonWidgetClass, rc, NULL);
04221    XmToggleButtonSetState (SUMAg_CF->X->DrawROI->Penmode_tb, SUMAg_CF->Pen_mode, NOPE);
04222    XtAddCallback (SUMAg_CF->X->DrawROI->Penmode_tb, 
04223                   XmNvalueChangedCallback, SUMA_cb_DrawROIPen_toggled, 
04224                   NULL);
04225    MCW_register_help(SUMAg_CF->X->DrawROI->Penmode_tb , SUMA_DrawROI_PenMode_help ) ;
04226    MCW_register_hint(SUMAg_CF->X->DrawROI->Penmode_tb , "Toggles Pen drawing mode" ) ;
04227 
04228    
04229    SUMA_SET_SELECT_COLOR(SUMAg_CF->X->DrawROI->Penmode_tb);
04230    
04231    
04232    if (SUMAg_CF->ROI_mode) XtSetSensitive (SUMAg_CF->X->DrawROI->Penmode_tb, 1);
04233    else XtSetSensitive (SUMAg_CF->X->DrawROI->Penmode_tb, 0);
04234    
04235    
04236    SUMAg_CF->X->DrawROI->AfniLink_tb = XtVaCreateManagedWidget("Afni", 
04237       xmToggleButtonWidgetClass, rc, NULL);
04238    
04239    #if 0
04240    
04241    if (SUMAg_CF->Connected) SUMAg_CF->ROI2afni = YUP;
04242    else SUMAg_CF->ROI2afni = NOPE;
04243    #endif
04244    SUMAg_CF->ROI2afni = NOPE; 
04245    
04246    XmToggleButtonSetState (SUMAg_CF->X->DrawROI->AfniLink_tb, SUMAg_CF->ROI2afni, NOPE);
04247    XtAddCallback (SUMAg_CF->X->DrawROI->AfniLink_tb, 
04248                   XmNvalueChangedCallback, SUMA_cb_AfniLink_toggled, 
04249                   NULL);
04250    MCW_register_help(SUMAg_CF->X->DrawROI->AfniLink_tb , SUMA_DrawROI_AfniLink_help ) ;
04251    MCW_register_hint(SUMAg_CF->X->DrawROI->AfniLink_tb , "Toggles Link to Afni" ) ;
04252 
04253    
04254    SUMA_SET_SELECT_COLOR(SUMAg_CF->X->DrawROI->AfniLink_tb);
04255    
04256    
04257    SUMA_BuildMenuReset(0);
04258    SUMA_BuildMenu (rc, XmMENU_OPTION, 
04259                    "Dist", '\0', YUP, DrawROI_WhatDist_Menu, 
04260                    "DoDist", "Report length of drawn segments? (BHelp for more)", SUMA_DrawROI_WhatDist_help,   
04261                    SUMAg_CF->X->DrawROI->WhatDistMenu);
04262    XtManageChild (SUMAg_CF->X->DrawROI->WhatDistMenu[SW_DrawROI_WhatDist]);
04263    
04264     
04265    XtManageChild (rc);
04266    
04267    
04268    rc = XtVaCreateWidget ("rowcolumn",
04269       xmRowColumnWidgetClass, rcv,
04270       XmNpacking, XmPACK_TIGHT, 
04271       XmNorientation , XmHORIZONTAL ,
04272       XmNmarginHeight, 0 ,
04273       XmNmarginWidth , 0 ,
04274       NULL);
04275   
04276    
04277    SUMA_CreateTextField ( rc, "Label:",
04278                            6, SUMA_DrawROI_NewLabel,
04279                            "Label of ROI being drawn", SUMA_DrawROI_Label_help,
04280                            SUMAg_CF->X->DrawROI->ROIlbl);
04281                         
04282    SUMA_CreateArrowField ( rc, "Value:",
04283                            1, 0, 999, 1,
04284                            3, SUMA_int,
04285                            NOPE,
04286                            SUMA_DrawROI_NewValue, NULL,
04287                            "Integer value associated with ROI", SUMA_DrawROI_Value_help,
04288                            SUMAg_CF->X->DrawROI->ROIval);
04289    
04290    XtManageChild (rc);
04291    
04292    
04293    
04294    XtVaCreateManagedWidget ("sep", xmSeparatorWidgetClass, rcv, NULL);
04295    
04296    
04297    rc_ur = XtVaCreateWidget ("rowcolumn",
04298       xmRowColumnWidgetClass, rcv,
04299       XmNpacking, XmPACK_TIGHT, 
04300       XmNorientation , XmHORIZONTAL ,
04301       XmNmarginHeight, SUMA_MARGIN ,
04302       XmNmarginWidth , SUMA_MARGIN ,
04303       NULL);
04304 
04305    SUMAg_CF->X->DrawROI->Undo_pb = XtVaCreateWidget ("Undo", 
04306       xmPushButtonWidgetClass, rc_ur, 
04307       NULL);
04308    XtAddCallback (SUMAg_CF->X->DrawROI->Undo_pb, XmNactivateCallback, SUMA_cb_DrawROI_Undo, NULL);   
04309    MCW_register_help(SUMAg_CF->X->DrawROI->Undo_pb , SUMA_DrawROI_Undo_help ) ;
04310    MCW_register_hint(SUMAg_CF->X->DrawROI->Undo_pb , "Undo the last action on the stack" ) ;
04311    XtManageChild (SUMAg_CF->X->DrawROI->Undo_pb);
04312    
04313    SUMAg_CF->X->DrawROI->Redo_pb = XtVaCreateWidget ("Redo", 
04314       xmPushButtonWidgetClass, rc_ur, 
04315       NULL);
04316    XtAddCallback (SUMAg_CF->X->DrawROI->Redo_pb, XmNactivateCallback, SUMA_cb_DrawROI_Redo, NULL);
04317    MCW_register_help(SUMAg_CF->X->DrawROI->Redo_pb , SUMA_DrawROI_Redo_help ) ;
04318    MCW_register_hint(SUMAg_CF->X->DrawROI->Redo_pb , "Redo the last undone action" ) ;
04319    XtManageChild (SUMAg_CF->X->DrawROI->Redo_pb);
04320    
04321    XtVaCreateManagedWidget (  "sep", 
04322                               xmSeparatorWidgetClass, rc_ur, 
04323                               XmNorientation, XmVERTICAL,NULL);
04324    
04325    SUMAg_CF->X->DrawROI->Join_pb = XtVaCreateWidget ("Join", 
04326       xmPushButtonWidgetClass, rc_ur, 
04327       NULL);
04328    XtAddCallback (SUMAg_CF->X->DrawROI->Join_pb, XmNactivateCallback, SUMA_cb_DrawROI_Join, NULL);
04329    MCW_register_help(SUMAg_CF->X->DrawROI->Join_pb , SUMA_DrawROI_Join_help ) ;
04330    MCW_register_hint(SUMAg_CF->X->DrawROI->Join_pb , "Join the first node of the path to the last" ) ;
04331    XtManageChild (SUMAg_CF->X->DrawROI->Join_pb);
04332                                  
04333    SUMAg_CF->X->DrawROI->Finish_pb = XtVaCreateWidget ("Finish", 
04334       xmPushButtonWidgetClass, rc_ur, 
04335       NULL);
04336    XtAddCallback (SUMAg_CF->X->DrawROI->Finish_pb, XmNactivateCallback, SUMA_cb_DrawROI_Finish, NULL);
04337    MCW_register_help(SUMAg_CF->X->DrawROI->Finish_pb , SUMA_DrawROI_Finish_help ) ;
04338    MCW_register_hint(SUMAg_CF->X->DrawROI->Finish_pb , "Label ROI as finished." ) ;
04339    XtManageChild (SUMAg_CF->X->DrawROI->Finish_pb);
04340                                  
04341    
04342    XtVaCreateManagedWidget ("sep", xmSeparatorWidgetClass, rcv, NULL);
04343 
04344    
04345    XtManageChild (rc_ur);
04346   
04347    
04348    rc_switch = XtVaCreateWidget ("rowcolumn",
04349       xmRowColumnWidgetClass, rcv,
04350       XmNpacking, XmPACK_TIGHT, 
04351       XmNorientation , XmHORIZONTAL ,
04352       XmNmarginHeight, SUMA_MARGIN ,
04353       XmNmarginWidth , SUMA_MARGIN ,
04354       NULL);
04355 
04356    
04357    
04358    
04359    SUMAg_CF->X->DrawROI->SwitchROIlst = SUMA_AllocateScrolledList ("Switch ROI", SUMA_LSP_SINGLE, 
04360                               NOPE, YUP,
04361                               SUMAg_CF->X->DrawROI->AppShell, SWP_TOP_LEFT,
04362                               SUMA_cb_SelectSwitchROI, NULL,
04363                               SUMA_cb_SelectSwitchROI, NULL,
04364                               SUMA_cb_CloseSwitchROI, NULL);
04365     
04366    pb = XtVaCreateWidget ("Switch ROI", xmPushButtonWidgetClass, rc_switch, NULL);
04367    XtAddCallback (pb, XmNactivateCallback, SUMA_cb_DrawROI_SwitchROI, SUMAg_CF->X->DrawROI->SwitchROIlst);
04368    MCW_register_help(pb , SUMA_DrawROI_SwitchROI_help ) ;
04369    MCW_register_hint(pb , "Switch between ROIs." ) ;
04370    XtManageChild (pb);
04371    
04372    SUMAg_CF->X->DrawROI->Load_pb = XtVaCreateWidget ("Load", 
04373       xmPushButtonWidgetClass, rc_switch, 
04374       NULL);
04375    XtAddCallback (SUMAg_CF->X->DrawROI->Load_pb, XmNactivateCallback, SUMA_cb_DrawROI_Load, NULL);
04376    MCW_register_help(SUMAg_CF->X->DrawROI->Load_pb , SUMA_DrawROI_Load_help ) ;
04377    MCW_register_hint(SUMAg_CF->X->DrawROI->Load_pb , "Load a Drawn ROI" ) ;
04378    XtManageChild (SUMAg_CF->X->DrawROI->Load_pb);
04379    
04380    XtVaCreateManagedWidget (  "sep", 
04381                            xmSeparatorWidgetClass, rc_switch, 
04382                            XmNorientation, XmVERTICAL,NULL);
04383                                                             
04384    SUMAg_CF->X->DrawROI->Delete_pb = XtVaCreateWidget ("delete ROI", 
04385       xmPushButtonWidgetClass, rc_switch, 
04386       NULL);
04387    XtAddCallback (SUMAg_CF->X->DrawROI->Delete_pb, XmNactivateCallback, SUMA_cb_DrawROI_Delete, NULL);
04388    MCW_register_hint( SUMAg_CF->X->DrawROI->Delete_pb , "Click twice in 5 seconds to delete ROI. No Undo for this action." ) ;
04389    MCW_register_help( SUMAg_CF->X->DrawROI->Delete_pb , SUMA_DrawROI_DeleteROI_help);
04390    MCW_set_widget_bg( SUMAg_CF->X->DrawROI->Delete_pb , MCW_hotcolor(SUMAg_CF->X->DrawROI->Delete_pb) , 0 ) ;
04391 
04392    XtManageChild (SUMAg_CF->X->DrawROI->Delete_pb); 
04393 
04394 
04395    
04396    XtManageChild (rc_switch);
04397    
04398    
04399    XtVaCreateManagedWidget ("sep", xmSeparatorWidgetClass, rcv, NULL);
04400    
04401    
04402    rc_save = XtVaCreateWidget ("rowcolumn",
04403       xmRowColumnWidgetClass, rcv,
04404       XmNpacking, XmPACK_TIGHT, 
04405       XmNorientation , XmHORIZONTAL ,
04406       XmNmarginHeight, SUMA_MARGIN ,
04407       XmNmarginWidth , SUMA_MARGIN ,
04408       NULL);
04409 
04410    SUMAg_CF->X->DrawROI->Save_pb = XtVaCreateWidget ("Save", 
04411       xmPushButtonWidgetClass, rc_save, 
04412       NULL);
04413    XtAddCallback (SUMAg_CF->X->DrawROI->Save_pb, XmNactivateCallback, SUMA_cb_DrawROI_Save, NULL);
04414    MCW_register_help(SUMAg_CF->X->DrawROI->Save_pb , SUMA_DrawROI_Save_help ) ;
04415    MCW_register_hint(SUMAg_CF->X->DrawROI->Save_pb , "Save the Drawn ROI to disk." ) ;
04416    XtManageChild (SUMAg_CF->X->DrawROI->Save_pb);
04417 
04418    
04419    SUMA_BuildMenuReset(0);
04420    SUMA_BuildMenu (rc_save, XmMENU_OPTION, 
04421                                NULL, '\0', YUP, DrawROI_SaveMode_Menu, 
04422                                "Frm.", "File format for saving ROI", SUMA_DrawROI_SaveFormat_help, 
04423                                SUMAg_CF->X->DrawROI->SaveModeMenu);
04424    XtManageChild (SUMAg_CF->X->DrawROI->SaveModeMenu[SW_DrawROI_SaveMode]);
04425       
04426    
04427    SUMA_BuildMenuReset(0);
04428    SUMA_BuildMenu (rc_save, XmMENU_OPTION, 
04429                                NULL, '\0', YUP, DrawROI_SaveWhat_Menu, 
04430                                "What", "Which ROIs to save?", SUMA_DrawROI_SaveWhat_help,   
04431                                SUMAg_CF->X->DrawROI->SaveWhatMenu);
04432    XtManageChild (SUMAg_CF->X->DrawROI->SaveWhatMenu[SW_DrawROI_SaveWhat]);
04433       
04434 
04435    XtVaCreateManagedWidget (  "sep", 
04436                               xmSeparatorWidgetClass, rc_save, 
04437                               XmNorientation, XmVERTICAL,NULL);
04438 
04439    pb = XtVaCreateWidget ("BHelp", 
04440       xmPushButtonWidgetClass, rc_save, 
04441       NULL);
04442    XtAddCallback (pb, XmNactivateCallback, MCW_click_help_CB, NULL);  
04443    MCW_register_help(pb , SUMA_help_help ) ;
04444    MCW_register_hint(pb , "Press this button then click on a button/label/menu for more help." ) ;
04445    XtManageChild (pb);
04446     
04447    SUMAg_CF->X->DrawROI->Close_pb = XtVaCreateWidget ("Close", 
04448       xmPushButtonWidgetClass, rc_save, 
04449       NULL);   
04450    XtAddCallback (SUMAg_CF->X->DrawROI->Close_pb, XmNactivateCallback, SUMA_cb_CloseDrawROIWindow, NULL);
04451    MCW_register_hint(SUMAg_CF->X->DrawROI->Close_pb  , "Close Draw ROI window" ) ;
04452    MCW_register_help(SUMAg_CF->X->DrawROI->Close_pb  , SUMA_closeDrawROI_help ) ;
04453    XtManageChild (SUMAg_CF->X->DrawROI->Close_pb);  
04454    
04455    
04456    XtManageChild (rc_save);
04457 
04458    
04459    XtManageChild (rcv);
04460    
04461    
04462    XtManageChild (frame);
04463    
04464    
04465    XtManageChild (form);
04466 
04467    
04468    i=0;
04469    while (i < SUMAg_N_SVv && !SUMAg_SVv[i].X->ViewCont->TopLevelShell && SUMAg_SVv[i].isShaded) ++i; 
04470 
04471    if (i < SUMAg_N_SVv) {
04472       if (LocalHead) fprintf (SUMA_STDERR, "%s: i = %d\n", FuncName, i);
04473       SUMA_PositionWindowRelative (SUMAg_CF->X->DrawROI->AppShell, SUMAg_SVv[i].X->TOPLEVEL, SWP_TOP_RIGHT);
04474    }
04475 
04476    
04477    XtRealizeWidget (SUMAg_CF->X->DrawROI->AppShell);
04478    
04479    
04480    SUMA_RETURNe;
04481 }
04482 
04483 
04484 
04485 
04486 
04487 
04488 
04489 
04490 
04491 
04492 
04493 
04494 
04495 
04496 
04497 
04498 
04499 
04500 
04501 
04502 
04503 
04504 
04505 
04506 
04507 
04508 
04509    
04510 SUMA_LIST_WIDGET * SUMA_AllocateScrolledList (char *Label, int SelectPolicy, 
04511                                                 SUMA_Boolean RemoveDups, SUMA_Boolean ShowSorted,
04512                                                 Widget PosRef, SUMA_WINDOW_POSITION Pos,
04513                                                 void (*Default_cb)(Widget w, XtPointer data, XtPointer calldata), void *Default_Data,
04514                                                 void (*Select_cb)(Widget w, XtPointer data, XtPointer calldata), void *Select_Data,
04515                                                 void (*CloseList_cb)(Widget w, XtPointer data, XtPointer calldata), void *CloseList_Data)
04516 {
04517    static char FuncName[]={"SUMA_AllocateScrolledList"};
04518    SUMA_LIST_WIDGET *LW = NULL;
04519 
04520    SUMA_ENTRY;
04521    
04522 
04523    if (!Label) {
04524       SUMA_SLP_Err("Null Label");
04525       SUMA_RETURN(LW);
04526    }
04527    
04528    LW = (SUMA_LIST_WIDGET *) SUMA_malloc(sizeof(SUMA_LIST_WIDGET));
04529    LW->toplevel = NULL;
04530    LW->list = NULL;      
04531    LW->rc = NULL;  
04532    LW->RemoveDups = RemoveDups;
04533    LW->SelectPolicy = SelectPolicy;
04534    LW->ShowSorted = ShowSorted;
04535    LW->Label = (char *)SUMA_calloc(strlen(Label)+1, sizeof(char));
04536    LW->Label = strcpy (LW->Label, Label);
04537    LW->PosRef = PosRef;
04538    LW->Pos = Pos;
04539    LW->CloseList_cb = CloseList_cb;
04540    LW->CloseList_Data = CloseList_Data;
04541    LW->Default_cb = Default_cb;
04542    LW->Default_Data = Default_Data;
04543    LW->Select_cb = Select_cb;
04544    LW->Select_Data = Select_Data;
04545    LW->ALS = NULL;
04546    LW->isShaded = YUP;
04547    SUMA_RETURN(LW);
04548    
04549 }
04550 
04551 
04552 
04553 
04554 SUMA_LIST_WIDGET * SUMA_FreeScrolledList (SUMA_LIST_WIDGET *LW)
04555 {
04556    static char FuncName[]={"SUMA_FreeScrolledList"};
04557    
04558    SUMA_ENTRY;
04559    if (LW->Label) SUMA_free(LW->Label);
04560    if (LW->ALS) SUMA_FreeAssembleListStruct(LW->ALS);
04561    if (LW) SUMA_free(LW);
04562    
04563    SUMA_RETURN(NULL);
04564    
04565 }
04566 
04567 
04568 
04569 
04570 
04571 
04572 
04573 
04574 
04575 SUMA_Boolean SUMA_UpdateScrolledListData(SUMA_LIST_WIDGET *LW, void *Default_Data, void *Select_Data, void *CloseList_Data) 
04576 {
04577    static char FuncName[]={"SUMA_UpdateScrolledListData"};
04578    SUMA_Boolean LocalHead = NOPE;
04579 
04580    SUMA_ENTRY;
04581 
04582    if (!LW) SUMA_RETURN(NOPE);
04583    if (!LW->toplevel) { 
04584       LW->Default_Data = Default_Data;
04585       LW->Select_Data = Select_Data;
04586       LW->CloseList_Data = CloseList_Data; 
04587       SUMA_RETURN(YUP);
04588    }
04589 
04590    
04591    if (LW->Default_Data !=  Default_Data) {
04592       SUMA_LH("Doing Default Data..."); 
04593       if (!LW->Default_Data) {
04594          XtRemoveCallback(LW->list, XmNdefaultActionCallback, LW->Default_cb, (XtPointer)LW);
04595       } else {
04596          XtRemoveCallback (LW->list, XmNdefaultActionCallback, LW->Default_cb, (XtPointer)LW->Default_Data);
04597       }
04598       if (!Default_Data) {
04599          XtAddCallback (LW->list, XmNdefaultActionCallback, LW->Default_cb, (XtPointer)LW);
04600       } else {
04601          XtAddCallback (LW->list, XmNdefaultActionCallback, LW->Default_cb, (XtPointer)Default_Data);
04602       }
04603       LW->Default_Data =  Default_Data;
04604    }
04605 
04606    if (LW->Select_Data !=  Select_Data) { 
04607       SUMA_LH("Doing Select Data..."); 
04608       switch (LW->SelectPolicy){
04609          case SUMA_LSP_SINGLE:
04610             if (!LW->Select_Data) 
04611                XtRemoveCallback (LW->list, XmNsingleSelectionCallback, LW->Select_cb, (XtPointer)LW);
04612             else
04613                XtRemoveCallback (LW->list, XmNsingleSelectionCallback, LW->Select_cb, (XtPointer)LW->Select_Data); 
04614             break;
04615          case SUMA_LSP_BROWSE:
04616             if (!LW->Select_Data) 
04617                XtRemoveCallback (LW->list, XmNbrowseSelectionCallback, LW->Select_cb, (XtPointer)LW);
04618             else
04619                XtRemoveCallback (LW->list, XmNbrowseSelectionCallback, LW->Select_cb, (XtPointer)LW->Select_Data); 
04620 
04621             break;
04622          case SUMA_LSP_MULTIPLE:
04623             if (!LW->Select_Data) 
04624                XtRemoveCallback (LW->list, XmNmultipleSelectionCallback, LW->Select_cb, (XtPointer)LW);
04625             else
04626                XtRemoveCallback (LW->list, XmNmultipleSelectionCallback, LW->Select_cb, (XtPointer)LW->Select_Data); 
04627 
04628             break;
04629          case SUMA_LSP_EXTENDED:
04630             if (!LW->Select_Data) 
04631                XtRemoveCallback (LW->list, XmNextendedSelectionCallback, LW->Select_cb, (XtPointer)LW);
04632             else
04633                XtRemoveCallback (LW->list, XmNextendedSelectionCallback, LW->Select_cb, (XtPointer)LW->Select_Data); 
04634 
04635             break;
04636          default:
04637             SUMA_SL_Err("Bad selection policy");
04638             SUMA_RETURN(NOPE);
04639             break;
04640       }
04641 
04642       switch (LW->SelectPolicy){
04643          case SUMA_LSP_SINGLE:
04644             if (!Select_Data) 
04645                XtAddCallback (LW->list, XmNsingleSelectionCallback, LW->Select_cb, (XtPointer)LW);
04646             else
04647                XtAddCallback (LW->list, XmNsingleSelectionCallback, LW->Select_cb, (XtPointer)Select_Data); 
04648             break;
04649          case SUMA_LSP_BROWSE:
04650             if (!Select_Data) 
04651                XtAddCallback (LW->list, XmNbrowseSelectionCallback, LW->Select_cb, (XtPointer)LW);
04652             else
04653                XtAddCallback (LW->list, XmNbrowseSelectionCallback, LW->Select_cb, (XtPointer)Select_Data); 
04654 
04655             break;
04656          case SUMA_LSP_MULTIPLE:
04657             if (!Select_Data) 
04658                XtAddCallback (LW->list, XmNmultipleSelectionCallback, LW->Select_cb, (XtPointer)LW);
04659             else
04660                XtAddCallback (LW->list, XmNmultipleSelectionCallback, LW->Select_cb, (XtPointer)Select_Data); 
04661 
04662             break;
04663          case SUMA_LSP_EXTENDED:
04664             if (!Select_Data) 
04665                XtAddCallback (LW->list, XmNextendedSelectionCallback, LW->Select_cb, (XtPointer)LW);
04666             else
04667                XtAddCallback (LW->list, XmNextendedSelectionCallback, LW->Select_cb, (XtPointer)Select_Data); 
04668 
04669             break;
04670          default:
04671             SUMA_SL_Err("Bad selection policy");
04672             SUMA_RETURN(NOPE);
04673             break;
04674       }
04675 
04676       LW->Select_Data =  Select_Data;
04677 
04678    }
04679 
04680    if (LW->CloseList_Data !=  CloseList_Data) {
04681       SUMA_LH("Doing CloseList Data..."); 
04682       if (!LW->CloseList_Data) {
04683          XmRemoveWMProtocolCallback(
04684             LW->toplevel,
04685             XmInternAtom( SUMAg_CF->X->DPY_controller1  , "WM_DELETE_WINDOW" , False ) ,
04686             LW->CloseList_cb, (XtPointer)LW) ;
04687       } else {
04688          XmRemoveWMProtocolCallback(
04689             LW->toplevel,
04690             XmInternAtom( SUMAg_CF->X->DPY_controller1  , "WM_DELETE_WINDOW" , False ) ,
04691             LW->CloseList_cb, (XtPointer)LW->CloseList_Data) ;
04692       }
04693       if (!CloseList_Data) {
04694          XmAddWMProtocolCallback(
04695             LW->toplevel,
04696             XmInternAtom( SUMAg_CF->X->DPY_controller1  , "WM_DELETE_WINDOW" , False ) ,
04697             LW->CloseList_cb, (XtPointer)LW) ;
04698       } else {
04699          XmAddWMProtocolCallback(
04700             LW->toplevel,
04701             XmInternAtom( SUMAg_CF->X->DPY_controller1  , "WM_DELETE_WINDOW" , False ) ,
04702             LW->CloseList_cb, (XtPointer)CloseList_Data) ;
04703       }
04704 
04705       LW->CloseList_Data =  CloseList_Data;         
04706    } 
04707    SUMA_RETURN(YUP);
04708 }
04709 
04710 
04711 
04712 
04713 
04714 
04715 
04716 
04717 
04718 
04719 
04720 
04721 
04722 
04723 
04724 
04725 void SUMA_CreateScrolledList (    char **clist, int N_clist, SUMA_Boolean Partial,  
04726                                   SUMA_LIST_WIDGET *LW)
04727 {
04728    static char FuncName[]={"SUMA_CreateScrolledList"};
04729    XmString  str, *strlist;
04730    char *text;
04731    int i = -1, iclist, u_bound, l_bound = 0, n;
04732    Arg args[20];
04733    SUMA_Boolean New = NOPE;
04734    SUMA_Boolean LocalHead = NOPE;
04735    
04736    
04737    SUMA_ENTRY;
04738    
04739    if (!LW) { 
04740       SUMA_SL_Err ("Null LW!");
04741       SUMA_RETURNe;
04742    }
04743    
04744    if (N_clist <= 0) {
04745       SUMA_SLP_Note ("No ROIs found");
04746       SUMA_RETURNe;
04747    }
04748    
04749    if (!LW->toplevel) {   
04750        
04751       LW->toplevel = XtVaAppCreateShell(LW->Label , "Suma" ,
04752                      topLevelShellWidgetClass , SUMAg_CF->X->DPY_controller1 ,
04753                      NULL ) ;
04754       
04755       
04756       XtVaSetValues( LW->toplevel,
04757            XmNdeleteResponse, XmDO_NOTHING,
04758            NULL);  
04759              
04760       
04761       if (!LW->CloseList_Data) {
04762          XmAddWMProtocolCallback(
04763             LW->toplevel,
04764             XmInternAtom( SUMAg_CF->X->DPY_controller1  , "WM_DELETE_WINDOW" , False ) ,
04765             LW->CloseList_cb, (XtPointer)LW) ;
04766       } else {
04767          XmAddWMProtocolCallback(
04768             LW->toplevel,
04769             XmInternAtom( SUMAg_CF->X->DPY_controller1  , "WM_DELETE_WINDOW" , False ) ,
04770             LW->CloseList_cb, (XtPointer)LW->CloseList_Data) ;
04771       }   
04772       
04773 
04774       LW->rc = XtVaCreateWidget("Tonka", xmRowColumnWidgetClass, LW->toplevel, NULL);
04775       n = 0;
04776       XtSetArg (args[n], XmNitemCount,      0); n++;
04777       XtSetArg (args[n], XmNlistSizePolicy,   XmCONSTANT   ); n++;
04778       LW->list = XmCreateScrolledList (LW->rc, "Tonka", args, n);
04779 
04780       
04781       
04782       
04783       if (!LW->Default_Data) {
04784          XtAddCallback (LW->list, XmNdefaultActionCallback, LW->Default_cb, (XtPointer)LW);
04785       } else {
04786          XtAddCallback (LW->list, XmNdefaultActionCallback, LW->Default_cb, (XtPointer)LW->Default_Data);
04787       }        
04788 
04789       
04790       switch (LW->SelectPolicy){
04791          case SUMA_LSP_SINGLE:
04792             XtVaSetValues( LW->list, XmNselectionPolicy, XmSINGLE_SELECT, NULL);
04793             if (!LW->Select_Data) 
04794                XtAddCallback (LW->list, XmNsingleSelectionCallback, LW->Select_cb, (XtPointer)LW);
04795             else
04796                XtAddCallback (LW->list, XmNsingleSelectionCallback, LW->Select_cb, (XtPointer)LW->Select_Data); 
04797             break;
04798          case SUMA_LSP_BROWSE:
04799             if (!LW->Select_Data) 
04800                XtAddCallback (LW->list, XmNbrowseSelectionCallback, LW->Select_cb, (XtPointer)LW);
04801             else
04802                XtAddCallback (LW->list, XmNbrowseSelectionCallback, LW->Select_cb, (XtPointer)LW->Select_Data); 
04803             
04804             XtVaSetValues( LW->list, XmNselectionPolicy, XmBROWSE_SELECT, NULL);
04805             break;
04806          case SUMA_LSP_MULTIPLE:
04807             if (!LW->Select_Data) 
04808                XtAddCallback (LW->list, XmNmultipleSelectionCallback, LW->Select_cb, (XtPointer)LW);
04809             else
04810                XtAddCallback (LW->list, XmNmultipleSelectionCallback, LW->Select_cb, (XtPointer)LW->Select_Data); 
04811             
04812             XtVaSetValues( LW->list, XmNselectionPolicy, XmMULTIPLE_SELECT, NULL);
04813             break;
04814          case SUMA_LSP_EXTENDED:
04815             if (!LW->Select_Data) 
04816                XtAddCallback (LW->list, XmNextendedSelectionCallback, LW->Select_cb, (XtPointer)LW);
04817             else
04818                XtAddCallback (LW->list, XmNextendedSelectionCallback, LW->Select_cb, (XtPointer)LW->Select_Data); 
04819             
04820             XtVaSetValues( LW->list, XmNselectionPolicy, XmEXTENDED_SELECT, NULL);
04821             break;
04822          default:
04823             SUMA_SL_Err("Bad selection policy");
04824             SUMA_RETURNe;
04825             break;
04826       }
04827        
04828       
04829       if (LocalHead) fprintf(SUMA_STDERR, "%s: Managing ..\n", FuncName);
04830       XtManageChild (LW->list);
04831       XtManageChild (LW->rc);
04832 
04833       SUMA_PositionWindowRelative (LW->toplevel, LW->PosRef, LW->Pos);   
04834 
04835       LW->isShaded = NOPE;
04836       New = YUP;
04837       
04838    } else {
04839       
04840       XMapRaised(SUMAg_CF->X->DPY_controller1, XtWindow(LW->toplevel));
04841       LW->isShaded = NOPE;
04842    }  
04843 
04844    
04845    
04846    if (!Partial && !LW->RemoveDups) {
04847       if (LocalHead) fprintf (SUMA_STDERR, "%s: New full list, deleting old entries. \n", FuncName);
04848       XmListDeleteAllItems(LW->list);
04849    }else {
04850       if (LocalHead) fprintf (SUMA_STDERR, "%s: Partial list, will add.\n", FuncName);
04851    }
04852    for (iclist=0; iclist < N_clist; iclist++)     {
04853       SUMA_LH(clist[iclist]);
04854       if (LW->ShowSorted) {
04855          l_bound = 0;
04856          
04857          XtVaGetValues (LW->list,
04858                         XmNitemCount, &u_bound,
04859                         XmNitems,     &strlist,
04860                         NULL);
04861          u_bound--;
04862          
04863          while (u_bound >= l_bound) {
04864             int i = l_bound + (u_bound - l_bound) / 2;
04865             
04866             if (!XmStringGetLtoR (strlist[i], XmFONTLIST_DEFAULT_TAG, &text))
04867                break;
04868             if (strcmp (text, clist[iclist]) > 0)
04869                u_bound = i - 1; 
04870             else
04871                l_bound = i + 1; 
04872             XtFree (text); 
04873          }
04874       } else { 
04875         l_bound = 0; 
04876       }
04877       
04878       if (LocalHead) fprintf (SUMA_STDERR,"%s: Adding %s...\n", FuncName, clist[iclist]);
04879       str = XmStringCreateLocalized (clist[iclist]); 
04880 
04881       
04882       if (LW->RemoveDups) { 
04883          if (LocalHead) fprintf (SUMA_STDERR,"%s: removing duplicates\n", FuncName);
04884          if (!XmListItemExists(LW->list, str)) XmListAddItemUnselected (LW->list, str, l_bound+1);
04885       } else { 
04886          if (LocalHead) fprintf (SUMA_STDERR,"%s: with duplicates\n", FuncName);
04887          XmListAddItemUnselected (LW->list, str, l_bound+1);
04888       }
04889       XmStringFree (str);
04890    }
04891 
04892 
04893    XtVaSetValues( LW->list,                  
04894                   XmNvisibleItemCount, 10,
04895                   NULL);
04896    
04897 
04898    
04899    if (New) {
04900       
04901       XtRealizeWidget (LW->toplevel);
04902    }
04903    
04904    SUMA_RETURNe;
04905 }
04906 
04907 
04908 
04909 
04910 
04911 
04912 
04913 
04914 
04915 
04916 
04917 
04918 
04919 
04920 
04921 
04922 
04923 
04924 
04925 
04926 
04927 
04928 
04929 
04930 
04931 
04932 
04933 
04934 
04935 
04936 void SUMA_CreateArrowField ( Widget pw, char *label,
04937                               float value, float vmin, float vmax, float vstep,
04938                               int cwidth, SUMA_VARTYPE type,
04939                               SUMA_Boolean wrap,
04940                               void (*NewValueCallback)(void *data), void *cb_data,
04941                               char *hint, char *help,
04942                               SUMA_ARROW_TEXT_FIELD *AF)
04943 {
04944    static char FuncName[]={"SUMA_CreateArrowField"};
04945    
04946    SUMA_ENTRY;
04947    
04948    if (!AF) {
04949       SUMA_RegisterMessage (SUMAg_CF->MessageList, "Bad value in text field", FuncName, SMT_Error, SMA_Log);
04950       SUMA_RETURNe;  
04951    }
04952    
04953    AF->step = vstep;
04954    AF->value = value;
04955    AF->min = vmin;
04956    AF->max = vmax;
04957    AF->cwidth = cwidth;
04958    AF->type = type;
04959    AF->NewValueCallback = NewValueCallback;
04960    AF->NewValueCallbackData = cb_data;
04961    AF->modified = NOPE;
04962    AF->wrap = wrap;
04963    AF->rc = XtVaCreateManagedWidget ("Container", 
04964       xmRowColumnWidgetClass, pw,
04965       XmNpacking, XmPACK_TIGHT, 
04966       XmNorientation , XmHORIZONTAL ,
04967       NULL);
04968    if (hint) MCW_register_hint( AF->rc , hint);
04969    if (help) MCW_register_help( AF->rc , help);
04970    
04971    if (label) {
04972       AF->label =  XtVaCreateManagedWidget (label,
04973          xmLabelWidgetClass, AF->rc, 
04974          XmNmarginHeight, 0,
04975          XmNmarginTop, 0,
04976          XmNmarginBottom, 0,
04977          NULL);
04978          if (hint) MCW_register_help( AF->label , hint);
04979          if (help) MCW_register_help( AF->label , help);
04980    }else {
04981       AF->label = NULL;
04982    }
04983 
04984    AF->up = XtVaCreateManagedWidget ("arrow_up",
04985          xmArrowButtonWidgetClass, AF->rc,
04986          XmNarrowDirection,   XmARROW_UP,
04987          XmNmarginHeight, 0,
04988          XmNmarginTop, 0,
04989          XmNmarginBottom, 0,
04990          NULL);
04991    if (hint) MCW_register_help( AF->up , hint);
04992    if (help) MCW_register_help( AF->up , help);
04993 
04994    XtVaSetValues (AF->up, XmNuserData, (XtPointer)AF, NULL);
04995    XtAddCallback (AF->up, XmNarmCallback, SUMA_ATF_start_stop, (XtPointer)1);
04996    XtAddCallback (AF->up, XmNdisarmCallback, SUMA_ATF_start_stop, (XtPointer)1);
04997 
04998    AF->down = XtVaCreateManagedWidget ("arrow_dn",
04999       xmArrowButtonWidgetClass, AF->rc,
05000       XmNarrowDirection,   XmARROW_DOWN,
05001       XmNmarginHeight, 0,
05002       XmNmarginTop, 0,
05003       XmNmarginBottom, 0,
05004       NULL);
05005    if (hint) MCW_register_help( AF->down , hint);
05006    if (help) MCW_register_help( AF->down , help);
05007    XtVaSetValues (AF->down, XmNuserData, (XtPointer)AF, NULL);
05008    XtAddCallback (AF->down, XmNarmCallback, SUMA_ATF_start_stop, (XtPointer)-1);
05009    XtAddCallback (AF->down, XmNdisarmCallback, SUMA_ATF_start_stop, (XtPointer)-1);
05010 
05011    AF->textfield = XtVaCreateManagedWidget ("label",
05012       xmTextFieldWidgetClass, AF->rc,
05013       XmNuserData, (XtPointer)AF,
05014       XmNvalue, "-",
05015       XmNcolumns, AF->cwidth,
05016       XmNmarginHeight, 0,
05017       XmNmarginTop, 0,
05018       XmNmarginBottom, 0,
05019       NULL);
05020    if (hint) MCW_register_hint( AF->textfield , hint);
05021    if (help) MCW_register_help( AF->textfield , help);
05022    
05023    XtAddCallback (AF->textfield, XmNactivateCallback, SUMA_ATF_cb_label_change, (XtPointer)AF);
05024    XtAddCallback (AF->textfield, XmNmodifyVerifyCallback, SUMA_ATF_cb_label_Modify, (XtPointer)AF);
05025    
05026    
05027    XtInsertEventHandler( AF->textfield ,        
05028                          LeaveWindowMask ,  
05029                          FALSE ,            
05030                          SUMA_leave_EV,
05031                          (XtPointer) AF ,
05032                          XtListTail ) ;           
05033    XtManageChild (AF->rc);
05034    SUMA_RETURNe;
05035 }
05036 
05037 
05038 
05039 
05040 
05041 
05042 void SUMA_CreateTextField ( Widget pw, char *label,
05043                               int cwidth, 
05044                               void (*NewValueCallback)(void *data),
05045                               char *hint, char *help,
05046                               SUMA_ARROW_TEXT_FIELD *AF)
05047 {
05048    static char FuncName[]={"SUMA_ATF_cb_label_Modify"};
05049 
05050    SUMA_ENTRY;
05051 
05052    
05053    
05054    AF->up = AF->down = NULL;
05055    AF->step = AF->value = AF->min = AF->max = AF->wrap = 0;
05056    
05057    AF->type = SUMA_string;
05058    AF->NewValueCallback = NewValueCallback;
05059    AF->NewValueCallbackData = NULL;
05060    AF->arrow_action = NOPE;
05061    AF->cwidth = cwidth;
05062    AF->modified = NOPE;
05063 
05064    AF->rc = XtVaCreateManagedWidget ("Container", 
05065       xmRowColumnWidgetClass, pw,
05066       XmNpacking, XmPACK_TIGHT, 
05067       XmNorientation , XmHORIZONTAL ,
05068       NULL);
05069    if (hint) MCW_register_hint( AF->rc , hint);
05070 
05071    if (label) {
05072       AF->label =  XtVaCreateManagedWidget (label,
05073          xmLabelWidgetClass, AF->rc, 
05074          XmNmarginHeight, 0,
05075          XmNmarginTop, 0,
05076          XmNmarginBottom, 0,
05077          NULL);
05078       if (hint) MCW_register_help( AF->label , hint);
05079       if (help) MCW_register_help( AF->label , help);
05080    }else {
05081       AF->label = NULL;
05082    }
05083    
05084    AF->textfield = XtVaCreateManagedWidget ("label",
05085       xmTextFieldWidgetClass, AF->rc,
05086       XmNuserData, (XtPointer)AF,
05087       XmNvalue, "0",
05088       XmNcolumns, AF->cwidth,
05089       XmNmarginHeight, 0,
05090       XmNmarginTop, 0,
05091       XmNmarginBottom, 0,
05092       NULL);
05093    if (hint) MCW_register_hint( AF->textfield , hint);
05094    if (help) MCW_register_help( AF->textfield , help);
05095    
05096    XtAddCallback (AF->textfield, XmNactivateCallback, SUMA_ATF_cb_label_change, (XtPointer)AF);
05097    XtAddCallback (AF->textfield, XmNmodifyVerifyCallback, SUMA_ATF_cb_label_Modify, (XtPointer)AF);
05098    
05099    
05100    XtInsertEventHandler( AF->textfield ,        
05101                          LeaveWindowMask ,  
05102                          FALSE ,            
05103                          SUMA_leave_EV,
05104                          (XtPointer) AF ,
05105                          XtListTail ) ;           
05106    XtManageChild (AF->rc);   
05107    SUMA_RETURNe;
05108 } 
05109 
05110 
05111 
05112 
05113 
05114 
05115 void SUMA_ATF_cb_label_Modify (Widget w, XtPointer client_data, XtPointer call_data)
05116 {
05117    static char FuncName[]={"SUMA_ATF_cb_label_Modify"};
05118    SUMA_ARROW_TEXT_FIELD *AF=NULL;
05119    
05120    SUMA_ENTRY;
05121    
05122    AF = (SUMA_ARROW_TEXT_FIELD *)client_data ;
05123    if (!AF->arrow_action) AF->modified = YUP;
05124    
05125    SUMA_RETURNe;
05126 }
05127 
05128 
05129 
05130 
05131 
05132 void SUMA_leave_EV( Widget w , XtPointer client_data ,
05133                   XEvent * ev , Boolean * continue_to_dispatch )
05134 {
05135    SUMA_ARROW_TEXT_FIELD *AF=NULL; 
05136    XLeaveWindowEvent * lev = (XLeaveWindowEvent *) ev ;
05137    XmAnyCallbackStruct cbs ;
05138    static char FuncName[]={"SUMA_leave_EV"};
05139    SUMA_Boolean LocalHead = NOPE;
05140    
05141    SUMA_ENTRY;
05142 
05143    AF = (SUMA_ARROW_TEXT_FIELD *)client_data ;
05144    if( lev->type != LeaveNotify || !AF->modified ) SUMA_RETURNe; 
05145    
05146    if (LocalHead) fprintf (SUMA_STDERR, "%s: Leave notification.\n", FuncName);
05147    SUMA_ATF_cb_label_change( AF->textfield , (XtPointer) AF , NULL ) ;
05148    
05149    SUMA_RETURNe;
05150 }
05151 
05152 
05153 
05154 
05155 
05156 void SUMA_ATF_cb_label_change (Widget w, XtPointer client_data, XtPointer call_data)
05157 {
05158    static char FuncName[]={"SUMA_ATF_cb_label_change"};
05159    SUMA_ARROW_TEXT_FIELD *AF=NULL;
05160    SUMA_Boolean LocalHead = NOPE;
05161    
05162    SUMA_ENTRY;
05163 
05164    
05165    AF = (SUMA_ARROW_TEXT_FIELD *)client_data;
05166    
05167    if (AF->type == SUMA_int || AF->type == SUMA_float) SUMA_ATF_SetValue (AF);
05168    
05169    if (!AF->NewValueCallbackData) {
05170       SUMA_LH("No Callback data.");
05171       AF->NewValueCallback((void*)AF);
05172    } else {
05173       SUMA_LH("Callback data.");
05174       AF->NewValueCallback(AF->NewValueCallbackData);
05175    }
05176    
05177    AF->modified = NOPE;
05178    SUMA_RETURNe;
05179 }
05180 
05181 
05182 
05183 
05184 
05185 
05186 
05187 
05188 
05189 
05190 void SUMA_ATF_start_stop (Widget w, XtPointer client_data, XtPointer call_data)
05191 {
05192    static char FuncName[]={"SUMA_ATF_start_stop"};
05193    int incr = (int) client_data;
05194    SUMA_ARROW_TEXT_FIELD *AF = NULL;
05195    void *n;
05196    XmArrowButtonCallbackStruct *cbs = 
05197         (XmArrowButtonCallbackStruct *) call_data;
05198    
05199    
05200    SUMA_ENTRY;
05201    
05202    XtVaGetValues(w, XmNuserData, &n, NULL);
05203    AF = (SUMA_ARROW_TEXT_FIELD *)n;
05204    AF->direction = incr;
05205 
05206    if (cbs->reason == XmCR_ARM) {
05207      AF->arrow_action = YUP;
05208      SUMA_ATF_change_value (AF, (XtIntervalId *)1 );
05209    } else if (cbs->reason == XmCR_DISARM) {
05210      if (AF->arrow_timer_id) XtRemoveTimeOut (AF->arrow_timer_id);
05211      
05212      if (!AF->NewValueCallbackData) 
05213          AF->NewValueCallback((void*)AF);
05214      else 
05215          AF->NewValueCallback(AF->NewValueCallbackData);
05216           
05217      AF->arrow_action = NOPE;
05218  
05219    }     
05220 
05221    SUMA_RETURNe;
05222 }
05223 
05224 
05225 
05226 
05227 
05228 
05229 void SUMA_DrawROI_NewValue (void *data)
05230 {
05231    static char FuncName[]={"SUMA_DrawROI_NewValue"};
05232    SUMA_ARROW_TEXT_FIELD *AF=NULL;
05233    SUMA_DRAWN_ROI *DrawnROI=NULL;
05234    static int ErrCnt=0;
05235    DList *list=NULL;
05236    SUMA_Boolean LocalHead = NOPE;
05237    
05238    SUMA_ENTRY;
05239    
05240    AF = (SUMA_ARROW_TEXT_FIELD *)data;
05241    DrawnROI = SUMAg_CF->X->DrawROI->curDrawnROI;
05242    
05243    if (!DrawnROI) SUMA_RETURNe;
05244    
05245    if (AF->value == DrawnROI->iLabel) SUMA_RETURNe;
05246    
05247    if (!DrawnROI->DrawStatus == SUMA_ROI_Finished) {
05248       if (LocalHead) fprintf (SUMA_STDERR, "%s: Changing ROI value from %d to %d\n", 
05249          FuncName, DrawnROI->iLabel, (int)AF->value);   
05250 
05251       DrawnROI->iLabel = (int)AF->value;
05252       ErrCnt = 0;
05253    } else {
05254       if (!ErrCnt) SUMA_SLP_Err ("ROI is marked as finished.\nNew value will not be applied.\n");
05255       ++ErrCnt;
05256       AF->value = (float)DrawnROI->iLabel;
05257       SUMA_ATF_SetString (AF); 
05258    }
05259    
05260    
05261    if (DrawnROI->ColorByLabel) {
05262       SUMA_SurfaceObject *SO=NULL;
05263       
05264       SO = SUMA_findSOp_inDOv (DrawnROI->Parent_idcode_str, SUMAg_DOv, SUMAg_N_DOv);
05265       if (!SO) {
05266          SUMA_SLP_Err(  "Failed to find parent surface\n"
05267                         "No color for you!");
05268          SUMA_RETURNe;
05269       }
05270       if (!SUMA_Paint_SO_ROIplanes_w (SO, SUMAg_DOv, SUMAg_N_DOv)) {
05271          SUMA_SLP_Err("Failed in SUMA_Paint_SO_ROIplanes_w.");
05272          SUMA_RETURNe;
05273       }
05274 
05275       if (!list) list = SUMA_CreateList ();
05276       SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, SE_Redisplay_AllVisible, SES_SumaWidget, NULL);
05277       if (!SUMA_Engine (&list)) {
05278          fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_Engine.\n", FuncName);
05279          SUMA_RETURNe;    
05280       }
05281    }   
05282    SUMA_RETURNe;
05283 }
05284 
05285 
05286 
05287 
05288 
05289 
05290 void SUMA_ColPlane_NewOrder (void *data)
05291 {
05292    static char FuncName[]={"SUMA_ColPlane_NewOrder"};
05293    char sbuf[SUMA_MAX_LABEL_LENGTH];
05294    SUMA_SurfaceObject *SO=NULL;
05295    int Old_Order = -1, i, iMove, NetMove;
05296    SUMA_Boolean Shaded, Decent; 
05297    SUMA_Boolean LocalHead = NOPE;
05298    
05299    SUMA_ENTRY;
05300    
05301    SO = (SUMA_SurfaceObject *)data;
05302    
05303    
05304    if (SO->SurfCont->curColPlane->PlaneOrder == (int)SO->SurfCont->ColPlaneOrder->value) SUMA_RETURNe;
05305    
05306    
05307    if (LocalHead) SUMA_Print_PlaneOrder(SO, NULL);
05308    
05309 
05310    
05311    NetMove = (int)SO->SurfCont->ColPlaneOrder->value - SO->SurfCont->curColPlane->PlaneOrder ; 
05312    
05313    if (LocalHead) fprintf (SUMA_STDERR,"%s:  Net move %d\n", FuncName, NetMove);
05314    iMove = 0;
05315    Decent = YUP;
05316    if (NetMove > 0) {   
05317       do {
05318          Old_Order = SO->SurfCont->curColPlane->PlaneOrder;
05319          if (!SUMA_MovePlaneUp(SO, SO->SurfCont->curColPlane->Name)) {
05320             SUMA_L_Err("Error in SUMA_MovePlaneUp.");
05321             SUMA_RETURNe;
05322          }
05323          
05324          if (SO->SurfCont->curColPlane->PlaneOrder == Old_Order) {
05325             SUMA_LH("Nothing can be done");
05326             Decent = NOPE;
05327          } else {
05328             ++iMove;
05329          } 
05330       } while (iMove < NetMove && Decent);
05331    } else if (NetMove < 0) {
05332       do {
05333          Old_Order = SO->SurfCont->curColPlane->PlaneOrder;
05334          if (!SUMA_MovePlaneDown(SO, SO->SurfCont->curColPlane->Name)) {
05335             SUMA_L_Err("Error in SUMA_MovePlaneDown.");
05336             SUMA_RETURNe;
05337          }
05338          if (SO->SurfCont->curColPlane->PlaneOrder == Old_Order) {
05339             SUMA_LH("Enough");
05340             Decent = NOPE;
05341          } else {
05342             ++iMove;
05343          } 
05344       } while (iMove < -NetMove && Decent);   
05345    } else {
05346       SUMA_LH("Hmmmmm");
05347       Decent = NOPE;
05348    }
05349    
05350    SUMA_LH("Out");
05351    
05352    if(LocalHead) SUMA_Print_PlaneOrder(SO, NULL);
05353    
05354    
05355    SUMA_IS_SWITCH_COL_PLANE_SHADED(SO, Shaded);
05356    if (!Shaded) {
05357       SUMA_LH("Refreshing Col Plane List");
05358       SUMA_RefreshDsetList (SO);
05359    }
05360 
05361    if (!Decent) {
05362       
05363       sprintf(sbuf,"%d", SO->SurfCont->curColPlane->PlaneOrder);
05364       SO->SurfCont->ColPlaneOrder->value = SO->SurfCont->curColPlane->PlaneOrder;
05365       SUMA_SET_TEXT_FIELD(SO->SurfCont->ColPlaneOrder->textfield, sbuf); 
05366    }
05367    
05368    SUMA_UpdateColPlaneShellAsNeeded(SO); 
05369 
05370    if (iMove > 0) { 
05371       
05372       SUMA_LH("Remix and redisplay");
05373       SUMA_RemixRedisplay (SO);
05374    }
05375    
05376    
05377    SUMA_RETURNe;
05378    
05379 }
05380 
05381 
05382 
05383 
05384 
05385 
05386 void SUMA_ColPlane_NewOpacity (void *data)
05387 {
05388    static char FuncName[]={"SUMA_ColPlane_NewOpacity"};
05389    SUMA_SurfaceObject *SO=NULL;
05390    SUMA_Boolean LocalHead = NOPE;
05391    
05392    SUMA_ENTRY;
05393    
05394    SUMA_LH("Called");
05395    
05396    SO = (SUMA_SurfaceObject *)data;
05397 
05398    
05399    SO->SurfCont->curColPlane->GlobalOpacity = SO->SurfCont->ColPlaneOpacity->value;   
05400    if (LocalHead) fprintf(SUMA_STDERR,"%s: GlobalOpacity of %s set to %f.\n", 
05401          FuncName, SO->SurfCont->curColPlane->Name, SO->SurfCont->curColPlane->GlobalOpacity);
05402    
05403    SUMA_UpdateColPlaneShellAsNeeded(SO); 
05404 
05405    
05406    SUMA_RemixRedisplay (SO);
05407    
05408    SUMA_RETURNe;
05409 }
05410 
05411 
05412 
05413 
05414 
05415 
05416 
05417 void SUMA_ColPlane_NewDimFact (void *data)
05418 {
05419    static char FuncName[]={"SUMA_ColPlane_NewDimFact"};
05420    SUMA_SurfaceObject *SO=NULL;
05421    SUMA_Boolean LocalHead = NOPE;
05422    
05423    SUMA_ENTRY;
05424    
05425    SUMA_LH("Called");
05426    
05427    SO = (SUMA_SurfaceObject *)data;
05428 
05429    
05430    SO->SurfCont->curColPlane->DimFact = SO->SurfCont->ColPlaneDimFact->value; 
05431    if (SO->SurfCont->curColPlane->OptScl) 
05432       SO->SurfCont->curColPlane->OptScl->BrightFact = SO->SurfCont->curColPlane->DimFact;
05433       
05434    if (LocalHead) fprintf(SUMA_STDERR,"%s: DimFact of %s set to %f.\n", 
05435          FuncName, SO->SurfCont->curColPlane->Name, SO->SurfCont->curColPlane->DimFact);
05436    
05437    SUMA_UpdateColPlaneShellAsNeeded(SO); 
05438 
05439    
05440    SUMA_ColorizePlane(SO->SurfCont->curColPlane);
05441    
05442    
05443    SUMA_RemixRedisplay (SO);
05444    
05445    
05446    SUMA_UpdateNodeLblField(SO);
05447    
05448    SUMA_RETURNe;
05449 }
05450 
05451 
05452 
05453 SUMA_Boolean SUMA_RemixRedisplay (SUMA_SurfaceObject *SO)
05454 {
05455    static char FuncName[]={"SUMA_RemixRedisplay"};
05456    DList *list=NULL;
05457    SUMA_Boolean LocalHead = NOPE;
05458    
05459    SUMA_ENTRY;
05460    
05461    SUMA_LH("Called");
05462    
05463    if (!SUMA_SetRemixFlag(SO->idcode_str, SUMAg_SVv, SUMAg_N_SVv)) {
05464       SUMA_SLP_Err("Failed in SUMA_SetRemixFlag.\n");
05465       SUMA_RETURN(NOPE);
05466    }
05467 
05468    
05469    if (!list) list = SUMA_CreateList ();
05470    SUMA_REGISTER_TAIL_COMMAND_NO_DATA(list, SE_RedisplayNow_AllVisible, SES_Suma, NULL); 
05471    if (!SUMA_Engine(&list)) {
05472       SUMA_SLP_Err("Failed to redisplay.");
05473       SUMA_RETURN(NOPE);
05474    }
05475    
05476    SUMA_RETURN(YUP);
05477 }
05478 
05479 
05480 
05481 
05482 
05483 
05484 void SUMA_cb_ColPlaneShow_toggled (Widget w, XtPointer data, XtPointer client_data)
05485 {
05486    static char FuncName[]={"SUMA_cb_ColPlaneShow_toggled"};
05487    SUMA_SurfaceObject *SO = NULL;
05488    SUMA_Boolean LocalHead = NOPE;
05489    
05490    SUMA_ENTRY;
05491    
05492    SUMA_LH("Called");
05493    
05494    SO = (SUMA_SurfaceObject *)data;
05495    
05496    if (!SO->SurfCont->curColPlane) SUMA_RETURNe;
05497 
05498    SO->SurfCont->curColPlane->Show = XmToggleButtonGetState (SO->SurfCont->ColPlaneShow_tb);
05499    
05500    XmToggleButtonSetState (SO->SurfCont->Int_tb, SO->SurfCont->curColPlane->Show, NOPE);
05501    
05502    SUMA_UpdateColPlaneShellAsNeeded(SO); 
05503 
05504    SUMA_RemixRedisplay(SO);
05505    SUMA_UpdateNodeLblField(SO);
05506    
05507    SUMA_RETURNe;
05508 }
05509 
05510 
05511 
05512 
05513 
05514 
05515 void SUMA_cb_ColPlaneShowOne_toggled (Widget w, XtPointer data, XtPointer client_data)
05516 {
05517    static char FuncName[]={"SUMA_cb_ColPlaneShowOne_toggled"};
05518    SUMA_SurfaceObject *SO = NULL;
05519    SUMA_Boolean LocalHead = NOPE;
05520    
05521    SUMA_ENTRY;
05522    
05523    SUMA_LH("Called");
05524    
05525    SO = (SUMA_SurfaceObject *)data;
05526    
05527    if (!SO->SurfCont->curColPlane) SUMA_RETURNe;
05528 
05529    SO->SurfCont->ShowCurOnly = XmToggleButtonGetState (SO->SurfCont->ColPlaneShowOne_tb);
05530    
05531    SUMA_UpdateColPlaneShellAsNeeded(SO); 
05532 
05533    SUMA_RemixRedisplay(SO);
05534    SUMA_UpdateNodeLblField(SO);
05535    
05536    SUMA_RETURNe;
05537 }
05538 
05539 
05540 
05541 
05542 
05543 
05544 
05545 
05546 
05547 
05548 
05549 
05550 void SUMA_ATF_change_value(XtPointer client_data, XtIntervalId *id)
05551 {
05552    static char FuncName[]={"SUMA_ATF_change_value"};
05553    float ArrowTolerance = 0.0001; 
05554    int incr;
05555    SUMA_ARROW_TEXT_FIELD * AF= NULL;
05556    SUMA_Boolean LocalHead = NOPE;
05557    
05558    SUMA_ENTRY;
05559    
05560    AF = (SUMA_ARROW_TEXT_FIELD *)client_data;
05561    
05562    if (!AF->wrap) {
05563       if (AF->value + AF->direction * AF->step > (AF->max + ArrowTolerance) ||
05564         AF->value + AF->direction * AF->step < (AF->min - ArrowTolerance) ) {
05565            SUMA_RETURNe;
05566       }
05567    }
05568    
05569    AF->value += AF->direction * AF->step;
05570    
05571    if (AF->wrap) SUMA_WRAP_VALUE(AF->value, AF->min, AF->max);
05572    
05573    
05574    if (LocalHead) fprintf (SUMA_STDERR, "%s: Pre Tolerance %f\n", FuncName, AF->value);
05575    
05576    if (AF->min >= 0.0 && AF->value < 0.0) AF->value = 0.0;
05577    if (LocalHead) fprintf (SUMA_STDERR, "%s: Post Tolerance %f\n", FuncName, AF->value);
05578 
05579    SUMA_ATF_SetString (AF);
05580 
05581    AF->arrow_timer_id =
05582      XtAppAddTimeOut (SUMAg_CF->X->App, (int)id==1? 500 : 100, SUMA_ATF_change_value, (XtPointer)AF);
05583    
05584    
05585    SUMA_RETURNe;
05586 }
05587 
05588 
05589 
05590 
05591 void SUMA_ATF_SetString (SUMA_ARROW_TEXT_FIELD * AF)
05592 {
05593    static char FuncName[]={"SUMA_ATF_SetString"};
05594    char buf[36];
05595    
05596    SUMA_ENTRY;
05597    
05598    if (AF->type == SUMA_int) {
05599       sprintf (buf, "%-4d", (int)AF->value);
05600    }else if (AF->type == SUMA_float) {
05601       sprintf (buf, "%-4.4f", AF->value);
05602    }else {
05603       
05604    }
05605    XtVaSetValues (AF->textfield, XmNvalue, buf, NULL);
05606    
05607    SUMA_RETURNe;
05608 }
05609 
05610 
05611 
05612 
05613 void SUMA_ATF_SetValue (SUMA_ARROW_TEXT_FIELD * AF)
05614 {
05615    static char FuncName[]={"SUMA_ATF_SetValue"};
05616    float val;
05617    void *n;
05618    SUMA_Boolean LocalHead = NOPE;
05619    
05620    SUMA_ENTRY;
05621    
05622   
05623    XtVaGetValues (AF->textfield, XmNvalue, &n, NULL);
05624    
05625    
05626    if (LocalHead) fprintf (SUMA_STDERR, "%s: Read %s\n", FuncName, (char *)n);
05627    
05628    val = strtod ((char *)n, NULL);
05629    if (errno) {
05630       
05631       if (LocalHead) fprintf (SUMA_STDERR, "%s: Bad syntax.\n", FuncName);
05632       SUMA_RegisterMessage (SUMAg_CF->MessageList, "Bad value in text field", FuncName, SMT_Error, SMA_Log);
05633       SUMA_ATF_SetString (AF);
05634    }else { 
05635       if (AF->type == SUMA_int) {
05636          AF->value = (int)val;    
05637          if (AF->wrap) {
05638             SUMA_WRAP_VALUE(AF->value, AF->min, AF->max);
05639          } else {
05640             SUMA_CLIP_VALUE(AF->value, AF->min, AF->max);
05641          }
05642 
05643          
05644          SUMA_ATF_SetString (AF);
05645       } else {
05646          AF->value = val;
05647          if (AF->wrap) {
05648             SUMA_WRAP_VALUE(AF->value, AF->min, AF->max);
05649          } else {
05650             SUMA_CLIP_VALUE(AF->value, AF->min, AF->max);
05651          }
05652          
05653          SUMA_ATF_SetString (AF);
05654          
05655       }
05656    }
05657    
05658    SUMA_RETURNe;
05659 }
05660 
05661 
05662 
05663 
05664 
05665 void SUMA_cb_ViewerCont_SwitchGroup (Widget w, XtPointer data, XtPointer call_data)
05666 {
05667    static char FuncName[]={"SUMA_cb_ViewerCont_SwitchGroup"};
05668    SUMA_SurfaceViewer *sv=NULL;
05669    SUMA_LIST_WIDGET *LW = NULL;
05670    SUMA_Boolean LocalHead = NOPE;
05671    
05672    SUMA_ENTRY;
05673    
05674    sv = (SUMA_SurfaceViewer *)data;
05675    
05676    LW = sv->X->ViewCont->SwitchGrouplst;
05677    
05678    if (LW->ALS) {
05679       
05680       if (LocalHead) SUMA_S_Err("Freeing the hag.");
05681       LW->ALS = SUMA_FreeAssembleListStruct(LW->ALS);
05682    }
05683    
05684    
05685    LW->ALS = SUMA_AssembleGroupList (sv);
05686   
05687    if (!LW->ALS) {
05688       SUMA_SLP_Err("Error assembling list.");
05689       SUMA_RETURNe;
05690    }
05691    
05692    if (LW->ALS->N_clist < 0) {
05693       SUMA_SL_Err("Failed in SUMA_AssembleGroupList");
05694       SUMA_RETURNe;
05695    }
05696    
05697    if (!LW->ALS->N_clist) {
05698       SUMA_SLP_Note ("No Groups to choose from.");
05699       SUMA_RETURNe;
05700    }
05701    
05702    SUMA_CreateScrolledList ( LW->ALS->clist, LW->ALS->N_clist, NOPE,
05703                              LW);
05704                              
05705    SUMA_RETURNe;
05706 }
05707 
05708 
05709 
05710 
05711 void SUMA_cb_ViewerCont_SwitchState (Widget w, XtPointer data, XtPointer call_data)
05712 {
05713    static char FuncName[]={"SUMA_cb_ViewerCont_SwitchState"};
05714    SUMA_SurfaceViewer *sv=NULL;
05715    SUMA_Boolean LocalHead = NOPE;
05716    
05717    SUMA_ENTRY;
05718    
05719    sv = (SUMA_SurfaceViewer *)data;
05720    
05721    SUMA_SLP_Warn( "Not implemented yet.\n"
05722                   "Use ',' and '.' keys\n");
05723                   
05724    SUMA_RETURNe;
05725 }
05726 
05727 
05728 
05729 
05730 
05731 void SUMA_cb_SurfCont_SwitchColPlane (Widget w, XtPointer data, XtPointer call_data)
05732 {
05733    static char FuncName[]={"SUMA_cb_SurfCont_SwitchColPlane"};
05734    SUMA_Boolean LocalHead = NOPE;
05735    SUMA_SurfaceObject *SO = NULL;
05736    
05737    SUMA_ENTRY;
05738    
05739    SUMA_LH("Called");
05740    SO = (SUMA_SurfaceObject *)data;
05741    
05742    SUMA_RefreshDsetList (SO);
05743                                                    
05744    SUMA_RETURNe;
05745 }
05746 
05747 
05748 
05749 
05750 
05751 void SUMA_cb_DrawROI_SwitchROI (Widget w, XtPointer data, XtPointer call_data)
05752 {
05753    static char FuncName[]={"SUMA_cb_DrawROI_SwitchROI"};
05754    SUMA_Boolean LocalHead = NOPE;
05755    SUMA_LIST_WIDGET *LW = NULL;
05756    
05757    SUMA_ENTRY;
05758    
05759    LW = (SUMA_LIST_WIDGET *)data;
05760    
05761    if (LW->ALS) {
05762       
05763       if (LocalHead) SUMA_S_Err("Freeing the hag.");
05764       LW->ALS = SUMA_FreeAssembleListStruct(LW->ALS);
05765    }
05766    
05767    LW->ALS = SUMA_AssembleAllROIList (SUMAg_DOv, SUMAg_N_DOv, YUP);
05768   
05769    if (!LW->ALS) {
05770       SUMA_SLP_Err("Error assembling list.");
05771       SUMA_RETURNe;
05772    }
05773    
05774    if (LW->ALS->N_clist < 0) {
05775       SUMA_SL_Err("Failed in SUMA_AssembleAllROIList");
05776       SUMA_RETURNe;
05777    }
05778    
05779    if (!LW->ALS->N_clist) {
05780       SUMA_SLP_Note ("No ROIs to choose from.");
05781       SUMA_RETURNe;
05782    }
05783    SUMA_CreateScrolledList ( LW->ALS->clist, LW->ALS->N_clist, NOPE,
05784                              LW);
05785                                                 
05786    SUMA_RETURNe;
05787 }
05788 
05789 
05790 
05791 
05792 void SUMA_cb_DrawROImode_toggled (Widget w, XtPointer data, XtPointer call_data)
05793 {
05794    static char FuncName[] = {"SUMA_cb_DrawROImode_toggled"};
05795    
05796    SUMA_ENTRY;
05797    
05798    SUMAg_CF->ROI_mode = !SUMAg_CF->ROI_mode;
05799    
05800    
05801    if (!SUMAg_CF->ROI_mode) XtSetSensitive (SUMAg_CF->X->DrawROI->Penmode_tb, 0);
05802    else XtSetSensitive (SUMAg_CF->X->DrawROI->Penmode_tb, 1);
05803 
05804    SUMA_UpdateAllViewerCursor();
05805    
05806    SUMA_RETURNe;
05807 
05808 }
05809 
05810 
05811 
05812 
05813 
05814 void SUMA_cb_DrawROIPen_toggled (Widget w, XtPointer data, XtPointer call_data)
05815 {
05816    static char FuncName[] = {"SUMA_cb_DrawROIPen_toggled"};
05817    
05818    SUMA_ENTRY;
05819    
05820    SUMAg_CF->Pen_mode = !SUMAg_CF->Pen_mode;
05821    
05822    SUMA_UpdateAllViewerCursor();
05823    
05824    SUMA_RETURNe;
05825 
05826 }
05827 
05828 
05829 
05830 
05831 
05832 void SUMA_cb_AfniLink_toggled (Widget w, XtPointer data, XtPointer call_data)
05833 {
05834    static char FuncName[] = {"SUMA_cb_AfniLink_toggled"};
05835    DList *list=NULL;
05836    SUMA_STANDARD_CMAP cmap;
05837    SUMA_EngineData *ED = NULL;
05838    SUMA_Boolean LocalHead = NOPE;
05839    
05840    SUMA_ENTRY;
05841    
05842    SUMAg_CF->ROI2afni = !SUMAg_CF->ROI2afni;
05843    
05844    
05845    if (SUMAg_CF->ROI2afni && !SUMAg_CF->Connected_v[SUMA_AFNI_STREAM_INDEX]) {
05846       SUMAg_CF->ROI2afni = NOPE;
05847       
05848       SUMA_SLP_Err(  "Cannot link to Afni.\n"
05849                      "No connection found.");
05850       XmToggleButtonSetState (SUMAg_CF->X->DrawROI->AfniLink_tb, SUMAg_CF->ROI2afni, NOPE);
05851    }
05852    
05853    if (SUMAg_CF->ROI2afni) {
05854       if (SUMAg_CF->ROI_CM) {
05855          if (LocalHead) fprintf (SUMA_STDERR,"%s: Sending cmap (%s)\n",
05856             FuncName,  SUMAg_CF->ROI_CM->Name);
05857             SUMA_LH("Sending colormap to afni ...");
05858          
05859          cmap = SUMA_StandardMapCode (SUMAg_CF->ROI_CM->Name);
05860          if (LocalHead) fprintf (SUMA_STDERR,"%s: Sending cmap %d (%s)\n",
05861             FuncName, cmap, SUMAg_CF->ROI_CM->Name);
05862          list = SUMA_CreateList();
05863          ED = SUMA_InitializeEngineListData (SE_SendColorMapToAfni);
05864          if (!SUMA_RegisterEngineListCommand (  list, ED, 
05865                                                 SEF_i, (void*)&cmap, 
05866                                                 SES_SumaWidget, NULL, NOPE, 
05867                                                 SEI_Head, NULL )) {
05868             fprintf(SUMA_STDERR,"Error %s: Failed to register command\n", FuncName);
05869             SUMA_RETURNe;
05870          }
05871          SUMA_LH("NOW!");
05872          if (!SUMA_Engine (&list)) {
05873             fprintf(stderr, "Error %s: SUMA_Engine call failed.\n", FuncName);
05874          }   
05875       }
05876    }
05877    SUMA_RETURNe;
05878 
05879 }
05880 
05881 
05882 
05883 
05884 
05885 
05886 
05887 
05888 void SUMA_cb_SelectSwitchColPlane(Widget w, XtPointer data, XtPointer call_data)
05889 {
05890    static char FuncName[] = {"SUMA_cb_SelectSwitchColPlane"};
05891    SUMA_LIST_WIDGET *LW = NULL;
05892    XmListCallbackStruct *cbs = (XmListCallbackStruct *) call_data;
05893    char *choice=NULL, *choice_trimmed=NULL;
05894    SUMA_Boolean CloseShop = NOPE, Found = NOPE;
05895    int ichoice = -1;
05896    SUMA_OVERLAYS *ColPlane = NULL;
05897    SUMA_SurfaceObject *SO = NULL;
05898    SUMA_Boolean LocalHead=NOPE;
05899    
05900    SUMA_ENTRY;
05901    
05902    SO = (SUMA_SurfaceObject *)data;
05903    LW = SO->SurfCont->SwitchDsetlst;
05904    
05905    if (!LW) {
05906       SUMA_S_Err("NULL LW!");
05907       SUMA_RETURNe;
05908    }
05909    
05910    
05911    if (cbs->reason == XmCR_SINGLE_SELECT) {
05912       if (LocalHead) fprintf (SUMA_STDERR,"%s: Single selection, list widget %s... \n", FuncName, LW->Label);
05913    } else {
05914       if (LocalHead) fprintf (SUMA_STDERR,"%s: Default selection, list widget %s... \n", FuncName, LW->Label);
05915       
05916       CloseShop = YUP;
05917    }
05918 
05919    XmStringGetLtoR (cbs->item, XmFONTLIST_DEFAULT_TAG, &choice);
05920    
05921    if (LocalHead) fprintf (SUMA_STDERR,"%s: Selected item: %s {%s} (%d)\n", FuncName, choice, choice, cbs->item_position);
05922    
05923    Found = NOPE;
05924    ichoice = 0;
05925    do {
05926       if (LocalHead) fprintf (SUMA_STDERR,"%s: Comparing:\n%s\n%s", FuncName, LW->ALS->clist[ichoice], choice);
05927       if (strncmp(LW->ALS->clist[ichoice], choice, strlen(LW->ALS->clist[ichoice])) == 0) Found = YUP; 
05928       else ++ichoice;
05929    } while (ichoice < LW->ALS->N_clist && !Found);
05930    
05931    if (!Found) {
05932       SUMA_SLP_Err("Choice not found.");
05933       SUMA_RETURNe;
05934    }
05935    
05936    XtFree (choice);
05937    
05938    
05939    if (LW->ALS) {
05940       if (LocalHead) fprintf (SUMA_STDERR,"%s: N_clist = %d\n", FuncName, LW->ALS->N_clist); 
05941       if (LW->ALS->N_clist > ichoice) {
05942          ColPlane = (SUMA_OVERLAYS *)LW->ALS->oplist[ichoice];
05943          if (LocalHead) fprintf (SUMA_STDERR,"%s: Retrieved ColPlane named %s\n", FuncName, ColPlane->Name);
05944          SUMA_InitializeColPlaneShell(SO, ColPlane);
05945          SUMA_UpdateColPlaneShellAsNeeded(SO); 
05946          
05947          if (SO->SurfCont->ShowCurOnly) SUMA_RemixRedisplay(SO);
05948 
05949       }
05950    } else {
05951       if (LocalHead) fprintf (SUMA_STDERR,"%s: NULL ALS\n", FuncName); 
05952    }
05953 
05954    if (CloseShop) {
05955       SUMA_cb_CloseSwitchColPlane( w,  (XtPointer)SO->SurfCont->SwitchDsetlst,  call_data);
05956    }  
05957    
05958 
05959    SUMA_RETURNe;
05960 }
05961 
05962 
05963 
05964 
05965 
05966 
05967 void SUMA_cb_CloseSwitchColPlane(Widget w, XtPointer data, XtPointer call_data)
05968 {
05969    static char FuncName[] = {"SUMA_cb_CloseSwitchColPlane"};
05970    SUMA_Boolean LocalHead = NOPE;
05971    SUMA_LIST_WIDGET *LW = NULL;
05972    
05973    SUMA_ENTRY;
05974 
05975    LW = (SUMA_LIST_WIDGET *)data;
05976    
05977    #if defined SUMA_USE_WITHDRAW 
05978       if (LocalHead) fprintf (SUMA_STDERR,"%s: Withdrawing list widget %s...\n", FuncName, LW->Label);
05979       
05980       XWithdrawWindow(SUMAg_CF->X->DPY_controller1, 
05981          XtWindow(LW->toplevel),
05982          XScreenNumberOfScreen(XtScreen(LW->toplevel)));
05983    #elif defined SUMA_USE_DESTROY 
05984          if (LocalHead) fprintf (SUMA_STDERR,"%s: Destroying list widget %s...\n", FuncName, LW->Label);
05985          XtDestroyWidget(LW->toplevel);
05986          LW->toplevel = NULL;
05987    #endif
05988    
05989    LW->isShaded = YUP; 
05990 
05991    SUMA_RETURNe;
05992 }
05993 
05994 
05995 
05996 
05997 
05998 void SUMA_cb_SelectSwitchGroup(Widget w, XtPointer data, XtPointer call_data)
05999 {
06000    static char FuncName[] = {"SUMA_cb_SelectSwitchGroup"};
06001    SUMA_LIST_WIDGET *LW = NULL;
06002    XmListCallbackStruct *cbs = (XmListCallbackStruct *) call_data;
06003    char *choice=NULL;
06004    SUMA_Boolean CloseShop = NOPE, Found = NOPE;
06005    int ichoice = -1;
06006    char *strn=NULL;
06007    SUMA_SurfaceViewer *sv=NULL;
06008    SUMA_Boolean LocalHead = NOPE;
06009  
06010    SUMA_ENTRY;
06011    
06012    sv = (SUMA_SurfaceViewer *)data;
06013    
06014    LW = sv->X->ViewCont->SwitchGrouplst;
06015    
06016    if (!LW) {
06017       SUMA_S_Err("NULL LW!");
06018       SUMA_RETURNe;
06019    }
06020    if (cbs->reason == XmCR_SINGLE_SELECT) {
06021       if (LocalHead) fprintf (SUMA_STDERR,"%s: Single selection, list widget %s... \n", FuncName, LW->Label);
06022    } else {
06023       if (LocalHead) fprintf (SUMA_STDERR,"%s: Default selection, list widget %s... \n", FuncName, LW->Label);
06024       
06025       CloseShop = YUP;
06026    }
06027    
06028    XmStringGetLtoR (cbs->item, XmFONTLIST_DEFAULT_TAG, &choice);
06029    if (LocalHead) fprintf (SUMA_STDERR,"%s: Selected item: %s (%d)\n", FuncName, choice, cbs->item_position);
06030  
06031    
06032    Found = NOPE;
06033    ichoice = 0;
06034    do {
06035       if (LocalHead) fprintf (SUMA_STDERR,"%s: Comparing:\n%s\n%s", FuncName, LW->ALS->clist[ichoice], choice);
06036       if (strncmp(LW->ALS->clist[ichoice], choice, strlen(LW->ALS->clist[ichoice])) == 0) Found = YUP; 
06037       else ++ichoice;
06038    } while (ichoice < LW->ALS->N_clist && !Found);
06039    
06040    if (!Found) {
06041       SUMA_SLP_Err("Choice not found.");
06042       SUMA_RETURNe;
06043    }
06044    
06045    XtFree (choice);
06046 
06047    
06048    if (LW->ALS) {
06049       if (LocalHead) fprintf (SUMA_STDERR,"%s: N_clist = %d\n", FuncName, LW->ALS->N_clist); 
06050       if (LW->ALS->N_clist > ichoice) {
06051          strn = (char *)LW->ALS->clist[ichoice];
06052          if (LocalHead) fprintf (SUMA_STDERR,"%s: Retrieved group labeled %s\n", FuncName, strn);
06053          
06054          if (!SUMA_SwitchGroups(sv, strn)) { 
06055             SUMA_SLP_Err("Failed to switch groups");
06056          }
06057       }
06058    } else {
06059       if (LocalHead) fprintf (SUMA_STDERR,"%s: NULL ALS\n", FuncName); 
06060    }
06061 
06062    
06063    
06064    if (CloseShop) {
06065       SUMA_LH("Closing Shop");
06066       SUMA_cb_CloseSwitchGroup( w,  data,  call_data);
06067    }  
06068    
06069    SUMA_RETURNe;
06070 }
06071 
06072 
06073 
06074 
06075 
06076 
06077 void SUMA_cb_CloseSwitchGroup(Widget w, XtPointer data, XtPointer call_data)
06078 {
06079    static char FuncName[] = {"SUMA_cb_CloseSwitchGroup"};
06080    SUMA_LIST_WIDGET *LW = NULL;
06081    SUMA_SurfaceViewer *sv=NULL;
06082    SUMA_Boolean LocalHead = NOPE;
06083    
06084    SUMA_ENTRY;
06085 
06086    sv = (SUMA_SurfaceViewer *)data;
06087    
06088    LW = sv->X->ViewCont->SwitchGrouplst;
06089    
06090    #if defined SUMA_USE_WITHDRAW 
06091       if (LocalHead) fprintf (SUMA_STDERR,"%s: Withdrawing list widget %s...\n", FuncName, LW->Label);
06092       
06093       XWithdrawWindow(SUMAg_CF->X->DPY_controller1, 
06094          XtWindow(LW->toplevel),
06095          XScreenNumberOfScreen(XtScreen(LW->toplevel)));
06096    #elif defined SUMA_USE_DESTROY 
06097          if (LocalHead) fprintf (SUMA_STDERR,"%s: Destroying list widget %s...\n", FuncName, LW->Label);
06098          XtDestroyWidget(LW->toplevel);
06099          LW->toplevel = NULL;
06100    #endif
06101    
06102    LW->isShaded = YUP; 
06103 
06104    SUMA_RETURNe;
06105 }
06106 
06107 
06108 
06109 
06110 
06111 
06112 void SUMA_cb_SelectSwitchROI(Widget w, XtPointer data, XtPointer call_data)
06113 {
06114    static char FuncName[] = {"SUMA_cb_SelectSwitchROI"};
06115    SUMA_LIST_WIDGET *LW = NULL;
06116    XmListCallbackStruct *cbs = (XmListCallbackStruct *) call_data;
06117    char *choice=NULL;
06118    SUMA_Boolean CloseShop = NOPE, Found = NOPE;
06119    int ichoice = -1;
06120    SUMA_DRAWN_ROI *DrawnROI = NULL;
06121    SUMA_Boolean LocalHead = NOPE;
06122    
06123    SUMA_ENTRY; 
06124    
06125    LW = (SUMA_LIST_WIDGET *)data;
06126    
06127    if (!LW) {
06128       SUMA_S_Err("NULL LW!");
06129       SUMA_RETURNe;
06130    }
06131    
06132    if (cbs->reason == XmCR_SINGLE_SELECT) {
06133       if (LocalHead) fprintf (SUMA_STDERR,"%s: Single selection, list widget %s... \n", FuncName, LW->Label);
06134    } else {
06135       if (LocalHead) fprintf (SUMA_STDERR,"%s: Default selection, list widget %s... \n", FuncName, LW->Label);
06136       
06137       CloseShop = YUP;
06138    }
06139 
06140    XmStringGetLtoR (cbs->item, XmFONTLIST_DEFAULT_TAG, &choice);
06141    if (LocalHead) fprintf (SUMA_STDERR,"%s: Selected item: %s (%d)\n", FuncName, choice, cbs->item_position);
06142  
06143    
06144    Found = NOPE;
06145    ichoice = 0;
06146    do {
06147       if (LocalHead) fprintf (SUMA_STDERR,"%s: Comparing:\n%s\n%s", FuncName, LW->ALS->clist[ichoice], choice);
06148       if (strncmp(LW->ALS->clist[ichoice], choice, strlen(LW->ALS->clist[ichoice])) == 0) Found = YUP; 
06149       else ++ichoice;
06150    } while (ichoice < LW->ALS->N_clist && !Found);
06151    
06152    if (!Found) {
06153       SUMA_SLP_Err("Choice not found.");
06154       SUMA_RETURNe;
06155    }
06156    
06157    XtFree (choice);
06158 
06159    
06160    if (LW->ALS) {
06161       if (LocalHead) fprintf (SUMA_STDERR,"%s: N_clist = %d\n", FuncName, LW->ALS->N_clist); 
06162       if (LW->ALS->N_clist > ichoice) {
06163          DrawnROI = (SUMA_DRAWN_ROI *)LW->ALS->oplist[ichoice];
06164          if (LocalHead) fprintf (SUMA_STDERR,"%s: Retrieved DrawnROI labeled %s\n", FuncName, DrawnROI->Label);
06165          SUMA_InitializeDrawROIWindow(DrawnROI);
06166       }
06167    } else {
06168       if (LocalHead) fprintf (SUMA_STDERR,"%s: NULL ALS\n", FuncName); 
06169    }
06170 
06171    if (CloseShop) {
06172       SUMA_cb_CloseSwitchROI( w,  data,  call_data);
06173    }  
06174    
06175    SUMA_RETURNe;
06176 }
06177 
06178 
06179 
06180 
06181 
06182 
06183 void SUMA_cb_CloseSwitchROI(Widget w, XtPointer data, XtPointer call_data)
06184 {
06185    static char FuncName[] = {"SUMA_cb_CloseSwitchROI"};
06186    SUMA_Boolean LocalHead = NOPE;
06187    SUMA_LIST_WIDGET *LW = NULL;
06188    
06189    SUMA_ENTRY;
06190 
06191    LW = (SUMA_LIST_WIDGET *)data;
06192    
06193    #if defined SUMA_USE_WITHDRAW 
06194       if (LocalHead) fprintf (SUMA_STDERR,"%s: Withdrawing list widget %s...\n", FuncName, LW->Label);
06195       
06196       XWithdrawWindow(SUMAg_CF->X->DPY_controller1, 
06197          XtWindow(LW->toplevel),
06198          XScreenNumberOfScreen(XtScreen(LW->toplevel)));
06199    #elif defined SUMA_USE_DESTROY 
06200          if (LocalHead) fprintf (SUMA_STDERR,"%s: Destroying list widget %s...\n", FuncName, LW->Label);
06201          XtDestroyWidget(LW->toplevel);
06202          LW->toplevel = NULL;
06203    #endif
06204    
06205    LW->isShaded = YUP; 
06206 
06207    SUMA_RETURNe;
06208 }
06209 
06210 
06211 
06212 void SUMA_cb_CloseDrawROIWindow(Widget w, XtPointer data, XtPointer call_data)
06213 {
06214    static char FuncName[] = {"SUMA_cb_CloseDrawROIWindow"};
06215    SUMA_Boolean Shaded = NOPE, LocalHead = NOPE;
06216    
06217    SUMA_ENTRY;
06218    
06219    if (!SUMAg_CF->X->DrawROI->AppShell) SUMA_RETURNe;
06220    
06221    
06222    
06223    SUMA_IS_DRAW_ROI_SWITCH_ROI_SHADED(Shaded);
06224    if (!Shaded) {
06225       if (LocalHead) fprintf (SUMA_STDERR, "%s: Closing switch ROI window ...\n", FuncName);
06226       SUMA_cb_CloseSwitchROI(NULL, (XtPointer) SUMAg_CF->X->DrawROI->SwitchROIlst, NULL);
06227    }
06228    
06229    #if defined SUMA_USE_WITHDRAW 
06230       if (LocalHead) fprintf (SUMA_STDERR,"%s: Withdrawing DrawROI window...\n", FuncName);
06231       
06232       XWithdrawWindow(SUMAg_CF->X->DPY_controller1, 
06233          XtWindow(SUMAg_CF->X->DrawROI->AppShell),
06234          XScreenNumberOfScreen(XtScreen(SUMAg_CF->X->DrawROI->AppShell)));
06235    #elif defined SUMA_USE_DESTROY 
06236       if (LocalHead) fprintf (SUMA_STDERR,"%s: Destroying DrawROI window...\n", FuncName);
06237       XtDestroyWidget(SUMAg_CF->X->DrawROI->AppShell);
06238       SUMAg_CF->X->DrawROI->AppShell = NULL;
06239    #endif
06240    
06241    SUMA_RETURNe;
06242 }
06243 
06244 
06245 
06246 void SUMA_cb_createSumaCont(Widget w, XtPointer data, XtPointer callData)
06247 {
06248    static char FuncName[] = {"SUMA_cb_createSumaCont"};
06249    Widget rc, pb_close, pb_new, pb_done, pb_bhelp, LockFrame, AppFrame, form, tb, rb, rc_m;
06250    int i;
06251    SUMA_Boolean LocalHead = NOPE;
06252    
06253    SUMA_ENTRY;
06254    
06255    if (SUMAg_CF->X->SumaCont->AppShell) {
06256       fprintf (SUMA_STDERR,"Error %s: SUMAg_CF->X->SumaCont->AppShell!=NULL. Should not be here.\n", FuncName);
06257       SUMA_RETURNe;
06258    }
06259 
06260    
06261 
06262    SUMAg_CF->X->SumaCont->AppShell = XtVaAppCreateShell("Suma Controller" , "Suma" ,
06263       topLevelShellWidgetClass , SUMAg_CF->X->DPY_controller1 ,
06264       NULL ) ;
06265    
06266   
06267    
06268    XtVaSetValues( SUMAg_CF->X->SumaCont->AppShell,
06269            XmNdeleteResponse, XmDO_NOTHING,
06270            NULL);  
06271              
06272    
06273    XmAddWMProtocolCallback(
06274       SUMAg_CF->X->SumaCont->AppShell,
06275       XmInternAtom( SUMAg_CF->X->DPY_controller1 , "WM_DELETE_WINDOW" , False ) ,
06276       SUMA_cb_closeSumaCont, NULL) ;
06277    
06278    
06279    form = XtVaCreateWidget ("dialog", 
06280       xmFormWidgetClass, SUMAg_CF->X->SumaCont->AppShell,
06281       XmNborderWidth , 0 ,
06282       XmNmarginHeight , SUMA_MARGIN ,
06283       XmNmarginWidth  , SUMA_MARGIN ,
06284       XmNshadowThickness, 2,
06285       XmNshadowType, XmSHADOW_ETCHED_IN,
06286       NULL); 
06287       
06288    
06289    LockFrame = XtVaCreateWidget ("dialog",
06290       xmFrameWidgetClass, form,
06291       XmNleftAttachment , XmATTACH_FORM ,
06292       XmNtopAttachment  , XmATTACH_FORM ,
06293       XmNshadowType , XmSHADOW_ETCHED_IN ,
06294       XmNshadowThickness , 5 ,
06295       XmNtraversalOn , False ,
06296       NULL); 
06297    
06298       
06299       XtVaCreateManagedWidget ("Lock",
06300          xmLabelWidgetClass, LockFrame, 
06301          XmNchildType, XmFRAME_TITLE_CHILD,
06302          XmNchildHorizontalAlignment, XmALIGNMENT_BEGINNING,
06303          NULL);
06304    
06305    
06306    rc = XtVaCreateWidget ("rowcolumn",
06307          xmRowColumnWidgetClass, LockFrame,
06308          XmNpacking, XmPACK_TIGHT, 
06309          XmNorientation , XmHORIZONTAL ,
06310          XmNmarginHeight, SUMA_MARGIN ,
06311          XmNmarginWidth , SUMA_MARGIN ,
06312          NULL);
06313 
06314    for (i = 0; i < SUMA_MAX_SURF_VIEWERS; i++) {
06315       char stmp[3];
06316       int tmpfac;
06317       
06318       rc_m = XtVaCreateManagedWidget ("rowcolumn",
06319          xmRowColumnWidgetClass, rc,
06320          XmNpacking, XmPACK_TIGHT, 
06321          XmNorientation , XmVERTICAL ,
06322          NULL);
06323          
06324       sprintf(stmp,"%c", 65+i);
06325       w = XtVaCreateManagedWidget (stmp,
06326          xmLabelWidgetClass, rc_m,
06327          NULL);
06328 
06329       SUMAg_CF->X->SumaCont->Lock_rbg->rb[i] = XtVaCreateWidget("radiobox",
06330          xmRowColumnWidgetClass, rc_m,
06331          XmNorientation , XmVERTICAL ,
06332          XmNpacking,      XmPACK_TIGHT,
06333          XmNradioBehavior, True,
06334          XmNnumColumns,   1,
06335          NULL); 
06336       
06337       tmpfac = SUMAg_CF->X->SumaCont->Lock_rbg->N_but;
06338        
06339       SUMAg_CF->X->SumaCont->Lock_rbg->tb[tmpfac*i] = XtVaCreateManagedWidget("-", 
06340       xmToggleButtonWidgetClass, SUMAg_CF->X->SumaCont->Lock_rbg->rb[i], NULL);
06341       XtAddCallback (SUMAg_CF->X->SumaCont->Lock_rbg->tb[tmpfac*i], 
06342                      XmNvalueChangedCallback, SUMA_cb_XHlock_toggled, 
06343                      (XtPointer)(tmpfac*i));
06344        
06345       SUMAg_CF->X->SumaCont->Lock_rbg->tb[tmpfac*i+1] = XtVaCreateManagedWidget("i", 
06346       xmToggleButtonWidgetClass, SUMAg_CF->X->SumaCont->Lock_rbg->rb[i], NULL);
06347       XtAddCallback (SUMAg_CF->X->SumaCont->Lock_rbg->tb[tmpfac*i+1], 
06348                      XmNvalueChangedCallback, SUMA_cb_XHlock_toggled,  
06349                      (XtPointer)(tmpfac*i+1));
06350       
06351       SUMAg_CF->X->SumaCont->Lock_rbg->tb[tmpfac*i+2] = XtVaCreateManagedWidget("c", 
06352       xmToggleButtonWidgetClass, SUMAg_CF->X->SumaCont->Lock_rbg->rb[i], NULL);
06353       XtAddCallback (SUMAg_CF->X->SumaCont->Lock_rbg->tb[tmpfac*i+2], 
06354                      XmNvalueChangedCallback, SUMA_cb_XHlock_toggled,  
06355                      (XtPointer)(tmpfac*i+2));
06356       
06357       XtManageChild (SUMAg_CF->X->SumaCont->Lock_rbg->rb[i]);
06358       
06359       
06360       MCW_reghelp_children( SUMAg_CF->X->SumaCont->Lock_rbg->rb[i] , SUMA_LockSumaCont_help );
06361       
06362       
06363       SUMA_set_Lock_rb (SUMAg_CF->X->SumaCont->Lock_rbg, i, SUMAg_CF->Locked[i]);
06364       
06365       XtVaCreateManagedWidget ("sep", xmSeparatorWidgetClass, rc_m, NULL);
06366       
06367       SUMAg_CF->X->SumaCont->LockView_tbg[i] = XtVaCreateManagedWidget("v", 
06368          xmToggleButtonWidgetClass, rc_m, NULL);
06369       XtAddCallback (SUMAg_CF->X->SumaCont->LockView_tbg[i], XmNvalueChangedCallback, SUMA_cb_XHviewlock_toggled, (XtPointer) i);
06370 
06371       
06372       MCW_reghelp_children( rc_m , SUMA_LockViewSumaCont_help );
06373             
06374    }  
06375    XtManageChild (rc);
06376    XtManageChild (LockFrame);
06377       
06378    
06379    
06380    XtVaCreateManagedWidget ("sep", 
06381                            xmSeparatorGadgetClass, rc, 
06382                            XmNorientation, XmVERTICAL,
06383                            NULL);
06384 
06385    
06386    rc_m = XtVaCreateManagedWidget ("rowcolumn",
06387          xmRowColumnWidgetClass, rc,
06388          XmNpacking, XmPACK_TIGHT, 
06389          XmNorientation , XmVERTICAL ,
06390          NULL);
06391          
06392    w = XtVaCreateManagedWidget ("All",
06393       xmLabelWidgetClass, rc_m,
06394       NULL);
06395 
06396    SUMAg_CF->X->SumaCont->Lock_rbg->arb = XtVaCreateWidget("radiobox",
06397       xmRowColumnWidgetClass, rc_m,
06398       XmNorientation , XmVERTICAL ,
06399       XmNpacking,      XmPACK_TIGHT,
06400       XmNradioBehavior, True,
06401       XmNnumColumns,   1,
06402       NULL);
06403 
06404    SUMAg_CF->X->SumaCont->Lock_rbg->atb[0] = XtVaCreateManagedWidget("-", 
06405    xmToggleButtonWidgetClass, SUMAg_CF->X->SumaCont->Lock_rbg->arb, NULL);
06406    XtAddCallback (SUMAg_CF->X->SumaCont->Lock_rbg->atb[0], 
06407                   XmNvalueChangedCallback, SUMA_cb_XHalock_toggled, 
06408                   (XtPointer)(0));
06409 
06410    SUMAg_CF->X->SumaCont->Lock_rbg->atb[1] = XtVaCreateManagedWidget("i", 
06411    xmToggleButtonWidgetClass, SUMAg_CF->X->SumaCont->Lock_rbg->arb, NULL);
06412    XtAddCallback (SUMAg_CF->X->SumaCont->Lock_rbg->atb[1], 
06413                   XmNvalueChangedCallback, SUMA_cb_XHalock_toggled,  
06414                   (XtPointer)(1));
06415 
06416    SUMAg_CF->X->SumaCont->Lock_rbg->atb[2] = XtVaCreateManagedWidget("c", 
06417    xmToggleButtonWidgetClass, SUMAg_CF->X->SumaCont->Lock_rbg->arb, NULL);
06418    XtAddCallback (SUMAg_CF->X->SumaCont->Lock_rbg->atb[2], 
06419                   XmNvalueChangedCallback, SUMA_cb_XHalock_toggled,  
06420                   (XtPointer)(2));
06421 
06422    XtManageChild (SUMAg_CF->X->SumaCont->Lock_rbg->arb);
06423 
06424    
06425    MCW_reghelp_children( SUMAg_CF->X->SumaCont->Lock_rbg->arb , SUMA_LockSumaCont_help );
06426 
06427    
06428    SUMA_set_Lock_arb (SUMAg_CF->X->SumaCont->Lock_rbg);   
06429          
06430    XtVaCreateManagedWidget ("sep", xmSeparatorGadgetClass, rc_m, NULL);
06431       
06432    SUMAg_CF->X->SumaCont->LockAllView_tb = XtVaCreateManagedWidget("v", 
06433       xmToggleButtonWidgetClass, rc_m, NULL);
06434    XtAddCallback (SUMAg_CF->X->SumaCont->LockAllView_tb, XmNvalueChangedCallback, SUMA_cb_XHaviewlock_toggled, NULL);
06435    
06436    
06437    AppFrame = XtVaCreateWidget ("dialog",
06438       xmFrameWidgetClass, form,
06439       XmNleftAttachment , XmATTACH_FORM ,
06440       XmNtopAttachment  , XmATTACH_WIDGET ,
06441       XmNtopWidget, LockFrame,
06442       XmNshadowType , XmSHADOW_ETCHED_IN ,
06443       XmNshadowThickness , 5 ,
06444       XmNtraversalOn , False ,
06445       NULL); 
06446    
06447    
06448    rc = XtVaCreateManagedWidget ("rowcolumn",
06449          xmRowColumnWidgetClass, AppFrame,
06450          XmNpacking, XmPACK_COLUMN, 
06451          XmNorientation , XmVERTICAL ,
06452          XmNnumColumns, 2, 
06453          NULL);
06454          
06455    pb_new = XtVaCreateWidget ("Viewer", 
06456       xmPushButtonWidgetClass, rc, 
06457       NULL);
06458    XtAddCallback (pb_new, XmNactivateCallback, SUMA_cb_newSumaCont, NULL);
06459    MCW_register_hint( pb_new , "Opens a new viewer" ) ;
06460    MCW_register_help( pb_new , SUMA_viewerSumaCont_help );
06461    XtManageChild (pb_new); 
06462 
06463    pb_close = XtVaCreateWidget ("Close", 
06464       xmPushButtonWidgetClass, rc, 
06465       NULL);   
06466    XtAddCallback (pb_close, XmNactivateCallback, SUMA_cb_closeSumaCont, NULL);
06467    MCW_register_hint( pb_close , "Close SUMA controller" ) ;
06468    MCW_register_help( pb_close , SUMA_closeSumaCont_help ) ;
06469    XtManageChild (pb_close); 
06470    
06471    pb_bhelp = XtVaCreateWidget ("BHelp", 
06472       xmPushButtonWidgetClass, rc, 
06473       NULL);
06474    XtAddCallback (pb_bhelp, XmNactivateCallback, MCW_click_help_CB, NULL);
06475    MCW_register_help(pb_bhelp , SUMA_help_help ) ;
06476    MCW_register_hint(pb_bhelp  , "Press this button then click on a button/label/menu for more help." ) ;
06477    
06478    XtManageChild (pb_bhelp); 
06479    
06480    SUMAg_CF->X->SumaCont->quit_pb = XtVaCreateWidget ("done", 
06481       xmPushButtonWidgetClass, rc, 
06482       NULL);
06483    XtAddCallback (SUMAg_CF->X->SumaCont->quit_pb, XmNactivateCallback, SUMA_cb_doneSumaCont, NULL);
06484    MCW_register_hint( SUMAg_CF->X->SumaCont->quit_pb , "Click twice in 5 seconds to quit application." ) ;
06485    MCW_set_widget_bg( SUMAg_CF->X->SumaCont->quit_pb , MCW_hotcolor(SUMAg_CF->X->SumaCont->quit_pb) , 0 ) ;
06486 
06487    XtManageChild (SUMAg_CF->X->SumaCont->quit_pb); 
06488   
06489    XtManageChild (AppFrame);
06490    
06491    
06492    XtManageChild (form);
06493    
06494    
06495    XtRealizeWidget (SUMAg_CF->X->SumaCont->AppShell);
06496    
06497    SUMA_RETURNe;
06498 }
06499 
06500 
06501 
06502 
06503 
06504 
06505 
06506 void  SUMA_cb_doneSumaCont(Widget wcall, XtPointer cd1, XtPointer cbs)
06507 {
06508    static char FuncName[] = {"SUMA_cb_doneSumaCont"};
06509    XmPushButtonCallbackStruct * pbcbs = (XmPushButtonCallbackStruct *) cbs ;
06510    SUMA_Boolean LocalHead = NOPE;
06511    
06512    SUMA_ENTRY;
06513 
06514    
06515    if( wcall == NULL ){
06516       if (LocalHead) fprintf (SUMA_STDERR, "%s: Resetting button.\n", FuncName); 
06517       if( SUMAg_CF->X->SumaCont->quit_first == NOPE ){
06518          MCW_set_widget_label( SUMAg_CF->X->SumaCont->quit_pb , "done " ) ;
06519          SUMAg_CF->X->SumaCont->quit_first = YUP ;
06520       }
06521       SUMA_RETURNe ;
06522    }
06523    
06524    
06525    if( pbcbs != NULL                       &&
06526        pbcbs->event != NULL                &&
06527        pbcbs->event->type == ButtonRelease &&
06528        ((XButtonEvent *)(pbcbs->event))->state &  
06529        (ShiftMask|ControlMask|Button2Mask|Button3Mask) ){
06530 
06531       if (LocalHead) fprintf (SUMA_STDERR, "%s: Closing display.\n", FuncName); 
06532       XtCloseDisplay( SUMAg_CF->X->DPY_controller1 ) ;
06533       exit(0) ;
06534    }
06535    
06536    
06537 
06538    if( SUMAg_CF->X->SumaCont->quit_first ){
06539       MCW_set_widget_label( SUMAg_CF->X->SumaCont->quit_pb , "DONE " ) ;
06540       SUMAg_CF->X->SumaCont->quit_first = NOPE ;
06541 
06542       
06543       if (LocalHead) fprintf (SUMA_STDERR, "%s: First Press, adding time out.\n", FuncName);
06544       (void) XtAppAddTimeOut(
06545                XtWidgetToApplicationContext(SUMAg_CF->X->SumaCont->quit_pb) ,
06546                5000 , SUMA_quit_timeout_CB , NULL ) ;
06547 
06548        SUMA_RETURNe;
06549    }
06550    
06551    
06552    if (LocalHead) fprintf (SUMA_STDERR, "%s: Closing shop...\n", FuncName);
06553    XtCloseDisplay( SUMAg_CF->X->DPY_controller1 ) ;
06554    exit(0) ;
06555 
06556    SUMA_RETURNe;
06557 }
06558 void SUMA_quit_timeout_CB( XtPointer client_data , XtIntervalId * id )
06559 {
06560    static char FuncName[] = {"SUMA_quit_timeout_CB"};
06561 
06562    SUMA_ENTRY;
06563 
06564    SUMA_cb_doneSumaCont(NULL, NULL, NULL);
06565 
06566    SUMA_RETURNe; 
06567 }
06568 
06569 void SUMA_cb_XHlock_toggled(Widget w, XtPointer client_data, XtPointer callData)
06570 {
06571    static char FuncName[] = {"SUMA_cb_XHlock_toggled"};
06572    SUMA_Boolean LocalHead = NOPE;
06573    int cd, i, j;
06574    
06575    cd = (int) client_data;
06576    
06577    SUMA_ENTRY;
06578 
06579    i = cd / SUMAg_CF->X->SumaCont->Lock_rbg->N_but;
06580    j = cd % SUMAg_CF->X->SumaCont->Lock_rbg->N_but;
06581    fprintf (SUMA_STDERR, "%s: Viewer %c Lock=%d.\n", FuncName, 65+i, j);
06582    SUMAg_CF->Locked[i] = j;
06583    
06584    
06585    SUMA_set_Lock_arb (SUMAg_CF->X->SumaCont->Lock_rbg);
06586 
06587    SUMA_RETURNe;
06588 }
06589 
06590 void SUMA_cb_XHalock_toggled (Widget w, XtPointer client_data, XtPointer callData)
06591 {
06592    static char FuncName[] = {"SUMA_cb_XHalock_toggled"};
06593    int i;
06594    DList *list=NULL;
06595    SUMA_EngineData *ED = NULL;
06596    
06597    SUMA_ENTRY;
06598  
06599    i = (int) client_data;
06600    
06601 
06602    list = SUMA_CreateList();
06603    ED = SUMA_InitializeEngineListData (SE_SetLockAllCrossHair);
06604    if (!SUMA_RegisterEngineListCommand (  list, ED, 
06605                                           SEF_i, (void*)&i, 
06606                                           SES_SumaWidget, NULL, NOPE, 
06607                                           SEI_Head, NULL )) {
06608       fprintf(SUMA_STDERR,"Error %s: Failed to register command\n", FuncName);
06609       SUMA_RETURNe;
06610    }
06611    
06612    if (!SUMA_Engine (&list)) {
06613       fprintf(stderr, "Error %s: SUMA_Engine call failed.\n", FuncName);
06614    }
06615                   
06616    SUMA_RETURNe;
06617 }
06618 
06619 void SUMA_cb_XHaviewlock_toggled (Widget w, XtPointer client_data, XtPointer callData)
06620 {
06621    static char FuncName[] = {"SUMA_cb_XHaviewlock_toggled"};
06622    DList *list=NULL;
06623    SUMA_EngineData *ED = NULL;
06624 
06625    SUMA_ENTRY;
06626    
06627    list = SUMA_CreateList();
06628    ED = SUMA_InitializeEngineListData (SE_ToggleLockAllViews);
06629    if (!SUMA_RegisterEngineListCommand (  list, ED, 
06630                                           SEF_Empty, NULL, 
06631                                           SES_SumaWidget, NULL, NOPE, 
06632                                           SEI_Head, NULL )) {
06633       fprintf(SUMA_STDERR,"Error %s: Failed to register command\n", FuncName);
06634       SUMA_RETURNe;
06635    }
06636    if (!SUMA_Engine (&list)) {
06637       fprintf(stderr, "Error %s: SUMA_Engine call failed.\n", FuncName);
06638    }
06639   
06640    
06641    SUMA_RETURNe;   
06642    
06643 }
06644 
06645 void SUMA_cb_XHviewlock_toggled(Widget w, XtPointer client_data, XtPointer callData)
06646 {
06647    static char FuncName[] = {"SUMA_cb_XHviewlock_toggled"};
06648    SUMA_Boolean LocalHead = NOPE;
06649    DList *list=NULL;
06650    SUMA_EngineData *ED = NULL;
06651    int i = (int) client_data;
06652    
06653    SUMA_ENTRY;
06654    
06655    list = SUMA_CreateList ();
06656    ED = SUMA_InitializeEngineListData (SE_ToggleLockView);
06657    if (!SUMA_RegisterEngineListCommand (  list, ED, 
06658                                           SEF_i, (void*)&i, 
06659                                           SES_SumaWidget, NULL, NOPE, 
06660                                           SEI_Head, NULL )) {
06661       fprintf(SUMA_STDERR,"Error %s: Failed to register command\n", FuncName);
06662       SUMA_RETURNe;
06663    }
06664    if (!SUMA_Engine (&list)) {
06665       fprintf(stderr, "Error %s: SUMA_Engine call failed.\n", FuncName);
06666    }
06667    
06668    SUMA_RETURNe;
06669 }
06670 
06671 
06672 
06673 
06674 
06675 void SUMA_cb_newSumaCont(Widget w, XtPointer client_data, XtPointer callData)
06676 {
06677    static char FuncName[] = {"SUMA_cb_newSumaCont"};
06678    SUMA_Boolean LocalHead = NOPE;
06679    
06680    SUMA_ENTRY;
06681    
06682    fprintf(SUMA_STDOUT, "%s: Opening a new controller...\n", FuncName);
06683    
06684    if (!SUMA_X_SurfaceViewer_Create ()) {
06685       fprintf (SUMA_STDERR,"Error %s: Failed in SUMA_X_SurfaceViewer_Create.\n", FuncName);
06686       SUMA_RETURNe;
06687    } 
06688    
06689    SUMA_RETURNe;
06690 }
06691 
06692 
06693 
06694 void SUMA_cb_closeSumaCont(Widget w, XtPointer data, XtPointer callData)
06695 {
06696    static char FuncName[] = {"SUMA_cb_closeSumaCont"};
06697    SUMA_Boolean LocalHead = NOPE;
06698    
06699    SUMA_ENTRY;
06700    
06701    if (!SUMAg_CF->X->SumaCont->AppShell) SUMA_RETURNe;
06702    
06703    #ifdef SUMA_USE_WITHDRAW 
06704       if (LocalHead) fprintf (SUMA_STDERR,"%s: Withdrawing Suma Controller...\n", FuncName);
06705       
06706       XWithdrawWindow(SUMAg_CF->X->DPY_controller1, 
06707          XtWindow(SUMAg_CF->X->SumaCont->AppShell),
06708          XScreenNumberOfScreen(XtScreen(SUMAg_CF->X->SumaCont->AppShell)));
06709    #endif
06710    #ifdef SUMA_USE_DESTROY 
06711       if (LocalHead) fprintf (SUMA_STDERR,"%s: Destroying Suma Controller...\n", FuncName);
06712       XtDestroyWidget(SUMAg_CF->X->SumaCont->AppShell);
06713       SUMAg_CF->X->SumaCont->AppShell = NULL;
06714    #endif
06715    
06716    SUMA_RETURNe;
06717 
06718 }
06719 
06720 
06721 
06722 
06723 
06724 
06725 
06726 
06727 
06728 
06729 
06730 
06731 
06732 
06733 Widget SUMA_GetTopShell(Widget w)
06734 {
06735     while (w && !XtIsWMShell (w))
06736         w = XtParent (w);
06737     return w;
06738 }
06739 
06740 
06741 
06742 
06743 
06744 void SUMA_set_Lock_rb (SUMA_rb_group * Lock_rbg, int irb, int but)
06745 {
06746    static char FuncName[] = {"SUMA_set_Lock_rb"};
06747    SUMA_Boolean LocalHead = NOPE;
06748    Widget w;
06749    int i, itb, ifb;
06750    
06751    SUMA_ENTRY;
06752       
06753    ifb = irb*Lock_rbg->N_but; 
06754    itb = ifb+but; 
06755    
06756    i = 0;
06757    while (i<Lock_rbg->N_but) {
06758       
06759       w = Lock_rbg->tb[ifb+i];
06760       if (!w) SUMA_RETURNe; 
06761       if ( (ifb + i) == itb) XmToggleButtonSetState (w, YUP, NOPE);
06762        else XmToggleButtonSetState (w, NOPE, NOPE);
06763       ++i;
06764    }
06765    
06766    SUMA_RETURNe;   
06767 
06768 }  
06769       
06770 void SUMA_set_Lock_arb (SUMA_rb_group * Lock_rbg)
06771 {
06772    static char FuncName[] = {"SUMA_set_Lock_arb"};
06773    int i, sumlock;
06774    
06775    SUMA_ENTRY;
06776    
06777    if (!Lock_rbg->atb[0]) SUMA_RETURNe;
06778    
06779    sumlock = 0;
06780    for (i=0; i < SUMA_MAX_SURF_VIEWERS; ++i) {
06781       sumlock += SUMAg_CF->Locked[i];
06782    } 
06783    
06784    if (sumlock == SUMA_MAX_SURF_VIEWERS * SUMA_No_Lock) { 
06785          XmToggleButtonSetState (Lock_rbg->atb[0], YUP, NOPE);
06786          XmToggleButtonSetState (Lock_rbg->atb[1], NOPE, NOPE);
06787          XmToggleButtonSetState (Lock_rbg->atb[2], NOPE, NOPE);
06788    }else if (sumlock == SUMA_MAX_SURF_VIEWERS * SUMA_I_Lock) {
06789          XmToggleButtonSetState (Lock_rbg->atb[0], NOPE, NOPE);
06790          XmToggleButtonSetState (Lock_rbg->atb[1], YUP, NOPE);
06791          XmToggleButtonSetState (Lock_rbg->atb[2], NOPE, NOPE);
06792    }else if (sumlock == SUMA_MAX_SURF_VIEWERS * SUMA_XYZ_Lock) {
06793          XmToggleButtonSetState (Lock_rbg->atb[0], NOPE, NOPE);
06794          XmToggleButtonSetState (Lock_rbg->atb[1], NOPE, NOPE);
06795          XmToggleButtonSetState (Lock_rbg->atb[2], YUP, NOPE);
06796    }else {
06797          XmToggleButtonSetState (Lock_rbg->atb[0], NOPE, NOPE);
06798          XmToggleButtonSetState (Lock_rbg->atb[1], NOPE, NOPE);
06799          XmToggleButtonSetState (Lock_rbg->atb[2], NOPE, NOPE);
06800    }
06801    
06802    SUMA_RETURNe;   
06803 
06804 }
06805 
06806 void SUMA_set_LockView_atb (void)
06807 {
06808    static char FuncName[] = {"SUMA_set_LockView_atb"};
06809    int i, sumlock;
06810    
06811    SUMA_ENTRY;
06812    
06813    
06814    sumlock = 0;
06815    for (i=0; i < SUMA_MAX_SURF_VIEWERS; ++i) {
06816       sumlock += SUMAg_CF->ViewLocked[i];
06817    } 
06818 
06819    if (sumlock == SUMA_MAX_SURF_VIEWERS) { 
06820       XmToggleButtonSetState (SUMAg_CF->X->SumaCont->LockAllView_tb, YUP, NOPE);
06821    }else if (sumlock == NOPE) { 
06822       XmToggleButtonSetState (SUMAg_CF->X->SumaCont->LockAllView_tb, NOPE, NOPE);
06823    }else {
06824       
06825    }
06826    
06827    SUMA_RETURNe;   
06828 }
06829 
06830 
06831 
06832 
06833 
06834 
06835 
06836 void SUMA_cb_moreViewerInfo (Widget w, XtPointer client_data, XtPointer callData)
06837 {
06838    static char FuncName[] = {"SUMA_cb_moreViewerInfo"};
06839    SUMA_SurfaceViewer *sv=NULL;
06840    void *n=NULL;
06841    char *s = NULL, stmp[100];
06842    SUMA_Boolean LocalHead = NOPE;
06843    SUMA_CREATE_TEXT_SHELL_STRUCT *TextShell = NULL;
06844    int isv;
06845    
06846    SUMA_ENTRY;
06847    
06848    #if 0
06849    
06850 
06851    XtVaGetValues (w,
06852                   XmNuserData, &n,
06853                   NULL);
06854    sv = (SUMA_SurfaceViewer *)n;
06855    #else
06856              
06857    sv = (SUMA_SurfaceViewer *)client_data;
06858    #endif
06859    
06860    isv = SUMA_WhichSV(sv, SUMAg_SVv, SUMAg_N_SVv);
06861 
06862    
06863    if (sv->X->ViewCont->ViewerInfo_TextShell) {
06864       XRaiseWindow (SUMAg_CF->X->DPY_controller1, XtWindow(sv->X->ViewCont->ViewerInfo_TextShell->toplevel));
06865       SUMA_RETURNe;
06866    }
06867    
06868    
06869    s = SUMA_SurfaceViewer_StructInfo(sv, 1);
06870    
06871    #if 1
06872    if (s) {
06873       TextShell =  SUMA_CreateTextShellStruct (SUMA_ViewerInfo_open, (void *)sv, 
06874                                                SUMA_ViewerInfo_destroyed, (void *)sv);
06875       if (!TextShell) {
06876          fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_CreateTextShellStruct.\n", FuncName);
06877          SUMA_RETURNe;
06878       }
06879       sprintf(stmp, "[%c] Viewer Info", 65+isv);
06880       sv->X->ViewCont->ViewerInfo_TextShell = SUMA_CreateTextShell(s, stmp, TextShell);
06881       SUMA_free(s);
06882    }else {
06883       fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_SurfaceViewer_StructInfo.\n", FuncName);
06884    }   
06885    #else 
06886       fprintf (SUMA_STDERR, "%s\n", s);
06887       SUMA_free(s); 
06888    #endif
06889 
06890     
06891    SUMA_RETURNe;
06892 }
06893 
06894 
06895 
06896 void SUMA_ViewerInfo_open (void *p) 
06897 {
06898    static char FuncName[] = {"SUMA_ViewerInfo_open"};
06899    SUMA_SurfaceViewer *sv= NULL;
06900   
06901    SUMA_ENTRY;
06902    
06903    sv = (SUMA_SurfaceViewer *)p;
06904    MCW_invert_widget (sv->X->ViewCont->ViewerInfo_pb);
06905    
06906    
06907    SUMA_RETURNe;
06908 }
06909 
06910 
06911 
06912 
06913 void SUMA_ViewerInfo_destroyed (void *p) 
06914 {
06915    static char FuncName[] = {"SUMA_ViewerInfo_destroyed"};
06916    SUMA_SurfaceViewer *sv= NULL;
06917    
06918    SUMA_ENTRY;
06919 
06920    sv = (SUMA_SurfaceViewer *)p;
06921    MCW_invert_widget (sv->X->ViewCont->ViewerInfo_pb);
06922    
06923    sv->X->ViewCont->ViewerInfo_TextShell = NULL;
06924    SUMA_RETURNe;
06925 }
06926 
06927 
06928 
06929 
06930 
06931 
06932 void SUMA_cb_moreSumaInfo (Widget w, XtPointer client_data, XtPointer callData)
06933 {
06934    static char FuncName[] = {"SUMA_cb_moreSumaInfo"};
06935    SUMA_SurfaceObject *SO=NULL;
06936    void *n=NULL;
06937    char *s = NULL;
06938    SUMA_Boolean LocalHead = NOPE;
06939    SUMA_CREATE_TEXT_SHELL_STRUCT *TextShell = NULL;
06940    
06941    SUMA_ENTRY;
06942    
06943    
06944    if (SUMAg_CF->X->SumaCont->SumaInfo_TextShell) {
06945       XRaiseWindow (SUMAg_CF->X->DPY_controller1, XtWindow(SUMAg_CF->X->SumaCont->SumaInfo_TextShell->toplevel));
06946       SUMA_RETURNe;
06947    }
06948    
06949    
06950    s = SUMA_CommonFieldsInfo (SUMAg_CF, 1);
06951    
06952    if (s) {
06953       TextShell =  SUMA_CreateTextShellStruct (SUMA_SumaInfo_open, NULL, 
06954                                                SUMA_SumaInfo_destroyed, NULL);
06955       if (!TextShell) {
06956          fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_CreateTextShellStruct.\n", FuncName);
06957          SUMA_RETURNe;
06958       }
06959       SUMAg_CF->X->SumaCont->SumaInfo_TextShell = SUMA_CreateTextShell(s, "SUMA", TextShell);
06960       SUMA_free(s);
06961    }else {
06962       fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_CommonFieldsInfo.\n", FuncName);
06963    }   
06964 
06965     
06966    SUMA_RETURNe;
06967 }
06968 
06969 
06970 
06971 
06972 void SUMA_SumaInfo_open (void *p) 
06973 {
06974    static char FuncName[] = {"SUMA_SumaInfo_open"};
06975   
06976    SUMA_ENTRY;
06977    
06978    
06979    
06980    SUMA_RETURNe;
06981 }
06982 
06983 
06984 
06985 
06986 void SUMA_SumaInfo_destroyed (void *p) 
06987 {
06988    static char FuncName[] = {"SUMA_SumaInfo_destroyed"};
06989    SUMA_SurfaceObject *SO= NULL;
06990    
06991    SUMA_ENTRY;
06992 
06993    SUMAg_CF->X->SumaCont->SumaInfo_TextShell = NULL;
06994    SUMA_RETURNe;
06995 }
06996 
06997 
06998 
06999 
07000 
07001 
07002 
07003 void SUMA_cb_moreSurfInfo (Widget w, XtPointer client_data, XtPointer callData)
07004 {
07005    static char FuncName[] = {"SUMA_cb_moreSurfInfo"};
07006    SUMA_SurfaceObject *SO=NULL;
07007    void *n=NULL;
07008    char *s = NULL;
07009    void **curSOp;
07010    SUMA_Boolean LocalHead = NOPE;
07011    SUMA_CREATE_TEXT_SHELL_STRUCT *TextShell = NULL;
07012    
07013    SUMA_ENTRY;
07014    #if 0
07015    XtVaGetValues (w,
07016                   XmNuserData, &n,
07017                   NULL);
07018                   
07019    SO = (SUMA_SurfaceObject *)n;
07020    #else
07021    curSOp = (void **)client_data;
07022    SO = (SUMA_SurfaceObject *)(*curSOp);
07023    #endif
07024   
07025    
07026    if (SO->SurfCont->SurfInfo_TextShell) {
07027       XRaiseWindow (SUMAg_CF->X->DPY_controller1, XtWindow(SO->SurfCont->SurfInfo_TextShell->toplevel));
07028       SUMA_RETURNe;
07029    }
07030    
07031    
07032    s = SUMA_SurfaceObject_Info (SO, SUMAg_CF->DsetList);
07033    
07034    if (s) {
07035       TextShell =  SUMA_CreateTextShellStruct (SUMA_SurfInfo_open, (void *)SO, 
07036                                                SUMA_SurfInfo_destroyed, (void *)SO);
07037       if (!TextShell) {
07038          fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_CreateTextShellStruct.\n", FuncName);
07039          SUMA_RETURNe;
07040       }
07041       SO->SurfCont->SurfInfo_TextShell = SUMA_CreateTextShell(s, SO->Label, TextShell);
07042       SUMA_free(s);
07043    }else {
07044       fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_SurfaceObject_Info.\n", FuncName);
07045    }   
07046 
07047     
07048    SUMA_RETURNe;
07049 }
07050 
07051 
07052 
07053 
07054 void SUMA_SurfInfo_open (void *p) 
07055 {
07056    static char FuncName[] = {"SUMA_SurfInfo_open"};
07057    SUMA_SurfaceObject *SO= NULL;
07058   
07059    SUMA_ENTRY;
07060    
07061    SO = (SUMA_SurfaceObject *)p;
07062    MCW_invert_widget (SO->SurfCont->SurfInfo_pb);
07063    
07064    
07065    SUMA_RETURNe;
07066 }
07067 
07068 
07069 
07070 
07071 void SUMA_SurfInfo_destroyed (void *p) 
07072 {
07073    static char FuncName[] = {"SUMA_SurfInfo_destroyed"};
07074    SUMA_SurfaceObject *SO= NULL;
07075    
07076    SUMA_ENTRY;
07077 
07078    SO = (SUMA_SurfaceObject *)p;
07079    MCW_invert_widget (SO->SurfCont->SurfInfo_pb);
07080    
07081    SO->SurfCont->SurfInfo_TextShell = NULL;
07082    SUMA_RETURNe;
07083 }
07084 
07085 
07086 
07087 
07088 void SUMA_DestroyTextShell (Widget w, XtPointer ud, XtPointer cd) 
07089 {
07090    static char FuncName[] = {"SUMA_DestroyTextShell"};
07091    SUMA_CREATE_TEXT_SHELL_STRUCT *TextShell=NULL;
07092    
07093    SUMA_ENTRY;
07094    
07095    TextShell = (SUMA_CREATE_TEXT_SHELL_STRUCT *)ud;
07096    
07097    if (TextShell->DestroyCallBack) {
07098       
07099       TextShell->DestroyCallBack(TextShell->DestroyData);
07100    }
07101    if (TextShell) SUMA_free(TextShell);
07102    
07103    XtDestroyWidget(SUMA_GetTopShell(w));
07104 
07105    SUMA_RETURNe;
07106 }
07107 
07108 
07109 
07110 
07111 
07112 
07113 
07114 
07115 
07116 
07117 
07118 
07119 SUMA_CREATE_TEXT_SHELL_STRUCT * SUMA_CreateTextShellStruct (void (*opencallback)(void *data), void *opendata, 
07120                                                             void (*closecallback)(void*data), void *closedata)
07121 {
07122    static char FuncName[] = {"SUMA_CreateTextShellStruct"};
07123    SUMA_CREATE_TEXT_SHELL_STRUCT *TextShell=NULL;
07124    
07125    SUMA_ENTRY;
07126    
07127    TextShell = (SUMA_CREATE_TEXT_SHELL_STRUCT *) SUMA_malloc (sizeof(SUMA_CREATE_TEXT_SHELL_STRUCT));
07128    if (!TextShell) {
07129       fprintf (SUMA_STDERR, "Error %s: Failed to allocate for TextShell.\n", FuncName);
07130       SUMA_RETURN (NULL);
07131    }
07132    TextShell->text_w =  TextShell->search_w = TextShell->text_output = TextShell->toplevel = NULL;
07133    TextShell->case_sensitive = NOPE;
07134    TextShell->allow_edit = NOPE;
07135    TextShell->OpenCallBack = opencallback;
07136    TextShell->OpenData = opendata;
07137    TextShell->DestroyCallBack = closecallback;
07138    TextShell->DestroyData = closedata;
07139    TextShell->CursorAtBottom = NOPE;
07140    
07141    SUMA_RETURN (TextShell);
07142 }  
07143 
07144 
07145 
07146 
07147 
07148 
07149 
07150 
07151 
07152 
07153 
07154 
07155 
07156 
07157    
07158 SUMA_CREATE_TEXT_SHELL_STRUCT * SUMA_CreateTextShell (char *s, char *title, SUMA_CREATE_TEXT_SHELL_STRUCT *TextShell)
07159 {
07160    static char FuncName[] = {"SUMA_CreateTextShell"};
07161    Widget rowcol_v, rowcol_h, close_w, form, frame, toggle_case_w;
07162    int n;
07163    SUMA_Boolean LocalHead = NOPE;
07164    Pixel fg_pix;
07165    Arg args[20];
07166    
07167    SUMA_ENTRY;
07168 
07169    if (TextShell->OpenCallBack) { 
07170       if (LocalHead) fprintf (SUMA_STDERR, "%s: Calling OpenCallBack.\n", FuncName);
07171       TextShell->OpenCallBack(TextShell->OpenData);
07172    }
07173    
07174    if (!TextShell->toplevel) { 
07175       if (LocalHead) fprintf (SUMA_STDERR, "%s: Creating new text shell window.\n", FuncName);
07176       TextShell->toplevel = XtVaAppCreateShell (title, "Suma",
07177          topLevelShellWidgetClass, SUMAg_CF->X->DPY_controller1 ,
07178          XmNdeleteResponse, XmDO_NOTHING,
07179          NULL);  
07180 
07181       XmAddWMProtocolCallback(
07182          TextShell->toplevel,
07183          XmInternAtom( SUMAg_CF->X->DPY_controller1 , "WM_DELETE_WINDOW" , False ) ,
07184          SUMA_DestroyTextShell, TextShell) ;
07185 
07186       form = XtVaCreateWidget ("textoutput",
07187         xmFormWidgetClass, TextShell->toplevel, NULL);
07188 
07189 
07190       rowcol_v = XtVaCreateWidget ("rowcol_v",
07191         xmRowColumnWidgetClass, form, NULL);
07192 
07193       rowcol_h = XtVaCreateWidget ("rowcol_h",
07194         xmRowColumnWidgetClass, rowcol_v,
07195         XmNorientation,  XmHORIZONTAL,
07196         NULL);
07197       XtVaCreateManagedWidget ("Search Pattern:",
07198         xmLabelWidgetClass, rowcol_h, NULL);
07199 
07200       TextShell->search_w = XtVaCreateManagedWidget ("SUMA_search_text",
07201         xmTextFieldWidgetClass, rowcol_h, NULL);
07202 
07203       XtVaGetValues (TextShell->search_w, XmNforeground, &fg_pix, NULL);
07204       toggle_case_w = XtVaCreateManagedWidget ("Case Sensitive",
07205          xmToggleButtonWidgetClass, rowcol_h,
07206          XmNset, TextShell->case_sensitive,
07207          XmNselectColor, fg_pix, 
07208          NULL);
07209       XtAddCallback (toggle_case_w, XmNvalueChangedCallback,SUMA_cb_ToggleCaseSearch, TextShell);
07210 
07211       close_w = XtVaCreateManagedWidget ("Close", 
07212          xmPushButtonWidgetClass, rowcol_h, NULL);
07213       XtAddCallback (close_w, XmNactivateCallback, SUMA_DestroyTextShell, TextShell);    
07214 
07215       XtManageChild (rowcol_h);
07216 
07217       TextShell->text_output = XtVaCreateManagedWidget ("text_output",
07218         xmTextWidgetClass, rowcol_v,
07219         XmNeditable,              False,
07220         XmNcursorPositionVisible, False,
07221         XmNshadowThickness,       0,
07222         XmNhighlightThickness,    0,
07223         NULL);
07224 
07225       XtManageChild (rowcol_v);
07226 
07227       n = 0;
07228       XtSetArg (args[n], XmNrows,      10); n++;
07229       XtSetArg (args[n], XmNcolumns,   80); n++;
07230       XtSetArg (args[n], XmNeditMode,  XmMULTI_LINE_EDIT); n++;
07231       XtSetArg (args[n], XmNeditable, TextShell->allow_edit); n++;
07232       XtSetArg (args[n], XmNscrollHorizontal,  False); n++;
07233       XtSetArg (args[n], XmNwordWrap,  True); n++;
07234       XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
07235       XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
07236       XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
07237       XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
07238       XtSetArg (args[n], XmNtopWidget, rowcol_v); n++;
07239 
07240       TextShell->text_w = XmCreateScrolledText (form, "text_w", args, n);
07241       if (!s) {
07242          XmTextSetString (TextShell->text_w, "No Messages.\n---------------\n");
07243       } else {
07244          XmTextSetString (TextShell->text_w, s);
07245       }   
07246       XtManageChild (TextShell->text_w);
07247 
07248       XtAddCallback (TextShell->search_w, XmNactivateCallback, SUMA_cb_search_text, TextShell);
07249 
07250       XtManageChild (form);
07251 
07252       
07253       XtPopup(TextShell->toplevel, XtGrabNone);   
07254 
07255       XtRealizeWidget (TextShell->toplevel);
07256    } else { 
07257       if (LocalHead) fprintf (SUMA_STDERR, "%s: Setting string in previously created text shell window.\n", FuncName);
07258       if (!s) XmTextSetString (TextShell->text_w, "No Messages.\n---------------\n");
07259       else XmTextSetString (TextShell->text_w, s);
07260       if (TextShell->CursorAtBottom) {
07261          XmTextSetInsertionPosition(TextShell->text_w, XmTextGetLastPosition (TextShell->text_w));
07262       }
07263    }
07264    SUMA_RETURN(TextShell);
07265 }
07266 
07267 
07268 
07269 
07270 
07271 void SUMA_cb_ToggleCaseSearch (Widget widget, XtPointer client_data, XtPointer call_data)
07272 {
07273    static char FuncName[]={"SUMA_cb_ToggleCaseSearch"};
07274    SUMA_CREATE_TEXT_SHELL_STRUCT *TextShell;
07275    
07276    SUMA_ENTRY;
07277 
07278    TextShell = (SUMA_CREATE_TEXT_SHELL_STRUCT *)client_data;
07279    TextShell->case_sensitive = !TextShell->case_sensitive;
07280    
07281    SUMA_RETURNe;   
07282 }
07283 
07284 
07285 
07286 
07287 
07288 
07289 
07290 
07291 
07292 
07293 
07294 void SUMA_cb_search_text(Widget widget, XtPointer client_data, XtPointer call_data)
07295 {
07296    char *search_pat, *p, *string, buf[32];
07297    XmTextPosition pos;
07298    int len, i;
07299    Boolean found = False;
07300    SUMA_Boolean LocalHead = NOPE;
07301    SUMA_CREATE_TEXT_SHELL_STRUCT *TextShell;
07302    static char FuncName[]={"SUMA_cb_search_text"};
07303    
07304    SUMA_ENTRY;
07305    
07306    
07307    TextShell = (SUMA_CREATE_TEXT_SHELL_STRUCT *)client_data;
07308    if (!TextShell) { SUMA_SL_Err("Unexpected NULL TextShell"); SUMA_RETURNe; }
07309    
07310    
07311    if (!(string = XmTextGetString (TextShell->text_w)) || !*string) {
07312      XmTextSetString (TextShell->text_output, "No text to search.");
07313      if (string) XtFree (string); 
07314      SUMA_RETURNe;
07315    }
07316    len = strlen(string);
07317    if (!TextShell->case_sensitive) {
07318       if (LocalHead) fprintf (SUMA_STDERR,"%s: Case insensitive search.\n", FuncName);
07319       
07320       for (i=0; i < len; ++i) string[i] = tolower(string[i]);   
07321    }
07322    
07323    
07324    if (!(search_pat = XmTextGetString (TextShell->search_w)) || !*search_pat) {
07325      XmTextSetString (TextShell->text_output, "Specify a search pattern.");
07326      XtFree (string); 
07327      if (search_pat) XtFree (search_pat); 
07328      SUMA_RETURNe;
07329    }
07330    len = strlen (search_pat);
07331    
07332    if (!TextShell->case_sensitive) {
07333       
07334       for (i=0; i < len; ++i) search_pat[i] = tolower(search_pat[i]);  
07335    }
07336    
07337 
07338 
07339    pos = XmTextGetCursorPosition (TextShell->text_w);
07340    for (p = &string[pos+1]; (p = index (p, *search_pat)); p++)
07341      if (!strncmp (p, search_pat, len)) {
07342          found = True;
07343          break;
07344      }
07345    if (!found) { 
07346      
07347      for (p = string;
07348              (p = index (p, *search_pat)) && p - string <= pos; p++)
07349          if (!strncmp (p, search_pat, len)) {
07350              found = True;
07351              break;
07352          }
07353    }
07354    if (!found)
07355      XmTextSetString (TextShell->text_output, "Pattern not found.");
07356    else {
07357      pos = (XmTextPosition)(p - string);
07358      sprintf (buf, "Pattern found at position %ld.", pos);
07359      XmTextSetString (TextShell->text_output, buf);
07360      XmTextSetInsertionPosition (TextShell->text_w, pos);
07361      XmTextSetHighlight(TextShell->text_w, pos, pos+len, XmHIGHLIGHT_SELECTED);
07362    }
07363    if (string) XtFree (string);
07364    if (search_pat) XtFree (search_pat);
07365    
07366    SUMA_RETURNe;
07367 }
07368 
07369 
07370 
07371 
07372 
07373 
07374 void SUMA_cb_SetDrawROI_SaveMode(Widget widget, XtPointer client_data, XtPointer call_data)
07375 {
07376    static char FuncName[]={"SUMA_cb_SetDrawROI_SaveMode"};
07377    SUMA_MenuCallBackData *datap=NULL;
07378    SUMA_Boolean LocalHead = NOPE;
07379    
07380    SUMA_ENTRY;
07381    
07382    datap = (SUMA_MenuCallBackData *)client_data;
07383    
07384    if (LocalHead) fprintf(SUMA_STDERR,"%s: Setting SaveMode to %d\n", FuncName, (int)datap->callback_data);
07385    SUMAg_CF->X->DrawROI->SaveMode = (int)datap->callback_data; 
07386    
07387    SUMA_RETURNe;
07388 }
07389 
07390 
07391 
07392 
07393 
07394 
07395 
07396 void SUMA_cb_SetDrawROI_WhatDist(Widget widget, XtPointer client_data, XtPointer call_data)
07397 {
07398    static char FuncName[]={"SUMA_cb_SetDrawROI_WhatDist"};
07399    SUMA_MenuCallBackData *datap=NULL;
07400    SUMA_Boolean LocalHead = NOPE;
07401    
07402    SUMA_ENTRY;
07403    
07404    datap = (SUMA_MenuCallBackData *)client_data;
07405 
07406    if (LocalHead) fprintf(SUMA_STDERR,"%s: Setting WhatDist to %d\n", FuncName, (int)datap->callback_data);
07407    SUMAg_CF->X->DrawROI->WhatDist = (int)datap->callback_data; 
07408    
07409    SUMA_RETURNe;
07410 } 
07411 
07412 
07413 
07414 
07415 
07416 
07417 void SUMA_cb_SetDrawROI_SaveWhat(Widget widget, XtPointer client_data, XtPointer call_data)
07418 {
07419    static char FuncName[]={"SUMA_cb_SetDrawROI_SaveWhat"};
07420    SUMA_MenuCallBackData *datap=NULL;
07421    SUMA_Boolean LocalHead = NOPE;
07422    
07423    SUMA_ENTRY;
07424    
07425    datap = (SUMA_MenuCallBackData *)client_data;
07426    
07427    if (LocalHead) fprintf(SUMA_STDERR,"%s: Setting SaveWhat to %d\n", FuncName, (int)datap->callback_data);
07428    SUMAg_CF->X->DrawROI->SaveWhat = (int)datap->callback_data; 
07429    
07430    SUMA_RETURNe;
07431 }
07432    
07433 
07434 
07435 
07436 
07437 
07438 
07439 void SUMA_cb_SetRenderMode(Widget widget, XtPointer client_data, XtPointer call_data)
07440 {
07441    static char FuncName[]={"SUMA_cb_SetRenderMode"};
07442    DList *list = NULL;
07443    DListElmt *Elmnt = NULL;
07444    SUMA_EngineData *ED = NULL;
07445    SUMA_MenuCallBackData *datap=NULL;
07446    SUMA_SurfaceObject *SO = NULL;
07447    void **curSOp;
07448    int imenu = 0;
07449    
07450    SUMA_ENTRY;
07451 
07452    
07453    datap = (SUMA_MenuCallBackData *)client_data;
07454    curSOp = (void **)datap->ContID;
07455    SO = (SUMA_SurfaceObject *)(*curSOp);
07456    imenu = (int)datap->callback_data; 
07457    
07458    switch (imenu) {
07459       case SW_SurfCont_RenderViewerDefault:
07460          imenu = SRM_ViewerDefault;
07461          break;
07462       case SW_SurfCont_RenderFill:
07463          imenu = SRM_Fill;
07464          break;
07465       case SW_SurfCont_RenderLine:
07466          imenu = SRM_Line;
07467          break;
07468       case SW_SurfCont_RenderPoints:
07469          imenu = SRM_Points;
07470          break;
07471       default: 
07472          fprintf (SUMA_STDERR, "Error %s: Unexpected widget index.\n", FuncName);
07473          break;
07474    }
07475    
07476    
07477    
07478    if (!list) list = SUMA_CreateList ();
07479    SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, SE_Redisplay_AllVisible, SES_SumaWidget, NULL);   
07480    ED = SUMA_InitializeEngineListData (SE_SetRenderMode);
07481    Elmnt = SUMA_RegisterEngineListCommand ( list, ED,
07482                                          SEF_i, (void *)&imenu,
07483                                          SES_SumaWidget, NULL, NOPE,
07484                                          SEI_Head, NULL);
07485    if (!SUMA_RegisterEngineListCommand ( list, ED,
07486                                          SEF_vp, (void *)SO,
07487                                          SES_SumaWidget, NULL, NOPE,
07488                                          SEI_In, Elmnt)) {
07489       fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_RegisterEngineListCommand.\n", FuncName);
07490       SUMA_RETURNe;                                     
07491    }
07492    
07493    
07494    if (!SUMA_Engine (&list)) {
07495       fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_Engine.\n", FuncName);
07496       SUMA_RETURNe;    
07497    }
07498    
07499    SUMA_RETURNe;
07500 }
07501 
07502 
07503 
07504 void SUMA_PopUpMessage (SUMA_MessageData *MD)
07505 {
07506    static char FuncName[]={"SUMA_PopUpMessage"};
07507    Widget Parent_w=NULL, wmsg = NULL;
07508    int ii;
07509    
07510    SUMA_ENTRY;
07511    
07512    if (!SUMAg_N_SVv) {
07513       
07514       SUMA_RETURNe;
07515    }
07516    
07517    
07518    ii=0;
07519    while ((SUMAg_SVv[ii].isShaded || !SUMAg_SVv[ii].X->TOPLEVEL) && (ii < SUMAg_N_SVv)) {
07520       ++ii;   
07521    }
07522    
07523    
07524    if (ii < SUMAg_N_SVv)
07525       Parent_w = SUMAg_SVv[ii].X->TOPLEVEL;
07526    else { 
07527       
07528       ii=0;
07529       while (!SUMAg_SVv[ii].X->TOPLEVEL && (ii < SUMAg_N_SVv)) {
07530          ++ii;   
07531       }
07532       if (ii >= SUMAg_N_SVv) {
07533          fprintf (SUMA_STDERR, "Error %s: This should not be happening.\n", FuncName);
07534          SUMA_RETURNe;  
07535       }else Parent_w = SUMAg_SVv[ii].X->TOPLEVEL;
07536    }
07537    
07538    if (MD->Action ==  SMA_LogAndPopup) {
07539       wmsg = NULL;
07540       switch (MD->Type) {
07541          case SMT_Notice:
07542             wmsg = MCW_popup_message(Parent_w, SUMA_FormatMessage (MD), MCW_USER_KILL | MCW_TIMER_KILL);
07543             break;
07544          case SMT_Warning:
07545             wmsg = MCW_popup_message(Parent_w, SUMA_FormatMessage (MD), MCW_USER_KILL | MCW_TIMER_KILL);
07546             break;
07547          case SMT_Error:
07548             wmsg = MCW_popup_message(Parent_w, SUMA_FormatMessage (MD), MCW_USER_KILL);
07549             break;
07550          case SMT_Critical:
07551             wmsg = MCW_popup_message(Parent_w, SUMA_FormatMessage (MD), MCW_CALLER_KILL);
07552             break;
07553          case SMT_Text:
07554             wmsg = MCW_popup_message(Parent_w, SUMA_FormatMessage (MD), MCW_CALLER_KILL | MCW_TIMER_KILL);
07555             break;
07556          default:
07557             break;
07558       }
07559       if (wmsg) {
07560          SUMA_PositionWindowRelative (wmsg, NULL, SWP_POINTER_OFF);
07561       }
07562    }
07563    
07564    SUMA_RETURNe;   
07565 
07566 }
07567 
07568 
07569 
07570 
07571 char * SUMA_FormatMessage (SUMA_MessageData *MD) 
07572 {
07573    static char FuncName[]={"SUMA_FormatMessage"};
07574    char *s=NULL;
07575 
07576    SUMA_ENTRY;
07577 
07578    s = (char *)SUMA_calloc (strlen(MD->Message)+strlen(MD->Source)+100, sizeof(char));
07579    if (!s) {
07580       fprintf (SUMA_STDERR, "Error %s: Failed to allocate.\n", FuncName);
07581       SUMA_RETURN(NULL);
07582    }
07583    switch (MD->Type) {
07584       case SMT_Notice:
07585          sprintf(s,"Notice %s:\n%s\n", MD->Source, MD->Message);
07586          break;
07587       case SMT_Warning:
07588          sprintf(s,"Warning %s:\n%s\n", MD->Source, MD->Message);
07589          break;
07590       case SMT_Error:
07591          sprintf(s,"Error %s:\n%s\n", MD->Source, MD->Message);
07592          break;
07593       case SMT_Critical:
07594          sprintf(s,"Critical Error %s:\n%s\n", MD->Source, MD->Message);
07595          break;
07596       case SMT_Text:
07597          sprintf(s,"%s", MD->Message);
07598          break;
07599       default:
07600          sprintf(s,"BAD MESSAGE.\n");
07601          break;
07602    }
07603    
07604    SUMA_RETURN (s);
07605 }
07606 
07607 
07608 
07609 
07610 
07611 
07612 
07613 
07614 void SUMA_cb_ToolsDrawROI (Widget w, XtPointer client_data, XtPointer call_data)
07615 {
07616    static char FuncName[]={"SUMA_cb_ToolsDrawROI"};
07617    int isv;
07618    DList *list = NULL;
07619    SUMA_MenuCallBackData * datap=NULL;
07620    
07621    SUMA_ENTRY;
07622 
07623    
07624    datap = (SUMA_MenuCallBackData *)client_data;
07625    isv = (int)datap->ContID;
07626 
07627    
07628    if (!list) list = SUMA_CreateList ();
07629    SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, SE_OpenDrawROI, SES_SumaWidget, (void*)&SUMAg_SVv[isv]); 
07630    if (!SUMA_Engine (&list)) {
07631       SUMA_RegisterMessage (SUMAg_CF->MessageList, "Failed to open DrawROI", FuncName, SMT_Error, SMA_LogAndPopup);
07632    }  
07633    SUMA_RETURNe;
07634 }
07635 
07636 
07637 
07638 
07639 
07640 
07641 void SUMA_cb_DrawROI_Undo (Widget w, XtPointer data, XtPointer client_data)
07642 {
07643    static char FuncName[]={"SUMA_cb_DrawROI_Undo"};
07644    DList *list = NULL;
07645    DListElmt *tmp=NULL;
07646    SUMA_Boolean LocalHead = NOPE;
07647    
07648    SUMA_ENTRY;
07649    
07650    if (!SUMAg_CF->X->DrawROI->curDrawnROI) SUMA_RETURNe;
07651    
07652    if (LocalHead) fprintf(SUMA_STDERR,"%s: Calling SUMA_UndoAction...\n", FuncName);
07653    
07654    if (!SUMAg_CF->X->DrawROI->curDrawnROI->StackPos) {
07655       SUMA_SLP_Err("Nothing to Undo.");
07656       SUMA_RETURNe;
07657    }
07658    
07659    tmp = SUMA_UndoAction (SUMAg_CF->X->DrawROI->curDrawnROI->ActionStack, SUMAg_CF->X->DrawROI->curDrawnROI->StackPos);
07660    if (!tmp) {
07661       SUMA_S_Err("Failed to Undo.");
07662       SUMA_RETURNe;
07663    }else if (tmp == SUMAg_CF->X->DrawROI->curDrawnROI->StackPos) {
07664       
07665       SUMAg_CF->X->DrawROI->curDrawnROI->StackPos = NULL;
07666    }else {
07667       SUMAg_CF->X->DrawROI->curDrawnROI->StackPos = tmp;
07668    }
07669 
07670    if (dlist_size(SUMAg_CF->X->DrawROI->curDrawnROI->ROIstrokelist)) {
07671       SUMA_LH("Not empty ROIstrokelist");
07672    }else {
07673       SUMA_LH(" empty ROIstrokelist");
07674    }
07675    
07676    
07677    
07678    if (!SUMA_Paint_SO_ROIplanes_w (SUMA_findSOp_inDOv(SUMAg_CF->X->DrawROI->curDrawnROI->Parent_idcode_str, SUMAg_DOv, SUMAg_N_DOv), SUMAg_DOv, SUMAg_N_DOv)) {
07679       SUMA_SLP_Err("Failed in SUMA_Paint_SO_ROIplanes_w.");
07680       SUMA_RETURNe;
07681    } 
07682 
07683    
07684    if (!list) list = SUMA_CreateList ();
07685    SUMA_REGISTER_TAIL_COMMAND_NO_DATA(list, SE_Redisplay_AllVisible, SES_Suma, NULL);
07686    if (!SUMA_Engine (&list)) {
07687       SUMA_SL_Err("Failed calling SUMA_Engine.");
07688    }
07689    
07690    
07691    SUMA_RETURNe;
07692 }
07693 
07694 void SUMA_cb_DrawROI_Redo (Widget w, XtPointer data, XtPointer client_data)
07695 {
07696    static char FuncName[]={"SUMA_cb_DrawROI_Redo"};
07697    DList *list = NULL;
07698    DListElmt *tmp=NULL;
07699    SUMA_Boolean LocalHead = NOPE;
07700    
07701    
07702    SUMA_ENTRY;
07703    
07704    if (!SUMAg_CF->X->DrawROI->curDrawnROI) SUMA_RETURNe;
07705    
07706    if (LocalHead) fprintf(SUMA_STDERR,"%s: Calling SUMA_RedoAction...\n", FuncName);
07707    
07708    if (SUMAg_CF->X->DrawROI->curDrawnROI->StackPos == dlist_tail(SUMAg_CF->X->DrawROI->curDrawnROI->ActionStack)) {
07709       SUMA_SLP_Err("Nothing to Redo.");
07710       SUMA_RETURNe;
07711    }
07712    
07713    tmp = SUMA_RedoAction (SUMAg_CF->X->DrawROI->curDrawnROI->ActionStack, SUMAg_CF->X->DrawROI->curDrawnROI->StackPos);
07714    if (!tmp) {
07715       SUMA_S_Err("Failed to Redo.");
07716       SUMA_RETURNe;
07717    }else {
07718       SUMAg_CF->X->DrawROI->curDrawnROI->StackPos = tmp;
07719    }
07720    
07721 
07722    
07723    
07724    if (!SUMA_Paint_SO_ROIplanes_w (SUMA_findSOp_inDOv(SUMAg_CF->X->DrawROI->curDrawnROI->Parent_idcode_str, SUMAg_DOv, SUMAg_N_DOv), SUMAg_DOv, SUMAg_N_DOv)) {
07725       SUMA_SLP_Err("Failed in SUMA_Paint_SO_ROIplanes_w.");
07726       SUMA_RETURNe;
07727    } 
07728 
07729    
07730    if (!list) list = SUMA_CreateList ();
07731    SUMA_REGISTER_TAIL_COMMAND_NO_DATA(list, SE_Redisplay_AllVisible, SES_Suma, NULL);
07732    if (!SUMA_Engine (&list)) {
07733       SUMA_SL_Err("Failed calling SUMA_Engine.");
07734    }
07735    
07736    SUMA_RETURNe;
07737 }
07738 
07739 void SUMA_cb_DrawROI_Join (Widget w, XtPointer data, XtPointer client_data)
07740 {
07741    static char FuncName[]={"SUMA_cb_DrawROI_Join"};
07742    SUMA_Boolean LocalHead = NOPE;
07743    int HeadNode=-1, TailNode=-1;
07744    float ThirdNode_v[3];
07745    SUMA_DRAWN_ROI *DrawnROI=NULL;
07746    SUMA_SurfaceObject *SO=NULL;
07747    SUMA_ROI_DATUM *ROIstroke = NULL;
07748    SUMA_ROI_ACTION_STRUCT *ROIA;
07749    DListElmt *tmpStackPos=NULL;
07750    DList *list=NULL;
07751    
07752    SUMA_ENTRY;
07753    
07754    DrawnROI = SUMAg_CF->X->DrawROI->curDrawnROI;
07755    
07756    if (!DrawnROI) {
07757       SUMA_SLP_Err ("NO ROI to close.");
07758       SUMA_RETURNe;
07759    }
07760    
07761    if (DrawnROI->DrawStatus == SUMA_ROI_Finished) {
07762       SUMA_SLP_Err ("Cannot edit Finished ROI.");
07763       SUMA_RETURNe;
07764    }
07765    
07766    if (DrawnROI->Type != SUMA_ROI_OpenPath) {
07767       SUMA_SLP_Err ("You can only close an open path.");
07768       SUMA_RETURNe; 
07769    }
07770    
07771    SUMA_DRAWN_ROI_HEAD_NODE(DrawnROI,HeadNode);
07772    SUMA_DRAWN_ROI_TAIL_NODE(DrawnROI,TailNode);
07773    
07774    
07775    SO = SUMA_findSOp_inDOv(DrawnROI->Parent_idcode_str, SUMAg_DOv, SUMAg_N_DOv); 
07776    ThirdNode_v[0] = SO->NodeList[3*TailNode] + 20 *SO->NodeNormList[3*TailNode];
07777    ThirdNode_v[1] = SO->NodeList[3*TailNode+1] + 20 *SO->NodeNormList[3*TailNode+1];
07778    ThirdNode_v[2] = SO->NodeList[3*TailNode+2] + 20 *SO->NodeNormList[3*TailNode+2];
07779    
07780    
07781    ROIstroke = SUMA_Surf_Plane_Intersect_ROI (SO, TailNode, HeadNode, ThirdNode_v);
07782    
07783    if (!ROIstroke) {
07784       SUMA_SLP_Err ("Failed to close path.\nTry closing with mouse.");
07785       SUMA_RETURNe;
07786    }
07787    
07788    
07789 
07790 
07791    if (LocalHead) fprintf(SUMA_STDERR, "%s: Last node of ROIstroke is %d\n", FuncName, ROIstroke->nPath[ROIstroke->N_n-1]); 
07792    if (ROIstroke->nPath[ROIstroke->N_n-1] != HeadNode) {
07793       
07794       SUMA_SLP_Err ("Failed to close path.\nTry closing with mouse.");
07795       SUMA_RETURNe;
07796    }
07797    
07798    
07799    ROIstroke->action = SUMA_BSA_JoinEnds;
07800    ROIA = (SUMA_ROI_ACTION_STRUCT *) SUMA_malloc (sizeof(SUMA_ROI_ACTION_STRUCT)); 
07801    ROIA->DrawnROI = DrawnROI;
07802    ROIA->ROId = ROIstroke;
07803    tmpStackPos = SUMA_PushActionStack (DrawnROI->ActionStack, DrawnROI->StackPos, SUMA_AddToTailJunctionROIDatum, (void *)ROIA, SUMA_DestroyROIActionData);
07804    if (tmpStackPos) DrawnROI->StackPos = tmpStackPos;
07805    else {
07806       fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_PushActionStack.\n", FuncName);
07807       SUMA_RETURNe;
07808    }
07809    
07810    
07811    if (!list) list = SUMA_CreateList ();
07812    SUMA_REGISTER_TAIL_COMMAND_NO_DATA(list, SE_RedisplayNow_AllVisible, SES_SumaWidget, NULL);
07813    SUMA_Engine (&list);
07814 
07815    SUMA_RETURNe;
07816 }
07817 
07818 void SUMA_cb_DrawROI_Finish (Widget w, XtPointer data, XtPointer client_data)
07819 {
07820    static char FuncName[]={"SUMA_cb_DrawROI_Finish"};
07821    SUMA_Boolean LocalHead = NOPE;
07822    SUMA_DRAWN_ROI *DrawnROI=NULL;
07823    SUMA_ROI_ACTION_STRUCT *ROIA;
07824    SUMA_SurfaceObject *SO = NULL;
07825    DListElmt *tmpStackPos=NULL;
07826    DList *list=NULL;
07827    
07828    SUMA_ENTRY;
07829    
07830    DrawnROI = SUMAg_CF->X->DrawROI->curDrawnROI;
07831    
07832    if (!DrawnROI) {
07833       SUMA_SLP_Err ("NO ROI to finish.");
07834       SUMA_RETURNe;
07835    }
07836    
07837    if (DrawnROI->DrawStatus == SUMA_ROI_Finished) {
07838       
07839       SUMA_RETURNe;
07840    }
07841    
07842    
07843    ROIA = (SUMA_ROI_ACTION_STRUCT *) SUMA_malloc (sizeof(SUMA_ROI_ACTION_STRUCT)); 
07844    ROIA->DrawnROI = DrawnROI;
07845    ROIA->ROId = NULL;
07846    tmpStackPos = SUMA_PushActionStack (DrawnROI->ActionStack, DrawnROI->StackPos, SUMA_FinishedROI, (void *)ROIA, SUMA_DestroyROIActionData);
07847    if (tmpStackPos) DrawnROI->StackPos = tmpStackPos;
07848    else {
07849       fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_PushActionStack.\n", FuncName);
07850       SUMA_RETURNe;
07851    }
07852    
07853    SO = SUMA_findSOp_inDOv(DrawnROI->Parent_idcode_str, SUMAg_DOv, SUMAg_N_DOv);
07854    
07855    
07856    if (!SUMA_Paint_SO_ROIplanes_w (SO, SUMAg_DOv, SUMAg_N_DOv)) {
07857       SUMA_SLP_Err("Failed in SUMA_Paint_SO_ROIplanes_w.");
07858       SUMA_RETURNe;
07859    }
07860    
07861    
07862    if (!list) list = SUMA_CreateList ();
07863    SUMA_REGISTER_TAIL_COMMAND_NO_DATA(list, SE_Redisplay_AllVisible, SES_SumaWidget, NULL);
07864    SUMA_Engine (&list);
07865 
07866    SUMA_RETURNe;
07867 }
07868 
07869 
07870 
07871 
07872 
07873 void SUMA_cb_DrawROI_Delete(Widget wcall, XtPointer cd1, XtPointer cbs)
07874 {
07875    static char *PlaneName=NULL, FuncName[] = {"SUMA_cb_DrawROI_Delete"};
07876    XmPushButtonCallbackStruct * pbcbs = (XmPushButtonCallbackStruct *) cbs ;
07877    static int ErrCnt =0;
07878    DList *list=NULL;
07879    SUMA_SurfaceObject *SO=NULL;
07880    SUMA_Boolean LocalHead = NOPE;
07881    
07882    SUMA_ENTRY;
07883 
07884    if (!SUMAg_CF->X->DrawROI->curDrawnROI && wcall) { 
07885       
07886 
07887 
07888 
07889       if (!ErrCnt) SUMA_SLP_Note ("No ROI to delete");
07890       wcall = NULL; 
07891       ErrCnt ++;
07892    }
07893    
07894    
07895    if( wcall == NULL ){
07896       if (LocalHead) fprintf (SUMA_STDERR, "%s: Resetting button.\n", FuncName); 
07897       if( SUMAg_CF->X->DrawROI->Delete_first == NOPE ){
07898          MCW_set_widget_label( SUMAg_CF->X->DrawROI->Delete_pb , "delete ROI" ) ;
07899          SUMAg_CF->X->DrawROI->Delete_first = YUP ;
07900       }
07901       SUMA_RETURNe ;
07902    }
07903    
07904    
07905 
07906    if( SUMAg_CF->X->DrawROI->Delete_first ){
07907       MCW_set_widget_label( SUMAg_CF->X->DrawROI->Delete_pb  , "DELETE ROI" ) ;
07908       SUMAg_CF->X->DrawROI->Delete_first = NOPE ;
07909 
07910       
07911       if (LocalHead) fprintf (SUMA_STDERR, "%s: First Press, adding time out.\n", FuncName);
07912       (void) XtAppAddTimeOut(
07913                XtWidgetToApplicationContext(SUMAg_CF->X->DrawROI->Delete_pb) ,
07914                5000 , SUMA_delete_timeout_CB , NULL ) ;
07915 
07916        SUMA_RETURNe;
07917    }
07918    
07919    
07920    ErrCnt = 0;
07921    if (LocalHead) fprintf (SUMA_STDERR, "%s: Should be deleting ROI %s here ...\n", FuncName, SUMAg_CF->X->DrawROI->curDrawnROI->Label);
07922    
07923    
07924    SO = SUMA_findSOp_inDOv(SUMAg_CF->X->DrawROI->curDrawnROI->Parent_idcode_str , SUMAg_DOv, SUMAg_N_DOv);
07925    PlaneName = SUMA_copy_string(SUMAg_CF->X->DrawROI->curDrawnROI->ColPlaneName);
07926    
07927    if (!SUMA_DeleteROI (SUMAg_CF->X->DrawROI->curDrawnROI)) {
07928       SUMA_SLP_Err("Failed to delete ROI");
07929       SUMA_RETURNe; 
07930    }
07931    
07932    
07933    SUMA_FlushPlaneNotInUse (PlaneName, SO, SUMAg_DOv, SUMAg_N_DOv);
07934    if (PlaneName) SUMA_free(PlaneName);
07935    
07936    
07937    if (!SUMA_Paint_SO_ROIplanes_w (
07938          SO, SUMAg_DOv, SUMAg_N_DOv)) {
07939       SUMA_SLP_Err("Failed in SUMA_Paint_SO_ROIplanes_w.");
07940       SUMA_RETURNe;
07941    }
07942 
07943    
07944    if (!list) list = SUMA_CreateList ();
07945    SUMA_REGISTER_TAIL_COMMAND_NO_DATA(list, SE_Redisplay_AllVisible, SES_Suma, NULL); 
07946    if (!SUMA_Engine(&list)) SUMA_SLP_Err("Failed to redisplay.");
07947    
07948    
07949    MCW_set_widget_label( SUMAg_CF->X->DrawROI->Delete_pb , "delete ROI" ) ;   
07950    SUMA_RETURNe;
07951 }
07952 
07953 void SUMA_delete_timeout_CB( XtPointer client_data , XtIntervalId * id )
07954 {
07955    static char FuncName[] = {"SUMA_delete_timeout_CB"};
07956 
07957    SUMA_ENTRY;
07958 
07959    SUMA_cb_DrawROI_Delete(NULL, NULL, NULL);
07960 
07961    SUMA_RETURNe; 
07962 }
07963 
07964 
07965 
07966 
07967 void SUMA_cb_DrawROI_Save (Widget w, XtPointer data, XtPointer client_data)
07968 {
07969    static char FuncName[]={"SUMA_cb_DrawROI_Save"};
07970    SUMA_DRAWN_ROI *dROI=NULL;
07971    DList *list = NULL;
07972    SUMA_EngineData *ED = NULL;
07973    DListElmt *NextElm = NULL;
07974    SUMA_Boolean LocalHead = NOPE;
07975    
07976    SUMA_ENTRY;
07977    
07978    SUMA_LH("Called");
07979    
07980    dROI = SUMAg_CF->X->DrawROI->curDrawnROI;
07981    
07982    if (!dROI) {
07983       SUMA_LH("NULL ROI");
07984       SUMA_RETURNe;
07985    }
07986    
07987    if (!list) list = SUMA_CreateList();
07988    ED = SUMA_InitializeEngineListData (SE_SaveDrawnROIFileSelection);
07989    if (!(NextElm = SUMA_RegisterEngineListCommand (  list, ED,
07990                                           SEF_vp, NULL,
07991                                           SES_Suma, NULL, NOPE,
07992                                           SEI_Head, NULL))) {
07993       fprintf (SUMA_STDERR, "Error %s: Failed to register command.\n", FuncName);
07994    }
07995    if (!SUMA_RegisterEngineListCommand (  list, ED,
07996                                           SEF_ip, (int *)w,
07997                                           SES_Suma, NULL, NOPE,
07998                                           SEI_In, NextElm)) {
07999       fprintf (SUMA_STDERR, "Error %s: Failed to register command.\n", FuncName);
08000    }
08001    
08002    if (!SUMA_Engine (&list)) {
08003       fprintf(SUMA_STDERR, "Error %s: SUMA_Engine call failed.\n", FuncName);
08004    }
08005 
08006    SUMA_RETURNe;
08007 }
08008 
08009 void SUMA_cb_DrawROI_Load (Widget w, XtPointer data, XtPointer client_data)
08010 {
08011    static char FuncName[]={"SUMA_cb_DrawROI_Load"};
08012    DList *list = NULL;
08013    SUMA_EngineData *ED = NULL;
08014    DListElmt *NextElm = NULL;
08015    SUMA_Boolean LocalHead = NOPE;
08016    
08017    SUMA_ENTRY;
08018    
08019    if (!list) list = SUMA_CreateList();
08020    ED = SUMA_InitializeEngineListData (SE_OpenDrawnROIFileSelection);
08021    if (!(NextElm = SUMA_RegisterEngineListCommand (  list, ED,
08022                                           SEF_vp, NULL,
08023                                           SES_Suma, NULL, NOPE,
08024                                           SEI_Head, NULL))) {
08025       fprintf (SUMA_STDERR, "Error %s: Failed to register command.\n", FuncName);
08026    }
08027    if (!SUMA_RegisterEngineListCommand (  list, ED,
08028                                           SEF_ip, (int *)w,
08029                                           SES_Suma, NULL, NOPE,
08030                                           SEI_In, NextElm)) {
08031       fprintf (SUMA_STDERR, "Error %s: Failed to register command.\n", FuncName);
08032    }
08033    
08034    if (!SUMA_Engine (&list)) {
08035       fprintf(SUMA_STDERR, "Error %s: SUMA_Engine call failed.\n", FuncName);
08036    }
08037 
08038    SUMA_RETURNe;
08039 }
08040 
08041 void SUMA_DrawROI_NewLabel (void *data)
08042 {
08043    static char FuncName[]={"SUMA_DrawROI_NewLabel"};
08044    SUMA_DRAWN_ROI *DrawnROI=NULL;
08045    SUMA_ARROW_TEXT_FIELD * AF=NULL;
08046    void *n=NULL;
08047    static int ErrCnt=0;
08048    SUMA_Boolean Shaded = YUP;
08049    SUMA_Boolean LocalHead = NOPE;
08050    
08051    SUMA_ENTRY;
08052    
08053    AF = (SUMA_ARROW_TEXT_FIELD *)data;
08054    DrawnROI = SUMAg_CF->X->DrawROI->curDrawnROI;
08055    if (!DrawnROI) {
08056       SUMA_LH("Null DrawnROI");
08057       SUMA_RETURNe;
08058    }
08059    
08060    XtVaGetValues (AF->textfield, XmNvalue, &n, NULL);
08061    
08062    if (!strcmp((char *)n, DrawnROI->Label)) {
08063       SUMA_LH("No change");
08064       SUMA_LH((char *)n);
08065       SUMA_LH(DrawnROI->Label);
08066       SUMA_RETURNe;
08067    }
08068    
08069    if (DrawnROI->DrawStatus != SUMA_ROI_Finished) {
08070       SUMA_LH("unFinished");
08071       
08072       if (DrawnROI->Label) {
08073          if (LocalHead) fprintf (SUMA_STDERR, "%s: Changing ROI label from %s to %s\n", FuncName, DrawnROI->Label, (char *)n);         
08074          DrawnROI->Label = (char *)SUMA_realloc(DrawnROI->Label, sizeof(char)*(strlen((char *)n)+1));
08075       }  else {
08076          if (LocalHead) fprintf (SUMA_STDERR, "%s: Setting ROI label to %s\n", FuncName, (char *)n);
08077          DrawnROI->Label = (char *)SUMA_malloc(sizeof(char) * (strlen((char *)n)+1));
08078       }
08079       DrawnROI->Label = strcpy(DrawnROI->Label, (char *)n);   
08080       ErrCnt = 0;
08081       
08082       
08083       SUMA_IS_DRAW_ROI_SWITCH_ROI_SHADED(Shaded);
08084       if (!Shaded) {
08085          if (LocalHead) fprintf (SUMA_STDERR, "%s: updating switch ROI window ...\n", FuncName);
08086          SUMA_cb_DrawROI_SwitchROI(NULL, (XtPointer) SUMAg_CF->X->DrawROI->SwitchROIlst, NULL);
08087       }
08088    } else {
08089       SUMA_LH("Finished");
08090       if (!ErrCnt) SUMA_SLP_Err("ROI maked as finished.\nNew label cannot be applied.");
08091       ++ErrCnt;
08092       SUMA_SET_TEXT_FIELD(SUMAg_CF->X->DrawROI->ROIlbl->textfield, DrawnROI->Label);
08093    }
08094    
08095    SUMA_RETURNe;
08096 }
08097 
08098 void SUMA_WidgetResize (Widget New, int width, int height)
08099 {
08100    static char FuncName[]={"SUMA_WidgetResize"};
08101    
08102    SUMA_ENTRY;
08103    
08104    XtVaSetValues (New,
08105       XmNwidth, width,
08106       XmNheight, height,
08107       NULL);
08108    SUMA_RETURNe;
08109 }
08110 
08111 
08112 
08113 
08114 
08115 
08116 
08117 
08118 void SUMA_PositionWindowRelative (Widget New, Widget Ref, SUMA_WINDOW_POSITION Loc)
08119 {
08120    static char FuncName[]={"SUMA_PositionWindowRelative"};
08121    Position RefX, RefY, NewX, NewY, Dx=5;
08122    Dimension RefW, RefH, ScrW, ScrH, NewW, NewH;
08123    SUMA_Boolean LocalHead=NOPE;
08124    
08125    SUMA_ENTRY;
08126    
08127    if (!New) { SUMA_RETURNe; }
08128    
08129    ScrW = WidthOfScreen (XtScreen(New));
08130    ScrH = HeightOfScreen (XtScreen(New));
08131    
08132    SUMA_LH("Getting New Positions");
08133    XtVaGetValues (New,           
08134          XmNwidth, &NewW,
08135          XmNheight, &NewH,
08136          XmNx, &NewX,
08137          XmNy, &NewY,
08138          NULL);
08139 
08140    if (Ref) { 
08141       SUMA_LH("Getting Ref Positions");
08142       XtVaGetValues (Ref,
08143          XmNwidth, &RefW,
08144          XmNheight, &RefH,
08145          XmNx, &RefX,
08146          XmNy, &RefY,
08147          NULL);
08148    } else {
08149       if (LocalHead) fprintf(SUMA_STDERR, "%s: NULL Ref.\n", FuncName);
08150       RefX = 10;
08151       RefY = 10;
08152       RefW = 0;
08153       RefH = 0;
08154    }
08155    
08156    switch (Loc) {
08157       case SWP_BOTTOM_RIGHT_CORNER:
08158          NewX = RefW + RefX;
08159          NewY = RefH + RefY;
08160          break; 
08161       case SWP_TOP_RIGHT:
08162          NewX = RefW + RefX + Dx;
08163          NewY = RefY;
08164          break;
08165       case SWP_TOP_LEFT:
08166          NewX = RefW + Dx;
08167          NewY = RefY;
08168          break;
08169       case SWP_POINTER:
08170          {
08171             Window root, child, wind;
08172             int root_x, root_y, win_x, win_y;
08173             unsigned int keys_buttons;
08174             SUMA_LH("Pointer Query 1");
08175             if (!XtIsRealized(New)) {
08176                SUMA_LH("Need new wind");
08177                if (!XtIsRealized(SUMAg_SVv[0].X->GLXAREA)) {
08178                   SUMA_SL_Err("Nothing to work with here!");
08179                   SUMA_RETURNe;
08180                }
08181                wind = XtWindow(SUMAg_SVv[0].X->GLXAREA);
08182             } else {
08183                wind = XtWindow(New);
08184             }
08185             XQueryPointer(XtDisplay(New), wind, &root, &child, &root_x, &root_y, &win_x, &win_y, &keys_buttons);
08186             NewX = root_x;
08187             NewY = root_y;
08188          }
08189          break;
08190       case SWP_POINTER_OFF:
08191          {
08192             Window root, child, wind;
08193             int root_x, root_y, win_x, win_y;
08194             unsigned int keys_buttons;
08195             SUMA_LH("Pointer Query 2");
08196             if (!XtIsRealized(New)) {
08197                SUMA_LH("Need new wind");
08198                if (!XtIsRealized(SUMAg_SVv[0].X->GLXAREA)) {
08199                   SUMA_SL_Err("Nothing to work with here!");
08200                   SUMA_RETURNe;
08201                }
08202                wind = XtWindow(SUMAg_SVv[0].X->GLXAREA);
08203             } else {
08204                wind = XtWindow(New);
08205             }
08206             XQueryPointer(XtDisplay(New), wind, &root, &child, &root_x, &root_y, &win_x, &win_y, &keys_buttons);
08207             NewX = root_x - (int)NewW/2;
08208             NewY = root_y - (int)NewH + Dx;
08209          }
08210          break;
08211             
08212       default:
08213          fprintf (SUMA_STDERR, "Error %s: Option not known.\n", FuncName);
08214          SUMA_RETURNe;
08215          break;
08216    }
08217 
08218    
08219    if (NewX >= ScrW || NewX < 0) NewX = 50;
08220    if (NewY >= ScrH || NewY < 0) NewY = 50;
08221    
08222    if (LocalHead) fprintf (SUMA_STDERR, "%s: Positioning window at %d %d\n", FuncName, NewX, NewY);
08223    XtVaSetValues (New,
08224       XmNx, NewX,
08225       XmNy, NewY,
08226       NULL);
08227       
08228    SUMA_RETURNe;
08229 }
08230 
08231 
08232 
08233 
08234 
08235 
08236 
08237 
08238 
08239 
08240 
08241  
08242 
08243 
08244 
08245 
08246 
08247 
08248 
08249 
08250 
08251 
08252 
08253 
08254 
08255 
08256 
08257 
08258 
08259 
08260 
08261 
08262 SUMA_PROMPT_DIALOG_STRUCT *SUMA_CreatePromptDialogStruct (SUMA_PROMPT_MODE Mode, char *TextFieldLabel, 
08263                                                          char *init_selection, 
08264                                                          Widget daddy, SUMA_Boolean preserve,
08265                                                          SUMA_PROMPT_BUTTONS Return_button,
08266                                                          void(*SelectCallback)(char *selection, void *data), void *SelectData,
08267                                                          void(*CancelCallback)(void *data), void *CancelData,
08268                                                          void(*HelpCallback)(void *data), void *HelpData,
08269                                                          int(*VerifyFunction)(char *selection, void *data), void *VerifyData,
08270                                                          SUMA_PROMPT_DIALOG_STRUCT *oprmpt)
08271 {
08272    static char FuncName[]={"SUMA_CreatePromptDialogStruct"};
08273    SUMA_PROMPT_DIALOG_STRUCT *prmpt=NULL;
08274    SUMA_Boolean LocalHead = NOPE;
08275     
08276    SUMA_ENTRY;
08277    
08278    if (!oprmpt) {
08279       SUMA_LH ("New prompt structure");
08280       prmpt = (SUMA_PROMPT_DIALOG_STRUCT *)SUMA_malloc(sizeof(SUMA_PROMPT_DIALOG_STRUCT));
08281       if (!prmpt) {
08282          SUMA_SLP_Crit("Failed to allocate for prmpt");
08283          SUMA_RETURN(prmpt);
08284       }
08285       prmpt->daddy = daddy;
08286       prmpt->dialog = NULL;
08287       prmpt->pane = NULL;
08288       prmpt->text_w = NULL;
08289       prmpt->Mode = Mode;
08290    } else {
08291       SUMA_LH("Refitting old prompt structure.");
08292       prmpt = oprmpt;
08293       if (!preserve) SUMA_SLP_Warn("You should not be reusing\na prmpt structure along with\nthe Preserve flag on.");
08294       if (Mode != prmpt->Mode) SUMA_SLP_Warn("You cannot be reusing\na prmpt structure and change its mode.");
08295       if (prmpt->selection) SUMA_free(prmpt->selection);
08296       if (prmpt->label) SUMA_free(prmpt->label);
08297    }   
08298    
08299    prmpt->SelectCallback = SelectCallback;
08300    prmpt->SelectData = SelectData;
08301    prmpt->CancelCallback = CancelCallback;
08302    prmpt->CancelData = CancelData;
08303    prmpt->HelpCallback = HelpCallback;
08304    prmpt->HelpData = HelpData;
08305    prmpt->default_button = Return_button;
08306    prmpt->VerifyFunction = VerifyFunction;
08307    prmpt->VerifyData = VerifyData;
08308    
08309    if (init_selection) {
08310       prmpt->selection = (char *)SUMA_calloc(strlen(init_selection)+1, sizeof(char));
08311       prmpt->selection = strcpy(prmpt->selection, init_selection);
08312    }else {
08313       prmpt->selection = NULL;
08314    }
08315    if (TextFieldLabel) {
08316       prmpt->label = (char *)SUMA_calloc(strlen(TextFieldLabel)+1, sizeof(char));
08317       prmpt->label = strcpy(prmpt->label, TextFieldLabel);
08318    }else {
08319       prmpt->label = NULL;
08320    }
08321    prmpt->preserve = preserve;
08322    
08323    SUMA_RETURN(prmpt);
08324 }
08325 
08326 
08327 
08328 
08329 SUMA_PROMPT_DIALOG_STRUCT *SUMA_CreatePromptDialog(char *title_extension, SUMA_PROMPT_DIALOG_STRUCT *prmpt)
08330 {
08331    static char FuncName[]={"SUMA_CreatePromptDialog"};
08332    Widget rc;
08333    XmString string;
08334    SUMA_Boolean LocalHead = NOPE;
08335 
08336    SUMA_ENTRY;
08337 
08338    if (!prmpt->dialog) {
08339       SUMA_LH ("Creating new prompt dialog.");
08340       
08341 
08342 
08343 
08344       prmpt->dialog= XtVaCreatePopupShell ("dialog",
08345         xmDialogShellWidgetClass, prmpt->daddy,
08346         XmNtitle,  title_extension,     
08347         XmNdeleteResponse, XmDO_NOTHING,  
08348 
08349 
08350 
08351         NULL);
08352       
08353       
08354       XmAddWMProtocolCallback(
08355          prmpt->dialog,
08356          XmInternAtom( XtDisplay(prmpt->dialog) , "WM_DELETE_WINDOW" , False ) ,
08357          SUMA_PromptUnmap_cb, (XtPointer) prmpt) ;
08358       
08359       
08360       
08361 
08362 
08363 
08364       prmpt->pane = XtVaCreateWidget ("pane", xmPanedWindowWidgetClass, prmpt->dialog,
08365         XmNsashWidth,  1,
08366         XmNsashHeight, 1,
08367         NULL);
08368 
08369       
08370 
08371 
08372       rc = XtVaCreateWidget ("control_area", xmRowColumnWidgetClass, prmpt->pane, NULL);
08373       string = XmStringCreateLocalized (prmpt->label);
08374       XtVaCreateManagedWidget ("label", xmLabelWidgetClass, rc,
08375         XmNlabelString,    string,
08376         NULL);
08377       XmStringFree (string);
08378 
08379       prmpt->text_w = XtVaCreateManagedWidget ("text-field",
08380         xmTextFieldWidgetClass, rc, 
08381         NULL);
08382       
08383       if (prmpt->selection) {
08384          XtVaSetValues(prmpt->text_w, 
08385             XmNvalue, prmpt->selection,
08386             NULL);
08387       }
08388 
08389       
08390       XtAddCallback (prmpt->text_w, XmNactivateCallback, SUMA_PromptActivate_cb, (XtPointer)prmpt);
08391       
08392       
08393       XtManageChild (rc);
08394       
08395       
08396       
08397       if (!SUMA_CreatePromptActionArea (prmpt)){
08398          SUMA_SLP_Crit("Failed to create action area.");
08399          SUMA_RETURN(NULL);
08400       }
08401       
08402       
08403        XtManageChild (prmpt->actionarea);
08404        XtManageChild (prmpt->pane);
08405        XtPopup (prmpt->dialog, XtGrabNone);
08406    }else {
08407       SUMA_LH ("bringing back old prompt dialog.");
08408       XtManageChild (prmpt->dialog);
08409       
08410       
08411 
08412 
08413 
08414 
08415 
08416 
08417 
08418       XtMapWidget (prmpt->dialog);
08419    }
08420    
08421    SUMA_RETURN(prmpt);
08422 }
08423 
08424 
08425 
08426 
08427 #define TIGHTNESS 20
08428 const char * SUMA_PromptButtonLabel(SUMA_PROMPT_BUTTONS code)
08429 {
08430    static char FuncName[]={"SUMA_CommandString"};
08431    
08432    SUMA_ENTRY;
08433    
08434    switch (code) {
08435       case SUMA_OK_BUTTON:
08436          SUMA_RETURN("OK");
08437       case SUMA_CLEAR_BUTTON:
08438          SUMA_RETURN("Clear");
08439       case SUMA_CANCEL_BUTTON:
08440          SUMA_RETURN("Cancel");
08441       case SUMA_HELP_BUTTON:
08442          SUMA_RETURN("Help");
08443       case SUMA_APPLY_BUTTON:
08444          SUMA_RETURN("Apply");
08445       default:
08446          SUMA_RETURN("BAD BAD BAD.");
08447    }
08448    SUMA_RETURN("This cannot be.");
08449 }
08450 
08451 SUMA_Boolean SUMA_CreatePromptActionArea (SUMA_PROMPT_DIALOG_STRUCT *prmpt)
08452 {
08453    static char FuncName[]={"SUMA_CreatePromptActionArea"};
08454    int i, num_actions;
08455    Widget widget=NULL;
08456    SUMA_Boolean DoButt[SUMA_N_PROMPT_BUTTONS];
08457    SUMA_Boolean LocalHead = NOPE;
08458    
08459    SUMA_ENTRY;
08460 
08461    SUMA_LH ("Called");
08462    
08463    for (i=0; i < SUMA_N_PROMPT_BUTTONS; ++i) DoButt[i]=NOPE;
08464    
08465    
08466    num_actions = 0;
08467    switch (prmpt->Mode) {
08468       case SUMA_OK:
08469          DoButt[SUMA_OK_BUTTON] = YUP;
08470          num_actions = 1;
08471          break;
08472       case SUMA_OK_HELP:
08473          DoButt[SUMA_OK_BUTTON] = DoButt[SUMA_HELP_BUTTON] = YUP;
08474          num_actions = 2;
08475          break;
08476       case SUMA_OK_CANCEL:
08477          DoButt[SUMA_OK_BUTTON] = DoButt[SUMA_CANCEL_BUTTON] = YUP;
08478          num_actions = 2;
08479          break;
08480       case SUMA_OK_CANCEL_HELP:
08481          DoButt[SUMA_OK_BUTTON] = DoButt[SUMA_CANCEL_BUTTON] = 
08482          DoButt[SUMA_HELP_BUTTON] = YUP;
08483          num_actions = 3;
08484          break;               
08485       case SUMA_OK_CLEAR_CANCEL:
08486          DoButt[SUMA_OK_BUTTON] = DoButt[SUMA_CANCEL_BUTTON] = 
08487          DoButt[SUMA_CLEAR_BUTTON] = YUP;
08488          num_actions = 3;
08489          break;
08490       case SUMA_OK_CLEAR_CANCEL_HELP:
08491          DoButt[SUMA_OK_BUTTON] = DoButt[SUMA_CANCEL_BUTTON] = 
08492          DoButt[SUMA_CLEAR_BUTTON] = DoButt[SUMA_HELP_BUTTON] = YUP;
08493          num_actions = 4;
08494          break;
08495       case SUMA_OK_APPLY_CANCEL:
08496          DoButt[SUMA_OK_BUTTON] = DoButt[SUMA_CANCEL_BUTTON] = 
08497          DoButt[SUMA_APPLY_BUTTON] = YUP;
08498          num_actions = 3;
08499          break;
08500       case SUMA_OK_APPLY_CANCEL_HELP:
08501          DoButt[SUMA_OK_BUTTON] = DoButt[SUMA_CANCEL_BUTTON] = 
08502          DoButt[SUMA_APPLY_BUTTON] = DoButt[SUMA_HELP_BUTTON] = YUP;
08503          num_actions = 4;
08504          break;
08505       case SUMA_OK_APPLY_CLEAR_CANCEL:
08506          DoButt[SUMA_OK_BUTTON] = DoButt[SUMA_CANCEL_BUTTON] = 
08507          DoButt[SUMA_APPLY_BUTTON] = DoButt[SUMA_CLEAR_BUTTON] = YUP;
08508          num_actions = 4;
08509          break;
08510       case SUMA_OK_APPLY_CLEAR_CANCEL_HELP:
08511          DoButt[SUMA_OK_BUTTON] = DoButt[SUMA_CANCEL_BUTTON] = 
08512          DoButt[SUMA_APPLY_BUTTON] = DoButt[SUMA_CLEAR_BUTTON] = 
08513          DoButt[SUMA_HELP_BUTTON] = YUP;
08514          num_actions = 5;
08515          break;
08516       default:
08517          SUMA_SL_Err("Bad prompt mode.");
08518          SUMA_RETURN(NOPE);
08519          break;
08520    }
08521 
08522    prmpt->actionarea = XtVaCreateWidget ("action_area", xmFormWidgetClass, prmpt->pane,
08523         XmNfractionBase, TIGHTNESS*num_actions - 1,
08524         XmNleftOffset,   10,
08525         XmNrightOffset,  10,
08526         NULL);
08527         
08528    
08529    for (i=0; i< SUMA_N_PROMPT_BUTTONS; ++i) {
08530       if (DoButt[i]) {
08531          widget = XtVaCreateManagedWidget (SUMA_PromptButtonLabel(i),
08532             xmPushButtonWidgetClass, prmpt->actionarea,
08533             XmNleftAttachment,       i? XmATTACH_POSITION : XmATTACH_FORM,
08534             XmNleftPosition,         TIGHTNESS*i,
08535             XmNtopAttachment,        XmATTACH_FORM,
08536             XmNbottomAttachment,     XmATTACH_FORM,
08537             XmNrightAttachment,
08538                 i != num_actions - 1 ? XmATTACH_POSITION : XmATTACH_FORM,
08539             XmNrightPosition,        TIGHTNESS * i + (TIGHTNESS - 1),
08540             XmNshowAsDefault,        i == 0, 
08541             XmNdefaultButtonShadowThickness, 1, 
08542             NULL);      
08543       }
08544       if (i == prmpt->default_button) {
08545          
08546 
08547 
08548 
08549          Dimension height, h;
08550          XtVaGetValues (prmpt->actionarea, XmNmarginHeight, &h, NULL);
08551          XtVaGetValues (widget, XmNheight, &height, NULL);
08552          height += 2 * h;
08553          XtVaSetValues (prmpt->actionarea,
08554              XmNdefaultButton, widget,
08555              XmNpaneMaximum,   height,
08556              XmNpaneMinimum,   height,
08557              NULL);
08558       }
08559 
08560       
08561       switch (i) {
08562          case SUMA_OK_BUTTON:
08563             XtAddCallback (widget, XmNactivateCallback, SUMA_PromptOk_cb, (XtPointer)prmpt);
08564             break;
08565          case SUMA_CLEAR_BUTTON:
08566             XtAddCallback (widget, XmNactivateCallback, SUMA_PromptClear_cb, (XtPointer)prmpt);
08567             break;
08568          case SUMA_CANCEL_BUTTON:
08569             XtAddCallback (widget, XmNactivateCallback, SUMA_PromptCancel_cb, (XtPointer)prmpt);
08570             break;
08571          case SUMA_APPLY_BUTTON:
08572             XtAddCallback (widget, XmNactivateCallback, SUMA_PromptApply_cb, (XtPointer)prmpt);
08573             break;
08574          case SUMA_HELP_BUTTON:
08575             XtAddCallback (widget, XmNactivateCallback, SUMA_PromptHelp_cb, (XtPointer)prmpt);
08576             break;
08577          default:
08578             SUMA_SL_Err("Bad action area button label");
08579             break;
08580       }   
08581    }
08582    
08583    SUMA_RETURN(YUP);
08584 }
08585 
08586 
08587 
08588 
08589 
08590 
08591 
08592 
08593 void SUMA_PromptUnmap_cb (Widget w, XtPointer data, XtPointer calldata)
08594 {
08595    static char FuncName[]={"SUMA_PromptUnmap_cb"};
08596    SUMA_PROMPT_DIALOG_STRUCT *prmpt=NULL;
08597    SUMA_Boolean LocalHead = NOPE;
08598       
08599    SUMA_ENTRY;
08600    
08601    SUMA_LH("Called");
08602    
08603    prmpt = (SUMA_PROMPT_DIALOG_STRUCT *)data;
08604    
08605    
08606    if (!prmpt->preserve) {
08607       if (prmpt->dialog) {
08608          SUMA_LH("Destroying prompt");
08609          XtDestroyWidget(prmpt->dialog); 
08610       }else {
08611          SUMA_SL_Warn("prmpt->dialog is null.\nThis should not be.");
08612       }
08613       
08614       
08615       SUMA_FreePromptDialogStruct(prmpt);
08616       
08617    }else {
08618       SUMA_LH("Preserving prompt");
08619       XtUnmapWidget (prmpt->dialog); 
08620    }   
08621    
08622    SUMA_RETURNe;
08623 }
08624 
08625 
08626 
08627 
08628 
08629 
08630 void SUMA_PromptActivate_cb (Widget w, XtPointer data, XtPointer calldata)
08631 {
08632    static char FuncName[]={"SUMA_PromptActivate_cb"};
08633    XmAnyCallbackStruct *cbs = (XmAnyCallbackStruct *) calldata;
08634    Widget dflt;
08635    SUMA_PROMPT_DIALOG_STRUCT *prmpt=NULL;
08636    SUMA_Boolean LocalHead = NOPE;
08637       
08638    SUMA_ENTRY;
08639    
08640    SUMA_LH("Called");
08641    
08642    prmpt = (SUMA_PROMPT_DIALOG_STRUCT *)data;
08643    
08644    
08645     XtVaGetValues (prmpt->actionarea, XmNdefaultButton, &dflt, NULL);
08646     if (dflt) 
08647         
08648 
08649 
08650 
08651         XtCallActionProc (dflt, "ArmAndActivate", cbs->event, NULL, 0);
08652    
08653    
08654    SUMA_RETURNe;
08655 }
08656 
08657 
08658 
08659 
08660 
08661 
08662 void SUMA_PromptOk_cb (Widget w, XtPointer data, XtPointer calldata)
08663 {
08664    static char FuncName[]={"SUMA_PromptOk_cb"};
08665    SUMA_PROMPT_DIALOG_STRUCT *prmpt=NULL;
08666    SUMA_Boolean LocalHead = NOPE;
08667       
08668    SUMA_ENTRY;
08669    
08670    SUMA_LH("Called");
08671 
08672    prmpt = (SUMA_PROMPT_DIALOG_STRUCT *)data;
08673    
08674    
08675    SUMA_PromptApply_cb (w, data, calldata);
08676 
08677    
08678    SUMA_PromptUnmap_cb (w, data, calldata);
08679    
08680    SUMA_RETURNe;
08681 }
08682 
08683 
08684 
08685 
08686 
08687 
08688 void SUMA_PromptClear_cb (Widget w, XtPointer data, XtPointer calldata)
08689 {
08690    static char FuncName[]={"SUMA_PromptClear_cb"};
08691    SUMA_PROMPT_DIALOG_STRUCT *prmpt=NULL;
08692    SUMA_Boolean LocalHead = NOPE;
08693       
08694    SUMA_ENTRY;
08695    
08696    SUMA_LH("Called");
08697    
08698    prmpt = (SUMA_PROMPT_DIALOG_STRUCT *)data;
08699   
08700    XmTextFieldSetString (prmpt->text_w, "");
08701    
08702    SUMA_RETURNe;
08703 }
08704 
08705 
08706 
08707 
08708 
08709 
08710 void SUMA_PromptApply_cb (Widget w, XtPointer data, XtPointer calldata)
08711 {
08712    static char FuncName[]={"SUMA_PromptApply_cb"};
08713    SUMA_PROMPT_DIALOG_STRUCT *prmpt=NULL;
08714    char *text=NULL;
08715    SUMA_Boolean LocalHead = NOPE;
08716       
08717    SUMA_ENTRY;
08718    
08719    SUMA_LH("Called");
08720    
08721    prmpt = (SUMA_PROMPT_DIALOG_STRUCT *)data;
08722    
08723    text = XmTextFieldGetString (prmpt->text_w);
08724    
08725    if (prmpt->selection) SUMA_free(prmpt->selection);
08726    if (text[0]) { 
08727       prmpt->selection = (char *)SUMA_calloc(strlen(text)+1,sizeof(char));
08728       prmpt->selection = strcpy(prmpt->selection, text);
08729    }else {
08730       prmpt->selection = NULL;
08731    }
08732    XtFree (text);
08733    
08734    if (LocalHead) fprintf (SUMA_STDERR, "%s: Read %s\n", FuncName, prmpt->selection);
08735 
08736    
08737    if (prmpt->VerifyFunction) {
08738       if (!prmpt->VerifyFunction(prmpt->selection, prmpt->VerifyData)) {
08739          SUMA_SLP_Err("Gibberish! try again.\nSyntax error or wrong\nnumber/type of arguments.");
08740          SUMA_RETURNe;
08741       }
08742    }
08743    
08744    
08745    if (prmpt->SelectCallback) {
08746       prmpt->SelectCallback (prmpt->selection, prmpt->SelectData);
08747    }
08748    
08749    
08750    SUMA_RETURNe;
08751 }
08752 
08753 
08754 
08755 
08756 
08757 
08758 void SUMA_PromptCancel_cb (Widget w, XtPointer data, XtPointer calldata)
08759 {
08760    static char FuncName[]={"SUMA_PromptCancel_cb"};
08761    SUMA_PROMPT_DIALOG_STRUCT *prmpt=NULL;
08762    SUMA_Boolean LocalHead = NOPE;
08763       
08764    SUMA_ENTRY;
08765    
08766    SUMA_LH("Called");
08767    
08768    prmpt = (SUMA_PROMPT_DIALOG_STRUCT *)data;
08769    
08770    
08771    if (prmpt->CancelCallback) {
08772       prmpt->CancelCallback (prmpt->CancelData);
08773    }
08774    
08775    
08776    SUMA_PromptUnmap_cb (w, data, calldata);
08777 
08778    SUMA_RETURNe;
08779 }
08780 
08781 
08782 
08783 
08784 
08785 
08786 void SUMA_PromptHelp_cb (Widget w, XtPointer data, XtPointer calldata)
08787 {
08788    static char FuncName[]={"SUMA_PromptHelp_cb"};
08789    SUMA_PROMPT_DIALOG_STRUCT *prmpt=NULL;
08790    SUMA_Boolean LocalHead = NOPE;
08791       
08792    SUMA_ENTRY;
08793    
08794    SUMA_LH("Called");
08795    
08796    prmpt = (SUMA_PROMPT_DIALOG_STRUCT *)data;
08797    
08798    
08799    if (prmpt->HelpCallback) {
08800       prmpt->HelpCallback (prmpt->HelpData);
08801    }
08802    
08803    SUMA_RETURNe;
08804 }
08805 
08806 
08807 
08808 
08809 
08810 
08811 
08812 void SUMA_FreePromptDialogStruct(SUMA_PROMPT_DIALOG_STRUCT *prmpt)
08813 {
08814    static char FuncName[]={"SUMA_FreePromptDialogStruct"};
08815    SUMA_Boolean LocalHead = NOPE;
08816    
08817    SUMA_ENTRY;
08818    SUMA_LH("Called");
08819    
08820    if (!prmpt) SUMA_RETURNe;
08821    
08822    
08823    if (prmpt->selection) SUMA_free(prmpt->selection);
08824    if (prmpt->label) SUMA_free(prmpt->label); 
08825    SUMA_free(prmpt);
08826    
08827    SUMA_RETURNe;
08828 }
08829 
08830 
08831 
08832 
08833 
08834 
08835 
08836 
08837 
08838 
08839 
08840 
08841 
08842 
08843 
08844 
08845 
08846 
08847 
08848 
08849 
08850 
08851 
08852 
08853 
08854 
08855 
08856 
08857 
08858 
08859 SUMA_SELECTION_DIALOG_STRUCT *SUMA_CreateFileSelectionDialogStruct (Widget daddy, SUMA_FILE_SELECT_MODE Mode, SUMA_Boolean preserve,
08860                                                                   void (*SelectCallback)(char *filename, void *data), void *SelectData,
08861                                                                   void (*CancelCallback)(void *data), void *CancelData,
08862                                                                   char *FilePattern,
08863                                                                   SUMA_SELECTION_DIALOG_STRUCT *odlg)
08864 {
08865    static char FuncName[]={"SUMA_CreateFileSelectionDialogStruct"};
08866    SUMA_SELECTION_DIALOG_STRUCT * dlg = NULL;
08867    SUMA_Boolean LocalHead = NOPE;
08868    
08869    SUMA_ENTRY;
08870    
08871    if (!odlg) { 
08872       SUMA_LH("A new structure ");    
08873       dlg = (SUMA_SELECTION_DIALOG_STRUCT *)SUMA_malloc(sizeof(SUMA_SELECTION_DIALOG_STRUCT));
08874       if (!dlg) {
08875          fprintf (SUMA_STDERR, "Error %s: Failed to allocate for TextShell.\n", FuncName);
08876          SUMA_RETURN (NULL);
08877       }
08878       dlg->dlg_w = NULL;
08879       dlg->FilePattern = NULL;
08880    }else {
08881       SUMA_LH("Refitting old one. ");
08882       if (!preserve) 
08883          SUMA_SLP_Warn("You should not be reusing\na dlg structure along with\nthe Preserve flag on.");
08884       dlg = odlg;
08885       if (dlg->filename) {
08886          SUMA_LH("Freeing dlg->filename");
08887          SUMA_free(dlg->filename);
08888       }
08889    }
08890    
08891    dlg->daddy = daddy; 
08892    dlg->filename = NULL;
08893    dlg->Mode = Mode;
08894    dlg->SelectCallback = SelectCallback;
08895    dlg->SelectData = SelectData;
08896    dlg->CancelCallback = CancelCallback;
08897    dlg->CancelData = CancelData;
08898    dlg->preserve = preserve;
08899    
08900    if (FilePattern) {
08901       
08902       if (dlg->FilePattern) {
08903          SUMA_LH("Freeing dlg->FilePattern");
08904          SUMA_free(dlg->FilePattern);
08905       }   
08906       dlg->FilePattern = SUMA_copy_string (FilePattern);
08907    }
08908    
08909    SUMA_RETURN(dlg);
08910 }
08911 
08912 
08913 
08914 
08915 
08916 
08917                                                             
08918 SUMA_SELECTION_DIALOG_STRUCT *SUMA_CreateFileSelectionDialog (char *title_extension, SUMA_SELECTION_DIALOG_STRUCT **dlgp)
08919 {
08920    static char FuncName[]={"SUMA_CreateFileSelectionDialog"};
08921    SUMA_Boolean LocalHead = NOPE;
08922    SUMA_SELECTION_DIALOG_STRUCT *dlg = NULL;
08923    XmString button, title, pattern;
08924 
08925    SUMA_ENTRY;
08926    
08927    dlg = *dlgp;   
08928    if (!dlg->dlg_w) {
08929       SUMA_LH ("Creating new file selection window.");
08930       dlg->dlg_w = XmCreateFileSelectionDialog (dlg->daddy, "Files", NULL, 0);
08931       
08932       XtVaSetValues (dlg->dlg_w,
08933          XmNdeleteResponse, XmUNMAP,  
08934         NULL);
08935         
08936       
08937 
08938 
08939 
08940       
08941    } else { 
08942       SUMA_LH ("Updating");
08943       
08944       XtRemoveAllCallbacks (dlg->dlg_w, XmNcancelCallback);
08945       XtRemoveAllCallbacks (dlg->dlg_w, XmNokCallback);
08946       XtRemoveAllCallbacks (dlg->dlg_w, XmNunmapCallback);
08947    }
08948       
08949       if (dlg->FilePattern) {
08950          pattern = XmStringCreateLocalized (dlg->FilePattern);
08951          XtVaSetValues (dlg->dlg_w,
08952             XmNpattern, pattern,
08953             NULL);
08954          XmStringFree (pattern);
08955       }
08956       
08957       XtAddCallback (dlg->dlg_w, XmNcancelCallback, SUMA_FileSelection_popdown_cb, (XtPointer)dlg);
08958       XtAddCallback (dlg->dlg_w, XmNokCallback, SUMA_FileSelection_file_select_cb, (XtPointer)dlg);
08959       XtAddCallback (dlg->dlg_w, XmNunmapCallback, SUMA_FileSelection_Unmap_cb, (XtPointer)dlgp);
08960 
08961       if (dlg->Mode == SUMA_FILE_OPEN) {
08962          button = XmStringCreateLocalized ("Open");
08963          title = XmStringCreateLocalized (title_extension);
08964       } 
08965       else { 
08966         button = XmStringCreateLocalized ("Save");
08967         title = XmStringCreateLocalized (title_extension);
08968       }
08969       XtVaSetValues (dlg->dlg_w,
08970         XmNokLabelString, button,
08971         XmNdialogTitle,   title,
08972         NULL);
08973       
08974       XmStringFree (button);
08975       XmStringFree (title);
08976       
08977       XtManageChild (dlg->dlg_w);
08978       
08979       
08980       XMapRaised (XtDisplay (dlg->dlg_w), XtWindow (XtParent (dlg->dlg_w)));      
08981    
08982    SUMA_RETURN(dlg);
08983 }
08984 
08985 
08986 
08987 
08988 void SUMA_FileSelection_popdown_cb (Widget w, XtPointer client_data, XtPointer call_data)
08989 {
08990    static char FuncName[]={"SUMA_FileSelection_popdown_cb"};
08991    SUMA_SELECTION_DIALOG_STRUCT *dlg;
08992    SUMA_Boolean LocalHead = NOPE;
08993 
08994    SUMA_ENTRY;
08995    
08996    SUMA_LH("Called");
08997    
08998    dlg = (SUMA_SELECTION_DIALOG_STRUCT *)client_data;
08999    
09000 
09001    
09002    if (dlg->CancelCallback) {
09003       dlg->CancelCallback(dlg->CancelData);
09004    }
09005    
09006    XtUnmanageChild (dlg->dlg_w);
09007    
09008    SUMA_RETURNe;
09009 }
09010 
09011 
09012 
09013 
09014 
09015 
09016 
09017 void SUMA_FileSelection_Unmap_cb (Widget w, XtPointer client_data, XtPointer call_data)
09018 {
09019    static char FuncName[]={"SUMA_FileSelection_Unmap_cb"};
09020    SUMA_SELECTION_DIALOG_STRUCT *dlg;
09021    SUMA_SELECTION_DIALOG_STRUCT **dlgp;
09022    SUMA_Boolean LocalHead = NOPE;
09023 
09024    SUMA_ENTRY;
09025    
09026    SUMA_LH("Called");
09027    
09028    dlgp = (SUMA_SELECTION_DIALOG_STRUCT **)client_data;
09029    dlg = *dlgp;
09030    
09031    
09032    if (!dlg->preserve) {
09033       if (dlg->dlg_w) {
09034          SUMA_LH("Destroying dlg");
09035          XtDestroyWidget(dlg->dlg_w); 
09036       }else {
09037          SUMA_SL_Warn("dlg_w is null.\nThis should not be.");
09038       }
09039       
09040       
09041       SUMA_FreeFileSelectionDialogStruct(dlg);
09042       *dlgp = NULL;
09043       
09044    }
09045    
09046    SUMA_RETURNe;
09047 }
09048 
09049 
09050 
09051 
09052 
09053 void SUMA_FreeFileSelectionDialogStruct(SUMA_SELECTION_DIALOG_STRUCT *dlg)
09054 {
09055    static char FuncName[]={"SUMA_FreeFileSelectionDialogStruct"};
09056    SUMA_Boolean LocalHead = NOPE;
09057    
09058    SUMA_ENTRY;
09059    SUMA_LH("Called");
09060    
09061    
09062    if (!dlg) SUMA_RETURNe;
09063    
09064    
09065    if (dlg->filename) SUMA_free(dlg->filename);
09066    if (dlg->FilePattern) SUMA_free(dlg->FilePattern);
09067    SUMA_free(dlg);
09068    
09069    SUMA_RETURNe;
09070 }
09071 
09072 
09073 
09074 
09075 void SUMA_FileSelection_file_select_cb(Widget dialog, XtPointer client_data, XtPointer call_data)
09076 {
09077    static char FuncName[]={"SUMA_FileSelection_file_select_cb"};
09078    char buf[256], *filename;
09079    struct stat statb;
09080    FILE *fp=NULL;
09081    SUMA_SELECTION_DIALOG_STRUCT *dlg;
09082    XmFileSelectionBoxCallbackStruct *cbs =
09083      (XmFileSelectionBoxCallbackStruct *) call_data;
09084    SUMA_Boolean LocalHead = NOPE;
09085 
09086    SUMA_ENTRY;
09087 
09088    SUMA_LH("Called");
09089    
09090    dlg = (SUMA_SELECTION_DIALOG_STRUCT *)client_data;
09091 
09092    
09093    if (dlg->filename) {
09094       SUMA_free(dlg->filename); 
09095       dlg->filename = NULL;
09096    }
09097 
09098    if (!XmStringGetLtoR (cbs->value, XmFONTLIST_DEFAULT_TAG, &filename))
09099       SUMA_RETURNe; 
09100 
09101    if (filename[0] == '\0') {
09102       XtFree (filename);
09103       XBell (XtDisplay (dlg->daddy), 50);
09104       SUMA_RETURNe; 
09105    }
09106 
09107    if (dlg->Mode == SUMA_FILE_SAVE) {
09108       
09109 
09110       
09111       #if 0
09112       if (!(fp = fopen (filename, "w"))) {
09113          perror (filename);
09114          sprintf (buf, "Can't save to %s.", filename);
09115          SUMA_SLP_Err(buf);
09116          XtFree(filename);
09117          SUMA_RETURNe;
09118       }
09119       #endif
09120       
09121    } 
09122    else { 
09123      
09124 
09125      
09126      if (stat (filename, &statb) == -1 ||
09127              (statb.st_mode & S_IFMT) != S_IFREG ||
09128              !(fp = fopen (filename, "r"))) {
09129          perror (filename);
09130          sprintf (buf, "Can't read %s.", filename);
09131          SUMA_SLP_Err(buf);
09132          XtFree(filename);
09133          SUMA_RETURNe;
09134      }
09135    }
09136 
09137    
09138    if (filename) {
09139       dlg->filename = (char *)SUMA_calloc(strlen(filename)+1, sizeof(char));
09140       dlg->filename = strcpy(dlg->filename, filename);
09141    }
09142 
09143    
09144    XtFree (filename);
09145    if (fp) fclose (fp);
09146 
09147    
09148    if (dlg->SelectCallback) {
09149       dlg->SelectCallback(dlg->filename, dlg->SelectData);
09150    } 
09151 
09152    XtUnmanageChild (dlg->dlg_w); 
09153 
09154 
09155    SUMA_RETURNe;
09156 }
09157 
09158 
09159 void  SUMA_cb_UnmanageWidget(Widget w, XtPointer data, XtPointer client_data)
09160 {
09161    static char FuncName[]={"SUMA_cb_UnmanageWidget"};
09162    static int ncall=1;
09163    SUMA_SurfaceObject *SO = NULL;
09164    void **curSOp;
09165    int xx, yy;
09166    
09167    SUMA_ENTRY;
09168    
09169    curSOp = (void **)data;
09170    SO = (SUMA_SurfaceObject *)(*curSOp);
09171    
09172    if (ncall > 0) {
09173       if (XtIsManaged(SO->SurfCont->ColPlane_fr)) XtUnmanageChild(SO->SurfCont->ColPlane_fr);
09174       
09175 
09176       
09177       if (XtIsManaged(SO->SurfCont->DsetMap_fr)) {
09178          XtUnmanageChild(SO->SurfCont->DsetMap_fr);
09179          XtUnmanageChild(XtParent(SO->SurfCont->DsetMap_fr));
09180       }
09181    } else {
09182       
09183       if (strcmp(SO->SurfCont->curColPlane->cmapname, "explicit") != 0) { 
09184          if (!XtIsManaged(SO->SurfCont->DsetMap_fr)) {
09185             XtManageChild(XtParent(SO->SurfCont->DsetMap_fr));
09186             XtManageChild((Widget)SO->SurfCont->DsetMap_fr);
09187          }
09188       }
09189       XtManageChild((Widget)SO->SurfCont->ColPlane_fr);
09190       XMapRaised (XtDisplay(SO->SurfCont->ColPlane_fr), XtWindow(SO->SurfCont->TopLevelShell));
09191    }
09192    
09193 
09194    ncall *= -1;
09195    SUMA_RETURNe;
09196 }
09197 
09198 
09199 
09200 
09201 
09202 
09203 
09204 void SUMA_cb_ColPlane_Load(Widget w, XtPointer data, XtPointer client_data)
09205 {
09206    static char FuncName[]={"SUMA_cb_ColPlane_Load"};
09207    SUMA_LIST_WIDGET *LW=NULL;
09208    SUMA_SurfaceObject *SO=NULL;
09209    DList *list = NULL;
09210    SUMA_EngineData *ED = NULL;
09211    DListElmt *NextElm = NULL;
09212    SUMA_Boolean LocalHead = NOPE;
09213     
09214    SUMA_ENTRY;
09215    
09216    SUMA_LH("Called");
09217    
09218    SO = (SUMA_SurfaceObject *)data;
09219    
09220    if (!list) list = SUMA_CreateList();
09221    ED = SUMA_InitializeEngineListData (SE_OpenColFileSelection);
09222    if (!(NextElm = SUMA_RegisterEngineListCommand (  list, ED,
09223                                           SEF_vp, (void *)data,
09224                                           SES_Suma, NULL, NOPE,
09225                                           SEI_Head, NULL))) {
09226       fprintf (SUMA_STDERR, "Error %s: Failed to register command.\n", FuncName);
09227    }
09228    if (!SUMA_RegisterEngineListCommand (  list, ED,
09229                                           SEF_ip, (int *)w,
09230                                           SES_Suma, NULL, NOPE,
09231                                           SEI_In, NextElm)) {
09232       fprintf (SUMA_STDERR, "Error %s: Failed to register command.\n", FuncName);
09233    }
09234    
09235    if (!SUMA_Engine (&list)) {
09236       fprintf(SUMA_STDERR, "Error %s: SUMA_Engine call failed.\n", FuncName);
09237    }
09238    
09239    SUMA_RETURNe;
09240 }
09241 
09242 
09243 
09244 
09245 
09246 
09247 void SUMA_cb_Dset_Load(Widget w, XtPointer data, XtPointer client_data)
09248 {
09249    static char FuncName[]={"SUMA_cb_Dset_Load"};
09250    SUMA_LIST_WIDGET *LW=NULL;
09251    SUMA_SurfaceObject *SO=NULL;
09252    DList *list = NULL;
09253    SUMA_EngineData *ED = NULL;
09254    DListElmt *NextElm = NULL;
09255    SUMA_Boolean LocalHead = NOPE;
09256     
09257    SUMA_ENTRY;
09258    
09259    SUMA_LH("Called");
09260    
09261    SO = (SUMA_SurfaceObject *)data;
09262    
09263    if (!list) list = SUMA_CreateList();
09264    ED = SUMA_InitializeEngineListData (SE_OpenDsetFileSelection);
09265    if (!(NextElm = SUMA_RegisterEngineListCommand (  list, ED,
09266                                           SEF_vp, (void *)data,
09267                                           SES_Suma, NULL, NOPE,
09268                                           SEI_Head, NULL))) {
09269       fprintf (SUMA_STDERR, "Error %s: Failed to register command.\n", FuncName);
09270    }
09271    if (!SUMA_RegisterEngineListCommand (  list, ED,
09272                                           SEF_ip, (int *)w,
09273                                           SES_Suma, NULL, NOPE,
09274                                           SEI_In, NextElm)) {
09275       fprintf (SUMA_STDERR, "Error %s: Failed to register command.\n", FuncName);
09276    }
09277    
09278    if (!SUMA_Engine (&list)) {
09279       fprintf(SUMA_STDERR, "Error %s: SUMA_Engine call failed.\n", FuncName);
09280    }
09281    
09282    SUMA_RETURNe;
09283 }
09284 
09285 
09286 
09287 
09288 
09289 
09290 void SUMA_cb_ColPlane_Delete(Widget w, XtPointer data, XtPointer client_data)
09291 {
09292    static char FuncName[]={"SUMA_cb_ColPlane_Delete"};
09293    SUMA_LIST_WIDGET *LW=NULL;
09294    SUMA_SurfaceObject *SO=NULL;
09295    SUMA_Boolean LocalHead = NOPE;
09296       
09297    SUMA_ENTRY;
09298    
09299    SUMA_LH("Called");
09300    SUMA_RETURNe;
09301    
09302    #if 0
09303    SO = (SUMA_SurfaceObject *)data;
09304    
09305    LW is not set yet ...
09306    
09307    
09308    if (!LW->isShaded) {
09309       if (LocalHead) fprintf (SUMA_STDERR, "%s: Closing switch Color plane window ...\n", FuncName);
09310       SUMA_cb_CloseSwitchColPlane( w,  (XtPointer)SO->SurfCont->SwitchDsetlst,  client_data);
09311    }  
09312    #endif       
09313    SUMA_RETURNe;
09314 }
09315 
09316 
09317 
09318 
09319 
09320 
09321 int SUMA_AskUser_File_replace(Widget parent, char *question, int default_ans)
09322 {
09323     static char FuncName[]={"SUMA_AskUser_File_replace"};
09324     static Widget dialog; 
09325     Widget YesWid, NoWid, HelpWid;
09326     XmString text, yes, no;
09327     static int answer;
09328 
09329    SUMA_ENTRY;
09330 
09331    if (!dialog) {
09332      dialog = XmCreateQuestionDialog (parent, "dialog", NULL, 0);
09333      XtVaSetValues (dialog,
09334          XmNdialogStyle,        XmDIALOG_FULL_APPLICATION_MODAL,
09335          NULL);
09336      XtSetSensitive (
09337          XmMessageBoxGetChild (dialog, XmDIALOG_HELP_BUTTON),
09338          False);
09339      XtAddCallback (dialog, XmNokCallback, SUMA_response, &answer);
09340      XtAddCallback (dialog, XmNcancelCallback, SUMA_response, &answer);
09341     
09342     {
09343        XmString NewButt;
09344        Widget NewButt_button = NULL;
09345       
09346        NewButt= XmStringCreateLocalized ("Yes All");
09347        NewButt_button = XtVaCreateManagedWidget("Yes All", 
09348          xmPushButtonWidgetClass, dialog,
09349          XmNlabelString, NewButt,
09350          NULL);
09351        XtVaSetValues(NewButt_button, XmNuserData, SUMA_YES_ALL, NULL);
09352        XtAddCallback (NewButt_button, XmNactivateCallback, SUMA_response, &answer);
09353        XmStringFree (NewButt);
09354        
09355 
09356        NewButt= XmStringCreateLocalized ("No");
09357        NewButt_button = XtVaCreateManagedWidget("No", 
09358          xmPushButtonWidgetClass, dialog,
09359          XmNlabelString, NewButt,
09360          NULL);
09361        XtVaSetValues(NewButt_button, XmNuserData, SUMA_NO, NULL);
09362        XtAddCallback (NewButt_button, XmNactivateCallback, SUMA_response, &answer);
09363        XmStringFree (NewButt);
09364           
09365     }
09366 
09367     }
09368    answer = SUMA_NO_ANSWER;
09369    text = XmStringCreateLocalized (question);
09370    yes = XmStringCreateLocalized ("Yes");
09371    no = XmStringCreateLocalized ("No All");
09372    XtVaSetValues (dialog,
09373      XmNmessageString,      text,
09374      XmNokLabelString,      yes,
09375      XmNcancelLabelString,  no,
09376      XmNdefaultButtonType,  default_ans == SUMA_YES ?
09377          XmDIALOG_OK_BUTTON : XmDIALOG_CANCEL_BUTTON,
09378      NULL);
09379    XmStringFree (text);
09380    XmStringFree (yes);
09381    XmStringFree (no);
09382 
09383    
09384    YesWid = XmMessageBoxGetChild(dialog, XmDIALOG_OK_BUTTON);
09385    XtVaSetValues(YesWid, XmNuserData, SUMA_YES, NULL);
09386    NoWid = XmMessageBoxGetChild(dialog, XmDIALOG_CANCEL_BUTTON);
09387    XtVaSetValues(NoWid, XmNuserData, SUMA_NO_ALL, NULL);
09388    HelpWid = XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON);
09389    XtVaSetValues(HelpWid, XmNuserData, SUMA_HELP, NULL);
09390 
09391    
09392    XtUnmanageChild(HelpWid);
09393    
09394    XtManageChild (dialog);
09395    XtPopup (XtParent (dialog), XtGrabNone);
09396 
09397    while (answer == SUMA_NO_ANSWER)
09398      XtAppProcessEvent (SUMAg_CF->X->App, XtIMAll);
09399 
09400    XtPopdown (XtParent (dialog));
09401    
09402 
09403 
09404    XSync (XtDisplay (dialog), 0);
09405    XmUpdateDisplay (parent);
09406 
09407    SUMA_RETURN(answer);
09408 }
09409 
09410 
09411 
09412 
09413 
09414 
09415 
09416 
09417 
09418 int SUMA_ForceUser_YesNo(Widget parent, char *question, int default_ans, SUMA_WINDOW_POSITION pos)
09419 {
09420     static char FuncName[]={"SUMA_ForceUser_YesNo"};
09421     static Widget dialog; 
09422     Widget YesWid, NoWid, HelpWid;
09423     XmString text, yes, no;
09424     static int answer;
09425 
09426    SUMA_ENTRY;
09427 
09428    if (!dialog) {
09429      dialog = XmCreateQuestionDialog (parent, "dialog", NULL, 0);
09430      XtVaSetValues (dialog,
09431          XmNdialogStyle,        XmDIALOG_FULL_APPLICATION_MODAL,
09432          NULL);
09433      XtSetSensitive (
09434          XmMessageBoxGetChild (dialog, XmDIALOG_HELP_BUTTON),
09435          False);
09436      XtAddCallback (dialog, XmNokCallback, SUMA_response, &answer);
09437      XtAddCallback (dialog, XmNcancelCallback, SUMA_response, &answer);
09438 
09439     }
09440    answer = SUMA_NO_ANSWER;
09441    text = XmStringCreateLocalized (question);
09442    yes = XmStringCreateLocalized ("Yes");
09443    no = XmStringCreateLocalized ("No");
09444    XtVaSetValues (dialog,
09445      XmNmessageString,      text,
09446      XmNokLabelString,      yes,
09447      XmNcancelLabelString,  no,
09448      XmNdefaultButtonType,  default_ans == SUMA_YES ?
09449          XmDIALOG_OK_BUTTON : XmDIALOG_CANCEL_BUTTON,
09450      NULL);
09451    XmStringFree (text);
09452    XmStringFree (yes);
09453    XmStringFree (no);
09454 
09455    
09456    YesWid = XmMessageBoxGetChild(dialog, XmDIALOG_OK_BUTTON);
09457    XtVaSetValues(YesWid, XmNuserData, SUMA_YES, NULL);
09458    NoWid = XmMessageBoxGetChild(dialog, XmDIALOG_CANCEL_BUTTON);
09459    XtVaSetValues(NoWid, XmNuserData, SUMA_NO_ALL, NULL);
09460    HelpWid = XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON);
09461    XtVaSetValues(HelpWid, XmNuserData, SUMA_HELP, NULL);
09462 
09463    
09464    XtUnmanageChild(HelpWid);
09465    
09466    
09467    XtManageChild (dialog);
09468    XtPopup (XtParent (dialog), XtGrabNone);
09469    
09470    if (pos != SWP_DONT_CARE) SUMA_PositionWindowRelative(dialog, parent, pos);
09471    
09472    while (answer == SUMA_NO_ANSWER)
09473      XtAppProcessEvent (SUMAg_CF->X->App, XtIMAll);
09474 
09475    XtPopdown (XtParent (dialog));
09476    
09477 
09478 
09479    XSync (XtDisplay (dialog), 0);
09480    XmUpdateDisplay (parent);
09481 
09482    SUMA_RETURN(answer);
09483 }
09484 
09485  
09486 
09487 
09488 
09489 
09490 
09491 int AskUser(Widget parent, char *question, char *ans1, char *ans2, int default_ans)
09492 {
09493     static Widget dialog; 
09494     XmString text, yes, no;
09495     static int answer;
09496 
09497     if (!dialog) {
09498         dialog = XmCreateQuestionDialog (parent, "dialog", NULL, 0);
09499         XtVaSetValues (dialog,
09500             XmNdialogStyle,        XmDIALOG_FULL_APPLICATION_MODAL,
09501             NULL);
09502         XtSetSensitive (
09503             XmMessageBoxGetChild (dialog, XmDIALOG_HELP_BUTTON),
09504             False);
09505         XtAddCallback (dialog, XmNokCallback, SUMA_response, &answer);
09506         XtAddCallback (dialog, XmNcancelCallback, SUMA_response, &answer);
09507        
09508        {
09509           
09510 
09511 
09512 
09513 
09514 
09515           XmString All = XmStringCreateLocalized ("All");
09516           Widget All_button = NULL;
09517 
09518           All_button = XtVaCreateManagedWidget("All", 
09519             xmPushButtonWidgetClass, dialog,
09520             XmNlabelString, All,
09521             NULL);
09522           XtVaSetValues(All_button, XmNuserData, SUMA_YES_ALL, NULL);
09523           XtAddCallback (All_button, XmNactivateCallback, SUMA_response, &answer);
09524           XmStringFree (All);   
09525        }
09526 
09527     }
09528     answer = SUMA_NO_ANSWER;
09529     text = XmStringCreateLocalized (question);
09530     yes = XmStringCreateLocalized (ans1);
09531     no = XmStringCreateLocalized (ans2);
09532     XtVaSetValues (dialog,
09533         XmNmessageString,      text,
09534         XmNokLabelString,      yes,
09535         XmNcancelLabelString,  no,
09536         XmNdefaultButtonType,  default_ans == SUMA_YES ?
09537             XmDIALOG_OK_BUTTON : XmDIALOG_CANCEL_BUTTON,
09538         NULL);
09539     XmStringFree (text);
09540     XmStringFree (yes);
09541     XmStringFree (no);
09542         
09543     XtManageChild (dialog);
09544     XtPopup (XtParent (dialog), XtGrabNone);
09545 
09546     while (answer == SUMA_NO_ANSWER)
09547         XtAppProcessEvent (SUMAg_CF->X->App, XtIMAll);
09548 
09549     XtPopdown (XtParent (dialog));
09550     
09551 
09552 
09553     XSync (XtDisplay (dialog), 0);
09554     XmUpdateDisplay (parent);
09555 
09556     return answer;
09557 }
09558 
09559 
09560 
09561 
09562 
09563 
09564 
09565 
09566 
09567 
09568 
09569 
09570 void SUMA_response(Widget widget, XtPointer client_data, XtPointer call_data)
09571 {
09572    static char FuncName[]={"SUMA_response"};
09573    int *answer = (int *) client_data;
09574    int ud;
09575    Widget YesWid, NoWid, HelpWid;
09576    XmAnyCallbackStruct *cbs = (XmAnyCallbackStruct *) call_data;
09577    SUMA_Boolean LocalHead = NOPE;
09578    
09579    SUMA_ENTRY;
09580    
09581    switch (cbs->reason) {
09582    case XmCR_OK:
09583       YesWid = XmMessageBoxGetChild(widget, XmDIALOG_OK_BUTTON);
09584       XtVaGetValues(YesWid, XmNuserData, &ud, NULL);       
09585       *answer = ud;
09586       break;
09587    case XmCR_CANCEL:
09588       NoWid = XmMessageBoxGetChild(widget, XmDIALOG_CANCEL_BUTTON);
09589       XtVaGetValues(NoWid, XmNuserData, &ud, NULL);      
09590       *answer = ud;
09591       break;
09592    case XmCR_HELP:
09593       HelpWid = XmMessageBoxGetChild(widget, XmDIALOG_HELP_BUTTON);
09594       XtVaGetValues(HelpWid, XmNuserData, &ud, NULL);      
09595       *answer = ud;
09596       break;
09597    case XmCR_ACTIVATE:
09598       XtVaGetValues(widget, XmNuserData, &ud, NULL); 
09599       *answer = ud;
09600       break;
09601    default:
09602       *answer = -1;
09603       break;
09604    }
09605    
09606    if (LocalHead) fprintf (SUMA_STDERR,"%s: Answer %d\n", FuncName, *answer); 
09607    SUMA_RETURNe;        
09608 }
09609 
09610 
09611 
09612 
09613 
09614 
09615 
09616 void SUMA_ShowAllVisuals (void) 
09617 {
09618    static char FuncName[]={"SUMA_ShowAllVisuals"};
09619    Display *dpy;
09620    XVisualInfo match, *visualList, *vi, *visualToTry;
09621    int errorBase, eventBase, major, minor, found, glxcapable;
09622    Widget TopLevel;
09623    XtAppContext App;
09624    char *vargv[1]={ "[A] SUMA" };
09625    int cargc = 1;
09626 
09627 
09628    
09629    SUMA_ENTRY;
09630 
09631    dpy = XOpenDisplay(NULL);
09632    if (!dpy) {
09633       fprintf(SUMA_STDERR, "Error %s: Could not connect to %s.\n", FuncName, XDisplayName(NULL));
09634       SUMA_RETURNe;
09635    }
09636    if (glXQueryExtension(dpy, &errorBase, &eventBase) == False) {
09637       fprintf(SUMA_STDERR, "Error %s: OpenGL not supported by X server.\n" ,FuncName);
09638       SUMA_RETURNe;
09639    }
09640 
09641    glXQueryVersion(dpy, &major, &minor);
09642    fprintf(SUMA_STDERR, "display: %s\n", XDisplayName(NULL));
09643    fprintf(SUMA_STDERR, "using GLX version: %d.%d\n\n", major, minor);
09644 
09645    match.screen = DefaultScreen(dpy);
09646    visualList = XGetVisualInfo(dpy, VisualScreenMask, &match, &found);
09647    
09648    visualToTry = NULL;
09649    for(vi = visualList; found > 0; found--, vi++) {
09650       if (vi == visualList) glxcapable = SUMA_ShowVisual(dpy, vi, YUP);
09651       else glxcapable = SUMA_ShowVisual(dpy, vi, NOPE);
09652       
09653       if (glxcapable) visualToTry = vi;
09654    }
09655 
09656    if (visualToTry) {
09657       GLXContext context;
09658       Window window;
09659       Colormap colormap;
09660       XSetWindowAttributes swa;
09661 
09662       context = glXCreateContext(dpy, visualToTry, 0, GL_TRUE);
09663       colormap = XCreateColormap(dpy,
09664       RootWindow(dpy, visualToTry->screen),
09665       visualToTry->visual, AllocNone);
09666       swa.colormap = colormap;
09667       swa.border_pixel = 0;
09668       window = XCreateWindow(dpy, RootWindow(dpy, visualToTry->screen), 0, 0, 100, 100,
09669       0, visualToTry->depth, InputOutput, visualToTry->visual,
09670       CWBorderPixel | CWColormap, &swa);
09671       glXMakeCurrent(dpy, window, context);
09672       fprintf(SUMA_STDERR, "\n");
09673       fprintf(SUMA_STDERR, "OpenGL vendor string: %s\n", glGetString(GL_VENDOR));
09674       fprintf(SUMA_STDERR, "OpenGL renderer string: %s\n", glGetString(GL_RENDERER));
09675       fprintf(SUMA_STDERR, "OpenGL version string: %s\n", glGetString(GL_VERSION));
09676       if (glXIsDirect(dpy, context))
09677          fprintf(SUMA_STDERR, "direct rendering: supported\n");
09678    } else fprintf(SUMA_STDERR, "No GLX-capable visuals!\n");
09679    
09680    XFree(visualList);
09681 
09682    
09683    TopLevel = XtAppInitialize(&App, "SUMA", NULL, 0, &cargc, vargv,
09684                               SUMA_get_fallbackResources(), NULL, 0);
09685    dpy = XtDisplay(TopLevel);
09686 
09687    vi = glXChooseVisual(dpy, DefaultScreen(dpy), dblBuf);
09688    if (vi == NULL) {
09689       fprintf(stdout, "trying lame single buffer visual\n");
09690       XtAppWarning(App, "trying lame single buffer visual");
09691       vi = glXChooseVisual(dpy, DefaultScreen(dpy), snglBuf);
09692     if (vi == NULL) {
09693       XtAppError(App, "no good visual");
09694       }
09695    }
09696    fprintf (SUMA_STDERR,"************************************\n"); 
09697    fprintf (SUMA_STDERR,"%s: Visual chosen by SUMA:\n", FuncName);
09698    SUMA_ShowVisual(dpy, vi, YUP);
09699    if (vi->class != TrueColor) {
09700       fprintf (SUMA_STDERR,"%s: Visual is not TrueColor.\n", FuncName); 
09701       fprintf (SUMA_STDERR," SUMA NO LIKE.\n");
09702    }
09703    XtDestroyWidget(TopLevel);
09704    
09705    SUMA_RETURNe;
09706 }
09707 
09708 
09709 
09710 
09711 
09712 
09713 int SUMA_ShowVisual (Display *dpy, XVisualInfo *vi, SUMA_Boolean ShowHead)
09714 {
09715    static char FuncName[]={"SUMA_ShowVisual"};
09716    int glxCapable, bufferSize, level, renderType, doubleBuffer, stereo,
09717       auxBuffers, redSize, greenSize, blueSize, alphaSize, depthSize,
09718       stencilSize, acRedSize, acGreenSize, acBlueSize, acAlphaSize;
09719 
09720    SUMA_ENTRY;
09721    
09722    if (ShowHead) {
09723       fprintf(SUMA_STDERR, "\n");
09724       fprintf(SUMA_STDERR, "   visual     bf lv rg d st  r  g  b a   ax dp st accum buffs\n");
09725       fprintf(SUMA_STDERR, " id dep cl    sz l  ci b ro sz sz sz sz  bf th cl  r  g  b  a\n");
09726       fprintf(SUMA_STDERR, "-------------------------------------------------------------\n");
09727    }
09728    
09729    glXGetConfig(dpy, vi, GLX_USE_GL, &glxCapable);
09730    if (glxCapable) {
09731       fprintf(SUMA_STDERR, "0x%x %2d %s",(unsigned int)vi->visualid, vi->depth, SUMA_ClassOf(vi->class));
09732       glXGetConfig(dpy, vi, GLX_BUFFER_SIZE, &bufferSize);
09733       glXGetConfig(dpy, vi, GLX_LEVEL, &level);
09734       glXGetConfig(dpy, vi, GLX_RGBA, &renderType);
09735       glXGetConfig(dpy, vi, GLX_DOUBLEBUFFER, &doubleBuffer);
09736       glXGetConfig(dpy, vi, GLX_STEREO, &stereo);
09737       glXGetConfig(dpy, vi, GLX_AUX_BUFFERS, &auxBuffers);
09738       glXGetConfig(dpy, vi, GLX_RED_SIZE, &redSize);
09739       glXGetConfig(dpy, vi, GLX_GREEN_SIZE, &greenSize);
09740       glXGetConfig(dpy, vi, GLX_BLUE_SIZE, &blueSize);
09741       glXGetConfig(dpy, vi, GLX_ALPHA_SIZE, &alphaSize);
09742       glXGetConfig(dpy, vi, GLX_DEPTH_SIZE, &depthSize);
09743       glXGetConfig(dpy, vi, GLX_STENCIL_SIZE, &stencilSize);
09744       glXGetConfig(dpy, vi, GLX_ACCUM_RED_SIZE, &acRedSize);
09745       glXGetConfig(dpy, vi, GLX_ACCUM_GREEN_SIZE, &acGreenSize);
09746       glXGetConfig(dpy, vi, GLX_ACCUM_BLUE_SIZE, &acBlueSize);
09747       glXGetConfig(dpy, vi, GLX_ACCUM_ALPHA_SIZE, &acAlphaSize);
09748       fprintf(SUMA_STDERR, "    %2s %2s %1s  %1s  %1s ",
09749         SUMA_Format(bufferSize, 2), SUMA_Format(level, 2),
09750         renderType ? "r" : "c",
09751          doubleBuffer ? "y" : ".", 
09752          stereo ? "y" : ".");
09753       fprintf(SUMA_STDERR, "%2s %2s %2s %2s ",
09754          SUMA_Format(redSize, 2), SUMA_Format(greenSize, 2),
09755          SUMA_Format(blueSize, 2), SUMA_Format(alphaSize, 2));
09756       fprintf(SUMA_STDERR, "%2s %2s %2s %2s %2s %2s %2s",
09757         SUMA_Format(auxBuffers, 2), SUMA_Format(depthSize, 2), SUMA_Format(stencilSize, 2),
09758         SUMA_Format(acRedSize, 2), SUMA_Format(acGreenSize, 2),
09759         SUMA_Format(acBlueSize, 2), SUMA_Format(acAlphaSize, 2));
09760       fprintf(SUMA_STDERR, "\n");
09761    }
09762    
09763    SUMA_RETURN(glxCapable); 
09764 } 
09765 
09766 char * SUMA_ClassOf(int c)
09767 {
09768    static char FuncName[]={"SUMA_ClassOf"};
09769   
09770    SUMA_ENTRY;
09771 
09772    switch (c) {
09773       case StaticGray:   SUMA_RETURN("sg");
09774       case GrayScale:    SUMA_RETURN("gs");
09775       case StaticColor:  SUMA_RETURN("sc");
09776       case PseudoColor:  SUMA_RETURN("pc");
09777       case TrueColor:    SUMA_RETURN("tc");
09778       case DirectColor:  SUMA_RETURN("dc");
09779       default:           SUMA_RETURN("??");
09780    }
09781 }
09782 
09783 char * SUMA_Format(int n, int w)
09784 {
09785    static char FuncName[]={"SUMA_Format"};
09786    static char buffer[256];
09787    static int bufptr;
09788    char *buf;
09789 
09790    SUMA_ENTRY;
09791 
09792    if (bufptr >= sizeof(buffer) - w)
09793       bufptr = 0;
09794    
09795    buf = buffer + bufptr;
09796    
09797    if (n == 0)
09798       sprintf(buf, "%*s", w, ".");
09799    else
09800       sprintf(buf, "%*d", w, n);
09801    
09802    bufptr += w + 1;
09803 
09804    SUMA_RETURN(buf);
09805 }
09806 
09807 
09808 
09809 
09810 
09811 
09812 
09813 
09814 
09815 
09816 
09817 
09818