/***************************************************************************** Major portions of this software are copyrighted by the Medical College of Wisconsin, 1994-2000, and are released under the Gnu General Public License, Version 2. See the file README.Copyright for details. ******************************************************************************/ #undef MAIN #include "afni.h" /*-------------------------------------------------------------------------*/ int label_in_PALTAB( PBAR_palette_table *pt , char *lab ) { int ii ; if( pt == NULL || PALTAB_NUM(pt) == 0 || lab == NULL || lab[0] == '\0' ) return -1 ; for( ii=0 ; ii < PALTAB_NUM(pt) ; ii++ ) if( strcmp( PALTAB_ARR_LABEL(pt,ii) , lab ) == 0 ) return ii ; return -1 ; } /*----------------------------------------------------------------------- Process an AFNI setup file. -------------------------------------------------------------------------*/ #define ISTARRED(s) ( (s)[0]=='*' && (s)[1]=='*' && (s)[2]=='*' ) #define EOLSKIP \ do{ for( ; fptr[0] != '\n' && fptr[0] != '\0' ; fptr++ ) ; /* nada */ \ if( fptr[0] == '\0' ){ free(fbuf) ; EXRETURN ; } \ fptr++ ; } while(0) #define GETSSS \ do{ int nu=0,qq; \ if( fptr-fbuf >= nbuf || fptr[0] == '\0' ){ free(fbuf); EXRETURN; } \ str[0]='\0'; qq=sscanf(fptr,"%127s%n",str,&nu); nused+=nu;fptr+=nu; \ if( str[0]=='\0' || qq==0 || nu==0 ){ free(fbuf); EXRETURN; } \ } while(0) #define GETSTR \ do{ GETSSS ; \ while(str[0]=='!' || (str[0]=='/' && str[1]=='/') || \ (str[0]=='#' && str[1]=='\0') ){EOLSKIP; GETSSS;} \ } while(0) #define GETEQN \ do{ GETSTR ; if(ISTARRED(str)) goto SkipSection ; \ strcpy(left,str) ; \ GETSTR ; if(ISTARRED(str)) goto SkipSection ; \ strcpy(middle,str) ; \ GETSTR ; if(ISTARRED(str)) goto SkipSection ; \ strcpy(right,str) ; } while(0) #define NSBUF 256 void AFNI_process_setup( char *fname , int mode , MCW_DC *dc ) { int nbuf , nused , ii ; char *fbuf , *fptr ; char str[NSBUF] , left[NSBUF] , middle[NSBUF] , right[NSBUF] ; ENTRY("AFNI_process_setup") ; fbuf = AFNI_suck_file( fname ) ; if( fbuf == NULL ) EXRETURN ; nbuf = strlen(fbuf) ; if( nbuf == 0 ) EXRETURN ; fptr = fbuf ; nused = 0 ; /** scan for section strings, which start with "***" **/ str[0] = '\0' ; /* initialize string */ if(PRINT_TRACING) { char str[256] ; sprintf(str,"Reading AFNI setup file = %s (%d bytes)",fname,nbuf) ; STATUS(str);} while( nused < nbuf ){ /**----------------------------------------**/ /**-- skip ahead to next section keyword --**/ SkipSection: while( ! ISTARRED(str) ){ GETSTR; } /*- 04 Jun 1999 -*/ if( mode == SETUP_ENVIRON_MODE && strcmp(str,"***ENVIRONMENT") != 0 ){ GETSTR ; goto SkipSection ; } /**--------------------**/ /**-- COLORS section --**/ if( strcmp(str,"***COLORS") == 0 ){ char label[NSBUF] , defn[NSBUF] ; STATUS("enter ***COLORS") ; while(1){ /* loop, looking for 'label = color' */ GETEQN ; if(PRINT_TRACING) { char str[256] ; sprintf(str,"GETEQN: %s %s %s",left,middle,right) ; STATUS(str);} /* don't allow 'none' to be redefined! */ if( strcmp(left,"none")==0 || strcmp(right,"none")==0 ) continue ; if( !THD_filename_pure(left) ) continue ; if( mode == SETUP_INIT_MODE ){ if( INIT_ncolovr < MAX_NCOLOVR ){ ii = INIT_ncolovr++ ; INIT_labovr[ii] = XtNewString(left) ; INIT_colovr[ii] = XtNewString(right) ; if(PRINT_TRACING) { char str[256] ; sprintf(str,"setup into #%d",ii) ; STATUS(str);} } else { fprintf(stderr,"\nIn setup file %s, color table overflow!\n",fname); goto SkipSection ; } } else if( mode == SETUP_LATER_MODE ){ ii = DC_add_overlay_color( dc , right , left ) ; if(PRINT_TRACING) { char str[256] ; sprintf(str,"'new' color index returned as #%d",ii) ; STATUS(str);} if( ii < 0 ) fprintf(stderr,"\nIn setup file %s, unknown color %s\n",fname,right); else OVC_mostest( dc->ovc ) ; } } continue ; /* skip to end of outer while loop */ } /* end of COLORS */ /**----------------------**/ /**-- PALETTES section --**/ if( strcmp(str,"***PALETTES") == 0 ){ /* loop, looking for palettes */ char label[NSBUF] = "NoThing" , ccc , * cpt ; PBAR_palette_array * ppar=NULL ; PBAR_palette ** ppp ; PBAR_palette * ppnew ; int npane , pmode , icol=0 , jj ; float val ; STATUS("enter ***PALETTES") ; if( GPT == NULL ){ /* 1st time in --> create palettry */ STATUS("create initial palettes") ; INIT_PALTAB(GPT) ; INIT_PALARR(ppar,"NoThing") ; ADDTO_PALTAB(GPT,ppar) ; } /* loop, looking for palettes */ while(1){ GETSTR ; if( ISTARRED(str) ) goto SkipSection ; if( fptr-fbuf >= nbuf ){ free(fbuf) ; EXRETURN ; } if( str[0] != '[' ){ /* found a palette label */ strcpy(label,str) ; if( !THD_filename_ok(label) ){ fprintf(stderr,"\nIn setup file %s, bad palette label: %s.\n", fname,label) ; free(fbuf) ; EXRETURN ; } if(PRINT_TRACING) { char str[256] ; sprintf(str,"found palette label=%s. [len=%d label[0]=%d]", label,(int)strlen(label),(int)label[0]); STATUS(str); sprintf(str,"nbuf=%d fptr-fbuf=%d",nbuf,fptr-fbuf); STATUS(str);} ii = label_in_PALTAB( GPT , label ) ; /* an old one? */ if( ii < 0 ){ STATUS("making a new palette array") ; INIT_PALARR(ppar,label) ; /* make a new palette array */ ADDTO_PALTAB(GPT,ppar) ; } else { if(PRINT_TRACING) { char str[256] ; sprintf(str,"matches old palette array #%d",ii) ; STATUS(str);} ppar = PALTAB_ARR(GPT,ii) ; /* retrieve old palette array */ } GETSTR ; if( ISTARRED(str) ) goto SkipSection ; } if(PRINT_TRACING) { char str[256] ; sprintf(str,"GPT now has %d arrays",PALTAB_NUM(GPT)) ; STATUS(str);} if( str[0] != '[' ){ /* bad news! */ fprintf(stderr,"\nIn setup file %s, expected palette '[n]' here: %s\n", fname , str ) ; break ; } /* decide how big the new palette is to be, and what mode */ ii = sscanf( str , "[%d%c" , &npane , &ccc ) ; if( ii < 2 ){ fprintf(stderr,"\nIn setup file %s, can't interpret palette %s\n", fname , str ) ; break ; } else if( npane < NPANE_MIN || npane > NPANE_MAX ){ fprintf(stderr,"\nIn setup file %s, illegal palette count %s\n", fname , str ) ; break ; } pmode = (ccc == '+') ? 1 : 0 ; /* pbar mode */ ppp = (pmode==0) ? (ppar->psgn + npane) /* pointer to pointer */ : (ppar->ppos + npane) ; /* to existing palette */ if(PRINT_TRACING) { char str[256] ; sprintf(str,"palette definition: npane=%d pmode=%d",npane,pmode) ; STATUS(str); } ppnew = XtNew(PBAR_palette) ; /* make a new palette */ ppnew->npane = npane ; ppnew->mode = pmode ; for( ii=0 ; ii < npane ; ii++ ){ ppnew->val[ii] = PAL_FIGNORE ; ppnew->col[ii] = PAL_IIGNORE ; } /* at this point, now loop to read parameters for new palette */ for( ii=0 ; ii < npane ; ii++ ){ GETEQN ; if(PRINT_TRACING) { char str[256] ; sprintf(str,"GETEQN: %s %s %s",left,middle,right) ; STATUS(str);} val = strtod(left,&cpt) ; if( val == 0.0 && *cpt != '\0' ) val = PAL_FIGNORE ; if( mode == SETUP_INIT_MODE ){ if( strcmp(right,"none") == 0 ){ icol = 0 ; } else { for( jj=0 ; jj < INIT_ncolovr ; jj++ ) if( strcmp(right,INIT_labovr[jj]) == 0 ) break ; icol = (jj < INIT_ncolovr) ? jj+1 : PAL_IIGNORE ; } } else if( mode == SETUP_LATER_MODE ){ icol = DC_find_overlay_color( dc , right ) ; if( icol < 0 ) icol = PAL_IIGNORE ; if(PRINT_TRACING) { char str[256] ; sprintf(str," DC_find_overlay_color(%s) returns %d\n",right,icol) ; STATUS(str) ; } } ppnew->val[ii] = val ; ppnew->col[ii] = icol ; if(PRINT_TRACING) { char str[256] ; sprintf(str,"new palette entry #%d: val=%f col=%d",ii,val,icol) ; STATUS(str);} } ii = check_PBAR_palette( ppnew ) ; if( ii < 0 ){ fprintf(stderr,"\nIn setup file %s, palette '%s [%d%s' is illegal\n", fname,label,npane, (pmode==0)?"]":"+]" ) ; myXtFree(ppnew) ; } else { myXtFree(*ppp) ; *ppp = ppnew ; STATUS("stored new palette") ; } } continue ; /* to end of outer while */ } /* end of PALETTES */ /**---------------------------------------**/ /**-- ENVIRONMENT section [04 Jun 1999] --**/ if( strcmp(str,"***ENVIRONMENT") == 0 ){ /* loop, looking for environment settings */ char *enveqn ; int nl , nr ; if( mode != SETUP_ENVIRON_MODE ){ GETSTR ; goto SkipSection ; } STATUS("enter ***ENVIRONMENT") ; while(1){ /* loop, looking for 'name = value' */ GETEQN ; if(PRINT_TRACING) { char str[256] ; sprintf(str,"GETEQN: %s %s %s",left,middle,right) ; STATUS(str);} if( !THD_filename_pure(left) ) continue ; nl = strlen(left) ; nr = strlen(right) ; enveqn = (char *) malloc(nl+nr+4) ; strcpy(enveqn,left) ; strcat(enveqn,"=") ; strcat(enveqn,right) ; putenv(enveqn) ; } continue ; /* to end of outer while */ } /* end of ENVIRONMENT */ /** END **/ if( strcmp(str,"***END") == 0 ) break ; /* exit main loop */ /** unknown section **/ #if 0 fprintf(stderr,"\nIn setup file %s, unknown section: %s\n", fname , str ) ; break ; /* exit main loop */ #else GETSTR ; goto SkipSection ; /* find another section */ #endif } /* end of while loop */ free(fbuf) ; EXRETURN ; } /*-----------------------------------------------------------------*/ int check_PBAR_palette( PBAR_palette *pp ) { int ii , nn ; ENTRY("check_PBAR_palette") ; if( pp == NULL ) RETURN(-1) ; if( pp->npane < NPANE_MIN || pp->npane > NPANE_MAX ) RETURN(-1) ; if( pp->mode < 0 || pp->mode >= PANE_MAXMODE ) RETURN(-1) ; /** val must be all numbers or all ignores -- nothing mixed **/ nn = 0 ; for( ii=0 ; ii < pp->npane ; ii++ ) if( pp->val[ii] == PAL_FIGNORE ) nn++ ; if( nn > 0 && nn != pp->npane ) RETURN(-1) ; /** if all numbers, must be ordered **/ if( nn == 0 ){ if( pp->val[0] <= 0.0 ) RETURN(-1) ; /* 1st must be positive */ for( ii=1 ; ii < pp->npane ; ii++ ) if( pp->val[ii] >= pp->val[ii-1] ) RETURN(-1) ; /* disordered? */ if( pp->mode == 1 && pp->val[pp->npane-1] < 0.0 ) RETURN(-1) ; } RETURN(1) ; } /*------------------------------------------------------------------------------*/ char * dump_PBAR_palette_table( int verb ) { int ii , jj , nn , nsss,nuuu , nbuf , kk ; char *sss ; static char buf[2048] ; char s1[32] , s2[32] ; PBAR_palette *pp ; MCW_DC *dc = GLOBAL_library.dc ; ENTRY("dump_PBAR_palette_table") ; nsss = 256 ; sss = (char *) malloc(sizeof(char) * nsss) ; sss[0] = '\0' ; nuuu = 0 ; if( verb ){ sprintf(sss,"Overlay Color Table: \n") ; nuuu = strlen(sss) ; for( kk=1 ; kk < dc->ovc->ncol_ov ; kk++ ){ sprintf(buf," %s = %s\n" , dc->ovc->label_ov[kk] , dc->ovc->name_ov[kk] ) ; nbuf = strlen(buf) ; if( nbuf+nuuu+2 > nsss ){ nsss = nbuf+nuuu+128 ; sss = (char *) realloc( sss , sizeof(char) * nsss ) ; } strcat(sss,buf) ; nuuu = strlen(sss) ; } } if( GPT == NULL || PALTAB_NUM(GPT) == 0 ){ sprintf(buf,"\nPalette Table: *** EMPTY ***\n") ; nbuf = strlen(buf) ; if( nbuf+nuuu+2 > nsss ){ nsss = nbuf+nuuu+128 ; sss = (char *) realloc( sss , sizeof(char) * nsss ) ; } strcat(sss,buf) ; nuuu = strlen(sss) ; RETURN(sss) ; } sprintf(buf,"\nPalette Table:\n") ; nbuf = strlen(buf) ; if( nbuf+nuuu+2 > nsss ){ nsss = nbuf+nuuu+128 ; sss = (char *) realloc( sss , sizeof(char) * nsss ) ; } strcat(sss,buf) ; nuuu = strlen(sss) ; for( ii=0 ; ii < PALTAB_NUM(GPT) ; ii++ ){ if( PALTAB_ARR(GPT,ii) == NULL ){ sprintf(buf,"#%2d: *** EMPTY PALETTE ***\n",ii) ; } else { sprintf(buf,"#%2d: %s has" , ii,PALTAB_ARR_LABEL(GPT,ii) ); nbuf = strlen(buf) ; nn = 0 ; for( jj=NPANE_MIN ; jj <= NPANE_MAX ; jj++ ){ if( (pp=PALTAB_ARR_PSGN(GPT,ii,jj)) != NULL ){ if( verb ){ sprintf(buf+nbuf,"\n") ; nbuf = strlen(buf) ; } sprintf(buf+nbuf," [%d]",jj) ; nn++ ; nbuf = strlen(buf) ; if( verb ){ for( kk=0 ; kk < jj ; kk++ ){ sprintf(buf+nbuf,"\n %s -> %f", dc->ovc->label_ov[pp->col[kk]] , pp->val[kk] ) ; nbuf = strlen(buf) ; } } else { if(nn%10 == 0){sprintf(buf+nbuf,"\n "); nbuf=strlen(buf);} } } if( (pp=PALTAB_ARR_PPOS(GPT,ii,jj)) != NULL ){ if( verb ){ sprintf(buf+nbuf,"\n") ; nbuf = strlen(buf) ; } sprintf(buf+nbuf," [%d+]",jj) ; nn++ ; nbuf = strlen(buf) ; if( verb ){ for( kk=0 ; kk < jj ; kk++ ){ if( pp->col[kk] >= 0 ) strcpy(s1,dc->ovc->label_ov[pp->col[kk]]) ; else strcpy(s1,"IGNORE") ; if( pp->val[kk] != PAL_FIGNORE ) sprintf(s2,"%f",pp->val[kk]) ; else strcpy(s2,"IGNORE") ; sprintf(buf+nbuf,"\n %s -> %s", s1,s2 ) ; nbuf = strlen(buf) ; } } else { if(nn%10 == 0){sprintf(buf+nbuf,"\n "); nbuf=strlen(buf);} } } } if( nn == 0) sprintf(buf+nbuf," nothing \n") ; else if( verb || nn%10 != 0) sprintf(buf+nbuf,"\n") ; } nbuf = strlen(buf) ; if( nbuf+nuuu+2 > nsss ){ nsss = nbuf+nuuu+128 ; sss = (char *) realloc( sss , sizeof(char) * nsss ) ; } strcat(sss,buf) ; nuuu = strlen(sss) ; } RETURN(sss) ; } /*------------------------------------------------------------------------------*/ void load_PBAR_palette_array( MCW_pbar *pbar, PBAR_palette_array *par, int fixim ) { int ii , jj , jm , nn ; PBAR_palette *pp ; ENTRY("load_PBAR_palette_array") ; if( pbar == NULL || par == NULL ) EXRETURN ; nn = 0 ; for( jj=NPANE_MIN ; jj <= NPANE_MAX ; jj++ ){ pp = par->psgn[jj] ; jm = 0 ; if( pp != NULL ){ if( pp->val[0] != PAL_FIGNORE ){ for( ii=0 ; ii < jj ; ii++ ) pbar->pval_save[jj][ii][jm] = pp->val[ii] ; pbar->pval_save[jj][jj][jm] = - pp->val[0] ; /* reflection */ } for( ii=0 ; ii < jj ; ii++ ) if( pp->col[ii] >= 0 && pp->col[ii] < pbar->dc->ovc->ncol_ov ) pbar->ovin_save[jj][ii][jm] = pp->col[ii] ; nn++ ; } pp = par->ppos[jj] ; jm = 1 ; if( pp != NULL ){ if( pp->val[0] != PAL_FIGNORE ){ for( ii=0 ; ii < jj ; ii++ ) pbar->pval_save[jj][ii][jm] = pp->val[ii] ; pbar->pval_save[jj][jj][jm] = 0.0 ; /* zero based */ } for( ii=0 ; ii < jj ; ii++ ) if( pp->col[ii] >= 0 && pp->col[ii] < pbar->dc->ovc->ncol_ov ) pbar->ovin_save[jj][ii][jm] = pp->col[ii] ; nn++ ; } } if( nn > 0 && !pbar->bigmode ){ Three_D_View * im3d = (Three_D_View *) pbar->parent ; if( fixim ){ HIDE_SCALE(im3d) ; } alter_MCW_pbar( pbar , 0 , NULL ) ; if( fixim ){ FIX_SCALE_SIZE(im3d) ; } } EXRETURN ; } /*--------------------------------------------------------------*/ char * AFNI_palette_label_CB( MCW_arrowval *av , XtPointer cd ) { static char blab[32] ; if( av->ival >= 0 && av->ival < PALTAB_NUM(GPT) ) sprintf(blab,"%-.14s",PALTAB_ARR_LABEL(GPT,av->ival)) ; else strcpy(blab,"???") ; return blab ; } /*----------------------------------------------------------------- Event handler to find #3 button press for pbar popup -------------------------------------------------------------------*/ void AFNI_pbar_EV( Widget w , XtPointer cd , XEvent *ev , Boolean *continue_to_dispatch ) { Three_D_View *im3d = (Three_D_View *) cd ; ENTRY("AFNI_pbar_EV") ; if( ! IM3D_OPEN(im3d) ) EXRETURN ; switch( ev->type ){ case ButtonPress:{ XButtonEvent *event = (XButtonEvent *) ev ; im3d->vwid->butx = event->x_root ; /* 17 May 2005 */ im3d->vwid->buty = event->y_root ; event->button = Button3 ; /* fakeout */ XmMenuPosition( im3d->vwid->func->pbar_menu , event ) ; /* where */ XtManageChild ( im3d->vwid->func->pbar_menu ) ; /* popup */ } break ; } EXRETURN ; } /*--------------------------------------------------------------- Callbacks for all actions in the pbar popup -----------------------------------------------------------------*/ void AFNI_pbar_CB( Widget w , XtPointer cd , XtPointer cbs ) { Three_D_View *im3d = (Three_D_View *) cd ; MCW_pbar *pbar ; int npane , jm , ii ; double pmax , pmin ; float pval[NPANE_MAX+1] ; ENTRY("AFNI_pbar_CB") ; if( ! IM3D_OPEN(im3d) ) EXRETURN ; #if 0 if( AFNI_splash_isopen() == 1 ){ BEEPIT ; EXRETURN ; } #endif pbar = im3d->vwid->func->inten_pbar ; npane = pbar->num_panes ; jm = pbar->mode ; pmax = pbar->pval_save[npane][0][jm] ; pmin = pbar->pval_save[npane][npane][jm] ; /*--- Equalize spacings ---*/ if( w == im3d->vwid->func->pbar_equalize_pb ){ if( pbar->bigmode ){ BEEPIT; EXRETURN; } /* 30 Jan 2003 */ for( ii=0 ; ii <= npane ; ii++ ) pval[ii] = pmax - ii * (pmax-pmin)/npane ; HIDE_SCALE(im3d) ; alter_MCW_pbar( pbar , 0 , pval ) ; FIX_SCALE_SIZE(im3d) ; } /*--- Set top value ---*/ else if( w == im3d->vwid->func->pbar_settop_pb ){ MCW_choose_integer( im3d->vwid->func->options_label , "Pbar Top" , 0 , 99999 , 1 , AFNI_set_pbar_top_CB , cd ) ; } /*--- Read in a palette file ---*/ else if( w == im3d->vwid->func->pbar_readin_pb ){ XmString xstr ; AFNI_make_file_dialog( im3d ) ; XtAddCallback( im3d->vwid->file_sbox , XmNokCallback , AFNI_finalize_read_palette_CB , cd ) ; XtAddCallback( im3d->vwid->file_sbox , XmNcancelCallback , AFNI_finalize_read_palette_CB , cd ) ; XtAddCallback( im3d->vwid->file_sbox , XmNhelpCallback , AFNI_finalize_read_palette_CB , cd ) ; im3d->vwid->file_cb = AFNI_finalize_read_palette_CB ; im3d->vwid->file_cd = cd ; XtVaSetValues( im3d->vwid->file_dialog, XmNtitle, (pbar->bigmode) ? "AFNI: Read colorscale" : "AFNI: Read Palette" , NULL ) ; xstr = XmStringCreateLtoR( "*.pal" , XmFONTLIST_DEFAULT_TAG ) ; XtVaSetValues( im3d->vwid->file_sbox , XmNpattern , xstr , NULL ) ; XmStringFree(xstr) ; XtPopup( im3d->vwid->file_dialog , XtGrabNone ) ; RWC_sleep(1); RWC_visibilize_widget( im3d->vwid->file_dialog ) ; /* 09 Nov 1999 */ } /*--- Write out a palette file ---*/ else if( w == im3d->vwid->func->pbar_writeout_pb ){ MCW_choose_string( im3d->vwid->func->options_label , (pbar->bigmode) ? "Colorscale Name" : "Palette Name" , NULL , AFNI_finalize_write_palette_CB , cd ) ; } /*--- Display the palette table ---*/ else if( w == im3d->vwid->func->pbar_showtable_pb ){ char * dum = dump_PBAR_palette_table(1) ; new_MCW_textwin( im3d->vwid->func->options_label, dum, TEXT_READONLY ) ; free(dum) ; } /*--- Save pbar into image file ---*/ else if( w == im3d->vwid->func->pbar_saveim_pb ){ MCW_choose_string( im3d->vwid->func->options_label , "PPM file prefix" , NULL , AFNI_finalize_saveim_CB , cd ) ; } /*---- 10 Feb 2004: start the Edit Environment pseudo-plugin ----*/ else if( w == im3d->vwid->func->pbar_environment_pb && w != NULL ){ AFNI_misc_CB( im3d->vwid->dmode->misc_environ_pb , (XtPointer) im3d , (XtPointer) NULL ) ; } /*** done ***/ EXRETURN ; } /*----------------------------------------------------------------------------*/ void AFNI_palette_av_CB( MCW_arrowval * av , XtPointer cd ) { Three_D_View * im3d = (Three_D_View *) cd ; ENTRY("AFNI_palette_av_CB") ; if( ! IM3D_VALID(im3d) || GPT == NULL ) EXRETURN ; if( av->ival < 0 || av->ival >= PALTAB_NUM(GPT) ) EXRETURN ; load_PBAR_palette_array( im3d->vwid->func->inten_pbar , PALTAB_ARR(GPT,av->ival) , 1 ) ; if( im3d->vinfo->func_visible ) AFNI_redisplay_func( im3d ) ; EXRETURN ; } /*----------------------------------------------------------------------------*/ void AFNI_finalize_read_palette_CB( Widget w, XtPointer cd, XtPointer cb ) { Three_D_View * im3d = (Three_D_View *) cd ; XmFileSelectionBoxCallbackStruct * cbs = (XmFileSelectionBoxCallbackStruct *) cb ; char * dum ; ENTRY("AFNI_finalize_read_palette_CB") ; switch( cbs->reason ){ /** close the file selection dialog **/ case XmCR_CANCEL: RWC_XtPopdown( im3d->vwid->file_dialog ) ; break ; /** try to read a new palette **/ case XmCR_OK:{ char * text = NULL ; int ii , npal1 , npal2 ; Three_D_View * qq3d ; XmStringGetLtoR( cbs->value , XmFONTLIST_DEFAULT_TAG , &text ) ; if( text != NULL ){ if( THD_is_file(text) && !THD_is_directory(text) ){ /* read in file */ if( im3d->vwid->func->inten_pbar->bigmode ){ /* 22 Oct 2003 */ char *cmd = AFNI_suck_file( text ) ; ii = PBAR_define_bigmap(cmd); free(cmd); if( ii == 0 ) RWC_XtPopdown( im3d->vwid->file_dialog ) ; else (void) MCW_popup_message( w , "******************************\n" "** Can't use the colorscale **\n" "** file you selected! **\n" "******************************" , MCW_USER_KILL | MCW_TIMER_KILL ) ; } else { npal1 = (GPT == NULL) ? 0 : PALTAB_NUM(GPT) ; /* how many before */ AFNI_process_setup( text , SETUP_LATER_MODE , im3d->dc ) ; npal2 = (GPT == NULL) ? 0 : PALTAB_NUM(GPT) ; /* how many after */ if( npal2 > npal1 ){ /* if got some new ones */ for( ii=0 ; ii < MAX_CONTROLLERS ; ii++ ){ qq3d = GLOBAL_library.controllers[ii] ; if( IM3D_VALID(qq3d) ){ refit_MCW_optmenu( qq3d->vwid->func->pbar_palette_av , 0 , /* new minval */ npal2-1 , /* new maxval */ 0 , /* new inival */ 0 , /* new decim? */ AFNI_palette_label_CB , /* text routine */ NULL /* text data */ ) ; /* 14 Jul 1998: whoops */ XtManageChild( qq3d->vwid->func->pbar_palette_av->wrowcol ) ; /* 18 Sep 1998: set this palette to be the active one in the caller */ if( qq3d == im3d ){ AV_assign_ival( qq3d->vwid->func->pbar_palette_av , PALTAB_NUM(GPT)-1 ) ; AFNI_palette_av_CB( qq3d->vwid->func->pbar_palette_av , im3d ) ; } } } } dum = dump_PBAR_palette_table(0) ; (void) MCW_popup_message( im3d->vwid->func->options_label , dum , MCW_USER_KILL | MCW_TIMER_KILL ) ; free(dum) ; RWC_XtPopdown( im3d->vwid->file_dialog ) ; /* done with dialog */ } } else { /* bad filename */ (void) MCW_popup_message( w , "****************************\n" "** Can't open the palette **\n" "** file you selected! **\n" "****************************" , MCW_USER_KILL | MCW_TIMER_KILL ) ; BEEPIT ; } XtFree(text) ; } } break ; case XmCR_HELP: (void) MCW_popup_message( w , "To read in a palette file, use the\n" "Directories and Files selectors,\n" "and the Filter entry and button,\n" "to get the 'Selection' box correct;\n" "that is, 'Selection' should be the\n" "the name of the file you want to read.\n" "Then press 'Set'.\n\n" "N.B.: To use the new palette(s), you\n" " must use the 'Set Pal' chooser." , MCW_USER_KILL ) ; break ; } EXRETURN ; } /*----------------------------------------------------------------------------*/ void AFNI_set_pbar_top_CB( Widget wcaller , XtPointer cd , MCW_choose_cbs * cbs ) { Three_D_View * im3d = (Three_D_View *) cd ; MCW_pbar * pbar ; float pval[NPANE_MAX+1] ; double pmin,pmax , fac ; int ii ; ENTRY("AFNI_set_pbar_top_CB") ; if( ! IM3D_OPEN(im3d) ) EXRETURN ; pmax = cbs->fval ; if( pmax <= 0.0 ){ BEEPIT; EXRETURN; } pbar = im3d->vwid->func->inten_pbar ; HIDE_SCALE(im3d) ; if( pbar->bigmode ){ /* 30 Jan 2003 */ pbar->bigset = 0 ; pmin = (pbar->mode) ? 0.0 : -pmax ; PBAR_set_bigmode( pbar , 1 , pmin,pmax ) ; AFNI_inten_pbar_CB( pbar , im3d , 0 ) ; POPUP_cursorize( pbar->panew ) ; /* 08 Apr 2005 */ } else { fac = pmax / pbar->pval[0] ; for( ii=0 ; ii <= pbar->num_panes ; ii++ ) pval[ii] = fac * pbar->pval[ii] ; alter_MCW_pbar( pbar , 0 , pval ) ; NORMAL_cursorize( pbar->panew ) ; /* 08 Apr 2005 */ } FIX_SCALE_SIZE(im3d) ; EXRETURN ; } /*----------------------------------------------------------------------------*/ void AFNI_finalize_write_palette_CB( Widget wcaller, XtPointer cd, MCW_choose_cbs *cbs ) { Three_D_View *im3d = (Three_D_View *) cd ; int ll , ii , jj ; char *fname , *ptr ; FILE *fp ; MCW_pbar *pbar ; int jm , npane , novu , ovu[NPANE_MAX] ; int *ovin ; float *pval ; ENTRY("AFNI_finalize_write_palette_CB") ; if( ! IM3D_OPEN(im3d) || cbs->reason != mcwCR_string || cbs->cval == NULL || (ll=strlen(cbs->cval)) == 0 ){BEEPIT; EXRETURN;} fname = (char *) malloc( sizeof(char) * (ll+8) ) ; strcpy( fname , cbs->cval ) ; if( ll > 240 || ! THD_filename_ok(fname) ){free(fname); BEEPIT; EXRETURN;} ptr = strstr(fname,".pal") ; if( ptr == NULL || ptr[4] != '0' ){ strcat(fname,".pal"); ll += 4; } fp = fopen( fname , "a" ) ; if( fp == NULL ){ char buf[512] ; sprintf(buf,"Can't open file\n %s\nfor writing!",fname) ; (void) MCW_popup_message( im3d->vwid->func->options_label , buf , MCW_USER_KILL | MCW_TIMER_KILL ) ; BEEPIT ; free(fname) ; EXRETURN ; } else { char buf[512] ; sprintf(buf,"\nWriting current palette to file\n %s\n",fname) ; (void) MCW_popup_message( im3d->vwid->func->options_label , buf , MCW_USER_KILL | MCW_TIMER_KILL ) ; } pbar = im3d->vwid->func->inten_pbar ; npane = pbar->num_panes ; jm = pbar->mode ; ovin = pbar->ov_index ; pval = pbar->pval ; /* 22 Oct 2003: Colorscale? */ if( pbar->bigmode ){ fprintf(fp,"%s\n",pbar->bigname) ; for( ii=0 ; ii < NPANE_BIG ; ii++ ) fprintf(fp,"#%02x%02x%02x\n", (unsigned int)pbar->bigcolor[ii].r , (unsigned int)pbar->bigcolor[ii].g , (unsigned int)pbar->bigcolor[ii].b ) ; } else { /* make list of all discrete colors used, pruning redundancies */ novu = 1 ; ovu[0] = ovin[0] ; for( ii=1 ; ii < npane ; ii++ ){ /* check each pane */ for( jj=0 ; jj < novu ; jj++ ) /* for match with current list */ if( ovin[ii] == ovu[jj] ) break ; if( jj == novu ) /* didn't find a match */ ovu[novu++] = ovin[ii] ; } /* write colors to file */ fprintf( fp , "\n***COLORS\n" ) ; for( ii=0 ; ii < novu ; ii++ ){ if( ovu[ii] > 0 ) /* don't write 'none' */ fprintf( fp , " %s = %s\n" , im3d->dc->ovc->label_ov[ovu[ii]] , im3d->dc->ovc->name_ov[ovu[ii]] ) ; } fname[ll-4] = '\0' ; fprintf( fp , "\n***PALETTES %s [%d%s\n" , fname , npane , (jm==0) ? "]" : "+]" ) ; for( ii=0 ; ii < npane ; ii++ ) fprintf( fp , " %f -> %s\n" , pval[ii] , im3d->dc->ovc->label_ov[ovin[ii]] ) ; } POPDOWN_string_chooser; fclose(fp); free(fname); EXRETURN; } /*----------------------------------------------------------------------------*/ void AFNI_finalize_saveim_CB( Widget wcaller, XtPointer cd, MCW_choose_cbs * cbs ) { Three_D_View * im3d = (Three_D_View *) cd ; char * fname , * ptr ; int ll , nx=20 , ny=256 ; MRI_IMAGE * im ; ENTRY("AFNI_finalize_saveim_CB") ; if( ! IM3D_OPEN(im3d) || cbs->reason != mcwCR_string || cbs->cval == NULL || (ll=strlen(cbs->cval)) == 0 ){BEEPIT; EXRETURN;} fname = (char *) malloc( sizeof(char) * (ll+8) ) ; strcpy( fname , cbs->cval ) ; if( ll > 240 || ! THD_filename_ok(fname) ){free(fname); BEEPIT; EXRETURN;} if( !STRING_HAS_SUFFIX_CASE(fname,".ppm") && !STRING_HAS_SUFFIX_CASE(fname,".pnm") && !STRING_HAS_SUFFIX_CASE(fname,".jpg") && !STRING_HAS_SUFFIX_CASE(fname,".png") ) strcat(fname,".ppm") ; INFO_message("Writing palette image to %s",fname) ; ptr = getenv( "AFNI_PBAR_IMXY" ); if( ptr != NULL ){ ll = sscanf( ptr , "%dx%d" , &nx , &ny ) ; if( ll < 2 || nx < 1 || ny < 32 ){ nx=20; ny=256; } } im = MCW_pbar_to_mri( im3d->vwid->func->inten_pbar , nx,ny ) ; mri_write_pnm( fname , im ) ; POPDOWN_string_chooser; mri_free(im); free(fname); EXRETURN; } /*----------------------------------------------------------------------------*/ void AFNI_palette_tran_CB( MCW_arrowval * av , XtPointer cd ) { Three_D_View * im3d = (Three_D_View *) cd ; ENTRY("AFNI_palette_tran_CB") ; if( !IM3D_VALID(im3d) ) EXRETURN ; if( av == im3d->vwid->func->pbar_transform0D_av ){ /* 15 Jun 2000 */ im3d->vwid->func->pbar_transform0D_index = av->ival ; if( av->ival == 0 ) im3d->vwid->func->pbar_transform0D_func = NULL ; else { im3d->vwid->func->pbar_transform0D_func = GLOBAL_library.registered_0D.funcs[av->ival-1]; if( GLOBAL_library.registered_0D.func_init[av->ival-1] != NULL ) GLOBAL_library.registered_0D.func_init[av->ival-1]() ; } } else if( av == im3d->vwid->func->pbar_transform2D_av ){ /* 16 Jun 2000 */ im3d->vwid->func->pbar_transform2D_index = av->ival ; if( av->ival == 0 ) im3d->vwid->func->pbar_transform2D_func = NULL ; else{ im3d->vwid->func->pbar_transform2D_func = GLOBAL_library.registered_2D.funcs[av->ival-1]; if( GLOBAL_library.registered_2D.func_init[av->ival-1] != NULL ) GLOBAL_library.registered_2D.func_init[av->ival-1]() ; } } if( im3d->vinfo->func_visible ) AFNI_redisplay_func( im3d ) ; EXRETURN ; } /*****************************************************************************/ /************* Functions for all actions in the thr_label popup *************/ /*---------------------------------------------------------------------*/ /* Put a '*' next to the active item in the vedit list on the menu. */ static char *thrbutlab[] = { " Clear Edit" , " Clusterize" } ; #define NTHRBUT (sizeof(thrbutlab)/sizeof(char *)) void set_vedit_label( Three_D_View *im3d , int ll ) { char lab[64] ; if( !IM3D_OPEN(im3d) ) return ; strcpy(lab,thrbutlab[0]); if( ll==0 ) lab[0] = '*' ; MCW_set_widget_label( im3d->vwid->func->clu_clear_pb , lab ) ; strcpy(lab,thrbutlab[1]); if( ll==1 ) lab[0] = '*' ; MCW_set_widget_label( im3d->vwid->func->clu_cluster_pb , lab ) ; return ; } /*---------------------------------------------------------------*/ /* Callback from the clusterize parameter chooser. */ static void AFNI_cluster_choose_CB( Widget wc, XtPointer cd, MCW_choose_cbs *cbs ) { Three_D_View *im3d = (Three_D_View *)cd ; float *vec = (float *)(cbs->cval) , rmm,vmul ; ENTRY("AFNI_cluster_choose_CB") ; if( ! IM3D_OPEN(im3d) ) EXRETURN ; rmm = vec[0] ; vmul = vec[1] ; if( vmul <= 0.0 ){ im3d->vedset.code = 0 ; AFNI_vedit_clear( im3d->fim_now ) ; set_vedit_label(im3d,0) ; VEDIT_unhelpize(im3d) ; } else { im3d->vedset.code = VEDIT_CLUST ; im3d->vedset.param[2] = rmm ; im3d->vedset.param[3] = vmul ; set_vedit_label(im3d,1) ; } if( im3d->vinfo->func_visible ) AFNI_redisplay_func( im3d ) ; EXRETURN ; } /*---------------------------------------------------------------*/ /* Callback for items on the thr_label menu itself. */ void AFNI_clu_CB( Widget w , XtPointer cd , XtPointer cbs ) { Three_D_View *im3d = (Three_D_View *)cd ; ENTRY("AFNI_clu_CB") ; if( ! IM3D_OPEN(im3d) ) EXRETURN ; /*--- Clear editing ---*/ if( w == im3d->vwid->func->clu_clear_pb ){ im3d->vedset.code = 0 ; AFNI_vedit_clear( im3d->fim_now ) ; set_vedit_label(im3d,0) ; VEDIT_unhelpize(im3d) ; if( im3d->vinfo->func_visible ) AFNI_redisplay_func( im3d ) ; EXRETURN ; } /*--- Get clusterizing parameters ---*/ if( w == im3d->vwid->func->clu_cluster_pb ){ char *lvec[2] = { "rmm " , "vmul" } ; int ivec[2] ; if( im3d->vedset.code == VEDIT_CLUST ){ ivec[0] = im3d->vedset.param[2] ; if( ivec[0] <= 0 ) ivec[0] = 0 ; ivec[1] = im3d->vedset.param[3] ; if( ivec[1] <= 0 ) ivec[1] = 20 ; } else { ivec[0] = 0 ; ivec[1] = 20 ; } MCW_choose_vector( im3d->vwid->func->thr_label , "Clusterize Parameters" , 2 , lvec,ivec , AFNI_cluster_choose_CB , (XtPointer)im3d ) ; EXRETURN ; } EXRETURN ; /* should be unreachable */ } #if 0 /*----------------------------------------------------------------- Event handler to find #3 button press for thr_label popup; just pops up the menu for the user's gratification. -------------------------------------------------------------------*/ void AFNI_thr_EV( Widget w , XtPointer cd , XEvent *ev , Boolean *continue_to_dispatch ) { Three_D_View *im3d = (Three_D_View *)cd ; ENTRY("AFNI_thr_EV") ; if( ! IM3D_OPEN(im3d) ) EXRETURN ; switch( ev->type ){ case ButtonPress:{ XButtonEvent *event = (XButtonEvent *) ev ; im3d->vwid->butx = event->x_root ; /* 17 May 2005 */ im3d->vwid->buty = event->y_root ; event->button = Button3 ; /* fakeout */ XmMenuPosition( im3d->vwid->func->thr_menu , event ) ; /* where */ XtManageChild ( im3d->vwid->func->thr_menu ) ; /* popup */ } break ; } EXRETURN ; } #endif