00001
00002
00003
00004
00005 #include "SUMA_suma.h"
00006
00007 #undef STAND_ALONE
00008
00009 #if defined SUMA_SHOW_CMAP_STAND_ALONE
00010 #define STAND_ALONE
00011 #endif
00012
00013 #ifdef STAND_ALONE
00014
00015 SUMA_SurfaceViewer *SUMAg_cSV;
00016 SUMA_SurfaceViewer *SUMAg_SVv;
00017
00018 int SUMAg_N_SVv = 0;
00019 SUMA_DO *SUMAg_DOv;
00020 int SUMAg_N_DOv = 0;
00021 SUMA_CommonFields *SUMAg_CF;
00022 #else
00023 extern SUMA_CommonFields *SUMAg_CF;
00024 extern SUMA_DO *SUMAg_DOv;
00025 extern SUMA_SurfaceViewer *SUMAg_SVv;
00026 extern int SUMAg_N_SVv;
00027 extern int SUMAg_N_DOv;
00028 #endif
00029
00030
00031
00032 #define SUMA_USE_WITHDRAW
00033
00034
00035
00036
00037
00038
00039 unsigned char *SUMA_read_ppm(char *fname, int *width, int *height, int verb)
00040 {
00041 static char FuncName[]={"SUMA_read_ppm"};
00042 char stmp[500];
00043 unsigned char *imar = NULL;
00044 byte * rgb , *cp=NULL;
00045 float alf = 0;
00046 MRI_IMAGE * im=NULL;
00047 int ir, ic, i1d, i1df, imx, i1d3, i1d4;
00048 SUMA_Boolean LocalHead = NOPE;
00049
00050 if (!fname) { if (verb) SUMA_SL_Err("NULL fname"); SUMA_RETURN(imar); }
00051 im = mri_read_ppm( fname ) ;
00052 if (!im) {
00053 if (verb) { snprintf(stmp, 500 * sizeof(char), "Failed to read %s", fname); SUMA_SL_Err(stmp); }
00054 SUMA_RETURN(imar);
00055 }
00056
00057 rgb = MRI_RGB_PTR(im) ;
00058 *height = im->ny ;
00059 *width = im->nx ;
00060 imx = im->ny * im->nx;
00061
00062 if (LocalHead) fprintf (SUMA_STDERR,"%s:\nNx (width) = %d, Ny (height) = %d\n", FuncName, im->nx, im->ny);
00063
00064 imar = (unsigned char *) SUMA_malloc(sizeof(unsigned char) * im->nx * im->ny * 4);
00065 if (!imar) {
00066 SUMA_SL_Crit("Failed to allocate.");
00067 mri_free(im) ;
00068 SUMA_RETURN(imar);
00069 }
00070
00071 for (ir = 0; ir < im->ny; ++ir) {
00072 for (ic = 0; ic < im->nx; ++ic) {
00073 i1d = ic + ir * im->nx;
00074 i1df = ic + (im->ny - ir - 1) * im->nx;
00075 i1d4 = 4 * i1d; i1d3 = 3*i1df;
00076 imar[i1d4] = (unsigned char)rgb[i1d3]; alf = (float)imar[i1d4]; ++i1d3; ++i1d4;
00077 imar[i1d4] = (unsigned char)rgb[i1d3]; alf += (float)imar[i1d4]; ++i1d3; ++i1d4;
00078 imar[i1d4] = (unsigned char)rgb[i1d3]; alf += (float)imar[i1d4]; ++i1d4;
00079 imar[i1d4] = (unsigned char)(alf/3.0);
00080 }
00081 }
00082
00083 mri_free(im) ; im = NULL;
00084
00085 SUMA_RETURN(imar);
00086 }
00087
00088 void SUMA_cmap_wid_graphicsInit (Widget w, XtPointer clientData, XtPointer call)
00089 {
00090 static char FuncName[]={"SUMA_cmap_wid_graphicsInit"};
00091 XVisualInfo *SUMAg_cVISINFO;
00092 SUMA_SurfaceObject *SO=NULL;
00093 SUMA_Boolean LocalHead = NOPE;
00094
00095 SUMA_ENTRY;
00096
00097 SUMA_LH("called");
00098
00099 SO = (SUMA_SurfaceObject *)clientData;
00100 if (!SO) { SUMA_SL_Err("NULL SO"); SUMA_RETURNe; }
00101
00102 XtVaGetValues(w, GLwNvisualInfo, &SUMAg_cVISINFO, NULL);
00103 SO->SurfCont->cmp_ren->cmap_context = glXCreateContext(XtDisplay(w), SUMAg_cVISINFO,
00104 0,
00105 True);
00106
00107
00108 if (!glXMakeCurrent(XtDisplay(w), XtWindow(w), SO->SurfCont->cmp_ren->cmap_context)) {
00109 fprintf (SUMA_STDERR, "Error %s: Failed in glXMakeCurrent.\n \tContinuing ...\n", FuncName);
00110 }
00111
00112
00113 SUMA_cmap_context_Init(SO);
00114
00115 SUMA_RETURNe;
00116 }
00117
00118
00119
00120
00121
00122
00123 void SUMA_cmap_context_Init(SUMA_SurfaceObject *SO)
00124 {
00125 static char FuncName[]={"SUMA_cmap_context_Init"};
00126 GLfloat mat_specular[] = { 0.0, 0.0, 0.0, 1.0};
00127 GLfloat mat_shininess[] = { 0 };
00128 GLfloat mat_ambient[] = { 0.0, 0.0, 0.0, 1.0};
00129 GLfloat mat_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
00130 GLfloat mat_emission[] = { SUMA_MAT_EMISSION_INIT };
00131 GLfloat clear_color[] = { 0.0, 0.0, 0.0, 0.0};
00132 GLfloat light0_color[] = { 1.0, 1.0, 1.0, 1.0};
00133 GLfloat lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
00134 GLfloat light0_position[] = {0.0, 0.0, -1.0, 0.0};
00135 GLfloat ViewFrom[]={0.0, 0.0, 300};
00136 GLfloat ViewCenter[]={0.0, 0.0, 0.0};
00137 GLfloat ViewCamUp[]={0.0, 1.0, 0.0};
00138 GLfloat CmapOrig[]={SUMA_CMAP_ORIGIN};
00139 GLfloat CmapTL[]={SUMA_CMAP_TOPLEFT};
00140 int i;
00141
00142 SUMA_ENTRY;
00143
00144 glClearColor (clear_color[0], clear_color[1], clear_color[2], clear_color[3]);
00145 glShadeModel (GL_SMOOTH);
00146
00147 SUMA_SET_GL_RENDER_MODE(SRM_Fill);
00148
00149
00150
00151 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
00152 glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
00153 glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
00154 glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
00155 glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
00156
00157
00158 glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
00159 glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_color);
00160 glLightfv(GL_LIGHT0, GL_SPECULAR, light0_color);
00161
00162
00163 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
00164
00165 glEnable(GL_LIGHTING);
00166 glEnable(GL_LIGHT0);
00167 glEnable(GL_DEPTH_TEST);
00168
00169
00170
00171 for (i=0; i<2; ++i) { ViewCenter[i] = (CmapTL[i] - CmapOrig[i]) / 2.0; }
00172 ViewFrom[0] = ViewCenter[0]; ViewFrom[1] = ViewCenter[1]; ViewFrom[2] = SUMA_CMAP_VIEW_FROM;
00173
00174 glMatrixMode(GL_MODELVIEW);
00175 glLoadIdentity();
00176 gluLookAt ( ViewFrom[0], ViewFrom[1], ViewFrom[2],
00177 ViewCenter[0], ViewCenter[1], ViewCenter[2],
00178 ViewCamUp[0], ViewCamUp[1], ViewCamUp[2] );
00179
00180
00181 SUMA_RETURNe;
00182
00183 }
00184
00185 void SUMA_DrawCmap(SUMA_COLOR_MAP *Cmap)
00186 {
00187 static char FuncName[]={"SUMA_DrawCmap"};
00188 float orig[3]={ SUMA_CMAP_ORIGIN };
00189 int i;
00190 float topright[3] = { SUMA_CMAP_TOPLEFT };
00191 SUMA_Boolean LocalHead = NOPE;
00192
00193 SUMA_ENTRY;
00194
00195 SUMA_LH("called");
00196
00197 if (!Cmap->SO) {
00198 SUMA_LH("Creating Cmap's SO");
00199 Cmap->SO = SUMA_Cmap_To_SO(Cmap, orig, topright, 0);
00200 if (!Cmap->SO) { SUMA_SL_Err("Failed to create SO"); }
00201 }
00202
00203
00204 glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
00205 glEnable(GL_COLOR_MATERIAL);
00206
00207
00208 glEnableClientState (GL_COLOR_ARRAY);
00209 glEnableClientState (GL_VERTEX_ARRAY);
00210 glEnableClientState (GL_NORMAL_ARRAY);
00211 glColorPointer (4, GL_FLOAT, 0, Cmap->SO->PermCol);
00212 glVertexPointer (3, GL_FLOAT, 0, Cmap->SO->glar_NodeList);
00213 glNormalPointer (GL_FLOAT, 0, Cmap->SO->glar_NodeNormList);
00214
00215 SUMA_SET_GL_RENDER_MODE(SRM_Fill);
00216 glDrawElements (GL_TRIANGLES, (GLsizei)Cmap->SO->N_FaceSet*3, GL_UNSIGNED_INT, Cmap->SO->glar_FaceSetList);
00217
00218
00219
00220
00221 #if 0
00222 {
00223 GLfloat *LineCol=NULL;
00224 LineCol = (GLfloat *)SUMA_calloc(Cmap->SO->N_Node*4, sizeof(GLfloat));
00225 for (i=0; i<Cmap->SO->N_Node; ++i) { LineCol[4*i] = LineCol[4*i+1] = LineCol[4*i+2] = 0.1; LineCol[4*i+3] = 1.0; }
00226 glColorPointer (4, GL_FLOAT, 0, LineCol);
00227 SUMA_SET_GL_RENDER_MODE(SRM_Line);
00228 glDrawElements (GL_TRIANGLES, (GLsizei)Cmap->SO->N_FaceSet*3, GL_UNSIGNED_INT, Cmap->SO->glar_FaceSetList);
00229 SUMA_free(LineCol); LineCol = NULL;
00230 }
00231 #endif
00232
00233 SUMA_RETURNe;
00234 }
00235
00236 void SUMA_cmap_wid_display(SUMA_SurfaceObject *SO)
00237 {
00238 static char FuncName[]={"SUMA_cmap_wid_display"};
00239 int i;
00240 GLfloat rotationMatrix[4][4];
00241 float currentQuat[]={0.0, 0.0, 0.0, 1.0};
00242 GLfloat clear_color[] = { 0.8, 0.8, 0.8, 0.0};
00243 GLfloat RotaCenter[]={0.0, 0.0, 0.0};
00244 SUMA_COLOR_MAP *Cmap = NULL;
00245 SUMA_Boolean LocalHead = NOPE;
00246
00247 SUMA_ENTRY;
00248
00249 SUMA_LH("in, lots of inefficiencies here, make sure you revisit");
00250
00251
00252 glClearColor (clear_color[0], clear_color[1],clear_color[2],clear_color[3]);
00253
00254 if (LocalHead) fprintf (SUMA_STDOUT,"%s: Building Rotation matrix ...\n", FuncName);
00255 SUMA_build_rotmatrix(rotationMatrix, currentQuat);
00256
00257 if (LocalHead) fprintf (SUMA_STDOUT,"%s: performing glClear ...\n", FuncName);
00258 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00259
00260
00261 if (LocalHead) fprintf (SUMA_STDOUT,"%s: Setting up matrix mode and perspective ...\nFOV=%f\n", FuncName, SUMA_CMAP_FOV_INITIAL);
00262 glMatrixMode (GL_PROJECTION);
00263 glLoadIdentity ();
00264 gluPerspective(SO->SurfCont->cmp_ren->FOV, (double)SUMA_CMAP_WIDTH/SUMA_CMAP_HEIGHT, SUMA_PERSPECTIVE_NEAR, SUMA_PERSPECTIVE_FAR);
00265
00266 glMatrixMode(GL_MODELVIEW);
00267 glPushMatrix();
00268 glTranslatef (SO->SurfCont->cmp_ren->translateVec[0], SO->SurfCont->cmp_ren->translateVec[1], SO->SurfCont->cmp_ren->translateVec[2] );
00269 if (0){
00270 SUMA_SL_Note("no need for shananigans\n"
00271 "But to illustrate ...\n");
00272 glTranslatef (RotaCenter[0], RotaCenter[1], RotaCenter[2]);
00273 glMultMatrixf(&rotationMatrix[0][0]);
00274 glTranslatef (-RotaCenter[0], -RotaCenter[1], -RotaCenter[2]);
00275 }
00276
00277
00278 if (SO->SurfCont->curColPlane) {
00279
00280 Cmap = SUMA_CmapOfPlane (SO->SurfCont->curColPlane );
00281 if (Cmap) SUMA_DrawCmap(Cmap);
00282 } else {
00283 SUMA_SL_Err("NULL SO->SurfCont->curColPlane");
00284 }
00285 glPopMatrix();
00286
00287 if (LocalHead) fprintf (SUMA_STDOUT,"%s: Flushing or swapping ...\n", FuncName);
00288
00289 if (SUMAg_SVv[0].X->DOUBLEBUFFER)
00290 glXSwapBuffers(XtDisplay(SO->SurfCont->cmp_ren->cmap_wid), XtWindow(SO->SurfCont->cmp_ren->cmap_wid));
00291 else
00292 glFlush();
00293
00294
00295 if (!glXIsDirect(XtDisplay(SO->SurfCont->cmp_ren->cmap_wid), SO->SurfCont->cmp_ren->cmap_context))
00296 glFinish();
00297
00298 SUMA_RETURNe;
00299 }
00300
00301 Boolean SUMA_cmap_wid_handleRedisplay(XtPointer clientData)
00302 {
00303 static char FuncName[]={"SUMA_cmap_wid_handleRedisplay"};
00304 SUMA_SurfaceObject *SO=NULL;
00305 SUMA_Boolean LocalHead = NOPE;
00306
00307 SUMA_ENTRY;
00308
00309 SUMA_LH("Called");
00310
00311 SO = (SUMA_SurfaceObject *)clientData;
00312 if (!SO) { SUMA_SL_Err("NULL SO"); SUMA_RETURN(NOPE); }
00313
00314 SUMA_LH("Making cmap_wid current");
00315 if (!glXMakeCurrent(XtDisplay(SO->SurfCont->cmp_ren->cmap_wid), XtWindow(SO->SurfCont->cmp_ren->cmap_wid), SO->SurfCont->cmp_ren->cmap_context)) {
00316 fprintf (SUMA_STDERR, "Error %s: Failed in glXMakeCurrent.\n \tContinuing ...\n", FuncName);
00317 }
00318
00319 SUMA_cmap_wid_display(SO);
00320 glFinish();
00321
00322
00323 SUMA_LH("Making sv's GLXAREA current");
00324 SUMA_SiSi_I_Insist();
00325
00326 SUMA_RETURN(YUP);
00327 }
00328
00329 void SUMA_cmap_wid_postRedisplay(Widget w, XtPointer clientData, XtPointer call)
00330 {
00331 static char FuncName[]={"SUMA_cmap_wid_postRedisplay"};
00332 static XtPointer elvis;
00333 int isv;
00334 SUMA_SurfaceObject *SO=NULL;
00335 SUMA_Boolean LocalHead = NOPE;
00336
00337 SUMA_ENTRY;
00338
00339 SUMA_LH("cold");
00340
00341 SO = (SUMA_SurfaceObject *)clientData;
00342 if (!SO) { SUMA_SL_Err("NULL SO"); SUMA_RETURNe; }
00343
00344 SUMA_register_workproc( SUMA_cmap_wid_handleRedisplay , (XtPointer)SO );
00345
00346 SUMA_RETURNe;
00347 }
00348
00349 void SUMA_cmap_wid_expose(Widget w, XtPointer clientData, XtPointer call)
00350 {
00351 static char FuncName[]={"SUMA_cmap_wid_expose"};
00352 SUMA_SurfaceObject *SO=NULL;
00353 SUMA_Boolean LocalHead = NOPE;
00354
00355 SUMA_ENTRY;
00356
00357 SUMA_LH("called");
00358 SO = (SUMA_SurfaceObject *)clientData;
00359 if (!SO) { SUMA_SL_Err("NULL SO"); SUMA_RETURNe; }
00360
00361 SUMA_cmap_wid_postRedisplay(w, (XtPointer)SO, NULL);
00362
00363 SUMA_RETURNe;
00364 }
00365
00366 void SUMA_cmap_wid_resize(Widget w, XtPointer clientData, XtPointer call)
00367 {
00368 static char FuncName[]={"SUMA_cmap_wid_resize"};
00369 SUMA_SurfaceObject *SO=NULL;
00370 SUMA_Boolean LocalHead = NOPE;
00371
00372 SUMA_ENTRY;
00373
00374 SUMA_LH("called");
00375 SO = (SUMA_SurfaceObject *)clientData;
00376 if (!SO) { SUMA_SL_Err("NULL SO"); SUMA_RETURNe; }
00377
00378 SUMA_RETURNe;
00379 }
00380
00381 void SUMA_cmap_wid_input(Widget w, XtPointer clientData, XtPointer callData)
00382 {
00383 static char FuncName[]={"SUMA_cmap_wid_input"};
00384 GLwDrawingAreaCallbackStruct *cd;
00385 KeySym keysym;
00386 XKeyEvent Kev;
00387 XButtonEvent Bev;
00388 XMotionEvent Mev;
00389 char buffer[10], cbuf = '\0', cbuf2='\0';
00390 SUMA_SurfaceObject *SO=NULL;
00391 int xls;
00392 static Time B1time = 0;
00393 static int pButton, mButton, rButton;
00394 static SUMA_Boolean DoubleClick = NOPE;
00395 DList *list = NULL;
00396 SUMA_EngineData *ED = NULL;
00397 static float height_two_col, width;
00398 int ncol;
00399 SUMA_COLOR_MAP *ColMap = NULL;
00400 static float fov_lim = -1.0;
00401 static SUMA_SurfaceObject *SOcmap=NULL;
00402 SUMA_Boolean LocalHead = NOPE;
00403
00404 SUMA_ENTRY;
00405
00406 SUMA_LH("called");
00407 SO = (SUMA_SurfaceObject *)clientData;
00408 if (!SO) { SUMA_SL_Err("NULL SO"); SUMA_RETURNe; }
00409
00410 ColMap = SUMA_CmapOfPlane (SO->SurfCont->curColPlane );
00411 if (!ColMap) { SUMA_SL_Err("No Cmap"); SUMA_RETURNe; };
00412 if (ColMap->SO != SOcmap) {
00413 SUMA_LH("New colormap SO");
00414
00415 SOcmap = ColMap->SO;
00416 ncol = SOcmap->N_FaceSet / 2;
00417 height_two_col = (SOcmap->MaxDims[1] - SOcmap->MinDims[1]) / (float)ncol * 2.0;
00418 width = (SOcmap->MaxDims[0] - SOcmap->MinDims[0]);
00419 fov_lim = 2.0 * atan( (double)height_two_col / ( 2.0 * (double)SUMA_CMAP_VIEW_FROM ) ) * 180 / SUMA_PI;
00420 if (LocalHead) {
00421 SUMA_Print_Surface_Object(SOcmap, NULL);
00422 fprintf(SUMA_STDERR,"%s: ncol=%d, height = %f, height of 2 col =%f, width=%f, d = %d, fov_lim = %f\n",
00423 FuncName, ncol, (SOcmap->MaxDims[1] - SOcmap->MinDims[1]), height_two_col, width, SUMA_CMAP_VIEW_FROM, fov_lim);
00424 }
00425 }
00426
00427
00428 if (!glXMakeCurrent(XtDisplay(w), XtWindow(w), SO->SurfCont->cmp_ren->cmap_context)) {
00429 fprintf (SUMA_STDERR, "Error %s: Failed in glXMakeCurrent.\n ", FuncName);
00430 SUMA_RETURNe;
00431 }
00432
00433
00434 cd = (GLwDrawingAreaCallbackStruct *) callData;
00435
00436 Kev = *(XKeyEvent *) &cd->event->xkey;
00437 Bev = *(XButtonEvent *) &cd->event->xbutton;
00438 Mev = *(XMotionEvent *) &cd->event->xmotion;
00439
00440 switch (Kev.type) {
00441 case KeyPress:
00442 xls = XLookupString((XKeyEvent *) cd->event, buffer, 8, &keysym, NULL);
00443
00444
00445 switch (keysym) {
00446 case XK_r:
00447 {
00448 GLvoid *pixels;
00449 SUMA_LH("Recording");
00450 pixels = SUMA_grabPixels(1, SUMA_CMAP_WIDTH, SUMA_CMAP_HEIGHT);
00451 if (pixels) {
00452 ISQ_snapsave (SUMA_CMAP_WIDTH, -SUMA_CMAP_HEIGHT, (unsigned char *)pixels, SO->SurfCont->cmp_ren->cmap_wid );
00453 SUMA_free(pixels);
00454 }else {
00455 SUMA_SLP_Err("Failed to record image.");
00456 }
00457 }
00458 break;
00459 case XK_h:
00460 if (Kev.state & ControlMask){
00461 if (!list) list = SUMA_CreateList();
00462 ED = SUMA_InitializeEngineListData (SE_Help_Cmap);
00463 SUMA_RegisterEngineListCommand ( list, ED,
00464 SEF_vp, (void *)ColMap,
00465 SES_SumaWidget, NULL, NOPE,
00466 SEI_Head, NULL);
00467 if (!SUMA_Engine (&list)) {
00468 fprintf(stderr, "Error %s: SUMA_Engine call failed.\n", FuncName);
00469 }
00470 }
00471 break;
00472 case XK_Z:
00473 {
00474 static SUMA_Boolean BeepedAlready = NOPE;
00475 SO->SurfCont->cmp_ren->FOV /= FOV_IN_FACT;
00476 if (SO->SurfCont->cmp_ren->FOV < fov_lim) {
00477 if (!BeepedAlready) {
00478 SUMA_BEEP; BeepedAlready = YUP;
00479 }
00480 SO->SurfCont->cmp_ren->FOV = fov_lim;
00481 } else BeepedAlready = NOPE;
00482 if (LocalHead) fprintf(SUMA_STDERR,"%s: Zoom in FOV = %f\n", FuncName, SO->SurfCont->cmp_ren->FOV);
00483 SUMA_cmap_wid_postRedisplay(w, (XtPointer)SO, NULL);
00484 }
00485 break;
00486
00487 case XK_z:
00488 {
00489 static SUMA_Boolean BeepedAlready = NOPE;
00490 SO->SurfCont->cmp_ren->FOV /= FOV_OUT_FACT;
00491 if (SO->SurfCont->cmp_ren->FOV > SUMA_CMAP_FOV_INITIAL) {
00492 if (!BeepedAlready) {
00493 SUMA_BEEP; BeepedAlready = YUP;
00494 }
00495 SO->SurfCont->cmp_ren->FOV = SUMA_CMAP_FOV_INITIAL;
00496 } else BeepedAlready = NOPE;
00497 if (LocalHead) fprintf(SUMA_STDERR,"%s: Zoom out FOV = %f\n", FuncName, SO->SurfCont->cmp_ren->FOV);
00498 SUMA_cmap_wid_postRedisplay(w, (XtPointer)SO, NULL);
00499 }
00500 break;
00501 case XK_Home:
00502 SO->SurfCont->cmp_ren->FOV = SUMA_CMAP_FOV_INITIAL;
00503 SO->SurfCont->cmp_ren->translateVec[0] = SO->SurfCont->cmp_ren->translateVec[1] = SO->SurfCont->cmp_ren->translateVec[2] = 0.0;
00504 SUMA_cmap_wid_postRedisplay(w, (XtPointer)SO, NULL);
00505 break;
00506 case XK_Up:
00507 {
00508 static SUMA_Boolean BeepedAlready = NOPE;
00509 float tstep = height_two_col / 2 * SO->SurfCont->cmp_ren->FOV/(float)SUMA_CMAP_FOV_INITIAL;
00510 SO->SurfCont->cmp_ren->translateVec[1] += tstep ;
00511 if (LocalHead) fprintf(SUMA_STDERR,"%s: translateVec[1] = %f\n", FuncName, SO->SurfCont->cmp_ren->translateVec[1]);
00512 if (SO->SurfCont->cmp_ren->translateVec[1] > SUMA_CMAP_HEIGHT - 20) {
00513 if (!BeepedAlready) {
00514 SUMA_BEEP; BeepedAlready = YUP;
00515 }
00516 SO->SurfCont->cmp_ren->translateVec[1] -= tstep;
00517 } else BeepedAlready = NOPE;
00518 SUMA_cmap_wid_postRedisplay(w, (XtPointer)SO, NULL);
00519 }
00520 break;
00521 case XK_Down:
00522 {
00523 static SUMA_Boolean BeepedAlready = NOPE;
00524 float tstep = height_two_col / 2 * SO->SurfCont->cmp_ren->FOV/(float)SUMA_CMAP_FOV_INITIAL;
00525 SO->SurfCont->cmp_ren->translateVec[1] -= tstep;
00526 if (SO->SurfCont->cmp_ren->translateVec[1] < -SUMA_CMAP_HEIGHT + 20) {
00527 if (!BeepedAlready) {
00528 SUMA_BEEP; BeepedAlready = YUP;
00529 }
00530 SO->SurfCont->cmp_ren->translateVec[1] += tstep;
00531 } else BeepedAlready = NOPE;
00532 SUMA_cmap_wid_postRedisplay(w, (XtPointer)SO, NULL);
00533 }
00534 break;
00535
00536 }
00537 break;
00538
00539 case ButtonPress:
00540 if (LocalHead) fprintf(stdout,"In ButtonPress\n");
00541 pButton = Bev.button;
00542 if (SUMAg_CF->SwapButtons_1_3 || (SUMAg_CF->ROI_mode && SUMAg_CF->Pen_mode)) {
00543 if (pButton == Button1) pButton = Button3;
00544 else if (pButton == Button3) pButton = Button1;
00545 }
00546
00547
00548 if (Bev.time - B1time < SUMA_DOUBLE_CLICK_MAX_DELAY) {
00549 if (LocalHead) fprintf(SUMA_STDERR, "%s: Double click.\n", FuncName);
00550 DoubleClick = YUP;
00551 } else {
00552 DoubleClick = NOPE;
00553 }
00554 B1time = Bev.time;
00555
00556 switch (pButton) {
00557 case Button1:
00558 break;
00559 default:
00560 break;
00561 }
00562 break;
00563
00564 case ButtonRelease:
00565 if (LocalHead) fprintf(SUMA_STDERR,"%s: In ButtonRelease\n", FuncName);
00566 rButton = Bev.button;
00567 if (SUMAg_CF->SwapButtons_1_3 || (SUMAg_CF->ROI_mode && SUMAg_CF->Pen_mode)) {
00568 if (rButton == Button1) rButton = Button3;
00569 else if (rButton == Button3) rButton = Button1;
00570 }
00571 switch (rButton) {
00572 case Button3:
00573 break;
00574 default:
00575 break;
00576 }
00577 break;
00578
00579 case MotionNotify:
00580 if (LocalHead) fprintf(stdout,"In MotionNotify\n");
00581 if (SUMAg_CF->SwapButtons_1_3 || (SUMAg_CF->ROI_mode && SUMAg_CF->Pen_mode)) {
00582 if (((Mev.state & Button3MotionMask) && (Mev.state & Button2MotionMask)) || ((Mev.state & Button2MotionMask) && (Mev.state & ShiftMask))) {
00583 mButton = SUMA_Button_12_Motion;
00584 } else if(Mev.state & Button3MotionMask) {
00585 mButton = SUMA_Button_1_Motion;
00586 }else if(Mev.state & Button2MotionMask) {
00587 mButton = SUMA_Button_2_Motion;
00588 }else if(Mev.state & Button1MotionMask) {
00589 mButton = SUMA_Button_3_Motion;
00590 }else {
00591 break;
00592 }
00593 } else {
00594 if (((Mev.state & Button1MotionMask) && (Mev.state & Button2MotionMask)) || ((Mev.state & Button2MotionMask) && (Mev.state & ShiftMask))) {
00595 mButton = SUMA_Button_12_Motion;
00596 } else if(Mev.state & Button1MotionMask) {
00597 mButton = SUMA_Button_1_Motion;
00598 }else if(Mev.state & Button2MotionMask) {
00599 mButton = SUMA_Button_2_Motion;
00600 } else if(Mev.state & Button3MotionMask) {
00601 mButton = SUMA_Button_3_Motion;
00602 }else {
00603 break;
00604 }
00605 }
00606
00607 switch (mButton) {
00608 case SUMA_Button_12_Motion:
00609 case SUMA_Button_2_Shift_Motion:
00610 break;
00611 default:
00612 break;
00613 }
00614
00615
00616 break;
00617 }
00618
00619
00620 SUMA_SiSi_I_Insist();
00621
00622 SUMA_RETURNe;
00623 }
00624
00625 void SUMA_cb_set_threshold_label(Widget w, XtPointer clientData, XtPointer call)
00626 {
00627 static char FuncName[]={"SUMA_cb_set_threshold_label"};
00628 SUMA_SurfaceObject *SO=NULL;
00629 XmScaleCallbackStruct * cbs = (XmScaleCallbackStruct *) call ;
00630 float fff ;
00631 int dec;
00632 char slabel[100];
00633 SUMA_Boolean LocalHead = NOPE;
00634
00635 SUMA_ENTRY;
00636
00637 SUMA_LH("called");
00638 SO = (SUMA_SurfaceObject *)clientData;
00639 if (!SO) { SUMA_SL_Err("NULL SO"); SUMA_RETURNe; }
00640
00641 XtVaGetValues(w, XmNuserData, &dec, NULL);
00642 if (SO->SurfCont->curColPlane->OptScl->ThrMode != SUMA_ABS_LESS_THAN)
00643 sprintf(slabel, "%5s", MV_format_fval((float)cbs->value / pow(10.0, dec)));
00644 else {
00645
00646
00647
00648 sprintf(slabel, "%5s", MV_format_fval((float)cbs->value / pow(10.0, dec)));
00649 }
00650
00651 SUMA_INSERT_CELL_STRING(SO->SurfCont->SetThrScaleTable, 0,0,slabel);
00652
00653
00654
00655
00656
00657 #if SUMA_SEPARATE_SURF_CONTROLLERS
00658 SUMA_UpdateColPlaneShellAsNeeded(SO);
00659 #endif
00660
00661 SUMA_RETURNe;
00662 }
00663
00664 void SUMA_cb_set_threshold(Widget w, XtPointer clientData, XtPointer call)
00665 {
00666 static char FuncName[]={"SUMA_cb_set_threshold"};
00667 SUMA_SurfaceObject *SO=NULL;
00668 XmScaleCallbackStruct * cbs = (XmScaleCallbackStruct *) call ;
00669 float fff ;
00670 int dec;
00671 SUMA_Boolean LocalHead = NOPE;
00672
00673 SUMA_ENTRY;
00674
00675 SUMA_LH("called");
00676 SO = (SUMA_SurfaceObject *)clientData;
00677 if (!SO) { SUMA_SL_Err("NULL SO"); SUMA_RETURNe; }
00678 XtVaGetValues(w, XmNuserData, &dec, NULL);
00679 SO->SurfCont->curColPlane->OptScl->ThreshRange[0] = (float)cbs->value / pow(10.0, dec);
00680 if (LocalHead) {
00681 fprintf(SUMA_STDERR,"%s:\nThreshold set to %f\n",FuncName, SO->SurfCont->curColPlane->OptScl->ThreshRange[0]);
00682 }
00683
00684 if (SO->SurfCont->curColPlane->OptScl->UseThr && SO->SurfCont->curColPlane->OptScl->tind >=0) {
00685 SUMA_ColorizePlane(SO->SurfCont->curColPlane);
00686 SUMA_RemixRedisplay(SO);
00687 }
00688
00689
00690 SUMA_cb_set_threshold_label(w, clientData, call);
00691
00692
00693 SUMA_FORCE_SCALE_HEIGHT(SO);
00694
00695 #if SUMA_SEPARATE_SURF_CONTROLLERS
00696 SUMA_UpdateColPlaneShellAsNeeded(SO);
00697 #endif
00698
00699 SUMA_UpdateNodeValField(SO);
00700 SUMA_UpdateNodeLblField(SO);
00701
00702 SUMA_RETURNe;
00703
00704 }
00705
00706 void SUMA_cb_SwitchIntensity(Widget w, XtPointer client_data, XtPointer call)
00707 {
00708 static char FuncName[]={"SUMA_cb_SwitchIntensity"};
00709 int imenu = 0;
00710 char srange[500];
00711 SUMA_MenuCallBackData *datap=NULL;
00712 SUMA_SurfaceObject *SO = NULL;
00713 SUMA_Boolean LocalHead = NOPE;
00714
00715 SUMA_ENTRY;
00716
00717
00718 datap = (SUMA_MenuCallBackData *)client_data;
00719 SO = (SUMA_SurfaceObject *)datap->ContID;
00720 imenu = (int)datap->callback_data;
00721
00722 if (!SO->SurfCont->curColPlane) { SUMA_RETURNe; }
00723 if (LocalHead) {
00724 fprintf(SUMA_STDERR, "%s:\n request to switch intensity to col. %d\n", FuncName, imenu - 1);
00725 fprintf(SUMA_STDERR, "SO->Label = %s\n", SO->Label);
00726 }
00727
00728 SO->SurfCont->curColPlane->OptScl->find = imenu - 1;
00729
00730 SUMA_InitRangeTable(SO, 0) ;
00731
00732 if (!SO->SurfCont->curColPlane->Show) { SUMA_RETURNe; }
00733
00734
00735 if (!SUMA_ColorizePlane (SO->SurfCont->curColPlane)) {
00736 SUMA_SLP_Err("Failed to colorize plane.\n");
00737 SUMA_RETURNe;
00738 }
00739
00740
00741 SUMA_RemixRedisplay(SO);
00742
00743 #if SUMA_SEPARATE_SURF_CONTROLLERS
00744 SUMA_UpdateColPlaneShellAsNeeded(SO);
00745 #endif
00746
00747 SUMA_UpdateNodeValField(SO);
00748 SUMA_UpdateNodeLblField(SO);
00749
00750 SUMA_RETURNe;
00751 }
00752
00753 void SUMA_cb_SwitchThreshold(Widget w, XtPointer client_data, XtPointer call)
00754 {
00755 static char FuncName[]={"SUMA_cb_SwitchThreshold"};
00756 int imenu = 0;
00757 char srange[500];
00758 SUMA_MenuCallBackData *datap=NULL;
00759 SUMA_SurfaceObject *SO = NULL;
00760 float range[2]; int loc[2];
00761 SUMA_Boolean LocalHead = NOPE;
00762
00763 SUMA_ENTRY;
00764
00765
00766 datap = (SUMA_MenuCallBackData *)client_data;
00767 SO = (SUMA_SurfaceObject *)datap->ContID;
00768 imenu = (int)datap->callback_data;
00769
00770 if (!SO->SurfCont->curColPlane) { SUMA_RETURNe; }
00771
00772 if (LocalHead) {
00773 fprintf(SUMA_STDERR, "%s:\n request to switch threshold to col. %d\n", FuncName, imenu -1);
00774 }
00775 SO->SurfCont->curColPlane->OptScl->tind = imenu - 1;
00776
00777 if (SUMA_GetDsetColRange(SO->SurfCont->curColPlane->dset_link, SO->SurfCont->curColPlane->OptScl->tind, range, loc)) {
00778 SUMA_SetScaleRange(SO, range );
00779 }else {
00780 SUMA_SLP_Err("Failed to get range");
00781 SUMA_RETURNe;
00782 }
00783
00784 SUMA_InitRangeTable(SO, -1) ;
00785
00786 SUMA_UpdateNodeValField(SO);
00787
00788 if (!SO->SurfCont->curColPlane->OptScl->UseThr) { SUMA_RETURNe; }
00789
00790 if (!SUMA_ColorizePlane (SO->SurfCont->curColPlane)) {
00791 SUMA_SLP_Err("Failed to colorize plane.\n");
00792 SUMA_RETURNe;
00793 }
00794
00795 SUMA_RemixRedisplay(SO);
00796
00797 #if SUMA_SEPARATE_SURF_CONTROLLERS
00798 SUMA_UpdateColPlaneShellAsNeeded(SO);
00799 #endif
00800
00801 SUMA_UpdateNodeLblField(SO);
00802
00803 SUMA_RETURNe;
00804 }
00805
00806 void SUMA_cb_SwitchBrightness(Widget w, XtPointer client_data, XtPointer call)
00807 {
00808 static char FuncName[]={"SUMA_cb_SwitchBrightness"};
00809 int imenu = 0;
00810 SUMA_MenuCallBackData *datap=NULL;
00811 SUMA_SurfaceObject *SO = NULL;
00812 SUMA_Boolean LocalHead = NOPE;
00813
00814 SUMA_ENTRY;
00815
00816
00817 datap = (SUMA_MenuCallBackData *)client_data;
00818 SO = (SUMA_SurfaceObject *)datap->ContID;
00819 imenu = (int)datap->callback_data;
00820
00821 if (LocalHead) {
00822 fprintf(SUMA_STDERR, "%s:\n request to switch brightness to col. %d\n", FuncName, imenu - 1);
00823 }
00824
00825 SO->SurfCont->curColPlane->OptScl->bind = imenu - 1;
00826
00827 SUMA_InitRangeTable(SO, 1) ;
00828
00829 SUMA_UpdateNodeValField(SO);
00830 if (!SO->SurfCont->curColPlane->OptScl->UseBrt) { SUMA_RETURNe; }
00831
00832 if (!SUMA_ColorizePlane (SO->SurfCont->curColPlane)) {
00833 SUMA_SLP_Err("Failed to colorize plane.\n");
00834 SUMA_RETURNe;
00835 }
00836
00837
00838 SUMA_RemixRedisplay(SO);
00839
00840 #if SUMA_SEPARATE_SURF_CONTROLLERS
00841 SUMA_UpdateColPlaneShellAsNeeded(SO);
00842 #endif
00843
00844 SUMA_UpdateNodeLblField(SO);
00845
00846 SUMA_RETURNe;
00847 }
00848
00849
00850
00851
00852 void SUMA_cb_SwitchCmap(Widget w, XtPointer client_data, XtPointer call)
00853 {
00854 static char FuncName[]={"SUMA_cb_SwitchCmap"};
00855 SUMA_MenuCallBackData *datap=NULL;
00856 SUMA_SurfaceObject *SO = NULL;
00857 SUMA_COLOR_MAP *CM = NULL;
00858 SUMA_Boolean LocalHead = NOPE;
00859
00860 SUMA_ENTRY;
00861
00862
00863 datap = (SUMA_MenuCallBackData *)client_data;
00864 SO = (SUMA_SurfaceObject *)datap->ContID;
00865 CM = (SUMA_COLOR_MAP *)datap->callback_data;
00866
00867 if (LocalHead) {
00868 fprintf(SUMA_STDERR, "%s:\n request to switch colormap to (%s)\n",
00869 FuncName, CM->Name);
00870 }
00871
00872 if (!SUMA_SwitchColPlaneCmap(SO, CM)) {
00873 SUMA_SL_Err("Failed in SUMA_SwitchColPlaneCmap");
00874 }
00875
00876
00877 if (SUMAg_CF->X->SwitchCmapLst) {
00878 if (!SUMAg_CF->X->SwitchCmapLst->isShaded)
00879 SUMA_cb_CloseSwitchCmap( w, (XtPointer)SUMAg_CF->X->SwitchCmapLst, call);
00880 }
00881
00882 #if SUMA_SEPARATE_SURF_CONTROLLERS
00883 SUMA_UpdateColPlaneShellAsNeeded(SO);
00884 #endif
00885
00886
00887 SUMA_UpdateNodeLblField(SO);
00888
00889 SUMA_RETURNe;
00890 }
00891
00892 void SUMA_cb_ShowZero_tb_toggled (Widget w, XtPointer data, XtPointer client_data)
00893 {
00894 static char FuncName[]={"SUMA_cb_SymIrange_tb_toggled"};
00895 SUMA_SurfaceObject *SO = NULL;
00896 SUMA_TABLE_FIELD *TF=NULL;
00897 SUMA_Boolean LocalHead = NOPE;
00898
00899 SUMA_ENTRY;
00900
00901 SUMA_LH("Called");
00902
00903 SO = (SUMA_SurfaceObject *)data;
00904
00905 if (!SO->SurfCont->curColPlane) SUMA_RETURNe;
00906
00907 SO->SurfCont->curColPlane->OptScl->MaskZero = !SO->SurfCont->curColPlane->OptScl->MaskZero;
00908
00909 if (!SO->SurfCont->curColPlane->Show) { SUMA_RETURNe; }
00910
00911 if (!SUMA_ColorizePlane (SO->SurfCont->curColPlane)) {
00912 SUMA_SLP_Err("Failed to colorize plane.\n");
00913 SUMA_RETURNe;
00914 }
00915
00916 SUMA_RemixRedisplay(SO);
00917
00918 SUMA_UpdateNodeLblField(SO);
00919
00920
00921 }
00922
00923
00924 void SUMA_cb_SymIrange_tb_toggled (Widget w, XtPointer data, XtPointer client_data)
00925 {
00926 static char FuncName[]={"SUMA_cb_SymIrange_tb_toggled"};
00927 SUMA_SurfaceObject *SO = NULL;
00928 SUMA_TABLE_FIELD *TF=NULL;
00929 SUMA_Boolean LocalHead = NOPE;
00930
00931 SUMA_ENTRY;
00932
00933 SUMA_LH("Called");
00934
00935 SO = (SUMA_SurfaceObject *)data;
00936
00937 if (!SO->SurfCont->curColPlane) SUMA_RETURNe;
00938
00939 SO->SurfCont->curColPlane->SymIrange = !SO->SurfCont->curColPlane->SymIrange;
00940
00941 if (SO->SurfCont->curColPlane->SymIrange) {
00942
00943 TF = SO->SurfCont->SetRangeTable;
00944 SO->SurfCont->curColPlane->OptScl->IntRange[1] =
00945 SUMA_LARG_ABS(SO->SurfCont->curColPlane->OptScl->IntRange[0], SO->SurfCont->curColPlane->OptScl->IntRange[1]);
00946 SO->SurfCont->curColPlane->OptScl->IntRange[0] = -SO->SurfCont->curColPlane->OptScl->IntRange[1];
00947 SUMA_INSERT_CELL_VALUE(TF, 1, 1, SO->SurfCont->curColPlane->OptScl->IntRange[0]);
00948 SUMA_INSERT_CELL_VALUE(TF, 1, 2, SO->SurfCont->curColPlane->OptScl->IntRange[1]);
00949 }
00950
00951 if (!SO->SurfCont->curColPlane->Show) { SUMA_RETURNe; }
00952
00953
00954 if (!SUMA_ColorizePlane (SO->SurfCont->curColPlane)) {
00955 SUMA_SLP_Err("Failed to colorize plane.\n");
00956 SUMA_RETURNe;
00957 }
00958
00959 SUMA_RemixRedisplay(SO);
00960
00961 SUMA_UpdateNodeValField(SO);
00962 SUMA_UpdateNodeLblField(SO);
00963
00964
00965 SUMA_RETURNe;
00966 }
00967
00968 void SUMA_cb_AbsThresh_tb_toggled (Widget w, XtPointer data, XtPointer client_data)
00969 {
00970 static char FuncName[]={"SUMA_cb_AbsThresh_tb_toggled"};
00971 SUMA_SurfaceObject *SO = NULL;
00972 char slabel[100];
00973 float range[2]; int loc[2];
00974 SUMA_Boolean LocalHead = NOPE;
00975
00976 SUMA_ENTRY;
00977
00978 SUMA_LH("Called");
00979
00980 SO = (SUMA_SurfaceObject *)data;
00981
00982 if (!SO->SurfCont->curColPlane) SUMA_RETURNe;
00983
00984 if (SO->SurfCont->curColPlane->OptScl->ThrMode != SUMA_ABS_LESS_THAN) {
00985 SO->SurfCont->curColPlane->OptScl->ThrMode = SUMA_ABS_LESS_THAN;
00986
00987
00988
00989 sprintf(slabel, "%5s", MV_format_fval(fabs(SO->SurfCont->curColPlane->OptScl->ThreshRange[0])));
00990 } else {
00991 SO->SurfCont->curColPlane->OptScl->ThrMode = SUMA_LESS_THAN;
00992 sprintf(slabel, "%5s", MV_format_fval(SO->SurfCont->curColPlane->OptScl->ThreshRange[0]));
00993 }
00994
00995 SUMA_INSERT_CELL_STRING(SO->SurfCont->SetThrScaleTable, 0,0,slabel);
00996 if (SUMA_GetDsetColRange(SO->SurfCont->curColPlane->dset_link, SO->SurfCont->curColPlane->OptScl->tind, range, loc)) {
00997 SUMA_SetScaleRange(SO, range );
00998 }else {
00999 SUMA_SLP_Err("Failed to get range");
01000 SUMA_RETURNe;
01001 }
01002
01003 if (!SO->SurfCont->curColPlane->OptScl->UseThr) { SUMA_RETURNe; }
01004
01005 if (!SUMA_ColorizePlane (SO->SurfCont->curColPlane)) {
01006 SUMA_SLP_Err("Failed to colorize plane.\n");
01007 SUMA_RETURNe;
01008 }
01009
01010 SUMA_RemixRedisplay(SO);
01011
01012 SUMA_UpdateNodeLblField(SO);
01013
01014 SUMA_RETURNe;
01015 }
01016
01017 void SUMA_cb_SwithInt_toggled (Widget w, XtPointer data, XtPointer client_data)
01018 {
01019 static char FuncName[]={"SUMA_cb_SwithInt_toggled"};
01020 SUMA_SurfaceObject *SO = NULL;
01021 SUMA_Boolean LocalHead = NOPE;
01022
01023 SUMA_ENTRY;
01024
01025 SUMA_LH("Called");
01026
01027 SO = (SUMA_SurfaceObject *)data;
01028
01029 if (!SO->SurfCont->curColPlane) SUMA_RETURNe;
01030
01031
01032 if (SO->SurfCont->curColPlane->OptScl->find < 0) {
01033 SUMA_BEEP;
01034 SUMA_SLP_Note("no intensity column set");
01035 XmToggleButtonSetState (SO->SurfCont->Int_tb, NOPE, NOPE);
01036 SUMA_RETURNe;
01037 }
01038
01039
01040 SO->SurfCont->curColPlane->Show = XmToggleButtonGetState (SO->SurfCont->Int_tb);
01041 XmToggleButtonSetState (SO->SurfCont->ColPlaneShow_tb, SO->SurfCont->curColPlane->Show, NOPE);
01042
01043 SUMA_ColorizePlane(SO->SurfCont->curColPlane);
01044 SUMA_RemixRedisplay(SO);
01045 SUMA_UpdateNodeLblField(SO);
01046
01047 #if SUMA_SEPARATE_SURF_CONTROLLERS
01048 SUMA_UpdateColPlaneShellAsNeeded(SO);
01049 #endif
01050 SUMA_RETURNe;
01051 }
01052
01053 void SUMA_cb_SwithThr_toggled (Widget w, XtPointer data, XtPointer client_data)
01054 {
01055 static char FuncName[]={"SUMA_cb_SwithThr_toggled"};
01056 SUMA_SurfaceObject *SO = NULL;
01057 SUMA_Boolean LocalHead = NOPE;
01058
01059 SUMA_ENTRY;
01060
01061 SUMA_LH("Called");
01062
01063 SO = (SUMA_SurfaceObject *)data;
01064
01065 if (!SO->SurfCont->curColPlane) SUMA_RETURNe;
01066
01067
01068 if (SO->SurfCont->curColPlane->OptScl->tind < 0) {
01069 SUMA_BEEP;
01070 SUMA_SLP_Note("no threshold column set");
01071 XmToggleButtonSetState (SO->SurfCont->Thr_tb, NOPE, NOPE);
01072 SUMA_RETURNe;
01073 }
01074
01075 SO->SurfCont->curColPlane->OptScl->UseThr = XmToggleButtonGetState (SO->SurfCont->Thr_tb);
01076
01077 SUMA_ColorizePlane(SO->SurfCont->curColPlane);
01078 SUMA_RemixRedisplay(SO);
01079
01080 SUMA_UpdateNodeLblField(SO);
01081
01082 #if SUMA_SEPARATE_SURF_CONTROLLERS
01083 SUMA_UpdateColPlaneShellAsNeeded(SO);
01084 #endif
01085 SUMA_RETURNe;
01086 }
01087
01088 void SUMA_cb_SwithBrt_toggled (Widget w, XtPointer data, XtPointer client_data)
01089 {
01090 static char FuncName[]={"SUMA_cb_SwithBrt_toggled"};
01091 SUMA_SurfaceObject *SO = NULL;
01092 SUMA_Boolean LocalHead = NOPE;
01093
01094 SUMA_ENTRY;
01095
01096 SUMA_LH("Called");
01097
01098 SO = (SUMA_SurfaceObject *)data;
01099
01100 if (!SO->SurfCont->curColPlane) SUMA_RETURNe;
01101
01102
01103 if (SO->SurfCont->curColPlane->OptScl->bind < 0) {
01104 SUMA_BEEP;
01105 SUMA_SLP_Note("no brightness column set");
01106 XmToggleButtonSetState (SO->SurfCont->Brt_tb, NOPE, NOPE);
01107 SUMA_RETURNe;
01108 }
01109
01110 SO->SurfCont->curColPlane->OptScl->UseBrt = XmToggleButtonGetState (SO->SurfCont->Brt_tb);
01111
01112 SUMA_ColorizePlane(SO->SurfCont->curColPlane);
01113 SUMA_RemixRedisplay(SO);
01114 SUMA_UpdateNodeLblField(SO);
01115
01116 #if SUMA_SEPARATE_SURF_CONTROLLERS
01117 SUMA_UpdateColPlaneShellAsNeeded(SO);
01118 #endif
01119 SUMA_RETURNe;
01120 }
01121
01122 SUMA_MenuItem CoordBias_Menu[] = {
01123 { "-", &xmPushButtonWidgetClass,
01124 '\0', NULL, NULL,
01125 SUMA_cb_SetCoordBias, (XtPointer) SW_CoordBias_None, NULL},
01126
01127 { "x", &xmPushButtonWidgetClass,
01128 '\0', NULL, NULL,
01129 SUMA_cb_SetCoordBias, (XtPointer) SW_CoordBias_X, NULL},
01130
01131 { "y", &xmPushButtonWidgetClass,
01132 '\0', NULL, NULL,
01133 SUMA_cb_SetCoordBias, (XtPointer) SW_CoordBias_Y, NULL},
01134
01135 { "z", &xmPushButtonWidgetClass,
01136 '\0', NULL, NULL,
01137 SUMA_cb_SetCoordBias, (XtPointer) SW_CoordBias_Z, NULL},
01138
01139 { "n", &xmPushButtonWidgetClass,
01140 '\0', NULL, NULL,
01141 SUMA_cb_SetCoordBias, (XtPointer) SW_CoordBias_N, NULL},
01142
01143 {NULL},
01144 };
01145
01146 SUMA_MenuItem CmapMode_Menu[] = {
01147 { "Int", &xmPushButtonWidgetClass,
01148 '\0', NULL, NULL,
01149 SUMA_cb_SetCmapMode, (XtPointer) SW_Interp, NULL},
01150
01151 { "NN", &xmPushButtonWidgetClass,
01152 '\0', NULL, NULL,
01153 SUMA_cb_SetCmapMode, (XtPointer) SW_NN, NULL},
01154
01155 { "Dir", &xmPushButtonWidgetClass,
01156 '\0', NULL, NULL,
01157 SUMA_cb_SetCmapMode, (XtPointer) SW_Direct, NULL},
01158
01159 {NULL},
01160 };
01161
01162
01163
01164
01165
01166
01167 void SUMA_cb_SetCmapMode(Widget widget, XtPointer client_data, XtPointer call_data)
01168 {
01169 static char FuncName[]={"SUMA_cb_SetCmapMode"};
01170 SUMA_MenuCallBackData *datap=NULL;
01171 int imenu;
01172 SUMA_SurfaceObject *SO = NULL;
01173 SUMA_Boolean NewDisp = NOPE;
01174 SUMA_Boolean LocalHead = NOPE;
01175
01176 SUMA_ENTRY;
01177
01178
01179 datap = (SUMA_MenuCallBackData *)client_data;
01180 SO = (SUMA_SurfaceObject *)datap->ContID;
01181 imenu = (int)datap->callback_data;
01182 NewDisp = NOPE;
01183 switch (imenu) {
01184 case SW_Interp:
01185 if (SO->SurfCont->curColPlane->OptScl->interpmode != SUMA_INTERP) {
01186 SO->SurfCont->curColPlane->OptScl->interpmode = SUMA_INTERP;
01187 NewDisp = YUP;
01188 }
01189 break;
01190 case SW_NN:
01191 if (SO->SurfCont->curColPlane->OptScl->interpmode != SUMA_NO_INTERP) {
01192 SO->SurfCont->curColPlane->OptScl->interpmode = SUMA_NO_INTERP;
01193 NewDisp = YUP;
01194 }
01195 break;
01196 case SW_Direct:
01197 if (SO->SurfCont->curColPlane->OptScl->interpmode != SUMA_DIRECT) {
01198 SO->SurfCont->curColPlane->OptScl->interpmode = SUMA_DIRECT;
01199 NewDisp = YUP;
01200 }
01201 break;
01202 default:
01203 fprintf (SUMA_STDERR, "Error %s: Unexpected widget index.\n", FuncName);
01204 break;
01205 }
01206
01207
01208 if (NewDisp) {
01209 SUMA_ColorizePlane(SO->SurfCont->curColPlane);
01210 SUMA_RemixRedisplay(SO);
01211 }
01212
01213 SUMA_UpdateNodeNodeField(SO);
01214 SUMA_UpdateNodeLblField(SO);
01215
01216 SUMA_RETURNe;
01217 }
01218
01219
01220
01221
01222
01223
01224 void SUMA_cb_SetCoordBias(Widget widget, XtPointer client_data, XtPointer call_data)
01225 {
01226 static char FuncName[]={"SUMA_cb_SetCoordBias"};
01227 SUMA_MenuCallBackData *datap=NULL;
01228 int imenu;
01229 SUMA_SurfaceObject *SO = NULL;
01230 SUMA_Boolean NewDisp = NOPE;
01231 SUMA_Boolean LocalHead = NOPE;
01232
01233 SUMA_ENTRY;
01234
01235
01236 datap = (SUMA_MenuCallBackData *)client_data;
01237 SO = (SUMA_SurfaceObject *)datap->ContID;
01238 imenu = (int)datap->callback_data;
01239 NewDisp = NOPE;
01240 switch (imenu) {
01241 case SW_CoordBias_None:
01242 if (SO->SurfCont->curColPlane->OptScl->DoBias != SW_CoordBias_None) {
01243 if (SO->SurfCont->curColPlane->OptScl->BiasVect) {
01244 SUMA_RemoveCoordBias(SO->SurfCont->curColPlane);
01245 }
01246 NewDisp = YUP;
01247 }
01248 break;
01249 case SW_CoordBias_X:
01250 if (SO->SurfCont->curColPlane->OptScl->DoBias != SW_CoordBias_X) {
01251
01252 SUMA_TransferCoordBias(SO->SurfCont->curColPlane, SW_CoordBias_X);
01253 NewDisp = YUP;
01254 }
01255 break;
01256 case SW_CoordBias_Y:
01257 if (SO->SurfCont->curColPlane->OptScl->DoBias != SW_CoordBias_Y) {
01258
01259 SUMA_TransferCoordBias(SO->SurfCont->curColPlane, SW_CoordBias_Y);
01260 NewDisp = YUP;
01261 }
01262 break;
01263 case SW_CoordBias_Z:
01264 if (SO->SurfCont->curColPlane->OptScl->DoBias != SW_CoordBias_Z) {
01265
01266 SUMA_TransferCoordBias(SO->SurfCont->curColPlane, SW_CoordBias_Z);
01267 NewDisp = YUP;
01268 }
01269 break;
01270 case SW_CoordBias_N:
01271 if (SO->SurfCont->curColPlane->OptScl->DoBias != SW_CoordBias_N) {
01272
01273 SUMA_TransferCoordBias(SO->SurfCont->curColPlane, SW_CoordBias_N);
01274 NewDisp = YUP;
01275 }
01276 break;
01277 default:
01278 fprintf (SUMA_STDERR, "Error %s: Unexpected widget index.\n", FuncName);
01279 break;
01280 }
01281
01282
01283 if (NewDisp) {
01284 SUMA_ColorizePlane(SO->SurfCont->curColPlane);
01285 SUMA_RemixRedisplay(SO);
01286 }
01287
01288 SUMA_UpdateNodeNodeField(SO);
01289
01290 #if SUMA_SEPARATE_SURF_CONTROLLERS
01291 SUMA_UpdateColPlaneShellAsNeeded(SO);
01292 #endif
01293 SUMA_RETURNe;
01294 }
01295
01296
01297
01298
01299 SUMA_Boolean SUMA_RedisplayAllShowing(char *SO_idcode_str, SUMA_SurfaceViewer *SVv, int N_SVv)
01300 {
01301 static char FuncName[]={"SUMA_RedisplayAllShowing"};
01302 SUMA_SurfaceViewer *sv;
01303 SUMA_SurfaceObject *SO1 = NULL, *SO2 = NULL;
01304 int i, k, dov_id;
01305 DList *list=NULL;
01306 SUMA_Boolean LocalHead = NOPE;
01307
01308 SUMA_ENTRY;
01309
01310 if (!SO_idcode_str || !SVv) {
01311 fprintf (SUMA_STDERR,"Error %s: NULL SVv or SO_idcode_str. BAD\n", FuncName);
01312 SUMA_RETURN (NOPE);
01313 }
01314 dov_id = SUMA_findSO_inDOv (SO_idcode_str, SUMAg_DOv, SUMAg_N_DOv);
01315 if (dov_id < 0) {
01316 fprintf (SUMA_STDERR,"Error %s: Failed to find object with idcode %s.\n", FuncName, SO_idcode_str);
01317 SUMA_RETURN (NOPE);
01318 }
01319 SO1 = (SUMA_SurfaceObject *)SUMAg_DOv[dov_id].OP;
01320
01321
01322 for (i=0; i < N_SVv; ++i) {
01323 if (LocalHead) fprintf (SUMA_STDERR,"%s: Searching viewer %d.\n", FuncName, i);
01324 sv = &(SVv[i]);
01325
01326 for (k=0; k < sv->N_DO; ++k) {
01327 if (SUMA_isSO(SUMAg_DOv[sv->RegisteredDO[k]])) {
01328 SO2 = (SUMA_SurfaceObject *)SUMAg_DOv[sv->RegisteredDO[k]].OP;
01329 if (SUMA_WhatAreYouToMe(SO1, SO2) == SUMA_SO1_is_SO2) {
01330
01331 if (!list) list = SUMA_CreateList ();
01332 SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, SE_Redisplay, SES_SumaWidget, sv);
01333 }
01334 }
01335 }
01336 }
01337
01338 if (!SUMA_Engine(&list)) {
01339 SUMA_SLP_Err("Failed to redisplay.");
01340 SUMA_RETURN(NOPE);
01341 }
01342
01343 SUMA_RETURN(YUP);
01344 }
01345
01346 SUMA_TABLE_FIELD * SUMA_AllocTableField(void)
01347 {
01348 static char FuncName[]={"SUMA_AllocTableField"};
01349 SUMA_TABLE_FIELD *TF = NULL;
01350
01351 SUMA_ENTRY;
01352 TF = (SUMA_TABLE_FIELD *)SUMA_malloc(sizeof(SUMA_TABLE_FIELD));
01353 if (!TF) {
01354 SUMA_SL_Crit("Failed to allocate");
01355 SUMA_RETURN(TF);
01356 }
01357 TF->Ni = -1;
01358 TF->Nj = -1;
01359 TF->rc = NULL;
01360 TF->cells = NULL;
01361 TF->cwidth = NULL;
01362 TF->editable = NOPE;
01363 TF->type = SUMA_string;
01364 TF->NewValueCallback = NULL;
01365 TF->NewValueCallbackData = NULL;
01366 TF->TitLabelEVHandler = NULL;
01367 TF->TitLabelEVHandlerData = NULL;
01368 TF->CellEVHandler = NULL;
01369 TF->CellEVHandlerData = NULL;
01370 TF->cell_modified = -1;
01371 TF->num_value = NULL;
01372 TF->str_value = NULL;
01373 SUMA_RETURN(TF);
01374 }
01375
01376
01377
01378
01379
01380 void SUMA_RangeTableCell_EV ( Widget w , XtPointer cd ,
01381 XEvent *ev , Boolean *continue_to_dispatch )
01382 {
01383 static char FuncName[]={"SUMA_RangeTableCell_EV"};
01384 SUMA_SurfaceObject *SO = (SUMA_SurfaceObject *)cd;
01385 SUMA_SurfaceObject *curSO = *(SO->SurfCont->curSOp);
01386 SUMA_TABLE_FIELD *TF = SO->SurfCont->RangeTable;
01387 XButtonEvent * bev = (XButtonEvent *) ev ;
01388 int i, j, n, Found;
01389 void *cv=NULL;
01390 SUMA_Boolean LocalHead = NOPE;
01391
01392 SUMA_ENTRY;
01393
01394 SUMA_LH("Called");
01395
01396
01397 if( bev->button == Button2 ) {
01398 XUngrabPointer( bev->display , CurrentTime ) ;
01399 SUMA_RETURNe ;
01400 }
01401
01402 if( w == NULL || TF == NULL || SO == NULL ) { SUMA_RETURNe ; }
01403
01404 switch (bev->button) {
01405 case Button1:
01406 SUMA_LH("Button 1");
01407 break;
01408 case Button2:
01409 SUMA_LH("Button 2");
01410 break;
01411 case Button3:
01412 SUMA_LH("Button 3");
01413 break;
01414 default:
01415 SUMA_RETURNe;
01416 }
01417
01418
01419 n = 0;
01420 Found = -1;
01421 while (n<TF->Nj*TF->Ni && Found == -1) {
01422 if (TF->cells[n] == w) {
01423 Found = n;
01424 } else ++n;
01425 }
01426
01427 if (Found <0) {
01428 SUMA_SL_Err("Widget not found ????");
01429 SUMA_RETURNe;
01430 }
01431
01432
01433 i = Found % TF->Ni; j = Found / TF->Ni ;
01434 n = Found;
01435
01436 switch (j) {
01437 case 0:
01438 case 1:
01439 case 3:
01440 break;
01441 case 2:
01442 case 4:
01443 SUMA_LH("Call to jump to a node");
01444 XtVaGetValues(TF->cells[n], XmNvalue, &cv, NULL);
01445 if (LocalHead) {
01446 fprintf(SUMA_STDERR,"%s:\nTable cell[%d, %d]=%s, node = %d\n",
01447 FuncName, i, j, (char *)cv, atoi((char *)cv));
01448 }
01449
01450 for (i=0; i<SUMAg_N_SVv; ++i) {
01451 if (LocalHead) fprintf (SUMA_STDERR,"%s: Checking viewer %d.\n", FuncName, i);
01452 if (!SUMAg_SVv[i].isShaded && SUMAg_SVv[i].X->TOPLEVEL) {
01453
01454 if (SUMA_isVisibleSO(&(SUMAg_SVv[i]), SUMAg_DOv, curSO)) {
01455 if ((SUMAg_DOv[SUMAg_SVv[i].Focus_SO_ID].OP) == curSO) {
01456 SUMA_JumpIndex((char *)cv, (void *)(&(SUMAg_SVv[i])));
01457 }
01458 }
01459 }
01460 }
01461
01462 break;
01463 default:
01464 SUMA_SL_Err("Did not know you had so many");
01465 break;
01466 }
01467
01468 SUMA_RETURNe;
01469 }
01470
01471
01472
01473
01474 void SUMA_SetRangeTableTit_EV ( Widget w , XtPointer cd ,
01475 XEvent *ev , Boolean *continue_to_dispatch )
01476 {
01477 static char FuncName[]={"SUMA_SetRangeTableTit_EV"};
01478 Dimension lw ;
01479 Widget * children , wl = NULL;
01480 XButtonEvent * bev = (XButtonEvent *) ev ;
01481 int num_children , i, j, Found, AutoHist;
01482 SUMA_TABLE_FIELD *TF = (SUMA_TABLE_FIELD *)cd;
01483 SUMA_SurfaceObject *SO = (SUMA_SurfaceObject *)TF->NewValueCallbackData;
01484 SUMA_Boolean LocalHead = NOPE;
01485
01486 SUMA_ENTRY;
01487
01488 SUMA_LH("Called");
01489
01490
01491 if( bev->button == Button2 ){
01492 XUngrabPointer( bev->display , CurrentTime ) ;
01493 SUMA_RETURNe ;
01494 }
01495
01496 if( w == NULL || TF == NULL ) SUMA_RETURNe ;
01497
01498 switch (bev->button) {
01499 case Button1:
01500 SUMA_LH("Button 1");
01501 break;
01502 case Button2:
01503 SUMA_LH("Button 2");
01504 break;
01505 case Button3:
01506 SUMA_LH("Button 3");
01507 break;
01508 default:
01509 SUMA_RETURNe;
01510 }
01511
01512
01513
01514 i = 0; j = 0;
01515 Found = 0;
01516 while (j<TF->Nj && !Found) {
01517 if (TF->cells[j*TF->Ni+i] == w) {
01518 Found = 1;
01519 } else ++j;
01520 }
01521
01522 if (!Found) {
01523 i = 0; j = 0;
01524 Found = 0;
01525 while (i<TF->Ni && !Found) {
01526 if (TF->cells[j*TF->Ni+i] == w) {
01527 Found = 1;
01528 } else ++i;
01529 }
01530 }
01531
01532 if (Found >= 0) {
01533 if (LocalHead) fprintf(SUMA_STDERR,"%s: Click on cell [%d %d]\n", FuncName, i, j);
01534 } else {
01535 SUMA_SL_Err("CEll not found!");
01536 SUMA_RETURNe;
01537 }
01538 if (!SO->SurfCont->curColPlane) {
01539 SUMA_SL_Err("No curColPlane!");
01540 SUMA_RETURNe;
01541 }
01542
01543
01544 if (j == 0) {
01545 switch (i) {
01546 case 1:
01547 if (bev->button == Button1) {
01548 SO->SurfCont->curColPlane->OptScl->AutoIntRange = !SO->SurfCont->curColPlane->OptScl->AutoIntRange;
01549 SO->SurfCont->IntRangeLocked = !SO->SurfCont->IntRangeLocked;
01550 MCW_invert_widget(w);
01551 }else if (bev->button == Button3) {
01552 AutoHist = SO->SurfCont->curColPlane->OptScl->AutoIntRange;
01553 SO->SurfCont->curColPlane->OptScl->AutoIntRange = 1;
01554 SUMA_InitRangeTable(SO, 0);
01555 SUMA_ColorizePlane(SO->SurfCont->curColPlane);
01556 SUMA_RemixRedisplay(SO);
01557 SO->SurfCont->curColPlane->OptScl->AutoIntRange = AutoHist;
01558 }
01559 break;
01560 case 2:
01561 if (bev->button == Button1) {
01562 SO->SurfCont->curColPlane->OptScl->AutoBrtRange = !SO->SurfCont->curColPlane->OptScl->AutoBrtRange;
01563 SO->SurfCont->BrtRangeLocked = !SO->SurfCont->BrtRangeLocked;
01564 MCW_invert_widget(w);
01565 }else if (bev->button == Button3) {
01566 AutoHist = SO->SurfCont->curColPlane->OptScl->AutoBrtRange;
01567 SO->SurfCont->curColPlane->OptScl->AutoBrtRange = 1;
01568 SUMA_InitRangeTable(SO, 1);
01569 SUMA_ColorizePlane(SO->SurfCont->curColPlane);
01570 SUMA_RemixRedisplay(SO);
01571 SO->SurfCont->curColPlane->OptScl->AutoBrtRange = AutoHist;
01572 }
01573 break;
01574 case 3:
01575 break;
01576 default:
01577 break;
01578 }
01579 }
01580 if (i == 0) {
01581 switch (j) {
01582 case 1:
01583 break;
01584 case 2:
01585 break;
01586 case 3:
01587 break;
01588 default:
01589 break;
01590 }
01591 }
01592
01593
01594 if (SO->SurfCont->curColPlane->OptScl->DoBias != SW_CoordBias_None) {
01595 SUMA_UpdateNodeNodeField(SO);
01596 }
01597 SUMA_UpdateNodeLblField(SO);
01598
01599 SUMA_RETURNe;
01600
01601 }
01602
01603
01604 SUMA_TABLE_FIELD * SUMA_FreeTableField(SUMA_TABLE_FIELD *TF)
01605 {
01606 static char FuncName[]={"SUMA_FreeTableField"};
01607 int i;
01608
01609 SUMA_ENTRY;
01610
01611 if (!TF) SUMA_RETURN(NULL);
01612
01613 if (TF->cells) SUMA_free(TF->cells);
01614 if (TF->cwidth) SUMA_free(TF->cwidth);
01615 if (TF->num_value) SUMA_free(TF->num_value);
01616 if (TF->str_value) {
01617 for (i=0; i<TF->Nj*TF->Ni; ++i) if (TF->str_value[i]) SUMA_free(TF->str_value[i]);
01618 SUMA_free(TF->str_value);
01619 }
01620 SUMA_free(TF);
01621
01622 SUMA_RETURN(NULL);
01623
01624 }
01625
01626
01627
01628
01629
01630
01631
01632
01633 void SUMA_SetCellEditMode(SUMA_TABLE_FIELD *TF, int i, int j, int Mode)
01634 {
01635 static char FuncName[]={"SUMA_SetCellEditMode"};
01636 int n;
01637 SUMA_Boolean LocalHead = NOPE;
01638
01639 SUMA_ENTRY;
01640
01641 if (!TF) { SUMA_SL_Err("NULL TF"); SUMA_RETURNe; }
01642 n = j * TF->Ni + i;
01643
01644
01645 XtRemoveCallback (TF->cells[n], XmNactivateCallback, SUMA_TableF_cb_label_change, (XtPointer)TF);
01646 XtRemoveCallback (TF->cells[n], XmNmodifyVerifyCallback, SUMA_TableF_cb_label_Modify, (XtPointer)TF);
01647
01648 XtRemoveEventHandler( TF->cells[n] ,
01649 LeaveWindowMask ,
01650 FALSE ,
01651 SUMA_leave_TableField,
01652 (XtPointer) TF);
01653 switch (Mode) {
01654 case 0:
01655
01656 XtVaSetValues(TF->cells[n],
01657 XmNeditable, False,
01658 XmNshadowThickness , 1,
01659 XmNcursorPositionVisible, False,
01660 NULL);
01661 break;
01662 case 1:
01663
01664 XtVaSetValues(TF->cells[n],
01665 XmNeditable, True,
01666 XmNshadowThickness , 2,
01667 XmNcursorPositionVisible, True,
01668 NULL);
01669
01670 XtAddCallback (TF->cells[n], XmNactivateCallback, SUMA_TableF_cb_label_change, (XtPointer)TF);
01671 XtAddCallback (TF->cells[n], XmNmodifyVerifyCallback, SUMA_TableF_cb_label_Modify, (XtPointer)TF);
01672
01673 XtInsertEventHandler( TF->cells[n] ,
01674 LeaveWindowMask ,
01675 FALSE ,
01676 SUMA_leave_TableField,
01677 (XtPointer) TF ,
01678 XtListTail ) ;
01679 break;
01680 default:
01681 SUMA_SL_Err("What?");
01682 break;
01683 }
01684 SUMA_RETURNe;
01685 }
01686
01687
01688
01689
01690
01691
01692
01693
01694
01695
01696
01697
01698
01699
01700
01701
01702
01703 void SUMA_CreateTable( Widget parent,
01704 int Ni, int Nj,
01705 char **row_tit, char **col_tit,
01706 char **row_hint, char **col_hint,
01707 char **row_help, char **col_help,
01708 int *cwidth, SUMA_Boolean editable, SUMA_VARTYPE type,
01709 void (*NewValueCallback)(void * data), void *cb_data,
01710 void (*TitLabelEVHandler)(Widget w , XtPointer cd , XEvent *ev , Boolean *ctd), void *TitLabelEVHandlerData,
01711 void (*CellEVHandler)(Widget w , XtPointer cd , XEvent *ev , Boolean *ctd), void *CellEVHandlerData,
01712 SUMA_TABLE_FIELD *TF)
01713 {
01714 static char FuncName[]={"SUMA_CreateTable"};
01715 int i, j, n, titw, xmw;
01716 char *tmp;
01717 Widget rco, rcc;
01718 XtPointer cd;
01719 SUMA_Boolean LocalHead = NOPE;
01720
01721 SUMA_ENTRY;
01722
01723 if (!TF) { SUMA_SL_Err("NULL TF"); SUMA_RETURNe; }
01724 TF->Ni = Ni; TF->Nj = Nj; TF->editable = editable;
01725 TF->cwidth = (int *)SUMA_calloc(TF->Nj, sizeof(int)); for (j=0; j<TF->Nj; ++j) TF->cwidth[j] = cwidth[j];
01726 if(col_tit) TF->HasColTit = YUP; else TF->HasColTit = NOPE;
01727 if(row_tit) TF->HasRowTit = YUP; else TF->HasRowTit = NOPE;
01728 TF->cells = (Widget *)SUMA_malloc(sizeof(Widget)*TF->Ni*TF->Nj);
01729 if (!TF->cells) { SUMA_SL_Crit("Failed to allocate"); SUMA_RETURNe; }
01730 TF->NewValueCallback = NewValueCallback;
01731 TF->NewValueCallbackData = cb_data;
01732 TF->TitLabelEVHandler = TitLabelEVHandler;
01733 TF->TitLabelEVHandlerData = TitLabelEVHandlerData;
01734 TF->CellEVHandler = CellEVHandler;
01735 TF->CellEVHandlerData = CellEVHandlerData;
01736 TF->type = type;
01737 switch (TF->type) {
01738 case SUMA_int:
01739 case SUMA_float:
01740 TF->num_value= (float *)SUMA_calloc(TF->Nj*TF->Ni, sizeof(float));
01741 break;
01742 case SUMA_string:
01743 TF->str_value= (char **)SUMA_malloc(TF->Nj*TF->Ni * sizeof(char *));
01744 for (i=0; i<TF->Nj*TF->Ni; ++i) TF->str_value[i] = NULL;
01745 break;
01746 default:
01747 SUMA_SL_Err("Comme tu es bete!");
01748 SUMA_RETURNe;
01749 break;
01750 }
01751
01752
01753 TF->rc = XtVaCreateManagedWidget ("rowcolumn",
01754 xmRowColumnWidgetClass, parent,
01755 XmNorientation , XmHORIZONTAL ,
01756 XmNpacking, XmPACK_TIGHT,
01757 XmNmarginHeight, 0,
01758 XmNmarginWidth, 0,
01759 NULL);
01760
01761
01762 rco = XtVaCreateManagedWidget ("rowcolumn",
01763 xmRowColumnWidgetClass, TF->rc,
01764 XmNorientation , XmVERTICAL ,
01765 XmNpacking, XmPACK_TIGHT,
01766 XmNnumColumns, 1,
01767 XmNmarginHeight, 0,
01768 XmNmarginWidth, 0,
01769 NULL);
01770
01771
01772 for (i=0; i<TF->Ni; ++i) {
01773 rcc = XtVaCreateManagedWidget ("rowcolumn",
01774 xmRowColumnWidgetClass, rco,
01775 XmNorientation , XmHORIZONTAL ,
01776 XmNmarginHeight, 0,
01777 XmNmarginHeight, 0,
01778 XmNmarginWidth, 0,
01779 NULL);
01780
01781 if (i == 0 && TF->HasColTit) {
01782
01783
01784
01785 XtVaSetValues (rcc, XmNpacking, XmPACK_TIGHT, NULL);
01786 } else {
01787 XtVaSetValues (rcc, XmNpacking, XmPACK_TIGHT, NULL);
01788 }
01789
01790 for (j=0; j<TF->Nj; ++j) {
01791 n = j * TF->Ni + i;
01792 switch (SUMA_cellvariety(TF, n)) {
01793 case SUMA_ROW_TIT_CELL:
01794 if (LocalHead) fprintf(SUMA_STDERR,"%s:\nAdding [%d %d] (%d) %s\n", FuncName, i, j, n, row_tit[i]);
01795 #if 0
01796 TF->cells[n] = XtVaCreateManagedWidget(row_tit[i],
01797 xmLabelWidgetClass, rcc,
01798 NULL);
01799 #else
01800 TF->cells[n] = XtVaCreateManagedWidget("column title",
01801 xmTextFieldWidgetClass, rcc,
01802 XmNvalue, row_tit[i],
01803 XmNmarginHeight, 0,
01804 XmNmarginWidth, 0,
01805 XmNmarginTop, 0,
01806 XmNmarginBottom, 0,
01807 XmNmarginLeft, 0,
01808 XmNmarginRight, 0,
01809 XmNeditable, False,
01810 XmNshadowThickness , 0,
01811 XmNcursorPositionVisible, False,
01812 XmNcolumns, strlen(row_tit[i]),
01813 NULL);
01814 #endif
01815 if (!TF->TitLabelEVHandlerData) cd = (XtPointer) TF; else cd = (XtPointer)TF->TitLabelEVHandlerData;
01816 if (TF->TitLabelEVHandler) {
01817
01818 XtInsertEventHandler( TF->cells[n] ,
01819 ButtonPressMask ,
01820 FALSE ,
01821 TF->TitLabelEVHandler,
01822 cd ,
01823 XtListTail ) ;
01824 }
01825 if (row_hint) MCW_register_hint( TF->cells[n], row_hint[i] );
01826 if (row_help) MCW_register_help( TF->cells[n], row_help[i] ) ;
01827 break;
01828
01829 case SUMA_COL_TIT_CELL:
01830 if (LocalHead) fprintf(SUMA_STDERR,"%s:\nAdding [%d %d] (%d) %s\n", FuncName, i, j, n, col_tit[j]);
01831
01832 if (i == 0 && j != 0 && TF->HasColTit) {
01833 titw = TF->cwidth[j];
01834
01835 xmw = 5;
01836 } else {
01837 titw = TF->cwidth[j];
01838
01839 xmw = 0;
01840 }
01841 #if 0
01842 TF->cells[n] = XtVaCreateManagedWidget(tmp,
01843 xmLabelWidgetClass, rcc,
01844 NULL);
01845 #else
01846 TF->cells[n] = XtVaCreateManagedWidget("column title",
01847 xmTextFieldWidgetClass, rcc,
01848 XmNvalue, col_tit[j],
01849 XmNmarginHeight, 0,
01850 XmNmarginWidth, xmw,
01851 XmNmarginTop, 0,
01852 XmNmarginBottom, 0,
01853 XmNmarginLeft, 0,
01854 XmNmarginRight, 0,
01855 XmNeditable, False,
01856 XmNshadowThickness , 0,
01857 XmNcursorPositionVisible, False,
01858 XmNcolumns, titw,
01859 NULL);
01860 #endif
01861 if (i == 0 && j != 0) {
01862 XtVaSetValues( TF->cells[n], XmNalignment, XmALIGNMENT_BEGINNING, NULL);
01863 }
01864
01865
01866 if (!TF->TitLabelEVHandlerData) cd = (XtPointer) TF; else cd = (XtPointer)TF->TitLabelEVHandlerData;
01867 if (TF->TitLabelEVHandler) {
01868
01869 XtInsertEventHandler( TF->cells[n] ,
01870 ButtonPressMask ,
01871 FALSE ,
01872 TF->TitLabelEVHandler,
01873 cd ,
01874 XtListTail ) ;
01875 }
01876 if (col_hint) MCW_register_hint( TF->cells[n], col_hint[j] );
01877 if (col_help) MCW_register_help( TF->cells[n], col_help[j] ) ;
01878 break;
01879 case SUMA_ENTRY_CELL:
01880 if (LocalHead) fprintf(SUMA_STDERR,"%s:\nAdding [%d %d] (%d) entry cell\n", FuncName, i, j, n);
01881 TF->cells[n] = XtVaCreateManagedWidget("entry",
01882 xmTextFieldWidgetClass, rcc,
01883 XmNuserData, (XtPointer)n,
01884 XmNvalue, "-",
01885 XmNmarginHeight, 0,
01886 XmNmarginTop, 0,
01887 XmNmarginBottom, 0,
01888 NULL);
01889 if (col_help || col_hint || row_help || row_hint)
01890 MCW_register_help( TF->cells[n], "Hints and help messages\n"
01891 "are attached to table's\n"
01892 "column and row titles." ) ;
01893 if (TF->cwidth[j] > 0) { XtVaSetValues(TF->cells[n], XmNcolumns, TF->cwidth[j], NULL); }
01894 if (!TF->editable) {
01895 SUMA_SetCellEditMode(TF, i, j, 0);
01896 } else {
01897 SUMA_SetCellEditMode(TF, i, j, 1);
01898 }
01899
01900 if (!TF->CellEVHandlerData) cd = (XtPointer) TF; else cd = (XtPointer)TF->CellEVHandlerData;
01901 if (TF->CellEVHandler) {
01902
01903 XtInsertEventHandler( TF->cells[n] ,
01904 ButtonPressMask ,
01905 FALSE ,
01906 TF->CellEVHandler,
01907 cd ,
01908 XtListTail ) ;
01909 }
01910 break;
01911 default:
01912 SUMA_SL_Err("Bad cell type");
01913 SUMA_RETURNe;
01914 break;
01915 }
01916 }
01917 }
01918
01919 SUMA_RETURNe;
01920 }
01921
01922 SUMA_CELL_VARIETY SUMA_cellvariety (SUMA_TABLE_FIELD *TF, int n)
01923 {
01924 static char FuncName[]={"SUMA_cellvariety"};
01925 int i, j;
01926 SUMA_Boolean LocalHead = NOPE;
01927
01928 SUMA_ENTRY;
01929
01930 if (!TF) SUMA_RETURN(SUMA_ERROR_CELL);
01931 i = n % TF->Ni;
01932 j = n / TF->Ni;
01933 if (TF->HasColTit && i == 0) SUMA_RETURN(SUMA_COL_TIT_CELL);
01934 if (TF->HasRowTit && j == 0) SUMA_RETURN(SUMA_ROW_TIT_CELL);
01935 SUMA_RETURN(SUMA_ENTRY_CELL);
01936 }
01937
01938
01939
01940
01941
01942 void SUMA_leave_TableField( Widget w , XtPointer client_data ,
01943 XEvent * ev , Boolean * continue_to_dispatch )
01944 {
01945 static char FuncName[]={"SUMA_leave_TableField"};
01946 SUMA_TABLE_FIELD *TF=NULL;
01947 XLeaveWindowEvent * lev = (XLeaveWindowEvent *) ev ;
01948 XmAnyCallbackStruct cbs ;
01949 SUMA_Boolean LocalHead = NOPE;
01950
01951 SUMA_ENTRY;
01952
01953 SUMA_LH("Called");
01954 TF = (SUMA_TABLE_FIELD *)client_data ;
01955 if( lev->type != LeaveNotify || TF->cell_modified < 0) SUMA_RETURNe;
01956
01957 if (LocalHead) fprintf (SUMA_STDERR, "%s: Leave notification.\n", FuncName);
01958
01959 SUMA_TableF_cb_label_change( w , (XtPointer)TF , NULL ) ;
01960
01961 SUMA_RETURNe;
01962 }
01963
01964
01965
01966
01967
01968 void SUMA_TableF_cb_label_change (Widget w, XtPointer client_data, XtPointer call_data)
01969 {
01970 static char FuncName[]={"SUMA_TableF_cb_label_change"};
01971 SUMA_TABLE_FIELD *TF=NULL;
01972 float val;
01973 XmAnyCallbackStruct *cbs = (XmAnyCallbackStruct *) call_data;
01974 void *n;
01975 SUMA_Boolean DoCallBacks;
01976 SUMA_Boolean LocalHead = NOPE;
01977
01978 SUMA_ENTRY;
01979
01980 SUMA_LH("Called");
01981
01982 TF = (SUMA_TABLE_FIELD *)client_data;
01983
01984 DoCallBacks = NOPE;
01985 if (call_data) {
01986 if (LocalHead)
01987 fprintf (SUMA_STDERR,"%s: cbs->reason = %d (CR=%d)\n", FuncName, cbs->reason, XmCR_ACTIVATE);
01988 if (cbs->reason == XmCR_ACTIVATE) {
01989 DoCallBacks = YUP;
01990 }
01991 }
01992
01993 if (TF->cell_modified >= 0) {
01994 DoCallBacks = YUP;
01995 if (TF->type == SUMA_int || TF->type == SUMA_float) {
01996
01997 XtVaGetValues (w, XmNvalue, &n, NULL);
01998 #if 0
01999
02000 val = strtod ((char *)n, NULL);
02001 if (errno) {
02002
02003 if (LocalHead) fprintf (SUMA_STDERR, "%s: Bad syntax.\n", FuncName);
02004 SUMA_RegisterMessage (SUMAg_CF->MessageList, "Bad value in text field", FuncName, SMT_Error, SMA_Log);
02005 SUMA_TableF_SetString (TF);
02006 }else {
02007 if (TF->type == SUMA_int) {
02008 if (TF->num_value[TF->cell_modified] == (int)val) {
02009 SUMA_LH("Same value");
02010 TF->cell_modified = -1;
02011 SUMA_RETURNe;
02012 }
02013 TF->num_value[TF->cell_modified] = (int)val;
02014 } else if (TF->type == SUMA_float) {
02015 if (TF->num_value[TF->cell_modified] == val) {
02016 SUMA_LH("Same value");
02017 TF->cell_modified = -1;
02018 SUMA_RETURNe;
02019 }
02020 TF->num_value[TF->cell_modified] = val;
02021 }
02022 SUMA_TableF_SetString (TF);
02023 }
02024 #else
02025 if (SUMA_StringToNum((char *)n, &val, 1) != 1) {
02026 SUMA_BEEP;
02027
02028 if (LocalHead) fprintf (SUMA_STDERR, "%s: Bad syntax.\n", FuncName);
02029 SUMA_RegisterMessage (SUMAg_CF->MessageList, "Bad value in text field", FuncName, SMT_Error, SMA_Log);
02030 SUMA_TableF_SetString (TF);
02031 }else {
02032 if (TF->type == SUMA_int) {
02033 if (TF->num_value[TF->cell_modified] == (int)val) {
02034 SUMA_LH("Same value");
02035 TF->cell_modified = -1;
02036 SUMA_RETURNe;
02037 }
02038 TF->num_value[TF->cell_modified] = (int)val;
02039 } else if (TF->type == SUMA_float) {
02040 if (TF->num_value[TF->cell_modified] == val) {
02041 SUMA_LH("Same value");
02042 TF->cell_modified = -1;
02043 SUMA_RETURNe;
02044 }
02045 TF->num_value[TF->cell_modified] = val;
02046 }
02047 SUMA_TableF_SetString (TF);
02048 }
02049 #endif
02050 }
02051 } else {
02052 SUMA_LH("no cells modified");
02053 }
02054
02055 if (DoCallBacks) {
02056 SUMA_LH("CallBacks ...");
02057 if (TF->cell_modified < 0) {
02058
02059 SUMA_WHICH_CELL(TF, w, TF->cell_modified);
02060 }
02061 if (!TF->NewValueCallbackData) {
02062 SUMA_LH("No Callback data.");
02063 if (TF->NewValueCallback) TF->NewValueCallback((void*)TF);
02064 } else {
02065 SUMA_LH("Callback data.");
02066 if (TF->NewValueCallback) TF->NewValueCallback(TF->NewValueCallbackData);
02067 }
02068 }
02069
02070 TF->cell_modified = -1;
02071 SUMA_RETURNe;
02072 }
02073
02074
02075
02076
02077
02078
02079 int SUMA_ThreshVal2ScalePos(SUMA_SurfaceObject *SO, float *val)
02080 {
02081 static char FuncName[]={"SUMA_ThreshVal2ScalePos"};
02082 int min_v, max_v, cv, scl, dec;
02083 float ftmp;
02084 Widget w = NULL;
02085 SUMA_Boolean LocalHead = NOPE;
02086
02087 SUMA_ENTRY;
02088
02089 if (!SO) { SUMA_SL_Err("Null SO"); SUMA_RETURN(0); }
02090 w = SO->SurfCont->thr_sc;
02091 if (!w) { SUMA_SL_Err("Null widget"); SUMA_RETURN(0); }
02092
02093 XtVaGetValues(w, XmNuserData, &dec, NULL);
02094 XtVaGetValues( w,
02095 XmNmaximum, &max_v,
02096 XmNminimum, &min_v,
02097 XmNvalue, &cv,
02098 XmNscaleMultiple, &scl,
02099 NULL);
02100 if (*val < 0 && SO->SurfCont->curColPlane->OptScl->ThrMode == SUMA_ABS_LESS_THAN) {
02101 *val = -*val;
02102 }
02103 if (LocalHead) fprintf (SUMA_STDERR, "%s:\n min %d max %d scalemult %d decimals %d\nCurrent scale value %d\n",
02104 FuncName, min_v, max_v, scl, dec, cv);
02105
02106
02107 ftmp = *val * pow(10.0, dec);
02108 if (ftmp > 0) cv = (int) (ftmp+0.5);
02109 else cv = (int) (ftmp-0.5);
02110
02111
02112 if (cv < min_v) {
02113 cv = min_v;
02114
02115 *val = (float)cv / pow(10.0, dec);
02116 } else if (cv > max_v) {
02117 cv = max_v;
02118 *val = (float)cv / pow(10.0, dec);
02119 }
02120
02121 SUMA_RETURN(cv);
02122 }
02123
02124
02125
02126
02127 void SUMA_SetScaleThr(void *data)
02128 {
02129 static char FuncName[]={"SUMA_SetScaleThr"};
02130 SUMA_SurfaceObject *SO=(SUMA_SurfaceObject *)data, *curSO = NULL;
02131 SUMA_TABLE_FIELD *TF=NULL;
02132 int cv, max_v, min_v;
02133 float val;
02134 SUMA_Boolean LocalHead = NOPE;
02135
02136 SUMA_ENTRY;
02137
02138 SUMA_LH("Called");
02139 curSO = *(SO->SurfCont->curSOp);
02140 TF = SO->SurfCont->SetThrScaleTable;
02141 if (TF->cell_modified<0) SUMA_RETURNe;
02142 val = TF->num_value[TF->cell_modified];
02143
02144 cv = SUMA_ThreshVal2ScalePos (SO, &val );
02145
02146 if (LocalHead) fprintf(SUMA_STDERR,"%s:\nChecksums, new value is %f, cv to be set to %d\n",
02147 FuncName, TF->num_value[TF->cell_modified], cv);
02148
02149
02150 if (TF->num_value[TF->cell_modified] != val) {
02151 TF->num_value[TF->cell_modified] = val;
02152 SUMA_INSERT_CELL_VALUE(TF, 0, 0, TF->num_value[TF->cell_modified]);
02153 }
02154
02155 if (LocalHead) fprintf(SUMA_STDERR,"%s:\nSet thresholdiation, new value is %f\n", FuncName, TF->num_value[TF->cell_modified]);
02156
02157 SO->SurfCont->curColPlane->OptScl->ThreshRange[0] = TF->num_value[TF->cell_modified];
02158 XtVaSetValues(SO->SurfCont->thr_sc,
02159 XmNvalue, cv,
02160 NULL);
02161
02162 SUMA_LH("Colorize if necessary");
02163
02164 if (!SO->SurfCont->curColPlane->OptScl->UseThr) { SUMA_RETURNe; }
02165
02166 if (!SUMA_ColorizePlane (SO->SurfCont->curColPlane)) {
02167 SUMA_SLP_Err("Failed to colorize plane.\n");
02168 SUMA_RETURNe;
02169 }
02170
02171 SUMA_RemixRedisplay(SO);
02172
02173 SUMA_UpdateNodeLblField(SO);
02174
02175 SUMA_RETURNe;
02176 }
02177
02178
02179
02180
02181 void SUMA_TriInput (void *data)
02182 {
02183 static char FuncName[]={"SUMA_TriInput"};
02184 SUMA_SurfaceObject *SO=(SUMA_SurfaceObject *)data, *curSO = NULL;
02185 SUMA_TABLE_FIELD *TF=NULL;
02186 int i, n, j;
02187 void *cv=NULL;
02188 float fv3[3];
02189 char str[100];
02190 SUMA_Boolean LocalHead = NOPE;
02191
02192 SUMA_ENTRY;
02193
02194 SUMA_LH("Called");
02195 curSO = *(SO->SurfCont->curSOp);
02196 TF = SO->SurfCont->FaceTable;
02197 if (TF->cell_modified<0) SUMA_RETURNe;
02198 n = TF->cell_modified;
02199 i = n % TF->Ni;
02200 j = n / TF->Ni;
02201
02202 if ((int)TF->num_value[n] < 0 || (int)TF->num_value[n] >= curSO->N_FaceSet) {
02203 SUMA_SLP_Err("Triangle index n must be positive\n"
02204 "and less than the number of nodes \n"
02205 "forming the surface.\n");
02206 TF->num_value[n] = SO->SelectedFaceSet;
02207 SUMA_TableF_SetString (TF);
02208 TF->cell_modified = -1;
02209 SUMA_RETURNe;
02210 }
02211
02212 switch (j) {
02213 case 1:
02214 XtVaGetValues(TF->cells[n], XmNvalue, &cv, NULL);
02215 if (LocalHead) {
02216 fprintf(SUMA_STDERR,"%s:\nTable cell[%d, %d]=%s, Tri = %d\n",
02217 FuncName, i, j, (char *)cv, (int)TF->num_value[n]);
02218 }
02219
02220
02221 for (i=0; i<SUMAg_N_SVv; ++i) {
02222 if (LocalHead) fprintf (SUMA_STDERR,"%s: Checking viewer %d.\n", FuncName, i);
02223 if (!SUMAg_SVv[i].isShaded && SUMAg_SVv[i].X->TOPLEVEL) {
02224
02225 if (SUMA_isVisibleSO(&(SUMAg_SVv[i]), SUMAg_DOv, curSO)) {
02226 if ((SUMAg_DOv[SUMAg_SVv[i].Focus_SO_ID].OP) == curSO) {
02227 SUMA_JumpFocusFace((char *)cv, (void *)(&(SUMAg_SVv[i])));
02228 }
02229 }
02230 }
02231 }
02232 break;
02233 default:
02234 SUMA_SL_Err("Should not get this input");
02235 break;
02236 }
02237 SUMA_RETURNe;
02238 }
02239
02240
02241
02242 void SUMA_NodeInput (void *data)
02243 {
02244 static char FuncName[]={"SUMA_NodeInput"};
02245 SUMA_SurfaceObject *SO=(SUMA_SurfaceObject *)data, *curSO = NULL;
02246 SUMA_TABLE_FIELD *TF=NULL;
02247 int i, n, j;
02248 void *cv=NULL;
02249 float fv3[3];
02250 char str[100];
02251 SUMA_Boolean LocalHead = NOPE;
02252
02253 SUMA_ENTRY;
02254
02255 SUMA_LH("Called");
02256 curSO = *(SO->SurfCont->curSOp);
02257 TF = SO->SurfCont->NodeTable;
02258 if (TF->cell_modified<0) SUMA_RETURNe;
02259 n = TF->cell_modified;
02260 i = n % TF->Ni;
02261 j = n / TF->Ni;
02262
02263 if ((int)TF->num_value[n] < 0 || (int)TF->num_value[n] >= curSO->N_Node) {
02264 SUMA_SLP_Err("Node index must be positive and \n"
02265 "less than the number of nodes \n"
02266 "forming the surface.\n");
02267 TF->num_value[n] = SO->SelectedNode;
02268 SUMA_TableF_SetString (TF);
02269 TF->cell_modified = -1;
02270 SUMA_RETURNe;
02271 }
02272
02273 switch (j) {
02274 case 1:
02275 XtVaGetValues(TF->cells[n], XmNvalue, &cv, NULL);
02276 if (LocalHead) {
02277 fprintf(SUMA_STDERR,"%s:\nTable cell[%d, %d]=%s, node = %d\n",
02278 FuncName, i, j, (char *)cv, (int)TF->num_value[n]);
02279 }
02280
02281
02282 for (i=0; i<SUMAg_N_SVv; ++i) {
02283 if (LocalHead) fprintf (SUMA_STDERR,"%s: Checking viewer %d.\n", FuncName, i);
02284 if (!SUMAg_SVv[i].isShaded && SUMAg_SVv[i].X->TOPLEVEL) {
02285
02286 if (SUMA_isVisibleSO(&(SUMAg_SVv[i]), SUMAg_DOv, curSO)) {
02287 if ((SUMAg_DOv[SUMAg_SVv[i].Focus_SO_ID].OP) == curSO) {
02288 SUMA_JumpIndex((char *)cv, (void *)(&(SUMAg_SVv[i])));
02289 }
02290 }
02291 }
02292 }
02293 break;
02294 default:
02295 SUMA_SL_Err("Should not get this input");
02296 break;
02297 }
02298 SUMA_RETURNe;
02299 }
02300
02301
02302
02303
02304 void SUMA_XhairInput (void* data)
02305 {
02306 static char FuncName[]={"SUMA_XhairInput"};
02307 SUMA_SurfaceObject *SO=(SUMA_SurfaceObject *)data, *curSO = NULL;
02308 SUMA_SurfaceViewer *sv=NULL;
02309 SUMA_TABLE_FIELD *TF=NULL;
02310 int i, n, j;
02311 void *cv=NULL;
02312 float fv3[3];
02313 char str[100];
02314 SUMA_Boolean LocalHead = NOPE;
02315
02316 SUMA_ENTRY;
02317
02318 SUMA_LH("Called");
02319 curSO = *(SO->SurfCont->curSOp);
02320 TF = SO->SurfCont->XhairTable;
02321 if (TF->cell_modified<0) SUMA_RETURNe;
02322 SUMA_LH("Cell modified, modifying ...");
02323 n = TF->cell_modified;
02324 i = n % TF->Ni;
02325 j = n / TF->Ni;
02326 XtVaGetValues(TF->cells[n], XmNvalue, &cv, NULL);
02327 if (LocalHead) {
02328 fprintf(SUMA_STDERR,"%s:\nTable cell[%d, %d]=%s\n", FuncName, i, j, (char *)cv);
02329 }
02330
02331 if (SUMA_StringToNum ((char *)cv, fv3, 3) != 3) {
02332 SUMA_BEEP;
02333 str[0]='\0';
02334 } else {
02335 SUMA_XHAIR_STRING(fv3, str);
02336 }
02337 XtVaSetValues(TF->cells[n], XmNvalue, str, NULL);
02338
02339
02340 for (i=0; i<SUMAg_N_SVv; ++i) {
02341 if (LocalHead) fprintf (SUMA_STDERR,"%s: Checking viewer %d.\n", FuncName, i);
02342 if (!SUMAg_SVv[i].isShaded && SUMAg_SVv[i].X->TOPLEVEL) {
02343
02344 sv = &(SUMAg_SVv[i]);
02345 if (SUMA_isVisibleSO(sv, SUMAg_DOv, curSO)) {
02346
02347 if (sv->Ch->c[0] != fv3[0] || sv->Ch->c[1] != fv3[1] || sv->Ch->c[2] != fv3[2]) {
02348 if (LocalHead) fprintf(SUMA_STDERR, "%s: Calling for jump to %s\n", FuncName, str);
02349 SUMA_JumpXYZ(str, (void *)(&(SUMAg_SVv[i])));
02350 }
02351 }
02352 }
02353 }
02354 SUMA_RETURNe;
02355 }
02356
02357
02358
02359
02360 void SUMA_SetRangeValue (void *data)
02361 {
02362 static char FuncName[]={"SUMA_SetRangeValue"};
02363 SUMA_SurfaceObject *SO=NULL;
02364 SUMA_TABLE_FIELD *TF=NULL;
02365 int i, n, j;
02366 void *cv=NULL;
02367 SUMA_OVERLAYS *ColPlane = NULL;
02368 SUMA_Boolean NewDisp = NOPE;
02369 SUMA_Boolean LocalHead = NOPE;
02370
02371 SUMA_ENTRY;
02372
02373 SUMA_LH("Called");
02374 SO = (SUMA_SurfaceObject *)data;
02375 TF = SO->SurfCont->SetRangeTable;
02376 if (TF->cell_modified<0) SUMA_RETURNe;
02377
02378 ColPlane = SO->SurfCont->curColPlane;
02379
02380 n = TF->cell_modified;
02381 i = n % TF->Ni;
02382 j = n / TF->Ni;
02383 XtVaGetValues(TF->cells[n], XmNvalue, &cv, NULL);
02384 if (LocalHead) {
02385 fprintf(SUMA_STDERR,"%s:\nTable cell[%d, %d]=%s\n", FuncName, i, j, (char *)cv);
02386 }
02387 NewDisp = NOPE;
02388 if (1) {
02389
02390 switch (i) {
02391 case 1:
02392 SUMA_LH("Setting Int. Range");
02393 if (j == 1) {
02394 if (ColPlane->SymIrange) {
02395 ColPlane->OptScl->IntRange[0] = -fabs((double)TF->num_value[n]);
02396 ColPlane->OptScl->IntRange[1] = -ColPlane->OptScl->IntRange[0];
02397 SUMA_INSERT_CELL_VALUE(TF, 1, 1, ColPlane->OptScl->IntRange[0]);
02398 SUMA_INSERT_CELL_VALUE(TF, 1, 2, ColPlane->OptScl->IntRange[1]);
02399 } else {
02400 if (TF->num_value[n] > ColPlane->OptScl->IntRange[1]) {
02401 SUMA_BEEP; TF->num_value[n] = ColPlane->OptScl->IntRange[0];
02402 SUMA_SLP_Err("Lower bound > Upper bound!");
02403 SUMA_TableF_SetString(TF);
02404 } else {
02405 if (LocalHead) fprintf (SUMA_STDERR,"%s: IntRange[0] was %f, will be %f\n", FuncName, ColPlane->OptScl->IntRange[0], TF->num_value[n]);
02406 ColPlane->OptScl->IntRange[0] = TF->num_value[n];
02407 }
02408 }
02409 } else if (j==2) {
02410 if (ColPlane->SymIrange) {
02411 ColPlane->OptScl->IntRange[1] = fabs((double)TF->num_value[n]);
02412 ColPlane->OptScl->IntRange[0] = -ColPlane->OptScl->IntRange[1];
02413 SUMA_INSERT_CELL_VALUE(TF, 1, 1, ColPlane->OptScl->IntRange[0]);
02414 SUMA_INSERT_CELL_VALUE(TF, 1, 2, ColPlane->OptScl->IntRange[1]);
02415 } else {
02416 if (TF->num_value[n] < ColPlane->OptScl->IntRange[0]) {
02417 SUMA_BEEP; TF->num_value[n] = ColPlane->OptScl->IntRange[1];
02418 SUMA_SLP_Err("Upper bound < Lower bound!");
02419 SUMA_TableF_SetString(TF);
02420 } else {
02421 ColPlane->OptScl->IntRange[1] = TF->num_value[n];
02422 }
02423 }
02424 } else { SUMA_SL_Err("What's going on John ?"); }
02425 if (ColPlane->Show) NewDisp = YUP;
02426 break;
02427 case 2:
02428 SUMA_LH("Setting Brt. Range");
02429 if (j == 1) {
02430 if (TF->num_value[n] > ColPlane->OptScl->BrightRange[1]) {
02431 SUMA_BEEP; TF->num_value[n] = ColPlane->OptScl->BrightRange[0];
02432 SUMA_SLP_Err("Lower bound > Upper bound!");
02433 SUMA_TableF_SetString(TF);
02434 } else {
02435 ColPlane->OptScl->BrightRange[0] = TF->num_value[n];
02436 }
02437 } else if (j==2) {
02438 if (TF->num_value[n] < ColPlane->OptScl->BrightRange[0]) {
02439 SUMA_BEEP; TF->num_value[n] = ColPlane->OptScl->BrightRange[1];
02440 SUMA_SLP_Err("Upper bound < Lower bound!");
02441 SUMA_TableF_SetString(TF);
02442 } else {
02443 ColPlane->OptScl->BrightRange[1] = TF->num_value[n];
02444 }
02445 } else { SUMA_SL_Err("What's going on Ron ?"); }
02446 if (ColPlane->OptScl->UseBrt) NewDisp = YUP;
02447 break;
02448 case 3:
02449 SUMA_LH("Setting BrtMap. Range");
02450 if (j == 1) {
02451 if (TF->num_value[n] > ColPlane->OptScl->BrightMap[1]) {
02452 SUMA_BEEP; TF->num_value[n] = ColPlane->OptScl->BrightMap[0];
02453 SUMA_SLP_Err("Lower bound > Upper bound!");
02454 SUMA_TableF_SetString(TF);
02455 } else if (TF->num_value[n] < 0) {
02456 SUMA_BEEP; TF->num_value[n] = ColPlane->OptScl->BrightMap[0];
02457 SUMA_SLP_Err("Value must be >= 0");
02458 SUMA_TableF_SetString(TF);
02459 } else {
02460 ColPlane->OptScl->BrightMap[0] = TF->num_value[n];
02461 }
02462 } else if (j==2) {
02463 if (TF->num_value[n] < ColPlane->OptScl->BrightMap[0]) {
02464 SUMA_BEEP; TF->num_value[n] = ColPlane->OptScl->BrightMap[1];
02465 SUMA_SLP_Err("Upper bound < Lower bound!");
02466 SUMA_TableF_SetString(TF);
02467 } else {
02468 ColPlane->OptScl->BrightMap[1] = TF->num_value[n];
02469 }
02470 } else { SUMA_SL_Err("What's going on Mon ?"); }
02471 if (ColPlane->OptScl->UseBrt) NewDisp = YUP;
02472 break;
02473 case 4:
02474 SUMA_LH("Setting CoordBias. Range");
02475 if (j == 1) {
02476 if (TF->num_value[n] > ColPlane->OptScl->CoordBiasRange[1]) {
02477 SUMA_BEEP; TF->num_value[n] = ColPlane->OptScl->CoordBiasRange[0];
02478 SUMA_SLP_Err("Lower bound > Upper bound!");
02479 SUMA_TableF_SetString(TF);
02480 } else {
02481 ColPlane->OptScl->CoordBiasRange[0] = TF->num_value[n];
02482 }
02483 } else if (j==2) {
02484 if (TF->num_value[n] < ColPlane->OptScl->CoordBiasRange[0]) {
02485 SUMA_BEEP; TF->num_value[n] = ColPlane->OptScl->CoordBiasRange[1];
02486 SUMA_SLP_Err("Upper bound < Lower bound!");
02487 SUMA_TableF_SetString(TF);
02488 } else {
02489 ColPlane->OptScl->CoordBiasRange[1] = TF->num_value[n];
02490 }
02491 } else { SUMA_SL_Err("What's going on Hon ?"); }
02492 NewDisp = YUP;
02493 break;
02494 default:
02495 SUMA_SL_Err("You make me sick");
02496 break;
02497 }
02498 }
02499
02500
02501 if (NewDisp) {
02502 SUMA_ColorizePlane(SO->SurfCont->curColPlane);
02503 SUMA_RemixRedisplay(SO);
02504 }
02505
02506
02507 if (SO->SurfCont->curColPlane->OptScl->DoBias != SW_CoordBias_None) {
02508 SUMA_UpdateNodeNodeField(SO);
02509 }
02510 SUMA_UpdateNodeLblField(SO);
02511
02512 SUMA_RETURNe;
02513 }
02514
02515
02516
02517
02518 void SUMA_TableF_SetString (SUMA_TABLE_FIELD * TF)
02519 {
02520 static char FuncName[]={"SUMA_TableF_SetString"};
02521 char buf[36];
02522
02523 SUMA_ENTRY;
02524
02525 if (TF->cell_modified < 0) {
02526
02527 SUMA_RETURNe;
02528 }
02529 if (TF->type == SUMA_int) {
02530 sprintf (buf, "%-4d", (int)TF->num_value[TF->cell_modified]);
02531 }else if (TF->type == SUMA_float) {
02532 sprintf (buf, "%s",
02533 MV_format_fval2(TF->num_value[TF->cell_modified], TF->cwidth[TF->cell_modified / TF->Ni]));
02534 }else {
02535
02536 }
02537
02538 XtVaSetValues (TF->cells[TF->cell_modified], XmNvalue, buf, NULL);
02539 SUMA_RETURNe;
02540 }
02541
02542
02543
02544
02545
02546
02547 void SUMA_TableF_cb_label_Modify (Widget w, XtPointer client_data, XtPointer call_data)
02548 {
02549 static char FuncName[]={"SUMA_TableF_cb_label_Modify"};
02550 SUMA_TABLE_FIELD *TF=NULL;
02551 int ud;
02552 static int CurrentCell = -1;
02553 SUMA_Boolean LocalHead = NOPE;
02554
02555 SUMA_ENTRY;
02556 SUMA_LH("Called");
02557 TF = (SUMA_TABLE_FIELD *)client_data ;
02558
02559 if (!TF->editable) {
02560 SUMA_RETURNe;
02561 }
02562 if (TF->cell_modified != -1) {
02563
02564
02565
02566
02567 if (0 && CurrentCell >= 0 && TF->cell_modified != CurrentCell) {
02568 SUMA_SL_Err("cell_modified not reset.");
02569 SUMA_RETURNe;
02570 }
02571 }
02572 XtVaGetValues(w, XmNuserData, &ud, NULL);
02573 if (TF->cell_modified == -1) {
02574
02575 CurrentCell = ud;
02576 }
02577 TF->cell_modified = ud;
02578
02579 SUMA_RETURNe;
02580 }
02581
02582
02583
02584
02585
02586
02587
02588
02589
02590
02591
02592
02593
02594
02595 void SUMA_set_cmap_options(SUMA_SurfaceObject *SO, SUMA_Boolean NewDset, SUMA_Boolean NewMap)
02596 {
02597 static char FuncName[]={"SUMA_set_cmap_options"};
02598 SUMA_MenuItem *SwitchInt_Menu = NULL, *SwitchThr_Menu = NULL, *SwitchBrt_Menu = NULL;
02599 int N_items;
02600 SUMA_Boolean LocalHead = NOPE;
02601
02602 SUMA_ENTRY;
02603
02604 if (!SO) SUMA_RETURNe;
02605 if (!SO->SurfCont) SUMA_RETURNe;
02606 if (!SO->SurfCont->opts_form || !SO->SurfCont->opts_rc) SUMA_RETURNe;
02607 if (!SO->SurfCont->curColPlane) SUMA_RETURNe;
02608 if (!NewDset && !NewMap && SO->SurfCont->rcvo && SO->SurfCont->rccm) {
02609 SUMA_SL_Err("Nothing to do");
02610 SUMA_RETURNe;
02611 }
02612
02613 if (!SO->SurfCont->rcvo){
02614 SO->SurfCont->rcvo = XtVaCreateWidget ("rowcolumn",
02615 xmRowColumnWidgetClass, SO->SurfCont->opts_rc,
02616 XmNpacking, XmPACK_TIGHT,
02617 XmNorientation , XmVERTICAL ,
02618 XmNmarginHeight, 0 ,
02619 XmNmarginWidth , 0 ,
02620 NULL);
02621 NewDset = YUP;
02622 } else {
02623
02624
02625 }
02626
02627 if (NewDset) {
02628 if (!SO->SurfCont->rcsw) {
02629 SO->SurfCont->rcsw = XtVaCreateWidget ("rowcolumn",
02630 xmRowColumnWidgetClass, SO->SurfCont->rcvo,
02631 XmNpacking, XmPACK_TIGHT,
02632 XmNorientation , XmHORIZONTAL ,
02633 XmNheight, 105,
02634 XmNresizeHeight, False,
02635 XmNmarginHeight, 0 ,
02636 XmNmarginWidth , 0 ,
02637 NULL);
02638 } else {
02639
02640
02641 }
02642 if (!SO->SurfCont->rcsw_v1) {
02643 SO->SurfCont->rcsw_v1 = XtVaCreateWidget ("rowcolumn",
02644 xmRowColumnWidgetClass, SO->SurfCont->rcsw,
02645 XmNpacking, XmPACK_COLUMN,
02646 XmNorientation , XmVERTICAL ,
02647 XmNnumColumns, 1,
02648 XmNmarginHeight, 0 ,
02649 XmNmarginWidth , 0 ,
02650 NULL);
02651 }
02652 if (!SO->SurfCont->rcsw_v2) {
02653 SO->SurfCont->rcsw_v2 = XtVaCreateWidget ("rowcolumn",
02654 xmRowColumnWidgetClass, SO->SurfCont->rcsw,
02655 XmNpacking, XmPACK_COLUMN,
02656 XmNorientation , XmVERTICAL ,
02657 XmNnumColumns, 1,
02658 XmNmarginHeight, 0 ,
02659 XmNmarginWidth , 0 ,
02660 NULL);
02661 }
02662 SwitchInt_Menu = SUMA_FormSwitchColMenuVector(SO, 0, &N_items);
02663 if (LocalHead) fprintf (SUMA_STDERR,"%s: %d items.\n", FuncName, N_items);
02664 if (SwitchInt_Menu || !N_items) {
02665 if (SO->SurfCont->SwitchIntMenu) {
02666 SUMA_LH("Freeing old menu");
02667 XtDestroyWidget(SO->SurfCont->SwitchIntMenu[0]);
02668 SUMA_free(SO->SurfCont->SwitchIntMenu);
02669 }
02670
02671
02672 SO->SurfCont->SwitchIntMenu = (Widget *)SUMA_malloc(sizeof(Widget)*(N_items+1));
02673 SUMA_BuildMenuReset(13);
02674 SUMA_BuildMenu (SO->SurfCont->rcsw_v1, XmMENU_OPTION,
02675 "I", '\0', YUP, SwitchInt_Menu,
02676 (void *)SO,
02677 "Select Intensity (I) column",
02678 SUMA_SurfContHelp_SelInt,
02679 SO->SurfCont->SwitchIntMenu );
02680 if (LocalHead) SUMA_ShowMeTheChildren(SO->SurfCont->SwitchIntMenu[0]);
02681 XtManageChild (SO->SurfCont->SwitchIntMenu[0]);
02682
02683 SwitchInt_Menu = SUMA_FreeMenuVector(SwitchInt_Menu, N_items);
02684
02685 XtVaSetValues( SO->SurfCont->SwitchIntMenu[0], XmNmenuHistory ,
02686 SO->SurfCont->SwitchIntMenu[SO->SurfCont->curColPlane->OptScl->find+1] , NULL ) ;
02687 } else {
02688 SUMA_SL_Err("NULL SwitchInt_Menu");
02689 }
02690
02691 SwitchThr_Menu = SUMA_FormSwitchColMenuVector(SO, 1, &N_items);
02692 if (SwitchThr_Menu || !N_items) {
02693 if (SO->SurfCont->SwitchThrMenu) {
02694 SUMA_LH("Freeing old menu");
02695 XtDestroyWidget(SO->SurfCont->SwitchThrMenu[0]);
02696 SUMA_free(SO->SurfCont->SwitchThrMenu);
02697 }
02698
02699
02700 SO->SurfCont->SwitchThrMenu = (Widget *)SUMA_malloc(sizeof(Widget)*(N_items+1));
02701 SUMA_BuildMenuReset(13);
02702 SUMA_BuildMenu (SO->SurfCont->rcsw_v1, XmMENU_OPTION,
02703 "T", '\0', YUP, SwitchThr_Menu,
02704 (void *)SO,
02705 "Select Threshold (T) column",
02706 SUMA_SurfContHelp_SelThr ,
02707 SO->SurfCont->SwitchThrMenu );
02708 XtManageChild (SO->SurfCont->SwitchThrMenu[0]);
02709
02710 SwitchThr_Menu = SUMA_FreeMenuVector(SwitchThr_Menu, N_items);
02711
02712 XtVaSetValues( SO->SurfCont->SwitchThrMenu[0], XmNmenuHistory ,
02713 SO->SurfCont->SwitchThrMenu[SO->SurfCont->curColPlane->OptScl->tind+1] , NULL ) ;
02714 } else {
02715 SUMA_SL_Err("NULL SwitchThr_Menu");
02716 }
02717
02718 SwitchBrt_Menu = SUMA_FormSwitchColMenuVector(SO, 2, &N_items);
02719 if (SwitchBrt_Menu || !N_items) {
02720 if (SO->SurfCont->SwitchBrtMenu) {
02721 SUMA_LH("Freeing old menu");
02722 XtDestroyWidget(SO->SurfCont->SwitchBrtMenu[0]);
02723 SUMA_free(SO->SurfCont->SwitchBrtMenu);
02724 }
02725
02726
02727 SO->SurfCont->SwitchBrtMenu = (Widget *)SUMA_malloc(sizeof(Widget)*(N_items+1));
02728 SUMA_BuildMenuReset(13);
02729 SUMA_BuildMenu (SO->SurfCont->rcsw_v1, XmMENU_OPTION,
02730 "B", '\0', YUP, SwitchBrt_Menu,
02731 (void *)SO,
02732 "Select Brightness (B) column",
02733 SUMA_SurfContHelp_SelBrt,
02734 SO->SurfCont->SwitchBrtMenu );
02735 XtManageChild (SO->SurfCont->SwitchBrtMenu[0]);
02736
02737 SwitchBrt_Menu = SUMA_FreeMenuVector(SwitchBrt_Menu, N_items);
02738
02739 XtVaSetValues( SO->SurfCont->SwitchBrtMenu[0], XmNmenuHistory ,
02740 SO->SurfCont->SwitchBrtMenu[SO->SurfCont->curColPlane->OptScl->bind+1] , NULL ) ;
02741
02742 } else {
02743 SUMA_SL_Err("NULL SwitchBrt_Menu");
02744 }
02745
02746 if (1) {
02747
02748 if (!SO->SurfCont->Int_tb) {
02749 SO->SurfCont->Int_tb = XtVaCreateManagedWidget("v",
02750 xmToggleButtonWidgetClass, SO->SurfCont->rcsw_v2, NULL);
02751 XtAddCallback (SO->SurfCont->Int_tb,
02752 XmNvalueChangedCallback, SUMA_cb_SwithInt_toggled, SO);
02753 MCW_register_hint(SO->SurfCont->Int_tb, "View (ON)/Hide Dset node colors");
02754 MCW_register_help(SO->SurfCont->Int_tb, SUMA_SurfContHelp_SelIntTgl);
02755
02756 SUMA_SET_SELECT_COLOR(SO->SurfCont->Int_tb);
02757 }
02758 XmToggleButtonSetState (SO->SurfCont->Int_tb, SO->SurfCont->curColPlane->Show, NOPE);
02759
02760 if (!SO->SurfCont->Thr_tb) {
02761 SO->SurfCont->Thr_tb = XtVaCreateManagedWidget("v",
02762 xmToggleButtonWidgetClass, SO->SurfCont->rcsw_v2, NULL);
02763 XtAddCallback (SO->SurfCont->Thr_tb,
02764 XmNvalueChangedCallback, SUMA_cb_SwithThr_toggled, SO);
02765 SUMA_SET_SELECT_COLOR(SO->SurfCont->Thr_tb);
02766 MCW_register_hint(SO->SurfCont->Thr_tb, "Apply (ON)/Ignore thresholding");
02767 MCW_register_help(SO->SurfCont->Thr_tb, SUMA_SurfContHelp_SelThrTgl);
02768 }
02769 if (SO->SurfCont->curColPlane->OptScl->tind >=0) {
02770 XmToggleButtonSetState (SO->SurfCont->Thr_tb, SO->SurfCont->curColPlane->OptScl->UseThr, NOPE);
02771 }else {
02772 XmToggleButtonSetState (SO->SurfCont->Thr_tb, NOPE, NOPE);
02773 }
02774
02775 if (!SO->SurfCont->Brt_tb) {
02776 SO->SurfCont->Brt_tb = XtVaCreateManagedWidget("v",
02777 xmToggleButtonWidgetClass, SO->SurfCont->rcsw_v2, NULL);
02778 XtAddCallback (SO->SurfCont->Brt_tb,
02779 XmNvalueChangedCallback, SUMA_cb_SwithBrt_toggled, SO);
02780 SUMA_SET_SELECT_COLOR(SO->SurfCont->Brt_tb);
02781 MCW_register_hint(SO->SurfCont->Brt_tb, "View (ON)/Ignore brightness modulation");
02782 MCW_register_help(SO->SurfCont->Brt_tb, SUMA_SurfContHelp_SelBrtTgl);
02783 }
02784 if (SO->SurfCont->curColPlane->OptScl->bind >=0) {
02785 XmToggleButtonSetState (SO->SurfCont->Brt_tb, SO->SurfCont->curColPlane->OptScl->UseBrt, NOPE);
02786 } else {
02787 XmToggleButtonSetState (SO->SurfCont->Brt_tb, NOPE, NOPE);
02788 }
02789 }
02790 if (!XtIsManaged(SO->SurfCont->rcsw_v1)) XtManageChild (SO->SurfCont->rcsw_v1);
02791 if (!XtIsManaged(SO->SurfCont->rcsw_v2)) XtManageChild (SO->SurfCont->rcsw_v2);
02792 if (!XtIsManaged(SO->SurfCont->rcsw)) XtManageChild (SO->SurfCont->rcsw);
02793 }
02794
02795 {
02796 char *col_tit[]= { " ", "Min", "Max", NULL};
02797 char *col_hint[]= { "Clipping ranges",
02798 "Minimum clip value",
02799 "Maximum clip value" , NULL};
02800 char *col_help[]= { SUMA_SurfContHelp_SetRngTbl_r0,
02801 SUMA_SurfContHelp_SetRngTbl_c1,
02802 SUMA_SurfContHelp_SetRngTbl_c2 , NULL};
02803 char *row_tit[]= { " ", "I", "B", " " , "C", NULL};
02804 char *row_hint[]= { "Clipping ranges ",
02805 "Intensity clipping range (much more with BHelp)",
02806 "Brightness modulation clipping range (much more with BHelp)",
02807 "Brightness modulation factor range (much more with BHelp)" ,
02808 "Coordinate bias range (much more with BHelp)", NULL};
02809 char *row_help[]= { SUMA_SurfContHelp_SetRngTbl_r0,
02810 SUMA_SurfContHelp_SetRngTbl_r1,
02811 SUMA_SurfContHelp_SetRngTbl_r2,
02812 SUMA_SurfContHelp_SetRngTbl_r3,
02813 SUMA_SurfContHelp_SetRngTbl_r4, NULL};
02814 if (!SO->SurfCont->rccm) {
02815 SO->SurfCont->rccm = XtVaCreateWidget ("rowcolumn",
02816 xmRowColumnWidgetClass, SO->SurfCont->rcvo,
02817 XmNpacking, XmPACK_TIGHT,
02818 XmNorientation , XmVERTICAL ,
02819 XmNmarginHeight, 0,
02820 XmNmarginWidth, 0,
02821 NULL);
02822 NewMap = YUP;
02823 }
02824
02825 if (NewMap) {
02826 SUMA_LH("NewMap set");
02827 if (!SO->SurfCont->SetRangeTable->cells) {
02828 int colw[3] = { 1, 8, 8 };
02829
02830 SUMA_LH("Creating table");
02831 SUMA_CreateTable( SO->SurfCont->rccm,
02832 5, 3,
02833 row_tit, col_tit,
02834 row_hint, col_hint,
02835 row_help, col_help,
02836 colw, YUP, SUMA_float,
02837 SUMA_SetRangeValue, (void *)SO,
02838 SUMA_SetRangeTableTit_EV, NULL,
02839 NULL, NULL,
02840 SO->SurfCont->SetRangeTable);
02841 }
02842 if (!SO->SurfCont->CoordBiasMenu[SW_CoordBias]) {
02843 Widget rc = NULL;
02844 rc = XtVaCreateWidget ("rowcolumn",
02845 xmRowColumnWidgetClass, SO->SurfCont->rccm,
02846 XmNpacking, XmPACK_TIGHT,
02847 XmNorientation , XmHORIZONTAL ,
02848 XmNmarginHeight, 0 ,
02849 XmNmarginWidth , 0 ,
02850 NULL);
02851
02852 SUMA_LH("Forming map mode menu");
02853 SUMA_BuildMenuReset(0);
02854 SUMA_BuildMenu ( rc, XmMENU_OPTION,
02855 "Col", '\0', YUP, CmapMode_Menu,
02856 (void *)SO,
02857 "Switch between color mapping modes.",
02858 SUMA_SurfContHelp_Col,
02859 SO->SurfCont->CmapModeMenu);
02860 XtManageChild (SO->SurfCont->CmapModeMenu[SW_CmapMode]);
02861
02862 SUMA_LH("Forming new bias menu");
02863 SUMA_BuildMenuReset(0);
02864 SUMA_BuildMenu ( rc, XmMENU_OPTION,
02865 "Bias", '\0', YUP, CoordBias_Menu,
02866 (void *)SO,
02867 "Coordinate bias direction",
02868 SUMA_SurfContHelp_Bias,
02869 SO->SurfCont->CoordBiasMenu);
02870 XtManageChild (SO->SurfCont->CoordBiasMenu[SW_CoordBias]);
02871
02872 XtManageChild(rc);
02873 }
02874
02875 if (!SO->SurfCont->rccm_swcmap) {
02876 SUMA_LH("Creating rccm_swcmap");
02877 SO->SurfCont->rccm_swcmap = XtVaCreateWidget ("rowcolumn",
02878 xmRowColumnWidgetClass, SO->SurfCont->rccm,
02879 XmNpacking, XmPACK_TIGHT,
02880 XmNorientation , XmHORIZONTAL ,
02881 XmNmarginHeight, 0 ,
02882 XmNmarginWidth , 0 ,
02883 NULL);
02884 }
02885
02886 {
02887 SUMA_CreateUpdatableCmapMenu(SO);
02888
02889 #if 0
02890
02891
02892 if (SO->SurfCont->CmapLoad_pb) {
02893 XtDestroyWidget(SO->SurfCont->CmapLoad_pb);
02894 SO->SurfCont->CmapLoad_pb = NULL;
02895 }
02896 #endif
02897 if (!SO->SurfCont->CmapLoad_pb) {
02898 SUMA_LH("Forming CmapLoad button");
02899 SO->SurfCont->CmapLoad_pb = XtVaCreateManagedWidget ("New",
02900 xmPushButtonWidgetClass, SO->SurfCont->rccm_swcmap,
02901 NULL);
02902 XtAddCallback (SO->SurfCont->CmapLoad_pb, XmNactivateCallback, SUMA_cb_Cmap_Load, (XtPointer) SO);
02903 MCW_register_hint(SO->SurfCont->CmapLoad_pb , "Load new colormap");
02904 MCW_register_help(SO->SurfCont->CmapLoad_pb , SUMA_SurfContHelp_CmpNew);
02905 }
02906 }
02907 if (!XtIsManaged(SO->SurfCont->rccm_swcmap)) XtManageChild (SO->SurfCont->rccm_swcmap);
02908 }
02909
02910 SUMA_LH("Working the lock stuff ...");
02911
02912 if ( SO->SurfCont->IntRangeLocked == SO->SurfCont->curColPlane->OptScl->AutoIntRange) {
02913 SUMA_LH(" Do the Int");
02914
02915 SO->SurfCont->IntRangeLocked = !SO->SurfCont->IntRangeLocked;
02916 MCW_invert_widget(SO->SurfCont->SetRangeTable->cells[1]);
02917 }
02918 if ( SO->SurfCont->BrtRangeLocked == SO->SurfCont->curColPlane->OptScl->AutoBrtRange) {
02919 SUMA_LH(" Do the Brt");
02920
02921 SO->SurfCont->BrtRangeLocked = !SO->SurfCont->BrtRangeLocked;
02922 MCW_invert_widget(SO->SurfCont->SetRangeTable->cells[2]);
02923 }
02924
02925
02926 SUMA_LH("Updating CoorBias chooser History");
02927 XtVaSetValues( SO->SurfCont->CoordBiasMenu[0], XmNmenuHistory ,
02928 SO->SurfCont->CoordBiasMenu[SO->SurfCont->curColPlane->OptScl->DoBias] , NULL ) ;
02929
02930
02931 SUMA_LH("Updating Col chooser History");
02932 XtVaSetValues( SO->SurfCont->CmapModeMenu[0], XmNmenuHistory ,
02933 SO->SurfCont->CmapModeMenu[SO->SurfCont->curColPlane->OptScl->interpmode] , NULL ) ;
02934
02935
02936 if (!SO->SurfCont->AbsThresh_tb) {
02937 Widget rc;
02938 rc = XtVaCreateWidget ("rowcolumn",
02939 xmRowColumnWidgetClass, SO->SurfCont->rccm,
02940 XmNpacking, XmPACK_TIGHT,
02941 XmNorientation , XmHORIZONTAL ,
02942 XmNmarginHeight, 0 ,
02943 XmNmarginWidth , 0 ,
02944 NULL);
02945
02946 SO->SurfCont->AbsThresh_tb = XtVaCreateManagedWidget("|T|",
02947 xmToggleButtonWidgetClass, rc,
02948 NULL);
02949 XtAddCallback (SO->SurfCont->AbsThresh_tb,
02950 XmNvalueChangedCallback, SUMA_cb_AbsThresh_tb_toggled, SO);
02951 MCW_register_hint(SO->SurfCont->AbsThresh_tb , "Absolute threshold ON/OFF");
02952 MCW_register_help(SO->SurfCont->AbsThresh_tb , SUMA_SurfContHelp_AbsThr );
02953
02954 SUMA_SET_SELECT_COLOR(SO->SurfCont->AbsThresh_tb);
02955
02956
02957 SO->SurfCont->SymIrange_tb = XtVaCreateManagedWidget("sym I",
02958 xmToggleButtonWidgetClass, rc, NULL);
02959 XtAddCallback (SO->SurfCont->SymIrange_tb,
02960 XmNvalueChangedCallback, SUMA_cb_SymIrange_tb_toggled, SO);
02961 MCW_register_hint(SO->SurfCont->SymIrange_tb, "Intensity range symmetry about 0 ");
02962 MCW_register_help(SO->SurfCont->SymIrange_tb, SUMA_SurfContHelp_Isym);
02963 SUMA_SET_SELECT_COLOR(SO->SurfCont->SymIrange_tb);
02964
02965
02966 SO->SurfCont->ShowZero_tb = XtVaCreateManagedWidget("shw 0",
02967 xmToggleButtonWidgetClass, rc, NULL);
02968 XtAddCallback (SO->SurfCont->ShowZero_tb,
02969 XmNvalueChangedCallback, SUMA_cb_ShowZero_tb_toggled, SO);
02970 MCW_register_hint(SO->SurfCont->ShowZero_tb, "Color masking of nodes with intensity = 0 ");
02971 MCW_register_help(SO->SurfCont->ShowZero_tb, SUMA_SurfContHelp_Shw0);
02972 SUMA_SET_SELECT_COLOR(SO->SurfCont->ShowZero_tb);
02973 XtManageChild (rc);
02974 }
02975
02976
02977
02978 if (SO->SurfCont->curColPlane->OptScl->ThrMode == SUMA_ABS_LESS_THAN) {
02979 XmToggleButtonSetState( SO->SurfCont->AbsThresh_tb, True, NOPE);
02980 } else {
02981 XmToggleButtonSetState( SO->SurfCont->AbsThresh_tb, False, NOPE);
02982 }
02983 if (!SO->SurfCont->curColPlane->SymIrange) {
02984 XmToggleButtonSetState( SO->SurfCont->SymIrange_tb, False, NOPE);
02985 } else {
02986 XmToggleButtonSetState( SO->SurfCont->SymIrange_tb, True, NOPE);
02987 }
02988 if (!SO->SurfCont->curColPlane->OptScl->MaskZero) {
02989 XmToggleButtonSetState( SO->SurfCont->ShowZero_tb, True, NOPE);
02990 } else {
02991 XmToggleButtonSetState( SO->SurfCont->ShowZero_tb, False, NOPE);
02992 }
02993
02994 if (!XtIsManaged(SO->SurfCont->rccm)) XtManageChild (SO->SurfCont->rccm);
02995
02996 }
02997
02998 if (1){
02999 char *col_tit[]= { " ", "Min", "Node", "Max", "Node", NULL};
03000 char *col_hint[]= { "Full range in Dset",
03001 "Minimum value in Dset column",
03002 "Node index at minimum",
03003 "Maximum value in Dset column",
03004 "Node index at maximum", NULL};
03005 char *col_help[]= { SUMA_SurfContHelp_RangeTbl_c0,
03006 SUMA_SurfContHelp_RangeTbl_c1,
03007 SUMA_SurfContHelp_RangeTbl_c2,
03008 SUMA_SurfContHelp_RangeTbl_c3,
03009 SUMA_SurfContHelp_RangeTbl_c4, NULL};
03010 char *row_tit[]= { " ", "I", "T", "B", NULL};
03011 char *row_hint[]= { "Full range in Dset",
03012 "Range of values in intensity (I) column",
03013 "Range of values in threshold (T) column",
03014 "Range of values in brightness (B) column", NULL};
03015 char *row_help[]= { SUMA_SurfContHelp_RangeTbl_c0,
03016 SUMA_SurfContHelp_RangeTbl_r1,
03017 SUMA_SurfContHelp_RangeTbl_r2,
03018 SUMA_SurfContHelp_RangeTbl_r3, NULL};
03019 if (!SO->SurfCont->rcswr) {
03020 SO->SurfCont->rcswr = XtVaCreateWidget ("rowcolumn",
03021 xmRowColumnWidgetClass, SO->SurfCont->opts_form,
03022 XmNpacking, XmPACK_TIGHT,
03023 XmNorientation , XmVERTICAL ,
03024 XmNrightAttachment, XmATTACH_FORM ,
03025 XmNleftAttachment, XmATTACH_NONE,
03026 XmNtopAttachment, XmATTACH_WIDGET ,
03027 XmNtopWidget, SO->SurfCont->opts_rc,
03028 NULL);
03029 }
03030
03031 if (!SO->SurfCont->RangeTable->cells) {
03032 int colw[5] = { 1, 6, 6, 6, 6 };
03033
03034 SUMA_CreateTable( SO->SurfCont->rcswr,
03035 4, 5,
03036 row_tit, col_tit,
03037 row_hint, col_hint,
03038 row_help, col_help,
03039 colw, NOPE, SUMA_string,
03040 NULL, NULL,
03041 NULL, NULL,
03042 SUMA_RangeTableCell_EV, (void *)SO,
03043 SO->SurfCont->RangeTable);
03044 }
03045
03046 if (!XtIsManaged(SO->SurfCont->rcswr)) XtManageChild (SO->SurfCont->rcswr);
03047 }
03048
03049 if (NewDset) {
03050
03051 SUMA_InitRangeTable(SO, 2);
03052 }
03053
03054 if (!XtIsManaged(SO->SurfCont->rcvo)) XtManageChild (SO->SurfCont->rcvo);
03055 SUMA_FORCE_SCALE_HEIGHT(SO);
03056
03057 SUMA_RETURNe;
03058 }
03059
03060
03061
03062
03063
03064
03065
03066 void SUMA_CreateUpdatableCmapMenu(SUMA_SurfaceObject *SO)
03067 {
03068 static char FuncName[]={"SUMA_CreateUpdatableCmapMenu"};
03069 SUMA_MenuItem *SwitchCmap_Menu = NULL;
03070 SUMA_Boolean LocalHead = NOPE;
03071
03072 SUMA_ENTRY;
03073
03074 if (!SUMAg_CF->scm) {
03075 SUMAg_CF->scm = SUMA_Build_Color_maps();
03076 if (!SUMAg_CF->scm) {
03077 SUMA_SL_Err("Failed to build color maps.\n");
03078 SUMA_RETURNe;
03079 }
03080 }
03081
03082 if (!SO->SurfCont->rc_CmapCont) {
03083 SO->SurfCont->rc_CmapCont = XtVaCreateWidget ("rowcolumn",
03084 xmRowColumnWidgetClass, SO->SurfCont->rccm_swcmap,
03085 XmNpacking, XmPACK_TIGHT,
03086 XmNorientation , XmHORIZONTAL ,
03087 XmNmarginHeight, 0 ,
03088 XmNmarginWidth , 0 ,
03089 NULL);
03090 }
03091
03092 SUMA_LH("Forming CmapMenu");
03093 SwitchCmap_Menu = SUMA_FormSwitchCmapMenuVector(SUMAg_CF->scm->CMv, SUMAg_CF->scm->N_maps);
03094 if (SwitchCmap_Menu) {
03095
03096
03097
03098
03099
03100 if (SO->SurfCont->SwitchCmapMenu) {
03101 SUMA_LH("Freeing old menu");
03102 XtDestroyWidget(SO->SurfCont->SwitchCmapMenu[0]);
03103 SUMA_free(SO->SurfCont->SwitchCmapMenu);
03104 }
03105
03106
03107 SO->SurfCont->SwitchCmapMenu = (Widget *)SUMA_malloc(sizeof(Widget)*(SUMAg_CF->scm->N_maps+1));
03108 SUMA_BuildMenuReset(10);
03109 SO->SurfCont->N_CmapMenu = SUMA_BuildMenu (SO->SurfCont->rc_CmapCont, XmMENU_OPTION,
03110 "Cmp", '\0', YUP, SwitchCmap_Menu,
03111 (void *)SO,
03112 "Switch between available color maps. (BHelp for more)",
03113 SUMA_SurfContHelp_Cmp,
03114 SO->SurfCont->SwitchCmapMenu );
03115 XtInsertEventHandler( SO->SurfCont->SwitchCmapMenu[0] ,
03116 ButtonPressMask ,
03117 FALSE ,
03118 SUMA_optmenu_EV ,
03119 (XtPointer) SO ,
03120 XtListTail ) ;
03121 XtManageChild (SO->SurfCont->SwitchCmapMenu[0]);
03122
03123 SwitchCmap_Menu = SUMA_FreeMenuVector(SwitchCmap_Menu, SUMAg_CF->scm->N_maps);
03124 }
03125
03126 XtManageChild(SO->SurfCont->rc_CmapCont);
03127
03128 SUMA_RETURNe;
03129 }
03130
03131
03132
03133
03134
03135
03136
03137
03138
03139
03140
03141 SUMA_Boolean SUMA_InitRangeTable(SUMA_SurfaceObject *SO, int what)
03142 {
03143 static char FuncName[]={"SUMA_InitRangeTable"};
03144 char srange_min[50], srange_max[50], srange_minloc[50], srange_maxloc[50];
03145 SUMA_TABLE_FIELD *TF, *TFs;
03146 int i, j, i1D, fi, bi, ti;
03147 float range[2];
03148 NI_element *nel;
03149 SUMA_SCALE_TO_MAP_OPT *OptScl;
03150 SUMA_Boolean DoIs = NOPE, DoBs = NOPE, ColorizeBaby;
03151 SUMA_Boolean LocalHead = NOPE;
03152
03153 SUMA_ENTRY;
03154
03155 if (!SO->SurfCont) SUMA_RETURN(NOPE);
03156 TF = SO->SurfCont->RangeTable;
03157 TFs = SO->SurfCont->SetRangeTable;
03158 if (!TF || !TFs) SUMA_RETURN(NOPE);
03159 OptScl = SO->SurfCont->curColPlane->OptScl;
03160 fi = OptScl->find;
03161 ti = OptScl->tind;
03162 bi = OptScl->bind;
03163 ColorizeBaby = NOPE;
03164
03165 switch (what) {
03166 case -1:
03167 DoIs = NOPE;
03168 DoBs = NOPE;
03169 break;
03170 case 2:
03171 DoIs = YUP;
03172 DoBs = YUP;
03173 break;
03174 case 0:
03175 DoIs = YUP;
03176 break;
03177 case 1:
03178 DoBs = YUP;
03179 break;
03180 default:
03181 SUMA_SL_Err("That's stupid Joe!");
03182 SUMA_RETURN(NOPE);
03183 break;
03184 }
03185
03186
03187 SUMA_LH("Setting Int.");
03188 SUMA_RANGE_STRING(SO->SurfCont->curColPlane->dset_link, fi, srange_min, srange_max, srange_minloc, srange_maxloc, range);
03189 SUMA_INSERT_CELL_STRING(TF, 1, 1, srange_min);
03190 SUMA_INSERT_CELL_STRING(TF, 1, 2, srange_minloc);
03191 SUMA_INSERT_CELL_STRING(TF, 1, 3, srange_max);
03192 SUMA_INSERT_CELL_STRING(TF, 1, 4, srange_maxloc);
03193
03194 if (DoIs) {
03195 if (SO->SurfCont->curColPlane->OptScl->AutoIntRange) {
03196 if (!SO->SurfCont->curColPlane->ForceIntRange[0] && !SO->SurfCont->curColPlane->ForceIntRange[1]) {
03197 if ( OptScl->IntRange[0] != range[0] ||
03198 OptScl->IntRange[1] != range[1] ) {
03199 ColorizeBaby = YUP;
03200 OptScl->IntRange[0] = range[0]; OptScl->IntRange[1] = range[1];
03201 }
03202 } else {
03203 SUMA_LH("Using ForceIntRange");
03204 if ( OptScl->IntRange[0] != SO->SurfCont->curColPlane->ForceIntRange[0] ||
03205 OptScl->IntRange[1] != SO->SurfCont->curColPlane->ForceIntRange[1] ) {
03206 ColorizeBaby = YUP;
03207 OptScl->IntRange[0] = SO->SurfCont->curColPlane->ForceIntRange[0];
03208 OptScl->IntRange[1] = SO->SurfCont->curColPlane->ForceIntRange[1];
03209 }
03210 }
03211
03212
03213 if (SO->SurfCont->curColPlane->SymIrange) {
03214 if ( OptScl->IntRange[1] != SUMA_LARG_ABS(OptScl->IntRange[0], OptScl->IntRange[1]) ||
03215 OptScl->IntRange[0] != -OptScl->IntRange[1]) {
03216 ColorizeBaby = YUP;
03217 OptScl->IntRange[1] = SUMA_LARG_ABS(OptScl->IntRange[0], OptScl->IntRange[1]);
03218 OptScl->IntRange[0] = -OptScl->IntRange[1];
03219 }
03220 }
03221
03222 SUMA_INSERT_CELL_VALUE(TFs, 1, 1, OptScl->IntRange[0]);
03223 SUMA_INSERT_CELL_VALUE(TFs, 1, 2, OptScl->IntRange[1]);
03224 }else {
03225
03226 SUMA_LH("Imposing...");
03227 if ( OptScl->IntRange[0] != TFs->num_value[1*TFs->Ni+1] ||
03228 OptScl->IntRange[1] != TFs->num_value[2*TFs->Ni+1] ) {
03229 SUMA_INSERT_CELL_VALUE(TFs, 1, 1, OptScl->IntRange[0]);
03230 SUMA_INSERT_CELL_VALUE(TFs, 1, 2, OptScl->IntRange[1]);
03231 }
03232 }
03233 }
03234
03235 SUMA_LH("Setting Thr.");
03236 SUMA_RANGE_STRING(SO->SurfCont->curColPlane->dset_link, ti, srange_min, srange_max, srange_minloc, srange_maxloc, range);
03237 SUMA_INSERT_CELL_STRING(TF, 2, 1, srange_min);
03238 SUMA_INSERT_CELL_STRING(TF, 2, 2, srange_minloc);
03239 SUMA_INSERT_CELL_STRING(TF, 2, 3, srange_max);
03240 SUMA_INSERT_CELL_STRING(TF, 2, 4, srange_maxloc);
03241
03242
03243 SUMA_LH("Setting Brt.");
03244 SUMA_RANGE_STRING(SO->SurfCont->curColPlane->dset_link, bi, srange_min, srange_max, srange_minloc, srange_maxloc, range);
03245 SUMA_INSERT_CELL_STRING(TF, 3, 1, srange_min);
03246 SUMA_INSERT_CELL_STRING(TF, 3, 2, srange_minloc);
03247 SUMA_INSERT_CELL_STRING(TF, 3, 3, srange_max);
03248 SUMA_INSERT_CELL_STRING(TF, 3, 4, srange_maxloc);
03249
03250 if (DoBs) {
03251 if (SO->SurfCont->curColPlane->OptScl->AutoBrtRange) {
03252 if ( OptScl->BrightRange[0] != range[0] ||
03253 OptScl->BrightRange[1] != range[1] ) {
03254 ColorizeBaby = YUP;
03255 OptScl->BrightRange[0] = range[0]; OptScl->BrightRange[1] = range[1];
03256 }
03257 SUMA_INSERT_CELL_VALUE(TFs, 2, 1, OptScl->BrightRange[0]);
03258 SUMA_INSERT_CELL_VALUE(TFs, 2, 2, OptScl->BrightRange[1]);
03259
03260 SUMA_INSERT_CELL_VALUE(TFs, 3, 1, OptScl->BrightMap[0]);
03261 SUMA_INSERT_CELL_VALUE(TFs, 3, 2, OptScl->BrightMap[1]);
03262 } else {
03263
03264 if ( OptScl->BrightRange[0] != TFs->num_value[1*TFs->Ni+2] ||
03265 OptScl->BrightRange[1] != TFs->num_value[2*TFs->Ni+2] ||
03266 OptScl->BrightMap[0] != TFs->num_value[1*TFs->Ni+3] ||
03267 OptScl->BrightMap[1] != TFs->num_value[2*TFs->Ni+3] ) {
03268 SUMA_INSERT_CELL_VALUE(TFs, 2, 1, OptScl->BrightRange[0]);
03269 SUMA_INSERT_CELL_VALUE(TFs, 2, 2, OptScl->BrightRange[1]);
03270
03271 SUMA_INSERT_CELL_VALUE(TFs, 3, 1, OptScl->BrightMap[0]);
03272 SUMA_INSERT_CELL_VALUE(TFs, 3, 2, OptScl->BrightMap[1]);
03273 }
03274 }
03275 }
03276
03277
03278 SUMA_INSERT_CELL_VALUE(TFs, 4, 1, OptScl->CoordBiasRange[0]);
03279 SUMA_INSERT_CELL_VALUE(TFs, 4, 2, OptScl->CoordBiasRange[1]);
03280
03281 if (ColorizeBaby) {
03282 if (!SUMA_ColorizePlane (SO->SurfCont->curColPlane)) {
03283 SUMA_SLP_Err("Failed to colorize plane.\n");
03284 SUMA_RETURN(NOPE);
03285 }
03286 }
03287 SUMA_RETURN(YUP);
03288 }
03289
03290 SUMA_ASSEMBLE_LIST_STRUCT * SUMA_AssembleCmapList(SUMA_COLOR_MAP **CMv, int N_maps)
03291 {
03292 static char FuncName[]={"SUMA_AssembleCmapList"};
03293 SUMA_ASSEMBLE_LIST_STRUCT *clist_str = NULL;
03294 int i;
03295 SUMA_Boolean LocalHead = NOPE;
03296
03297 SUMA_ENTRY;
03298
03299 clist_str = SUMA_CreateAssembleListStruct();
03300 clist_str->clist = (char **)SUMA_calloc(N_maps, sizeof(char *));
03301 clist_str->oplist = (void **)SUMA_calloc(N_maps, sizeof(void *));
03302 clist_str->N_clist = N_maps;
03303
03304 for (i=0; i<N_maps; ++i) {
03305 clist_str->clist[i] = SUMA_copy_string(CMv[i]->Name);
03306 clist_str->oplist[i] = (void*)CMv[i];
03307 }
03308
03309 SUMA_RETURN(clist_str);
03310 }
03311
03312
03313
03314
03315 SUMA_Boolean SUMA_DsetColSelectList(SUMA_SurfaceObject *SO, int type)
03316 {
03317 static char FuncName[]={"SUMA_DsetColSelectList"};
03318 SUMA_LIST_WIDGET *LW = NULL;
03319 SUMA_Boolean LocalHead = NOPE;
03320
03321 SUMA_ENTRY;
03322
03323 SUMA_LH("Called");
03324
03325 SUMA_RETURN(YUP);
03326 }
03327
03328
03329
03330 SUMA_Boolean SUMA_CmapSelectList(SUMA_SurfaceObject *SO, int refresh, int bringup)
03331 {
03332 static char FuncName[]={"SUMA_CmapSelectList"};
03333 SUMA_LIST_WIDGET *LW = NULL;
03334 SUMA_Boolean LocalHead = NOPE;
03335
03336 SUMA_ENTRY;
03337
03338 if (!SUMAg_CF->scm) {
03339 SUMAg_CF->scm = SUMA_Build_Color_maps();
03340 if (!SUMAg_CF->scm) {
03341 SUMA_SL_Err("Failed to build color maps.\n");
03342 SUMA_RETURN(NOPE);
03343 }
03344 }
03345
03346
03347 LW = SUMAg_CF->X->SwitchCmapLst;
03348
03349 if (!LW) {
03350 SUMA_LH("Allocating widget");
03351
03352 LW = SUMA_AllocateScrolledList ( "Switch Cmap", SUMA_LSP_SINGLE,
03353 NOPE, NOPE,
03354 SO->SurfCont->TopLevelShell, SWP_POINTER_OFF,
03355 SUMA_cb_SelectSwitchCmap, (void *)SO,
03356 SUMA_cb_SelectSwitchCmap, (void *)SO,
03357 SUMA_cb_CloseSwitchCmap, NULL);
03358
03359 SUMAg_CF->X->SwitchCmapLst = LW;
03360 refresh = 1;
03361 } else {
03362 if ((void *)SO != LW->Default_Data || (void *)SO != LW->Select_Data) {
03363
03364 SUMA_UpdateScrolledListData(LW, (void *)SO, (void *)SO, NULL);
03365 }
03366 }
03367
03368 if (refresh) {
03369
03370 if (LW->ALS) {
03371 if (LocalHead) SUMA_S_Err("Freeing the hag.");
03372 LW->ALS = SUMA_FreeAssembleListStruct(LW->ALS);
03373 }
03374 SUMA_LH("Assembling");
03375 LW->ALS = SUMA_AssembleCmapList(SUMAg_CF->scm->CMv, SUMAg_CF->scm->N_maps);
03376 if (!LW->ALS) {
03377 SUMA_SL_Err("Failed to assemble list");
03378 SUMA_RETURN(NOPE);
03379 }
03380 if (LW->ALS->N_clist < 0) {
03381 SUMA_SL_Err("Failed in SUMA_AssembleCmapList");
03382 SUMA_RETURN(NOPE);
03383 }
03384 if (!LW->ALS->N_clist) {
03385 SUMA_SLP_Note ("No cmaps to choose from.");
03386 SUMA_RETURN(NOPE);
03387 }
03388 }
03389
03390 if (bringup) SUMA_CreateScrolledList ( LW->ALS->clist, LW->ALS->N_clist, NOPE, LW);
03391
03392 SUMA_RETURN(YUP);
03393 }
03394
03395
03396
03397
03398
03399 SUMA_Boolean SUMA_SetCmapMenuChoice(SUMA_SurfaceObject *SO, char *str)
03400 {
03401 static char FuncName[]={"SUMA_SetCmapMenuChoice"};
03402 int i, Nbutt = 0;
03403 Widget whist, *w = NULL;
03404 SUMA_Boolean LocalHead = NOPE;
03405
03406 SUMA_ENTRY;
03407
03408 w = SO->SurfCont->SwitchCmapMenu;
03409 if (!w) SUMA_RETURN(NOPE);
03410
03411
03412 XtVaGetValues( w[0], XmNmenuHistory , &whist , NULL ) ;
03413 if (!whist) {
03414 SUMA_SL_Err("NULL whist!");
03415 SUMA_RETURN(NOPE);
03416 }
03417
03418 if (LocalHead) {
03419 fprintf (SUMA_STDERR,"%s: The history is NAMED: %s (%d buttons total)\n", FuncName, XtName(whist), Nbutt);
03420 }
03421
03422
03423
03424 for (i=0; i< SO->SurfCont->N_CmapMenu; ++i) {
03425 if (LocalHead) fprintf (SUMA_STDERR,"I have %s\n", XtName(w[i]));
03426 if (strcmp(str, XtName(w[i])) == 0) {
03427 SUMA_LH("Match!");
03428 XtVaSetValues( w[0], XmNmenuHistory , w[i] , NULL ) ;
03429 SUMA_RETURN(YUP);
03430 }
03431 }
03432
03433 SUMA_RETURN(NOPE);
03434 }
03435
03436
03437
03438
03439
03440 void SUMA_cb_SelectSwitchCmap (Widget w, XtPointer client_data, XtPointer call_data)
03441 {
03442 static char FuncName[]={"SUMA_cb_SelectSwitchCmap"};
03443 SUMA_SurfaceObject *SO = NULL;
03444 SUMA_MenuCallBackData data;
03445 SUMA_LIST_WIDGET *LW = NULL;
03446 SUMA_Boolean CloseShop = NOPE, Found = NOPE;
03447 XmListCallbackStruct *cbs = (XmListCallbackStruct *) call_data;
03448 char *choice=NULL;
03449 int ichoice = -1;
03450 SUMA_COLOR_MAP *CM = NULL;
03451 SUMA_Boolean LocalHead = NOPE;
03452
03453 SUMA_ENTRY;
03454
03455 SUMA_LH("Called");
03456 SO = (SUMA_SurfaceObject *)client_data;
03457 LW = SUMAg_CF->X->SwitchCmapLst;
03458
03459 if (!LW) {
03460 SUMA_S_Err("NULL LW!");
03461 SUMA_RETURNe;
03462 }
03463
03464
03465 if (cbs->reason == XmCR_SINGLE_SELECT) {
03466 if (LocalHead) fprintf (SUMA_STDERR,"%s: Single selection, list widget %s... \n", FuncName, LW->Label);
03467 } else {
03468 if (LocalHead) fprintf (SUMA_STDERR,"%s: Default selection, list widget %s... \n", FuncName, LW->Label);
03469
03470 CloseShop = YUP;
03471 }
03472
03473 XmStringGetLtoR (cbs->item, XmFONTLIST_DEFAULT_TAG, &choice);
03474
03475 if (LocalHead) fprintf (SUMA_STDERR,"%s: Selected item: %s {%s} (%d)\n", FuncName, choice, choice, cbs->item_position);
03476
03477 Found = NOPE;
03478 ichoice = 0;
03479 do {
03480 if (LocalHead) fprintf (SUMA_STDERR,"%s: Comparing:\n%s\n%s\n", FuncName, LW->ALS->clist[ichoice], choice);
03481 if (strncmp(LW->ALS->clist[ichoice], choice, strlen(choice)) == 0) Found = YUP;
03482 else ++ichoice;
03483 } while (ichoice < LW->ALS->N_clist && !Found);
03484
03485 if (!Found) {
03486 SUMA_SLP_Err("Choice not found.");
03487 SUMA_RETURNe;
03488 }
03489
03490 XtFree (choice);
03491
03492
03493 if (LW->ALS) {
03494 if (LocalHead) fprintf (SUMA_STDERR,"%s: N_clist = %d\n", FuncName, LW->ALS->N_clist);
03495 if (LW->ALS->N_clist > ichoice) {
03496 CM = (SUMA_COLOR_MAP *)LW->ALS->oplist[ichoice];
03497 if (LocalHead) fprintf (SUMA_STDERR,"%s: Retrieved Colmap named %s\n", FuncName, CM->Name);
03498
03499 if (!SUMA_SetCmapMenuChoice (SO, LW->ALS->clist[ichoice])) {
03500 SUMA_SL_Err("Failed in SUMA_SetCmapMenuChoice");
03501 }
03502 if (!SUMA_SwitchColPlaneCmap(SO, CM)) {
03503 SUMA_SL_Err("Failed in SUMA_SwitchColPlaneCmap");
03504 }
03505 }
03506 } else {
03507 if (LocalHead) fprintf (SUMA_STDERR,"%s: NULL ALS\n", FuncName);
03508 }
03509
03510 if (CloseShop) {
03511 SUMA_cb_CloseSwitchCmap( w, (XtPointer)LW, call_data);
03512 }
03513
03514
03515 SUMA_UpdateNodeLblField(SO);
03516
03517 SUMA_RETURNe;
03518 }
03519
03520 SUMA_Boolean SUMA_SwitchColPlaneCmap(SUMA_SurfaceObject *SO, SUMA_COLOR_MAP *CM)
03521 {
03522 static char FuncName[]={"SUMA_SwitchColPlaneCmap"};
03523 SUMA_OVERLAYS *over = NULL;
03524 SUMA_Boolean LocalHead = NOPE;
03525
03526 SUMA_ENTRY;
03527
03528 SUMA_LH("Called");
03529 if (!SO || !CM) { SUMA_RETURN(NOPE); }
03530 if (!SO->SurfCont) { SUMA_RETURN(NOPE); }
03531
03532 over = SO->SurfCont->curColPlane;
03533 if (!over) { SUMA_RETURN(NOPE); }
03534
03535 SUMA_STRING_REPLACE(over->cmapname, CM->Name);
03536 if (!SUMA_ColorizePlane (over)) {
03537 SUMA_SLP_Err("Failed to colorize plane.\n");
03538 SUMA_RETURN(NOPE);
03539 }
03540
03541
03542 SO->SurfCont->cmp_ren->FOV = SUMA_CMAP_FOV_INITIAL;
03543 SO->SurfCont->cmp_ren->translateVec[0] = SO->SurfCont->cmp_ren->translateVec[1] = SO->SurfCont->cmp_ren->translateVec[2] = 0.0;
03544
03545
03546 SUMA_cmap_wid_postRedisplay(NULL, (XtPointer)SO, NULL);
03547
03548 SUMA_RemixRedisplay(SO);
03549
03550
03551 SUMA_RETURN(YUP);
03552 }
03553
03554
03555
03556
03557 void SUMA_cb_CloseSwitchCmap (Widget w, XtPointer client_data, XtPointer call)
03558 {
03559 static char FuncName[]={"SUMA_cb_CloseSwitchCmap"};
03560 SUMA_LIST_WIDGET *LW = NULL;
03561 SUMA_Boolean LocalHead = NOPE;
03562
03563 SUMA_ENTRY;
03564
03565 SUMA_LH("Called");
03566
03567 LW = (SUMA_LIST_WIDGET *)client_data;
03568
03569 #if defined SUMA_USE_WITHDRAW
03570 if (LocalHead) fprintf (SUMA_STDERR,"%s: Withdrawing list widget %s...\n", FuncName, LW->Label);
03571
03572 XWithdrawWindow(SUMAg_CF->X->DPY_controller1,
03573 XtWindow(LW->toplevel),
03574 XScreenNumberOfScreen(XtScreen(LW->toplevel)));
03575 #elif defined SUMA_USE_DESTROY
03576 if (LocalHead) fprintf (SUMA_STDERR,"%s: Destroying list widget %s...\n", FuncName, LW->Label);
03577 XtDestroyWidget(LW->toplevel);
03578 LW->toplevel = NULL;
03579 #endif
03580
03581 LW->isShaded = YUP;
03582
03583
03584
03585 SUMA_RETURNe;
03586 }
03587
03588
03589 void SUMA_optmenu_EV( Widget w , XtPointer cd ,
03590 XEvent *ev , Boolean *continue_to_dispatch )
03591 {
03592 static char FuncName[]={"SUMA_optmenu_EV"};
03593 Dimension lw ;
03594 Widget * children , wl = NULL;
03595 XButtonEvent * bev = (XButtonEvent *) ev ;
03596 int num_children , ic ;
03597 SUMA_SurfaceObject *SO = (SUMA_SurfaceObject *)cd;
03598 SUMA_Boolean LocalHead = NOPE;
03599
03600 SUMA_ENTRY;
03601
03602 SUMA_LH("Called");
03603
03604
03605 if( bev->button == Button2 ){
03606 XUngrabPointer( bev->display , CurrentTime ) ;
03607 SUMA_RETURNe ;
03608 }
03609
03610 if( w == NULL || SO == NULL ) SUMA_RETURNe ;
03611
03612 if( bev->button != Button3 ) SUMA_RETURNe ;
03613
03614 if (LocalHead) {
03615 SUMA_LH("Les enfants de w");
03616 SUMA_ShowMeTheChildren(w);
03617 }
03618
03619
03620 wl = XtNameToWidget(w, "OptionLabel");
03621 if (!wl) {
03622 SUMA_SL_Err("Failed to find la widget");
03623 } else {
03624 XtVaGetValues( wl , XmNwidth, &lw , NULL ) ;
03625 if( bev->x > lw ) SUMA_RETURNe ;
03626 }
03627
03628
03629 SUMA_LH("Now creating list ");
03630 if (strcmp(XtName(w), "I") == 0) {
03631 if (!SUMA_DsetColSelectList(SO, 0)) {
03632 SUMA_SLP_Err("Failed to create DsetList");
03633 SUMA_RETURNe;
03634 }
03635 } else if (strcmp(XtName(w), "T") == 0){
03636 if (!SUMA_DsetColSelectList(SO, 1)) {
03637 SUMA_SLP_Err("Failed to create DsetList");
03638 SUMA_RETURNe;
03639 }
03640 } else if (strcmp(XtName(w), "B") == 0){
03641 if (!SUMA_DsetColSelectList(SO, 2)) {
03642 SUMA_SLP_Err("Failed to create DsetList");
03643 SUMA_RETURNe;
03644 }
03645 } else if (strcmp(XtName(w), "Cmp") == 0){
03646 if (!SUMA_CmapSelectList(SO, 0, 1)) {
03647 SUMA_SLP_Err("Failed to create DsetList");
03648 SUMA_RETURNe;
03649 }
03650 } else {
03651 SUMA_SLP_Err("wahtchyoutalkinaboutwillis?");
03652 SUMA_RETURNe;
03653 }
03654 SUMA_RETURNe;
03655
03656 }
03657
03658
03659 void SUMA_CreateXhairWidgets(Widget parent, SUMA_SurfaceObject *SO)
03660 {
03661 static char FuncName[]={"SUMA_CreateXhairWidgets"};
03662 char *Xhair_tit[]= { "Xhr ", NULL};
03663 char *Xhair_hint[]= { "Crosshair coordinates.", NULL};
03664 char *Xhair_help[]= { SUMA_SurfContHelp_Xhr , NULL};
03665 char *Node_tit[]= { "Node" , NULL};
03666 char *Node_hint[]= { "Node index", NULL};
03667 char *Node_help[]= { SUMA_SurfContHelp_Node , NULL};
03668 char *Face_tit[]= { "Tri ", NULL};
03669 char *Face_hint[]= { "1- Triangle index, 2- Nodes forming tiangle", NULL};
03670 char *Face_help[]= { SUMA_SurfContHelp_Tri , NULL};
03671 char *Data_tit[]= { " ", "Intens", "Thresh", "Bright" , NULL};
03672 char *Data_colhint[]= { "Data Values at node in focus",
03673 "Intensity (I) value",
03674 "Threshold (T) value",
03675 "Brightness modulation (B) value" , NULL};
03676 char *Data_colhelp[]= { SUMA_SurfContHelp_NodeValTblc0,
03677 SUMA_SurfContHelp_NodeValTblc1,
03678 SUMA_SurfContHelp_NodeValTblc2,
03679 SUMA_SurfContHelp_NodeValTblc3 , NULL};
03680
03681 char *Data_rtit[]= { " ", "Val " , NULL};
03682 char *Data_rowhint[]= { "Data Values at node in focus",
03683 "Data Values at node in focus" , NULL};
03684 char *Data_rowhelp[]= { SUMA_SurfContHelp_NodeValTblr0,
03685 SUMA_SurfContHelp_NodeValTblr0 , NULL};
03686
03687 char *Label_tit[]= { "Lbl ", NULL};
03688 char *Label_hint[]= { "Color at node in focus", NULL};
03689 char *Label_help[]= { SUMA_SurfContHelp_NodeLabelTblr0 , NULL};
03690
03691 Widget rcc;
03692
03693 SUMA_Boolean LocalHead = NOPE;
03694
03695 SUMA_ENTRY;
03696
03697
03698 rcc = XtVaCreateWidget ("rowcolumn",
03699 xmRowColumnWidgetClass, parent,
03700 XmNpacking, XmPACK_TIGHT,
03701 XmNleftAttachment,XmATTACH_FORM ,
03702 XmNorientation , XmVERTICAL ,
03703 XmNmarginHeight , 0 ,
03704 XmNmarginWidth , 0 ,
03705 NULL);
03706
03707
03708 SUMA_LH("Creating Xhair coordinates table");
03709 {
03710 int colw[] = { 4, 27 };
03711 SUMA_CreateTable(rcc,
03712 1, 2,
03713 Xhair_tit, NULL,
03714 Xhair_hint, NULL,
03715 Xhair_help, NULL,
03716 colw, YUP, SUMA_string,
03717 SUMA_XhairInput, (void*)SO,
03718 NULL, NULL,
03719 NULL, NULL,
03720 SO->SurfCont->XhairTable);
03721 }
03722
03723 SUMA_LH("Creating node table");
03724 {
03725 int colw[]={4, 6, 19};
03726 SUMA_CreateTable(rcc,
03727 1, 3,
03728 Node_tit, NULL,
03729 Node_hint, NULL,
03730 Node_help, NULL,
03731 colw, YUP, SUMA_int,
03732 SUMA_NodeInput, (void*)SO,
03733 NULL, NULL,
03734 NULL, NULL,
03735 SO->SurfCont->NodeTable);
03736
03737 SUMA_SetCellEditMode(SO->SurfCont->NodeTable, 0, 2, 0);
03738 }
03739
03740 SUMA_LH("Creating Face table");
03741 {
03742 int colw[]={4, 6, 19} ;
03743 SUMA_CreateTable(rcc,
03744 1, 3,
03745 Face_tit, NULL,
03746 Face_hint, NULL,
03747 Face_help, NULL,
03748 colw, YUP, SUMA_int,
03749 SUMA_TriInput, (void*)SO,
03750 NULL, NULL,
03751 NULL, NULL,
03752 SO->SurfCont->FaceTable);
03753
03754 SUMA_SetCellEditMode(SO->SurfCont->FaceTable, 0, 2, 0);
03755 }
03756
03757 SUMA_LH("Creating Dset Val table");
03758 {
03759 int colw[]={ 4, 7, 7, 7};
03760 SUMA_CreateTable(rcc,
03761 2, 4,
03762 Data_rtit, Data_tit,
03763 Data_rowhint, Data_colhint,
03764 Data_rowhelp, Data_colhelp,
03765 colw, NOPE, SUMA_float,
03766 NULL, NULL,
03767 NULL, NULL,
03768 NULL, NULL,
03769 SO->SurfCont->DataTable);
03770 }
03771
03772 SUMA_LH("Creating label table");
03773 {
03774 int colw[]={4, 26};
03775 SUMA_CreateTable(rcc,
03776 1, 2,
03777 Label_tit, NULL,
03778 Label_hint, NULL,
03779 Label_help, NULL,
03780 colw, NOPE, SUMA_string,
03781 NULL, NULL,
03782 NULL, NULL,
03783 NULL, NULL,
03784 SO->SurfCont->LabelTable);
03785 }
03786 XtManageChild(rcc);
03787 SUMA_RETURNe;
03788
03789 }
03790
03791 void SUMA_CreateCmapWidgets(Widget parent, SUMA_SurfaceObject *SO)
03792 {
03793 static char FuncName[]={"SUMA_CreateCmapWidgets"};
03794 char slabel[100];
03795 Widget rct, rcc, rco;
03796 XtVarArgsList arglist=NULL;
03797 SUMA_Boolean LocalHead = NOPE;
03798
03799 SUMA_ENTRY;
03800
03801 if (SO->SurfCont->opts_rc) {
03802 SUMA_SL_Err("Non null opts_rc\nThis should not be.");
03803 SUMA_RETURNe;
03804 }
03805
03806 SO->SurfCont->opts_form = XtVaCreateWidget ("form",
03807 xmFormWidgetClass, parent,
03808 NULL);
03809
03810 SO->SurfCont->opts_rc = XtVaCreateWidget ("rowcolumn",
03811 xmRowColumnWidgetClass, SO->SurfCont->opts_form,
03812 XmNpacking, XmPACK_TIGHT,
03813 XmNleftAttachment,XmATTACH_FORM ,
03814 XmNorientation , XmHORIZONTAL ,
03815 XmNmarginHeight , 0 ,
03816 XmNmarginWidth , 0 ,
03817 NULL);
03818
03819 {
03820 rct = XtVaCreateWidget ("rowcolumn",
03821 xmRowColumnWidgetClass, SO->SurfCont->opts_rc,
03822 XmNpacking, XmPACK_TIGHT,
03823 XmNresizeHeight, False,
03824
03825 XmNresizeWidth, False,
03826 XmNwidth, SUMA_SCALE_WIDTH,
03827 XmNorientation , XmVERTICAL ,
03828 XmNmarginHeight , 0 ,
03829 XmNmarginWidth , 0 ,
03830 NULL);
03831
03832 arglist = XtVaCreateArgsList( NULL,
03833 XmNshowValue, True,
03834 XmNmaximum, 255,
03835 XmNscaleMultiple, 5,
03836 XmNheight, SUMA_SCALE_HEIGHT,
03837 XmNuserData, (XtPointer)0,
03838 NULL);
03839
03840
03841
03842
03843 #if 0
03844 sprintf(slabel,"Thr.");
03845 SO->SurfCont->thr_lb = XtVaCreateManagedWidget (slabel,
03846 xmLabelWidgetClass, rct,
03847 XmNwidth, SUMA_SCALE_WIDTH,
03848 XmNrecomputeSize, False,
03849 NULL);
03850 #else
03851 {
03852 int colw[]={6};
03853 char *lhint[]={ "Threshold Value", NULL};
03854 char *lhelp[]={ SUMA_SurfContHelp_SetThreshTblr0, NULL};
03855 if (!SO->SurfCont->SetThrScaleTable->cells) {
03856 SUMA_CreateTable( rct,
03857 1, 1,
03858 NULL, NULL,
03859 lhint, NULL,
03860 lhelp, NULL,
03861 colw, YUP, SUMA_float,
03862 SUMA_SetScaleThr, (void *)SO,
03863 NULL, NULL,
03864 NULL, NULL,
03865 SO->SurfCont->SetThrScaleTable);
03866 }
03867 }
03868 #endif
03869
03870 SO->SurfCont->thr_sc = XtVaCreateManagedWidget("Thr.",
03871 xmScaleWidgetClass, rct,
03872 XtVaNestedList, arglist,
03873 NULL);
03874
03875 XtAddCallback (SO->SurfCont->thr_sc, XmNvalueChangedCallback, SUMA_cb_set_threshold, (XtPointer) SO);
03876
03877 XtAddCallback (SO->SurfCont->thr_sc, XmNdragCallback, SUMA_cb_set_threshold_label, (XtPointer) SO);
03878
03879 #if 0
03880
03881 sprintf(slabel,"[N/A]");
03882 SO->SurfCont->thrstat_lb = XtVaCreateManagedWidget (slabel,
03883 xmLabelWidgetClass, rct,
03884 NULL);
03885 #endif
03886 XtManageChild (rct);
03887
03888 }
03889
03890 if (arglist) XtFree(arglist); arglist = NULL;
03891
03892 {
03893 Widget rcc2;
03894 rcc = XtVaCreateWidget ("rowcolumn",
03895 xmRowColumnWidgetClass, SO->SurfCont->opts_rc,
03896 XmNpacking, XmPACK_TIGHT,
03897 XmNorientation , XmVERTICAL ,
03898 XmNmarginHeight , 0 ,
03899 XmNmarginWidth , 0 ,
03900 NULL);
03901
03902 sprintf(slabel," ");
03903 SO->SurfCont->cmaptit_lb = XtVaCreateManagedWidget (slabel,
03904 xmLabelWidgetClass, rcc,
03905 NULL);
03906
03907
03908 rcc2 = XtVaCreateWidget ("rowcolumn",
03909 xmRowColumnWidgetClass, rcc,
03910 XmNpacking, XmPACK_TIGHT,
03911 XmNorientation , XmHORIZONTAL ,
03912 XmNmarginHeight , 0 ,
03913 XmNmarginWidth , 0 ,
03914 NULL);
03915
03916
03917 SO->SurfCont->cmp_ren->cmap_wid = XtVaCreateManagedWidget("glxarea",
03918 glwDrawingAreaWidgetClass, rcc2,
03919 GLwNvisualInfo, SUMAg_SVv[0].X->VISINFO,
03920 XtNcolormap, SUMAg_SVv[0].X->CMAP,
03921 XmNwidth, SUMA_CMAP_WIDTH,
03922 XmNheight, SUMA_CMAP_HEIGHT,
03923 NULL);
03924
03925 XtManageChild (rcc2);
03926
03927
03928 XtAddCallback(SO->SurfCont->cmp_ren->cmap_wid, GLwNginitCallback, SUMA_cmap_wid_graphicsInit, (XtPointer )SO);
03929 XtAddCallback(SO->SurfCont->cmp_ren->cmap_wid, GLwNexposeCallback, SUMA_cmap_wid_expose, (XtPointer )SO);
03930 XtAddCallback(SO->SurfCont->cmp_ren->cmap_wid, GLwNresizeCallback, SUMA_cmap_wid_resize, (XtPointer )SO);
03931 XtAddCallback(SO->SurfCont->cmp_ren->cmap_wid, GLwNinputCallback, SUMA_cmap_wid_input, (XtPointer )SO);
03932
03933 XtManageChild (rcc);
03934 }
03935
03936
03937
03938
03939 XtManageChild (SO->SurfCont->opts_rc);
03940 XtManageChild (SO->SurfCont->opts_form);
03941 SUMA_RETURNe;
03942 }
03943
03944 SUMA_MenuItem *SUMA_FreeMenuVector(SUMA_MenuItem *menu, int Nels)
03945 {
03946 static char FuncName[]={"SUMA_FreeMenuVector"};
03947 int i;
03948
03949 SUMA_ENTRY;
03950
03951 if (!menu) {SUMA_RETURN(NULL);}
03952 if (Nels <= 0) {SUMA_RETURN(NULL);}
03953
03954 for (i=0; i<Nels; ++i) {
03955 if (menu[i].label) SUMA_free(menu[i].label);
03956 if (menu[i].accelerator) SUMA_free(menu[i].accelerator);
03957 if (menu[i].accel_text) SUMA_free(menu[i].accel_text);
03958 if (menu[i].subitems) { SUMA_SL_Err("Don't know how to free subitems yet."); }
03959 }
03960 SUMA_free(menu);
03961
03962 SUMA_RETURN(NULL);
03963 }
03964
03965 SUMA_MenuItem *SUMA_FormSwitchColMenuVector(SUMA_SurfaceObject *SO, int what, int *N_items)
03966 {
03967 static char FuncName[]={"SUMA_FormSwitchColMenuVector"};
03968 SUMA_MenuItem *menu = NULL;
03969 int i;
03970 void (*callback)();
03971 NI_element *nel = NULL;
03972 SUMA_Boolean LocalHead = NOPE;
03973
03974 SUMA_ENTRY;
03975
03976 if (!SO) { SUMA_SL_Err("NULL SO"); SUMA_RETURN (menu);}
03977 if (!SO->SurfCont) { SUMA_SL_Err("NULL SO->SurfCont"); SUMA_RETURN (menu);}
03978 if (!SO->SurfCont->curColPlane) { SUMA_SL_Err("NULL SO->SurfCont->curColPlane"); SUMA_RETURN (menu);}
03979 if (!SO->SurfCont->curColPlane->dset_link) { SUMA_SL_Err("NULL SO->SurfCont->curColPlane->dset_link"); SUMA_RETURN (menu);}
03980
03981 nel = SO->SurfCont->curColPlane->dset_link->dnel;
03982 if (!nel) { SUMA_SL_Err("NULL nel"); SUMA_RETURN (menu);}
03983 if (!nel->vec_num) { SUMA_SL_Err("no vecs"); SUMA_RETURN (menu);}
03984
03985
03986 switch (what) {
03987 case 0:
03988 callback = SUMA_cb_SwitchIntensity;
03989 break;
03990 case 1:
03991 callback = SUMA_cb_SwitchThreshold;
03992 break;
03993 case 2:
03994 callback = SUMA_cb_SwitchBrightness;
03995 break;
03996 default:
03997 SUMA_SL_Err("No such what");
03998 SUMA_RETURN(menu);
03999 }
04000
04001
04002 menu = (SUMA_MenuItem *)SUMA_malloc(sizeof(SUMA_MenuItem)*(nel->vec_num+1));
04003
04004
04005
04006 for (i=0; i < nel->vec_num; ++i) {
04007 menu[i].label = SUMA_DsetColLabelCopy(SO->SurfCont->curColPlane->dset_link, i, 1);
04008 menu[i].class = &xmPushButtonWidgetClass;
04009 menu[i].mnemonic = '\0';
04010 menu[i].accelerator = NULL;
04011 menu[i].accel_text = NULL;
04012 menu[i].callback = callback;
04013 menu[i].callback_data = (XtPointer)i+1;
04014 menu[i].subitems = NULL;
04015 }
04016
04017
04018 menu[nel->vec_num].label = NULL;
04019
04020 *N_items = nel->vec_num;
04021
04022 SUMA_RETURN (menu);
04023 }
04024
04025 void SUMA_ShowMeTheChildren(Widget w)
04026 {
04027 static char FuncName[]={"SUMA_ShowMeTheChildren"};
04028 Widget * children ;
04029 int num_children , ic , Nbutt=0;
04030
04031 SUMA_ENTRY;
04032
04033 XtVaGetValues( w , XmNchildren , &children ,
04034 XmNnumChildren , &num_children ,
04035 XmNbuttonCount, &Nbutt,
04036 NULL ) ;
04037
04038 fprintf (SUMA_STDERR, "%s: The (%d) children of %s (%d N_butts):\n", FuncName, num_children, XtName(w), Nbutt);
04039 for( ic=0 ; ic < num_children ; ic++ ){
04040
04041 XtVaGetValues (children[ic], XmNbuttonCount, &Nbutt, NULL);
04042 fprintf (SUMA_STDERR, "%d: %s (%d N_butts)\n", ic, XtName(children[ic]), Nbutt);
04043 }
04044
04045 SUMA_RETURNe;
04046 }
04047
04048 SUMA_MenuItem *SUMA_FormSwitchCmapMenuVector(SUMA_COLOR_MAP **CMv, int N_maps)
04049 {
04050 static char FuncName[]={"SUMA_FormSwitchCmapMenuVector"};
04051 SUMA_MenuItem *menu = NULL;
04052 int i;
04053 void (*callback)();
04054 NI_element *nel = NULL;
04055 SUMA_Boolean LocalHead = NOPE;
04056
04057 SUMA_ENTRY;
04058
04059 if (!CMv) { SUMA_SL_Err("NULL CMv"); SUMA_RETURN (menu);}
04060 if (N_maps <=0) { SUMA_SL_Err("N_maps <=0"); SUMA_RETURN (menu);}
04061
04062 callback = SUMA_cb_SwitchCmap;
04063
04064
04065 menu = (SUMA_MenuItem *)SUMA_malloc(sizeof(SUMA_MenuItem)*(N_maps+1));
04066
04067
04068 for (i=0; i < N_maps; ++i) {
04069 menu[i].label = SUMA_copy_string(CMv[i]->Name);
04070 menu[i].class = &xmPushButtonWidgetClass;
04071 menu[i].mnemonic = '\0';
04072 menu[i].accelerator = NULL;
04073 menu[i].accel_text = NULL;
04074 menu[i].callback = callback;
04075 menu[i].callback_data = (XtPointer)CMv[i];
04076 menu[i].subitems = NULL;
04077 }
04078
04079
04080 menu[N_maps].label = NULL;
04081
04082 SUMA_RETURN (menu);
04083 }
04084
04085 void SUMA_SetScaleRange(SUMA_SurfaceObject *SO, float range[2])
04086 {
04087 static char FuncName[]={"SUMA_SetScaleRange"};
04088 int min_v, max_v, scl, dec, cv;
04089 Widget w ;
04090 float ftmp;
04091 char slabel[100];
04092 SUMA_Boolean LocalHead = NOPE;
04093
04094 SUMA_ENTRY;
04095
04096 if (!SO) {
04097 SUMA_SL_Err("NULL SO");
04098 SUMA_RETURNe;
04099 }
04100 if (!SO->SurfCont->thr_sc) {
04101 SUMA_SL_Err("NULL widget");
04102 SUMA_RETURNe;
04103 }
04104
04105 w = SO->SurfCont->thr_sc;
04106
04107 if (range[1] <= range[0]) range[1] = range[0] + 1;
04108
04109 if (SO->SurfCont->curColPlane->OptScl->ThrMode == SUMA_ABS_LESS_THAN) {
04110 SUMA_LH("Absolutizing Threshold Range");
04111 if (fabs((double)range[0]) > fabs((double)range[1])) {
04112 range[1] = fabs((double)range[0]); range[0] = 0.0;
04113 } else {
04114 range[1] = fabs((double)range[1]); range[0] = 0.0;
04115 }
04116 }
04117
04118 if (range[1] - range[0] > pow(10.0,SUMAg_CF->SUMA_ThrScalePowerBias)) {
04119 dec = 0;
04120 min_v = (int)(range[0] );
04121 max_v = (int)(range[1] );
04122 scl = (max_v -min_v) / 10;
04123 } else {
04124
04125 dec = (int)ceil( log((double)(range[1] - range[0] + 0.001)) / log (10) );
04126
04127 if (dec < SUMAg_CF->SUMA_ThrScalePowerBias) dec = SUMAg_CF->SUMA_ThrScalePowerBias;
04128 min_v = (int)(range[0] * pow(10.0, dec));
04129 max_v = (int)(range[1] * pow(10.0, dec) + 0.001);
04130 scl = (max_v -min_v) / 10;
04131
04132 }
04133 if (max_v <= min_v || scl < 0) {
04134
04135
04136 SUMA_SLP_Note("Bad auto scaling \nparameters for threshold bar.\nUsing defaults");
04137 min_v = (int)(range[0]);
04138 max_v = (int)(range[1])+1;
04139 scl = (max_v - min_v) / 10;
04140 dec = 1;
04141 }
04142
04143 #if 0
04144
04145 XtVaGetValues(w, XmNvalue, &cv, NULL);
04146 #else
04147
04148 ftmp = SO->SurfCont->curColPlane->OptScl->ThreshRange[0] * pow(10.0, dec);
04149 if (ftmp > 0) cv = (int) (ftmp+0.5);
04150 else cv = (int) (ftmp-0.5);
04151 #endif
04152
04153 if (LocalHead) fprintf (SUMA_STDERR, "%s:\n min %d max %d scalemult %d decimals %d\nCurrent scale value %d\n",
04154 FuncName, min_v, max_v, scl, dec, cv);
04155 if (cv < min_v) {
04156 cv = min_v;
04157
04158 SO->SurfCont->curColPlane->OptScl->ThreshRange[0] = (float)cv / pow(10.0, dec);
04159 } else if (cv > max_v) {
04160 cv = max_v;
04161 SO->SurfCont->curColPlane->OptScl->ThreshRange[0] = (float)cv / pow(10.0, dec);
04162 }
04163
04164 XtVaSetValues(w,
04165 XmNmaximum, max_v,
04166 XmNminimum, min_v,
04167 XmNvalue, cv,
04168 XmNscaleMultiple, scl,
04169 XmNdecimalPoints , dec,
04170 XmNuserData, (XtPointer)dec,
04171 NULL);
04172
04173
04174 if (SO->SurfCont->curColPlane->OptScl->ThrMode != SUMA_ABS_LESS_THAN)
04175 sprintf(slabel, "%5s", MV_format_fval((float)cv / pow(10.0, dec)));
04176 else {
04177
04178
04179
04180 sprintf(slabel, "%5s", MV_format_fval((float)cv / pow(10.0, dec)));
04181 }
04182
04183 SUMA_INSERT_CELL_STRING(SO->SurfCont->SetThrScaleTable, 0,0,slabel);
04184
04185
04186 SUMA_RETURNe;
04187 }
04188
04189
04190
04191
04192
04193
04194
04195
04196
04197
04198 SUMA_Boolean SUMA_UpdateXhairField(SUMA_SurfaceViewer *sv)
04199 {
04200 static char FuncName[]={"SUMA_UpdateXhairField"};
04201 int i, N_SOlist, SOlist[SUMA_MAX_DISPLAYABLE_OBJECTS];
04202 SUMA_DO *dov = SUMAg_DOv;
04203 SUMA_SurfaceObject *SO=NULL, *curSO=NULL;
04204 char str[100];
04205 SUMA_Boolean LocalHead = NOPE;
04206
04207 SUMA_ENTRY;
04208
04209 if (!sv) SUMA_RETURN(NOPE);
04210
04211
04212 N_SOlist = SUMA_VisibleSOs(sv, dov, SOlist);
04213 for (i=0; i<N_SOlist; ++i) {
04214 if (LocalHead) fprintf (SUMA_STDERR, "%s: working %d/%d shown surfaces ...\n",
04215 FuncName, i, N_SOlist);
04216 SO = (SUMA_SurfaceObject *)dov[SOlist[i]].OP;
04217 if (SO->SurfCont) {
04218
04219 curSO = *(SO->SurfCont->curSOp);
04220 if (curSO == SO) {
04221
04222 if (LocalHead) fprintf(SUMA_STDERR,"%s: Setting cross hair at %f %f %f\n",
04223 FuncName, sv->Ch->c[0],sv->Ch->c[1],sv->Ch->c[2]);
04224 SUMA_XHAIR_STRING(sv->Ch->c, str);
04225 SUMA_LH(str);
04226 XtVaSetValues(SO->SurfCont->XhairTable->cells[1], XmNvalue, str, NULL);
04227 }
04228 }
04229
04230 }
04231
04232 SUMA_RETURN(YUP);
04233
04234 }
04235
04236 SUMA_Boolean SUMA_UpdateNodeField(SUMA_SurfaceObject *SO)
04237 {
04238 static char FuncName[]={"SUMA_UpdateNodeField"};
04239 SUMA_SurfaceObject *curSO=NULL;
04240
04241 SUMA_ENTRY;
04242
04243 if (!SO) SUMA_RETURN(NOPE);
04244
04245 if (SO->SurfCont) {
04246 curSO = *(SO->SurfCont->curSOp);
04247 if (curSO == SO) {
04248 SUMA_UpdateNodeNodeField(SO);
04249
04250 SUMA_UpdateNodeValField(SO);
04251
04252 SUMA_UpdateNodeLblField(SO);
04253
04254 }
04255 }
04256
04257 SUMA_RETURN(YUP);
04258
04259 }
04260
04261 SUMA_Boolean SUMA_UpdateNodeNodeField(SUMA_SurfaceObject *SO)
04262 {
04263 static char FuncName[]={"SUMA_UpdateNodeNodeField"};
04264 char str[100];
04265
04266 SUMA_ENTRY;
04267
04268 if (!SO || !SO->SurfCont || !SO->SurfCont->NodeTable) SUMA_RETURN(NOPE);
04269 if (SO->SelectedNode < 0 || SO->SelectedNode >= SO->N_Node) SUMA_RETURN(NOPE);
04270
04271 sprintf(str, "%d", SO->SelectedNode);
04272 SO->SurfCont->NodeTable->num_value[1] = SO->SelectedNode;
04273 XtVaSetValues(SO->SurfCont->NodeTable->cells[1], XmNvalue, str, NULL);
04274 sprintf(str, "%s", MV_format_fval2(SO->NodeList[3*SO->SelectedNode], 7));
04275 sprintf(str, "%s, %s", str, MV_format_fval2(SO->NodeList[3*SO->SelectedNode+1], 7));
04276 sprintf(str, "%s, %s", str, MV_format_fval2(SO->NodeList[3*SO->SelectedNode+2], 7) );
04277 XtVaSetValues(SO->SurfCont->NodeTable->cells[2], XmNvalue, str, NULL);
04278
04279 SUMA_RETURN(YUP);
04280 }
04281
04282 SUMA_Boolean SUMA_UpdateNodeValField(SUMA_SurfaceObject *SO)
04283 {
04284 static char FuncName[]={"SUMA_UpdateNodeValField"};
04285 SUMA_OVERLAYS *Sover=NULL;
04286 char *str_int=NULL, *str_thr=NULL, *str_brt=NULL;
04287 double dval;
04288 int Found = -1;
04289 SUMA_Boolean LocalHead = NOPE;
04290
04291 SUMA_ENTRY;
04292
04293 if (!SO) {
04294 SUMA_LH("Null SO");
04295 SUMA_RETURN(NOPE);
04296 }
04297 Sover = SO->SurfCont->curColPlane;
04298
04299 if (!Sover) {
04300 SUMA_LH("Null Sover");
04301 SUMA_RETURN(NOPE);
04302 }
04303
04304
04305 Found = SUMA_GetNodeRow_FromNodeIndex(Sover->dset_link, SO->SelectedNode, SO->N_Node);
04306 if (LocalHead) {
04307 fprintf(SUMA_STDERR,"%s: Node index %d is at row %d in dset.", FuncName, SO->SelectedNode, Found);
04308 }
04309
04310 if (Found >= 0) {
04311
04312 str_int = SUMA_GetDsetValInCol(Sover->dset_link, Sover->OptScl->find, Found, &dval);
04313 if (str_int) {
04314 SUMA_LH(str_int);
04315 SUMA_INSERT_CELL_STRING(SO->SurfCont->DataTable, 1, 1, str_int);
04316 } else {
04317 SUMA_SL_Err("Failed to get str_int");
04318 }
04319 str_thr = SUMA_GetDsetValInCol(Sover->dset_link, Sover->OptScl->tind, Found, &dval);
04320 if (str_thr) {
04321 SUMA_LH(str_thr);
04322 SUMA_INSERT_CELL_STRING(SO->SurfCont->DataTable, 1, 2, str_thr);
04323 } else {
04324 SUMA_SL_Err("Failed to get str_thr");
04325 }
04326 str_brt = SUMA_GetDsetValInCol(Sover->dset_link, Sover->OptScl->bind, Found, &dval);
04327 if (str_brt) {
04328 SUMA_LH(str_brt);
04329 SUMA_INSERT_CELL_STRING(SO->SurfCont->DataTable, 1, 3, str_brt);
04330 } else {
04331 SUMA_SL_Err("Failed to get str_brt");
04332 }
04333 if (str_int) SUMA_free(str_int); str_int = NULL;
04334 if (str_thr) SUMA_free(str_thr); str_thr = NULL;
04335 if (str_brt) SUMA_free(str_brt); str_brt = NULL;
04336 } else {
04337 SUMA_INSERT_CELL_STRING(SO->SurfCont->DataTable, 1, 1, "NoData");
04338 SUMA_INSERT_CELL_STRING(SO->SurfCont->DataTable, 1, 2, "NoData");
04339 SUMA_INSERT_CELL_STRING(SO->SurfCont->DataTable, 1, 3, "NoData");
04340 }
04341 SUMA_RETURN(NOPE);
04342 }
04343
04344 SUMA_Boolean SUMA_UpdateNodeLblField(SUMA_SurfaceObject *SO)
04345 {
04346 static char FuncName[]={"SUMA_UpdateNodeLblField"};
04347 int Found = -1;
04348 char str_col[100];
04349 SUMA_OVERLAYS *Sover=NULL;
04350 SUMA_Boolean LocalHead = NOPE;
04351
04352 SUMA_ENTRY;
04353
04354 if (!SO) SUMA_RETURN(NOPE);
04355
04356 Sover = SO->SurfCont->curColPlane;
04357 if (!Sover) {
04358 SUMA_RETURN(NOPE);
04359 }
04360
04361 if (!Sover->Show) {
04362 SUMA_LH("Col plane hidden");
04363 sprintf(str_col,"hidden color overlay");
04364 SUMA_INSERT_CELL_STRING(SO->SurfCont->LabelTable, 0, 1, str_col);
04365 SUMA_RETURN(YUP);
04366 }
04367
04368 Found = SUMA_GetNodeOverInd(Sover, SO->SelectedNode);
04369
04370 if (Found < 0) {
04371 SUMA_Boolean Reasoned = NOPE;
04372 SUMA_LH("Node not found.\nLikely masked by threshold");
04373 sprintf(str_col,"masked");
04374
04375 if (!Reasoned && SO->SurfCont->DataTable) {
04376 SUMA_LH("Checking if there is no data for this node");
04377 {
04378 void *n=NULL;
04379 XtVaGetValues(SO->SurfCont->DataTable->cells[1*SO->SurfCont->DataTable->Ni+1], XmNvalue, &n, NULL);
04380 if (strcmp((char *)n, "NoData") == 0) {
04381
04382 sprintf(str_col,"no data for this node");
04383 Reasoned = YUP;
04384 }
04385 }
04386 }
04387 if (!Reasoned && SO->SurfCont->DataTable) {
04388 SUMA_LH("Checking if node value is zero & zero is not being shown");
04389 if (Sover->OptScl->MaskZero && SO->SurfCont->DataTable->num_value[1*SO->SurfCont->DataTable->Ni+1]) {
04390 sprintf(str_col,"masked by zero value");
04391 }
04392 }
04393 SUMA_INSERT_CELL_STRING(SO->SurfCont->LabelTable, 0, 1, str_col);
04394 } else {
04395
04396 sprintf(str_col,"%s", MV_format_fval2(Sover->ColVec[3*Found],5));
04397 sprintf(str_col,"%s, %s", str_col, MV_format_fval2(Sover->ColVec[3*Found+1],5));
04398 sprintf(str_col,"%s, %s", str_col, MV_format_fval2(Sover->ColVec[3*Found+2],5));
04399 SUMA_LH(str_col);
04400 SUMA_INSERT_CELL_STRING(SO->SurfCont->LabelTable, 0, 1, str_col);
04401 }
04402
04403 SUMA_RETURN(YUP);
04404 }
04405
04406 SUMA_Boolean SUMA_UpdateTriField(SUMA_SurfaceObject *SO)
04407 {
04408 static char FuncName[]={"SUMA_UpdateTriField"};
04409 SUMA_SurfaceObject *curSO=NULL;
04410 char str[100];
04411 SUMA_Boolean LocalHead = NOPE;
04412
04413 SUMA_ENTRY;
04414
04415 if (!SO) SUMA_RETURN(NOPE);
04416
04417 if (SO->SurfCont) {
04418 curSO = *(SO->SurfCont->curSOp);
04419 if (curSO == SO) {
04420 if (SO->SelectedFaceSet >= 0) {
04421 sprintf(str, "%d", SO->SelectedFaceSet);
04422 SO->SurfCont->FaceTable->num_value[1] = SO->SelectedFaceSet;
04423 XtVaSetValues(SO->SurfCont->FaceTable->cells[1], XmNvalue, str, NULL);
04424 sprintf(str, "%d, %d, %d",
04425 SO->FaceSetList[3*SO->SelectedFaceSet], SO->FaceSetList[3*SO->SelectedFaceSet+1],
04426 SO->FaceSetList[3*SO->SelectedFaceSet+2]);
04427 XtVaSetValues(SO->SurfCont->FaceTable->cells[2], XmNvalue, str, NULL);
04428 } else {
04429 XtVaSetValues(SO->SurfCont->FaceTable->cells[1], XmNvalue, "-1", NULL);
04430 SO->SurfCont->FaceTable->num_value[1] = -1;
04431 XtVaSetValues(SO->SurfCont->FaceTable->cells[2], XmNvalue, "x, x, x", NULL);
04432 }
04433 }
04434 }
04435
04436 SUMA_RETURN(YUP);
04437
04438 }
04439
04440
04441
04442
04443
04444
04445
04446
04447 SUMA_Boolean SUMA_Init_SurfCont_CrossHair(SUMA_SurfaceObject *SO)
04448 {
04449 static char FuncName[]={"SUMA_Init_SurfCont_CrossHair"};
04450 int i;
04451 SUMA_Boolean LocalHead = NOPE;
04452
04453 SUMA_ENTRY;
04454
04455 if (!SO) SUMA_RETURN(YUP);
04456
04457
04458 SUMA_UpdateTriField(SO);
04459 SUMA_UpdateNodeField(SO);
04460
04461 for (i=0; i<SUMAg_N_SVv; ++i) {
04462 if (LocalHead) fprintf (SUMA_STDERR,"%s: Checking viewer %d.\n", FuncName, i);
04463 if (!SUMAg_SVv[i].isShaded && SUMAg_SVv[i].X->TOPLEVEL) {
04464
04465 if (SUMA_isVisibleSO(&(SUMAg_SVv[i]), SUMAg_DOv, SO)) {
04466 if ((SUMAg_DOv[SUMAg_SVv[i].Focus_SO_ID].OP) == SO) {
04467 SUMA_UpdateXhairField(&(SUMAg_SVv[i]));
04468 }
04469 }
04470 }
04471 }
04472
04473 SUMA_RETURN(YUP);
04474 }
04475
04476
04477
04478
04479
04480 void SUMA_cb_Cmap_Load(Widget w, XtPointer data, XtPointer client_data)
04481 {
04482 static char FuncName[]={"SUMA_cb_Cmap_Load"};
04483 SUMA_LIST_WIDGET *LW=NULL;
04484 SUMA_SurfaceObject *SO=NULL;
04485 DList *list = NULL;
04486 SUMA_EngineData *ED = NULL;
04487 DListElmt *NextElm = NULL;
04488 SUMA_Boolean LocalHead = NOPE;
04489
04490 SUMA_ENTRY;
04491
04492 SUMA_LH("Called");
04493
04494 SO = (SUMA_SurfaceObject *)data;
04495
04496 if (!list) list = SUMA_CreateList();
04497 ED = SUMA_InitializeEngineListData (SE_OpenCmapFileSelection);
04498 if (!(NextElm = SUMA_RegisterEngineListCommand ( list, ED,
04499 SEF_vp, (void *)SO,
04500 SES_Suma, NULL, NOPE,
04501 SEI_Head, NULL))) {
04502 fprintf (SUMA_STDERR, "Error %s: Failed to register command.\n", FuncName);
04503 }
04504 SUMA_RegisterEngineListCommand ( list, ED,
04505 SEF_ip, (void *)SO->SurfCont->TopLevelShell,
04506 SES_Suma, NULL, NOPE,
04507 SEI_In, NextElm);
04508 if (!SUMA_Engine (&list)) {
04509 fprintf(SUMA_STDERR, "Error %s: SUMA_Engine call failed.\n", FuncName);
04510 }
04511
04512 SUMA_RETURNe;
04513 }
04514
04515
04516
04517
04518
04519
04520
04521 void SUMA_LoadCmapFile (char *filename, void *data)
04522 {
04523 static char FuncName[]={"SUMA_LoadCmapFile"};
04524 SUMA_SurfaceObject *SO = NULL;
04525 SUMA_OVERLAY_PLANE_DATA sopd;
04526 SUMA_IRGB *irgb=NULL;
04527 int OverInd = -1, lnp=-1, loc[2];
04528 char *np=NULL;
04529 int bringup = 0;
04530 SUMA_DSET_FORMAT form;
04531 DList *list=NULL;
04532 SUMA_LIST_WIDGET *LW=NULL;
04533 SUMA_COLOR_MAP *Cmap=NULL;
04534 SUMA_PARSED_NAME * pn=NULL;
04535 SUMA_Boolean LocalHead = NOPE;
04536
04537 SUMA_ENTRY;
04538
04539 if (!data) {
04540 SUMA_SLP_Err("Null data");
04541 SUMA_RETURNe;
04542 }
04543
04544 if (!SUMAg_CF->scm) {
04545 SUMAg_CF->scm = SUMA_Build_Color_maps();
04546 if (!SUMAg_CF->scm) {
04547 SUMA_SL_Err("Failed to build color maps.\n");
04548 SUMA_RETURNe;
04549 }
04550 }
04551
04552 SO = (SUMA_SurfaceObject *)data;
04553
04554 if (LocalHead) {
04555 fprintf (SUMA_STDERR,"%s: Received request to load %s for surface %s.\n", FuncName, filename, SO->Label);
04556 }
04557
04558
04559 if (!SUMA_filexists(filename)) {
04560 SUMA_SLP_Err("File not found");
04561 SUMA_RETURNe;
04562 }
04563
04564
04565 form = SUMA_GuessFormatFromExtension(filename);
04566
04567
04568 Cmap = NULL;
04569 switch (form) {
04570 case SUMA_1D:
04571 Cmap = SUMA_Read_Color_Map_1D (filename);
04572 if (Cmap == NULL) {
04573 SUMA_SLP_Err("Could not load colormap.");
04574 SUMA_RETURNe;
04575 }
04576 break;
04577 case SUMA_ASCII_NIML:
04578 case SUMA_BINARY_NIML:
04579 case SUMA_NIML:
04580 SUMA_SLP_Err("Not ready for this format yet.");
04581 break;
04582 default:
04583 SUMA_SLP_Err( "Format not recognized.\n"
04584 "I won't try to guess.\n"
04585 "Do use the proper extension.");
04586 break;
04587 }
04588
04589 if (!Cmap) SUMA_RETURNe;
04590
04591
04592
04593
04594 pn = SUMA_ParseFname(Cmap->Name);
04595 SUMA_STRING_REPLACE(Cmap->Name, pn->FileName_NoExt);
04596 SUMA_Free_Parsed_Name(pn); pn = NULL;
04597 SUMAg_CF->scm->CMv = SUMA_Add_ColorMap (Cmap, SUMAg_CF->scm->CMv, &(SUMAg_CF->scm->N_maps));
04598
04599
04600 bringup = 0;
04601 if (SUMAg_CF->X->SwitchCmapLst) {
04602 if (SUMAg_CF->X->SwitchCmapLst->toplevel && !SUMAg_CF->X->SwitchCmapLst->isShaded) {
04603
04604 SUMA_cb_CloseSwitchCmap( NULL, (XtPointer)SUMAg_CF->X->SwitchCmapLst, NULL);
04605 bringup = 1;
04606 }
04607 }
04608
04609 SUMA_CmapSelectList(SO, 1, bringup);
04610
04611
04612 SUMA_CreateUpdatableCmapMenu(SO);
04613
04614
04615 if (!SUMA_SetCmapMenuChoice (SO, Cmap->Name)) {
04616 SUMA_SL_Err("Failed in SUMA_SetCmapMenuChoice");
04617 }
04618
04619
04620 if (!SUMA_SwitchColPlaneCmap(SO, Cmap)) {
04621 SUMA_SL_Err("Failed in SUMA_SwitchColPlaneCmap");
04622 }
04623
04624
04625 SUMA_UpdateNodeLblField(SO);
04626
04627 SUMA_RETURNe;
04628 }
04629
04630 #ifdef SUMA_SHOW_CMAP_STAND_ALONE
04631
04632
04633
04634
04635
04636 static MCW_DC *cmapdc = NULL;
04637 static char * vcl[] = { "StaticGray" , "GrayScale" , "StaticColor" ,
04638 "PseudoColor" , "TrueColor" , "DirectColor" } ;
04639
04640 static XImage * xim = NULL ;
04641 static int xim_ww = 0 ;
04642 static int xim_hh = 0 ;
04643
04644
04645
04646 #ifdef __GNUC__
04647 # define INLINE inline
04648 #else
04649 # define INLINE
04650 #endif
04651
04652
04653
04654 static INLINE Pixel SUMA_tc_rgb_to_pixel( MCW_DC * dc, byte rr, byte gg, byte bb )
04655 {
04656 static MCW_DC * dcold=NULL ;
04657 DC_colordef * cd = dc->cdef ;
04658 static unsigned long pold=0 ;
04659 static byte rold=0 , gold=0 , bold=0 ;
04660 unsigned long r , g , b ;
04661
04662 if( cd == NULL ){ reload_DC_colordef(dc) ; cd = dc->cdef ; }
04663
04664 if( rr == 0 && gg == 0 && bb == 0 ) return 0 ;
04665 if( rr == 255 && gg == 255 && bb == 255 ) return cd->whpix ;
04666
04667 if( dc == dcold && rr == rold && gg == gold && bb == bold )
04668 return (Pixel) pold ;
04669
04670 rold = rr ; gold = gg ; bold = bb ; dcold = dc ;
04671
04672 r = (cd->rrshift<0) ? (rr<<(-cd->rrshift))
04673 : (rr>>cd->rrshift) ; r = r & cd->rrmask ;
04674
04675 g = (cd->ggshift<0) ? (gg<<(-cd->ggshift))
04676 : (gg>>cd->ggshift) ; g = g & cd->ggmask ;
04677
04678 b = (cd->bbshift<0) ? (bb<<(-cd->bbshift))
04679 : (bb>>cd->bbshift) ; b = b & cd->bbmask ;
04680
04681 pold = r | g | b ;
04682 return (Pixel) pold ;
04683 }
04684
04685 XImage *SUMA_cmap_to_XImage (Widget wid, SUMA_COLOR_MAP *cm)
04686 {
04687 static char FuncName[]={"SUMA_cmap_to_XImage"};
04688 Pixel * par ;
04689 int ii;
04690 SUMA_Boolean LocalHead = NOPE;
04691
04692 SUMA_ENTRY;
04693
04694 if (!cm) { SUMA_SL_Err("NULL cm"); SUMA_RETURN(xim); }
04695 if (!wid) { SUMA_SL_Err("NULL wid"); SUMA_RETURN(xim); }
04696
04697 if (!cmapdc) {
04698 SUMA_LH("Initializing cmapdc");
04699 cmapdc = MCW_new_DC( wid, 128, 0, NULL,NULL, 1.0, 0 );
04700 SUMA_LH("Initialization done");
04701 if (!cmapdc) { SUMA_SL_Err("Failed in MCW_new_DC"); SUMA_RETURN(xim); }
04702 switch( cmapdc->visual_class ){
04703 case TrueColor: break ;
04704 case PseudoColor:
04705 SUMA_SL_Err("No PseudoColor support here.");
04706 SUMA_RETURN(xim);
04707 }
04708 }
04709
04710
04711 par = (Pixel *) malloc(sizeof(Pixel)*cm->N_Col);
04712 if( par == NULL ) {
04713 SUMA_SL_Err("Failed to allocate");
04714 SUMA_RETURN(NULL) ;
04715 }
04716 SUMA_LH("rgb to pixel");
04717 for( ii=0 ; ii < cm->N_Col ; ii++ ) {
04718 par[ii] = SUMA_tc_rgb_to_pixel( cmapdc ,
04719 (byte)(cm->M[ii][0]/255.0),
04720 (byte)(cm->M[ii][1]/255.0),
04721 (byte)(cm->M[ii][2]/255.0) ) ;
04722
04723 }
04724
04725 SUMA_LH("pixar_to_XImage");
04726 xim = pixar_to_XImage( cmapdc , cm->N_Col , 1 , par ) ;
04727
04728 free(par);
04729 SUMA_RETURN(xim);
04730 }
04731
04732 void usage_ShowCmap()
04733 {
04734 static char FuncName[]={"usage_ShowCmap"};
04735 char * s = NULL;
04736 s = SUMA_help_basics();
04737 printf ( "\nUsage: \n"
04738 "%s\n"
04739 "\n", s); SUMA_free(s); s = NULL;
04740 s = SUMA_New_Additions(0, 1); printf("%s\n", s);SUMA_free(s); s = NULL;
04741 printf(" Ziad S. Saad SSCC/NIMH/NIH ziad@nih.gov \n\t\t Tue Dec 30\n"
04742 "\n");
04743 }
04744 void fred_CB( Widget w , XtPointer cd , XtPointer cb ){ exit(0); }
04745 void elvis_CB( Widget w , XtPointer cd , XtPointer cb )
04746 {
04747 static int needGC = 1 ;
04748 static GC myGC ;
04749 XmDrawingAreaCallbackStruct * cbs = (XmDrawingAreaCallbackStruct *) cb ;
04750 XExposeEvent * ev = (XExposeEvent *) cbs->event ;
04751 Dimension nx , ny ;
04752 int ii , jj ;
04753
04754 if( cbs->reason != XmCR_EXPOSE || ev->count > 0 ) return ;
04755
04756 if( needGC ){
04757 XGCValues gcv;
04758 gcv.function = GXcopy ;
04759 myGC = XCreateGC( XtDisplay(w) , XtWindow(w) , GCFunction , &gcv ) ;
04760 needGC = 0 ;
04761 }
04762
04763 XtVaGetValues( w , XmNwidth , &nx , XmNheight , &ny , NULL ) ;
04764
04765 ii = 0 ;
04766 do{
04767 jj = 0 ;
04768 do{
04769 XPutImage( XtDisplay(w),XtWindow(w),myGC,xim,0,0,ii,jj,xim_ww,xim_hh) ;
04770 jj += xim_hh + 4 ;
04771 } while( jj < ny ) ;
04772 ii += xim_ww ;
04773 } while( ii < nx ) ;
04774
04775 return ;
04776 }
04777
04778
04779 int main (int argc,char *argv[])
04780 {
04781 static char FuncName[]={"ShowCmap"};
04782 int kar, i;
04783 SUMA_Boolean brk;
04784 SUMA_COLOR_MAP *cmap;
04785 int icmap;
04786
04787 SUMA_Boolean LocalHead = NOPE;
04788
04789 SUMA_mainENTRY;
04790
04791 SUMA_STANDALONE_INIT;
04792
04793 if (!SUMAg_CF->scm) {
04794 SUMAg_CF->scm = SUMA_Build_Color_maps();
04795 if (!SUMAg_CF->scm) {
04796 SUMA_SL_Err("Failed to build color maps.\n");
04797 SUMA_RETURN(0);
04798 }
04799 }
04800
04801 icmap = SUMA_Find_ColorMap ("bgyr64", SUMAg_CF->scm->CMv, SUMAg_CF->scm->N_maps, -2 );
04802 if (icmap < 0) { SUMA_SL_Err("Failed to find ColMap"); SUMA_RETURN(0); }
04803 cmap = SUMAg_CF->scm->CMv[icmap];
04804
04805 #ifdef Xway
04806 {
04807 XtAppContext app;
04808 Widget top;
04809 Display *dpy;
04810 Colormap colormap;
04811 XVisualInfo vinfo;
04812 Visual *vis ;
04813 XVisualInfo *vinfo_list;
04814 int count;
04815 int vid , stat ;
04816 Widget fred , fff ;
04817
04818 SUMA_S_Note("XtVaCreateWidget");
04819 top = XtVaAppInitialize( &app , "test" , NULL , 0 , &argc , argv , NULL , NULL ) ;
04820 dpy = XtDisplay (top);
04821 SUMA_S_Note("XGetVisualInfo");
04822
04823 vinfo.screen = DefaultScreen(dpy);
04824 vinfo_list = XGetVisualInfo (dpy, VisualScreenMask, &vinfo, &count);
04825 if( count == 0 || vinfo_list == NULL ){fprintf(stderr,"no match\n");exit(1);}
04826 vinfo = vinfo_list[0] ;
04827 vid = vinfo.visualid ;
04828 vis = vinfo.visual ;
04829
04830 SUMA_S_Note("XCreateColormap");
04831 colormap = XCreateColormap( dpy, RootWindowOfScreen(XtScreen(top)) ,
04832 vis , AllocNone ) ;
04833
04834 XtVaSetValues( top ,
04835 XtNborderColor , 0 ,
04836 XtNbackground , 0 ,
04837 XtNdepth , vinfo.depth ,
04838 XtNcolormap , colormap ,
04839 XtNvisual , vis ,
04840 NULL ) ;
04841
04842 fff = XtVaCreateWidget( "dialog" , xmFormWidgetClass , top ,
04843 XmNborderWidth , 0 ,
04844 NULL ) ;
04845
04846 #ifndef LABEL_ARG
04847 #define LABEL_ARG(str) \
04848 XtVaTypedArg , XmNlabelString , XmRString , (str) , strlen(str)+1
04849 #endif
04850
04851 fred = XtVaCreateManagedWidget( "dialog" , xmPushButtonWidgetClass , fff ,
04852 LABEL_ARG("Jumpback") ,
04853 XmNtopAttachment , XmATTACH_FORM ,
04854 XmNleftAttachment , XmATTACH_FORM ,
04855 XmNrightAttachment , XmATTACH_FORM ,
04856 NULL ) ;
04857 XtAddCallback( fred , XmNactivateCallback , fred_CB , NULL ) ;
04858
04859 fred = XtVaCreateManagedWidget( "dialog" , xmDrawingAreaWidgetClass , fff ,
04860 XmNtopAttachment , XmATTACH_WIDGET ,
04861 XmNtopWidget , fred ,
04862 XmNleftAttachment , XmATTACH_FORM ,
04863 XmNrightAttachment , XmATTACH_FORM ,
04864 XmNbottomAttachment , XmATTACH_FORM ,
04865 NULL ) ;
04866
04867 XtAddCallback( fred , XmNexposeCallback , elvis_CB , NULL ) ;
04868
04869 SUMA_SL_Note("SUMA_cmap_to_XImage");
04870 xim = SUMA_cmap_to_XImage(fred, cmap);
04871
04872 SUMA_SL_Note("XPutImage");
04873 xim_ww = cmap->N_Col;
04874 xim_hh = 20;
04875
04876 XtVaSetValues( top ,
04877 XmNwidth , xim_ww ,
04878 XmNheight , xim_hh+40 ,
04879 NULL ) ;
04880
04881 XtManageChild(fff) ;
04882 XtRealizeWidget(top);
04883 XtAppMainLoop(app);
04884 }
04885 #else
04886 {
04887
04888
04889 }
04890 #endif
04891 if (!SUMA_Free_CommonFields(SUMAg_CF)) SUMA_error_message(FuncName,"SUMAg_CF Cleanup Failed!",1);
04892 SUMA_RETURN (0);
04893 }
04894
04895 #endif