Create Xref-Html Frames                    Remove All Frames
file:d:/code/LRC/Splicer/splicer_code_ver2.2/splicer-callbacks-c.c        (Fri Sep 03 17:16:36 2004 )


   1: /*
   2:  * Generated by the ICS builderXcessory (BX).
   3:  *
   4:  *
   5:  * Builder Xcessory 3.0.
   6:  *
   7:  */
   8: #include <Xm/Xm.h>
   9: #include <Xm/Text.h>
  10: #include <Xm/TextF.h>
  11: #include <Xm/ToggleB.h>
  12: #include <Xm/FileSB.h>
  13: #include <Xm/List.h>
  14: #include <X11/keysymdef.h>
  15: #include <X11/cursorfont.h>
  16: #include <stdio.h>
  17: #include<time.h>
  18: /*
  19:  * Standard includes for builtins.
  20:  */
  21: #include <string.h>
  22: #include <ctype.h>
  23: #include <math.h>
  24: #include <malloc.h>
  25: #include "splicer-creation-c.h"
  26: #include "splicer_vars.h"
  27: /*
  28:  * Macros to make code look nicer between ANSI and K&R.
  29:  */
  30: #ifndef ARGLIST
  31: #if (NeedFunctionPrototypes == 0)
  32: #define PROTOTYPE(p)  ()
  33: #define ARGLIST(p)  p
  34: #define ARG(a, b) a b;
  35: #define GRA(a, b) a b;
  36: #define UARG(a, b)      a b;
  37: #define GRAU(a, b)      a b;
  38: #else
  39: #define PROTOTYPE(p)  p
  40: #define ARGLIST(p)  (
  41: #define ARG(a, b) a b,
  42: #define GRA(a, b) a b)
  43: #ifdef __cplusplus
  44: #define UARG(a, b)      a,
  45: #define GRAU(a, b)      a)
  46: #else
  47: #define UARG(a, b)      a b,
  48: #define GRAU(a, b)      a b)
  49: #endif
  50: #endif
  51: #endif
  52: 
  53: Widget    BxFindTopShell PROTOTYPE((Widget));
  54: WidgetList  BxWidgetIdsFromNames PROTOTYPE((Widget, char*, char*));
  55: 
  56: void  XmFileSelectionDoSearch();
  57: 
  58: 
  59: /*      Function Name:  BxExitCB
  60:  *
  61:  *      Description:    This functions expects an integer to be passed in
  62:  *            client data.  It calls the exit() system call with
  63:  *      the integer value as the argument to the function.
  64:  *
  65:  *      Arguments:      Widget    w:  the activating widget.
  66:  *      XtPointer client: the integer exit value.
  67:  *      XtPointer call: the call data (unused).
  68:  */
  69: 
  70: /* ARGSUSED */
  71: void
  72: BxExitCB ARGLIST((w, client, call))
  73: UARG( Widget, w)
  74: ARG( XtPointer, client)
  75: GRAU( XtPointer, call)
  76: {
  77:     int   exitValue = (int)client;
  78:   void  exit();
  79:     
  80:     SpExit();
  81:     exit(exitValue);
  82: }
  83: 
  84: /*      Function Name:  SpDialogCB
  85:  *
  86:  *      Description:    This function causes the named dialog to be
  87:  *            managed and displayed.
  88:  *      
  89:  *
  90:  *      Arguments:      Widget    w:  the activating widget.
  91:  *      XtPointer client: dialog to manage
  92:  *      XtPointer call: the call data (unused).
  93:  */
  94: /* ARGSUSED */
  95: void
  96: SpDialogCB(w, client, call)
  97: Widget w;
  98: XtPointer client;
  99: XtPointer call;
 100: {
 101: }
 102: 
 103: 
 104: /*      Function Name:  SpOkSaveReportCB
 105:  *
 106:  *      Description:    This function sets up the report file information and
 107:  *            opens the file for use.
 108:  *      
 109:  *
 110:  *      Arguments:      Widget    w:  the activating widget
 111:  *      XtPointer client: unused
 112:  *      XtPointer call: the call data (unused).
 113:  */
 114: /* ARGSUSED */
 115: void
 116: SpOkSaveReportCB(w, client, call)
 117: Widget w;
 118: XtPointer client;
 119: XtPointer call;
 120: {
 121: }
 122: 
 123: /*      Function Name:  BxUnmanageCB
 124:  *
 125:  *      Description:    Given a string of the form:
 126:  *            "(WL)[widgetName, widgetName, ...]"
 127:  *      BxUnmanageCB attempts to convert the name to a Widget
 128:  *      ID and unmanage the widget.
 129:  *
 130:  *      Arguments:      Widget      w:      the widget activating the callback.
 131:  *            XtPointer   client: the list of widget names to attempt
 132:  *              to find and unmanage.
 133:  *            XtPointer   call:   the call data (unused).
 134:  *
 135:  *      Notes:        * This function expects that there is an application
 136:  *            shell from which all other widgets are descended.
 137:  */
 138: 
 139: /* ARGSUSED */
 140: void
 141: BxUnmanageCB ARGLIST((w, client, call))
 142: ARG( Widget, w)
 143: ARG( XtPointer, client)
 144: GRAU( XtPointer, call)
 145: {
 146:     WidgetList    widgets;
 147:     int     i;
 148: 
 149:     /*
 150:      * This function returns a NULL terminated WidgetList.  The memory for
 151:      * the list needs to be freed when it is no longer needed.
 152:      */
 153:     widgets = BxWidgetIdsFromNames(w, "BxUnmanageCB", (String)client);
 154: 
 155:     i = 0;
 156:     while( widgets && widgets[i] != NULL )
 157:     {
 158:   XtUnmanageChild(widgets[i]);
 159:   i++;
 160:     }
 161:     XtFree((char *)widgets);
 162: }
 163: 
 164: /*      Function Name:  SpCloseOKCB
 165:  *
 166:  *      Description:    This function closes the selected data files.
 167:  *            
 168:  *      
 169:  *
 170:  *      Arguments:      Widget    w:  PushButtonCloseOK
 171:  *      XtPointer client: unused
 172:  *      XtPointer call: the call data (unused).
 173:  */
 174: /* ARGSUSED */
 175: void
 176: SpCloseOKCB(w, client, call)
 177: Widget w;
 178: XtPointer client;
 179: XtPointer call;
 180: {
 181:   /*SUPPRESS 594*/
 182: }
 183: 
 184: 
 185: /*      Function Name:  SpCloseDataCB
 186:  *
 187:  *      Description:    This function displays the close data file selection
 188:  *            dialog that allows the user to select which of the 
 189:  *      open data files to close.
 190:  *
 191:  *      Arguments:      Widget    w:  pushButtonCloseData
 192:  *      XtPointer client: unused
 193:  *      XtPointer call: the call data (unused).
 194:  */
 195: /* ARGSUSED */
 196: void
 197: SpCloseDataCB(w, client, call)
 198: Widget w;
 199: XtPointer client;
 200: XtPointer call;
 201: {
 202:   /*SUPPRESS 594*/
 203: }
 204: 
 205: /*      Function Name:  BxManageCB
 206:  *
 207:  *      Description:    Given a string of the form:
 208:  *            "(WL)[widgetName, widgetName, ...]"
 209:  *      BxManageCB attempts to convert the name to a Widget
 210:  *      ID and manage the widget.
 211:  *
 212:  *      Arguments:      Widget      w:      the widget activating the callback.
 213:  *            XtPointer   client: the list of widget names to attempt
 214:  *              to find and manage.
 215:  *            XtPointer   call:   the call data (unused).
 216:  *
 217:  *      Notes:        * This function expects that there is an application
 218:  *            shell from which all other widgets are descended.
 219:  */
 220: 
 221: /* ARGSUSED */
 222: void
 223: BxManageCB ARGLIST((w, client, call))
 224: ARG( Widget, w)
 225: ARG( XtPointer, client)
 226: GRAU( XtPointer, call)
 227: {
 228:     WidgetList    widgets;
 229:     int     i;
 230: 
 231:     /*
 232:      * This function returns a NULL terminated WidgetList.  The memory for
 233:      * the list needs to be freed when it is no longer needed.
 234:      */
 235:     widgets = BxWidgetIdsFromNames(w, "BxManageCB", (String)client);
 236: 
 237:     i = 0;
 238:     while( widgets && widgets[i] != NULL )
 239:     {
 240:   XtManageChild(widgets[i]);
 241:   i++;
 242:     }
 243:     XtFree((char *)widgets);
 244: 
 245: }
 246: 
 247: 
 248: /*      Function Name:  SpOpenFilterCB
 249:  *
 250:  *      Description:    This function updates the files and directories 
 251:  *            in the open data file menu after a new filter
 252:  *      has been set.
 253:  *
 254:  *      Arguments:      Widget    w:  textOpenFilter
 255:  *      XtPointer client: unused
 256:  *      XtPointer call: the call data (unused).
 257:  */
 258: /* ARGSUSED */
 259: void
 260: SpOpenFilterCB(w, client, call)
 261: Widget w;
 262: XtPointer client;
 263: XtPointer call;
 264: {
 265:   /*SUPPRESS 594*/
 266:   SpUpdateOpen(FILE_FILTER);
 267: 
 268:         (void)sprintf(preview_input_path,"%s",current_path);
 269: }
 270: 
 271: /*      Function Name:  SpOpenSelectCB
 272:  *
 273:  *      Description:    This functions is called when the select file button
 274:  *      is pressed in the open file dialog. It finds the
 275:  *      selected files in the OpenFiles list and adds them
 276:  *      to the OpenSelected list. A warning is issued if an
 277:  *      attempt is made to add a duplicate file.
 278:  *
 279:  *      Arguments:      Widget    w:  widget pushButtonOpenSelect.
 280:  *      XtPointer client: the user data (unused).
 281:  *      XtPointer call: the call data (unused).
 282:  */
 283: /* ARGSUSED */
 284: void
 285: SpOpenSelectCB(w, client, call)
 286: Widget w;
 287: XtPointer client;
 288: XtPointer call;
 289: {
 290:   XmString  *selected,xmstring,*requested; 
 291:   int   item_count,selected_count,i,j,exists=False,count;
 292:   char    *bufptr,*filename;
 293:   void    XmListAddItem(),XmListSetPos(), XmListSetBottomPos();
 294: 
 295:   /*SUPPRESS 594*/
 296: /* get selected items from file list */
 297:   (void)XtVaGetValues(listOpenFiles, XmNselectedItemCount,&item_count,
 298:     XmNselectedItems,&requested, NULL);
 299:   (void)XtVaGetValues(listOpenSelected, XmNitemCount,&selected_count,
 300:     XmNitems,&selected, NULL);
 301:   count=selected_count;
 302: /* loop through files. Do not include if it already exists */
 303:         if(item_count < 1) {
 304:           return;
 305:         }
 306:   for(i=0;i<item_count;i++)
 307:   {
 308:     if(!XmStringGetLtoR(requested[i],XmFONTLIST_DEFAULT_TAG,&filename))
 309:     {
 310:       message.error=True;
 311:       message.fatal=False;
 312:                         message.caller=NONE;
 313:                         message.type=XmDIALOG_WARNING;
 314:                         message.default_button=XmDIALOG_OK_BUTTON;
 315:       if((message.label=(char*)calloc(200,CHAR_SIZE))==NULL)
 316:         SpBadMemAlloc("SpOpenSelectCB 0");
 317:       else
 318:         (void)sprintf(message.label,"Unable to get requested filename from list!");
 319:       SpManageMessage(message);
 320:     }
 321:     if((charptr=(char*)calloc((int)strlen(filename)+5,CHAR_SIZE))==NULL)
 322:       SpBadMemAlloc("SpOpenSelectCB 1");
 323:     (void)sprintf(charptr,"%s",filename);
 324:     XtFree(filename);
 325:     xmstring=XmCvtCTToXmString(charptr);
 326:   /* check if file is already in selected list, if not add to list*/
 327:     for(j=0;j<selected_count && !exists;j++)
 328:        if(XmStringCompare(xmstring,selected[j])) exists=True;
 329:     if(!exists)
 330:     {
 331:       XmListAddItem(listOpenSelected,xmstring,0);
 332:       count++;
 333:     }
 334:     else
 335:     {
 336:       if((bufptr=(char*)calloc((int)strlen(charptr)+50,CHAR_SIZE))==NULL)
 337:         SpBadMemAlloc("SpOpenSelectCB 2");
 338:       (void)sprintf(bufptr,"File %s is already selected!",charptr);
 339:       SpManageWarningBox(bufptr);
 340:       free(bufptr);
 341:     }
 342:     XmStringFree(xmstring);
 343:     free(charptr);
 344:     exists=False;
 345:   }
 346: /* clean up */
 347:   XmListSetPos(listOpenSelected,1);
 348:   XmListDeselectAllItems(listOpenFiles);
 349:   XmListSetBottomPos(listOpenSelected,count);
 350: }
 351: 
 352: /*      Function Name:  SpOpenDeselectCB
 353:  *
 354:  *      Description:   This function removes the selected name(s) from  
 355:  *            the file selected list.
 356:  *      
 357:  *
 358:  *      Arguments:      Widget    w:  pushButtonOpenDeselect
 359:  *      XtPointer client: the integer exit value.
 360:  *      XtPointer call: the call data (unused).
 361:  */
 362: /* ARGSUSED */
 363: void
 364: SpOpenDeselectCB(w, client, call)
 365: Widget w;
 366: XtPointer client;
 367: XtPointer call;
 368: {
 369:   int position_count;
 370:   int *ptr_list = NULL;
 371:   Boolean XmListGetSelectedPos();
 372:   void  XmListDeletePos();
 373: 
 374: /* get list of selected file(s) and remove from listOpenSelected */
 375: 
 376:   if(XmListGetSelectedPos(listOpenSelected,&ptr_list,&position_count)) {
 377:       while(--position_count>=0)
 378:         (void)XmListDeletePos(listOpenSelected,ptr_list[position_count]);
 379:           /* clean up area */
 380:     if(ptr_list) XtFree((char *)ptr_list);
 381:     XmListDeselectAllItems(listOpenSelected);
 382:         }
 383: }
 384: 
 385: /*      Function Name:  SpOpenDirectoriesCB
 386:  *
 387:  *      Description:    This function updates the files and directories 
 388:  *            in the open data file menu after a new directory
 389:  *      has been selected.
 390:  *
 391:  *      Arguments:      Widget    w:  listOpenDirectories
 392:  *      XtPointer client: unused
 393:  *      XtPointer call: the call data (unused).
 394:  */
 395: /* ARGSUSED */
 396: void
 397: SpOpenDirectoriesCB(w, client, call)
 398: Widget w;
 399: XtPointer client;
 400: XtPointer call;
 401: {
 402:   /*SUPPRESS 594*/
 403:   SpUpdateOpen(DIRECTORIES);
 404: 
 405:         (void)sprintf(preview_input_path,"%s",current_path);
 406: }
 407: 
 408: /*      Function Name:  SPOpenAffineCB
 409:  *
 410:  *      Description:    This function gets the current affine table values and
 411:  *            opens a file selection dialog for affine table.
 412:  *
 413:  *      Arguments:      Widget    w:  the activating widget.
 414:  *      XtPointer client: unused
 415:  *      XtPointer call: the call data (unused).
 416:  */
 417: /* ARGSUSED */
 418: void
 419: SpOpenAffineCB(w, client, call)
 420: Widget w;
 421: XtPointer client;
 422: XtPointer call;
 423: {
 424:   /*SUPPRESS 594*/
 425: 
 426:   XmToggleButtonSetState(toggleButtonUseAffine,affine.usetable,FALSE);
 427:   XmToggleButtonSetState(toggleButtonNotUseAffine,!affine.usetable,FALSE);
 428:         if(affine.usetable == True) {
 429:     if((charptr=(char*)calloc((int)strlen(affine.filename)+5,CHAR_SIZE))==NULL)
 430:     SpBadMemAlloc("SpOpenAffineCB 1");
 431:     (void)sprintf(charptr,"%s",affine.filename);
 432:           XmTextSetString(textFieldAffineFileName,charptr);
 433:     free(charptr);
 434:           XtSetSensitive(pushButtonSelectAffineFileName, True);
 435:         }
 436:         else {
 437:           XmTextSetString(textFieldAffineFileName,"");
 438:           XtSetSensitive(pushButtonSelectAffineFileName, False);
 439:         }
 440:   XtManageChild(formUseAffine); 
 441: }
 442: 
 443: /*      Function Name:  SpCancelCB
 444:  *
 445:  *      Description:    This function is called by the cancel buttons in th
 446:  *            splicer application. Different actions are taken depending
 447:  *      on which widget has initiated the cancel.
 448:  *
 449:  *      Arguments:      Widget    w:  the activating widget.
 450:  *      XtPointer client: form to close
 451:  *      XtPointer call: the call data (unused).
 452:  */
 453: /* ARGSUSED */
 454: void
 455: SpCancelCB(w, client, call)
 456: Widget w;
 457: XtPointer client;
 458: XtPointer call;
 459: {
 460:   XmString  xmstring;
 461:   char    *ctstring;
 462:   char  cflag[200];
 463:   int i;
 464: 
 465:   /*SUPPRESS 594*/
 466: /* close widget */
 467:   Widget *closewidget = (Widget*)client;
 468:   XtUnmanageChild(*closewidget);
 469: 
 470: /* change values if necessary */
 471:   if(*closewidget==messageBoxWorking)
 472:   {
 473:     XtVaGetValues(*closewidget,XmNmessageString,&xmstring,NULL);
 474:     if(!XmStringGetLtoR(xmstring,XmFONTLIST_DEFAULT_TAG,&ctstring))
 475:     {
 476:       message.error=True;
 477:       message.fatal=False;
 478:                         message.caller=NONE;
 479:                         message.type=XmDIALOG_WARNING;
 480:                         message.default_button=XmDIALOG_OK_BUTTON;
 481:       if((message.label=(char*)calloc(200,CHAR_SIZE))==NULL)
 482:         SpBadMemAlloc("SpCanceCB 1");
 483:       else
 484:         (void)sprintf(message.label,"Unable to get message from working box");
 485:       SpManageMessage(message);
 486:     }
 487:     (void)sscanf(ctstring,"%s",cflag);
 488:     XtFree(ctstring);
 489:     for(i=0;i<NUM_CLEANUP_TYPES && (int)strcmp(cflag,cleanup_type[i]);i++);
 490:     if(i<NUM_CLEANUP_TYPES)
 491:       SpCleanUp(i);
 492:     SpManageWarningBox("Clean-up after halt attempted. Program may be unstable.");
 493:     XtRemoveWorkProc(work_id);
 494:   }
 495:         if(*closewidget==formOpen) {
 496:           open_dataform_is_up = NO;
 497:         }
 498: }
 499: 
 500: 
 501: /*      Function Name:  SpSmoothMethodsCB
 502:  *
 503:  *      Description:    This function is called when the data smoothing option
 504:  *            is changed. It sets up the smoothing dialog properly for
 505:  *      the selected method.
 506:  *
 507:  *      Arguments:      Widget    w:  a smooth method toggle button
 508:  *      XtPointer client: none
 509:  *      XtPointer call: the call data (unused).
 510:  */
 511: /* ARGSUSED */
 512: void
 513: SpSmoothMethodsCB(w, client, call)
 514: Widget w;
 515: XtPointer client;
 516: XtPointer call;
 517: {
 518:   if(XmToggleButtonGetState(toggleButtonSmoothNone))  /* no filter */
 519:   {
 520:     XmToggleButtonSetState(toggleButtonUnsmoothOnly,TRUE,FALSE);
 521:     XmToggleButtonSetState(toggleButtonSmoothOnly,FALSE,FALSE);
 522:     XmToggleButtonSetState(toggleButtonSmoothBoth,FALSE,FALSE);
 523:     XtSetSensitive(toggleButtonSmoothOnly,FALSE);
 524:     XtSetSensitive(toggleButtonSmoothBoth,FALSE);
 525:     XtSetSensitive(textFieldSmoothWidth,FALSE);
 526:     XtSetSensitive(optionMenuWidthUnits,FALSE);
 527: 
 528:                 XmToggleButtonSetState(toggleButtonPlotUnsmooth, True, NULL);
 529:                 XmToggleButtonSetState(toggleButtonPlotSmooth, False, NULL);
 530:                 XmToggleButtonSetState(toggleButtonPlotBoth, False, NULL);
 531:                 XtSetSensitive(toggleButtonPlotSmooth,FALSE); 
 532:                 XtSetSensitive(toggleButtonPlotUnsmooth,FALSE); 
 533:                 XtSetSensitive(toggleButtonPlotBoth,FALSE);
 534:   }
 535:   if(XmToggleButtonGetState(toggleButtonSmoothGaussian))  /* use gaussian filter */
 536:   {
 537:     XmToggleButtonSetState(toggleButtonUnsmoothOnly,FALSE,FALSE);
 538:                 XmToggleButtonSetState(toggleButtonSmoothOnly,FALSE,FALSE);
 539:                 XmToggleButtonSetState(toggleButtonSmoothBoth,TRUE,FALSE);
 540:     XtSetSensitive(toggleButtonSmoothOnly,TRUE);
 541:     XtSetSensitive(toggleButtonSmoothBoth,TRUE);
 542:     XtSetSensitive(textFieldSmoothWidth,TRUE);
 543:     XtSetSensitive(optionMenuWidthUnits,TRUE);
 544: 
 545:                 XmToggleButtonSetState(toggleButtonPlotUnsmooth, False, NULL); 
 546:                 XmToggleButtonSetState(toggleButtonPlotSmooth, False, NULL); 
 547:                 XmToggleButtonSetState(toggleButtonPlotBoth, True, NULL);
 548:                 XtSetSensitive(toggleButtonPlotSmooth,TRUE); 
 549:                 XtSetSensitive(toggleButtonPlotUnsmooth,TRUE); 
 550:                 XtSetSensitive(toggleButtonPlotBoth,TRUE);
 551:   }
 552:   else if(XmToggleButtonGetState(toggleButtonSmoothOther))  /* use other filter */
 553:   {
 554:   /* this option is not active, it sets the "none" option instead  and
 555:      warns the user */
 556:     XmToggleButtonSetState(toggleButtonSmoothOther,FALSE,FALSE);
 557:     XmToggleButtonSetState(toggleButtonSmoothNone,TRUE,FALSE);
 558:     XmToggleButtonSetState(toggleButtonUnsmoothOnly,TRUE,FALSE);
 559:     XmToggleButtonSetState(toggleButtonSmoothOnly,FALSE,FALSE);
 560:     XmToggleButtonSetState(toggleButtonSmoothBoth,FALSE,FALSE);
 561:     XtSetSensitive(toggleButtonSmoothOnly,FALSE);
 562:     XtSetSensitive(toggleButtonSmoothBoth,FALSE);
 563:     XtSetSensitive(textFieldSmoothWidth,FALSE);
 564:     XtSetSensitive(optionMenuWidthUnits,FALSE);
 565:              
 566:                 XmToggleButtonSetState(toggleButtonPlotUnsmooth, True, NULL); 
 567:                 XmToggleButtonSetState(toggleButtonPlotSmooth, False, NULL); 
 568:                 XmToggleButtonSetState(toggleButtonPlotBoth, False, NULL);
 569:                 XtSetSensitive(toggleButtonPlotSmooth,FALSE); 
 570:                 XtSetSensitive(toggleButtonPlotUnsmooth,FALSE); 
 571:                 XtSetSensitive(toggleButtonPlotBoth,FALSE);
 572: 
 573:                 if((message.label=(char*)calloc(100,CHAR_SIZE))==NULL)
 574:                         SpBadMemAlloc("Sp");
 575:                 (void)sprintf(message.label,"This Option is incomplete.");
 576:                 SpManageMessage(message);
 577:   }
 578: }
 579: 
 580: 
 581: /*      Function Name:  SpOpenSmoothCB
 582:  *
 583:  *      Description:    This function sets up and manages the smoothing
 584:  *            information dialog.
 585:  *
 586:  *      Arguments:      Widget    w:  pushButtonOpenSmooth
 587:  *      XtPointer client: unused
 588:  *      XtPointer call: the call data (unused).
 589:  */
 590: /* ARGSUSED */
 591: void
 592: SpOpenSmoothCB(w, client, call)
 593: Widget w;
 594: XtPointer client;
 595: XtPointer call;
 596: {
 597:   /*SUPPRESS 594*/
 598: /* get current default values and set them in dialog */
 599: /* smoothing methods */
 600:   if(smooth.method==NONE)
 601:   {
 602:     XmToggleButtonSetState(toggleButtonSmoothNone,TRUE,FALSE);
 603:     XmToggleButtonSetState(toggleButtonSmoothGaussian,FALSE,FALSE);
 604:     XmToggleButtonSetState(toggleButtonSmoothOther,FALSE,FALSE);
 605:     XtSetSensitive(textFieldSmoothWidth,FALSE);
 606:     XtSetSensitive(optionMenuWidthUnits,FALSE);
 607:     XtSetSensitive(toggleButtonSmoothOnly,FALSE);
 608:     XtSetSensitive(toggleButtonSmoothBoth,FALSE);
 609: 
 610:                 XtSetSensitive(toggleButtonPlotSmooth,FALSE);
 611:                 XtSetSensitive(toggleButtonPlotUnsmooth,FALSE);
 612:                 XtSetSensitive(toggleButtonPlotBoth,FALSE);
 613:   }
 614:   else if(smooth.method==GAUSSIAN)
 615:   {
 616:     XmToggleButtonSetState(toggleButtonSmoothNone,FALSE,FALSE);
 617:     XmToggleButtonSetState(toggleButtonSmoothGaussian,TRUE,FALSE);
 618:     XmToggleButtonSetState(toggleButtonSmoothOther,FALSE,FALSE);
 619:     XtSetSensitive(textFieldSmoothWidth,TRUE);
 620:     XtSetSensitive(optionMenuWidthUnits,TRUE);
 621:     XtSetSensitive(toggleButtonSmoothBoth,TRUE);
 622:     XtSetSensitive(toggleButtonSmoothOnly,TRUE);
 623: 
 624:                 XtSetSensitive(toggleButtonPlotSmooth,TRUE); 
 625:                 XtSetSensitive(toggleButtonPlotUnsmooth,TRUE); 
 626:                 XtSetSensitive(toggleButtonPlotBoth,TRUE);
 627:   }
 628:   else if (smooth.method==OTHER)
 629:   {
 630:   /* remember that this doesn't exist, use NONE instead */
 631:     XmToggleButtonSetState(toggleButtonSmoothNone,TRUE,FALSE);
 632:     XmToggleButtonSetState(toggleButtonSmoothGaussian,FALSE,FALSE);
 633:     XmToggleButtonSetState(toggleButtonSmoothOther,FALSE,FALSE);
 634:     XtSetSensitive(textFieldSmoothWidth,FALSE);
 635:     XtSetSensitive(optionMenuWidthUnits,FALSE);
 636:     XtSetSensitive(toggleButtonSmoothOnly,FALSE);
 637:     XtSetSensitive(toggleButtonSmoothBoth,FALSE);
 638: 
 639:                 XtSetSensitive(toggleButtonPlotSmooth,FALSE); 
 640:                 XtSetSensitive(toggleButtonPlotUnsmooth,FALSE); 
 641:                 XtSetSensitive(toggleButtonPlotBoth,FALSE);
 642:   }
 643:   else
 644:     SpManageWarningBox("Invalid Smoothing method used!");
 645: /* plot display choice */
 646:   if(smooth.plot==UNSMOOTHED)
 647:   {
 648:     XmToggleButtonSetState(toggleButtonUnsmoothOnly,TRUE,FALSE);
 649:     XmToggleButtonSetState(toggleButtonSmoothBoth,FALSE,FALSE);
 650:     XmToggleButtonSetState(toggleButtonSmoothOnly,FALSE,FALSE);
 651: 
 652:                 XmToggleButtonSetState(toggleButtonPlotUnsmooth,TRUE,NULL);
 653:                 XmToggleButtonSetState(toggleButtonPlotSmooth,FALSE,NULL);
 654:                 XmToggleButtonSetState(toggleButtonPlotBoth,FALSE,NULL);
 655:   }
 656:   else if(smooth.plot==SMOOTHED)
 657:   {
 658:     XmToggleButtonSetState(toggleButtonUnsmoothOnly,FALSE,FALSE);
 659:     XmToggleButtonSetState(toggleButtonSmoothBoth,FALSE,FALSE);
 660:     XmToggleButtonSetState(toggleButtonSmoothOnly,TRUE,FALSE);
 661: 
 662:                 XmToggleButtonSetState(toggleButtonPlotUnsmooth,FALSE,NULL); 
 663:                 XmToggleButtonSetState(toggleButtonPlotSmooth,TRUE,NULL); 
 664:                 XmToggleButtonSetState(toggleButtonPlotBoth,FALSE,NULL);
 665:   }
 666:   else if(smooth.plot==SMOOTHEDBOTH)
 667:   {
 668:     XmToggleButtonSetState(toggleButtonUnsmoothOnly,FALSE,FALSE);
 669:     XmToggleButtonSetState(toggleButtonSmoothBoth,TRUE,FALSE);
 670:     XmToggleButtonSetState(toggleButtonSmoothOnly,FALSE,FALSE);
 671: 
 672:                 XmToggleButtonSetState(toggleButtonPlotUnsmooth,FALSE,NULL); 
 673:                 XmToggleButtonSetState(toggleButtonPlotSmooth,FALSE,NULL); 
 674:                 XmToggleButtonSetState(toggleButtonPlotBoth,TRUE,NULL);
 675:   }
 676:   else
 677:     SpManageWarningBox("Invalid smoothing display option found!");
 678: /* smoothing options */
 679:   if(smooth.width_units==DEPTH)
 680:     XtVaSetValues(optionMenuWidthUnits,XmNmenuHistory,pushButtonUnitsDepth,NULL);
 681:   else if(smooth.width_units==POINTS)
 682:     XtVaSetValues(optionMenuWidthUnits,XmNmenuHistory,pushButtonUnitsPoints,NULL);
 683:   else
 684:     SpManageWarningBox("Invalid smoothing units supplied.");
 685:   if((charptr=(char*)calloc(20,CHAR_SIZE))==NULL)
 686:     SpBadMemAlloc("SpOpenSmoothCB 1");
 687:   (void)sprintf(charptr,"%d",smooth.width);
 688:   XmTextSetString(textFieldSmoothWidth,charptr);
 689:   free(charptr);
 690: /* manage dialog */
 691:   XtManageChild(formSmooth);
 692: }
 693: 
 694: /*      Function Name:  SpSmoothOKCB
 695:  *
 696:  *      Description:    This function saves the user selected smoothing 
 697:  *            values and unmanages the smoothing dialog.
 698:  *      
 699:  *
 700:  *      Arguments:      Widget    w:  pushButtonSmoothOK
 701:  *      XtPointer client: none
 702:  *      XtPointer call: the call data (unused).
 703:  */
 704: /* ARGSUSED */
 705: void
 706: SpSmoothOKCB(w, client, call)
 707: Widget w;
 708: XtPointer client;
 709: XtPointer call;
 710: {
 711:         int i;
 712:   Widget  tmp_widget;
 713:   XmString xmstring;
 714:         Cursor   cursor;
 715:         void SmoothData(), DrawDrawingAreaEdit(), DrawDrawingAreaView(), DrawDrawingAreaSpliceToAge();
 716: 
 717:   /*SUPPRESS 594*/
 718: /* get smooth method */
 719:   if(XmToggleButtonGetState(toggleButtonSmoothNone)){
 720:     smooth.method=NONE;
 721:                 XtSetSensitive(toggleButtonPlotSmooth,FALSE); 
 722:                 XtSetSensitive(toggleButtonPlotUnsmooth,FALSE); 
 723:                 XtSetSensitive(toggleButtonPlotBoth,FALSE);
 724:         }
 725:   else if(XmToggleButtonGetState(toggleButtonSmoothGaussian)){
 726:     smooth.method=GAUSSIAN;
 727:                 XtSetSensitive(toggleButtonPlotSmooth,TRUE); 
 728:                 XtSetSensitive(toggleButtonPlotUnsmooth,TRUE); 
 729:                 XtSetSensitive(toggleButtonPlotBoth,TRUE);
 730:         }
 731:   else if(XmToggleButtonGetState(toggleButtonSmoothOther)){
 732:     smooth.method=OTHER;
 733:                 XtSetSensitive(toggleButtonPlotSmooth,FALSE); 
 734:                 XtSetSensitive(toggleButtonPlotUnsmooth,FALSE); 
 735:                 XtSetSensitive(toggleButtonPlotBoth,FALSE);
 736:         }
 737: /* get plot display */
 738:   if(XmToggleButtonGetState(toggleButtonUnsmoothOnly)){
 739:     smooth.plot=UNSMOOTHED;
 740:                 XmToggleButtonSetState(toggleButtonPlotUnsmooth,TRUE,NULL);
 741:                 XmToggleButtonSetState(toggleButtonPlotSmooth,FALSE,NULL);
 742:                 XmToggleButtonSetState(toggleButtonPlotBoth,FALSE,NULL);
 743:         }
 744:   else if(XmToggleButtonGetState(toggleButtonSmoothOnly)){
 745:     smooth.plot=SMOOTHED;
 746:                 XmToggleButtonSetState(toggleButtonPlotUnsmooth,FALSE,NULL);
 747:                 XmToggleButtonSetState(toggleButtonPlotSmooth,TRUE,NULL);
 748:                 XmToggleButtonSetState(toggleButtonPlotBoth,FALSE,NULL);
 749:         }
 750:   else if(XmToggleButtonGetState(toggleButtonSmoothBoth)){
 751:     smooth.plot=SMOOTHEDBOTH;
 752:                 XmToggleButtonSetState(toggleButtonPlotUnsmooth,FALSE,NULL);
 753:                 XmToggleButtonSetState(toggleButtonPlotSmooth,FALSE,NULL);
 754:                 XmToggleButtonSetState(toggleButtonPlotBoth,TRUE,NULL);
 755:        }
 756: /* get width units */
 757:   XtVaGetValues(optionMenuWidthUnits,XmNmenuHistory,&tmp_widget,NULL);
 758:   if(tmp_widget==pushButtonUnitsDepth)
 759:     smooth.width_units=DEPTH;
 760:   else if(tmp_widget==pushButtonUnitsPoints)
 761:     smooth.width_units=POINTS;
 762: /* get width */
 763:   charptr=XmTextGetString(textFieldSmoothWidth);
 764:   smooth.width = atoi(charptr);
 765:         XtFree(charptr);
 766:         if(smooth.method != NONE && (smooth.width <= 0 || 
 767:            (smooth.width_units == DEPTH && smooth.width > MAXSMOOTHWIDTHDEPTH) ||
 768:            (smooth.width_units == POINTS && smooth.width > MAXSMOOTHWIDTHPOINTS))) { 
 769:           SpManageWarningBox("The width of the filter is unreasonable. Please re-enter.");
 770:           smooth.method = NONE;
 771:           return;
 772:         }
 773:         else if(smooth.method != NONE && smooth.width_units == POINTS && smooth.width < MINSMOOTHWIDTH) {
 774:           if((charptr=(char*)calloc(150,CHAR_SIZE))==NULL)
 775:                                         SpBadMemAlloc("SpSmoothOKCB");
 776:           (void)sprintf(charptr, "The width of the filter is too small. Please create a filter as wide or wider than %d pts.", 
 777:                                  MINSMOOTHWIDTH);
 778:           SpManageWarningBox(charptr);
 779:           free(charptr);
 780:           smooth.method = NONE;
 781:           return;
 782:         }
 783:         else if(have_data == DO && smooth.method != NONE && smooth.width_units == DEPTH && 
 784:                 smooth.width < MINSMOOTHWIDTH * average_depth_step) {
 785:           if((charptr=(char*)calloc(150,CHAR_SIZE))==NULL)
 786:                                         SpBadMemAlloc("SpSmoothOKCB");
 787:           (void)sprintf(charptr, "The width of the filter is too small. Please create a filter as wide or wider than %d cms.",
 788:                                  MINSMOOTHWIDTH * average_depth_step);
 789:           SpManageWarningBox(charptr);
 790:           free(charptr);
 791:           smooth.method = NONE; 
 792:           return;
 793:         }
 794:         if(smooth.method==NONE)
 795:     xmstring=XmCvtCTToXmString("No Smooth...");
 796:         else
 797:     xmstring=XmCvtCTToXmString("Smooth...");
 798:         XtVaSetValues(pushButtonOpenSmooth,XmNlabelString,xmstring,NULL);
 799:         XmStringFree(xmstring);
 800: /* unmanage dialog */
 801:         XtUnmanageChild(formSmooth);
 802: 
 803:         if(smooth.method != NONE && open_dataform_is_up == NO && have_data == DO) {
 804: 
 805:           cursor = XCreateFontCursor(XtDisplay(formSplicer), XC_watch);
 806:           if(cursor != BadAlloc && cursor != BadFont && cursor != BadValue) {
 807:             XDefineCursor(XtDisplay(formSplicer), XtWindow(formSplicer), cursor);
 808:           }
 809:           for(i=0; i<dataset_cnt; ++i) {
 810:             SmoothData(i);
 811:           }
 812:           if(cursor) {
 813:             XUndefineCursor(XtDisplay(formSplicer), XtWindow(formSplicer));
 814:             XFreeCursor(XtDisplay(formSplicer), cursor);
 815:           }
 816: 
 817:           if(XtIsManaged(XtParent(drawingAreaEdit))) {
 818:             reason_for_redraw = DRAW_EVERYTHING;
 819:             DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
 820:           }
 821:           if(have_splice == DO) {
 822:             if(XtIsManaged(XtParent(drawingAreaView))) {
 823:               reason_for_redraw = DRAW_EVERYTHING;
 824:               DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
 825:             }
 826:             if(are_agemodelling == YES) {
 827:               if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
 828:                 reason_for_redraw = DRAW_EVERYTHING;
 829:                 DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
 830:               }
 831:             }
 832:           }
 833:         }
 834: }
 835: 
 836: /*      Function Name:  SpDecimateOKCB
 837:  *
 838:  *      Description:    This function saves the decimation options and
 839:  *            closes the dialog.
 840:  *      
 841:  *
 842:  *      Arguments:      Widget    w:  pushButtonDecimateOK
 843:  *      XtPointer client: unused
 844:  *      XtPointer call: the call data (unused).
 845:  */
 846: /* ARGSUSED */
 847: void
 848: SpDecimateOKCB(w, client, call)
 849: Widget w;
 850: XtPointer client;
 851: XtPointer call;
 852: {
 853:         int i;
 854:   XmString xmstring;
 855:         Cursor   cursor;
 856:         void DecimateData(), DrawDrawingAreaEdit(), DrawDrawingAreaView(), DrawDrawingAreaSpliceToAge();
 857: 
 858:   charptr=XmTextGetString(textFieldDecimate);
 859:         decimate_value = atoi(charptr);
 860:         
 861:   if(decimate_value>1)
 862:     xmstring=XmCvtCTToXmString("Decimate...");
 863:   else
 864:     xmstring=XmCvtCTToXmString("No Decimate...");
 865:   XtVaSetValues(pushButtonOpenDecimate,XmNlabelString,xmstring,NULL);
 866:   XmStringFree(xmstring);
 867: /* unmanage dialog */
 868:   XtUnmanageChild(formDecimate);
 869: 
 870:         /* if open_dataform_is_up == No then open data dialog is not up
 871:            therfore event came from progress menu, data menu decimate button push
 872:         */
 873:         if(open_dataform_is_up == NO && have_data == DO) {
 874:           cursor = XCreateFontCursor(XtDisplay(formSplicer), XC_watch);
 875:           if(cursor != BadAlloc && cursor != BadFont && cursor != BadValue) {
 876:             XDefineCursor(XtDisplay(formSplicer), XtWindow(formSplicer), cursor);
 877:           }
 878:  
 879:           data[dset]->decimate_value = decimate_value;
 880:           DecimateData(dset, data[dset]->decimate_value);
 881:           
 882:           if(cursor) {
 883:             XUndefineCursor(XtDisplay(formSplicer), XtWindow(formSplicer));
 884:             XFreeCursor(XtDisplay(formSplicer), cursor);
 885:           }
 886: 
 887:           if(XtIsManaged(XtParent(drawingAreaEdit))) {
 888:             reason_for_redraw = DRAW_EVERYTHING;
 889:             DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
 890:           }
 891:           if(have_splice == DO) {
 892:             if(XtIsManaged(XtParent(drawingAreaView))) {
 893:               reason_for_redraw = DRAW_EVERYTHING;
 894:               DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
 895:             }
 896:             if(are_agemodelling == YES) {
 897:               if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
 898:                 reason_for_redraw = DRAW_EVERYTHING;
 899:                 DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
 900:               }
 901:             }
 902:           }
 903:         }
 904: }
 905: 
 906: /*      Function Name:  SpOpenDecimateCB
 907:  *
 908:  *      Description:    This function displays the decimation options.
 909:  *            
 910:  *      
 911:  *
 912:  *      Arguments:      Widget    w:  pushButtonOpenDecimate
 913:  *      XtPointer client: unused
 914:  *      XtPointer call: the call data (unused).
 915:  */
 916: /* ARGSUSED */
 917: void
 918: SpOpenDecimateCB(w, client, call)
 919: Widget w;
 920: XtPointer client;
 921: XtPointer call;
 922: {
 923:   /*SUPPRESS 594*/
 924: /* set values and display form */
 925:   if((charptr=(char*)calloc(20,CHAR_SIZE))==NULL)
 926:     SpBadMemAlloc("SpOpenDecimateCB 1");
 927:         if(open_dataform_is_up == NO && have_data == DO) {
 928:           (void)sprintf(charptr,"%d", data[dset]->decimate_value);
 929:         }
 930:         else {
 931:           (void)sprintf(charptr,"%d",decimate_value);
 932:         }
 933:   XmTextSetString(textFieldDecimate,charptr);
 934:   free(charptr);
 935:   XtManageChild(formDecimate);
 936: }
 937: 
 938: /*      Function Name:  SpUseAffineOKCB
 939:  *
 940:  *      Description:    This function saves the affine table defaults.
 941:  *
 942:  *      Arguments:      Widget    w:  pushButtonuseAffineOK
 943:  *      XtPointer client: unused
 944:  *      XtPointer call: the call data (unused).
 945:  */
 946: /* ARGSUSED */
 947: void
 948: SpUseAffineOKCB(w, client, call)
 949: Widget w;
 950: XtPointer client;
 951: XtPointer call;
 952: {
 953:         char            *testfile;
 954:         int             readable;
 955:   XmString  xmstring;
 956:         int             VerifyFileReadable();
 957: 
 958:   /*SUPPRESS 594*/
 959:   if((affine.usetable=XmToggleButtonGetState(toggleButtonUseAffine)))
 960:         {
 961:             testfile = XmTextGetString(textFieldAffineFileName);
 962:             readable = VerifyFileReadable(testfile, OPEN, OPENAFFINE);
 963:             if(readable == NO) {
 964:               (void)sprintf(buffer,"Affine table name  %s is not a readable file.",testfile);
 965:               free(testfile);
 966:               XmToggleButtonSetState(toggleButtonUseAffine, False, False);
 967:               XmToggleButtonSetState(toggleButtonNotUseAffine, True, False);
 968:               affine.usetable = False;
 969:               XmTextSetString(textFieldAffineFileName,"");
 970:               SpManageWarningBox(buffer);
 971:               return;
 972:             }
 973:             else {
 974:               XtFree(affine.filename);
 975:               if((affine.filename=(char*)calloc((int)strlen(testfile)+10, CHAR_SIZE)) == NULL) {
 976:                        SpBadMemAlloc("SpUseAffineOKCB");
 977:               }
 978:               (void)sprintf(affine.filename, "%s", testfile);
 979:               *strrchr(testfile,'/')= '\0';
 980:               if((affine.dirname=(char*)calloc((int)strlen(testfile)+10, CHAR_SIZE)) == NULL) {
 981:                        SpBadMemAlloc("SpUseAffineOKCB");
 982:               }
 983:               (void)sprintf(affine.dirname, "%s", testfile);
 984:               free(testfile);
 985:             }
 986: 
 987:     xmstring=XmCvtCTToXmString("Use Affine...");
 988:         }
 989:   else
 990:         {
 991:     xmstring=XmCvtCTToXmString("Don't Use Affine...");
 992:                 affine.usetable = False;
 993:         }
 994:   XtVaSetValues(pushButtonOpenAffine,XmNlabelString,xmstring,NULL);
 995:   XmStringFree(xmstring);
 996:   XtUnmanageChild(formUseAffine);
 997: }
 998: 
 999: /*      Function Name:  SpUseAffineCB
1000:  *
1001:  *      Description:    This function is called when the user has changed the
1002:  *            use affine table value.
1003:  *      
1004:  *
1005:  *      Arguments:      Widget    w:  toggleButtonUseAffine
1006:  *      XtPointer client: unused
1007:  *      XtPointer call: toggle button return.
1008:  */
1009: /* ARGSUSED */
1010: void
1011: SpUseAffineCB(w, client, call)
1012: Widget w;
1013: XtPointer client;
1014: XtPointer call;
1015: {
1016:   /*SUPPRESS 594*/
1017:         /* if Use affine is set, display file selection Dialog for Affine 
1018:         */
1019:   XmToggleButtonCallbackStruct *toggle_info=(XmToggleButtonCallbackStruct *) call;
1020:         affine.usetable = True;
1021:   if(toggle_info->set) {
1022:           if((charptr=(char*)calloc((int)strlen(affine.filename)+5,CHAR_SIZE))==NULL)
1023:                 SpBadMemAlloc("SpOpenAffineCB 1");
1024:           (void)sprintf(charptr,"%s",affine.filename);
1025:           XmTextSetString(textFieldAffineFileName,charptr);
1026:           free(charptr);
1027:           XtSetSensitive(pushButtonSelectAffineFileName, True);
1028:         }
1029: }
1030: 
1031: /*      Function Name:  SpCullOKCB
1032:  *
1033:  *      Description:    This function saves the culling options and closes the
1034:  *            dialog box.
1035:  *      
1036:  *
1037:  *      Arguments:      Widget    w:  pushButtonCullOK
1038:  *      XtPointer client: unused
1039:  *      XtPointer call: the call data (unused).
1040:  */
1041: /* ARGSUSED */
1042: void
1043: SpCullOKCB(w, client, call)
1044: Widget w;
1045: XtPointer client;
1046: XtPointer call;
1047: {
1048:         char            *testfile;
1049:   XmString  xmstring;
1050:   String    cstring;
1051:   int   tmp_type,tmp_format, readable;
1052:   Widget    tmp_widget;
1053:         Cursor          cursor;
1054:         void            CullData(), DrawDrawingAreaEdit(), DrawDrawingAreaView(), DrawDrawingAreaSpliceToAge();
1055:         int             VerifyFileReadable();
1056: 
1057:   /*SUPPRESS 594*/
1058: 
1059:         /* if are using a cull table get its file name and check that
1060:            it is readable
1061:         */
1062:         if(XmToggleButtonGetState(toggleButtonUseCullTable) == True) {
1063:           testfile = XmTextGetString(textFieldCullTableFilename);
1064:           readable = VerifyFileReadable(testfile, OPEN, OPENCULLTABLE);
1065:           if(readable == NO) {
1066:             (void)sprintf(buffer,"Cull table name  %s is not a readable file.",testfile);
1067:             free(testfile);
1068:             XmToggleButtonSetState(toggleButtonUseCullTable, False, False);
1069:             XmToggleButtonSetState(toggleButtonDontUseCullTable, True, False);
1070:             XmTextSetString(textFieldCullTableFilename,"");
1071:             SpManageWarningBox(buffer);
1072:             return;
1073:           }
1074:           else {
1075:             XtFree(cull.filename);
1076:             if((cull.filename=(char*)calloc((int)strlen(testfile)+10, CHAR_SIZE)) == NULL) {
1077:                        SpBadMemAlloc("SpUseAffineOKCB");
1078:             }
1079:             (void)sprintf(cull.filename, "%s", testfile);
1080:             *strrchr(testfile,'/')= '\0';
1081:             if((cull.dirname=(char*)calloc((int)strlen(testfile)+10, CHAR_SIZE)) == NULL) {
1082:                     SpBadMemAlloc("SpUseAffineOKCB");
1083:             }
1084:             (void)sprintf(cull.dirname, "%s", testfile);
1085:             free(testfile);
1086:           }
1087:         }
1088: 
1089: /* save cull values */
1090:         if(XmToggleButtonGetState(toggleButtonCullParameters) == True &&
1091:            XmToggleButtonGetState(toggleButtonUseCullTable) == True) {
1092:           cull.method = CULL_PARAMETER_AND_TABLE;
1093:         }
1094:   else if(XmToggleButtonGetState(toggleButtonCullParameters)) {
1095:     cull.method=CULL_PARAMETERS;
1096:         }
1097:   else if(XmToggleButtonGetState(toggleButtonUseCullTable)) {
1098:     cull.method=CULL_TABLE;
1099:         }
1100:   else {
1101:     cull.method=NONE;
1102:         }
1103: 
1104:         if(open_dataform_is_up == YES) {
1105:       XtVaGetValues(optionMenuOpenFormat,XmNmenuHistory,&tmp_widget,NULL);
1106:           XtVaGetValues(tmp_widget,XmNuserData,&tmp_format,NULL);
1107:         }
1108:         else if(have_data == DO) {
1109:           tmp_format = data[dset]->in_format;
1110:         }
1111:         else {
1112:           tmp_format = MST95REPORT;
1113:         }
1114: 
1115:         if(tmp_format == ODPOTHER) {
1116:           if(XmToggleButtonGetState(toggleButtonOpenFormatsOther1) == True) {
1117:             tmp_format = ODPOTHER1;
1118:           }
1119:           else if(XmToggleButtonGetState(toggleButtonOpenFormatsOther2) == True) {
1120:             tmp_format = ODPOTHER2;
1121:           }
1122:           else if(XmToggleButtonGetState(toggleButtonOpenFormatsOther3) == True) {
1123:             tmp_format = ODPOTHER3;
1124:           }
1125:           else if(XmToggleButtonGetState(toggleButtonOpenFormatsOther4) == True) {
1126:             tmp_format = ODPOTHER4;
1127:           }
1128:           else if(XmToggleButtonGetState(toggleButtonOpenFormatsOther5) == True) {
1129:             tmp_format = ODPOTHER5;
1130:           }
1131:           else {
1132:             tmp_format = ODPOTHER1;
1133:           }
1134:         }
1135:        
1136:         if(open_dataform_is_up == YES) {
1137:           XtVaGetValues(optionMenuOpenType,XmNmenuHistory,&tmp_widget,NULL);
1138:           XtVaGetValues(tmp_widget,XmNuserData,&tmp_type,NULL);
1139:         }
1140:         else if(have_data == DO) {
1141:           tmp_type = data[dset]->type;
1142:         }
1143:         else {
1144:           tmp_type = GRAPE;
1145:         }
1146:      
1147:   switch (tmp_type)
1148:   {
1149:     case GRAPE:
1150:       SpGetEquationValues(&cull.grape);
1151:       break;
1152:     case PWAVE:
1153:       SpGetEquationValues(&cull.pwave);
1154:       cstring=XmTextGetString(textFieldCullSignal);
1155:       cull.pwave_signal_max=(float)atof(cstring);
1156:       XtFree(cstring);
1157:       break;
1158:     case SUSCEPTIBILITY:
1159:       SpGetEquationValues(&cull.susceptibility);
1160:       break;
1161:     case NATURALGAMMA:
1162:       SpGetEquationValues(&cull.naturalgamma);
1163:       break;
1164:     case REFLECTANCEMST:
1165:       SpGetEquationValues(&cull.reflectance);
1166:       break;
1167:     case OTHERTYPE:
1168:       SpGetEquationValues(&cull.otherodp);
1169:       break;
1170:     default:
1171:       break;
1172:   }
1173:   cstring=XmTextGetString(textFieldCullTop);
1174:   cull.top=(float)atof(cstring);
1175:   XtFree(cstring);
1176:   if(XmToggleButtonGetState(toggleButtonCullUseAll))
1177:     cull.by_core_num=False;
1178:   else
1179:     cull.by_core_num=True;
1180:   cstring=XmTextGetString(textFieldCullCoreNum);
1181:   cull.max_core=(float)atof(cstring);
1182:   XtFree(cstring);
1183:   if(cull.method==NONE &&  cull.top <= 0.0 && !cull.by_core_num)
1184:     xmstring=XmCvtCTToXmString("No Cull...");
1185:   else
1186:     xmstring=XmCvtCTToXmString("Cull...");
1187:   XtVaSetValues(pushButtonOpenCull,XmNlabelString,xmstring,NULL);
1188:   XmStringFree(xmstring);
1189:     
1190: /* close dialog */
1191:   XtUnmanageChild(formCull);
1192: 
1193:         if(open_dataform_is_up == NO && have_data == DO) {
1194:           cursor = XCreateFontCursor(XtDisplay(formSplicer), XC_watch);
1195:           if(cursor != BadAlloc && cursor != BadFont && cursor != BadValue) {
1196:             XDefineCursor(XtDisplay(formSplicer), XtWindow(formSplicer), cursor);
1197:           }
1198:           CullData(dset);
1199:           if(cursor) {
1200:             XUndefineCursor(XtDisplay(formSplicer), XtWindow(formSplicer));
1201:             XFreeCursor(XtDisplay(formSplicer), cursor);
1202:           }
1203: 
1204:           if(XtIsManaged(XtParent(drawingAreaEdit))) {
1205:             reason_for_redraw = DRAW_EVERYTHING;
1206:             DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
1207:           }
1208:           if(have_splice == DO) {
1209:             if(XtIsManaged(XtParent(drawingAreaView))) {
1210:               reason_for_redraw = DRAW_EVERYTHING;
1211:               DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
1212:             }
1213:             if(are_agemodelling == YES) {
1214:               if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
1215:                 reason_for_redraw = DRAW_EVERYTHING;
1216:                 DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
1217:               }
1218:             }
1219:           }
1220:         }
1221: }
1222: 
1223: /*      Function Name:  SpOpenCullCB
1224: 
1225:  *
1226:  *      Description:    This function sets the cull values and opens the cull
1227:  *            menu dialog.
1228:  *      
1229:  *
1230:  *      Arguments:      Widget    w:  pushButtonOpenCull
1231:  *      XtPointer client: unused
1232:  *      XtPointer call: the call data (unused).
1233:  */
1234: /* ARGSUSED */
1235: void
1236: SpOpenCullCB(w, client, call)
1237: Widget w;
1238: XtPointer client;
1239: XtPointer call;
1240: {
1241:   Widget  *tmp_widget;
1242:   int tmp_type,tmp_format;
1243:   XmString  xmstring;
1244: 
1245:   /*SUPPRESS 594*/
1246: /* set cull method type*/
1247:         
1248:   if(cull.method==CULL_PARAMETERS || cull.method == CULL_PARAMETER_AND_TABLE)
1249:   {
1250:     XtSetSensitive(formCullOptions,True);
1251:     XmToggleButtonSetState(toggleButtonCullParameters,True,True);
1252:   }
1253:   if(cull.method==CULL_TABLE || cull.method == CULL_PARAMETER_AND_TABLE)
1254:   {
1255:     XmToggleButtonSetState(toggleButtonUseCullTable,True,True);
1256:     if((charptr=(char*)calloc((int)strlen(cull.filename)+10,CHAR_SIZE))==NULL)
1257:       SpBadMemAlloc("SpOpenCullCB 0");
1258:     (void)sprintf(charptr,"%s",cull.filename);
1259:                 XtVaSetValues(textFieldCullTableFilename, XmNvalue, charptr, NULL);
1260:     free(charptr);
1261:   }
1262:         if(cull.method!=CULL_PARAMETERS && cull.method != CULL_PARAMETER_AND_TABLE)
1263:         {
1264:     XtSetSensitive(formCullOptions,False);
1265:     XmToggleButtonSetState(toggleButtonCullNone,True,True);
1266:   }
1267:         if(cull.method!=CULL_TABLE && cull.method != CULL_PARAMETER_AND_TABLE)
1268:         {
1269:           XmToggleButtonSetState(toggleButtonDontUseCullTable,True,True);
1270:           XtVaSetValues(textFieldCullTableFilename, XmNvalue, "", NULL);
1271:           XtSetSensitive(pushButtonSelectCullTableFilename, False);
1272:         }
1273:         else if(cull.method==CULL_TABLE || cull.method == CULL_PARAMETER_AND_TABLE)
1274:         {
1275:           XtSetSensitive(pushButtonSelectCullTableFilename, True);
1276:         }
1277: 
1278:   if((charptr=(char*)calloc(20,CHAR_SIZE))==NULL)
1279:     SpBadMemAlloc("SpOpenCullCB 1");
1280:   (void)sprintf(charptr,"%.1f",cull.pwave_signal_max);
1281:   XmTextSetString(textFieldCullSignal,charptr);
1282:   (void)sprintf(charptr,"%.1f",cull.top);
1283:   XmTextSetString(textFieldCullTop,charptr);
1284:   if(cull.by_core_num)
1285:     XmToggleButtonSetState(toggleButtonCullByCore,True,True);
1286:   else
1287:     XmToggleButtonSetState(toggleButtonCullUseAll,True,True);
1288:   (void)sprintf(charptr,"%d",cull.max_core);
1289:   XmTextSetString(textFieldCullCoreNum,charptr);
1290:   free(charptr);
1291: /* set type/format label */
1292:         if(open_dataform_is_up == YES) {
1293:     XtVaGetValues(optionMenuOpenFormat,XmNmenuHistory,&tmp_widget,NULL);
1294:     XtVaGetValues(*tmp_widget,XmNuserData,&tmp_format,NULL);
1295:         }
1296:         else if(have_data == DO) {
1297:           tmp_format = data[dset]->in_format;
1298:         }
1299:         else {
1300:           tmp_format = MST95REPORT;
1301:         }
1302: 
1303:         if(tmp_format == ODPOTHER) {
1304:           if(XmToggleButtonGetState(toggleButtonOpenFormatsOther1) == True) {
1305:             tmp_format = ODPOTHER1;
1306:           }
1307:           else if(XmToggleButtonGetState(toggleButtonOpenFormatsOther2) == True) {
1308:             tmp_format = ODPOTHER2;
1309:           }
1310:           else if(XmToggleButtonGetState(toggleButtonOpenFormatsOther3) == True) {
1311:             tmp_format = ODPOTHER3;
1312:           }
1313:           else if(XmToggleButtonGetState(toggleButtonOpenFormatsOther4) == True) {
1314:             tmp_format = ODPOTHER4;
1315:           }
1316:           else if(XmToggleButtonGetState(toggleButtonOpenFormatsOther5) == True) {
1317:             tmp_format = ODPOTHER5;
1318:           }
1319:           else {
1320:             tmp_format = ODPOTHER1;
1321:           }
1322:         }
1323:         
1324:         if(open_dataform_is_up == YES) {
1325:           XtVaGetValues(optionMenuOpenType,XmNmenuHistory,&tmp_widget,NULL);
1326:           XtVaGetValues(*tmp_widget,XmNuserData,&tmp_type,NULL);
1327:         }
1328:         else if(have_data == DO) {
1329:           tmp_type = data[dset]->type;
1330:         }
1331:         else {
1332:           tmp_type = GRAPE;
1333:         }
1334:        
1335:   if((charptr=(char*)calloc((int)strlen(format[tmp_format])+(int)strlen(type[tmp_type])+50,CHAR_SIZE))==NULL)
1336:     SpBadMemAlloc("SpOpenCullCB 2");
1337:   (void)sprintf(charptr,"Data Format: %s   Type: %s",format[tmp_format],type[tmp_type]);
1338:   xmstring=XmCvtCTToXmString(charptr);
1339:   XtVaSetValues(labelCullFormatType,XmNlabelString,xmstring,NULL);
1340:   XmStringFree(xmstring);
1341:   free(charptr);
1342:   XtSetSensitive(labelCullSignal,False);
1343:   XtSetSensitive(textFieldCullSignal,False);
1344:   switch(tmp_type)
1345:   {
1346:           case GRAPE:
1347:                   SpSetEquationValues(cull.grape);
1348:       break;
1349:           case PWAVE:
1350:                         SpSetEquationValues(cull.pwave);
1351:                         XtVaGetValues(optionMenuOpenFormat,XmNmenuHistory,&tmp_widget,NULL);
1352:                         XtVaGetValues(*tmp_widget,XmNuserData,&tmp_format,NULL);
1353:                         if(tmp_format == MST95REPORT) {
1354:                       XtSetSensitive(textFieldCullSignal,TRUE);
1355:                       XtSetSensitive(labelCullSignal,TRUE);
1356:                         }
1357:             break;
1358:           case SUSCEPTIBILITY:
1359:                   SpSetEquationValues(cull.susceptibility);
1360:       break;
1361:           case NATURALGAMMA:
1362:                   SpSetEquationValues(cull.naturalgamma);
1363:       break;
1364:           case REFLECTANCEMST:
1365:                   SpSetEquationValues(cull.reflectance);
1366:             break;
1367:     case OTHERTYPE:
1368:                   SpSetEquationValues(cull.otherodp);
1369:             break;
1370:     default:
1371:       break;
1372:         }
1373: /* manage dialog */
1374:   XtManageChild(formCull);
1375: }
1376: 
1377: /*      Function Name:  SpOpenOKCB
1378:  *
1379:  *      Description:    This function saves the open data file values
1380:  *            and closes the form.
1381:  *
1382:  *      Arguments:      Widget    w:  pushButtonOpenOK
1383:  *      XtPointer client: unused
1384:  *      XtPointer call: the call data (unused).
1385:  */
1386: /* ARGSUSED */
1387: void
1388: SpOpenOKCB(w, client, call)
1389: Widget w;
1390: XtPointer client;
1391: XtPointer call;
1392: {
1393:   XmString  *items;
1394:   int info_len,i,tmp_len,len;
1395:   char  *info,*charptr,*tmp_buf,*filename, *openfilter;
1396:   Widget  tmp_widget;
1397: 
1398:   /*SUPPRESS 594*/
1399: 
1400: /* check if have exceeded number of datasets allowed
1401: */
1402:    if(dataset_cnt + 1 > NDATASET) {
1403:                 message.error=False;
1404:                 message.fatal=False;
1405:                 message.caller=OPENOK;
1406:                 message.type=XmDIALOG_WARNING;
1407:                 message.default_button=XmDIALOG_OK_BUTTON;
1408:                 if((message.label=(char*)calloc(100,CHAR_SIZE))==NULL)
1409:                         SpBadMemAlloc("SpOpenOKCB 1");
1410:                 (void)sprintf(message.label,"You have exceeded the number of data sets allowed!");
1411:                 SpManageMessage(message);
1412:                 return;
1413:    }
1414: 
1415: /* get file names */
1416:   XtVaGetValues(listOpenSelected, XmNitemCount,&openfileinfo.num_in_files, XmNitems,&items, NULL);
1417: /* no data files selected */
1418:   if(openfileinfo.num_in_files<=0)
1419:   {
1420:     message.error=False;
1421:     message.fatal=False;
1422:     message.caller=OPENOK;
1423:                 message.type=XmDIALOG_WARNING;
1424:                 message.default_button=XmDIALOG_OK_BUTTON;
1425:     if((message.label=(char*)calloc(50,CHAR_SIZE))==NULL)
1426:       SpBadMemAlloc("SpOpenOKCB 1");
1427:     (void)sprintf(message.label,"You must select at least one data file!");
1428:     SpManageMessage(message);
1429:     return;
1430:   }
1431:   if((openfileinfo.in_file_names=(char**)calloc(openfileinfo.num_in_files,sizeof(char*)))==NULL) 
1432:     SpBadMemAlloc("SpOpenOKCB 2");
1433:   for(i=0;i<openfileinfo.num_in_files;i++)
1434:   {
1435:     if(!XmStringGetLtoR(items[i],XmFONTLIST_DEFAULT_TAG,&filename))
1436:     {
1437:       message.error=True;
1438:       message.fatal=False;
1439:                         message.caller=OPENOK;
1440:                         message.type=XmDIALOG_WARNING;
1441:                         message.default_button=XmDIALOG_OK_BUTTON;
1442:       if((message.label=(char*)calloc(200,CHAR_SIZE))==NULL)
1443:         SpBadMemAlloc("SpOpenOKCB 1a");
1444:       else
1445:         (void)sprintf(message.label,"SpOpenOKCB: Unable to get filename from list");
1446:       SpManageMessage(message);
1447:     }
1448:                 else
1449:                 {
1450: 
1451:                   openfilter = XmTextGetString(textOpenFilter);
1452:                   len = (int)strlen(openfilter);
1453:                   if(strcmp(&openfilter[len-1], "*") == 0) {
1454:                     *strrchr(openfilter,'*')= '\0';
1455:                   }
1456:                   len = (int)strlen(openfilter);
1457:                   if(strcmp(&openfilter[len-1], "/") == 0) {
1458:                     *strrchr(openfilter,'/')= '\0';
1459:                   }
1460:                   if((openfileinfo.in_file_names[i]=(char*)calloc((int)strlen(openfilter)+(int)strlen(filename)+5,CHAR_SIZE))==NULL)
1461:                         SpBadMemAlloc("SpOpenOKCB 1b");
1462: 
1463:                   (void)sprintf(openfileinfo.in_file_names[i],"%s/%s",openfilter,filename);
1464:                   XtFree(openfilter);
1465:                   XtFree(filename);
1466:                 }
1467:   }
1468: /* get format & type */
1469:   XtVaGetValues(optionMenuOpenFormat,XmNmenuHistory,&tmp_widget,NULL);
1470:   XtVaGetValues(tmp_widget,XmNuserData,&openfileinfo.in_data_format,NULL);
1471: 
1472:         if(openfileinfo.in_data_format == ODPOTHER) {
1473:           if(XmToggleButtonGetState(toggleButtonOpenFormatsOther1) == True) {
1474:             openfileinfo.in_data_format = ODPOTHER1;
1475:           }
1476:           else if(XmToggleButtonGetState(toggleButtonOpenFormatsOther2) == True) {
1477:             openfileinfo.in_data_format = ODPOTHER2;
1478:           }
1479:           else if(XmToggleButtonGetState(toggleButtonOpenFormatsOther3) == True) {
1480:             openfileinfo.in_data_format = ODPOTHER3;
1481:           }
1482:           else if(XmToggleButtonGetState(toggleButtonOpenFormatsOther4) == True) {
1483:             openfileinfo.in_data_format = ODPOTHER4;
1484:           }
1485:           else if(XmToggleButtonGetState(toggleButtonOpenFormatsOther5) == True) {
1486:             openfileinfo.in_data_format = ODPOTHER5;
1487:           }
1488:           else {
1489:             openfileinfo.in_data_format = ODPOTHER1;
1490:           }
1491:         }
1492:         if(openfileinfo.in_data_format == JANUS) {
1493:           if(XmToggleButtonGetState(toggleButtonJanusClean) == True) {
1494:             openfileinfo.in_data_format = JANUSCLEAN;
1495:           }
1496:           else if(XmToggleButtonGetState(toggleButtonJanusOrig) == True) {
1497:             openfileinfo.in_data_format = JANUSORIG;
1498:           }
1499:         }
1500:         
1501:         XtVaGetValues(optionMenuOpenType,XmNmenuHistory,&tmp_widget,NULL);
1502:         XtVaGetValues(tmp_widget,XmNuserData,&openfileinfo.in_data_type,NULL);
1503: 
1504: /* make tmp buffer */
1505:   tmp_len=1000;
1506:   if((tmp_buf=(char*)calloc(tmp_len,CHAR_SIZE))==NULL)
1507:     SpBadMemAlloc("SpOpenOKCB 5");
1508: /* create output text */
1509:   info_len=2000;
1510:   if((info=(char*)calloc(info_len,CHAR_SIZE))==NULL)
1511:     SpBadMemAlloc("SPOpenOKCB 6");
1512:   (void)sprintf(info,"\nSplicer Input Files:\n");
1513:   for(i=0;i<openfileinfo.num_in_files;i++)
1514:   {
1515:     if((int)strlen(info)+(int)strlen(openfileinfo.in_file_names[i])+2 >= info_len)
1516:     {
1517:       info_len+=500;
1518:       if((charptr=(char*)realloc(info,info_len*CHAR_SIZE))==NULL)
1519:         SpBadMemAlloc("SpOpenOKCB 7");
1520:       else
1521:         info=charptr;
1522:     }
1523:     (void)strcat(info,openfileinfo.in_file_names[i]);
1524:     (void)strcat(info,"\n");
1525:   }
1526:   if((len=50+(int)strlen(type[openfileinfo.in_data_type]))>tmp_len)
1527:   {
1528:     tmp_len=len;
1529:     if((charptr=(char*)realloc(tmp_buf,tmp_len*CHAR_SIZE))==NULL)
1530:       SpBadMemAlloc("SpOpenOKCB 8");
1531:     else
1532:       tmp_buf=charptr;
1533:   }
1534:   (void)sprintf(tmp_buf,"\nData Type: %s\n",type[openfileinfo.in_data_type]);
1535:   if((int)strlen(info)+(int)strlen(tmp_buf)+2 >=info_len)
1536:   {
1537:     info_len+=500;
1538:                 if((charptr=(char*)realloc(info,info_len*CHAR_SIZE))==NULL)
1539:                   SpBadMemAlloc("SpOpenOKCB 9");
1540:                 else 
1541:                   info=charptr;
1542:   }
1543:   (void)strcat(info,tmp_buf);
1544:         if((len=50+(int)strlen(format[openfileinfo.in_data_format]))>tmp_len) 
1545:         { 
1546:                 tmp_len=len;
1547:                 if((charptr=(char*)realloc(tmp_buf,tmp_len*CHAR_SIZE))==NULL)
1548:                         SpBadMemAlloc("SpOpenOKCB 10");
1549:                 else
1550:                         tmp_buf=charptr;
1551:   }
1552:   (void)sprintf(tmp_buf,"\nData File Format: %s\n",format[openfileinfo.in_data_format]);
1553:   if((int)strlen(info)+(int)strlen(tmp_buf)+2 >=info_len)
1554:   {
1555:                 info_len+=500; 
1556:                 if((charptr=(char*)realloc(info,info_len*CHAR_SIZE))==NULL) 
1557:                         SpBadMemAlloc("SpOpenOKCB 11"); 
1558:                 else 
1559:                         info=charptr;
1560:   }
1561:   (void)strcat(info,tmp_buf);
1562:         if((len=50+(int)strlen(affine.filename)*2)>tmp_len)  
1563:         {  
1564:                 tmp_len=len;
1565:                 if((charptr=(char*)realloc(tmp_buf,tmp_len*CHAR_SIZE))==NULL) 
1566:                         SpBadMemAlloc("SpOpenOKCB 12"); 
1567:                 else
1568:                         tmp_buf=charptr;
1569:         }
1570:   if(affine.usetable)
1571:     (void)sprintf(tmp_buf,"\nAffine Table: %s\n",affine.filename);
1572:   else
1573:     (void)sprintf(tmp_buf,"\nNo Affine Table used.\n");
1574:   if((int)strlen(info)+(int)strlen(tmp_buf)+2 >=info_len)
1575:   {
1576:                 info_len+=500; 
1577:                 if((charptr=(char*)realloc(info,info_len*CHAR_SIZE))==NULL) 
1578:                         SpBadMemAlloc("SpOpenOKCB 13"); 
1579:                 else 
1580:                         info=charptr;
1581:   }
1582:   (void)strcat(info,tmp_buf);
1583:         if((len=50+(int)strlen(smooth_units[smooth.width_units])+(int)strlen(plot_display[smooth.plot]))>tmp_len)  
1584:         {  
1585:                 tmp_len=len;
1586:                 if((charptr=(char*)realloc(tmp_buf,tmp_len*CHAR_SIZE))==NULL) 
1587:                         SpBadMemAlloc("SpOpenOKCB 14"); 
1588:                 else
1589:                         tmp_buf=charptr;
1590:         }
1591:   if(smooth.method==GAUSSIAN)
1592:     (void)sprintf(tmp_buf,"\nGaussian Smoothing: %d %s\nPlot Display: %s\n",
1593:           smooth.width,smooth_units[smooth.width_units],
1594:           plot_display[smooth.plot]);
1595:   else
1596:     (void)sprintf(tmp_buf,"\nNo data smoothing.\n");
1597:   if((int)strlen(info)+(int)strlen(tmp_buf)+2 >=info_len)
1598:   {
1599:                 info_len+=500; 
1600:                 if((charptr=(char*)realloc(info,info_len*CHAR_SIZE))==NULL) 
1601:                         SpBadMemAlloc("SpOpenOKCB 15"); 
1602:                 else 
1603:                         info=charptr;
1604:   }
1605:   (void)strcat(info,tmp_buf);
1606:         if((len=100+(int)strlen(cull.filename))>tmp_len)  
1607:         {  
1608:                 tmp_len=len;
1609:                 if((charptr=(char*)realloc(tmp_buf,tmp_len*CHAR_SIZE))==NULL) 
1610:                         SpBadMemAlloc("SpOpenOKCB 16"); 
1611:                 else
1612:                         tmp_buf=charptr;
1613:         }
1614: 
1615:         if(cull.method!=CULL_TABLE && cull.method!=CULL_PARAMETERS && cull.method!=CULL_PARAMETER_AND_TABLE)
1616:         {
1617:                 (void)sprintf(tmp_buf,"\nNo culling by data values.\n");
1618:         }
1619:         else 
1620:         {
1621:     if(cull.method == CULL_PARAMETER_AND_TABLE)
1622:           {
1623:     (void)sprintf(tmp_buf,"\nCull Table: %s\n",cull.filename);
1624:                 strcat(tmp_buf, "Culling will be done with user set parameters.\n");  
1625:           }
1626:           else if(cull.method==CULL_TABLE) 
1627:           {
1628:                 (void)sprintf(tmp_buf,"\nCull Table: %s\n",cull.filename);
1629:           }
1630:     else if(cull.method==CULL_PARAMETERS)
1631:           {
1632:     (void)sprintf(tmp_buf,"\nCulling will be done with user set parameters.\n");
1633:           }
1634:         }
1635: 
1636:   if((int)strlen(info)+(int)strlen(tmp_buf)+2 >=info_len)
1637:   {
1638:                 info_len+=500; 
1639:                 if((charptr=(char*)realloc(info,info_len*CHAR_SIZE))==NULL) 
1640:                         SpBadMemAlloc("SpOpenOKCB 17"); 
1641:                 else 
1642:                         info=charptr;
1643:   }
1644:   (void)strcat(info,tmp_buf);
1645:   (void)sprintf(tmp_buf,"Top %.1f cm will be removed from core.\n",cull.top);
1646:   if((int)strlen(info)+(int)strlen(tmp_buf)+2 >=info_len)
1647:   {
1648:                 info_len+=500; 
1649:                 if((charptr=(char*)realloc(info,info_len*CHAR_SIZE))==NULL) 
1650:                         SpBadMemAlloc("SpOpenOKCB 18"); 
1651:                 else 
1652:                         info=charptr;
1653:   }
1654:   (void)strcat(info,tmp_buf);
1655:   if(cull.by_core_num)
1656:     (void)sprintf(tmp_buf,"Only cores <= %d will be used.\n",cull.max_core);
1657:   else
1658:     (void)sprintf(tmp_buf,"All cores will be used.\n");
1659:   if((int)strlen(info)+(int)strlen(tmp_buf)+2 >=info_len)
1660:   {
1661:                 info_len+=500; 
1662:                 if((charptr=(char*)realloc(info,info_len*CHAR_SIZE))==NULL) 
1663:                         SpBadMemAlloc("SpOpenOKCB 19"); 
1664:                 else 
1665:                         info=charptr;
1666:   }
1667:   (void)strcat(info,tmp_buf);
1668:   if(decimate_value>1)
1669:     (void)sprintf(tmp_buf,"\nDecimation: every %d point will be used.\n",decimate_value);
1670:   else
1671:     (void)sprintf(tmp_buf,"\nEvery data point will be used.\n");
1672:   if((int)strlen(info)+(int)strlen(tmp_buf)+2 >=info_len)
1673:   {
1674:                 info_len+=500;
1675:                 if((charptr=(char*)realloc(info,info_len*CHAR_SIZE))==NULL)
1676:                         SpBadMemAlloc("SpOpenOKCB 20"); 
1677:                 else 
1678:                         info=charptr;
1679:   }
1680:   (void)strcat(info,tmp_buf);
1681:   (void)sprintf(tmp_buf,"\nNote: multiple data values will be averaged.\n");
1682:         if((int)strlen(info)+(int)strlen(tmp_buf)+2 >=info_len)
1683:         {
1684:                 info_len+=500;
1685:                 if((charptr=(char*)realloc(info,info_len*CHAR_SIZE))==NULL)
1686:                         SpBadMemAlloc("SpOpenOKCB 21"); 
1687:                 else 
1688:                         info=charptr;
1689:         }
1690:         (void)strcat(info,tmp_buf);
1691: 
1692: /* display information window */
1693:   XmTextSetString(textOpenInfo,info);
1694:   XtManageChild(formOpenInfo);
1695:   free(info);
1696:   free(tmp_buf);
1697: }
1698: 
1699: /*      Function Name:  SpOpenDataCB
1700:  *
1701:  *      Description:    This function displays the dialog for choosing data
1702:  *            values for opening data files.
1703:  *      
1704:  *
1705:  *      Arguments:      Widget    w:  pushButtonOpenData
1706:  *      XtPointer client: unused
1707:  *      XtPointer call: the call data (unused).
1708:  */
1709: /* ARGSUSED */
1710: void
1711: SpOpenDataCB(w, client, call)
1712: Widget w;
1713: XtPointer client;
1714: XtPointer call;
1715: {
1716:   XmString  xmstring;
1717:   Widget    *tmp_widget;
1718:   int   len, tmp_format;
1719:   FILE    *fptr;
1720:   char    errorstring[500], *str;
1721:   /*SUPPRESS 594*/
1722:   message.error=False;
1723:   errorstring[0]='\0';
1724:         open_dataform_is_up = YES;
1725:         if(dataset_cnt > 1) {
1726:           decimate_value = 1;
1727:         }
1728:   if(affine.usetable)
1729:   {
1730:     if((fptr=fopen(affine.filename,"r"))==NULL)
1731:     {
1732:       message.error=True;
1733:       (void)sprintf(errorstring,"Affine table not found!");
1734:       affine.usetable=False;
1735:       xmstring=XmCvtCTToXmString("Don't Use Affine...");
1736:     }
1737:     else
1738:     {
1739:       fclose(fptr);
1740:       xmstring=XmCvtCTToXmString("Use Affine...");
1741:     }
1742:   }
1743:   else
1744:     xmstring=XmCvtCTToXmString("Don't Use Affine...");
1745:   XtVaSetValues(pushButtonOpenAffine,XmNlabelString,xmstring,NULL);
1746:   XmStringFree(xmstring);
1747:   if(cull.method==NONE && cull.top<=0.0 && !cull.by_core_num)
1748:     xmstring=XmCvtCTToXmString("No Cull...");
1749:   else if(cull.method==CULL_TABLE)
1750:   {
1751:     if((fptr=fopen(cull.filename,"r"))==NULL)
1752:     {
1753:       message.error=True;
1754:       (void)strcat(errorstring," Cull Table not found!");
1755:       cull.method=NONE;
1756:       if(cull.top<=0.0 && !cull.by_core_num)
1757:         xmstring=XmCvtCTToXmString("No Cull...");
1758:     }
1759:     else
1760:     {
1761:       fclose(fptr);
1762:       xmstring=XmCvtCTToXmString("Cull...");
1763:     }
1764:   }
1765:   else
1766:     xmstring=XmCvtCTToXmString("Cull...");
1767:   XtVaSetValues(pushButtonOpenCull,XmNlabelString,xmstring,NULL);
1768:   XmStringFree(xmstring);
1769:   if(smooth.method==None)
1770:     xmstring=XmCvtCTToXmString("No Smooth...");
1771:   else
1772:     xmstring=XmCvtCTToXmString("Smooth...");
1773:   XtVaSetValues(pushButtonOpenSmooth,XmNlabelString,xmstring,NULL);
1774:   XmStringFree(xmstring);
1775:   if(decimate_value>1)
1776:     xmstring=XmCvtCTToXmString("Decimate...");
1777:   else
1778:     xmstring=XmCvtCTToXmString("No Decimate...");
1779:   XtVaSetValues(pushButtonOpenDecimate,XmNlabelString,xmstring,NULL);
1780:   XmStringFree(xmstring);
1781: 
1782:         if(openfileinfo.in_data_format == MST95REPORT) {
1783:           XtVaSetValues(optionMenuOpenFormat, XmNmenuHistory, pushButtonOpenMST95Report, NULL);
1784:           XtSetSensitive(pushButtonOpenReflectance, True);
1785:           XtSetSensitive(pushButtonOpenGrape, True);
1786:           XtSetSensitive(pushButtonOpenPwave, True);
1787:           XtSetSensitive(pushButtonOpenSusceptibility, True);
1788:           XtSetSensitive(pushButtonOpenNaturalGamma, True);
1789:           XtSetSensitive(pushButtonOpenOtherType, False);
1790:         }
1791:         else if(openfileinfo.in_data_format == TKREPORT) {
1792:           XtVaSetValues(optionMenuOpenFormat, XmNmenuHistory, pushButtonOpenTKReport, NULL);
1793:           XtSetSensitive(pushButtonOpenReflectance, True);
1794:           XtSetSensitive(pushButtonOpenGrape, True);
1795:           XtSetSensitive(pushButtonOpenPwave, True);
1796:           XtSetSensitive(pushButtonOpenSusceptibility, True);
1797:           XtSetSensitive(pushButtonOpenNaturalGamma, True);
1798:           XtSetSensitive(pushButtonOpenOtherType, False);
1799:         }
1800:         else if(openfileinfo.in_data_format == ODPOTHER || openfileinfo.in_data_format == ODPOTHER1 ||
1801:                 openfileinfo.in_data_format == ODPOTHER2 || openfileinfo.in_data_format == ODPOTHER3 ||
1802:                 openfileinfo.in_data_format == ODPOTHER4 || openfileinfo.in_data_format == ODPOTHER5) {
1803:           XtVaSetValues(optionMenuOpenFormat, XmNmenuHistory, pushButtonOpenODPOther, NULL);
1804:           XtSetSensitive(pushButtonOpenReflectance, True);
1805:           XtSetSensitive(pushButtonOpenGrape, True);
1806:           XtSetSensitive(pushButtonOpenPwave, True);
1807:           XtSetSensitive(pushButtonOpenSusceptibility, True);
1808:           XtSetSensitive(pushButtonOpenNaturalGamma, True);
1809:           XtSetSensitive(pushButtonOpenOtherType, True);
1810:         }
1811:         else if(openfileinfo.in_data_format == OSUSCAT) {
1812:           XtVaSetValues(optionMenuOpenFormat, XmNmenuHistory, pushButtonOpenOSUSCAT, NULL);
1813:           XtSetSensitive(pushButtonOpenReflectance, True);
1814:           XtSetSensitive(pushButtonOpenGrape, False);
1815:           XtSetSensitive(pushButtonOpenPwave, False);
1816:           XtSetSensitive(pushButtonOpenSusceptibility, False);
1817:           XtSetSensitive(pushButtonOpenNaturalGamma, False);
1818:           XtSetSensitive(pushButtonOpenOtherType, False);
1819:         }
1820:         else if(openfileinfo.in_data_format == JANUSCLEAN || openfileinfo.in_data_format == JANUSORIG) {
1821:           XtVaSetValues(optionMenuOpenFormat, XmNmenuHistory, pushButtonOpenJANUS, NULL);
1822:           XtSetSensitive(pushButtonOpenReflectance, True);
1823:           XtSetSensitive(pushButtonOpenGrape, True);
1824:           XtSetSensitive(pushButtonOpenPwave, True);
1825:           XtSetSensitive(pushButtonOpenSusceptibility, True);
1826:           XtSetSensitive(pushButtonOpenNaturalGamma, True);
1827:           XtSetSensitive(pushButtonOpenOtherType, False);
1828:         }
1829:         else {
1830:           openfileinfo.in_data_format = MST95REPORT;
1831:           XtVaSetValues(optionMenuOpenFormat, XmNmenuHistory, pushButtonOpenMST95Report, NULL);
1832:           XtSetSensitive(pushButtonOpenReflectance, True);
1833:           XtSetSensitive(pushButtonOpenGrape, False);
1834:           XtSetSensitive(pushButtonOpenPwave, False);
1835:           XtSetSensitive(pushButtonOpenSusceptibility, False);
1836:           XtSetSensitive(pushButtonOpenNaturalGamma, False);
1837:           XtSetSensitive(pushButtonOpenOtherType, False);
1838:         }
1839:         if(openfileinfo.in_data_format == JANUSORIG) {
1840:           XmToggleButtonSetState(toggleButtonHeaderNo, True, NULL);
1841:           XmToggleButtonSetState(toggleButtonHeaderYes, False, NULL);
1842:           XtSetSensitive(toggleButtonHeaderNo, False);
1843:           XtSetSensitive(toggleButtonHeaderYes, False);
1844:           XtSetSensitive(textFieldNHeader, False);
1845:         }
1846:         else {
1847:           XtSetSensitive(toggleButtonHeaderNo, True);
1848:           XtSetSensitive(toggleButtonHeaderYes, True);
1849:           XtSetSensitive(textFieldNHeader, True);
1850:         }
1851:         if(openfileinfo.in_data_format == JANUSCLEAN) {
1852:           XmToggleButtonSetState(toggleButtonJanusOrig, False, NULL);
1853:           XmToggleButtonSetState(toggleButtonJanusClean, True, NULL);
1854:         }
1855:         else if(openfileinfo.in_data_format == JANUSORIG) {
1856:           XmToggleButtonSetState(toggleButtonJanusOrig, True, NULL);
1857:           XmToggleButtonSetState(toggleButtonJanusClean, False, NULL);
1858:         }
1859:         else {
1860:           XmToggleButtonSetState(toggleButtonJanusOrig, True, NULL);
1861:           XmToggleButtonSetState(toggleButtonJanusClean, False, NULL);
1862:         }
1863: 
1864:         /* set data type. note that format type OSUSCAT is always reflectance
1865:         */
1866:         if(openfileinfo.in_data_format == OSUSCAT) {
1867:           XtVaSetValues(optionMenuOpenType, XmNmenuHistory, pushButtonOpenReflectance, NULL);
1868:         }
1869:         else if(openfileinfo.in_data_type == GRAPE) {
1870:           XtVaSetValues(optionMenuOpenType, XmNmenuHistory, pushButtonOpenGrape, NULL);
1871:         }
1872:         else if(openfileinfo.in_data_type == PWAVE) {
1873:           XtVaSetValues(optionMenuOpenType, XmNmenuHistory, pushButtonOpenPwave, NULL);
1874:         }
1875:         else if(openfileinfo.in_data_type == SUSCEPTIBILITY) { 
1876:           XtVaSetValues(optionMenuOpenType, XmNmenuHistory, pushButtonOpenSusceptibility, NULL);
1877:         }
1878:         else if(openfileinfo.in_data_type == NATURALGAMMA) { 
1879:           XtVaSetValues(optionMenuOpenType, XmNmenuHistory, pushButtonOpenNaturalGamma, NULL);
1880:         }
1881:         else if(openfileinfo.in_data_type == REFLECTANCEMST) { 
1882:           XtVaSetValues(optionMenuOpenType, XmNmenuHistory, pushButtonOpenReflectance, NULL);
1883:         }
1884:         else if(openfileinfo.in_data_type == OTHERTYPE) { 
1885:           if(openfileinfo.in_data_format == MST95REPORT || openfileinfo.in_data_format == TKREPORT ||
1886:              openfileinfo.in_data_format == JANUSCLEAN || openfileinfo.in_data_format == JANUSORIG) {
1887:             /*MST95 and TK and Janus formats do not have an other type */
1888:             XtVaSetValues(optionMenuOpenType, XmNmenuHistory, pushButtonOpenGrape, NULL);
1889:           }
1890:           else {
1891:             XtVaSetValues(optionMenuOpenType, XmNmenuHistory, pushButtonOpenOtherType, NULL);
1892:           }
1893:         }
1894:         else {
1895:           openfileinfo.in_data_type = GRAPE;
1896:           XtVaSetValues(optionMenuOpenType, XmNmenuHistory, pushButtonOpenGrape, NULL);
1897:         } 
1898: 
1899:         XtFree(current_path);
1900:         current_path=NULL;
1901:         if((current_path=(char*)calloc((int)strlen(open_data_directory)+5,CHAR_SIZE))==NULL)
1902:                                 SpBadMemAlloc("SpOpenData");
1903:         (void)sprintf(current_path, "%s", open_data_directory);
1904: 
1905:         len = (int)strlen(current_path);
1906:         if(strcmp(&current_path[len-1], "/") == 0) {
1907:           *strrchr(current_path,'/')= '\0';
1908:         }
1909: 
1910:         if((str=(char*)calloc((int)strlen(current_path)+5,CHAR_SIZE))==NULL)
1911:                                 SpBadMemAlloc("SpOpenData");
1912:         (void)sprintf(str,"%s/*",current_path);
1913:         XtVaSetValues(textOpenFilter, XmNvalue, str, NULL);
1914:         free(str);
1915: 
1916:   SpUpdateOpen(FILE_FILTER);
1917:   
1918:         (void)sprintf(preview_input_path,"%s",current_path);
1919: 
1920:   XtVaGetValues(optionMenuOpenFormat,XmNmenuHistory,&tmp_widget,NULL);
1921:   XtVaGetValues(*tmp_widget,XmNuserData,&tmp_format,NULL);
1922:   XtManageChild(formOpen);
1923:   if(message.error)
1924:     SpManageWarningBox(errorstring);
1925: }
1926: 
1927: /*      Function Name:  SpCullSaveCB
1928:  *
1929:  *      Description:    This function opens the fileSelection dialog box for
1930:  *            saving the cull table.
1931:  *      
1932:  *
1933:  *      Arguments:      Widget    w:  pushButtonSaveCull
1934:  *      XtPointer client: unused
1935:  *      XtPointer call: the call data (unused).
1936:  */
1937: /* ARGSUSED */
1938: void
1939: SpCullSaveCB(w, client, call)
1940: Widget w;
1941: XtPointer client;
1942: XtPointer call;
1943: {
1944: }
1945: 
1946: /*      Function Name:  SpFileSelectionBoxOKCB
1947:  *
1948:  *      Description:    This function is called by the OK button in a
1949:  *            fileSelectionBox. It saves the file and filter
1950:  *      values and opens the appropriate file.
1951:  *
1952:  *      Arguments:      Widget    w:  the activating widget.
1953:  *      XtPointer client: fileselection widget
1954:  *      XtPointer call: fileselection callback struct.
1955:  */
1956: /* ARGSUSED */
1957: void
1958: SpFileSelectionBoxOKCB(w, client, call)
1959: Widget w;
1960: XtPointer client;
1961: XtPointer call;
1962: {
1963: }
1964: 
1965: /*      Function Name:  SpVerifyFloatCB
1966:  *
1967:  *      Description:    This function checks that the text value of the
1968:  *            widget supplied is a valid floating point field.
1969:  *      
1970:  *
1971:  *      Arguments:      Widget    w:  the activating widget.
1972:  *      XtPointer client: unused
1973:  *      XtPointer call: TextVerifyCallback
1974:  */
1975: /* ARGSUSED */
1976: void
1977: SpVerifyFloatCB(w, client, call)
1978: Widget w;
1979: XtPointer client;
1980: XtPointer call;
1981: {
1982:   int i=0,len,decimal_found=False;
1983:   char  numbuffer[200];
1984:   /*SUPPRESS 594*/
1985: /* get text strings */
1986:   char *oldtext = XmTextGetString(w);
1987:   XmTextVerifyCallbackStruct *textcall=(XmTextVerifyCallbackStruct*)call;
1988: /* check that new value is numeric */ 
1989:   for(i=0;i<textcall->text->length&& textcall->doit==True;i++)
1990:   {
1991:     if(!(isdigit(textcall->text->ptr[i])) && textcall->text->ptr[i]!='.'
1992:         && textcall->text->ptr[i]!='-')
1993:       textcall->doit = False;
1994:   }
1995: /* check that altered value will be OK */
1996:   if(textcall->doit)
1997:   {
1998:   /* create new value */
1999:     numbuffer[0]='\0';
2000:     if(textcall->startPos > 0)
2001:     {
2002:       (void)strncpy(numbuffer,oldtext,textcall->startPos);
2003:       numbuffer[textcall->startPos]='\0';
2004:     }
2005:     if(textcall->text->ptr != NULL)
2006:       (void)strcat(numbuffer,textcall->text->ptr);
2007:     if(textcall->endPos < (int)strlen(oldtext))
2008:       (void)strcat(numbuffer,&oldtext[textcall->endPos]);
2009:   /* check if valid floating point */
2010:     len=(int)strlen(numbuffer);
2011:     for(i=0;i<len && textcall->doit;i++)
2012:     {
2013:       if(!isdigit(numbuffer[i]) && !(numbuffer[i]=='-' && i==0) &&
2014:           !(numbuffer[i]=='.' && !decimal_found))
2015:         textcall->doit=False;
2016:       if(numbuffer[i]=='.') decimal_found=True;
2017:     }
2018:   }
2019:   XtFree(oldtext);
2020: }
2021: 
2022: /*      Function Name:  SpCullJoinCB
2023:  *
2024:  *      Description:    This function is called by the join option menu
2025:  *            in the cull dialog. It set the sensitivity of th
2026:  *      second set of equation values.
2027:  *
2028:  *      Arguments:      Widget    w:  the cull join pushbuttons
2029:  *      XtPointer client: unused
2030:  *      XtPointer call: the call data (unused).
2031:  */
2032: /* ARGSUSED */
2033: void
2034: SpCullJoinCB(w, client, call)
2035: Widget w;
2036: XtPointer client;
2037: XtPointer call;
2038: {
2039:   /*SUPPRESS 594*/
2040:   Widget *tmpwidget=(Widget*)w;
2041:   if(*tmpwidget==pushButtonCullOnly)
2042:   {
2043:     XtSetSensitive(equationMenuCull2.EquationMenu,FALSE);
2044:     XtSetSensitive(textFieldCullValue2,FALSE);
2045:   }
2046:   else
2047:   {
2048:     XtSetSensitive(equationMenuCull2.EquationMenu,True);
2049:     XtSetSensitive(textFieldCullValue2,True);
2050:   }
2051: }
2052: /*      Function Name: BxVerifyNumericCB
2053:  *      Description:   Used as the XmNmodifyVerify callback on a text
2054:  *             or text field widget. Allows only numeric characters
2055:  *             to be entered [no decimal point or sign is allowed].
2056:  *      Arguments:     Widget     w:  the widget calling the function.
2057:  *             XtPointer  client:  unused
2058:  *             XtPointer  call:  pointer to XmTextVerifyCallbackStruct
2059:  */
2060: 
2061: /* ARGSUSED */
2062: void
2063: BxVerifyNumericCB ARGLIST((w, client, call))
2064: UARG( Widget, w)
2065: UARG( XtPointer, client)
2066: GRA( XtPointer, call)
2067: {
2068:     int       i;
2069:     XmTextVerifyCallbackStruct  *theVerifyCB;
2070:     XmTextBlock     textBlock;   /* the text to be inserted */
2071:  
2072:     theVerifyCB = (XmTextVerifyCallbackStruct *)call;
2073:     textBlock = theVerifyCB->text;
2074: 
2075:     for ( i=0; i < textBlock->length; i++)
2076:     { 
2077:         if ( !(isascii(textBlock->ptr[i])) || !(isdigit(textBlock->ptr[i])) )
2078:   {
2079:             theVerifyCB->doit = False;
2080:   }
2081:     }
2082:     /*
2083:      * keyboard bell will be rung  by default
2084:      */
2085: }
2086: 
2087: /*      Function Name:  SpOpenInfoOKCB
2088:  *
2089:  *      Description:    This function OKs the user selected input
2090:  *            information and starts the data reading.
2091:  *      
2092:  *
2093:  *      Arguments:      Widget    w:  pushButtonOpenInfoOK
2094:  *      XtPointer client: unused
2095:  *      XtPointer call: the call data (unused).
2096:  */
2097: /* ARGSUSED */
2098: void
2099: SpOpenInfoOKCB(w, client, call)
2100: Widget w;
2101: XtPointer client;
2102: XtPointer call;
2103: {
2104:   char  *info;
2105: 
2106:   /*SUPPRESS 594*/
2107:   XtWorkProc SpInputData;
2108:   XtUnmanageChild(formOpenInfo);
2109:   info=XmTextGetString(textOpenInfo);
2110:   SpUpdateReport(info);
2111:   XtFree(info);
2112:         done_reading = False;
2113:   work_id=XtAppAddWorkProc(app,SpInputData,messageBoxWorking);
2114:   XtManageChild(messageBoxWorking);
2115:   XtPopup(XtParent(messageBoxWorking),XtGrabNone);
2116: }
2117: 
2118: /*      Function Name:  SplicerHelpCB
2119:  *
2120:  *      Description:    THis function calls the splicer help program using
2121:  *            the file name passed by the calling widget.
2122:  *      
2123:  *
2124:  *      Arguments:      Widget    w:  the activating widget.
2125:  *      XtPointer client: name of help file
2126:  *      XtPointer call: the call data (unused).
2127:  */
2128: /* ARGSUSED */
2129: void
2130: SplicerHelpCB(w, client, call)
2131: Widget w;
2132: XtPointer client;
2133: XtPointer call;
2134: {
2135:   /*SUPPRESS 594*/
2136:   char  *helpfiles_path, *help_path,*getenv();
2137: /* get text string */
2138:   char *helpbuffer= (char*) client;
2139: /* put together command and submit it */
2140: 
2141:         if((helpfiles_path=(char*)calloc(1000,CHAR_SIZE))==NULL)
2142:                 SpBadMemAlloc("SplicerHelpCB 1");
2143:         if((help_path=(char*)calloc(1000,CHAR_SIZE))==NULL)
2144:                 SpBadMemAlloc("SplicerHelpCB 2");
2145:   (void)strcpy(helpfiles_path,(char*)getenv("SPLICER_HELPFILES_PATH"));
2146:         (void)strcpy(help_path,(char*)getenv("SPLICER_HELP_PATH"));
2147:   if((charptr=(char*)calloc((int)strlen(helpfiles_path) + (int)strlen(help_path)+(int)strlen(helpbuffer)+200,CHAR_SIZE))==NULL)
2148:     SpBadMemAlloc("SplicerHelpCB 3");
2149:   (void)sprintf(charptr,"%s/hsplicer-c -bg %s -fg %s <%s/%s & ", help_path, prgbgcolor, prgfgcolor, helpfiles_path,helpbuffer);
2150:   (void)system(charptr);
2151:   free(charptr);
2152:         free(helpfiles_path);
2153:         free(help_path);
2154: }
2155: 
2156: /*      Function Name:  SpAffineSaveCB
2157:  *
2158:  *      Description:    This function  sets the defaults for the save affine
2159:  *            dialog and opens the dialog.
2160:  *
2161:  *      Arguments:      Widget    w:  pushButtonSaveAffine
2162:  *      XtPointer client: the integer exit value.
2163:  *      XtPointer call: the call data (unused).
2164:  */
2165: /* ARGSUSED */
2166: void
2167: SpAffineSaveCB(w, client, call)
2168: Widget w;
2169: XtPointer client;
2170: XtPointer call;
2171: {
2172: }
2173: 
2174: /* ARGSUSED */
2175: void
2176: SpManageCB(w, client, call)
2177: Widget w;
2178: XtPointer client;
2179: XtPointer call;
2180: {
2181:   /*SUPPRESS 594*/
2182: }
2183: 
2184: /*      Function Name:  SpExitCB
2185:  *
2186:  *      Description:    This function cleans up and exits the program.
2187:  *
2188:  *      Arguments:      Widget    w:  pushButtonOK from messageBoxExit
2189:  *      XtPointer client: the integer exit value.
2190:  *      XtPointer call: the call data (unused).
2191:  */
2192: /* ARGSUSED */
2193: void
2194: SpExitCB(w, client, call)
2195: Widget w;
2196: XtPointer client;
2197: XtPointer call;
2198: {
2199:   /*SUPPRESS 594*/
2200:     int  exitValue = (int)client;
2201:     void exit(), SpWriteReport();
2202: 
2203:     /* write the report
2204:     */
2205:     if(write_report == NO) {
2206:     }
2207:     else {
2208:       SpWriteReport();
2209:     }
2210:     
2211:     SpExit();
2212:     exit(exitValue);
2213: }
2214: 
2215: /*      Function Name:  SpClearWorkspaceCB
2216:  *
2217:  *      Description:    This function cleans up all opened data strucutures
2218: *     and clears windows.
2219:  *
2220:  *      Arguments:      Widget    w:  pushButtonOK from messageBoxClearWorkspace
2221:  *      XtPointer client: the integer exit value.
2222:  *      XtPointer call: the call data (unused).
2223:  */
2224: /* ARGSUSED */
2225: void
2226: SpClearWorkspaceCB(w, client, call)
2227: Widget w;
2228: XtPointer client;
2229: XtPointer call;
2230: {
2231:   /*SUPPRESS 594*/
2232:   if(have_data == DO) {
2233:   SpCleanUp(ALL);
2234:   }
2235: }
2236: 
2237: /*      Function Name:  SpCreateReportCB
2238:  *
2239:  *      Description:    writes time to start of report text
2240:  *
2241:  *      Arguments:      Widget    w:  the activating widget.
2242:  *      XtPointer client: the integer exit value.
2243:  *      XtPointer call: the call data (unused).
2244:  */
2245: 
2246: /* ARGSUSED */
2247: void
2248: SpCreateReportCB(w, client, call)
2249: Widget w;
2250: XtPointer client;
2251: XtPointer call;
2252: {
2253: }
2254: 
2255: /* ARGSUSED */
2256: void
2257: SpCreateCB(w, client, call)
2258: Widget w;
2259: XtPointer client;
2260: XtPointer call;
2261: {
2262:       String       drawingAreaEditTranslations;
2263:       XtActionsRec drawingAreaEditButtonActions;
2264:       String       drawingAreaViewTranslations;
2265:       XtActionsRec drawingAreaViewButtonActions;
2266:       String       drawingAreaTieCorrelationTranslations;
2267:       XtActionsRec drawingAreaTieCorrelationButtonActions;
2268:       String       drawingAreaSpliceCorrelationTranslations;
2269:       XtActionsRec drawingAreaSpliceCorrelationButtonActions;
2270:       String       drawingAreaDepthOffsetTranslations;
2271:       XtActionsRec drawingAreaDepthOffsetButtonActions;
2272:         String       drawingAreaAgeDepthTranslations;
2273:         XtActionsRec drawingAreaAgeDepthButtonActions;
2274:         String       drawingAreaSpliceToAgeTranslations;
2275:         XtActionsRec drawingAreaSpliceToAgeButtonActions;
2276:         String       drawingAreaTieToTimeSeriesCorrTranslations;
2277:         XtActionsRec drawingAreaTieToTimeSeriesCorrButtonActions;
2278:   extern void EventProcDrawingAreaDepthOffset();
2279:   extern void EventProcDrawingAreaEdit();
2280:   extern void EventProcDrawingAreaView();
2281:   extern void EventProcDrawingAreaTieCorrelation();
2282:   extern void EventProcDrawingAreaSpliceCorrelation();
2283:         extern void EventProcDrawingAreaAgeDepth();
2284:         extern void EventProcDrawingAreaSpliceToAge();
2285:         extern void EventProcDrawingAreaTieToTimeSeriesCorr();
2286: 
2287:   /*SUPPRESS 594*/
2288:   Widget *setme = (Widget*)client;
2289:   if(*setme == messageBoxWorking)
2290:   {
2291:     XtUnmanageChild(XmMessageBoxGetChild(messageBoxWorking,XmDIALOG_OK_BUTTON));
2292:     XtUnmanageChild(XmMessageBoxGetChild(messageBoxWorking,XmDIALOG_HELP_BUTTON));
2293:          }
2294:   else if(*setme == drawingAreaDepthOffset)
2295:   {
2296:         drawingAreaDepthOffsetButtonActions.string = "EventProcDrawingAreaDepthOffset"; 
2297:         drawingAreaDepthOffsetButtonActions.proc = EventProcDrawingAreaDepthOffset; 
2298:         XtAppAddActions(app, &drawingAreaDepthOffsetButtonActions, 1);
2299:      
2300:         drawingAreaDepthOffsetTranslations =
2301:           "<Btn1Down>:   EventProcDrawingAreaDepthOffset(but_1_down) ManagerGadgetArm()\n\
2302:           <Btn1Up>:     EventProcDrawingAreaDepthOffset(but_1_up)   ManagerGadgetActivate()\n\
2303:           <Btn1Motion>: EventProcDrawingAreaDepthOffset(but_1_move) ManagerGadgetButtonMotion()"; 
2304:  
2305:         XtVaSetValues(*setme, XmNtranslations, XtParseTranslationTable(drawingAreaDepthOffsetTranslations),NULL);
2306:   }
2307:         else if(*setme == drawingAreaAgeDepth)
2308:         {
2309:                 drawingAreaAgeDepthButtonActions.string = "EventProcDrawingAreaAgeDepth";
2310:                 drawingAreaAgeDepthButtonActions.proc = EventProcDrawingAreaAgeDepth;
2311:                 XtAppAddActions(app, &drawingAreaAgeDepthButtonActions, 1);
2312:                  
2313:                 drawingAreaAgeDepthTranslations =
2314:                         "<Btn1Down>:   EventProcDrawingAreaAgeDepth(but_1_down) ManagerGadgetArm()\n\
2315:                         <Btn1Up>:     EventProcDrawingAreaAgeDepth(but_1_up)   ManagerGadgetActivate()\n\
2316:                         <Btn1Motion>: EventProcDrawingAreaAgeDepth(but_1_move) ManagerGadgetButtonMotion()\n\
2317:                         <Btn2Down>:   EventProcDrawingAreaAgeDepth(but_2_down) ManagerGadgetArm()\n\
2318:                         <Btn2Up>:     EventProcDrawingAreaAgeDepth(but_2_up)   ManagerGadgetActivate()\n\
2319:                         <Btn2Motion>: EventProcDrawingAreaAgeDepth(but_2_move) ManagerGadgetButtonMotion()\n\
2320:                         <Btn3Down>:   EventProcDrawingAreaAgeDepth(but_3_down) ManagerGadgetArm()\n\
2321:                         <Btn3Up>:     EventProcDrawingAreaAgeDepth(but_3_up)   ManagerGadgetActivate()\n\
2322:                         <Btn3Motion>: EventProcDrawingAreaAgeDepth(but_3_move) ManagerGadgetButtonMotion()";
2323:  
2324:                 XtVaSetValues(*setme, XmNtranslations, XtParseTranslationTable(drawingAreaAgeDepthTranslations),NULL);
2325:         }
2326:         else if(*setme == drawingAreaSpliceToAge)
2327:         {
2328:                 drawingAreaSpliceToAgeButtonActions.string = "EventProcDrawingAreaSpliceToAge";
2329:                 drawingAreaSpliceToAgeButtonActions.proc = EventProcDrawingAreaSpliceToAge;
2330:                 XtAppAddActions(app, &drawingAreaSpliceToAgeButtonActions, 1);
2331: 
2332:                 drawingAreaSpliceToAgeTranslations =
2333:                         "<Btn1Down>:   EventProcDrawingAreaSpliceToAge(but_1_down) ManagerGadgetArm()\n\
2334:                         <Btn1Up>:     EventProcDrawingAreaSpliceToAge(but_1_up)   ManagerGadgetActivate()\n\
2335:                         <Btn1Motion>: EventProcDrawingAreaSpliceToAge(but_1_move) ManagerGadgetButtonMotion()\n\
2336:                         <Btn2Down>:   EventProcDrawingAreaSpliceToAge(but_2_down) ManagerGadgetArm()\n\
2337:                         <Btn2Up>:     EventProcDrawingAreaSpliceToAge(but_2_up)   ManagerGadgetActivate()\n\
2338:                         <Btn2Motion>: EventProcDrawingAreaSpliceToAge(but_2_move) ManagerGadgetButtonMotion()\n\
2339:                         <Btn3Down>:   EventProcDrawingAreaSpliceToAge(but_3_down) ManagerGadgetArm()\n\
2340:                         <Btn3Up>:     EventProcDrawingAreaSpliceToAge(but_3_up)   ManagerGadgetActivate()\n\
2341:                         <Btn3Motion>: EventProcDrawingAreaSpliceToAge(but_3_move) ManagerGadgetButtonMotion()\n\
2342:                         <KeyDown>Return:  EventProcDrawingAreaSpliceToAge(return_down)  ManagerGadgetSelect()\n\
2343:                         <KeyDown>osfUp: EventProcDrawingAreaSpliceToAge(arrow_up)   ManagerGadgetSelect()\n\
2344:                         <KeyDown>osfDown: EventProcDrawingAreaSpliceToAge(arrow_down)   ManagerGadgetSelect()";
2345: 
2346:                 XtVaSetValues(*setme, XmNtranslations, XtParseTranslationTable(drawingAreaSpliceToAgeTranslations),NULL);
2347:         }
2348:   else if(*setme == drawingAreaEdit)
2349:   {
2350:         drawingAreaEditButtonActions.string = "EventProcDrawingAreaEdit";
2351:         drawingAreaEditButtonActions.proc = EventProcDrawingAreaEdit;
2352:         XtAppAddActions(app, &drawingAreaEditButtonActions, 1);
2353:  
2354:         drawingAreaEditTranslations =
2355:                     "<Btn1Down>:    EventProcDrawingAreaEdit(but_1_down) ManagerGadgetArm()\n\
2356:                       <Btn1Up>:       EventProcDrawingAreaEdit(but_1_up)   ManagerGadgetActivate()\n\
2357:                       <Btn1Motion>:   EventProcDrawingAreaEdit(but_1_move  ManagerGadgetButtonMotion()\n\
2358:                       <Btn2Down>:     EventProcDrawingAreaEdit(but_2_down) ManagerGadgetArm()\n\
2359:                       <Btn2Up>:       EventProcDrawingAreaEdit(but_2_up)   ManagerGadgetActivate()\n\
2360:                                 <Btn2Motion>:   EventProcDrawingAreaEdit(but_2_move) ManagerGadgetButtonMotion()\n\
2361:                       <Btn3Down>:     EventProcDrawingAreaEdit(but_3_down) ManagerGadgetArm()\n\
2362:                       <Btn3Up>:       EventProcDrawingAreaEdit(but_3_up)   ManagerGadgetActivate()\n\
2363:                                 <Btn3Motion>:   EventProcDrawingAreaEdit(but_3_move) ManagerGadgetButtonMotion()\n\
2364:                                 <KeyDown>Return:  EventProcDrawingAreaEdit(return_down)  ManagerGadgetSelect()\n\
2365:                                 <KeyDown>osfUp: EventProcDrawingAreaEdit(arrow_up)   ManagerGadgetSelect()\n\
2366:                                 <KeyDown>osfDown: EventProcDrawingAreaEdit(arrow_down)   ManagerGadgetSelect()";
2367:         XtVaSetValues(drawingAreaEdit, XmNtranslations, XtParseTranslationTable(drawingAreaEditTranslations),NULL);
2368:   }
2369:   else if(*setme == drawingAreaView)
2370:   {
2371:         drawingAreaViewButtonActions.string = "EventProcDrawingAreaView";
2372:         drawingAreaViewButtonActions.proc = EventProcDrawingAreaView;
2373:         XtAppAddActions(app, &drawingAreaViewButtonActions, 1);
2374:   
2375:         drawingAreaViewTranslations =
2376:           "<Btn1Down>:   EventProcDrawingAreaView(but_1_down) ManagerGadgetArm()\n\
2377:           <Btn1Up>:     EventProcDrawingAreaView(but_1_up)   ManagerGadgetActivate()\n\
2378:           <Btn1Motion>: EventProcDrawingAreaView(but_1_move) ManagerGadgetButtonMotion()\n\
2379:           <Btn2Down>:   EventProcDrawingAreaView(but_2_down) ManagerGadgetArm()\n\
2380:           <Btn2Up>:     EventProcDrawingAreaView(but_2_up)   ManagerGadgetActivate()\n\
2381:                         <Btn2Motion>: EventProcDrawingAreaView(but_2_move) ManagerGadgetButtonMotion()\n\
2382:           <Btn3Down>:   EventProcDrawingAreaView(but_3_down) ManagerGadgetArm()\n\
2383:           <Btn3Up>:     EventProcDrawingAreaView(but_3_up)   ManagerGadgetActivate()\n\
2384:                         <Btn3Motion>: EventProcDrawingAreaView(but_3_move) ManagerGadgetButtonMotion()\n\
2385:                         <KeyDown>Return:  EventProcDrawingAreaView(return_down)  ManagerGadgetSelect()\n\
2386:                         <KeyDown>osfUp: EventProcDrawingAreaView(arrow_up)   ManagerGadgetSelect()\n\
2387:                         <KeyDown>osfDown: EventProcDrawingAreaView(arrow_down)   ManagerGadgetSelect()";
2388:         XtVaSetValues(drawingAreaView, XmNtranslations, XtParseTranslationTable(drawingAreaViewTranslations),NULL);
2389:   }
2390:   else if(*setme == drawingAreaCompCorrelation)
2391:   {
2392:         drawingAreaSpliceCorrelationButtonActions.string = "EventProcDrawingAreaSpliceCorrelation";
2393:         drawingAreaSpliceCorrelationButtonActions.proc = EventProcDrawingAreaSpliceCorrelation;
2394:         XtAppAddActions(app, &drawingAreaSpliceCorrelationButtonActions, 1);
2395: 
2396:         drawingAreaSpliceCorrelationTranslations =
2397:           "<Btn1Down>:   EventProcDrawingAreaSpliceCorrelation(but_1_down) ManagerGadgetArm()\n\
2398:           <Btn1Up>:     EventProcDrawingAreaSpliceCorrelation(but_1_up)   ManagerGadgetActivate()\n\
2399:           <Btn1Motion>: EventProcDrawingAreaSpliceCorrelation(but_1_move) ManagerGadgetButtonMotion()";
2400:         XtVaSetValues(drawingAreaCompCorrelation, XmNtranslations, XtParseTranslationTable(drawingAreaSpliceCorrelationTranslations),NULL);
2401:   }
2402:   else if(*setme == drawingAreaTieCorrelation)
2403:   {
2404:         drawingAreaTieCorrelationButtonActions.string = "EventProcDrawingAreaTieCorrelation";
2405:         drawingAreaTieCorrelationButtonActions.proc = EventProcDrawingAreaTieCorrelation;
2406:         XtAppAddActions(app, &drawingAreaTieCorrelationButtonActions, 1);
2407: 
2408:         drawingAreaTieCorrelationTranslations =
2409:           "<Btn1Down>:   EventProcDrawingAreaTieCorrelation(but_1_down) ManagerGadgetArm()\n\
2410:           <Btn1Up>:     EventProcDrawingAreaTieCorrelation(but_1_up)   ManagerGadgetActivate()\n\
2411:           <Btn1Motion>: EventProcDrawingAreaTieCorrelation(but_1_move) ManagerGadgetButtonMotion()";
2412: 
2413:         XtVaSetValues(drawingAreaTieCorrelation, XmNtranslations, XtParseTranslationTable(drawingAreaTieCorrelationTranslations),NULL);
2414:   }
2415:         else if(*setme == drawingAreaTieToTimeSeriesCorr)
2416:         {
2417:                 drawingAreaTieToTimeSeriesCorrButtonActions.string = "EventProcDrawingAreaTieToTimeSeriesCorr";
2418:                 drawingAreaTieToTimeSeriesCorrButtonActions.proc = EventProcDrawingAreaTieToTimeSeriesCorr;
2419:                 XtAppAddActions(app, &drawingAreaTieToTimeSeriesCorrButtonActions, 1);
2420: 
2421:                 drawingAreaTieToTimeSeriesCorrTranslations =
2422:                         "<Btn1Down>:   EventProcDrawingAreaTieToTimeSeriesCorr(but_1_down) ManagerGadgetArm()\n\
2423:                         <Btn1Up>:     EventProcDrawingAreaTieToTimeSeriesCorr(but_1_up)   ManagerGadgetActivate()\n\
2424:                         <Btn1Motion>: EventProcDrawingAreaTieToTimeSeriesCorr(but_1_move) ManagerGadgetButtonMotion()";
2425: 
2426:                 XtVaSetValues(drawingAreaTieToTimeSeriesCorr, XmNtranslations, XtParseTranslationTable(drawingAreaTieToTimeSeriesCorrTranslations),NULL);
2427:          }
2428: }
2429: 
2430: /* ARGSUSED */
2431: void
2432: SpMessageBoxInfoCB(w, client, call)
2433: Widget w;
2434: XtPointer client;
2435: XtPointer call;
2436: {
2437:   void  exit();
2438: 
2439:   /*SUPPRESS 594*/
2440:   XtUnmanageChild(messageBoxInfo);
2441:   if(message.fatal)
2442:   {
2443:     
2444:     SpCleanUp(EXIT);
2445:     exit(0);
2446:   }
2447:   message.error=False;
2448:   free(message.label);
2449:   message.label=NULL;
2450: }
2451: 
2452: /* ARGSUSED */
2453: void
2454: SpOutputOKCB(w, client, call)
2455: Widget w;
2456: XtPointer client;
2457: XtPointer call;
2458: {
2459:         int             readable, len;
2460:         char            *testdir;
2461:   XmString  xmstring;
2462:   XtWorkProc SpOutputData;
2463: 
2464:   /*SUPPRESS 594*/
2465: 
2466:   /* check that is a directory
2467:   */
2468:   testdir = XmTextGetString(textFieldSaveDataDirectory);
2469:   readable = VerifyFileReadable(testdir, SAVE, SAVEDATA);
2470:   if(readable == NO) {
2471:     (void)sprintf(buffer,"%s is not a directory.",testdir);
2472:     free(testdir);
2473:     XmTextSetString(textFieldAffineFileName,"");
2474:     SpManageWarningBox(buffer);
2475:     return;
2476:   }
2477:   else {
2478: 
2479:         free(outdata_dirname);
2480:         if((outdata_dirname=(char*)calloc((int)strlen(testdir)+5,CHAR_SIZE))==NULL)
2481:                                 SpBadMemAlloc("OpenSplicerTable");
2482:         (void)sprintf(outdata_dirname, "%s", testdir);
2483: 
2484:         len = (int)strlen(outdata_dirname);
2485:         if(strcmp(&outdata_dirname[len-1], "/") != 0) {
2486:           (void)strcat(outdata_dirname, "/");
2487:         }
2488: 
2489:         XtUnmanageChild(formOutput);
2490: 
2491: /* start working procedure for reading splicer table*/
2492:   work_id=XtAppAddWorkProc(app,SpOutputData,messageBoxWorking);
2493: /* display working box */
2494:   xmstring=XmStringCreateLocalized("Output : writing output data.");
2495:         XtVaSetValues(messageBoxWorking,XmNmessageString,xmstring, NULL);
2496:         XmStringFree(xmstring);
2497:         XtManageChild(messageBoxWorking);
2498:         XtPopup(XtParent(messageBoxWorking),XtGrabNone);
2499:   }
2500: }
2501: 
2502: /* ARGSUSED */
2503: void
2504: SpViewReportCB(w, client, call)
2505: Widget w;
2506: XtPointer client;
2507: XtPointer call;
2508: {
2509: 
2510:   /*SUPPRESS 594*/
2511: 
2512:   XmString xmstring;
2513:   char  *string;
2514: 
2515:   XtVaGetValues(pushButtonViewReport, XmNlabelString, &xmstring, NULL);
2516:   if(!XmStringGetLtoR(xmstring,XmFONTLIST_DEFAULT_TAG,&string))
2517:   {
2518:   message.error=True;
2519:   message.fatal=False;
2520:         message.caller=NONE;
2521:         message.type=XmDIALOG_WARNING;
2522:         message.default_button=XmDIALOG_OK_BUTTON;
2523:   if((message.label=(char*)calloc(200,CHAR_SIZE))==NULL)
2524:     SpBadMemAlloc("SpViewReportCB 1");
2525:   else
2526:     (void)sprintf(message.label,"Unable to convert report label to char");
2527:   SpManageMessage(message);
2528:   }
2529: /*  XmStringFree(xmstring);
2530: */
2531:   if((int)strcmp(string, "View Report") == 0){
2532: 
2533:       /*  XtManageChild(formTextReport); */
2534:         if(!XtIsManaged(XtParent(formTextReport))) {
2535:           XtManageChild(formTextReport);
2536:         }
2537:         XtPopup(XtParent(formTextReport), XtGrabNone);
2538: 
2539:     xmstring=XmCvtCTToXmString("Hide Report");
2540:     XtVaSetValues(pushButtonViewReport,XmNlabelString,xmstring,NULL);
2541:     XmStringFree(xmstring);
2542:   }
2543:   else if((int)strcmp(string, "Hide Report") == 0) {
2544: 
2545:   /*  XtUnmanageChild(formTextReport); */
2546:     XtPopdown(XtParent(formTextReport));
2547:     xmstring=XmCvtCTToXmString("View Report");
2548:     XtVaSetValues(pushButtonViewReport,XmNlabelString,xmstring,NULL);
2549:     XmStringFree(xmstring);
2550:   }
2551:   XtFree(string);
2552: }
2553: 
2554: 
2555: /* ARGSUSED */
2556: void
2557: EventProcDrawingAreaEdit(w, event, args, num_args)
2558: Widget w;
2559: XButtonEvent *event;
2560: String *args;
2561: int *num_args;
2562: {
2563:   int x, y, i, j, k, holenum, corenum, arraynum, sm, err1, err2, 
2564:       starting_hole, report_tie1, report_tie2, found_strat, save_tie1, save_tie2;
2565:   char string[200], idstring[200], varstring[20], coreselectstring[5];
2566:   float depth, chlow, chhigh, diff, *var_val, avedep, avedep1, avedep2;
2567:   double checkdep;
2568:   Dimension win_height, win_width;
2569:   String str;
2570:   XmString xmstring;
2571:   void DrawDrawingAreaEdit(), TieCorrelate(), GetSelectCore(), TieShift();
2572: 
2573:   x = event->x;
2574:   y = event->y;
2575:   XtVaGetValues(w, XmNheight, &win_height, XmNwidth, &win_width, NULL);
2576:   (void)sprintf(string, "");
2577: 
2578:   if(have_data == DONT) {
2579:     last_tie = NONE;
2580:     have_tie1 = DONT;
2581:     have_tie2 = DONT;
2582:     have_tie = DONT;
2583:   }
2584:   else if(y < 0 || y > (int)win_height || x < OFF || x > (int)win_width){
2585:     (void)sprintf(string, "");
2586:     xmstring = XmStringCreateSimple(string);
2587:     XtVaSetValues(labelCursorLocation, XmNlabelString, xmstring, NULL);
2588:     XtVaSetValues(labelSpliceCursorLocation, XmNlabelString, xmstring, NULL);
2589:     XmStringFree(xmstring);
2590:   }
2591:   else if(have_data == DO) {
2592: 
2593:     /* calculate the cursor location in depth(m)
2594:        note that top_off_edit is the pixel offset from top of drawingAreaEdit
2595:        and top_meter_edit is the value of the top of the depth axis
2596:     */
2597:     depth = (((y - top_off_edit) * depperpix) + top_meter_edit);
2598: 
2599:     /* get the cores scale value. it will be the array num of
2600:        the first hole to search. in other words; where to 'skip to'
2601:     */
2602:     XmScaleGetValue(scaleCores, &starting_hole);
2603:     if(starting_hole >= data[dset]->numholes || starting_hole < 0) {
2604:       return;
2605:     }
2606: 
2607:     if(have_tie1 == DONT && have_tie2 == DONT) {
2608:       last_tie = NONE;
2609:     }
2610:     else if(have_tie1 == DONT && last_tie == TIE1) {
2611:       if(have_tie2 == DO){
2612:         last_tie = TIE2;
2613:       }  
2614:       else {
2615:         last_tie = NONE;
2616:       }  
2617:     }  
2618:     else if(have_tie2 == DONT && last_tie == TIE2) {
2619:       if(have_tie1 == DO){
2620:         last_tie = TIE1;
2621:       }  
2622:       else {
2623:         last_tie = NONE;
2624:       }  
2625:     }
2626:  
2627:     report_tie1 = NO;
2628:     report_tie2 = NO;
2629:  
2630:     /* smoothed and if so plot type
2631:     */
2632:     if(smooth.plot == NONE || smooth.plot == UNSMOOTHED){
2633:       sm = NO;
2634:     }
2635:     else if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
2636:             (smooth.plot == SMOOTHED || smooth.plot == SMOOTHEDBOTH)){
2637:       sm = YES;
2638:     }
2639:     else {
2640:       sm = NO;
2641:     }
2642: 
2643:     /* event is any button up, down or move
2644:     */
2645:     if((int)strcmp(args[0], "but_1_down") == 0 || (int)strcmp(args[0], "but_1_move") == 0 ||
2646:        (int)strcmp(args[0], "but_2_down") == 0 || (int)strcmp(args[0], "but_2_move") == 0 ||
2647:        (int)strcmp(args[0], "but_3_down") == 0 || (int)strcmp(args[0], "but_3_move") == 0) {
2648:  
2649:       /* find the nearest sample to cursor pixel location
2650:       */ 
2651:       /* if are compositing, only look for hole and core if is button down event or button one move.
2652:          a button 2 or 3 move would mean have allready picked a point in a core
2653:          and are now moving up or down the same core
2654:       */
2655:       if( (((int)strcmp(args[0], "but_1_down") == 0 || (int)strcmp(args[0], "but_2_down") == 0 || 
2656:             (int)strcmp(args[0], "but_3_down") == 0 || (int)strcmp(args[0], "but_1_move") == 0) && are_compositing == YES) ||
2657:           (((int)strcmp(args[0], "but_1_down") == 0 || (int)strcmp(args[0], "but_1_move") == 0 ||
2658:             (int)strcmp(args[0], "but_2_down") == 0 || (int)strcmp(args[0], "but_2_move") == 0 ||
2659:             (int)strcmp(args[0], "but_3_down") == 0 || (int)strcmp(args[0], "but_3_move") == 0) && are_compositing == NO)) { 
2660: 
2661:         /* find which hole
2662:         */
2663:         holenum = -1;
2664:         corenum = -1;
2665:         for(i=starting_hole; i<data[dset]->numholes; ++i){
2666:           if(x >= OFF + SPACE + (i - starting_hole) * (varaxislen + SPACE) &&
2667:                x <= OFF + SPACE + (i - starting_hole) * (varaxislen + SPACE) + varaxislen) {
2668:             holenum = i;
2669:             break;
2670:           }
2671:         }  
2672:  
2673:         /* find which core
2674:         */ 
2675:         if(holenum != -1) {
2676:           for(j=0; j < data[dset]->holes[holenum]->numcores; ++j){
2677:             if(data[dset]->holes[holenum]->core[j]->value[0]->quality == BAD_CORE_NUM){
2678:             }
2679:             else {
2680:               for(k=0; data[dset]->holes[holenum]->core[j]->value[k]->quality != GOOD; ++k){
2681:                 if(k >= data[dset]->holes[holenum]->core[j]->numvalues){
2682:                   return;
2683:                 }
2684:               }
2685:               chlow=data[dset]->holes[holenum]->core[j]->value[k]->sb_depth +
2686:                                      data[dset]->holes[holenum]->core[j]->cum_dep_offset;
2687:               for(k=data[dset]->holes[holenum]->core[j]->numvalues -1;
2688:                 data[dset]->holes[holenum]->core[j]->value[k]->quality != GOOD; --k){
2689:                 if(k <= 0){
2690:                   return;
2691:                 }
2692:               }
2693:               chhigh= data[dset]->holes[holenum]->core[j]->value[k]->sb_depth +
2694:                                      data[dset]->holes[holenum]->core[j]->cum_dep_offset;
2695:               if(depth >= chlow && depth <= chhigh){
2696:                 if(smooth.plot == SMOOTHED && data[dset]->holes[holenum]->core[j]->smooth_status != SMOK) {
2697:                   return;
2698:                 }
2699:                 else if(data[dset]->holes[holenum]->core[j]->smooth_status != SMOK) {
2700:                   sm = NO;
2701:                 }
2702:                 corenum=j;
2703:                 break;
2704:               }
2705:             }
2706:           }
2707:         }
2708:       }
2709: 
2710:       else if(last_tie == TIE1) {
2711:         holenum = tie1holenum;
2712:         corenum = tie1corenum;
2713:       }
2714: 
2715:       else if(last_tie == TIE2) {
2716:         holenum = tie2holenum; 
2717:         corenum = tie2corenum;
2718:       }
2719: 
2720:       else {
2721:         return;
2722:       }
2723:  
2724:       /* find nearest good sample
2725:       */
2726:       arraynum = -1;
2727:       if(corenum != -1) {
2728:         diff = 99999.0;
2729:         for(k=0; k<data[dset]->holes[holenum]->core[corenum]->numvalues; ++k){
2730:           checkdep = depth - (data[dset]->holes[holenum]->core[corenum]->value[k]->sb_depth +
2731:                             data[dset]->holes[holenum]->core[corenum]->cum_dep_offset);
2732:           if(data[dset]->holes[holenum]->core[corenum]->value[k]->quality != GOOD) {
2733:           }
2734:           else if(fabs(checkdep) < diff){
2735:             diff = fabs(checkdep);
2736:             arraynum = k;
2737:           }
2738:         }
2739:       }
2740: 
2741:       /* did not find a core sample. if have strat data, is cursor over one of the datums?
2742:       */
2743:       if((holenum == -1 && corenum == -1 && arraynum == -1) && have_strat == DO) {
2744:         found_strat = NO;
2745:         for(i=0; i<strat_file_cnt; ++i){
2746:           if(found_strat == YES) {
2747:             break;
2748:           }
2749:           for(j=0; j<strat[i]->data_cnt; ++j){
2750:             if(strat[i]->data[j].x_pix_loc_edit < 0 || strat[i]->data[j].y_pix_loc_edit < 0) {
2751: 
2752:             }
2753:             else if(abs(strat[i]->data[j].x_pix_loc_edit + 5 - x) < CLOSE && 
2754:                abs(strat[i]->data[j].y_pix_loc_edit - 5 - y) < CLOSE) {
2755:               found_strat = YES;
2756:               if(fabs(strat[i]->data[j].top_age - strat[i]->data[j].bot_age) < ROUNDCHECK) {
2757:                 (void)sprintf(string,"hole %c  %s  %6.3f Ma   %6.2f to %6.2f mbsf  %6.2f to %6.2f mcd", 
2758:                  strat[i]->data[j].top.hole, strat[i]->data[j].name, strat[i]->data[j].top_age,
2759:                  strat[i]->data[j].top.sb_depth, strat[i]->data[j].bot.sb_depth,
2760:                  strat[i]->data[j].top.sb_depth + strat[i]->data[j].top.offset,
2761:                  strat[i]->data[j].bot.sb_depth + strat[i]->data[j].bot.offset);
2762:               }
2763:               else {
2764:                 (void)sprintf(string,"hole %c  %s  %6.3f to %6.3f Ma   %6.2f to %6.2f mbsf  %6.2f to %6.2f mcd", 
2765:                  strat[i]->data[j].top.hole, strat[i]->data[j].name, strat[i]->data[j].top_age, strat[i]->data[j].bot_age,
2766:                  strat[i]->data[j].top.sb_depth, strat[i]->data[j].bot.sb_depth,
2767:                  strat[i]->data[j].top.sb_depth + strat[i]->data[j].top.offset,
2768:                  strat[i]->data[j].bot.sb_depth + strat[i]->data[j].bot.offset);
2769:               }
2770:               xmstring = XmStringCreateSimple(string);
2771:               XtVaSetValues(labelCursorLocation, XmNlabelString, xmstring, NULL);
2772:               XtVaSetValues(labelSpliceCursorLocation, XmNlabelString, xmstring, NULL);
2773:               XmStringFree(xmstring);
2774:               return;
2775:             }
2776:           }
2777:         }
2778:       }
2779:       else {
2780:         found_strat = NO;
2781:       }
2782: 
2783:       if(holenum == -1 || corenum == -1 || arraynum == -1) {
2784:         report_tie1 = NO;
2785:         report_tie2 = NO;
2786:         last_tie = NONE;
2787:         (void)sprintf(string, "");
2788:         xmstring = XmStringCreateSimple(string);
2789:         XtVaSetValues(labelCursorLocation, XmNlabelString, xmstring, NULL);
2790:         XtVaSetValues(labelSpliceCursorLocation, XmNlabelString, xmstring, NULL);
2791:         XmStringFree(xmstring);
2792:       } 
2793:  
2794:       /* found a core sample
2795:       */
2796:       else if(holenum != -1 && corenum != -1 && arraynum != -1 && found_strat == NO){
2797: 
2798:         var_val = data[dset]->holes[holenum]->core[corenum]->value[arraynum]->data;
2799:         if(have_affine == DO){
2800:           depth = data[dset]->holes[holenum]->core[corenum]->value[arraynum]->sb_depth +
2801:                   data[dset]->holes[holenum]->core[corenum]->cum_dep_offset;
2802:           (void)sprintf(string,"%d %c  %d %c %s %.1f   %.2f(mbsf)   %.2f(mcd)   %.2f(m, offset)    %.2f",
2803:                        data[dset]->site,
2804:                        data[dset]->holes[holenum]->name,
2805:                        data[dset]->holes[holenum]->core[corenum]->num,
2806:                        data[dset]->holes[holenum]->core[corenum]->value[arraynum]->type,
2807:                        data[dset]->holes[holenum]->core[corenum]->value[arraynum]->section,
2808:                        data[dset]->holes[holenum]->core[corenum]->value[arraynum]->top_int,
2809:                        data[dset]->holes[holenum]->core[corenum]->value[arraynum]->sb_depth,
2810:                        depth,
2811:                        data[dset]->holes[holenum]->core[corenum]->cum_dep_offset,
2812:                        *var_val);
2813:         }
2814:         else if(have_affine == DONT) {
2815:           (void)sprintf(string,"%d %c  %d %c %s %.1f   %.2f(mbsf)    %.2f",
2816:                        data[dset]->site,
2817:                        data[dset]->holes[holenum]->name,
2818:                        data[dset]->holes[holenum]->core[corenum]->num,
2819:                        data[dset]->holes[holenum]->core[corenum]->value[arraynum]->type,
2820:                        data[dset]->holes[holenum]->core[corenum]->value[arraynum]->section,
2821:                        data[dset]->holes[holenum]->core[corenum]->value[arraynum]->top_int,
2822:                        data[dset]->holes[holenum]->core[corenum]->value[arraynum]->sb_depth,
2823:                        *var_val);
2824:         }
2825:         if(sm == YES && data[dset]->holes[holenum]->core[corenum]->value[arraynum]->smooth_ok == SMOK) {
2826:           (void)sprintf(varstring, " %.2f", data[dset]->holes[holenum]->core[corenum]->value[arraynum]->sm_data);
2827:           strncat(string, varstring, (int)strlen(varstring));
2828:         }
2829: 
2830:         xmstring = XmStringCreateSimple(string);
2831:         XtVaSetValues(labelCursorLocation, XmNlabelString, xmstring, NULL);
2832:         XtVaSetValues(labelSpliceCursorLocation, XmNlabelString, xmstring, NULL);
2833:         XmStringFree(xmstring);
2834: 
2835:         if(((int)strcmp(args[0], "but_2_down") == 0 || (int)strcmp(args[0], "but_2_move") == 0) &&
2836:             scale_val != data[dset]->numholes - 1 && are_compositing == YES) {
2837:           have_tie1 = DO;
2838:           tie1holenum = holenum;
2839:           tie1corenum = corenum;
2840:           tie1arraynum = arraynum;
2841:           last_tie = TIE1;
2842:           report_tie1 = YES;
2843:           report_tie2 = NO;
2844:           if((have_tie2 == DO && tie1holenum == tie2holenum && tie1corenum == tie2corenum) || have_tie2 == DONT) {
2845:             have_tie2 = DONT;
2846:             have_tie = DONT;
2847:             have_shift = DONT;
2848:             (void)sprintf(string, "");
2849:             xmstring = XmStringCreateSimple(string);
2850:             XtVaSetValues(labelTie2ID, XmNlabelString, xmstring, NULL);
2851:             XtVaSetValues(labelTie2var, XmNlabelString, xmstring, NULL);
2852:             XtVaSetValues(labelTie2sbd, XmNlabelString, xmstring, NULL);
2853:             XmStringFree(xmstring);
2854:             XtVaSetValues(textFieldTieAdjustDepth, XmNvalue, string, NULL);
2855:             have_corr = DONT;
2856:             if(XtIsManaged(XtParent(drawingAreaTieCorrelation))) { 
2857:               XClearWindow(XtDisplay(drawingAreaTieCorrelation), 
2858:                            XtWindow(drawingAreaTieCorrelation)); 
2859:             }   
2860:             XtSetSensitive(pushButtonTieCorrelation, False);
2861:             XtSetSensitive(pushButtonTieShift, False);
2862:           }
2863:         }
2864:         else if(((int)strcmp(args[0], "but_3_down") == 0 || (int)strcmp(args[0], "but_3_move") == 0) &&
2865:                  scale_val != data[dset]->numholes - 1 && are_compositing == YES) {
2866:           have_tie2 = DO; 
2867:           tie2holenum = holenum; 
2868:           tie2corenum = corenum; 
2869:           tie2arraynum = arraynum; 
2870:           last_tie = TIE2;
2871:           report_tie2 = YES;
2872:           report_tie1 = NO;
2873:           if((have_tie1 == DO && tie1holenum == tie2holenum && tie1corenum == tie2corenum) || have_tie1 == DONT) {
2874:             have_tie1 = DONT;
2875:             have_tie = DONT; 
2876:             have_shift = DONT;
2877:             (void)sprintf(string, "");
2878:             xmstring = XmStringCreateSimple(string);
2879:             XtVaSetValues(labelTie1ID, XmNlabelString, xmstring, NULL);
2880:             XtVaSetValues(labelTie1var, XmNlabelString, xmstring, NULL);
2881:             XtVaSetValues(labelTie1sbd, XmNlabelString, xmstring, NULL);
2882:             XmStringFree(xmstring);
2883:             XtVaSetValues(textFieldTieAdjustDepth, XmNvalue, string, NULL);
2884:             have_corr = DONT;
2885:             if(XtIsManaged(XtParent(drawingAreaTieCorrelation))) {
2886:               XClearWindow(XtDisplay(drawingAreaTieCorrelation),
2887:                            XtWindow(drawingAreaTieCorrelation));
2888:             }  
2889:             XtSetSensitive(pushButtonTieCorrelation, False);
2890:             XtSetSensitive(pushButtonTieShift, False);
2891:           }
2892:         }
2893:         else {
2894:           last_tie = NONE;
2895:           report_tie2 = NO;
2896:           report_tie1 = NO;
2897:         }
2898:       }
2899: 
2900: 
2901:       /*also use button down for splice core grab so set the text hole and
2902:         core to grab fields
2903:       */
2904:       if(holenum != -1 && corenum != -1 && (are_splicing == CONSTRAINED || are_splicing == UNCONSTRAINED)) {
2905:         (void)sprintf(coreselectstring, "%c", data[dset]->holes[holenum]->name);
2906:         XtVaSetValues(textCompSelectHole, XmNvalue, coreselectstring, NULL);
2907:         (void)sprintf(coreselectstring, "%d %c", data[dset]->holes[holenum]->core[corenum]->num,
2908:                                                  data[dset]->holes[holenum]->core[corenum]->value[0]->type);
2909:         XtVaSetValues(textCompSelectCore, XmNvalue, coreselectstring, NULL);
2910:       }
2911:       else if(are_splicing == CONSTRAINED || are_splicing == UNCONSTRAINED) {
2912:         (void)sprintf(coreselectstring, "");
2913:         XtVaSetValues(textCompSelectHole, XmNvalue, coreselectstring, NULL);
2914:         XtVaSetValues(textCompSelectCore, XmNvalue, coreselectstring, NULL);
2915:       }
2916:     }
2917: 
2918:     else if((int)strcmp(args[0], "but_1_up") == 0 || (int)strcmp(args[0], "but_2_up") == 0 || (int)strcmp(args[0], "but_3_up") == 0) {
2919:       (void)sprintf(string,"");
2920:       xmstring = XmStringCreateSimple(string);
2921:       XtVaSetValues(labelCursorLocation, XmNlabelString, xmstring, NULL);
2922:       XtVaSetValues(labelSpliceCursorLocation, XmNlabelString, xmstring, NULL);
2923:       XmStringFree(xmstring);
2924:       report_tie1 = NO;
2925:       report_tie2 = NO;
2926:     }
2927: 
2928:     /* event was an arrow key up. 
2929:        deincrement the array number of core last picked
2930:     */ 
2931:     if((int)strcmp(args[0], "arrow_up") == 0 && last_tie != NONE && are_compositing == YES &&
2932:             scale_val != data[dset]->numholes - 1){
2933: 
2934:       if(last_tie == TIE1){
2935:         if(tie1arraynum - 1 >= 0){
2936:           --tie1arraynum;
2937:           report_tie1 = YES;
2938:           report_tie2 = NO;
2939:         }
2940:         else {
2941:           return;
2942:         }
2943:       }
2944:       else if(last_tie ==  TIE2){
2945:         if(tie2arraynum - 1 >= 0){
2946:           --tie2arraynum;
2947:           report_tie2 = YES;
2948:           report_tie1 = NO;
2949:         }
2950:         else {
2951:           return;
2952:         }
2953:       }
2954:     }
2955: 
2956:     /* event was an arrow key down. 
2957:        increment the array number of core last picked 
2958:     */
2959:     else if((int)strcmp(args[0], "arrow_down") == 0 && last_tie != NONE && are_compositing == YES &&
2960:             scale_val != data[dset]->numholes - 1){
2961: 
2962:       if(last_tie == TIE1){
2963:         if(tie1arraynum + 1 < data[dset]->holes[tie1holenum]->core[tie1corenum]->numvalues){
2964:           ++tie1arraynum;
2965:           report_tie1 = YES;
2966:           report_tie2 = NO;
2967:         }
2968:         else {
2969:           return; 
2970:         } 
2971:       }  
2972:       else if(last_tie == TIE2){
2973:         if(tie2arraynum + 1 < data[dset]->holes[tie2holenum]->core[tie2corenum]->numvalues){
2974:           ++tie2arraynum; 
2975:           report_tie2 = YES;
2976:           report_tie1 = NO;
2977:         } 
2978:         else {   
2979:           return;  
2980:         } 
2981:       }
2982:     }
2983: 
2984:     /* event was a return key press. Depth shift.
2985:     */
2986:     if((int)strcmp(args[0], "return_down") == 0) {
2987:       if(are_compositing == YES && have_tie1 == DO && have_tie2 == DO && have_corr == DO) {
2988:         TieShift((Widget)NULL, (XtPointer)NULL, (XtPointer)NULL);
2989:       }
2990:     }
2991: 
2992:     if(report_tie1 == YES) { 
2993:       var_val = data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->data;
2994:       depth = data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->sb_depth +
2995:               data[dset]->holes[tie1holenum]->core[tie1corenum]->cum_dep_offset;
2996:       (void)sprintf(idstring,"%d %c %d %c %s  %.1f    %.2f",
2997:                        data[dset]->site,
2998:                        data[dset]->holes[tie1holenum]->name,
2999:                        data[dset]->holes[tie1holenum]->core[tie1corenum]->num,
3000:                        data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->type,
3001:                        data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->section,
3002:                        data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->top_int,
3003:                        data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->sb_depth);
3004:       xmstring = XmStringCreateSimple(idstring);
3005:       XtVaSetValues(labelTie1ID, XmNlabelString, xmstring, NULL);
3006:       XmStringFree(xmstring);
3007:       (void)sprintf(string, "%.2f", *var_val);
3008:       xmstring = XmStringCreateSimple(string);
3009:       XtVaSetValues(labelTie1var, XmNlabelString, xmstring, NULL);
3010:       XmStringFree(xmstring);
3011:       (void)sprintf(string, "%.2f", depth);
3012:       xmstring = XmStringCreateSimple(string);
3013:       XtVaSetValues(labelTie1sbd, XmNlabelString, xmstring, NULL);
3014:       XmStringFree(xmstring);
3015:     }
3016:       
3017:     if(report_tie2 == YES) { 
3018:       var_val = data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->data; 
3019:       depth = data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->sb_depth + 
3020:               data[dset]->holes[tie2holenum]->core[tie2corenum]->cum_dep_offset; 
3021:       (void)sprintf(idstring,"%d %c %d %c %s  %.1f    %.2f",
3022:                        data[dset]->site,
3023:                        data[dset]->holes[tie2holenum]->name,
3024:                        data[dset]->holes[tie2holenum]->core[tie2corenum]->num,
3025:                        data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->type,
3026:                        data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->section,
3027:                        data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->top_int,
3028:                        data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->sb_depth);
3029:       xmstring = XmStringCreateSimple(idstring);
3030:       XtVaSetValues(labelTie2ID, XmNlabelString, xmstring, NULL); 
3031:       XmStringFree(xmstring);
3032:       (void)sprintf(string, "%.2f", *var_val); 
3033:       xmstring = XmStringCreateSimple(string);
3034:       XtVaSetValues(labelTie2var, XmNlabelString, xmstring, NULL); 
3035:       XmStringFree(xmstring);
3036:       (void)sprintf(string, "%.2f", depth); 
3037:       xmstring = XmStringCreateSimple(string);
3038:       XtVaSetValues(labelTie2sbd, XmNlabelString, xmstring, NULL);
3039:       XmStringFree(xmstring);
3040:     } 
3041: 
3042:     if((have_tie1 == YES && have_tie2 == NO) || (have_tie1 == NO && have_tie2 == YES)) {
3043:       have_corr = DONT;
3044:       have_shift = DONT;
3045:       have_tie = DONT;
3046:       if(are_compositing == YES && (report_tie1 == YES || report_tie2 == YES)) {
3047:         if(XtIsManaged(XtParent(drawingAreaEdit))) {
3048: /*
3049: this code intended for clip option that currently
3050: is not in use. save it for when this option is ready
3051:           save_tie1 = have_tie1;
3052:           save_tie2 = have_tie2;
3053:           have_tie1 = DONT;
3054:           have_tie2 = DONT;
3055:           reason_for_redraw = DRAW_CLEARTIE;
3056:           DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
3057:           have_tie1 = save_tie1;
3058:           have_tie2 = save_tie2;
3059: */
3060:           reason_for_redraw = DRAW_TIES;
3061:           DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
3062:         }
3063:       }
3064:       if(XtIsManaged(XtParent(drawingAreaTieCorrelation))) {
3065:         XClearWindow(XtDisplay(drawingAreaTieCorrelation),
3066:                      XtWindow(drawingAreaTieCorrelation));
3067:       }  
3068:       XtSetSensitive(pushButtonTieCorrelation, False);
3069:       XtSetSensitive(textFieldTieAdjustDepth, False);
3070: 
3071:       /* set the window length and  lead,lag to the defaults
3072:       */
3073:       str = XmTextGetString(textFieldTieWinLen);
3074:       (void)sprintf(string, "%.2f", WINLEN);
3075:       if((int)strcmp(str, string) != 0) {
3076:         XtVaSetValues(textFieldTieWinLen, XmNvalue, string, NULL);
3077:       }  
3078:       XtFree(str);
3079:       str = XmTextGetString(textFieldTieLeadLag);
3080:       (void)sprintf(string, "%.2f", LEADLAG);
3081:       if((int)strcmp(str, string) != 0) {
3082:         XtVaSetValues(textFieldTieLeadLag, XmNvalue, string, NULL);
3083:       }   
3084:       XtFree(str); 
3085:       str = XmTextGetString(textFieldTieDepthStep);
3086:       (void)sprintf(string, "");
3087:       if((int)strcmp(str, string) != 0) {
3088:         XtVaSetValues(textFieldTieDepthStep, XmNvalue, string, NULL);
3089:       }    
3090:       XtFree(str);
3091:     }   
3092: 
3093:     else if(have_tie1 == DO && have_tie2 == DO && are_compositing == YES && (report_tie1 == YES || report_tie2 == YES)) { 
3094: 
3095:       have_tie = DO;
3096:       have_shift = DO;
3097: 
3098:       /* calculate the average depth step for current
3099:          'tied' cores. and set the text fields with
3100:          ave depth step, default window length
3101:          and lead,lag
3102:       */
3103:       err1 = FindAveDepth(tie1holenum, tie1corenum, &avedep1);
3104:       err2 = FindAveDepth(tie2holenum, tie2corenum, &avedep2);
3105:       if(err1 > 1 || err2 > 1) {
3106:         return;
3107:       }
3108:       avedep = (avedep1 + avedep2)/2.0;
3109: 
3110:       /* set the text field with ave depth
3111:       */
3112:       str = XmTextGetString(textFieldTieDepthStep);
3113:       (void)sprintf(string, "%.2f", avedep);
3114:       if((int)strcmp(str, string) != 0) {
3115:         XtVaSetValues(textFieldTieDepthStep, XmNvalue, string, NULL);
3116:       }
3117:       XtFree(str);
3118: 
3119:       /* make clear and correlate buttons sensitive
3120:       */
3121:       XtSetSensitive(pushButtonTieClear, True);
3122:       XtSetSensitive(pushButtonTieCorrelation, True);
3123:       XtSetSensitive(pushButtonTieShiftUndo, False);
3124:       XtSetSensitive(toggleButtonTieUndoLast, False);
3125:       XtSetSensitive(toggleButtonTieUndoAll, False);
3126:  
3127:  
3128:       /* clear the tie, depth step and adjust depth text
3129:          and set the window length and leadlag back to default
3130:       
3131:       (void)sprintf(string, "");
3132:       XtVaSetValues(textFieldTieAdjustDepth, XmNvalue, string, NULL);
3133: */
3134: 
3135:       /* set the toggles back to defaults
3136:       */
3137:       XmToggleButtonSetState(toggleButtonTieShiftBestCorr, True, NULL);
3138:       XmToggleButtonSetState(toggleButtonTieShiftTie, False, NULL);
3139:       XmToggleButtonSetState(toggleButtonTieShiftGiven, False, NULL);
3140:       XmToggleButtonSetState(toggleButtonTieShiftAll, True, NULL);
3141:       XmToggleButtonSetState(toggleButtonTieShiftCore, False, NULL);
3142:         
3143:       TieCorrelate((Widget)NULL, (XtPointer)NULL, (XtPointer)NULL);
3144:     }
3145:   }
3146: 
3147:   else {
3148:   }
3149: 
3150:   (void)sprintf(string, "");
3151:   (void)sprintf(idstring, "");
3152:   (void)sprintf(varstring, "");
3153:   (void)sprintf(coreselectstring, "");
3154: }
3155: 
3156: /* ARGSUSED */ 
3157: void
3158: EventProcDrawingAreaView(w, event, args, num_args)
3159: Widget w;
3160: XButtonEvent *event;
3161: String *args;
3162: int *num_args;
3163: {
3164:   int x, y, i, j, k, n, corenum, arraynum, sm, err1, err2,
3165:       hole, core, num, report_tie1, report_tie2, err, found_strat, spl_last_core_exist;
3166:   char string[200], varstring[20], tie1idstring[200], tie2idstring[200];
3167:   float cursor_depth, depth, chlow, chhigh, diff, var, raw_val, sm_val, *pval1, 
3168:         avedep, avedep1, avedep2;
3169:   double checkdep;
3170:   String str;
3171:   XmString xmstring;
3172:   Dimension win_height, win_width;
3173:   int FindValueInCoreToSplice();
3174:   void SpliceCorrelate(), SpliceClearTie(), SpliceToTie(), AppendSplice();
3175: 
3176:   x = event->x;
3177:   y = event->y;
3178:   XtVaGetValues(w, XmNheight, &win_height, XmNwidth, &win_width, NULL);
3179:   (void)sprintf(string, "");
3180: 
3181:   if(have_splice == DONT) {
3182:     last_sp_tie = NONE;
3183:     have_sp_tie1 = DONT;
3184:     have_sp_tie2 = DONT;
3185:   }
3186:   else if(y < 0 || y > (int)win_height || x < OFF || x > (int)win_width){
3187:     (void)sprintf(string, "");    
3188:     xmstring = XmStringCreateSimple(string);
3189:     XtVaSetValues(labelCursorLocation, XmNlabelString, xmstring, NULL);
3190:     XtVaSetValues(labelSpliceCursorLocation, XmNlabelString, xmstring, NULL);
3191:     XmStringFree(xmstring);
3192:   }
3193:   else if(have_splice == DO) {
3194: 
3195:     /* calculate the cursor location in depth(m)
3196:        note that top_off_view is the pixel offset from top of drawingAreaEdit
3197:           and top_meter_view is the value of the top of the depth axis
3198:     */
3199:     cursor_depth = (((y - top_off_view) * depperpixsp) + top_meter_view);
3200: 
3201:     if(have_sp_tie1 == DONT && have_sp_tie2 == DONT) {
3202:       last_sp_tie = NONE;
3203:     }
3204:     else if(have_sp_tie1 == DONT && last_sp_tie == TIE1) {
3205:       if(have_sp_tie2 == DO){
3206:         last_sp_tie = TIE2;
3207:       }
3208:       else {
3209:         last_sp_tie = NONE;
3210:       }
3211:     }
3212:     else if(have_sp_tie2 == DONT && last_sp_tie == TIE2) {
3213:       if(have_sp_tie1 == DO){
3214:         last_sp_tie = TIE1;
3215:       }
3216:       else {
3217:         last_sp_tie = NONE;
3218:       }
3219:     }
3220: 
3221:     report_tie1 = NO;
3222:     report_tie2 = NO; 
3223: 
3224:     /* smoothed? 
3225:     */
3226:     if(smooth.method == NONE || smooth.plot == UNSMOOTHED){
3227:       sm = NO;
3228:     }
3229:     else if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
3230:             (smooth.plot == SMOOTHED || smooth.plot == SMOOTHEDBOTH)){
3231:       sm = YES;
3232:     }
3233:     else {
3234:       sm = NO;
3235:     }
3236: 
3237:     /* event is any button down or move 
3238:     */
3239:     if((int)strcmp(args[0], "but_1_down") == 0 || (int)strcmp(args[0], "but_1_move") == 0 ||
3240:        (int)strcmp(args[0], "but_2_down") == 0 || (int)strcmp(args[0], "but_2_move") == 0 ||
3241:        (int)strcmp(args[0], "but_3_down") == 0 || (int)strcmp(args[0], "but_3_move") == 0) {
3242: 
3243: 
3244:       /* are in the area of window where splice is drawn
3245:       */
3246:       if(x >= OFF + SPACE && x < OFF + SPACE + varaxislen){
3247: 
3248:         /* find the nearest sample to cursor pixel location
3249:         */ 
3250:         if(((int)strcmp(args[0], "but_1_down") == 0 || (int)strcmp(args[0], "but_2_down") == 0 ||
3251:             (int)strcmp(args[0], "but_3_down") == 0 || (int)strcmp(args[0], "but_1_move") == 0 || (int)strcmp(args[0], "but_3_move") == 0)  ||
3252:            ((int)strcmp(args[0], "but_2_move") == 0 && are_splicing == NO) || 
3253:            ((int)strcmp(args[0], "but_2_move") == 0 && are_splicing > NO && have_core_to_splice == DONT) ||
3254:            ((int)strcmp(args[0], "but_2_move") == 0 && (are_splicing == CONSTRAINED && splice_overlap == NO)) ) {
3255: 
3256:           corenum = -1;
3257: 
3258:           /* find which core. note that all samples should
3259:              be good because spcomp.var is composed with CleanUpSpliceCore
3260:           */
3261:           for(j=0; j < spcomp.numcores; ++j){
3262:             chlow = spcomp.sb_depth[j][0];
3263:             chhigh = spcomp.sb_depth[j][spcomp.numpercore[j] - 1];
3264:             if(cursor_depth >= chlow && cursor_depth <= chhigh){
3265:               if(smooth.plot == SMOOTHED && 
3266:                  data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->smooth_status != SMOK) {
3267:                 return;
3268:               }
3269:               else if(data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->smooth_status != SMOK) {
3270:                 sm = NO;
3271:               }
3272:               corenum = j;
3273:               break;
3274:             }
3275:           }  
3276:         }
3277:         else if((int)strcmp(args[0], "but_2_move") == 0 && last_sp_tie == TIE1) {
3278:           corenum = spcompcorenum;
3279:         }
3280:         else {
3281:           return;
3282:         }
3283:  
3284:         /* find nearest sample. 
3285:         */ 
3286:         arraynum = -1;
3287:         if(corenum != -1) {
3288:           diff = 99999.0;
3289:           for(k=0; k<spcomp.numpercore[corenum]; ++k){
3290:             checkdep = cursor_depth - spcomp.sb_depth[corenum][k];
3291:             if(fabs(checkdep) < diff){
3292:               diff = fabs(checkdep);
3293:               arraynum = k;
3294:             }
3295:           }
3296:         }  
3297: 
3298:         if(corenum == -1 || arraynum == -1) { 
3299:           (void)sprintf(string, "");
3300:           if((int)strcmp(args[0], "but_2_down") == 0 || (int)strcmp(args[0], "but_2_move") == 0) {
3301:             have_sp_tie1 = DONT;
3302:             if(are_splicing == CONSTRAINED) {
3303:               have_sp_tie2 = DONT;
3304:             }
3305:           }
3306:         }
3307:         else if(corenum != -1 && arraynum != -1) {
3308:           hole = spcomp.hole[corenum];
3309:           core = spcomp.core[corenum];
3310:           num =  spcomp.MapToOrig[corenum][arraynum];
3311:           depth = spcomp.sb_depth[corenum][arraynum];
3312:           var = spcomp.var[corenum][arraynum];
3313:           (void)sprintf(string,"%d %c  %d %c %s %.1f   %.2f(mbsf)   %.2f(mcd)   %.2f",
3314:                           data[dset]->site,
3315:                           data[dset]->holes[hole]->name,
3316:                           data[dset]->holes[hole]->core[core]->num,
3317:                           data[dset]->holes[hole]->core[core]->value[num]->type,
3318:                           data[dset]->holes[hole]->core[core]->value[num]->section,
3319:                           data[dset]->holes[hole]->core[core]->value[num]->top_int,
3320:                           data[dset]->holes[hole]->core[core]->value[num]->sb_depth,
3321:                           depth,
3322:                           var);
3323:           if(sm == YES && data[dset]->holes[hole]->core[core]->value[num]->smooth_ok == SMOK) {
3324:             (void)sprintf(varstring, " %.2f", data[dset]->holes[hole]->core[core]->value[num]->sm_data);
3325:             strncat(string, varstring, (int)strlen(varstring));
3326:           }
3327:           if(((int)strcmp(args[0], "but_2_down") == 0 || (int)strcmp(args[0], "but_2_move") == 0) && have_core_to_splice == DO) {
3328:             if(are_splicing == CONSTRAINED && splice_overlap == NO) {
3329:               have_sp_tie1 = DONT;
3330:               have_sp_tie2 = DONT;
3331:             }
3332:             else {
3333: 
3334: 
3335:               /* for current data set does the last core of splice exist
3336:               */
3337:               if(spcomp.numcores > 0) {
3338:                 
3339:                 hole = spcomp.hole[spcomp.numcores-1];
3340:                 core = spcomp.core[spcomp.numcores-1];
3341:                 if(data[dset]->holes[hole]->name == splicertable.data[splicertable.data_cnt -1].hole &&
3342:                   data[dset]->holes[hole]->core[core]->num == splicertable.data[splicertable.data_cnt -1].core) {
3343:                   spl_last_core_exist = YES;
3344:                 }
3345:                 else {
3346:                   spl_last_core_exist = NO;
3347:                 }
3348:               }
3349:               else {
3350:                 spl_last_core_exist = NO;
3351:               }
3352: 
3353: 
3354:               if(are_splicing == CONSTRAINED && spl_last_core_exist == YES) {
3355:                 depth = spcomp.sb_depth[corenum][arraynum];
3356:                 n = data[dset]->holes[spliceholenum]->core[splicecorenum]->numvalues;
3357: 
3358: 
3359:                 for(k=0; data[dset]->holes[spliceholenum]->core[splicecorenum]->value[k]->quality != GOOD; ++k){
3360:                   if(k >= n){
3361:                     return;
3362:                   }
3363:                 }  
3364:                 chlow=data[dset]->holes[spliceholenum]->core[splicecorenum]->value[k]->sb_depth +
3365:                                      data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset;
3366:                 for(k=n-1; data[dset]->holes[spliceholenum]->core[splicecorenum]->value[k]->quality != GOOD; --k){
3367:                   if(k <= 0){
3368:                     return;
3369:                   }
3370:                 }
3371:                 chhigh= data[dset]->holes[spliceholenum]->core[splicecorenum]->value[k]->sb_depth +
3372:                                      data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset;
3373: 
3374:                 if(depth < chlow || depth > chhigh){
3375:                 }
3376:                 else {
3377:  
3378:                   /* note that if find real value at 'depth' then splicearraynum comes back
3379:                      with indicy of real point. but if interpolated a point then splicearraynum
3380:                      is the indicy of next real point.
3381:                   */
3382:                   err = FindValueInCoreToSplice(dset, sm, depth, spliceholenum, splicecorenum,
3383:                                         &splicearraynum, &splice_how, &raw_val, &sm_val);
3384:                   if(err != 0) {
3385:                     SpliceClearTie(NULL, NULL, NULL);
3386:                     if(XtIsManaged(XtParent(drawingAreaView))) {
3387:                       reason_for_redraw = DRAW_CLEARTIE;
3388:                       DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
3389:                     }
3390:                     report_tie1 = NO;
3391:                     report_tie2 = NO;
3392:                     (void)sprintf(buffer,"could not find or interpolate a sample in core to splice.");
3393:                     SpManageWarningBox(buffer);
3394:                     return;
3395:                   }
3396:                   else if(err == 0) {
3397:                     have_sp_tie1 = DO;
3398:                     spcompcorenum = corenum;
3399:                     spcomparraynum = arraynum;
3400:                     last_sp_tie = TIE1;
3401:                     report_tie1 = YES;
3402:                     have_sp_tie2 = YES;
3403:                     report_tie2 = YES;
3404:                     interpsplice_val = raw_val;
3405:                     interpsplice_sm_val = sm_val;
3406:                     interpsplice_spl_depth = depth;
3407:                   }
3408:                 }
3409:               }
3410:               else if(are_splicing == UNCONSTRAINED && spl_last_core_exist == YES){
3411:                 have_sp_tie1 = DO;
3412:                 spcompcorenum = corenum;
3413:                 spcomparraynum = arraynum;
3414:                 last_sp_tie = TIE1;
3415:                 report_tie1 = YES;
3416:                 splice_how = REAL;
3417:               }
3418:             }
3419:           }
3420:         }
3421:       }
3422: 
3423:       /* have a core to splice and are in  area where it is drawn
3424:       */
3425:       else if((x > OFF + SPACE + varaxislen && x < OFF + SPACE + 2 * varaxislen) && have_core_to_splice == DO) {
3426: 
3427:         num = data[dset]->holes[spliceholenum]->core[splicecorenum]->numvalues;
3428: 
3429:         if(((int)strcmp(args[0], "but_1_down") == 0 || (int)strcmp(args[0], "but_2_down") == 0 ||
3430:             (int)strcmp(args[0], "but_3_down") == 0 || (int)strcmp(args[0], "but_1_move") == 0 || (int)strcmp(args[0], "but_2_move") == 0) || 
3431:            ((int)strcmp(args[0], "but_3_move") == 0 && are_splicing == NO) ||
3432:            ((int)strcmp(args[0], "but_3_move") == 0 && are_splicing == CONSTRAINED)) {
3433: 
3434:           corenum = -1;
3435:           for(k=0; data[dset]->holes[spliceholenum]->core[splicecorenum]->value[k]->quality != GOOD; ++k){
3436:             if(k >= num){
3437:               return;
3438:             }
3439:           }
3440:           for(j=num - 1; data[dset]->holes[spliceholenum]->core[splicecorenum]->value[j]->quality != GOOD; --j){ 
3441:             if(j <= 0){ 
3442:               return; 
3443:             } 
3444:           }
3445:           if((cursor_depth >= data[dset]->holes[spliceholenum]->core[splicecorenum]->value[k]->sb_depth +
3446:                      data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset) &&
3447:              (cursor_depth <= data[dset]->holes[spliceholenum]->core[splicecorenum]->value[j]->sb_depth +
3448:                      data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset)) {
3449: 
3450:             corenum = 1;
3451:           }
3452:           else {
3453:           }
3454:         }
3455:         else if(are_splicing == UNCONSTRAINED && (int)strcmp(args[0], "but_3_move") == 0 && last_sp_tie == TIE2) {
3456:           corenum = 1;
3457:         }
3458:         else {
3459:           return;
3460:         }
3461: 
3462:         if(smooth.plot == SMOOTHED && data[dset]->holes[spliceholenum]->core[splicecorenum]->smooth_status < SMOK) {
3463:           sm = NO;
3464:         }
3465: 
3466:         /* find nearest sample
3467:         */ 
3468:         arraynum = -1;
3469:         if(corenum != -1) {
3470:           diff = 99999.0; 
3471:           for(k=0; k<num; ++k){
3472:             if(data[dset]->holes[spliceholenum]->core[splicecorenum]->value[k]->quality != GOOD){
3473:             }
3474:             else {
3475:               checkdep = cursor_depth - (data[dset]->holes[spliceholenum]->core[splicecorenum]->value[k]->sb_depth +
3476:                               data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset);
3477:               if(fabs(checkdep) < diff){
3478:                 diff = fabs(checkdep);
3479:                 arraynum = k;
3480:               }
3481:             }
3482:           }
3483:         }
3484: 
3485:         if(corenum == -1 || arraynum == -1) {
3486:           (void)sprintf(string, "");
3487:           xmstring = XmStringCreateSimple(string);
3488:           XtVaSetValues(labelCursorLocation, XmNlabelString, xmstring, NULL);
3489:           XtVaSetValues(labelSpliceCursorLocation, XmNlabelString, xmstring, NULL);
3490:           XmStringFree(xmstring);
3491:           if(((int)strcmp(args[0], "but_3_down") == 0 || (int)strcmp(args[0], "but_3_move") == 0) && are_splicing == UNCONSTRAINED) {
3492:             have_sp_tie2 = DONT;
3493:           }
3494:         }
3495:         else {
3496:           hole = spliceholenum;
3497:           core = splicecorenum;
3498:           num =  arraynum;
3499:           depth = (data[dset]->holes[hole]->core[core]->value[num]->sb_depth +
3500:                             data[dset]->holes[hole]->core[core]->cum_dep_offset);
3501:           pval1 = data[dset]->holes[hole]->core[core]->value[num]->data;
3502:           var = *pval1;
3503:           (void)sprintf(string,"%d %c  %d %c %s %.1f   %.2f(mbsf)   %.2f(mcd)   %.2f",
3504:                           data[dset]->site,
3505:                           data[dset]->holes[hole]->name,
3506:                           data[dset]->holes[hole]->core[core]->num,
3507:                           data[dset]->holes[hole]->core[core]->value[num]->type,
3508:                           data[dset]->holes[hole]->core[core]->value[num]->section,
3509:                           data[dset]->holes[hole]->core[core]->value[num]->top_int,
3510:                           data[dset]->holes[hole]->core[core]->value[num]->sb_depth,
3511:                           depth,
3512:                           var);
3513:           if(sm == YES) {
3514:             (void)sprintf(varstring, " %.2f", data[dset]->holes[hole]->core[core]->value[num]->sm_data); 
3515:             strncat(string, varstring, (int)strlen(varstring)); 
3516:           }
3517:           if(((int)strcmp(args[0], "but_3_down") == 0 || (int)strcmp(args[0], "but_3_move") == 0) && are_splicing == UNCONSTRAINED) {
3518:             have_sp_tie2 = DO;
3519:             splicearraynum = arraynum;
3520:             last_sp_tie = TIE2;
3521:             report_tie2 = YES;
3522:             splice_how = REAL;
3523:           }
3524:         }
3525: 
3526:       }
3527: 
3528:       /* have stratigraphy and are in the area where it is plotted
3529:       */
3530:       else if(x > OFF + SPACE + 2 * varaxislen && x < (int)win_width &&
3531:               y > 0 && y < (int)win_height && have_strat == DO) {
3532:         found_strat = NO;
3533:         for(i=0; i<strat_file_cnt; ++i){
3534:           if(found_strat == YES) {
3535:             break;
3536:           }
3537:           for(j=0; j<strat[i]->data_cnt; ++j) {
3538:             if(strat[i]->data[j].x_pix_loc_view < 0 || strat[i]->data[j].y_pix_loc_view < 0) {
3539:             }
3540:             else if(abs(strat[i]->data[j].x_pix_loc_view + 5 - x) < CLOSE &&
3541:                abs(strat[i]->data[j].y_pix_loc_view - 5 - y) < CLOSE) {
3542:               found_strat = YES;
3543:               if(fabs(strat[i]->data[j].top_age - strat[i]->data[j].bot_age) < ROUNDCHECK) {
3544:                 (void)sprintf(string,"hole %c  %s  %6.3f Ma  %6.2f to %6.2f mcd",
3545:                  strat[i]->data[j].top.hole, strat[i]->data[j].name, strat[i]->data[j].top_age,
3546:                  strat[i]->data[j].top.sb_depth + strat[i]->data[j].top.offset,
3547:                  strat[i]->data[j].bot.sb_depth + strat[i]->data[j].bot.offset);
3548:               }  
3549:               else {
3550:                 (void)sprintf(string,"hole %c  %s  %6.3f to %6.3f Ma  %6.2f to %6.2f mcd",
3551:                  strat[i]->data[j].top.hole, strat[i]->data[j].name, strat[i]->data[j].top_age, strat[i]->data[j].bot_age,
3552:                  strat[i]->data[j].top.sb_depth + strat[i]->data[j].top.offset,
3553:                  strat[i]->data[j].bot.sb_depth + strat[i]->data[j].bot.offset);
3554:               }  
3555:               break;
3556:             }
3557:           }  
3558:         }
3559:       }  
3560:  
3561:       else if(have_core_to_splice == DONT) {
3562:         last_sp_tie = NONE;
3563:         have_sp_tie1 = DONT;
3564:         have_sp_tie2 = DONT;
3565:         (void)sprintf(string, "");
3566:       }
3567: 
3568:       else {
3569:         (void)sprintf(string, "");
3570:       }
3571:     }
3572: 
3573:     /* the event is an up or down arrow
3574:     */
3575:     else if((int)strcmp(args[0], "arrow_up") == 0 || (int)strcmp(args[0], "arrow_down") == 0) {
3576: 
3577:       if(last_sp_tie == TIE1 && (int)strcmp(args[0], "arrow_up") == 0) {
3578:         if(spcomparraynum - 1 >= 0){
3579:           n = data[dset]->holes[spliceholenum]->core[splicecorenum]->numvalues; 
3580:           depth = spcomp.sb_depth[spcompcorenum][spcomparraynum-1]; 
3581:           if(are_splicing == CONSTRAINED && 
3582:              (depth < data[dset]->holes[spliceholenum]->core[splicecorenum]->value[0]->sb_depth + 
3583:                       data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset || 
3584:               depth > data[dset]->holes[spliceholenum]->core[splicecorenum]->value[n-1]->sb_depth + 
3585:                       data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset)) { 
3586:             return; 
3587:           } 
3588:           else { 
3589:             --spcomparraynum;
3590:             report_tie1 = YES;
3591:           }
3592:         }
3593:         else {
3594:           return;
3595:         }
3596:       }
3597:       else if(last_sp_tie == TIE2 && (int)strcmp(args[0], "arrow_up") == 0 && are_splicing == UNCONSTRAINED) {
3598:         if(splicearraynum - 1 >= 0){ 
3599:           --splicearraynum; 
3600:            report_tie2 = YES;
3601:         }
3602:         else { 
3603:           return;
3604:         }
3605:       }
3606:       else if(last_sp_tie == TIE1 && (int)strcmp(args[0], "arrow_down") == 0) {
3607:         if(spcomparraynum + 1 < spcomp.numpercore[spcompcorenum]){
3608:           n = data[dset]->holes[spliceholenum]->core[splicecorenum]->numvalues;
3609:           depth = spcomp.sb_depth[spcompcorenum][spcomparraynum+1];
3610:           if(are_splicing == CONSTRAINED &&
3611:              (depth < data[dset]->holes[spliceholenum]->core[splicecorenum]->value[0]->sb_depth +
3612:                       data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset ||
3613:               depth > data[dset]->holes[spliceholenum]->core[splicecorenum]->value[n-1]->sb_depth +
3614:                       data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset)) {
3615:             return;
3616:           }
3617:           else {
3618:             ++spcomparraynum; 
3619:             report_tie1 = YES; 
3620:           }
3621:         } 
3622:         else {   
3623:           return; 
3624:         }
3625:       }
3626:       else if(last_sp_tie == TIE2 && (int)strcmp(args[0], "arrow_down") == 0 && are_splicing == UNCONSTRAINED) {
3627:         if(splicearraynum + 1 < data[dset]->holes[spliceholenum]->core[splicecorenum]->numvalues){
3628:           ++splicearraynum;
3629:            report_tie2 = YES;
3630:         }
3631:         else {
3632:           return;
3633:         }
3634:       }
3635: 
3636:       if(are_splicing == CONSTRAINED) {
3637:         n = data[dset]->holes[spliceholenum]->core[splicecorenum]->numvalues;
3638:         depth = spcomp.sb_depth[spcompcorenum][spcomparraynum];
3639:         if(depth < data[dset]->holes[spliceholenum]->core[splicecorenum]->value[0]->sb_depth +
3640:                    data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset ||
3641:            depth > data[dset]->holes[spliceholenum]->core[splicecorenum]->value[n-1]->sb_depth +
3642:                    data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset) {
3643:           return;
3644:         }
3645:         else {
3646: 
3647:           /* note that if find real value at 'depth' then splicearraynum comes back
3648:              with indicy of real point. but if interpolated a point then splicearraynum
3649:              is the indicy of next real point.
3650:           */
3651:           err = FindValueInCoreToSplice(dset, sm, depth, spliceholenum, splicecorenum,
3652:                                         &splicearraynum, &splice_how, &raw_val, &sm_val);
3653:         }
3654:         if(err != 0) {
3655:           have_sp_tie1 = DONT;
3656:           have_sp_tie2 = DONT;
3657:           have_splice_tie  = DONT;
3658:           last_sp_tie  = NONE;
3659:           report_tie1 = NO;
3660:           report_tie2 = NO;
3661:           (void)sprintf(buffer,"could not find or interpolate a sample in core to splice.");
3662:           SpManageWarningBox(buffer);
3663:           return;
3664:         }
3665:         else if(err == 0) {
3666:           have_sp_tie2 = YES;
3667:           report_tie2 = YES;
3668:           interpsplice_val = raw_val;
3669:           interpsplice_sm_val = sm_val;
3670:           interpsplice_spl_depth = depth;
3671:         }
3672:       }
3673:       else if(are_splicing == UNCONSTRAINED) {
3674:         splice_how = REAL;
3675:       }
3676: 
3677:       (void)sprintf(string, "");
3678:     }
3679: 
3680:     else if((int)strcmp(args[0], "return_down") == 0 && are_splicing > NO && have_core_to_splice == DO) {
3681:       if(splice_overlap == YES && have_sp_tie1 == DO && have_sp_tie2 == DO && have_spcorr == DO) {
3682:         SpliceToTie((Widget)NULL, (XtPointer)NULL, (XtPointer)NULL);
3683:       }
3684:       else if(splice_overlap == NO) {
3685:         AppendSplice((Widget)NULL, (XtPointer)NULL, (XtPointer)NULL);
3686:       }
3687:       else if(splice_overlap == OVERLAPAPPEND) {
3688:       }
3689:     } 
3690: 
3691:     if((int)strcmp(args[0], "but_1_up") == 0 || (int)strcmp(args[0], "but_2_up") == 0 || (int)strcmp(args[0], "but_3_up") == 0) {
3692:       (void)sprintf(string,"");
3693:     }
3694:     xmstring = XmStringCreateSimple(string);
3695:     XtVaSetValues(labelCursorLocation, XmNlabelString, xmstring, NULL);
3696:     XtVaSetValues(labelSpliceCursorLocation, XmNlabelString, xmstring, NULL);
3697:     XmStringFree(xmstring);
3698: 
3699: 
3700:     if((int)strcmp(args[0], "but_2_down") == 0 || (int)strcmp(args[0], "but_2_move") == 0 || 
3701:        (int)strcmp(args[0], "but_3_down") == 0 || (int)strcmp(args[0], "but_3_move") == 0 ||
3702:        (int)strcmp(args[0], "arrow_up") == 0 || (int)strcmp(args[0], "arrow_down") == 0 &&
3703:        (report_tie1 == YES || report_tie2 == YES) ) {
3704:       if(report_tie1 == YES) {
3705:         hole = spcomp.hole[spcompcorenum];
3706:         core = spcomp.core[spcompcorenum];
3707:         num =  spcomp.MapToOrig[spcompcorenum][spcomparraynum];
3708:         depth = spcomp.sb_depth[spcompcorenum][spcomparraynum];
3709:         var = spcomp.var[spcompcorenum][spcomparraynum];
3710:         (void)sprintf(tie1idstring,"%d %c %d %c %s  %.1f    %.2f",
3711:                        data[dset]->site,
3712:                        data[dset]->holes[hole]->name,
3713:                        data[dset]->holes[hole]->core[core]->num,
3714:                        data[dset]->holes[hole]->core[core]->value[num]->type,
3715:                        data[dset]->holes[hole]->core[core]->value[num]->section,
3716:                        data[dset]->holes[hole]->core[core]->value[num]->top_int,
3717:                        data[dset]->holes[hole]->core[core]->value[num]->sb_depth);
3718:         xmstring = XmStringCreateSimple(tie1idstring);
3719:         XtVaSetValues(labelSpliceTie1ID, XmNlabelString, xmstring, NULL);
3720:         XmStringFree(xmstring);
3721:         (void)sprintf(string, "%.2f", var);
3722:         xmstring = XmStringCreateSimple(string);
3723:         XtVaSetValues(labelSpliceTie1var, XmNlabelString, xmstring, NULL);
3724:         XmStringFree(xmstring);
3725:         (void)sprintf(string, "%.2f", depth);
3726:         xmstring = XmStringCreateSimple(string);
3727:         XtVaSetValues(labelSpliceTie1sbd, XmNlabelString, xmstring, NULL);
3728:         XmStringFree(xmstring);
3729:       }
3730:       if(report_tie2 == YES) {
3731:         hole = spliceholenum;
3732:         core = splicecorenum;
3733:         num =  splicearraynum;
3734:         if(are_splicing == CONSTRAINED && splice_how == INTERPOLATED){
3735:           (void)sprintf(tie2idstring,"%d %c %d %c    interpolated",
3736:                        data[dset]->site,
3737:                        data[dset]->holes[hole]->name,
3738:                        data[dset]->holes[hole]->core[core]->num,
3739:                        data[dset]->holes[hole]->core[core]->value[num]->type);
3740:           depth = interpsplice_spl_depth;
3741:           var = interpsplice_val;
3742:         }
3743:         else if(are_splicing == UNCONSTRAINED || splice_how == REAL) {
3744:           depth = (data[dset]->holes[hole]->core[core]->value[num]->sb_depth +
3745:                             data[dset]->holes[hole]->core[core]->cum_dep_offset);
3746:           pval1 = data[dset]->holes[hole]->core[core]->value[num]->data;
3747:           var = *pval1;
3748:           (void)sprintf(tie2idstring,"%d %c %d %c %s  %.1f    %.2f",
3749:                        data[dset]->site,
3750:                        data[dset]->holes[hole]->name,
3751:                        data[dset]->holes[hole]->core[core]->num,
3752:                        data[dset]->holes[hole]->core[core]->value[num]->type,
3753:                        data[dset]->holes[hole]->core[core]->value[num]->section,
3754:                        data[dset]->holes[hole]->core[core]->value[num]->top_int,
3755:                        data[dset]->holes[hole]->core[core]->value[num]->sb_depth);
3756:         }
3757:         xmstring = XmStringCreateSimple(tie2idstring);
3758:         XtVaSetValues(labelSpliceTie2ID, XmNlabelString, xmstring, NULL);
3759:         XmStringFree(xmstring);
3760:         (void)sprintf(string, "%.2f", var);
3761:         xmstring = XmStringCreateSimple(string);
3762:         XtVaSetValues(labelSpliceTie2var, XmNlabelString, xmstring, NULL);
3763:         XmStringFree(xmstring);
3764:         (void)sprintf(string, "%.2f", depth);
3765:         xmstring = XmStringCreateSimple(string);
3766:         XtVaSetValues(labelSpliceTie2sbd, XmNlabelString, xmstring, NULL);
3767:         XmStringFree(xmstring);
3768:       }
3769:       if(XtIsManaged(XtParent(drawingAreaView))) {
3770:         reason_for_redraw = DRAW_TIES;
3771:         DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
3772:       }
3773:     }
3774: 
3775:     if(have_sp_tie1 == DO && have_sp_tie2 == DO && (report_tie1 == YES || report_tie2 == YES)) {
3776: 
3777:       have_splice_tie = DO;
3778:  
3779:       /* calculate the average depth step for current
3780:          'tied' cores. and set the text fields with
3781:           ave depth step, default window length
3782:           and lead,lag
3783:       */
3784:       err1 = FindAveDepth(spcomp.hole[spcompcorenum], spcomp.core[spcompcorenum], &avedep1);
3785:       err2 = FindAveDepth(spliceholenum, splicecorenum, &avedep2);
3786:       if(err1 > 1 || err2 > 1) {
3787:         return;
3788:       }
3789:       avedep = (avedep1 + avedep2)/2.0;
3790:       
3791:  
3792:       /* set the text field with ave depth
3793:       */ 
3794:       str = XmTextGetString(textCompDepthStep);
3795:       (void)sprintf(string, "%.2f", avedep);
3796:       if((int)strcmp(str, string) != 0) {
3797:         XtVaSetValues(textCompDepthStep, XmNvalue, string, NULL);
3798:       }  
3799:       XtFree(str);
3800: 
3801:       /* calculate the difference in value at the tie (tie1 - tie2) and write it to text
3802:       */
3803:       if(are_splicing == CONSTRAINED) {
3804:         diff = spcomp.var[spcompcorenum][spcomparraynum] - interpsplice_val;
3805:         (void)sprintf(string, "%.2f", diff);
3806:       }
3807:       else if(are_splicing == UNCONSTRAINED) {
3808:         hole = spcomp.hole[spcompcorenum];
3809:         core = spcomp.core[spcompcorenum];
3810:         num =  spcomp.MapToOrig[spcompcorenum][spcomparraynum];
3811:         if(sm == NO) {
3812:           pval1 = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->data;
3813:           diff = spcomp.var[spcompcorenum][spcomparraynum] - *pval1;
3814:         }
3815:         else if(sm == YES) {
3816:           diff = data[dset]->holes[hole]->core[core]->value[num]->sm_data - 
3817:                  data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->sm_data; 
3818:         }
3819:         else {
3820:           diff = -99.9;
3821:         }
3822:         (void)sprintf(string, "%.2f", diff);
3823:       }
3824:       else {
3825:         (void)sprintf(string, "");
3826:       }
3827:       xmstring = XmStringCreateSimple(string);
3828:       XtVaSetValues(labelSpliceDifferenceInValue, XmNlabelString, xmstring, NULL);
3829:       XmStringFree(xmstring);
3830: 
3831:       /* make the clear tie and correlate buttons sensitive
3832:          and the grab core insensitive. should not be able
3833:          to grab another core until clear tie or splice
3834:       */
3835:       XtSetSensitive(pushButtonSpliceClearTie, True);
3836:       XtSetSensitive(pushButtonSpliceCorrelate, True);
3837:       XtSetSensitive(pushButtonGetSelectCore, False);
3838:       XtSetSensitive(pushButtonAppendSplice, False);
3839:       XtVaSetValues(pushButtonAppendSplice, XmNborderWidth, 0, NULL);
3840:       XtSetSensitive(pushButtonSuggestTies, False);
3841: 
3842:       SpliceCorrelate((Widget)NULL, (XtPointer)NULL, (XtPointer)NULL);
3843:     }
3844:   }    
3845: 
3846:   (void)sprintf(string, "");
3847:   (void)sprintf(varstring, "");
3848:   (void)sprintf(tie1idstring, "");
3849:   (void)sprintf(tie2idstring, "");
3850: }
3851: 
3852: 
3853: /* ARGSUSED */
3854: void
3855: EventProcDrawingAreaTieCorrelation(w, event, args, num_args)
3856: Widget w;
3857: XButtonEvent *event;
3858: String *args;
3859: int *num_args;
3860: {
3861:   int x, i, kk, diff, xaxispixlen, idum, err;
3862:   char string[200];
3863:   float  fdum;
3864:   double check, fract, ip;
3865:   XmString xmstring;
3866:   Dimension  win_width;
3867:    
3868: 
3869:   x = event->x;
3870: 
3871:   if(have_corr == DONT){
3872:     (void)sprintf(string, "");
3873:   }  
3874:   else if(have_corr == DO){
3875: 
3876:     XtVaGetValues(w, XmNwidth, &win_width, NULL);
3877: 
3878:     /*calc. the length of the y axis and the half length
3879:       of the x axis. adjust the length of x axis if its
3880:       total length is not divisable by ten
3881:     */
3882:     xaxispixlen = ((int)win_width - (2 * SPACE))/2;
3883: 
3884:     /* 
3885:     */
3886:     if((err = XAxisDepthCorrSetup(lead_lag, depstep, &xaxispixlen, &fdum, &idum, &lagperpix, &fdum)) != 0) {
3887:       return;
3888:     }
3889: 
3890:     check = corr.depleadlag[0][dset]/lagperpix + SPACE + xaxispixlen;
3891:     diff= fabs(x-check);
3892:     kk = 0;
3893:     for(i=1; i<corr.num_lead_lag[dset]; ++i){
3894:       check = corr.depleadlag[dset][i]/lagperpix + SPACE + xaxispixlen;
3895:       if(fabs(x-check) < diff){
3896:         diff = fabs(x-check);
3897:         kk=i;
3898:       }
3899:     }
3900:     (void)sprintf(string, "lead/lag relative to tie = %.2fm  coef = %4.2f  n = %3d depth adjust = %4.2fm",                
3901:                   corr.depleadlag[dset][kk], corr.coef[dset][kk], corr.n[kk], corr.depoffset[kk]);
3902:   }
3903:   else {
3904:     (void)sprintf(string, "");
3905:   }
3906: 
3907:   if((int)strcmp(args[0], "but_1_down") == 0 || (int)strcmp(args[0], "but_1_move") == 0) {
3908:     xmstring = XmStringCreateSimple(string);
3909:     XtVaSetValues(labelCursorLocation, XmNlabelString, xmstring, NULL);
3910:     XtVaSetValues(labelSpliceCursorLocation, XmNlabelString, xmstring, NULL);
3911:     XmStringFree(xmstring);
3912:   }
3913:   else if((int)strcmp(args[0], "but_1_up") == 0) {
3914:     (void)sprintf(string, "");
3915:     xmstring = XmStringCreateSimple(string);
3916:     XtVaSetValues(labelCursorLocation, XmNlabelString, xmstring, NULL);
3917:     XtVaSetValues(labelSpliceCursorLocation, XmNlabelString, xmstring, NULL);
3918:     XmStringFree(xmstring);
3919:   }
3920: 
3921:   (void)sprintf(string, "");
3922: }
3923: 
3924: /* ARGSUSED */
3925: void
3926: EventProcDrawingAreaSpliceCorrelation(w, event, args, num_args)
3927: Widget w;
3928: XButtonEvent *event;
3929: String *args;
3930: int *num_args;
3931: {
3932:   int x, i, kk, diff, xaxispixlen, idum, err;
3933:   char string[200];
3934:   float  fdum;
3935:   double check, fract, ip;
3936:   XmString xmstring;
3937:   Dimension  win_width;
3938:   int XAxisDepthCorrSetup();
3939: 
3940:   x = event->x;
3941: 
3942:   if(have_spcorr == DONT){
3943:     (void)sprintf(string, "");
3944:   }
3945:   else if(have_spcorr == DO){
3946: 
3947:     XtVaGetValues(w, XmNwidth, &win_width, NULL);
3948: 
3949:     /*calc. the length of the y axis and the half length
3950:       of the x axis. adjust the length of x axis if its
3951:       total length is not divisable by ten
3952:     */
3953:     xaxispixlen = ((int)win_width - (2 * SPACE))/2;
3954: 
3955:     /* 
3956:     */
3957:     if((err = XAxisDepthCorrSetup(lead_lag, depstep, &xaxispixlen, &fdum, &idum, &lagperpix, &fdum)) != 0) {
3958:       return;
3959:     }
3960:  
3961:     check = corr.depleadlag[dset][0]/lagperpix + SPACE + xaxispixlen;
3962:     diff= fabs(x-check);
3963:     kk = 0;
3964:     for(i=1; i<corr.num_lead_lag[dset]; ++i){
3965:       check = corr.depleadlag[dset][i]/lagperpix + SPACE + xaxispixlen;
3966:       if(fabs(x-check) < diff){
3967:         diff = fabs(x-check);
3968:         kk=i;
3969:       }  
3970:     }
3971:     if(are_splicing == CONSTRAINED) {
3972:       (void)sprintf(string, "lead/leg = %.2fm coef=%4.2f n=%3d lead/lag(m)=%4.2f",
3973:               corr.depleadlag[dset][kk], corr.coef[dset][kk], corr.n[kk], corr.depoffset[kk]);
3974:     }
3975:     else if(are_splicing == UNCONSTRAINED) { 
3976:       (void)sprintf(string, "lead/lag rel. to tie = %.2fm  coef = %4.2f  n = %3d depth adjust = %4.2fm",
3977:               corr.depleadlag[dset][kk], corr.coef[dset][kk], corr.n[kk], corr.depoffset[kk]);
3978:     }
3979:   }
3980:   else {
3981:     (void)sprintf(string, "");
3982:   }
3983: 
3984:   if((int)strcmp(args[0], "but_1_down") == 0 || (int)strcmp(args[0], "but_1_move") == 0) {
3985:     xmstring = XmStringCreateSimple(string);
3986:     XtVaSetValues(labelCursorLocation, XmNlabelString, xmstring, NULL);
3987:     XtVaSetValues(labelSpliceCursorLocation, XmNlabelString, xmstring, NULL);
3988:     XmStringFree(xmstring);
3989:   }
3990:   else if((int)strcmp(args[0], "but_1_up") == 0) {
3991:     (void)sprintf(string, "");
3992:     xmstring = XmStringCreateSimple(string);
3993:     XtVaSetValues(labelCursorLocation, XmNlabelString, xmstring, NULL);
3994:     XtVaSetValues(labelSpliceCursorLocation, XmNlabelString, xmstring, NULL);
3995:     XmStringFree(xmstring);
3996:   }
3997: 
3998:   (void)sprintf(string, "");
3999: }
4000: 
4001: /* ARGSUSED */
4002: void
4003: EventProcDrawingAreaDepthOffset(w, event, args, num_args)
4004: Widget w;
4005: XButtonEvent *event;
4006: String *args;
4007: int *num_args;
4008: {
4009: 
4010:   int i, j, x, y, xpix, ypix;
4011:   char string[200];
4012:   float sect, sect_dep, topdep;
4013:   double check, fract, ip;
4014:   XmString xmstring;
4015: 
4016:   x = event->x;
4017:   y = event->y;
4018: 
4019:   if(have_data == DONT) {
4020:     if((int)strcmp(args[0], "but_1_down") == 0) {
4021:       (void)sprintf(string, "no data");
4022:       xmstring = XmStringCreateSimple(string);
4023:       XtVaSetValues(labelDepthOffsetCursorLocation, XmNlabelString, xmstring, NULL);
4024:       XmStringFree(xmstring);
4025:     }
4026:     else if((int)strcmp(args[0], "but_1_up") == 0) {
4027:       (void)sprintf(string, "");
4028:       xmstring = XmStringCreateSimple(string);
4029:       XtVaSetValues(labelDepthOffsetCursorLocation, XmNlabelString, xmstring, NULL);
4030:       XmStringFree(xmstring);
4031:     }
4032:   }
4033:   else if(have_data == DO) {
4034: 
4035:     /*find the nearest core
4036:     */
4037:     (void)sprintf(string,"");
4038:     for(i=0; i<data[dset]->numholes; ++i){
4039:       for(j=0; j<data[dset]->holes[i]->numcores; ++j){
4040:         if(data[dset]->holes[i]->core[j]->did_offset == YES){
4041:           if(strcmp(data[dset]->holes[i]->core[j]->value[0]->section, "CC") != 0) {
4042:             sect = atof(data[dset]->holes[i]->core[j]->value[0]->section);
4043:           }
4044:           else {
4045:             sect = 1;
4046:           }
4047:           sect_dep = (data[dset]->holes[i]->core[j]->value[0]->bot_int - data[dset]->holes[i]->core[j]->value[0]->top_int)/2.0 +
4048:                      data[dset]->holes[i]->core[j]->value[0]->top_int;
4049:           fract = modf(sect_dep/1.0, &ip);
4050:           if(fract <= 0.41) {
4051:             sect_dep = ip;
4052:           }
4053:           else if(fract >= 0.59) {
4054:             sect_dep = ip + 1.0;
4055:           }
4056:           else {
4057:             sect_dep = ip + 1.0;
4058:           }
4059:           topdep = data[dset]->holes[i]->core[j]->value[0]->sb_depth  - sect_dep/100.0 - ((sect - 1.0) * 1.5);
4060:           ypix = topdep/offsetdepperpix + OFF;
4061:           xpix = data[dset]->holes[i]->core[j]->cum_dep_offset/depthoffsetperpix + OFF;
4062:           if(abs(ypix - y) < CLOSE && abs(xpix - x) < CLOSE){
4063:             (void)sprintf(string,"%d %c  %d %c    %.2f(mbsf)   depth offset  %.2f(m)",
4064:                        data[dset]->site,
4065:                        data[dset]->holes[i]->name,
4066:                        data[dset]->holes[i]->core[j]->num,
4067:                        data[dset]->holes[i]->core[j]->value[0]->type,
4068:                        topdep,
4069:                        data[dset]->holes[i]->core[j]->cum_dep_offset);
4070:             break;
4071:           }
4072:         }
4073:       }
4074:     }
4075:  
4076:     if((int)strcmp(args[0], "but_1_down") == 0) {
4077:       xmstring = XmStringCreateSimple(string);
4078:       XtVaSetValues(labelDepthOffsetCursorLocation, XmNlabelString, xmstring, NULL);
4079:       XmStringFree(xmstring);
4080:     }
4081:     else if((int)strcmp(args[0], "but_1_up") == 0) {
4082:       (void)sprintf(string, "");
4083:       xmstring = XmStringCreateSimple(string);
4084:       XtVaSetValues(labelDepthOffsetCursorLocation, XmNlabelString, xmstring, NULL);
4085:       XmStringFree(xmstring);
4086:     }
4087:     else if((int)strcmp(args[0], "but_1_move") == 0) {
4088:       xmstring = XmStringCreateSimple(string);
4089:       XtVaSetValues(labelDepthOffsetCursorLocation, XmNlabelString, xmstring, NULL);
4090:       XmStringFree(xmstring);
4091:     }
4092:   }
4093: 
4094:   (void)sprintf(string, "");
4095: }
4096: 
4097: /* ARGSUSED */
4098: void
4099: EventProcDrawingAreaAgeDepth(w, event, args, num_args)
4100: Widget w;
4101: XButtonEvent *event;
4102: String *args;
4103: int *num_args;
4104: {
4105: 
4106:   int i, j, k, x, y, pos;
4107:   char string[200];
4108:   float aveage, avedep, age_drag_change, depth_drag_change;
4109:   XmString xmstring;
4110:   void DrawDrawingAreaAgeDepth(), PlotSpliceVsAge();
4111: 
4112:   x = event->x;
4113:   y = event->y;
4114: 
4115:   if(have_strat == DONT) {
4116:     if((int)strcmp(args[0], "but_1_down") == 0) {
4117:       (void)sprintf(string, "no data");
4118:       
4119:     }
4120:     else {
4121:       (void)sprintf(string, "");
4122:     }
4123:     xmstring = XmStringCreateSimple(string); 
4124:     XtVaSetValues(labelAgeDepthCursorLocation, XmNlabelString, xmstring, NULL);
4125:     XmStringFree(xmstring);
4126:     return;
4127:   }  
4128: 
4129:   else if(have_strat == DO) {
4130:     if(are_dragging == YES && (int)strcmp(args[0], "but_3_down") == 0) {
4131:       last_x_agedepth = x;
4132:       last_y_agedepth = y;
4133:     }
4134:     else if(are_dragging == YES && (int)strcmp(args[0], "but_3_move") == 0) {
4135:       age_drag_change = (x - last_x_agedepth) * ageperpix;
4136:       depth_drag_change = (y - last_y_agedepth) * depperpixagemodel;
4137:       top_age_agedepth = top_age_agedepth - age_drag_change;
4138:       top_meter_agedepth = top_meter_agedepth - depth_drag_change;
4139:       last_x_agedepth = x;
4140:       last_y_agedepth = y;
4141:       if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
4142:         DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
4143:       }
4144:       return;
4145:     }
4146:     if((int)strcmp(args[0], "but_1_down") == 0 || (int)strcmp(args[0], "but_1_move") == 0 ||
4147:        (int)strcmp(args[0], "but_2_down") == 0 || (int)strcmp(args[0], "but_2_move") == 0 || (int)strcmp(args[0], "but_2_up") == 0) {
4148:       for(i=0; i<strat_file_cnt; ++i){ 
4149:         for(j=0; j<strat[i]->data_cnt; ++j){
4150:           if(strat[i]->data[j].x_pix_loc_agedepth < 0 || strat[i]->data[j].y_pix_loc_agedepth < 0) {
4151:           }
4152:           else if(abs(strat[i]->data[j].x_pix_loc_agedepth + 5 - x) < CLOSE &&
4153:              abs(strat[i]->data[j].y_pix_loc_agedepth - 5 - y) < CLOSE) {
4154:             if(fabs(strat[i]->data[j].top_age - strat[i]->data[j].bot_age) < ROUNDCHECK) {
4155:               if(agemodelling_depth_type == MBSF) {
4156:                 (void)sprintf(string,"hole %c  %s (%s)  %6.3f Ma   %6.2f to %6.2f mbsf",
4157:                  strat[i]->data[j].top.hole, strat[i]->data[j].name, strat[i]->data[j].code, 
4158:                  strat[i]->data[j].top_age,
4159:                  strat[i]->data[j].top.sb_depth, strat[i]->data[j].bot.sb_depth);
4160:                 avedep = strat[i]->data[j].avembsf;
4161:               }
4162:               else if(agemodelling_depth_type == MCD) {
4163:                 (void)sprintf(string,"hole %c  %s (%s)  %6.3f Ma   %6.2f to %6.2f mcd",
4164:                  strat[i]->data[j].top.hole, strat[i]->data[j].name, strat[i]->data[j].code, 
4165:                  strat[i]->data[j].top_age,
4166:                  strat[i]->data[j].top.sb_depth + strat[i]->data[j].top.offset,
4167:                  strat[i]->data[j].bot.sb_depth + strat[i]->data[j].bot.offset);
4168:                 avedep = strat[i]->data[j].avemcd;
4169:               }
4170:               aveage = strat[i]->data[j].top_age;
4171:             }  
4172:             else {
4173:               if(agemodelling_depth_type == MBSF) {
4174:                 (void)sprintf(string,"hole %c  %s (%s)  %6.3f to %6.3f Ma   %6.2f to %6.2f mbsf", 
4175:                  strat[i]->data[j].top.hole, strat[i]->data[j].name, strat[i]->data[j].code, 
4176:                  strat[i]->data[j].top_age, strat[i]->data[j].bot_age, 
4177:                  strat[i]->data[j].top.sb_depth, strat[i]->data[j].bot.sb_depth); 
4178:                 avedep = strat[i]->data[j].avembsf;
4179:               }
4180:               else if(agemodelling_depth_type == MCD) {
4181:                 (void)sprintf(string,"hole %c  %s (%s)  %6.3f to %6.3f Ma   %6.2f to %6.2f mcd",
4182:                  strat[i]->data[j].top.hole, strat[i]->data[j].name, strat[i]->data[j].code, 
4183:                  strat[i]->data[j].top_age, strat[i]->data[j].bot_age,
4184:                  strat[i]->data[j].top.sb_depth + strat[i]->data[j].top.offset,
4185:                  strat[i]->data[j].bot.sb_depth + strat[i]->data[j].bot.offset);
4186:                 avedep = strat[i]->data[j].avemcd;
4187:               }
4188:               aveage = (strat[i]->data[j].top_age + strat[i]->data[j].bot_age)/2.0;
4189:             }  
4190:             if((int)strcmp(args[0], "but_1_down") == 0 || (int)strcmp(args[0], "but_1_move") == 0 ||
4191:                (int)strcmp(args[0], "but_2_down") == 0 || (int)strcmp(args[0], "but_2_move") == 0) {
4192:               xmstring = XmStringCreateSimple(string);
4193:             }
4194:             else {
4195:               xmstring = XmStringCreateSimple("");
4196:             }
4197:             XtVaSetValues(labelAgeDepthCursorLocation, XmNlabelString, xmstring, NULL);
4198:             XmStringFree(xmstring);
4199: 
4200:             if((int)strcmp(args[0], "but_2_up") == 0 && are_agemodelling == YES) {
4201: 
4202:               /* check that have not reached array limit
4203:               */
4204:               if(agemodel_cnt + 1 > MAXAGE) {
4205:                 (void)sprintf(buffer, "You have exceeded the limit on the number of values in age model.");
4206:                     SpManageWarningBox(buffer);
4207:                     return;
4208:               }
4209: 
4210:               /* check that this datum not already in list
4211:               */
4212:               if(agemodel_cnt > 0) {
4213:                 for(k=0; k<agemodel_cnt; ++k) {
4214:                   if((int)strcmp(strat[i]->data[j].code, agemodel[k].code) == 0) {
4215:                     if((int)strcmp(strat[i]->data[j].name, agemodel[k].name) == 0) {
4216:                       (void)sprintf(buffer, "The age datum you have picked is allready in the list.");
4217:                       SpManageWarningBox(buffer);
4218:                       return;
4219:                     }
4220:                   }
4221:                 }
4222:               }
4223: 
4224:               /* put this datum in age model struct in order by both age and depth
4225:                   there must not be conflicts with age and depth
4226:               */
4227:               if(agemodel_cnt >= 1) {
4228:                 pos = -1;
4229:                 for(k=0; k<agemodel_cnt; ++k) {
4230:                   if(agemodelling_depth_type == MBSF) {
4231:                     if(k == 0 && aveage < agemodel[k].aveage && avedep < agemodel[k].avembsf) {
4232:                       pos = k;
4233:                     }
4234:                     else if(k == agemodel_cnt-1 &&
4235:                             aveage > agemodel[k].aveage && avedep > agemodel[k].avembsf) {
4236:                       pos = k + 1;
4237:                     }
4238:                     else if(k < agemodel_cnt-1 && 
4239:                             aveage > agemodel[k].aveage && avedep > agemodel[k].avembsf &&
4240:                             aveage < agemodel[k+1].aveage && avedep < agemodel[k+1].avembsf) {
4241:                       pos = k + 1;
4242:                     }
4243:                   }
4244:                   else if(agemodelling_depth_type == MCD) {
4245:                     if(k == 0 && aveage < agemodel[k].aveage && avedep < agemodel[k].avemcd) {
4246:                       pos = k;
4247:                     }
4248:                     else if(k == agemodel_cnt-1 &&
4249:                             aveage > agemodel[k].aveage && avedep > agemodel[k].avemcd) {
4250:                       pos = k + 1;
4251:                     }
4252:                     else if(k < agemodel_cnt-1 &&
4253:                             aveage > agemodel[k].aveage && avedep > agemodel[k].avemcd &&
4254:                             aveage < agemodel[k+1].aveage && avedep < agemodel[k+1].avemcd) {
4255:                       pos = k + 1;
4256:                     }
4257:                   }
4258:                 }
4259:                 if(pos == -1) {
4260:                   (void)sprintf(buffer, "This age datum conflicts with existing age model.");
4261:                     SpManageWarningBox(buffer);
4262:                     return;
4263:                 }
4264:                 else {
4265:                   ++agemodel_cnt;
4266:                   if(pos == agemodel_cnt-1) {
4267:                     strat[i]->data[j].agemodel_maptostratfile = i;
4268:                     strat[i]->data[j].agemodel_maptodatum = j;
4269:                     agemodel[agemodel_cnt-1] = strat[i]->data[j];
4270:                   }
4271:                   else {
4272:                     for(k=agemodel_cnt-1; k>pos; --k) {
4273:                       agemodel[k] = agemodel[k-1];
4274:                     }
4275:                     strat[i]->data[j].agemodel_maptostratfile = i;
4276:                     strat[i]->data[j].agemodel_maptodatum = j;
4277:                     agemodel[pos] = strat[i]->data[j];
4278:                   }   
4279:                 }
4280:               }
4281:               else if(agemodel_cnt == 0) {
4282:                 agemodel_cnt = 1;
4283:                 strat[i]->data[j].agemodel_maptostratfile = i;
4284:                 strat[i]->data[j].agemodel_maptodatum = j;
4285:                 agemodel[0] = strat[i]->data[j];
4286:               }
4287: 
4288:               /* add this datum to the list
4289:               */
4290:               (void)sprintf(string, "%7.2f %7.2f %7.3f %s %s", strat[i]->data[j].avembsf, strat[i]->data[j].avemcd,
4291:                                        strat[i]->data[j].aveage, strat[i]->data[j].name, strat[i]->data[j].code);
4292: 
4293:               xmstring = XmStringCreateSimple(string);
4294:               XmListAddItemUnselected(listConstructAgeModel, xmstring, pos + 1);
4295:               XmStringFree(xmstring);
4296: 
4297:               did_agemodel = YES;
4298:               saved_agemodel = NO;
4299:  
4300:               if(agemodel_cnt > 1) {
4301:                 XtSetSensitive(pushButtonSaveAgeMode, True);
4302:                 XtSetSensitive(pushButtonRemoveSelectDatum, True);
4303:                 XtSetSensitive(pushButtonAgeDepthClearAgeMododelList, True);
4304:                 if(have_splice == DO) {
4305:                   XtSetSensitive(pushButtonPlotSpliceVsAge, True);
4306:                   XtSetSensitive(pushButtonSaveSpliceToAge, True);
4307:                   if(have_time_series == DONT) {
4308:                     XtSetSensitive(pushButtonOpenAgeSignal, True);
4309:                     XtSetSensitive(pushButtonOpenTimeSeries, True);
4310:                   }
4311:                   else if(have_time_series == DO) {
4312:                     XtSetSensitive(pushButtonOpenAgeSignal, False);
4313:                     XtSetSensitive(pushButtonOpenTimeSeries, False);
4314:                   }
4315:                   have_splicetoage = DO;
4316:                 }
4317:                 else {
4318:                   XtSetSensitive(pushButtonPlotSpliceVsAge, False);
4319:                   XtSetSensitive(pushButtonSaveSpliceToAge, False);
4320:                   XtSetSensitive(pushButtonOpenAgeSignal, False);
4321:                   XtSetSensitive(pushButtonOpenTimeSeries, False);
4322:                   have_splicetoage = DONT;
4323:                 }
4324:               }
4325:               else {
4326:                 XtSetSensitive(pushButtonPlotSpliceVsAge, False);
4327:                 XtSetSensitive(pushButtonSaveAgeMode, False);
4328:                 XtSetSensitive(pushButtonSaveSpliceToAge, False);
4329:                 XtSetSensitive(pushButtonOpenAgeSignal, False);
4330:                 XtSetSensitive(pushButtonOpenTimeSeries, False);
4331:                 have_splicetoage = DONT;
4332:               }
4333:               if(agemodel_cnt > 0) {
4334:                 XtSetSensitive(pushButtonRemoveSelectDatum, True);
4335:                 XtSetSensitive(pushButtonAgeDepthClearAgeMododelList, True);
4336:               }
4337:               else {
4338:                 XtSetSensitive(pushButtonRemoveSelectDatum, False);
4339:                 XtSetSensitive(pushButtonAgeDepthClearAgeMododelList, False);
4340:               }
4341: 
4342:               if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
4343:                 DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
4344:               }
4345:               if(have_splicetoage == DO) {
4346:                 PlotSpliceVsAge(NO);
4347:               }
4348:             }
4349:             return;
4350:           }
4351:         }
4352:       }
4353: 
4354:       if((int)strcmp(args[0], "but_2_up") != 0) {
4355:         agemodel_handpick_age = x;
4356:         agemodel_handpick_depth = y;
4357:         agemodel_handpick_age = ((agemodel_handpick_age - top_off_agedepth_age) * ageperpix) + top_age_agedepth;
4358:         agemodel_handpick_depth = ((agemodel_handpick_depth - top_off_agedepth_depth) * depperpixagemodel) + top_meter_agedepth;
4359:         if(agemodelling_depth_type == MBSF) {
4360:           (void)sprintf(string, "%8.2f(mbsf)  %8.3f(Ma)", agemodel_handpick_depth, agemodel_handpick_age);
4361:         }
4362:         else if(agemodelling_depth_type == MCD) {
4363:           (void)sprintf(string, "%8.2f(mcd)  %8.3f(Ma)", agemodel_handpick_depth, agemodel_handpick_age);
4364:         }
4365:         xmstring = XmStringCreateSimple(string);
4366:       }
4367:       else {
4368:         xmstring = XmStringCreateSimple("");
4369:       }
4370:       XtVaSetValues(labelAgeDepthCursorLocation, XmNlabelString, xmstring, NULL);
4371:       XmStringFree(xmstring);
4372:     } 
4373:  
4374:     else if((int)strcmp(args[0], "but_3_down") == 0 || (int)strcmp(args[0], "but_3_move") == 0) {
4375:       agemodel_handpick_age = x - OFF; 
4376:       agemodel_handpick_depth = y;
4377:       agemodel_handpick_age = agemodel_handpick_age * ageperpix;
4378:       agemodel_handpick_depth = ((agemodel_handpick_depth - top_off_agedepth_depth) * depperpixagemodel) + top_meter_agedepth;
4379:       if(agemodelling_depth_type == MBSF) {
4380:         (void)sprintf(string, "%8.2f(mbsf)  %8.3f(Ma)", agemodel_handpick_depth, agemodel_handpick_age);
4381:       }
4382:       else if(agemodelling_depth_type == MCD) {
4383:         (void)sprintf(string, "%8.2f(mcd)  %8.3f(Ma)", agemodel_handpick_depth, agemodel_handpick_age);
4384:       }
4385:       xmstring = XmStringCreateSimple(string);
4386:       XtVaSetValues(labelAgeDepthCursorLocation, XmNlabelString, xmstring, NULL);
4387:       XmStringFree(xmstring);
4388:     } 
4389: 
4390:     else if((int)strcmp(args[0], "but_3_up") == 0) {
4391:       xmstring = XmStringCreateSimple("");
4392:       XtVaSetValues(labelAgeDepthCursorLocation, XmNlabelString, xmstring, NULL);
4393:       XmStringFree(xmstring);
4394:       if(are_agemodelling == YES) {
4395:         (void)sprintf(string, "%8.3f", agemodel_handpick_age);
4396:         XtVaSetValues(textFieldAgeDepthHandPickAge, XmNvalue, string, NULL);
4397:         (void)sprintf(string, "%8.2f", agemodel_handpick_depth);
4398:         XtVaSetValues(textFieldAgeDepthHandPickDepth, XmNvalue, string, NULL);
4399: 
4400:         /* put it in the agemodel checking order and conflicts
4401:         */
4402:       }
4403:     }
4404: 
4405:     else if((int)strcmp(args[0], "but_1_up") == 0) {
4406:       xmstring = XmStringCreateSimple("");
4407:       XtVaSetValues(labelAgeDepthCursorLocation, XmNlabelString, xmstring, NULL);
4408:       XmStringFree(xmstring);
4409:     }
4410:   }
4411: 
4412:   (void)sprintf(string, "");
4413: }
4414: 
4415: /* ARGSUSED */
4416: void
4417: EventProcDrawingAreaSpliceToAge(w, event, args, num_args)
4418: Widget w;
4419: XButtonEvent *event;
4420: String *args;
4421: int *num_args;
4422: {
4423: 
4424:   int i, j, k, x, y, adj, sm, found, corenum, arraynum, hole, core, num, report_tie1, report_tie2;
4425:   char string[200], varstring[20];
4426:   float age, diff, checkage, var;
4427:   XmString xmstring;
4428:   void DrawDrawingAreaSpliceToAge(), SpliceToAgeRecorrelate(), SpliceToAgeAddTiedDatum();
4429: 
4430:   x = event->x;
4431:   y = event->y;
4432: 
4433:   if(agemodel_cnt > 0 && have_splice == DO) {
4434: 
4435:     /* assign  an xoff adjustment for the case when have or don't have time series
4436:        it will be drawn in the spcace where sed rate was drawn
4437:     */
4438:     if(have_time_series == DONT) {
4439:       adj = 0;
4440:     }
4441:     else if(have_time_series == DO) {
4442:       adj = varaxislen + SPACE;
4443:     }
4444:     else {
4445:       adj = 0;
4446:     }
4447: 
4448:     if(have_splicetoage_tie == DONT && have_timeseries_tie == DONT) {
4449:       last_splicetoage_tie = NONE;
4450:     }
4451:     else if(have_splicetoage_tie == DONT && last_splicetoage_tie == TIE1) {
4452:       if(have_timeseries_tie == DO){
4453:         last_splicetoage_tie = TIE2;
4454:       }
4455:       else {
4456:         last_splicetoage_tie = NONE;
4457:       }
4458:     }
4459:     else if(have_timeseries_tie == DONT && last_splicetoage_tie == TIE2) {
4460:       if(have_splicetoage_tie == DO){
4461:         last_splicetoage_tie = TIE1;
4462:       }
4463:       else {
4464:         last_splicetoage_tie = NONE;
4465:       }
4466:     }
4467:     report_tie1 = NO;
4468:     report_tie2 = NO;
4469: 
4470:     if((int)strcmp(args[0], "but_1_down") == 0 || (int)strcmp(args[0], "but_1_move") == 0 ||
4471:        (int)strcmp(args[0], "but_2_down") == 0 || (int)strcmp(args[0], "but_2_move") == 0 ||
4472:        (int)strcmp(args[0], "but_3_down") == 0 || (int)strcmp(args[0], "but_3_move") == 0) {
4473:    
4474:       age = ((y - top_off_splicetoage) * spliceageperpix) + top_age_splicetoage;
4475: 
4476:       /* are in the area of window were datums are drawn
4477:       */
4478:       if(x > OFF+SPACE+varaxislen && x < OFF+SPACE+varaxislen+SPACE) {
4479: 
4480:         found = NO;
4481:         for(j=0; j<agemodel_cnt; ++j){
4482:           if(agemodel[j].x_pix_loc_splicetoage < 0 || agemodel[j].y_pix_loc_splicetoage < 0) {
4483:           }
4484:           else if(abs(agemodel[j].x_pix_loc_splicetoage + 5 - x) < CLOSE &&
4485:                   abs(agemodel[j].y_pix_loc_splicetoage - 5 - y) < CLOSE) {
4486: 
4487:             if(have_time_series == DONT) {
4488:               (void)sprintf(string,"%7.2f(mbsf)%7.2f(mcd)%7.4f(Ma)   %s(%s)",
4489:                           agemodel[j].avembsf, agemodel[j].avemcd, agemodel[j].aveage,
4490:                           agemodel[j].name, agemodel[j].code);
4491:             }
4492:             else if(have_time_series == DO && agemodel[j].type != TIME && agemodel[j].type != HANDPICK) {
4493:               i = agemodel[j].agemodel_maptostratfile;
4494:               k = agemodel[j].agemodel_maptodatum;
4495:               if(i >= 0 && k >= 0) {
4496:                 (void)sprintf(string,"%7.2f(mbsf)%7.2f(mcd)%7.4f(Ma) %7.4f(Ma tuned)   %s(%s)",
4497:                           agemodel[j].avembsf, agemodel[j].avemcd, strat[i]->data[k].aveage, agemodel[j].aveage,
4498:                           agemodel[j].name, agemodel[j].code);
4499:               }
4500:               else {
4501:                  (void)sprintf(string,"%7.2f(mbsf)%7.2f(mcd) Can't assign(Ma) %7.4f(Ma tuned)   %s(%s)",
4502:                           agemodel[j].avembsf, agemodel[j].avemcd, agemodel[j].aveage,
4503:                           agemodel[j].name, agemodel[j].code);
4504:               }
4505:             }
4506:             else if(have_time_series == DO) {
4507:               (void)sprintf(string,"%7.2f(mbsf)%7.2f(mcd)%7.4f(Ma)   %s(%s)",
4508:                           agemodel[j].avembsf, agemodel[j].avemcd, agemodel[j].aveage,
4509:                           agemodel[j].name, agemodel[j].code);
4510:             }
4511:             found = YES;
4512:             break;
4513:           }
4514:           else {
4515:           }
4516:         }
4517:         if(found == NO) {
4518:           (void)sprintf(string, "%8.3f", age);
4519:           XmListDeselectAllItems(listConstructAgeModel);
4520:         }
4521:         else if(found == YES) {
4522:           XmListSelectPos(listConstructAgeModel, j+1, (int)NULL);
4523:         }
4524:         xmstring = XmStringCreateSimple(string);
4525:         XtVaSetValues(labelSpliceToAgeCursorLocation, XmNlabelString, xmstring, NULL);
4526:         XmStringFree(xmstring);
4527:       }
4528: 
4529:       /* are in the area of window where sed rate is drawn
4530:       */
4531:       else if(x > OFF + SPACE + varaxislen + SPACE + adj && x < OFF + SPACE + 2 * varaxislen + SPACE + adj) {
4532: 
4533:         found = -1;
4534:         if(agemodel_cnt > 1) {
4535:           for(i=0; i<agemodel_cnt-1; ++i) {
4536:             if(age >= agemodel[i].aveage && age < agemodel[i+1].aveage) {
4537:               found = i;
4538:             }
4539:           }
4540:         }
4541:         else {
4542:           found = 0;
4543:         }
4544:         if(found != -1) {
4545:           (void)sprintf(string,"%.4f (Ma)  %.3f (mcd/Ma)", age, agemodel[found].sedrate);
4546:         }
4547:         else {
4548:           (void)sprintf(string, "%8.3f", age);
4549:         }
4550:         xmstring = XmStringCreateSimple(string);
4551:         XtVaSetValues(labelSpliceToAgeCursorLocation, XmNlabelString, xmstring, NULL);
4552:         XmStringFree(xmstring);
4553:       }
4554: 
4555:       /* are in area of window where splice is drawn
4556:       */
4557:       else if(x > OFF + SPACE && x < OFF + SPACE + varaxislen) {
4558:         
4559:         corenum = -1;
4560: 
4561:         /* find which core. note that all samples should
4562:            be good because spcomp.var is composed with CleanUpSpliceCore
4563:         */
4564:         for(j=0; j < spcomp.numcores; ++j){
4565:           if(age >= spcomp.age[j][0] && age <= spcomp.age[j][spcomp.numpercore[j] - 1]){
4566:             if(smooth.plot == SMOOTHED &&
4567:                data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->smooth_status != SMOK) {
4568:               return;
4569:             }
4570:             else if(data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->smooth_status != SMOK) {
4571:               sm = NO;
4572:             }
4573:             corenum = j;
4574:             break;
4575:           }
4576:         }
4577: 
4578:         /* find nearest sample.
4579:         */
4580:         arraynum = -1;
4581:         if(corenum != -1) {
4582:           diff = 99999.0;
4583:           for(j=0; j<spcomp.numpercore[corenum]; ++j){
4584:             checkage = age - spcomp.age[corenum][j];
4585:             if(fabs(checkage) < diff){
4586:               diff = fabs(checkage);
4587:               arraynum = j;
4588:             }
4589:           }
4590:         }
4591:         else {
4592:           xmstring = XmStringCreateSimple("");
4593:           XtVaSetValues(labelSpliceToAgeCursorLocation, XmNlabelString, xmstring, NULL);
4594:           XmStringFree(xmstring);
4595:           return;
4596:         }
4597: 
4598:         if(corenum != -1 && arraynum != -1) {
4599:           hole = spcomp.hole[corenum];
4600:           core = spcomp.core[corenum];
4601:           num =  spcomp.MapToOrig[corenum][arraynum];
4602:           var = spcomp.var[corenum][arraynum];
4603:           (void)sprintf(string,"%d %c  %d %c %s %.1f   %.2f(mbsf)   %.2f(mcd)   %.4f(Ma)   %.2f",
4604:                           data[dset]->site,
4605:                           data[dset]->holes[hole]->name,
4606:                           data[dset]->holes[hole]->core[core]->num,
4607:                           data[dset]->holes[hole]->core[core]->value[num]->type,
4608:                           data[dset]->holes[hole]->core[core]->value[num]->section,
4609:                           data[dset]->holes[hole]->core[core]->value[num]->top_int,
4610:                           data[dset]->holes[hole]->core[core]->value[num]->sb_depth,
4611:                           data[dset]->holes[hole]->core[core]->value[num]->sb_depth + data[dset]->holes[hole]->core[core]->cum_dep_offset,
4612:                           spcomp.age[corenum][arraynum],
4613:                           var);
4614:           if(sm == YES && data[dset]->holes[hole]->core[core]->value[num]->smooth_ok == SMOK) {
4615:             (void)sprintf(varstring, " %.2f", data[dset]->holes[hole]->core[core]->value[num]->sm_data);
4616:             strncat(string, varstring, (int)strlen(varstring));
4617:           }
4618:           xmstring = XmStringCreateSimple(string);
4619:           XtVaSetValues(labelSpliceToAgeCursorLocation, XmNlabelString, xmstring, NULL);
4620:           XmStringFree(xmstring);
4621: 
4622:           if((int)strcmp(args[0], "but_2_down") == 0 || (int)strcmp(args[0], "but_2_move") == 0) {
4623:             splicetoagecorenum = corenum;
4624:             splicetoagearraynum = arraynum; 
4625:             have_splicetoage_tie = DO;
4626:             last_splicetoage_tie = TIE1;
4627:             (void)sprintf(string,"%d %c  %d %c %s %.1f",
4628:                           data[dset]->site,
4629:                           data[dset]->holes[hole]->name,
4630:                           data[dset]->holes[hole]->core[core]->num,
4631:                           data[dset]->holes[hole]->core[core]->value[num]->type,
4632:                           data[dset]->holes[hole]->core[core]->value[num]->section,
4633:                           data[dset]->holes[hole]->core[core]->value[num]->top_int);
4634:             xmstring = XmStringCreateSimple(string);
4635:             XtVaSetValues(labelSpliceToAgeTieID, XmNlabelString, xmstring, NULL);
4636:             XmStringFree(xmstring);
4637:             (void)sprintf(string,"%.2f", data[dset]->holes[hole]->core[core]->value[num]->sb_depth);
4638:             xmstring = XmStringCreateSimple(string);
4639:             XtVaSetValues(labelSpliceToAgeTiembsf, XmNlabelString, xmstring, NULL);
4640:             XmStringFree(xmstring);
4641:             (void)sprintf(string,"%.3f", var);
4642:             xmstring = XmStringCreateSimple(string);
4643:             XtVaSetValues(labelSpliceToAgeTieVar, XmNlabelString, xmstring, NULL);
4644:             XmStringFree(xmstring);
4645:             (void)sprintf(string,"%.2f", data[dset]->holes[hole]->core[core]->value[num]->sb_depth + 
4646:                                         data[dset]->holes[hole]->core[core]->cum_dep_offset);
4647:             xmstring = XmStringCreateSimple(string);
4648:             XtVaSetValues(labelSpliceToAgeTieSplicemcd, XmNlabelString, xmstring, NULL);
4649:             XmStringFree(xmstring);
4650:             (void)sprintf(string,"%.3f", spcomp.age[corenum][arraynum]);
4651:             xmstring = XmStringCreateSimple(string);
4652:             XtVaSetValues(labelSpliceToAgeTieSpliceAge, XmNlabelString, xmstring, NULL);
4653:             XmStringFree(xmstring);
4654:           }
4655:         }
4656:         else {
4657:           xmstring = XmStringCreateSimple("");
4658:           XtVaSetValues(labelSpliceToAgeCursorLocation, XmNlabelString, xmstring, NULL);
4659:           XmStringFree(xmstring);
4660:         }
4661:       }
4662: 
4663:       /* have time series and are in the area of window where it is drawn
4664:       */
4665:       else if(have_time_series == DO && (x > OFF + SPACE + varaxislen + SPACE && x < OFF + SPACE + 2 * varaxislen + SPACE)) {
4666:         if(age >= timeseries.age[0] && age <= timeseries.age[timeseries.n-1]) {
4667:           diff = 99999.0;
4668:           for(j=0; j<timeseries.n; ++j){
4669:             checkage = age - timeseries.age[j];
4670:             if(fabs(checkage) < diff){
4671:               diff = fabs(checkage);
4672:               arraynum = j;
4673:             }
4674:           }
4675:           (void)sprintf(string," %.4f(Ma)     %.3f", timeseries.age[arraynum], timeseries.val[arraynum]);
4676:           xmstring = XmStringCreateSimple(string);
4677:           XtVaSetValues(labelSpliceToAgeCursorLocation, XmNlabelString, xmstring, NULL);
4678:           XmStringFree(xmstring);
4679:  
4680:           if((int)strcmp(args[0], "but_3_down") == 0 || (int)strcmp(args[0], "but_3_move") == 0) {
4681:             timeseriesarraynum = arraynum;    
4682:             have_timeseries_tie = DO;
4683:             last_splicetoage_tie = TIE2;
4684:             (void)sprintf(string," %.3f", timeseries.age[arraynum]);
4685:             xmstring = XmStringCreateSimple(string);
4686:             XtVaSetValues(labelSpliceToAgeTimeSeriesAge, XmNlabelString, xmstring, NULL);
4687:             XmStringFree(xmstring);
4688:           }
4689:         }   
4690:         else {
4691: 
4692:         }
4693:       }
4694: 
4695:       else {
4696:         age = ((y - top_off_splicetoage) * spliceageperpix) + top_age_splicetoage;
4697:         (void)sprintf(string, "%8.3f", age);
4698:         xmstring = XmStringCreateSimple(string);
4699:         XtVaSetValues(labelSpliceToAgeCursorLocation, XmNlabelString, xmstring, NULL);
4700:         XmStringFree(xmstring);
4701:       }
4702:     }
4703:     else if((int)strcmp(args[0], "but_1_up") == 0 || (int)strcmp(args[0], "but_2_up") == 0 || (int)strcmp(args[0], "but_3_up") == 0) {
4704:       xmstring = XmStringCreateSimple("");
4705:       XtVaSetValues(labelSpliceToAgeCursorLocation, XmNlabelString, xmstring, NULL);
4706:       XmStringFree(xmstring);
4707:     }
4708: 
4709:     if(((int)strcmp(args[0], "but_2_down") == 0 || (int)strcmp(args[0], "but_2_move") == 0 ||
4710:        (int)strcmp(args[0], "but_3_down") == 0 || (int)strcmp(args[0], "but_3_move") == 0) && 
4711:        (have_splicetoage_tie == DO || have_timeseries_tie == DO) &&
4712:        (have_splicetoage == DO && have_time_series == DO)){
4713:       if((have_splicetoage_tie == DO && have_timeseries_tie == DONT) ||
4714:          (have_splicetoage_tie == DONT && have_timeseries_tie == DO)) {
4715:         if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
4716:           DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
4717:         }
4718:       }
4719:       else if(have_splicetoage_tie == DO && have_timeseries_tie == DO &&
4720:          have_splicetoage == DO && have_time_series == DO) {
4721:         XtSetSensitive(pushButtonSpliceToAgeAddTiedDatum, True);
4722:         XtSetSensitive(pushButtonSpliceToAgeRecorrelate, True);
4723:         XtSetSensitive(pushButtonSpliceToAgeClearTie, True);
4724:         SpliceToAgeRecorrelate((Widget)NULL, (XtPointer)NULL, (XtPointer)NULL);
4725:       }
4726:     }
4727: 
4728:     /* the event is an up or down arrow
4729:     */
4730:     if((int)strcmp(args[0], "arrow_up") == 0 || (int)strcmp(args[0], "arrow_down") == 0) {
4731: 
4732:       if(last_splicetoage_tie == TIE1 && (int)strcmp(args[0], "arrow_up") == 0) {
4733:         if(splicetoagearraynum - 1 >= 0){
4734:           --splicetoagearraynum;
4735:           report_tie1 = YES;
4736:         }
4737:         else if(splicetoagecorenum > 0) {
4738:           --splicetoagecorenum;
4739:           splicetoagearraynum = spcomp.numpercore[splicetoagecorenum] - 1;
4740:           report_tie1 = YES;
4741:         }
4742:         else {
4743:           return;
4744:         }
4745:       }
4746:       else if(last_splicetoage_tie == TIE2 && (int)strcmp(args[0], "arrow_up") == 0) {
4747:         if(timeseriesarraynum - 1 >= 0){
4748:           --timeseriesarraynum;
4749:           report_tie2 = YES;
4750:         }
4751:         else {
4752:           return;
4753:         }
4754:       }
4755:       else if(last_splicetoage_tie == TIE1 && (int)strcmp(args[0], "arrow_down") == 0) {
4756:         if(splicetoagearraynum + 1 < spcomp.numpercore[splicetoagecorenum]){
4757:           ++splicetoagearraynum;
4758:           report_tie1 = YES;
4759:         }
4760:         else if(splicetoagecorenum < spcomp.numcores - 1) {
4761:           ++splicetoagecorenum;
4762:           splicetoagearraynum = 0;
4763:           report_tie1 = YES;
4764:         }
4765:         else {
4766:           return;
4767:         }
4768:       }
4769:       else if(last_splicetoage_tie == TIE2 && (int)strcmp(args[0], "arrow_down") == 0) {
4770:         if(timeseriesarraynum + 1 < timeseries.n){
4771:           ++timeseriesarraynum;
4772:           report_tie2 = YES;
4773:         }
4774:         else {
4775:           return;
4776:         }
4777:       }
4778: 
4779:       if(report_tie1 == YES) {
4780:         hole = spcomp.hole[splicetoagecorenum];
4781:         core = spcomp.core[splicetoagecorenum];
4782:         num =  spcomp.MapToOrig[splicetoagecorenum][splicetoagearraynum];
4783:         var = spcomp.var[splicetoagecorenum][splicetoagearraynum];
4784:         (void)sprintf(string,"%d %c  %d %c %s %.1f   %.2f(mbsf)   %.2f(mcd)   %.4f(Ma)   %.2f",
4785:                         data[dset]->site,
4786:                         data[dset]->holes[hole]->name,
4787:                         data[dset]->holes[hole]->core[core]->num,
4788:                         data[dset]->holes[hole]->core[core]->value[num]->type,
4789:                         data[dset]->holes[hole]->core[core]->value[num]->section,
4790:                         data[dset]->holes[hole]->core[core]->value[num]->top_int,
4791:                         data[dset]->holes[hole]->core[core]->value[num]->sb_depth,
4792:                         data[dset]->holes[hole]->core[core]->value[num]->sb_depth + data[dset]->holes[hole]->core[core]->cum_dep_offset,
4793:                         spcomp.age[splicetoagecorenum][splicetoagearraynum],
4794:                         var);
4795:         if(sm == YES && data[dset]->holes[hole]->core[core]->value[num]->smooth_ok == SMOK) {
4796:           (void)sprintf(varstring, " %.2f", data[dset]->holes[hole]->core[core]->value[num]->sm_data);
4797:           strncat(string, varstring, (int)strlen(varstring));
4798:         }
4799:         xmstring = XmStringCreateSimple(string);
4800:         XtVaSetValues(labelSpliceToAgeCursorLocation, XmNlabelString, xmstring, NULL);
4801:         XmStringFree(xmstring);
4802:         have_splicetoage_tie = DO;
4803:         last_splicetoage_tie = TIE1;
4804:         (void)sprintf(string,"%d %c  %d %c %s %.1f",
4805:                           data[dset]->site,
4806:                           data[dset]->holes[hole]->name,
4807:                           data[dset]->holes[hole]->core[core]->num,
4808:                           data[dset]->holes[hole]->core[core]->value[num]->type,
4809:                           data[dset]->holes[hole]->core[core]->value[num]->section,
4810:                           data[dset]->holes[hole]->core[core]->value[num]->top_int);
4811:         xmstring = XmStringCreateSimple(string);
4812:         XtVaSetValues(labelSpliceToAgeTieID, XmNlabelString, xmstring, NULL);
4813:         XmStringFree(xmstring);
4814:         (void)sprintf(string,"%.2f", data[dset]->holes[hole]->core[core]->value[num]->sb_depth);
4815:         xmstring = XmStringCreateSimple(string);
4816:         XtVaSetValues(labelSpliceToAgeTiembsf, XmNlabelString, xmstring, NULL);
4817:         XmStringFree(xmstring);
4818:         (void)sprintf(string,"%.3f", var);
4819:         xmstring = XmStringCreateSimple(string);
4820:         XtVaSetValues(labelSpliceToAgeTieVar, XmNlabelString, xmstring, NULL);
4821:         XmStringFree(xmstring);
4822:         (void)sprintf(string,"%.2f", data[dset]->holes[hole]->core[core]->value[num]->sb_depth +
4823:                                        data[dset]->holes[hole]->core[core]->cum_dep_offset);
4824:         xmstring = XmStringCreateSimple(string);
4825:         XtVaSetValues(labelSpliceToAgeTieSplicemcd, XmNlabelString, xmstring, NULL);
4826:         XmStringFree(xmstring);
4827:         (void)sprintf(string,"%.3f", spcomp.age[splicetoagecorenum][splicetoagearraynum]);
4828:         xmstring = XmStringCreateSimple(string);
4829:         XtVaSetValues(labelSpliceToAgeTieSpliceAge, XmNlabelString, xmstring, NULL);
4830:         XmStringFree(xmstring);
4831:       }
4832:       else if(report_tie2 == YES) {
4833:         (void)sprintf(string," %.4f(Ma)     %.3f", timeseries.age[timeseriesarraynum], timeseries.val[timeseriesarraynum]);
4834:         xmstring = XmStringCreateSimple(string);
4835:         XtVaSetValues(labelSpliceToAgeCursorLocation, XmNlabelString, xmstring, NULL);
4836:         XmStringFree(xmstring);
4837: 
4838:         have_timeseries_tie = DO;
4839:         last_splicetoage_tie = TIE2;
4840:         (void)sprintf(string," %.3f", timeseries.age[timeseriesarraynum]);
4841:         xmstring = XmStringCreateSimple(string);
4842:         XtVaSetValues(labelSpliceToAgeTimeSeriesAge, XmNlabelString, xmstring, NULL);
4843:         XmStringFree(xmstring);
4844:       }
4845: 
4846:       if((have_splicetoage_tie == DO && have_timeseries_tie == DONT) ||
4847:          (have_splicetoage_tie == DONT && have_timeseries_tie == DO)) {
4848:         if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
4849:           DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
4850:         }
4851:       }
4852:       else if(have_splicetoage_tie == DO && have_timeseries_tie == DO &&
4853:          have_splicetoage == DO && have_time_series == DO) {
4854:         XtSetSensitive(pushButtonSpliceToAgeAddTiedDatum, True);
4855:         XtSetSensitive(pushButtonSpliceToAgeRecorrelate, True);
4856:         XtSetSensitive(pushButtonSpliceToAgeClearTie, True);
4857:         SpliceToAgeRecorrelate((Widget)NULL, (XtPointer)NULL, (XtPointer)NULL);
4858:       }
4859: 
4860:     }
4861: 
4862:     if((int)strcmp(args[0], "return_down") == 0) {
4863:       if(have_splicetoage_tie == DO && have_timeseries_tie == DO) {
4864:         SpliceToAgeAddTiedDatum((Widget)NULL, (XtPointer)NULL, (XtPointer)NULL);
4865:       }
4866:     }
4867:   }
4868: 
4869:   else {
4870:   }
4871: 
4872:   (void)sprintf(string, "");
4873: }
4874: 
4875: /* ARGSUSED */
4876: void
4877: DrawDrawingAreaEdit(w, client, call)
4878: Widget w;
4879: XtPointer client;
4880: XtPointer call;
4881: {
4882:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
4883: 
4884:   int i, ii, j, jj, kk, n, tic, sm, foundtop, foundbot, depcull, pixpermeter, axispixlen,
4885:       sx, sy, sdx, sdy, xoff, left, dum, err, ticpixlen, annot, label, scalemax,
4886:       draw_ties, who, starting_hole;
4887:   short int x, y;
4888:   unsigned short int width, height;
4889:   char s[50];
4890:   float  unitinc, *pdat, dep, dat[MAXPERCORE], sbd[MAXPERCORE],
4891:          botoffset, topoffset, maxmeter;
4892:   double check, fract, ip;
4893:   Dimension win_height, win_width;
4894:   void AxisDep();
4895: 
4896:   if(reason_for_redraw == NONE) {
4897:     return;
4898:   }
4899: 
4900:   /* get the height and width of the drawing area and
4901:      the slider scale value which is the starting value of the y axis
4902:   */
4903:   XtVaGetValues(w, XmNheight, &win_height, XmNwidth, &win_width, NULL);
4904:   XmScaleGetValue(drawingAreaEditScale, &scale_val);
4905:   XmScaleGetValue(scaleCores, &starting_hole);
4906: 
4907:   /* find the maximum length of the depth axis
4908:   */
4909:   if(have_data == DO){
4910:     check = maxdep/deptic; 
4911:     fract = modf(check, &ip);
4912:     if(fract == 0.0){
4913:       maxmeter = maxdep;
4914:     }
4915:     else {
4916:       maxmeter = (ip * deptic) + deptic;
4917:     }
4918:     for(i=0; i<data[dset]->numholes; ++i){
4919:       if(data[dset]->holes[i]->core[data[dset]->holes[i]->numcores-1]->cum_dep_offset +
4920:         data[dset]->holes[i]->core[data[dset]->holes[i]->numcores-1]->value[data[dset]->holes[i]->core[data[dset]->holes[i]->numcores-1]->numvalues-1]->sb_depth > maxmeter){
4921:         maxdep = data[dset]->holes[i]->core[data[dset]->holes[i]->numcores-1]->value[data[dset]->holes[i]->core[data[dset]->holes[i]->numcores-1]->numvalues-1]->sb_depth +
4922:                  data[dset]->holes[i]->core[data[dset]->holes[i]->numcores-1]->cum_dep_offset;
4923:       }  
4924:     } 
4925:     if(maxdep > maxmeter){
4926:       while(maxdep > maxmeter){  
4927:         maxmeter = maxmeter + deptic;
4928:       }  
4929:     }
4930:     scalemax = maxmeter;
4931:     XtVaSetValues(drawingAreaEditScale, XmNmaximum, scalemax, NULL); 
4932:     XtVaSetValues(drawingAreaViewScale, XmNmaximum, scalemax, NULL); 
4933:   }  
4934:   else { 
4935:     maxmeter = MAXDEP;
4936:     check = maxmeter/deptic;  
4937:     fract = modf(check, &ip); 
4938:     if(fract == 0.0){
4939:     } 
4940:     else {
4941:       maxmeter = (ip * deptic) + deptic; 
4942:     }
4943:     scalemax = maxmeter; 
4944:     XtVaSetValues(drawingAreaEditScale, XmNmaximum, scalemax, NULL);
4945:     XtVaSetValues(drawingAreaViewScale, XmNmaximum, scalemax, NULL);
4946:   }
4947:  
4948:   tic = deptic;                /*tic increment in meters*/
4949:   top_meter_edit = scale_val;  /*value at top off depth axis in meters*/
4950:   if(top_meter_edit == 0.0){
4951:     top_off_edit = OFF;        /*if 0.0 then give an offset from top of window*/
4952:   }
4953:   else {
4954:     top_off_edit = 0;
4955:   }
4956: 
4957: 
4958:   check = top_meter_edit/deptic;
4959:   fract = modf(check, &ip);       /* is the top value divisable by tic or is there a remainder*/
4960:  
4961:   if(fract == 0.0) {              /*if no remainder than y axis starts at a tic*/
4962:     unitinc = top_meter_edit;      
4963:   }
4964:   else {                          /*there is a remainder so axis does not start at a tic*/
4965:     unitinc = tic * ip + tic;     /*so the first tic is the next one down*/
4966:   }
4967: 
4968:   axispixlen = (int)win_height - top_off_edit;  /*pixel length of depth axis*/
4969:  
4970:   /* calculate how many pixels in a meter; truncate the result so mult.
4971:      meters are equal to a pixel value that is a whole number
4972:   */
4973:   check = axispixlen/depmeterdisplayed;
4974:   fract = modf(check, &ip);
4975:   pixpermeter = ip;
4976: 
4977:   ticpixlen = pixpermeter * tic;
4978:   check = pixpermeter;
4979:   depperpix = 1.0/check;
4980: 
4981:   if(unitinc == top_meter_edit){    /*if axis does not start at a tic calculate the distance*/
4982:     left = 0;                       /*in pixels from top of axis to first tic*/
4983:   }
4984:   else {
4985:     left = (unitinc - top_meter_edit) * pixpermeter;
4986:   }
4987: 
4988:   if(clip == YES) {
4989: 
4990:     /* this drawing function has been called because...
4991:     */
4992:     /* event was either resize or expose; let the window manager handle it
4993:     */
4994:     if(acs != NULL) {
4995:       if(acs->reason == XmCR_EXPOSE || acs->reason == XmCR_RESIZE) {
4996:       }
4997:     }  
4998: 
4999:     /* the reason was clear window
5000:     */
5001:     else if(reason_for_redraw == DRAW_CLEAR) {
5002: 
5003:       XClearWindow(XtDisplay(w), XtWindow(w));
5004:     }
5005: 
5006:     /* the reason is such that only a portion of the window must be redrawn
5007:     */
5008:     else if(reason_for_redraw == DRAW_TIES || reason_for_redraw == DRAW_DEPTHSHIFT ||
5009:             reason_for_redraw == DRAW_DEPTHSHIFTUNDO) {
5010:    
5011:       /* clear the clip region
5012:       */
5013:       who = EDIT;
5014:       XSetForeground(XtDisplay(w), gc_drawingAreaEdit, bgPixel);
5015:  
5016:       FindClipRegion(who, (int)win_width, (int)win_height, starting_hole);
5017:       XFillRectangle(XtDisplay(w), XtWindow(w), gc_drawingAreaEdit, clip_x, clip_y, clip_width, clip_height);
5018:       MakeClipMask(XtDisplay(w), gc_drawingAreaEdit, clip_x, clip_y, clip_width, clip_height);
5019:     }
5020:  
5021:     else if(reason_for_redraw == DRAW_CLEARTIE) {
5022: 
5023:       XSetForeground(XtDisplay(w), gc_drawingAreaEdit, bgPixel);
5024:       XFillRectangle(XtDisplay(w), XtWindow(w), gc_drawingAreaEdit, clip_x, clip_y, clip_width, clip_height);
5025:       MakeClipMask(XtDisplay(w), gc_drawingAreaEdit, clip_x, clip_y, clip_width, clip_height);
5026:     }
5027: 
5028:     /* the reason is such that entire window must be redrawn
5029:     */
5030:     else if(reason_for_redraw == DRAW_EVERYTHING || reason_for_redraw == DISPLAY_CHANGE) {
5031:    
5032:       /*set the clip region to entire window and clear the drawing area
5033:       */
5034:       clip_x = 0;
5035:       clip_y = 0;
5036:       clip_width = (int)win_width;
5037:       clip_height = (int)win_height;
5038:       MakeClipMask(XtDisplay(w), gc_drawingAreaEdit, clip_x, clip_y, clip_width, clip_height);
5039:       XClearWindow(XtDisplay(w), XtWindow(w));
5040:     }
5041:  
5042:     /* no match for reason?; draw everything
5043:     */
5044:     else {
5045:  
5046:       /*set the clip region to entire window and clear the drawing area
5047:       */
5048:       clip_x = 0;
5049:       clip_y = 0;
5050:       clip_width = (int)win_width;
5051:       clip_height = (int)win_height;
5052:       MakeClipMask(XtDisplay(w), gc_drawingAreaEdit, clip_x, clip_y, clip_width, clip_height);
5053:       XClearWindow(XtDisplay(w), XtWindow(w));
5054:     }
5055:   }
5056: 
5057:   else {
5058:  
5059:     XClearWindow(XtDisplay(w), XtWindow(w));
5060:   }
5061: 
5062:   /* set color for axis and labels and draw depth axis
5063:   */
5064:   XSetForeground(XtDisplay(w), gc_drawingAreaEdit, fgPixel[LABEL_COLOR]);
5065: 
5066:   annot = 1;
5067:   label = NO;
5068:   AxisDep(w, XtDisplay(w), XtWindow(w), gc_drawingAreaEdit, 
5069:             maxmeter, top_off_edit, left, ticpixlen, deptic, unitinc, depperpix, annot, label);
5070: 
5071:   /* if there is data stored plot it
5072:   */
5073:   if(have_data == DO) {
5074:     minvar = data[dset]->min;
5075:     maxvar = data[dset]->max;
5076:     varperpix = (maxvar - minvar)/varaxislen;     
5077: 
5078:     /* if there is room label the holes
5079:     */
5080:     if(unitinc == 0.0 && top_off_edit == OFF) {
5081:       (void)sprintf(s, "leg %d  site %d", data[dset]->leg, data[dset]->site);
5082:       XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaEdit,
5083:                       OFF+20, OFF-35, s, (int)strlen(s));
5084:     }   
5085: 
5086:     /* get the cores scale value. it will be the array num of
5087:        the first hole to plot. in other words; where to 'skip to'
5088:     */
5089:     if(starting_hole >= data[dset]->numholes) {
5090:       return;
5091:     }
5092: 
5093:     for(ii=starting_hole; ii<data[dset]->numholes; ++ii) {
5094:  
5095:       xoff=OFF+ SPACE + (ii - starting_hole) * (varaxislen+SPACE);
5096:       if(unitinc == 0.0 && top_off_edit == OFF) {
5097:         (void)sprintf(s, "hole %c", data[dset]->holes[ii]->name);
5098:         XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaEdit,
5099:                        xoff, OFF-10, s, (int)strlen(s));
5100:       }
5101:     }
5102: 
5103:     /*note that CleanUpCore returns one core that has been
5104:       culled of bad values and has had the cum_depth_offset
5105:       added to original sbd(if have it)
5106:     */
5107: 
5108:     for(ii=starting_hole; ii<data[dset]->numholes; ++ii) {
5109: 
5110:       xoff=OFF+ SPACE + (ii - starting_hole) * (varaxislen+SPACE); 
5111: 
5112:       for(jj=0; jj<data[dset]->holes[ii]->numcores; ++jj) {
5113: 
5114:         /* if are plotting both the unsmoothed and smoothed
5115:            plot the smoothed
5116:         */
5117:         if(data[dset]->holes[ii]->core[jj]->value[0]->quality == BAD_CORE_NUM){
5118:         }
5119:         else{
5120:           if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
5121:               smooth.plot == SMOOTHEDBOTH && 
5122:               data[dset]->holes[ii]->core[jj]->smooth_status == SMOK){
5123:             sm = YES;
5124:             dum = -1;
5125:             err = CleanUpCore(dset, ii, jj, &n, sbd, dat, sm, &dum);
5126:             if(n < 2 || err > 0) {
5127:             }
5128:             else {
5129:               XSetForeground(XtDisplay(w), gc_drawingAreaEdit, fgPixel[SMOOTH_COLOR]);
5130:               sx = (dat[0] - minvar)/varperpix + xoff;
5131:               sy = (sbd[0] - top_meter_edit)/depperpix + top_off_edit;
5132:               for(kk=1; kk<n; ++kk) {
5133:                 sdx = (dat[kk] - minvar)/varperpix+xoff;
5134:                 sdy = (sbd[kk] - top_meter_edit)/depperpix+top_off_edit;
5135:                 if(sy > (int)win_height) {
5136:                   break;
5137:                 }
5138:                 else if(sy <= 0 && sdy <= 0) {
5139:                 }
5140:                 else { 
5141:                   if(sy < 0 && sdy > 0) {
5142:                     sx = sx + ((sdx - sx)/(sdy - sy)) * sdy;
5143:                     sy = 0;
5144:                   }
5145:                   XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaEdit,
5146:                                 sx, sy, sdx, sdy);
5147:                 }  
5148:                 sx = sdx; 
5149:                 sy = sdy;
5150:               }
5151:             }
5152:           }
5153:         }
5154: 
5155:         /* plot the smoothed or unsmoothed depending on choice.
5156:         */
5157:         if(smooth.method == NONE || smooth.plot == UNSMOOTHED){
5158:           sm = NO;
5159:         }
5160:         else if(smooth.plot == SMOOTHEDBOTH){
5161:           sm = NO;
5162:         }
5163:         else if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
5164:                    smooth.plot == SMOOTHED){
5165:           sm = YES;
5166:         }
5167:         else {
5168:           sm = NO;
5169:         }
5170: 
5171:         if(data[dset]->holes[ii]->core[jj]->value[0]->quality == BAD_CORE_NUM){
5172:         }
5173:         else if(sm == YES && data[dset]->holes[ii]->core[jj]->smooth_status != SMOK) {
5174:         }
5175:         else {
5176:           dum = -1;
5177:           err = CleanUpCore(dset, ii, jj, &n, sbd, dat, sm, &dum);
5178: 
5179:           if(n < 2 || err > 0) {
5180:           }
5181:           else {
5182:             if(data[dset]->holes[ii]->core[jj]->did_offset == YES) {
5183:               XSetForeground(XtDisplay(w), gc_drawingAreaEdit, fgPixel[MCD_COLOR]);
5184:             }
5185:             else if(sm == NO) {
5186:               XSetForeground(XtDisplay(w), gc_drawingAreaEdit, fgPixel[MBSF_COLOR]); 
5187:             }
5188:             else if(sm == YES) {
5189:               XSetForeground(XtDisplay(w), gc_drawingAreaEdit, fgPixel[SMOOTH_COLOR]);
5190:             }
5191:             sx = (dat[0] - minvar)/varperpix + xoff;
5192:             sy = (sbd[0] - top_meter_edit)/depperpix + top_off_edit;
5193:             for(kk=1; kk<n; ++kk) {
5194:               sdx = (dat[kk] - minvar)/varperpix+xoff;
5195:               sdy = (sbd[kk] - top_meter_edit)/depperpix+top_off_edit;
5196:               if(sy > (int)win_height) {
5197:                 break;
5198:               }
5199:               else if(sy <= 0 && sdy <= 0) {
5200:               }
5201:               else {
5202:                 if(sy < 0 && sdy > 0) {
5203:                   sx = sx + ((sdx - sx)/(sdy - sy)) * sdy;
5204:                   sy = 0;
5205:                 }
5206:                 XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaEdit,
5207:                               sx, sy, sdx, sdy);
5208:               }
5209:               sx = sdx;
5210:               sy = sdy;
5211:             }
5212:             sx = xoff - 15;
5213:             sy = sy - 5;
5214:             if(sy > (int)win_height) {
5215:             }
5216:             else if(sy <= 0) {
5217:             }
5218:             else {
5219:               XSetForeground(XtDisplay(w), gc_drawingAreaEdit, fgPixel[LABEL_COLOR]);
5220:               (void)sprintf(s, "%d", data[dset]->holes[ii]->core[jj]->num);
5221:               XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaEdit,
5222:                        sx, sy, s, (int)strlen(s));
5223:             }
5224:           }
5225:         }
5226:       }
5227:     }
5228: 
5229:     /* check to see that the cores with ties are in view
5230:     */
5231:     if(have_tie1 == DO && have_tie2 == DO && tie1holenum >= starting_hole && tie2holenum >= starting_hole) {
5232:       draw_ties = YES;
5233:     }
5234:     else if(have_tie1 == DO && have_tie2 == DO && (tie1holenum < starting_hole || tie2holenum < starting_hole)) { 
5235:       draw_ties = NO; 
5236:     }
5237:     if((have_tie1 == DO || have_tie2 == DO) && starting_hole == data[dset]->numholes -1) {
5238:       draw_ties = NO;
5239:     }
5240:     else if(have_tie1 == DO && tie1holenum >= starting_hole) { 
5241:       draw_ties = YES; 
5242:     }
5243:     else if(have_tie1 == DO && tie1holenum < starting_hole) {
5244:       draw_ties = NO;
5245:     }
5246:     else if(have_tie2 == DO && tie2holenum >= starting_hole) { 
5247:       draw_ties = YES; 
5248:     }
5249:     else if(have_tie2 == DO && tie2holenum < starting_hole) { 
5250:       draw_ties = NO; 
5251:     }
5252:     else {
5253:       draw_ties = NO;
5254:     }
5255: 
5256:     /* tie points
5257:     */
5258:     if(have_tie1 == DO && draw_ties == YES){
5259:       if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
5260:          (smooth.plot == SMOOTHED || smooth.plot == SMOOTHEDBOTH) &&
5261:           data[dset]->holes[tie1holenum]->core[tie1corenum]->smooth_status == SMOK){
5262:         sx=(data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->sm_data-minvar)/varperpix+
5263:             OFF + SPACE + (tie1holenum - starting_hole) * (varaxislen + SPACE);
5264:       }  
5265:       else {
5266:         pdat = data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->data;
5267:         sx=(*pdat - minvar)/varperpix+
5268:             OFF + SPACE + (tie1holenum - starting_hole) * (varaxislen + SPACE);
5269:       }  
5270:       dep = data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->sb_depth +
5271:                            data[dset]->holes[tie1holenum]->core[tie1corenum]->cum_dep_offset;
5272:       sy=(dep - top_meter_edit)/depperpix + top_off_edit;
5273:       if(smooth.method == SMOOTHED && data[dset]->holes[tie1holenum]->core[tie1corenum]->smooth_status != SMOK){
5274:       }
5275:       else {
5276:         XSetForeground(XtDisplay(drawingAreaEdit), gc_drawingAreaEdit,
5277:                        fgPixel[TIEPTFIXED_COLOR]);
5278:         XFillArc(XtDisplay(drawingAreaEdit), XtWindow(drawingAreaEdit),
5279:                            gc_drawingAreaEdit,
5280:                            sx-(POINTSIZE/2), sy-(POINTSIZE/2),
5281:                            POINTSIZE, POINTSIZE, 0, 360*64);
5282:       }
5283:     }
5284: 
5285:     if(have_tie2 == DO && draw_ties == YES){
5286:       if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
5287:          (smooth.plot == SMOOTHED || smooth.plot == SMOOTHEDBOTH) &&
5288:           data[dset]->holes[tie2holenum]->core[tie2corenum]->smooth_status == SMOK){ 
5289:         sdx=(data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->sm_data-minvar)/varperpix+ 
5290:             OFF + SPACE + (tie2holenum - starting_hole) * (varaxislen + SPACE); 
5291:       }   
5292:       else { 
5293:         pdat = data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->data; 
5294:         sdx=(*pdat - minvar)/varperpix+ 
5295:             OFF + SPACE + (tie2holenum - starting_hole) * (varaxislen + SPACE); 
5296:       }   
5297:       dep = data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->sb_depth + 
5298:                            data[dset]->holes[tie2holenum]->core[tie2corenum]->cum_dep_offset; 
5299:       sdy=(dep - top_meter_edit)/depperpix + top_off_edit; 
5300:       if(smooth.method == SMOOTHED && data[dset]->holes[tie2holenum]->core[tie2corenum]->smooth_status != SMOK){ 
5301:       } 
5302:       else {
5303:         XSetForeground(XtDisplay(drawingAreaEdit), gc_drawingAreaEdit,
5304:                        fgPixel[TIEPTSHIFT_COLOR]); 
5305:         XFillArc(XtDisplay(drawingAreaEdit), XtWindow(drawingAreaEdit), 
5306:                            gc_drawingAreaEdit, 
5307:                            sdx-(POINTSIZE/2), sdy-(POINTSIZE/2), 
5308:                            POINTSIZE, POINTSIZE, 0, 360*64);
5309:       }
5310:     }
5311: 
5312:     /* if have both tie points draw the tie line
5313:     */
5314:     if(have_tie1 == DO && have_tie2 == DO && draw_ties == YES){
5315: 
5316:       if(smooth.method == SMOOTHED &&
5317:         (data[dset]->holes[tie1holenum]->core[tie1corenum]->smooth_status != SMOK ||
5318:          data[dset]->holes[tie2holenum]->core[tie2corenum]->smooth_status != SMOK)) {
5319:       }
5320:       else {
5321:         /*set color for tie
5322:         */
5323:         XSetForeground(XtDisplay(w), gc_drawingAreaEdit, fgPixel[TIELINE_COLOR]);
5324:         XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaEdit, sx, sy, sdx, sdy);
5325:       }
5326:     }
5327: 
5328:     /*if have correlated draw the core 2 overtop core 1
5329:     */
5330:     if(have_shift == DO && draw_ties == YES){
5331:   
5332:       if(smooth.method == NONE){
5333:         sm = NO;
5334:       }
5335:       else if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
5336:                smooth.plot == UNSMOOTHED){
5337:         sm = NO;
5338:       }
5339:       else if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
5340:               (smooth.plot == SMOOTHED || smooth.plot == SMOOTHEDBOTH) &&
5341:                data[dset]->holes[tie2holenum]->core[tie2corenum]->smooth_status == SMOK){
5342:         sm = YES;
5343:       }
5344:       else {
5345:         sm = NO;
5346:       }
5347: 
5348:       dum = -1;
5349:       err = CleanUpCore(dset, tie2holenum, tie2corenum, &n, sbd, dat, sm, &dum);
5350: 
5351:       if(n < 2 || err > 0) {
5352:       }
5353:       else {
5354:         xoff=OFF + SPACE + (tie1holenum - starting_hole) * (varaxislen + SPACE);
5355:         sx = (dat[0] - minvar)/varperpix + xoff;
5356:         sy = (sbd[0] - top_meter_edit + tiedepoffset)/depperpix + top_off_edit;
5357:         for(kk=1; kk<n; ++kk) {
5358:           sdx = (dat[kk] - minvar)/varperpix+xoff;
5359:           sdy = (sbd[kk] - top_meter_edit + tiedepoffset)/depperpix + top_off_edit;
5360:           if(sy > (int)win_height) { 
5361:             break; 
5362:           } 
5363:           if(sy <= 0 && sdy <= 0) {
5364:           }
5365:           else {
5366:             if(sbd[kk] >= sbd[tie2arraynum] - winlen && sbd[kk] <= sbd[tie2arraynum] + winlen){
5367:               XSetForeground(XtDisplay(w), gc_drawingAreaEdit, fgPixel[OVERLAYINCORR_COLOR]);
5368:             }
5369:             else {
5370:               XSetForeground(XtDisplay(w), gc_drawingAreaEdit, fgPixel[OVERLAYOUTCORR_COLOR]);
5371:             }
5372:             if(sy < 0 && sdy > 0) { 
5373:               sx = sx + ((sdx - sx)/(sdy - sy)) * sdy; 
5374:               sy = 0;
5375:             }
5376:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaEdit,
5377:                           sx, sy, sdx, sdy);
5378:           }
5379:           sx = sdx;
5380:           sy = sdy;
5381:         }
5382:       }
5383:     }
5384:   }
5385: 
5386:   /* no data stored
5387:   */
5388:   else if(have_data == DONT) {
5389:     return;
5390:   }
5391: 
5392:   /* draw the stratigraphy if have any.
5393:      use the cum_dep_offset to adjust the depth
5394:   */
5395:   if(have_strat == DO && have_data == DO){
5396:      
5397:     /* for each file(strat type) find out what type it
5398:        is and set the color
5399:     */
5400:     for(ii=0; ii<strat_file_cnt; ++ii){
5401:       if(strat[ii]->type == PALEOMAG){
5402:         XSetForeground(XtDisplay(w), gc_drawingAreaEdit, fgPixel[PALEOMAG_COLOR]);
5403:       }
5404:       else if(strat[ii]->type == DIATOMS){
5405:         XSetForeground(XtDisplay(w), gc_drawingAreaEdit, fgPixel[DIATOM_COLOR]);
5406:       }  
5407:       else if(strat[ii]->type == RADIOLARIA){
5408:         XSetForeground(XtDisplay(w), gc_drawingAreaEdit, fgPixel[RAD_COLOR]);
5409:       }  
5410:       else if(strat[ii]->type == FORAMINIFERA){
5411:         XSetForeground(XtDisplay(w), gc_drawingAreaEdit, fgPixel[FORAM_COLOR]);
5412:       }  
5413:       else if(strat[ii]->type == NANNOFOSSILS){
5414:         XSetForeground(XtDisplay(w), gc_drawingAreaEdit, fgPixel[NANNO_COLOR]);
5415:       }  
5416: 
5417:       for(jj=0; jj<strat[ii]->data_cnt; ++jj){
5418: 
5419:         /* find the hole current datum is in
5420:         */
5421:       
5422:         for(i=starting_hole; i<data[dset]->numholes; ++i){
5423:  
5424:           foundtop = NO;
5425:           foundbot = NO;
5426:           depcull = NO;
5427:           if(data[dset]->holes[i]->name == strat[ii]->data[jj].top.hole){
5428:  
5429:             sx = OFF + SPACE + (i - starting_hole) * (SPACE + varaxislen);
5430:  
5431:             /* find which cores the top and bottom
5432:                datums are in and set the depth offset for each
5433:                note that datum may not be in a drawn core so
5434:                will then need to use the  one above
5435:             */
5436:             if(strat[ii]->data[jj].top.core == data[dset]->holes[i]->core[0]->num){
5437:               topoffset = data[dset]->holes[i]->core[0]->cum_dep_offset;
5438:               foundtop = YES;
5439:             }
5440:             else if(data[dset]->holes[i]->numcores >= 2){
5441:               for(j=1; j<data[dset]->holes[i]->numcores; ++j){
5442:                 if(data[dset]->holes[i]->core[j]->value[0]->quality == BAD_CORE_NUM){
5443:                   depcull = YES;
5444:                   break;
5445:                 }
5446:                 else if(strat[ii]->data[jj].top.core == data[dset]->holes[i]->core[j]->num){
5447:                   topoffset = data[dset]->holes[i]->core[j]->cum_dep_offset;
5448:                   foundtop = YES;
5449:                   break;
5450:                 }
5451:                 else if(strat[ii]->data[jj].top.core < data[dset]->holes[i]->core[j]->num &&    
5452:                         strat[ii]->data[jj].top.core > data[dset]->holes[i]->core[j-1]->num) {
5453:                   topoffset = data[dset]->holes[i]->core[j-1]->cum_dep_offset;
5454:                   foundtop = YES;
5455:                   break;
5456:                 }
5457:               }
5458:             }
5459:  
5460:             if(strat[ii]->data[jj].bot.core == data[dset]->holes[i]->core[1]->num){
5461:               botoffset = data[dset]->holes[i]->core[1]->cum_dep_offset;
5462:               foundbot = YES;
5463:             }
5464:             else if(data[dset]->holes[i]->numcores >= 2){
5465:               for(j=1; j<data[dset]->holes[i]->numcores; ++j){
5466:                 if(data[dset]->holes[i]->core[j]->value[0]->quality == BAD_CORE_NUM){
5467:                   depcull = YES;
5468:                   break;
5469:                 }
5470:                 else if(strat[ii]->data[jj].bot.core == data[dset]->holes[i]->core[j]->num){
5471:                   botoffset = data[dset]->holes[i]->core[j]->cum_dep_offset;
5472:                   foundbot = YES;
5473:                   break;
5474:                 }
5475:                 else if(strat[ii]->data[jj].bot.core < data[dset]->holes[i]->core[j]->num &&
5476:                         strat[ii]->data[jj].bot.core > data[dset]->holes[i]->core[j-1]->num) {
5477:                   botoffset = data[dset]->holes[i]->core[j-1]->cum_dep_offset;
5478:                   foundbot = YES;
5479:                   break;
5480:                 }
5481:               }
5482:             }
5483:             if(foundbot == YES && foundtop == YES) {
5484:               goto Jump_edit;
5485:             }
5486:           }
5487:         }
5488: 
5489:         Jump_edit:
5490:  
5491:         /* draw and label
5492:         */
5493:         if((foundtop == NO && foundbot == NO && depcull == NO) ||
5494:            (foundtop == NO && depcull == NO) ||
5495:            (foundbot == NO && depcull == NO)) {
5496:           strat[ii]->data[jj].x_pix_loc_edit = -1;
5497:           strat[ii]->data[jj].y_pix_loc_edit = -1;
5498:         }
5499:         else if(depcull == NO){
5500:           sy = (strat[ii]->data[jj].top.sb_depth - top_meter_edit + topoffset)/depperpix +
5501:                                                                               top_off_edit;
5502:           sdy = (strat[ii]->data[jj].bot.sb_depth - top_meter_edit + botoffset)/depperpix +
5503:                                                                               top_off_edit;
5504:           if(sy > (int)win_height || sdy < 0) {
5505:             strat[ii]->data[jj].x_pix_loc_edit = -1;
5506:             strat[ii]->data[jj].y_pix_loc_edit = -1;
5507:           }
5508:           else {
5509:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaEdit,
5510:                           sx+10-3, sy, sx+10+3, sy);
5511:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaEdit,
5512:                           sx+10-3, sdy, sx+10+3, sdy);
5513:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaEdit,
5514:                           sx+10, sy, sx+10, sdy);
5515:             (void)sprintf(s, "%s", strat[ii]->data[jj].code);
5516:             strat[ii]->data[jj].x_pix_loc_edit = sx - SPACE/2 - 5;
5517:             strat[ii]->data[jj].y_pix_loc_edit = sy + (sdy-sy)/2;
5518:             XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaEdit,
5519:                      strat[ii]->data[jj].x_pix_loc_edit, strat[ii]->data[jj].y_pix_loc_edit, s, (int)strlen(s));
5520:           }
5521:         }
5522:       }
5523:     }
5524:   }  
5525:   else {
5526:   }
5527: 
5528:   if(clip == YES) {
5529:     /*for window managers sake, set the clip region back to entire window
5530:     */ 
5531:     width = (int)win_width;
5532:     height = (int)win_height;
5533:     MakeClipMask(XtDisplay(w), gc_drawingAreaEdit, 0, 0, width, height);
5534:   }
5535: 
5536:   (void)sprintf(s, "");
5537: }
5538: 
5539: 
5540: /* ARGSUSED */
5541: void
5542: DrawDrawingAreaView(w, client, call)
5543: Widget w;
5544: XtPointer client;
5545: XtPointer call;
5546: {
5547:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
5548:   
5549:   int i, ii, j, jj, k, kk, tic, n, dum, sm, err, pixpermeter, axispixlen, scalemax,
5550:       sx, sy, sdx, sdy, xoff, left, ticpixlen, annot, label, 
5551:       foundtop, foundbot, depcull, who;
5552:   char s[50], string[20];
5553:   unsigned short int width, height;
5554:   float  unitinc, *pdat, dep, sbd[MAXPERCORE], dat[MAXPERCORE], maxmeter,
5555:          botoffset, topoffset;
5556:   double check,  fract, ip;
5557:   Dimension win_height, win_width;
5558:   void AxisDep();
5559: 
5560:   if(reason_for_redraw == NONE) {
5561:     return;
5562:   }
5563: 
5564:   /* get the height and width of the drawing area and the scale value
5565:   */
5566:   XtVaGetValues(w, XmNheight, &win_height, XmNwidth, &win_width, NULL);
5567:   XmScaleGetValue(drawingAreaViewScale, &scale_val);
5568: 
5569:   /* find the maximum value of the depth axis
5570:   */
5571:   if(have_data == DO){
5572:     check = maxdep/deptic;
5573:     fract = modf(check, &ip);
5574:     if(fract == 0.0){
5575:       maxmeter = maxdep;
5576:     }
5577:     else {
5578:       maxmeter = (ip * deptic) + deptic;
5579:     }
5580:     if(have_splice == DO && spcomp.sb_depth[spcomp.numcores-1][spcomp.numpercore[spcomp.numcores-1]-1] > maxdep){
5581:       maxdep = spcomp.sb_depth[spcomp.numcores-1][spcomp.numpercore[spcomp.numcores-1]-1];
5582:     }
5583:     if(maxdep > maxmeter){
5584:       while(maxdep > maxmeter){
5585:         maxmeter = maxmeter + deptic;
5586:       }  
5587:     }
5588:     scalemax = maxmeter;
5589:     XtVaSetValues(drawingAreaEditScale, XmNmaximum, scalemax, NULL);
5590:     XtVaSetValues(drawingAreaViewScale, XmNmaximum, scalemax, NULL);
5591:   }  
5592:   else {
5593:     maxmeter = MAXDEP;
5594:     check = maxmeter/deptic;
5595:     fract = modf(check, &ip);
5596:     if(fract == 0.0){
5597:     }    
5598:     else {  
5599:       maxmeter = (ip * deptic) + deptic;
5600:     } 
5601:     scalemax = maxmeter;
5602:     XtVaSetValues(drawingAreaEditScale, XmNmaximum, scalemax, NULL);
5603:     XtVaSetValues(drawingAreaViewScale, XmNmaximum, scalemax, NULL);
5604:   }
5605: 
5606:   tic = deptic;                /*tic increment in meters*/
5607:   top_meter_view = scale_val;  /*value at top off depth axis in meters*/
5608:   if(top_meter_view == 0.0){
5609:     top_off_view = OFF;        /*if 0.0 then give an offset from top of window*/
5610:   }
5611:   else { 
5612:     top_off_view = 0;
5613:   }
5614:  
5615:   check = top_meter_view/deptic;
5616:   fract = modf(check, &ip);       /* is the top value divisable by tic or is there a remainder*/
5617:  
5618:   if(fract == 0.0) {              /*if no remainder than y axis starts at a tic*/
5619:     unitinc = top_meter_view;      
5620:   }
5621:   else {                          /*there is a remainder so axis does not start at a tic*/
5622:     unitinc = tic * ip + tic;     /*so the first tic is the next one down*/
5623:   }
5624:  
5625:   axispixlen = (int)win_height - top_off_view;  /*pixel length of depth axis*/
5626:  
5627:   /* calculate how many pixels in a meter; truncate the result so mult.
5628:      meters are equal to a pixel value that is a whole number
5629:   */
5630:   check = axispixlen/depmeterdisplayed;
5631:   fract = modf(check, &ip);
5632:   pixpermeter = ip; 
5633:  
5634:   ticpixlen = pixpermeter * tic; 
5635:   check = pixpermeter;
5636:   depperpixsp = 1.0/check;
5637:  
5638:   if(unitinc == top_meter_view){    /*if axis does not start at a tic calculate the distance*/
5639:     left = 0;                       /*in pixels from top of axis to first tic*/
5640:   }
5641:   else { 
5642:     left = (unitinc - top_meter_view) * pixpermeter;
5643:   }
5644: 
5645:   if(clip == YES) {
5646: 
5647:     /* this drawing function has been called because...
5648:     */
5649:     /* event was either resize or expose; let the window manager handle it
5650:     */
5651:     if(acs != NULL) {
5652:       if(acs->reason == XmCR_EXPOSE || acs->reason == XmCR_RESIZE) {
5653:       }
5654:     } 
5655:  
5656:     /* the reason was clear window
5657:     */ 
5658:     else if(reason_for_redraw == DRAW_CLEAR) {
5659:  
5660:       XClearWindow(XtDisplay(w), XtWindow(w));
5661:     }
5662:  
5663:     /* the reason is such that only a portion of the window must be redrawn
5664:     */
5665:     else if(reason_for_redraw == DRAW_TIES || reason_for_redraw == DRAW_COREGRABBED ||
5666:             reason_for_redraw == DRAW_CORECLEARED || reason_for_redraw == DRAW_SPLICED ||
5667:             reason_for_redraw == DRAW_APPEND || reason_for_redraw == DRAW_UNDONE) {
5668:  
5669:       /* clear the clip region
5670:       */   
5671:       who = VIEW;  
5672:       XSetForeground(XtDisplay(w), gc_drawingAreaView, bgPixel);
5673:  
5674:       FindClipRegion(who, (int)win_width, (int)win_height, 0);
5675:       XFillRectangle(XtDisplay(w), XtWindow(w), gc_drawingAreaView, clip_x, clip_y, clip_width, clip_height);
5676:       MakeClipMask(XtDisplay(w), gc_drawingAreaView, clip_x, clip_y, clip_width, clip_height);
5677:     }
5678: 
5679:     else if(reason_for_redraw == DRAW_CLEARTIE) {
5680: 
5681:       XSetForeground(XtDisplay(w), gc_drawingAreaView, bgPixel);
5682:       XFillRectangle(XtDisplay(w), XtWindow(w), gc_drawingAreaView, clip_x, clip_y, clip_width, clip_height);
5683:       MakeClipMask(XtDisplay(w), gc_drawingAreaView, clip_x, clip_y, clip_width, clip_height);
5684:     }
5685:  
5686:     /* the reason is such that entire window must be redrawn
5687:     */
5688:     else if(reason_for_redraw == DRAW_EVERYTHING || reason_for_redraw == DISPLAY_CHANGE ||
5689:             reason_for_redraw == DRAW_CLEARTIE) {
5690:  
5691:       /*set the clip region to entire window and clear the drawing area
5692:       */   
5693:       clip_x = 0;
5694:       clip_y = 0;
5695:       clip_width = (int)win_width;
5696:       clip_height = (int)win_height;
5697:       MakeClipMask(XtDisplay(w), gc_drawingAreaView, clip_x, clip_y, clip_width, clip_height);
5698:       XClearWindow(XtDisplay(w), XtWindow(w));
5699:     }
5700:  
5701:     /* no match for reason?; draw everything
5702:     */
5703:     else { 
5704:   
5705:       /*set the clip region to entire window and clear the drawing area
5706:       */
5707:       clip_x = 0; 
5708:       clip_y = 0; 
5709:       clip_width = (int)win_width; 
5710:       clip_height = (int)win_height;
5711:       MakeClipMask(XtDisplay(w), gc_drawingAreaView, clip_x, clip_y, clip_width, clip_height);
5712:       XClearWindow(XtDisplay(w), XtWindow(w));
5713:     }
5714:   }
5715: 
5716:   else {
5717: 
5718:     XClearWindow(XtDisplay(w), XtWindow(w));
5719:   }
5720: 
5721:   /* set the axis and label color
5722:   */
5723:   XSetForeground(XtDisplay(w), gc_drawingAreaView,
5724:                  fgPixel[LABEL_COLOR]);
5725:   annot = 1;
5726:   label = NO;
5727:   AxisDep(w, XtDisplay(w), XtWindow(w), gc_drawingAreaView,
5728:             maxmeter, top_off_view, left, ticpixlen, deptic, unitinc, depperpixsp, annot, label);
5729: 
5730:   /* draw the splice composite
5731:      note that bad points have allready been removed(except bad smooth) and the
5732:      depth offset has allready been added
5733:   */
5734:   if(have_splice == DO){
5735: 
5736:     minvar = data[dset]->min;
5737:     maxvar = data[dset]->max;
5738:     varperpix = (maxvar - minvar)/varaxislen;
5739:  
5740:     if(smooth.method == NONE || smooth.plot == UNSMOOTHED){
5741:         sm = NO;
5742:     }  
5743:     else if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
5744:                smooth.plot == SMOOTHED){
5745:       sm = YES;
5746:     }  
5747:     else {
5748:       sm = NO;
5749:     }
5750: 
5751:     xoff = OFF + SPACE;
5752: 
5753:     for(j=0; j<spcomp.numcores; ++j){
5754: 
5755:       if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
5756:                    smooth.plot == SMOOTHEDBOTH){
5757: 
5758:         /* if are drawing both smoothed and unsmoothed
5759:            draw the smoothed
5760:         */
5761:         if(spcomp.numpercore[j] < 2) {
5762:         }
5763:         else if(data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->smooth_status != SMOK) {
5764:         }
5765:         else {
5766:           XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[SMOOTH_COLOR]);
5767:           if(j < 1){
5768:             if(data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][0]]->smooth_ok >= SMOK){
5769:               sx = (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][0]]->sm_data - minvar)/varperpix + xoff;
5770:             }
5771:             else {
5772:               sx = (spcomp.var[j][0] - minvar)/varperpix + xoff;
5773:             }
5774:             sy = (spcomp.sb_depth[j][0] - top_meter_view)/depperpixsp + top_off_view;
5775:             kk = 1;
5776:           } 
5777:           else if(j > 0 && (spcomp.splice_how[j] == REAL || spcomp.splice_how[j] == INTERPOLATED) &&
5778:                   spcomp.map_to_table[j-1] == spcomp.map_to_table[j] - 2){
5779:             if(data[dset]->holes[spcomp.hole[j-1]]->core[spcomp.core[j-1]]->value[spcomp.MapToOrig[j-1][spcomp.numpercore[j-1]-1]]->smooth_ok >= SMOK){
5780:               sx = (data[dset]->holes[spcomp.hole[j-1]]->core[spcomp.core[j-1]]->value[spcomp.MapToOrig[j-1][spcomp.numpercore[j-1]-1]]->sm_data - minvar)/varperpix + xoff;
5781:             }
5782:             else {
5783:               sx = (spcomp.var[j-1][spcomp.numpercore[j-1]-1] - minvar)/varperpix + xoff;
5784:             }
5785:             sy = (spcomp.sb_depth[j-1][spcomp.numpercore[j-1]-1] - top_meter_view)/depperpixsp + top_off_view;
5786:             kk = 0;
5787:           } 
5788:           else if(j > 0){
5789:             if(data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][0]]->smooth_ok >= SMOK){
5790:               sx = (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][0]]->sm_data - minvar)/varperpix + xoff;
5791:             }
5792:             else {
5793:               sx = (spcomp.var[j][0] - minvar)/varperpix + xoff;
5794:             }
5795:             sy = (spcomp.sb_depth[j][0] - top_meter_view)/depperpixsp + top_off_view;
5796:             kk = 1;
5797:           } 
5798:  
5799:           for(k=kk; k<spcomp.numpercore[j]; ++k) {
5800:             if(data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][k]]->smooth_ok >= SMOK){
5801:               sdx = (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][k]]->sm_data - minvar)/varperpix + xoff;
5802:             }
5803:             else {
5804:               sdx = (spcomp.var[j][k] - minvar)/varperpix + xoff;
5805:             }
5806:             sdy = (spcomp.sb_depth[j][k] - top_meter_view)/depperpixsp + top_off_view;
5807:             if(sy > (int)win_height) {
5808:               break;
5809:             }
5810:             else if(sy <= 0 && sdy <= 0) { 
5811:             }
5812:             else {
5813:               if(sy < 0 && sdy > 0) { 
5814:                 sx = sx + ((sdx - sx)/(sdy - sy)) * sdy; 
5815:                 sy = 0; 
5816:               }
5817:               XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
5818:                           sx, sy, sdx, sdy);
5819:             }
5820:             sx = sdx;
5821:             sy = sdy;
5822:           }
5823:         }
5824:       }
5825: 
5826:       /* depending on plot choice draw the smoothed or unsmoothed
5827:       */
5828:       if(smooth.method == NONE || smooth.plot == UNSMOOTHED){
5829:           sm = NO;
5830:       }
5831:       else if(smooth.plot == SMOOTHEDBOTH){
5832:         sm = NO;
5833:       }
5834:       else if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
5835:                    smooth.plot == SMOOTHED){
5836:         sm = YES;
5837:       }
5838:       else {
5839:         sm = NO;
5840:       }
5841: 
5842:       if(spcomp.numpercore[j] < 2) {
5843:       }
5844:       else if(sm == YES && data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->smooth_status != SMOK) { 
5845:       }
5846:       else {
5847:         if(sm == NO) {
5848:           XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[SPLICE_COLOR]);
5849:         }
5850:         else if(sm == YES) {
5851:           XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[SMOOTH_COLOR]);
5852:         }
5853: 
5854:         if(j < 1){
5855:           if(sm == YES && (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][0]]->smooth_ok >= SMOK)){
5856:             sx = (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][0]]->sm_data - minvar)/varperpix + xoff;
5857:           }
5858:           else {
5859:             sx = (spcomp.var[j][0] - minvar)/varperpix + xoff;
5860:           }
5861:           sy = (spcomp.sb_depth[j][0] - top_meter_view)/depperpixsp + top_off_view;
5862:           kk = 1;
5863:         }
5864:         else if(j > 0 && (spcomp.splice_how[j] == REAL || spcomp.splice_how[j] == INTERPOLATED) &&
5865:                 spcomp.map_to_table[j-1] == spcomp.map_to_table[j] - 2){
5866:           if(sm == YES && (data[dset]->holes[spcomp.hole[j-1]]->core[spcomp.core[j-1]]->value[spcomp.MapToOrig[j-1][spcomp.numpercore[j-1]-1]]->smooth_ok >= SMOK)){ 
5867:             sx = (data[dset]->holes[spcomp.hole[j-1]]->core[spcomp.core[j-1]]->value[spcomp.MapToOrig[j-1][spcomp.numpercore[j-1]-1]]->sm_data - minvar)/varperpix + xoff; 
5868:           } 
5869:           else { 
5870:             sx = (spcomp.var[j-1][spcomp.numpercore[j-1]-1] - minvar)/varperpix + xoff;
5871:           }
5872:           sy = (spcomp.sb_depth[j-1][spcomp.numpercore[j-1]-1] - top_meter_view)/depperpixsp + top_off_view; 
5873:           kk = 0; 
5874:         }
5875:         else if(j > 0){
5876:           if(sm == YES && (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][0]]->smooth_ok >= SMOK)){ 
5877:             sx = (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][0]]->sm_data - minvar)/varperpix + xoff; 
5878:           } 
5879:           else { 
5880:             sx = (spcomp.var[j][0] - minvar)/varperpix + xoff;
5881:           }
5882:           sy = (spcomp.sb_depth[j][0] - top_meter_view)/depperpixsp + top_off_view;
5883:           kk = 1;
5884:         }
5885: 
5886:         for(k=kk; k<spcomp.numpercore[j]; ++k) {
5887:           if(sm == YES && (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][k]]->smooth_ok >= SMOK)){
5888:             sdx = (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][k]]->sm_data - minvar)/varperpix + xoff;
5889:           }   
5890:           else {
5891:             sdx = (spcomp.var[j][k] - minvar)/varperpix + xoff;
5892:           }
5893:           sdy = (spcomp.sb_depth[j][k] - top_meter_view)/depperpixsp + top_off_view;
5894:           if(sy > (int)win_height) {
5895:             break;
5896:           }
5897:           else if(sy <= 0 && sdy <= 0) {  
5898:           } 
5899:           else {
5900:             if(sy < 0 && sdy > 0) {  
5901:               sx = sx + ((sdx - sx)/(sdy - sy)) * sdy;  
5902:               sy = 0;  
5903:             }
5904:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
5905:                           sx, sy, sdx, sdy);
5906:           }
5907:           sx = sdx;
5908:           sy = sdy;
5909:         }
5910: 
5911:         /*  label the core
5912:         */
5913:         sx = xoff - 15;
5914:         sy = sy - 5;
5915:         if(sy > (int)win_height) {
5916:           break;
5917:         }
5918:         else if(sy <= 0) {
5919:         }
5920:         else {
5921:           XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[LABEL_COLOR]);
5922:           (void)sprintf(s, "%c%d", data[dset]->holes[spcomp.hole[j]]->name,
5923:                            data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->num);
5924:           XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
5925:                        sx, sy, s, (int)strlen(s));
5926: 
5927:           /* if this is the last core of the splice put an * in margin
5928:              to indicate to user that have reached the botton
5929:           */
5930:           if(j + 1 == spcomp.numcores) {
5931:             sx = 10;
5932:             sy = sy + 5;
5933:             XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[SPLICELOCATION_COLOR]);
5934:             (void)sprintf(s, "*");
5935:             XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
5936:                        sx, sy, s, (int)strlen(s));
5937:           }
5938:         }
5939:       }
5940:     }
5941: 
5942:     /* if the cores are tied(not appended) draw a line to indicate
5943:        where the splice is
5944:     */
5945:     if(spcomp.numcores > 1){
5946:       XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[SPLICELOCATION_COLOR]);
5947:       for(j=0; j<spcomp.numcores - 1; ++j) {
5948:         if(spcomp.map_to_table[j] != spcomp.map_to_table[j+1] - 2){
5949:         }
5950:         else {
5951:           if(spcomp.splice_how[j+1] == REAL || spcomp.splice_how[j+1] == INTERPOLATED){
5952:             if(sm == NO || (sm == YES && data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->smooth_status != SMOK)) {
5953:               sx = (spcomp.var[j][spcomp.numpercore[j]-1] - minvar)/varperpix + xoff;
5954:             }
5955:             else if(sm == YES && data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->smooth_status == SMOK) {
5956:               sx = (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][spcomp.numpercore[j]-1]]->sm_data - minvar)/varperpix + xoff;
5957:             }
5958:             sy = (spcomp.sb_depth[j][spcomp.numpercore[j]-1] - top_meter_view)/depperpixsp + top_off_view;
5959:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
5960:                         sx - 10, sy, sx + 10, sy);
5961: /*
5962:             if(sm == NO || (sm == YES && data[dset]->holes[spcomp.hole[j+1]]->core[spcomp.core[j+1]]->smooth_status != SMOK)) {
5963:               sx = (spcomp.var[j+1][0] - minvar)/varperpix + xoff;
5964:             }   
5965:             else if(sm == YES && data[dset]->holes[spcomp.hole[j+1]]->core[spcomp.core[j+1]]->smooth_status == SMOK) {
5966:               sx = (data[dset]->holes[spcomp.hole[j+1]]->core[spcomp.core[j+1]]->value[spcomp.MapToOrig[j+1][0]]->sm_data - minvar)/varperpix + xoff;
5967:             }
5968:             sy = (spcomp.sb_depth[j+1][0] - top_meter_view)/depperpixsp + top_off_view;
5969:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
5970:                         sx - 10, sy, sx + 10, sy);
5971: */
5972:           }
5973:           else if(spcomp.splice_how[j+1] == INTERPOLATED){
5974: /*
5975:             if(sm == NO || (sm == YES && data[dset]->holes[spcomp.hole[j+1]]->core[spcomp.core[j+1]]->smooth_status != SMOK)) {
5976:               sx = (spcomp.interpolated_value[j+1] - minvar)/varperpix + xoff;
5977:             }  
5978:             else if(sm == YES && data[dset]->holes[spcomp.hole[j+1]]->core[spcomp.core[j+1]]->smooth_status == SMOK) {
5979:               sx = (spcomp.interpolated_sm_value[j+1] - minvar)/varperpix + xoff;
5980:             }  
5981:             sy = (spcomp.interpolated_spl_depth[j+1] - top_meter_view)/depperpixsp + top_off_view;
5982:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
5983:                         sx - 10, sy, sx + 10, sy);
5984: */
5985:           }   
5986:           else if(spcomp.splice_how[j+1] == APPEND) {
5987:           }   
5988:         }  
5989:       }
5990:     }
5991: 
5992:     /* check to see if there are missing cores and if so mark them
5993:     */
5994:     if(spcomp.numcores >= 1){
5995:       XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[LABEL_COLOR]);
5996:       if(spcomp.map_to_table[0] > 0) {
5997:         k = 0;
5998:         if(top_off_view == OFF) {
5999:           sy = OFF;
6000:         }
6001:         else {
6002:           sy = 20;
6003:         }
6004:         sdy = (spcomp.sb_depth[0][0] - top_meter_view)/depperpixsp + top_off_view;
6005:         if(sy >= sdy -10) {
6006:         }
6007:         else if(sy < 0 || sy > (int)win_height) {
6008:         }
6009:         else {
6010:           (void)sprintf(s, "missing ");
6011:           while(k < spcomp.map_to_table[0]) {
6012:             (void)sprintf(string, "%c%d ", splicertable.data[k].hole,
6013:                            splicertable.data[k].core);
6014:             strcat(s, string);
6015:             k = k + 2;
6016:           }
6017:           XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
6018:                               OFF * 2, sy, s, (int)strlen(s));
6019:         }
6020:       }
6021:       for(j=0; j<spcomp.numcores - 1; ++j) {
6022:         sy = (spcomp.sb_depth[j][spcomp.numpercore[j]-1] - top_meter_view)/depperpixsp + top_off_view;
6023:         k = spcomp.map_to_table[j] + 2;
6024:         while(k < spcomp.map_to_table[j+1] && k < splicertable.data_cnt){
6025:           sy = sy + OFF;
6026:           if(sy < 0 || sy > (int)win_height) {
6027:           }
6028:           else {
6029:             (void)sprintf(s, "missing %c%d", splicertable.data[k].hole,
6030:                            splicertable.data[k].core);
6031:             XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
6032:                               OFF * 2, sy, s, (int)strlen(s));
6033:           }
6034:           k = k + 2;
6035:         }
6036:       }
6037:       if(spcomp.map_to_table[spcomp.numcores-1] < splicertable.data_cnt -2) {
6038:         k = spcomp.map_to_table[spcomp.numcores-1] + 2;
6039:         sy = (spcomp.sb_depth[spcomp.numcores-1][spcomp.numpercore[j]-1] - top_meter_view)/depperpixsp + top_off_view;
6040:         while(k <= splicertable.data_cnt -2) {
6041:           sy = sy + OFF;
6042:           if(sy < 0 || sy > (int)win_height) {
6043:           }
6044:           else {
6045:             (void)sprintf(s, "missing %c%d", splicertable.data[k].hole,
6046:                            splicertable.data[k].core);
6047:             XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
6048:                               OFF * 2, sy, s, (int)strlen(s));
6049:           }
6050:           k = k + 2;
6051:         }
6052:       }
6053:     }
6054: 
6055:    
6056: 
6057:     if(have_core_to_splice == DO){
6058: 
6059:       xoff = OFF + SPACE + varaxislen;
6060:       if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
6061:                    smooth.plot == SMOOTHEDBOTH){
6062:         if(data[dset]->holes[spliceholenum]->core[splicecorenum]->smooth_status == SMOK) {
6063:           sm = YES;
6064:           dum = -1;
6065:           err = CleanUpCore(dset, spliceholenum, splicecorenum, &n, sbd, dat, sm, &dum);
6066:           if(n < 2 || err > 0) {
6067:           }
6068:           else {
6069:             XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[SMOOTH_COLOR]);
6070:             sx = (dat[0] - minvar)/varperpix + xoff;
6071:             sy = (sbd[0] - top_meter_view)/depperpixsp + top_off_view;
6072:             for(kk=1; kk<n; ++kk) {
6073:               sdx = (dat[kk] - minvar)/varperpix+xoff;
6074:               sdy = (sbd[kk] - top_meter_view)/depperpixsp + top_off_view;
6075:               if(sy > (int)win_height) {
6076:                 break;
6077:               }
6078:               if(sy <= 0 && sdy <= 0) {  
6079:               } 
6080:               else {
6081:                 if(sy < 0 && sdy > 0) {  
6082:                   sx = sx + ((sdx - sx)/(sdy - sy)) * sdy;  
6083:                   sy = 0;  
6084:                 }
6085:                 XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
6086:                                 sx, sy, sdx, sdy);
6087:               }
6088:               sx = sdx;
6089:               sy = sdy;
6090:             }
6091:           }
6092:         }
6093:       }
6094: 
6095:       if(smooth.method == NONE || smooth.plot == UNSMOOTHED){
6096:           sm = NO;
6097:       }
6098:       else if(smooth.plot == SMOOTHEDBOTH){
6099:         sm = NO;
6100:       }
6101:       else if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
6102:                    smooth.plot == SMOOTHED){
6103:         sm = YES;
6104:       }
6105:       else {
6106:         sm = NO;
6107:       }
6108: 
6109:       if(sm == YES && data[dset]->holes[spliceholenum]->core[splicecorenum]->smooth_status != SMOK) {
6110:       }
6111:       else if(sm == NO || (sm == YES && data[dset]->holes[spliceholenum]->core[splicecorenum]->smooth_status == SMOK)) {
6112:         dum = -1;
6113:         err = CleanUpCore(dset, spliceholenum, splicecorenum, &n, sbd, dat, sm, &dum);
6114:         if(n < 2 || err > 0) {
6115:         }
6116:         else {
6117: 
6118:           if(data[dset]->holes[spliceholenum]->core[splicecorenum]->did_offset == YES) {
6119:             XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[MCD_COLOR]);
6120:           }
6121:           else if(sm == NO) {
6122:             XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[MBSF_COLOR]);
6123:           }
6124:           else if(sm == YES) {
6125:             XSetForeground(XtDisplay(w), gc_drawingAreaEdit, fgPixel[SMOOTH_COLOR]);
6126:           }
6127: 
6128:           sx = (dat[0] - minvar)/varperpix + xoff;
6129:           sy = (sbd[0] - top_meter_view)/depperpixsp + top_off_view;
6130:           for(k=1; k<n; ++k) {
6131:             sdx = (dat[k] - minvar)/varperpix + xoff;
6132:             sdy = (sbd[k] - top_meter_view)/depperpixsp + top_off_view;
6133:             if(sy > (int)win_height) {
6134:               break;
6135:             }
6136:             else if(sy <= 0 && sdy <= 0) {  
6137:             } 
6138:             else {
6139:               if(sy < 0 && sdy > 0) {  
6140:                 sx = sx + ((sdx - sx)/(sdy - sy)) * sdy;  
6141:                 sy = 0;  
6142:               }
6143:               XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
6144:                         sx, sy, sdx, sdy);
6145:             }
6146:             sx = sdx;
6147:             sy = sdy;
6148:           }
6149:         }
6150:       }
6151: 
6152:       /* label the core to splice
6153:       */
6154:       sx = xoff - 15;
6155:       sy = sy - 5;
6156:       if(sy > (int)win_height) {
6157:       }
6158:       else if(sy <= 0) {
6159:       }
6160:       else {
6161:         XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[LABEL_COLOR]);
6162:         (void)sprintf(s, "%c%d", data[dset]->holes[spliceholenum]->name,
6163:                            data[dset]->holes[spliceholenum]->core[splicecorenum]->num);
6164:         XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
6165:                        sx, sy, s, (int)strlen(s));
6166:       }
6167:     }
6168: 
6169:     /* tie points
6170:     */
6171:     if(have_sp_tie1 == DO){
6172:       if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
6173:          (smooth.plot == SMOOTHED || smooth.plot == SMOOTHEDBOTH) &&
6174:          (data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->smooth_status == SMOK) ){
6175:  
6176:         if(data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->value[spcomp.MapToOrig[spcompcorenum][spcomparraynum]]->smooth_ok >= SMOK){
6177:           sx = (data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->value[spcomp.MapToOrig[spcompcorenum][spcomparraynum]]->sm_data - minvar)/varperpix + OFF + SPACE;
6178:         }
6179:         else {
6180:           sx = (spcomp.var[spcompcorenum][spcomparraynum] - minvar)/varperpix + OFF + SPACE;
6181:         }
6182:       } 
6183:       else if(smooth.plot != SMOOTHED) {
6184:         sx = (spcomp.var[spcompcorenum][spcomparraynum] - minvar)/varperpix + OFF + SPACE;
6185:       } 
6186:       if((data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->smooth_status != SMOK) &&
6187:          smooth.plot == SMOOTHED) {
6188:       }
6189:       else {
6190:         dep = spcomp.sb_depth[spcompcorenum][spcomparraynum];
6191:         sy=(dep - top_meter_view)/depperpixsp + top_off_view;
6192:         XSetForeground(XtDisplay(drawingAreaView), gc_drawingAreaView,
6193:                      fgPixel[TIEPTFIXED_COLOR]);
6194:         XFillArc(XtDisplay(drawingAreaView), XtWindow(drawingAreaView),
6195:                          gc_drawingAreaView,
6196:                          sx-(POINTSIZE/2), sy-(POINTSIZE/2),
6197:                          POINTSIZE, POINTSIZE, 0, 360*64);
6198:       }
6199:     }
6200: 
6201:     if(have_sp_tie2 == DO){
6202:       if(splice_how == REAL) {
6203:         if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
6204:            (smooth.plot == SMOOTHED || smooth.plot == SMOOTHEDBOTH) &&
6205:            (data[dset]->holes[spliceholenum]->core[splicecorenum]->smooth_status == SMOK) ){
6206:           sdx=(data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->sm_data - minvar)/varperpix +
6207:               OFF + SPACE + varaxislen;
6208:         }  
6209:         else {
6210:           pdat = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->data;
6211:           sdx=(*pdat - minvar)/varperpix + OFF + SPACE + varaxislen;
6212:         }  
6213:         dep = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->sb_depth +
6214:                             data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset;
6215:       }
6216:       else if(splice_how == INTERPOLATED) {
6217:         if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
6218:            (smooth.plot == SMOOTHED || smooth.plot == SMOOTHEDBOTH) &&
6219:            (data[dset]->holes[spliceholenum]->core[splicecorenum]->smooth_status == SMOK)){
6220:           sdx = (interpsplice_sm_val - minvar)/varperpix + OFF + SPACE + varaxislen;
6221:         }
6222:         else {
6223:           sdx = (interpsplice_val - minvar)/varperpix + OFF + SPACE + varaxislen;
6224:         }
6225:         dep = interpsplice_spl_depth;
6226:       }
6227:       if(data[dset]->holes[spliceholenum]->core[splicecorenum]->smooth_status != SMOK &&
6228:          smooth.plot == SMOOTHED) {
6229:       }  
6230:       else {
6231:         sdy=(dep - top_meter_view)/depperpixsp + top_off_view;
6232:         XSetForeground(XtDisplay(drawingAreaView), gc_drawingAreaView,
6233:                      fgPixel[TIEPTSHIFT_COLOR]); 
6234:         XFillArc(XtDisplay(drawingAreaView), XtWindow(drawingAreaView), 
6235:                          gc_drawingAreaView, 
6236:                          sdx-(POINTSIZE/2), sdy-(POINTSIZE/2), 
6237:                          POINTSIZE, POINTSIZE, 0, 360*64);
6238:       }
6239:     }
6240: 
6241:     if(have_sp_tie1 == DO && have_sp_tie2 == DO){
6242: 
6243:       if(smooth.plot == SMOOTHED &&
6244:         (data[dset]->holes[spliceholenum]->core[splicecorenum]->smooth_status != SMOK ||
6245:         data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->smooth_status != SMOK) ) { 
6246:       }
6247:       else {
6248:         /*set color for tie line and draw it 
6249:         */ 
6250:         XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[TIELINE_COLOR]);
6251:         XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaView, sx, sy, sdx, sdy);
6252:       }
6253:     }
6254: 
6255:     if(have_splice_shift == DO){
6256:  
6257:       if(smooth.method == NONE){
6258:         sm = NO;
6259:       }  
6260:       else if((smooth.method == GAUSSIAN || smooth.method == OTHER) && 
6261:                smooth.plot == UNSMOOTHED){ 
6262:         sm = NO; 
6263:       } 
6264:       else if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
6265:               (smooth.plot == SMOOTHED || smooth.plot == SMOOTHEDBOTH) &&
6266:               (data[dset]->holes[spliceholenum]->core[splicecorenum]->smooth_status == SMOK)){
6267:         sm = YES;
6268:       }
6269:       else {
6270:         sm = NO;
6271:       }
6272:  
6273:       dum = -1;
6274:       err = CleanUpCore(dset, spliceholenum, splicecorenum, &n, sbd, dat, sm, &dum);
6275: 
6276:       if(n < 2 || err > 0) {
6277:       }  
6278:       else {
6279:         xoff = OFF + SPACE;
6280:         sx = (dat[0] - minvar)/varperpix + xoff;
6281:         sy = (sbd[0] - top_meter_view + splicedepoffset)/depperpixsp + top_off_view;
6282:         for(kk=1; kk<n; ++kk) {
6283:           sdx = (dat[kk] - minvar)/varperpix+xoff;
6284:           sdy = (sbd[kk] - top_meter_view + splicedepoffset)/depperpixsp + top_off_view;
6285:           if(sy > (int)win_height) {
6286:             break;
6287:           }
6288:           if(sy <= 0 && sdy <= 0) {  
6289:           } 
6290:           else {
6291:             if(sbd[kk] >= sbd[splicearraynum] - winlen && sbd[kk] <= sbd[splicearraynum] + winlen){
6292:               XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[OVERLAYINCORR_COLOR]);
6293:             }
6294:             else {
6295:               XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[OVERLAYOUTCORR_COLOR]);
6296:             }
6297:             if(sy < 0 && sdy > 0) {   
6298:               sx = sx + ((sdx - sx)/(sdy - sy)) * sdy;   
6299:               sy = 0;   
6300:             }
6301:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
6302:                         sx, sy, sdx, sdy);
6303:           }
6304:           sx = sdx;
6305:           sy = sdy;
6306:         }
6307:       }
6308:     }
6309:   }
6310: 
6311:   /* check to see if the splicer table has some values
6312:   */
6313:   if(spcomp.numcores == 0) {
6314:     if(splicertable.data_cnt > 0) {
6315:       XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[LABEL_COLOR]);
6316:       k = 0;
6317:       sy = OFF;
6318:       (void)sprintf(s, "missing ");
6319:       while(k <= splicertable.data_cnt-2) {
6320:         (void)sprintf(string, "%c%d ", splicertable.data[k].hole,
6321:                         splicertable.data[k].core);
6322:         strcat(s, string);
6323:         k = k + 2;
6324:       }
6325:       XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
6326:                               OFF * 2, sy, s, (int)strlen(s));
6327:     }
6328:   }
6329: 
6330:   if(have_strat == DO && have_splice == DO){
6331:      
6332:     /* for each file(strat type) find out what type it
6333:        is and set the color
6334:     */
6335:     for(ii=0; ii<strat_file_cnt; ++ii){
6336:       if(strat[ii]->type == PALEOMAG){
6337:         XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[PALEOMAG_COLOR]);
6338:       }  
6339:       else if(strat[ii]->type == DIATOMS){
6340:         XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[DIATOM_COLOR]);
6341:       }  
6342:       else if(strat[ii]->type == RADIOLARIA){
6343:         XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[RAD_COLOR]);
6344:       }  
6345:       else if(strat[ii]->type == FORAMINIFERA){
6346:         XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[FORAM_COLOR]);
6347:       }  
6348:       else if(strat[ii]->type == NANNOFOSSILS){
6349:         XSetForeground(XtDisplay(w), gc_drawingAreaView, fgPixel[NANNO_COLOR]);
6350:       }
6351:       for(jj=0; jj<strat[ii]->data_cnt; ++jj){
6352: 
6353:         /* find the hole current datum is in
6354:         */
6355:         for(i=0; i<data[dset]->numholes; ++i){
6356:          
6357:           foundtop = NO;
6358:           foundbot = NO;
6359:           depcull = NO;
6360:           if(data[dset]->holes[i]->name == strat[ii]->data[jj].top.hole){
6361:  
6362:             sx = OFF + SPACE + varaxislen * 2;
6363:  
6364:             /* find which cores the top and bottom
6365:                datums are in and set the depth offset for each
6366:                note that datum may not be in a drawn core so
6367:                will then need to use the  one above
6368:             */
6369:             if(strat[ii]->data[jj].top.core == data[dset]->holes[i]->core[0]->num){
6370:               topoffset = data[dset]->holes[i]->core[0]->cum_dep_offset;
6371:               foundtop = YES;
6372:             }
6373:             else if(data[dset]->holes[i]->numcores >= 2){
6374:               for(j=1; j<data[dset]->holes[i]->numcores; ++j){
6375:                 if(data[dset]->holes[i]->core[j]->value[0]->quality == BAD_CORE_NUM){
6376:                   depcull = YES;
6377:                   break;
6378:                 }
6379:                 else if(strat[ii]->data[jj].top.core == data[dset]->holes[i]->core[j]->num){
6380:                   topoffset = data[dset]->holes[i]->core[j]->cum_dep_offset;
6381:                   foundtop = YES;
6382:                   break;
6383:                 }
6384:                 else if(strat[ii]->data[jj].top.core < data[dset]->holes[i]->core[j]->num &&
6385:                         strat[ii]->data[jj].top.core > data[dset]->holes[i]->core[j-1]->num) {
6386:                   topoffset = data[dset]->holes[i]->core[j-1]->cum_dep_offset;
6387:                   foundtop = YES;
6388:                   break;
6389:                 }
6390:               }
6391:             }
6392:  
6393:             if(strat[ii]->data[jj].bot.core == data[dset]->holes[i]->core[1]->num){
6394:               botoffset = data[dset]->holes[i]->core[1]->cum_dep_offset;
6395:               foundbot = YES;
6396:             }
6397:             else if(data[dset]->holes[i]->numcores >= 2){
6398:               for(j=1; j<data[dset]->holes[i]->numcores; ++j){
6399:                 if(data[dset]->holes[i]->core[j]->value[0]->quality == BAD_CORE_NUM){
6400:                   depcull = YES;
6401:                   break;
6402:                 }
6403:                 else if(strat[ii]->data[jj].bot.core == data[dset]->holes[i]->core[j]->num){
6404:                   botoffset = data[dset]->holes[i]->core[j]->cum_dep_offset;
6405:                   foundbot = YES;
6406:                   break;
6407:                 }
6408:                 else if(strat[ii]->data[jj].bot.core < data[dset]->holes[i]->core[j]->num &&
6409:                         strat[ii]->data[jj].bot.core > data[dset]->holes[i]->core[j-1]->num) {
6410:                   botoffset = data[dset]->holes[i]->core[j-1]->cum_dep_offset;
6411:                   foundbot = YES;
6412:                   break;
6413:                 }
6414:               }
6415:             }
6416:             if(foundtop == YES && foundbot == YES) {
6417:               goto Jump_view;
6418:             }
6419:           }
6420:         }
6421: 
6422:         Jump_view:
6423:         /* draw and label
6424:         */
6425:         if((foundtop == NO && foundbot == NO && depcull == NO) ||
6426:            (foundtop == NO && depcull == NO) ||
6427:            (foundbot == NO && depcull == NO)) {
6428:           strat[ii]->data[jj].x_pix_loc_view = -1;
6429:           strat[ii]->data[jj].y_pix_loc_view = -1;
6430:         }
6431:         else if(depcull == NO){
6432:           sy = (strat[ii]->data[jj].top.sb_depth - top_meter_view + topoffset)/depperpix +
6433:                                                                               top_off_view;
6434:           sdy = (strat[ii]->data[jj].bot.sb_depth - top_meter_view + botoffset)/depperpix +
6435:                                                                               top_off_view;
6436:           if(sy > (int)win_height || sdy < 0) {
6437:             strat[ii]->data[jj].x_pix_loc_view = -1;
6438:             strat[ii]->data[jj].y_pix_loc_view = -1;
6439:           }
6440:           else {
6441:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
6442:                           sx-10-(ii*10)-3, sy, sx-10-(ii*10)+3, sy);
6443:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
6444:                           sx-10-(ii*10)-3, sdy, sx-10-(ii*10)+3, sdy);
6445:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
6446:                           sx-10-(ii*10), sy, sx-10-(ii*10), sdy);
6447:             (void)sprintf(s, "%s", strat[ii]->data[jj].code);
6448:             strat[ii]->data[jj].x_pix_loc_view = sx+1;
6449:             strat[ii]->data[jj].y_pix_loc_view = sy + (sdy-sy)/2;
6450:             XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaView,
6451:                      strat[ii]->data[jj].x_pix_loc_view, strat[ii]->data[jj].y_pix_loc_view, s, (int)strlen(s));
6452:           }
6453:         }
6454:       }
6455:     }
6456:   }  
6457:   else {
6458:   }
6459: 
6460:   if(clip == YES) {
6461:     /*for window managers sake, set the clip region back to entire window
6462:     */   
6463:     width = (int)win_width;
6464:     height = (int)win_height;
6465:     MakeClipMask(XtDisplay(w), gc_drawingAreaEdit, 0, 0, width, height);
6466:   }
6467: 
6468:   (void)sprintf(s, "");
6469:   (void)sprintf(string, "");
6470: }
6471: 
6472: /* ARGSUSED */
6473: void
6474: DrawingAreaEditScaleDrag(w, client, call)
6475: Widget w;
6476: XtPointer client;
6477: XtPointer call;
6478: {
6479:   /*SUPPRESS 594*/
6480: 
6481:   void DrawDrawingAreaEdit(), DisplaySliderControl();
6482: 
6483:   if(XmToggleButtonGetState(toggleButtonScaleDragYes) == True) {
6484:     if(XtIsManaged(XtParent(drawingAreaEdit))) {
6485:       XmScaleGetValue(drawingAreaEditScale, &last_scale_val_edit);
6486:       reason_for_redraw = DRAW_EVERYTHING;
6487:       DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
6488:       DisplaySliderControl(2);
6489:     }
6490:   }
6491: }
6492: 
6493: /* ARGSUSED */
6494: void
6495: DrawingAreaEditScaleChange(w, client, call)
6496: Widget w;
6497: XtPointer client;
6498: XtPointer call;
6499: {
6500:   /*SUPPRESS 594*/
6501: 
6502:   int scale;
6503:   void DrawDrawingAreaEdit(), DisplaySliderControl();
6504: 
6505:   XmScaleGetValue(drawingAreaEditScale, &scale);
6506:   if(XtIsManaged(XtParent(drawingAreaEdit))) {
6507:     if(scale != last_scale_val_edit) {
6508:       last_scale_val_edit = scale;
6509:       reason_for_redraw = DRAW_EVERYTHING;
6510:       DrawDrawingAreaEdit(drawingAreaEdit,(XtPointer)NULL, (XtPointer)NULL);
6511:     }
6512:     DisplaySliderControl(2);
6513:   }
6514: }
6515: 
6516: /* ARGSUSED */
6517: void
6518: DrawingAreaViewScaleDrag(w, client, call)
6519: Widget w;
6520: XtPointer client;
6521: XtPointer call;
6522: {
6523:   /*SUPPRESS 594*/
6524: 
6525:   void DrawDrawingAreaView(), DisplaySliderControl();
6526: 
6527:   if(XmToggleButtonGetState(toggleButtonScaleDragYes) == True) {
6528:     if(XtIsManaged(XtParent(drawingAreaView))) {
6529:       XmScaleGetValue(drawingAreaViewScale, &last_scale_val_view);
6530:       reason_for_redraw = DRAW_EVERYTHING;
6531:       DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
6532:       DisplaySliderControl(3);
6533:     }
6534:   }
6535: }
6536: 
6537: /* ARGSUSED */
6538: void
6539: DrawingAreaViewScaleChange(w, client, call)
6540: Widget w;
6541: XtPointer client;
6542: XtPointer call;
6543: {
6544:   /*SUPPRESS 594*/
6545: 
6546:   int scale;
6547:   void DrawDrawingAreaView(), DisplaySliderControl();
6548: 
6549:   XmScaleGetValue(drawingAreaViewScale, &scale);
6550:   if(XtIsManaged(XtParent(drawingAreaView))) {
6551:     if(scale != last_scale_val_view) {
6552:       last_scale_val_view = scale;
6553:       reason_for_redraw = DRAW_EVERYTHING;
6554:       DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
6555:     }
6556:     DisplaySliderControl(3);
6557:   }
6558: }
6559: 
6560: /* ARGSUSED */
6561: void
6562: TieShift(w, client, call)
6563: Widget w;
6564: XtPointer client;
6565: XtPointer call;
6566: {
6567:   /*SUPPRESS 594*/
6568: 
6569:   int i, j, k, h, c, f, d, found;
6570:   char string[200], date[200];
6571:   time_t tp;
6572:   String str;
6573:   XmString xmstring;
6574:   void DrawDrawingAreaDepthOffset(), DrawDrawingAreaEdit(), DrawDrawingAreaAgeDepth(), 
6575:        FindStratDepthOffset(), MapHoleToAffineTable(), MapCoreToAffineTable(), PlotSpliceVsAge();
6576: 
6577:   have_tie = DONT;
6578:   have_shift = DONT;
6579:   last_tie = NONE;
6580:   have_tie1 = DONT;
6581:   have_tie2 = DONT;
6582: 
6583:   /* make the correlate and shift buttons insensitive
6584:      and the undo button sensitive
6585:   */
6586:   XtSetSensitive(pushButtonTieCorrelation, False);
6587:   XtSetSensitive(pushButtonTieShift, False);
6588:   XtSetSensitive(pushButtonTieShiftUndo, True);
6589:   XtSetSensitive(toggleButtonTieUndoLast, True);
6590:   XmToggleButtonSetState(toggleButtonTieUndoLast, True, NULL);
6591:   XtSetSensitive(toggleButtonTieUndoAll, True);
6592:   XmToggleButtonSetState(toggleButtonTieUndoAll, False, NULL);
6593:   XtSetSensitive(pushButtonTieClear, FALSE);
6594:   XtSetSensitive(textFieldTieAdjustDepth, False);  
6595:   XtVaSetValues(textFieldTieAdjustDepth,XmNeditable, False, NULL);
6596:  
6597:   if(clip == YES) {
6598:     if(XtIsManaged(XtParent(drawingAreaEdit))) {
6599:       reason_for_redraw = DRAW_CLEARTIE;
6600:       DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
6601:     }
6602:   }
6603: 
6604:   /* check that core being depth adjusted is not a core
6605:      allready used in a spliced record
6606:   */
6607:   if(have_splice == DO){ 
6608:     if(data[dset]->holes[tie2holenum]->core[tie2corenum]->value[0]->sb_depth + data[dset]->holes[tie2holenum]->core[tie2corenum]->cum_dep_offset  < 
6609:        spcomp.sb_depth[spcomp.numcores - 1][spcomp.numpercore[spcomp.numcores - 1] - 1]){
6610:       (void)sprintf(buffer, "hole %c core %d is in the depth range of the splice. you can't depth adjustment it.",
6611:                    data[dset]->holes[tie2holenum]->name, data[dset]->holes[tie2holenum]->core[tie2corenum]->num);
6612:       SpManageWarningBox(buffer);
6613:       if(XtIsManaged(XtParent(drawingAreaEdit))) {
6614:         reason_for_redraw = DRAW_CLEARTIE;
6615:         DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL); 
6616:       }
6617:       return;
6618:     }  
6619:   }
6620: 
6621:   did_affine = YES;
6622:   have_affine = DO;
6623:   saved_affine = NO;
6624:   XtSetSensitive(pushButtonSaveAffine, True);
6625: 
6626:   /* write tie to  report  
6627:   */
6628:   if(time(&tp)) {
6629:     (void)sprintf(date, "%s", ctime(&tp));
6630:   }
6631:   else {
6632:     (void)sprintf(date, "no date available\n");
6633:   }
6634:   
6635:   (void)sprintf(buffer, "\nComposite;  hole %c core %d:    %s", 
6636:                   data[dset]->holes[tie2holenum]->name, data[dset]->holes[tie2holenum]->core[tie2corenum]->num, date);
6637:   SpUpdateReport(buffer);
6638:   (void)sprintf(buffer,"%d %d %c  %d %c %s %.1f %.1f  %.2f  tied to  %d %d %c  %d %c %s %.1f %.1f  %.2f\n",
6639:                        data[dset]->leg,
6640:                        data[dset]->site,
6641:                        data[dset]->holes[tie1holenum]->name,
6642:                        data[dset]->holes[tie1holenum]->core[tie1corenum]->num,
6643:                        data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->type,
6644:                        data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->section,
6645:                        data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->top_int,
6646:                        data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->bot_int,
6647:                        data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->sb_depth,
6648:                        data[dset]->leg,
6649:                        data[dset]->site,
6650:                        data[dset]->holes[tie2holenum]->name,
6651:                        data[dset]->holes[tie2holenum]->core[tie2corenum]->num,
6652:                        data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->type,
6653:                        data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->section,
6654:                        data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->top_int,
6655:                        data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->bot_int,
6656:                        data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->sb_depth);
6657:   SpUpdateReport(buffer);
6658: 
6659:   /* get the relative depth offset
6660:   */
6661:   if(XmToggleButtonGetState(toggleButtonTieShiftBestCorr) == True) {
6662:     lastdepoffset = corr.depoffset[best_corr_num]; 
6663:   }
6664:   else if(XmToggleButtonGetState(toggleButtonTieShiftTie) == True) {
6665:     lastdepoffset = tiedepoffset;
6666:   }
6667:   else if(XmToggleButtonGetState(toggleButtonTieShiftGiven) == True) {
6668:     str = XmTextGetString(textFieldTieAdjustDepth);
6669:     lastdepoffset = atof(str);
6670:     XtFree(str);
6671:   }
6672: 
6673:   /* if the core has previously been adjust, indicate this
6674:      with var lastdidoffsetstate.
6675:   */
6676:   if(data[dset]->holes[tie2holenum]->core[tie2corenum]->did_offset == YES) {
6677:     lastdidoffsetstate = YES;
6678:   }
6679:   else if(data[dset]->holes[tie2holenum]->core[tie2corenum]->did_offset == NO) {
6680:     lastdidoffsetstate = NO;
6681:     data[dset]->holes[tie2holenum]->core[tie2corenum]->did_offset = YES;
6682:   }
6683: 
6684:   /* add the offset to the affine table
6685:   */
6686:   lastaffinehole = data[dset]->holes[tie2holenum]->affine_map_to_hole;
6687:   lastaffinecore = data[dset]->holes[tie2holenum]->core[tie2corenum]->affine_map_to_core;
6688:   affinetable.hole[lastaffinehole].core[lastaffinecore].cum_depth_offset = 
6689:                                 data[dset]->holes[tie2holenum]->core[tie2corenum]->cum_dep_offset + lastdepoffset;
6690:   affinetable.hole[lastaffinehole].core[lastaffinecore].did_offset = YES;
6691: 
6692:   if(XmToggleButtonGetState(toggleButtonTieShiftAll) == True) {
6693:     lastshiftwho = ALLCORES;
6694:     if(lastaffinecore + 1 < affinetable.hole[lastaffinehole].numcore) {
6695:       for(j=lastaffinecore+1; j<affinetable.hole[lastaffinehole].numcore; ++j){
6696:         affinetable.hole[lastaffinehole].core[j].cum_depth_offset = 
6697:                                    affinetable.hole[lastaffinehole].core[j].cum_depth_offset + lastdepoffset;
6698:       }
6699:     }
6700:   }
6701:   else {
6702:     lastshiftwho = ONECORE;
6703:   }
6704: 
6705:   /* remap data to affine table
6706:   */
6707:   for(j=0; j<dataset_cnt; ++j) {
6708:     MapHoleToAffineTable(&affinetable, j);
6709:     MapCoreToAffineTable(&affinetable, j);
6710:   }
6711: 
6712:   /* change the strat data
6713:   */
6714:   if(have_strat == DO) {
6715:     FindStratDepthOffset();
6716:   }
6717: 
6718:   /* if have an age model redo age model mcd's and
6719:      rewrite the list.
6720:      redraw age drawing area's
6721:   */
6722:   if(agemodel_cnt > 0) {
6723:     XmListDeleteAllItems(listConstructAgeModel);
6724:     for(j=0; j<agemodel_cnt; ++j) {
6725:       found = -1;
6726:       if(agemodel[j].type == HANDPICK || agemodel[j].type == TIME) {
6727:         if(have_splice == DONT) {
6728:           (void)sprintf(buffer, "Warning: you do not have a splice table.\n");
6729:           (void)strcat(buffer,"Hand picked and tuned age model depths cannot be converted to correct mcd.\n");
6730:           (void)sprintf(string, "%7.2f  %7.2f   %7.3f    %s %s", agemodel[j].avembsf, agemodel[j].avemcd,
6731:                 agemodel[j].aveage, agemodel[j].name, agemodel[j].code);
6732:           (void)strcat(buffer, string);
6733:           found = -2;
6734:           SpManageWarningBox(buffer);
6735:         }
6736:         else {
6737:           k=0;
6738:           while(k<splicertable.data_cnt-1) {
6739:             if(agemodel[j].avembsf >= splicertable.data[k].mbsf && agemodel[j].avembsf <= splicertable.data[k+1].mbsf) {
6740:               found = k;
6741:               break;
6742:             }
6743:             k = k+2;
6744:           }
6745:         }
6746:         if(found < 0) {
6747:           if(found == -1) {
6748:             (void)sprintf(buffer, "Warning: The hand picked or tuned age does not fall within the splice.\n");
6749:             (void)strcat(buffer, "Cannot convert to correct mcd's.\n");
6750:             (void)sprintf(string, "%7.2f  %7.2f   %7.3f    %s %s", agemodel[j].avembsf, agemodel[j].avemcd,
6751:                 agemodel[j].aveage, agemodel[j].name, agemodel[j].code);
6752:             (void)strcat(buffer, string);
6753:             SpManageWarningBox(buffer);
6754:           }
6755:         }
6756:         else {
6757:           agemodel[j].avemcd = agemodel[j].avembsf + (splicertable.data[found].mcd - splicertable.data[found].mbsf);
6758:         }
6759:       }
6760:       else {
6761:         f = agemodel[j].agemodel_maptostratfile;
6762:         d = agemodel[j].agemodel_maptodatum;
6763:         if(f >= 0 && d >= 0) {
6764:           agemodel[j].avemcd = strat[f]->data[d].avemcd;
6765:         }
6766:         else {
6767:           (void)sprintf(buffer, "Warning: Cannot map age model datum to a strat datum. no way to assign new mcd.\n");
6768:           (void)sprintf(string, "%7.2f  %7.2f   %7.3f    %s %s", agemodel[j].avembsf, agemodel[j].avemcd,
6769:           agemodel[j].aveage, agemodel[j].name, agemodel[j].code);
6770:           (void)strcat(buffer, string);
6771:           SpManageWarningBox(buffer);
6772:         }
6773:       }
6774:       (void)sprintf(string, "%7.2f  %7.2f   %7.3f    %s %s", agemodel[j].avembsf, agemodel[j].avemcd,
6775:                 agemodel[j].aveage, agemodel[j].name, agemodel[j].code);
6776:       xmstring = XmStringCreateSimple(string);
6777:       XmListAddItemUnselected(listConstructAgeModel, xmstring, 0);
6778:       XmStringFree(xmstring);
6779:     }
6780:     if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
6781:       DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
6782:     }
6783:     PlotSpliceVsAge(NO);
6784:   }
6785: 
6786:   /* write the mcd for tie 2
6787:   */
6788:   (void)sprintf(string, "%.2f", data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->sb_depth +
6789:               data[dset]->holes[tie2holenum]->core[tie2corenum]->cum_dep_offset);
6790:   xmstring = XmStringCreateSimple(string);
6791:   XtVaSetValues(labelTie2sbd, XmNlabelString, xmstring, NULL);
6792:   XmStringFree(xmstring);
6793: 
6794:   /* set the toggles back to default settings
6795:   */
6796:   XmToggleButtonSetState(toggleButtonTieShiftBestCorr, True, NULL);
6797:   XmToggleButtonSetState(toggleButtonTieShiftTie, False, NULL);
6798:   XmToggleButtonSetState(toggleButtonTieShiftGiven, False, NULL);
6799:   XmToggleButtonSetState(toggleButtonTieShiftAll, True, NULL);
6800:   XmToggleButtonSetState(toggleButtonTieShiftCore, False, NULL);
6801:   XtSetSensitive(toggleButtonTieShiftBestCorr, False);
6802:   XtSetSensitive(toggleButtonTieShiftTie, False);
6803:   XtSetSensitive(toggleButtonTieShiftGiven, False);
6804:   XtSetSensitive(toggleButtonTieShiftAll, False);
6805:   XtSetSensitive(toggleButtonTieShiftCore, False);
6806: 
6807:    /*write the correlation and depth offset info to the report
6808:   */
6809:   if(XmToggleButtonGetState(toggleButtonTieShiftBestCorr) == True) {
6810:     if(XmToggleButtonGetState(toggleButtonTieShiftAll) == True) {
6811:       (void)sprintf(buffer, "Adjust to best correlation;  corr. coef. %.3f, depth offset: relative %.2fm, cumulative %.2fm ALL\n",
6812:                       corr.coef[dset][best_corr_num], lastdepoffset, data[dset]->holes[tie2holenum]->core[tie2corenum]->cum_dep_offset);
6813:     }
6814:     else {
6815:       (void)sprintf(buffer, "Adjust to best correlation;  corr. coef. %.3f, depth offset: relative %.2fm, cumulative %.2fm ONLY\n",
6816:                       corr.coef[dset][best_corr_num], lastdepoffset, data[dset]->holes[tie2holenum]->core[tie2corenum]->cum_dep_offset);
6817:     }
6818:   }
6819:   else if(XmToggleButtonGetState(toggleButtonTieShiftTie) == True) {
6820:     if(XmToggleButtonGetState(toggleButtonTieShiftAll) == True) {
6821:       (void)sprintf(buffer, "Adjust to tie;  corr. coef. %.3f, depth offset: relative %.2fm, cumulative %.2fm ALL\n",
6822:                       corr.coef[dset][corr.num_lead_lag[dset]/2 + 1], lastdepoffset, data[dset]->holes[tie2holenum]->core[tie2corenum]->cum_dep_offset);
6823:     }
6824:     else {
6825:       (void)sprintf(buffer, "Adjust to tie;  corr. coef. %.3f, depth offset: relative %.2fm, cumulative %.2fm ONLY\n",
6826:                       corr.coef[dset][corr.num_lead_lag[dset]/2 + 1], lastdepoffset, data[dset]->holes[tie2holenum]->core[tie2corenum]->cum_dep_offset);
6827:     }
6828:   }
6829:   else if(XmToggleButtonGetState(toggleButtonTieShiftGiven) == True) {
6830:     if(XmToggleButtonGetState(toggleButtonTieShiftAll) == True) {
6831:       (void)sprintf(buffer, "Adjust to given;  depth offset: relative %.2fm, cumulative %.2fm ALL\n", 
6832:                lastdepoffset, data[dset]->holes[tie2holenum]->core[tie2corenum]->cum_dep_offset);
6833:     }
6834:     else {
6835:       (void)sprintf(buffer, "Adjust to given;  depth offset: relative %.2fm, cumulative %.2fm ONLY\n", 
6836:                lastdepoffset, data[dset]->holes[tie2holenum]->core[tie2corenum]->cum_dep_offset);
6837:     }
6838:   }
6839:   SpUpdateReport(buffer);
6840: 
6841:   /* redraw the composite
6842:   */
6843:   if(XtIsManaged(XtParent(drawingAreaEdit))) {
6844:     reason_for_redraw = DRAW_DEPTHSHIFT;
6845:     DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
6846:   }
6847: 
6848:   /* draw the depth offsets
6849:   */
6850:   if(draw_offsets == YES){
6851:     if(XtIsManaged(XtParent(drawingAreaDepthOffset))) {
6852:       DrawDrawingAreaDepthOffset(drawingAreaDepthOffset, (XtPointer)NULL, (XtPointer)NULL);
6853:     }
6854:   }
6855: 
6856:   (void)sprintf(string, "");
6857:   (void)sprintf(date, "");
6858: }
6859: 
6860: 
6861: /* ARGSUSED */
6862: void
6863: TieHelp(w, client, call)
6864: Widget w;
6865: XtPointer client;
6866: XtPointer call;
6867: {
6868:   /*SUPPRESS 594*/
6869: }
6870: 
6871: /* ARGSUSED */
6872: void
6873: TieShiftUndo(w, client, call)
6874: Widget w;
6875: XtPointer client;
6876: XtPointer call;
6877: {
6878:   /*SUPPRESS 594*/
6879: 
6880:   int i, j;
6881:   char string[50], date[200];
6882:   time_t tp;
6883:   XmString xmstring;
6884:   void DrawDrawingAreaDepthOffset(), DrawDrawingAreaEdit(), FindStratDepthOffset(),
6885:        MapHoleToAffineTable(), MapCoreToAffineTable();
6886: 
6887:   have_tie = DONT;
6888:   have_shift = DONT;
6889:   have_corr = DONT;
6890: 
6891:   (void)sprintf(string, "");
6892:   xmstring = XmStringCreateSimple(string);
6893:   XtVaSetValues(labelTie1ID, XmNlabelString, xmstring, NULL);
6894:   XtVaSetValues(labelTie1var, XmNlabelString, xmstring, NULL);
6895:   XtVaSetValues(labelTie1sbd, XmNlabelString, xmstring, NULL);
6896:   XtVaSetValues(labelTie2ID, XmNlabelString, xmstring, NULL);
6897:   XtVaSetValues(labelTie2var, XmNlabelString, xmstring, NULL);
6898:   XtVaSetValues(labelTie2sbd, XmNlabelString, xmstring, NULL);
6899:   XmStringFree(xmstring);
6900:   XtVaSetValues(textFieldTieDepthStep, XmNvalue, string, NULL);
6901:   XtVaSetValues(textFieldTieAdjustDepth, XmNvalue, string, NULL);
6902: 
6903:   /* set all buttons except dismiss and tie insensitive
6904:   */
6905:   XtSetSensitive(pushButtonTieClear, FALSE);
6906:   XtSetSensitive(pushButtonTieCorrelation, FALSE);
6907:   XtSetSensitive(pushButtonTieShift, FALSE);
6908:   XtSetSensitive(pushButtonTieShiftUndo, FALSE);
6909:   XtSetSensitive(toggleButtonTieUndoLast, False);
6910:   XtSetSensitive(toggleButtonTieUndoAll, False);
6911: 
6912:   /* reset window length and leadlag back to defaults
6913:   */
6914:   (void)sprintf(string, "%.2f", WINLEN);
6915:   XtVaSetValues(textFieldTieWinLen, XmNvalue, string, NULL);
6916:   (void)sprintf(string, "%.2f", LEADLAG);
6917:   XtVaSetValues(textFieldTieLeadLag, XmNvalue, string, NULL);
6918: 
6919:   /* set the toggles back to defaults
6920:   */
6921:   XmToggleButtonSetState(toggleButtonTieShiftBestCorr, True, NULL);
6922:   XmToggleButtonSetState(toggleButtonTieShiftTie, False, NULL);
6923:   XmToggleButtonSetState(toggleButtonTieShiftGiven, False, NULL);
6924:   XmToggleButtonSetState(toggleButtonTieShiftAll, True, NULL);
6925:   XmToggleButtonSetState(toggleButtonTieShiftCore, False, NULL);
6926: 
6927:   if(XtIsManaged(XtParent(drawingAreaTieCorrelation))) {
6928:     XClearWindow(XtDisplay(drawingAreaTieCorrelation),
6929:                  XtWindow(drawingAreaTieCorrelation));
6930:   }
6931: 
6932:   /* make the undo button insensitive
6933:   */
6934:   XtSetSensitive(pushButtonTieShiftUndo, False);
6935:   XtSetSensitive(toggleButtonTieUndoLast, False);
6936:   XtSetSensitive(toggleButtonTieUndoAll, False);
6937: 
6938:   /* check that the array indicies for affine table are reasonable
6939:   */
6940:   if(lastaffinehole < 0 || lastaffinehole >= affinetable.numhole) {
6941:     (void)sprintf(buffer, "Warning; could not undo last depth adjust.");
6942:     SpManageWarningBox(buffer);
6943:     lastdidoffsetstate = NO;
6944:     lastshiftwho = NONE;
6945:     lastdepoffset = 0.0;
6946:     lastaffinehole = -1;
6947:     lastaffinecore = -1;
6948:     return;
6949:   }
6950:   if(lastaffinecore < 0 || lastaffinecore >= affinetable.hole[lastaffinehole].numcore) {
6951:     (void)sprintf(buffer, "Warning; could not undo last depth adjust.");
6952:     SpManageWarningBox(buffer);
6953:     lastdidoffsetstate = NO;
6954:     lastshiftwho = NONE;
6955:     lastdepoffset = 0.0;
6956:     lastaffinehole = -1;
6957:     lastaffinecore = -1;
6958:     return;
6959:   }
6960: 
6961:   /* Undo last Depth Adjust in affine table
6962:   */
6963:   if(XmToggleButtonGetState(toggleButtonTieUndoLast) == True) {
6964:     affinetable.hole[lastaffinehole].core[lastaffinecore].cum_depth_offset =
6965:               affinetable.hole[lastaffinehole].core[lastaffinecore].cum_depth_offset - lastdepoffset;
6966:     if(lastdidoffsetstate == NO) {
6967:       affinetable.hole[lastaffinehole].core[lastaffinecore].did_offset = NO;
6968:     }
6969:   }
6970:   else if(XmToggleButtonGetState(toggleButtonTieUndoAll) == True) {
6971:     if(lastaffinecore == 0) {
6972:       affinetable.hole[lastaffinehole].core[lastaffinecore].cum_depth_offset = 0.0; 
6973:     }
6974:     else {
6975:       affinetable.hole[lastaffinehole].core[lastaffinecore].cum_depth_offset =
6976:             affinetable.hole[lastaffinehole].core[lastaffinecore-1].cum_depth_offset;
6977:     }
6978:     affinetable.hole[lastaffinehole].core[lastaffinecore].did_offset = NO;
6979:   }
6980: 
6981:   if(lastshiftwho == ALLCORES) {
6982:     for(j=lastaffinecore+1; j<affinetable.hole[lastaffinehole].numcore; ++j){
6983:       if(XmToggleButtonGetState(toggleButtonTieUndoLast) == True) {
6984:         affinetable.hole[lastaffinehole].core[j].cum_depth_offset =
6985:                   affinetable.hole[lastaffinehole].core[j].cum_depth_offset - lastdepoffset;
6986:       }
6987:       else if(XmToggleButtonGetState(toggleButtonTieUndoAll) == True) {
6988:         affinetable.hole[lastaffinehole].core[j].cum_depth_offset =
6989:                  affinetable.hole[lastaffinehole].core[lastaffinecore].cum_depth_offset;
6990:         affinetable.hole[lastaffinehole].core[lastaffinecore].did_offset = NO;
6991:       }
6992:     }
6993:   }
6994: 
6995:   /*remap the data sets to affine table
6996:   */
6997:   for(i=0; i<dataset_cnt; ++i) {
6998:     MapHoleToAffineTable(&affinetable, i);
6999:     MapCoreToAffineTable(&affinetable, i);
7000:   }
7001: 
7002:   if(have_strat == DO) {
7003:     FindStratDepthOffset();
7004:   }
7005: 
7006:   if(XtIsManaged(XtParent(drawingAreaEdit))) {
7007:     reason_for_redraw = DRAW_DEPTHSHIFTUNDO;
7008:     DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
7009:   }
7010: 
7011:   /* report to report
7012:   */
7013:   /* write tie to  report
7014:   */
7015:   if(time(&tp)) {
7016:     (void)sprintf(date, "%s", ctime(&tp));
7017:   }
7018:   else {
7019:     (void)sprintf(date, "no date available\n");
7020:   }
7021:   (void)sprintf(buffer, "\nComposite:  hole %s core %d;  UNDONE    %s", 
7022:      affinetable.hole[lastaffinehole].name, affinetable.hole[lastaffinehole].core[lastaffinecore].name,date);
7023:   SpUpdateReport(buffer);
7024: 
7025:   if(draw_offsets == YES){ 
7026:     if(XtIsManaged(XtParent(drawingAreaDepthOffset))) {
7027:       DrawDrawingAreaDepthOffset(drawingAreaDepthOffset, (XtPointer)NULL, (XtPointer)NULL);
7028:     }
7029:   }
7030: 
7031:   lastdidoffsetstate = NO;
7032:   lastshiftwho = NONE;
7033:   lastdepoffset = 0.0;
7034:   lastaffinehole = -1;
7035:   lastaffinecore = -1;
7036:   (void)sprintf(string, "");
7037:   (void)sprintf(date, "");
7038: }
7039: 
7040: 
7041: /* ARGSUSED */
7042: void
7043: DrawDrawingAreaCompCorrelation(w, client, call)
7044: Widget w;
7045: XtPointer client;
7046: XtPointer call;
7047: {
7048:   /*SUPPRESS 594*/
7049: 
7050:   int i, j, d, nlagtic, sx, sy, sdx, sdy,
7051:       xaxispixlen, yaxispixlen, err1, err2, tie, coren, coreoffset, nwin;
7052:   char s[50];
7053:   String str;
7054:   float lagtic, maxlag, coredep[MAXPERCORE], corevar[MAXPERCORE];
7055:   double fract, check, ip, std, std1, std2, dum;
7056:   Dimension win_height, win_width;
7057:   XGCValues gcValues;
7058:   void AxisCorr();
7059:   int XAxisDepthCorrSetup();
7060: 
7061:   XClearWindow(XtDisplay(w), XtWindow(w));
7062:   XtVaGetValues(w, XmNheight, &win_height, XmNwidth, &win_width, NULL);
7063: 
7064:   /*calc. the length of the y axis and the half length
7065:     of the x axis. adjust the length of x axis if its
7066:     total length is not divisable by ten
7067:   */
7068:   xaxispixlen = ((int)win_width - (2 * SPACE))/2;
7069:   yaxispixlen = ((int)win_height - (2 * SPACE));
7070: 
7071:   if(have_spcorr == DO && lead_lag > 0){
7072:     check = yaxispixlen;
7073:     fract = modf((check/10.0), &ip);
7074:     if(fract == 0.0){
7075:     }
7076:     else if(fract < 0.5){
7077:       yaxispixlen = ip * 10.0;
7078:     }
7079:     else {
7080:       yaxispixlen = (ip * 10.0) + 10.0;
7081:     }
7082:     check = yaxispixlen;
7083:     if((corrperpix = 2.0/check) <= 0) {
7084:       return;
7085:     }
7086: 
7087:     /* x=lead-lag axis
7088:     */
7089:     if((err1 = XAxisDepthCorrSetup(lead_lag, depstep, &xaxispixlen, &lagtic, &nlagtic, &lagperpix, &maxlag)) != 0) {
7090:       return;
7091:     }
7092: 
7093:     /* set axis and label color
7094:     */
7095:     XSetForeground(XtDisplay(w), gc_drawingAreaSpliceCorrelation,
7096:                    fgPixel[LABEL_COLOR]);
7097:     AxisCorr(XtDisplay(w), XtWindow(w), gc_drawingAreaSpliceCorrelation,
7098:                        lagtic, nlagtic, maxlag, yaxispixlen, xaxispixlen, 1);
7099: 
7100:     /* set corr. coef. color and draw it
7101:     */
7102:     XSetForeground(XtDisplay(w), gc_drawingAreaSpliceCorrelation,
7103:                    fgPixel[CORRCOEF_COLOR]);
7104:     gcValues.line_width = 2;
7105:     XChangeGC(XtDisplay(w), gc_drawingAreaSpliceCorrelation, GCLineWidth, &gcValues);
7106:     for(i=0; i<corr.num_lead_lag[dset]-1; ++i){
7107:       sx = (corr.depleadlag[dset][i]/lagperpix) + SPACE + xaxispixlen;
7108:       sy = -1.0 * (corr.coef[dset][i]/corrperpix) + SPACE + yaxispixlen/2;
7109:       sdx = (corr.depleadlag[dset][i+1]/lagperpix) + SPACE + xaxispixlen;
7110:       sdy = -1.0 * (corr.coef[dset][i+1]/corrperpix) + SPACE + yaxispixlen/2;
7111:       XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaSpliceCorrelation,
7112:                       sx, sy, sdx, sdy);
7113:       if(i == best_corr_num || i+1 == best_corr_num){
7114:         XSetForeground(XtDisplay(w), gc_drawingAreaSpliceCorrelation,
7115:                    fgPixel[BESTCORR_COLOR]);
7116:         if(i == best_corr_num){
7117:           XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaSpliceCorrelation,
7118:                            sx, (SPACE + yaxispixlen/2) - 5, sx, (SPACE + yaxispixlen/2) + 5);
7119:         }
7120:         else if(i+1 == best_corr_num){
7121:           XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaSpliceCorrelation,
7122:                            sdx, (SPACE + yaxispixlen/2) - 5, sdx, (SPACE + yaxispixlen/2) + 5);
7123:         }
7124:         XSetForeground(XtDisplay(w), gc_drawingAreaSpliceCorrelation,
7125:                    fgPixel[CORRCOEF_COLOR]);
7126:       }
7127:     }
7128:     gcValues.line_width = 0;
7129:     XChangeGC(XtDisplay(w), gc_drawingAreaSpliceCorrelation, GCLineWidth, &gcValues);
7130:     if(dataset_cnt > 1) {
7131:       XSetForeground(XtDisplay(w), gc_drawingAreaTieCorrelation,
7132:                    fgPixel[OVERLAYOUTCORR_COLOR]);
7133:       for(d=0; d<dataset_cnt; ++d) {
7134:         if(d != dset) {
7135:           for(i=0; i<corr.num_lead_lag[d]-1; ++i){
7136:             sx=(corr.depleadlag[d][i]/lagperpix) + SPACE + xaxispixlen;
7137:             sy= -1.0 * (corr.coef[d][i]/corrperpix) + SPACE + yaxispixlen/2;
7138:             sdx=(corr.depleadlag[d][i+1]/lagperpix) + SPACE + xaxispixlen;
7139:             sdy= -1.0 * (corr.coef[d][i+1]/corrperpix) + SPACE + yaxispixlen/2;
7140:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaTieCorrelation,
7141:                            sx, sy, sdx, sdy);
7142:           }
7143:         }
7144:       }
7145:     }
7146: 
7147:     /* check to see if the tie is the best correlation and if the value difference
7148:        at the tie is within CHECKVALUEDIFF fraction of the standard deviation
7149:        only do this if are splicing constrained
7150:     */
7151:     if(are_splicing == CONSTRAINED) {
7152:       tie = splicearraynum;
7153:       err1 = CleanUpCore(dset, spliceholenum, splicecorenum, &coren, coredep, corevar, NO, &tie);
7154:       if(err1 != 0) {
7155:         return;
7156:       }
7157:       str = XmTextGetString(textCompWindowLen);
7158:       winlen = atof(str);
7159:       XtFree(str);
7160:       if(winlen > 0.0) {
7161:         for(i=0; i<coren; ++i){
7162:           if(coredep[i] >= coredep[tie] - winlen){
7163:             coreoffset=i;
7164:             break;
7165:           }  
7166:         }   
7167:         nwin=0;
7168:         for(j=i; j<coren; ++j){
7169:           if(coredep[j] > coredep[tie] + winlen){
7170:             break;
7171:           }  
7172:           else {
7173:             ++nwin;
7174:           }  
7175:         }   
7176:       }      
7177:       else {
7178:         coreoffset = 0;
7179:         nwin = coren;
7180:       }
7181:       err1 = StdDev(corevar, coren, coreoffset, nwin, &std1, &dum);
7182: 
7183:       if(winlen > 0.0) { 
7184:         for(i=0; i<spcomp.numpercore[spcompcorenum]; ++i){ 
7185:           if(spcomp.sb_depth[spcompcorenum][i] >= spcomp.sb_depth[spcompcorenum][spcomparraynum] - winlen){ 
7186:             coreoffset=i; 
7187:             break; 
7188:           }      
7189:         }    
7190:         nwin=0; 
7191:         for(j=i; j<spcomp.numpercore[spcompcorenum]; ++j){ 
7192:           if(spcomp.sb_depth[spcompcorenum][j] > spcomp.sb_depth[spcompcorenum][spcomparraynum] + winlen){ 
7193:             break; 
7194:           }      
7195:           else { 
7196:             ++nwin;  
7197:           }   
7198:         }    
7199:       }       
7200:       else { 
7201:         coreoffset = 0;  
7202:         nwin = spcomp.numpercore[spcompcorenum]; 
7203:       }
7204:       err2 = StdDev(spcomp.var[spcompcorenum], spcomp.numpercore[spcompcorenum], coreoffset, nwin, &std2, &dum);
7205: 
7206:       if(err1 == 0 && err2 == 0) {
7207:         std = (std1 + std2)/2.0;
7208:         if(fabs(interpsplice_val - spcomp.var[spcompcorenum][spcomparraynum]) <=
7209:            (std * CHECKVALUEDIFF) && best_corr_num == (corr.num_lead_lag[dset] - 1)/2) {
7210:           XSetForeground(XtDisplay(w), gc_drawingAreaSpliceCorrelation,
7211:                    fgPixel[BESTCORR_COLOR]);
7212:           if(splice_how == REAL) {
7213:             (void)sprintf(s, "This is a good tie!");
7214:           }
7215:           else if(splice_how == INTERPOLATED) {
7216:             (void)sprintf(s, "This is a good interpolated tie!");
7217:           }
7218:           XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaSpliceCorrelation,
7219:                         SPACE, win_height-SPACE + 15, s, (int)strlen(s));
7220:           XSetForeground(XtDisplay(w), gc_drawingAreaSpliceCorrelation,
7221:                    fgPixel[CORRCOEF_COLOR]);
7222:         }
7223:       }
7224:     }
7225: 
7226:   } 
7227:   else {
7228:   }
7229: 
7230:   (void)sprintf(s, "");
7231: }
7232: 
7233: 
7234: /* ARGSUSED */
7235: void
7236: TieDismiss(w, client, call)
7237: Widget w;
7238: XtPointer client;
7239: XtPointer call;
7240: {
7241:   /*SUPPRESS 594*/
7242: 
7243:   void DrawDrawingAreaEdit();
7244: 
7245:   have_corr = DONT;
7246:   have_tie = DONT; 
7247:   have_shift = DONT; 
7248:   last_tie = NONE;
7249:   are_compositing = NO;
7250: 
7251:   XtVaSetValues(textFieldTieAdjustDepth, XmNvalue, " ", NULL);
7252:   if(XtIsManaged(XtParent(drawingAreaTieCorrelation))) { 
7253:     XClearWindow(XtDisplay(drawingAreaTieCorrelation), XtWindow(drawingAreaTieCorrelation));
7254:   }
7255:   if(XtIsManaged(XtParent(drawingAreaEdit))) {
7256:     if(have_tie1 == DO || have_tie2 == DO) {
7257:       have_tie1 = DONT;
7258:       have_tie2 = DONT;
7259:       reason_for_redraw = DRAW_CLEARTIE;
7260:       DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
7261:     }
7262:   }
7263:   XtUnmanageChild(formTie); 
7264: }
7265: 
7266: 
7267: /* ARGSUSED */
7268: void
7269: CustomDisplay(w, client, call)
7270: Widget w;
7271: XtPointer client;
7272: XtPointer call;
7273: {
7274: 
7275:   if(smooth.method == NONE){
7276:     XmToggleButtonSetState(toggleButtonPlotUnsmooth, True);
7277:     XmToggleButtonSetState(toggleButtonPlotSmooth, False);
7278:     XmToggleButtonSetState(toggleButtonPlotBoth, False);
7279:   }
7280:   else {
7281:     if(smooth.plot == UNSMOOTHED) {
7282:       XmToggleButtonSetState(toggleButtonPlotUnsmooth, True);
7283:       XmToggleButtonSetState(toggleButtonPlotSmooth, False);
7284:       XmToggleButtonSetState(toggleButtonPlotBoth, False);
7285:     }
7286:     else if(smooth.plot == SMOOTHED) {
7287:       XmToggleButtonSetState(toggleButtonPlotUnsmooth, False);
7288:       XmToggleButtonSetState(toggleButtonPlotSmooth, True);
7289:       XmToggleButtonSetState(toggleButtonPlotBoth, False);
7290:     }
7291:     else if(smooth.plot == SMOOTHEDBOTH) {
7292:       XmToggleButtonSetState(toggleButtonPlotUnsmooth, False);
7293:       XmToggleButtonSetState(toggleButtonPlotSmooth, False);
7294:       XmToggleButtonSetState(toggleButtonPlotBoth, True);
7295:     }
7296:   }
7297:   
7298:   if(have_data == DONT) {
7299:     XtSetSensitive(toggleButtonPlotSmooth, False);
7300:     XtSetSensitive(toggleButtonPlotUnsmooth, False);
7301:     XtSetSensitive(toggleButtonPlotBoth, False);
7302:     XtSetSensitive(labelVarAxisLen, False);
7303:     XtSetSensitive(labelVarMin, False);
7304:     XtSetSensitive(labelVarMax, False);
7305:     XtSetSensitive(textVarAxisLen, False);
7306:     XtSetSensitive(textVarMin, False);
7307:     XtSetSensitive(textVarMax, False);
7308:   }
7309:   else if(have_data == DO) {
7310:     XtSetSensitive(toggleButtonPlotSmooth, True);
7311:     XtSetSensitive(toggleButtonPlotUnsmooth, True);
7312:     XtSetSensitive(toggleButtonPlotBoth, True);
7313:     XtSetSensitive(labelVarAxisLen, True);
7314:     XtSetSensitive(labelVarMin, True);
7315:     XtSetSensitive(labelVarMax, True);
7316:     XtSetSensitive(textVarAxisLen, True);
7317:     XtSetSensitive(textVarMin, True);
7318:     XtSetSensitive(textVarMax, True);
7319:   }
7320: 
7321:   XtManageChild(form);
7322:   XtPopup(XtParent(form),XtGrabNone);
7323: }
7324: 
7325: /* ARGSUSED */
7326: void
7327: Composite(w, client, call)
7328: Widget w;
7329: XtPointer client;
7330: XtPointer call;
7331: {
7332:   /*SUPPRESS 594*/
7333: 
7334:   char string[50];
7335:   XmString xmstring;
7336: 
7337:   have_corr = DONT;
7338:   have_shift = DONT;
7339:   have_tie = DONT;
7340:   last_tie = NONE;
7341:   have_tie1 = DONT;
7342:   have_tie2 = DONT;
7343: 
7344:   clip_x = 0; 
7345:   clip_y = 0;  
7346:   clip_width = 0;  
7347:   clip_height = 0;
7348: 
7349:   if(have_data == DO && data[dset]->numholes >= 2) {
7350:     are_compositing = YES;
7351:     XtSetSensitive(pushButtonSaveAffine,True);
7352:   }
7353:   else {
7354:     are_compositing = NO;
7355:   }
7356: 
7357:   /* set the window length and  lead,lag to the defaults
7358:   */
7359:   (void)sprintf(string, "%.2f", WINLEN);
7360:   XtVaSetValues(textFieldTieWinLen, XmNvalue, string, NULL);
7361:   (void)sprintf(string, "%.2f", LEADLAG);
7362:   XtVaSetValues(textFieldTieLeadLag, XmNvalue, string, NULL);
7363: 
7364:   /* make sure the ties, depth step and adjust depth text
7365:      is clear
7366:   */
7367:   (void)sprintf(string, "");
7368:   xmstring = XmStringCreateSimple(string);
7369:   XtVaSetValues(labelTie1ID, XmNlabelString, xmstring, NULL);
7370:   XtVaSetValues(labelTie1var, XmNlabelString, xmstring, NULL);
7371:   XtVaSetValues(labelTie1sbd, XmNlabelString, xmstring, NULL);
7372:   XtVaSetValues(labelTie2ID, XmNlabelString, xmstring, NULL);
7373:   XtVaSetValues(labelTie2var, XmNlabelString, xmstring, NULL);
7374:   XtVaSetValues(labelTie2sbd, XmNlabelString, xmstring, NULL);
7375:   XmStringFree(xmstring);
7376:   XtVaSetValues(textFieldTieDepthStep, XmNvalue, string, NULL);
7377:   XtVaSetValues(textFieldTieAdjustDepth, XmNvalue, string, NULL);
7378: 
7379:   /* set the defaults toggles on
7380:   */
7381:   XmToggleButtonSetState(toggleButtonTieShiftBestCorr, True, NULL);
7382:   XmToggleButtonSetState(toggleButtonTieShiftTie, False, NULL);
7383:   XmToggleButtonSetState(toggleButtonTieShiftGiven, False, NULL);
7384:  
7385:   XmToggleButtonSetState(toggleButtonTieShiftAll, True, NULL);
7386:   XmToggleButtonSetState(toggleButtonTieShiftCore, False, NULL);
7387: 
7388:   /* set all buttons and adjust depth text insensitive
7389:   */
7390:   if(have_data == DO && data[dset]->numholes < 2){
7391:     (void)sprintf(buffer, "can't composite when there is only one hole");
7392:     SpManageWarningBox(buffer);
7393:   }
7394:   XtSetSensitive(pushButtonTieClear, FALSE);
7395:   XtSetSensitive(pushButtonTieCorrelation, FALSE);
7396:   XtSetSensitive(pushButtonTieShift, FALSE);
7397:   XtVaSetValues(pushButtonTieShift, XmNborderWidth, 1, NULL);
7398:   XtSetSensitive(pushButtonTieShiftUndo, FALSE);
7399:   XtSetSensitive(toggleButtonTieUndoLast, False);
7400:   XmToggleButtonSetState(toggleButtonTieUndoLast, True, NULL);
7401:   XtSetSensitive(toggleButtonTieUndoAll, False);
7402:   XtSetSensitive(textFieldTieAdjustDepth, False);
7403:   XtSetSensitive(toggleButtonTieShiftBestCorr, False);
7404:   XtSetSensitive(toggleButtonTieShiftTie, False);
7405:   XtSetSensitive(toggleButtonTieShiftGiven, False);
7406:   XtSetSensitive(toggleButtonTieShiftAll, False);
7407:   XtSetSensitive(toggleButtonTieShiftCore, False);
7408: 
7409:   XtManageChild(formTie);
7410: 
7411:   XtPopup(XtParent(formTie),XtGrabNone);
7412:   PlaceDialog(formTie, TOPRIGHT);
7413:   (void)sprintf(string, "");
7414: }
7415: 
7416: /* ARGSUSED */
7417: void
7418: TieShiftCore(w, client, call)
7419: Widget w;
7420: XtPointer client;
7421: XtPointer call;
7422: {
7423:   /*SUPPRESS 594*/
7424: }
7425: 
7426: /* ARGSUSED */
7427: void
7428: DrawDrawingAreaTieCorrelation(w, client, call)
7429: Widget w;
7430: XtPointer client;
7431: XtPointer call;
7432: {
7433:   /*SUPPRESS 594*/
7434: 
7435:   int i, d, nlagtic, sx, sy, sdx, sdy, xaxispixlen, yaxispixlen, err; 
7436:   float lagtic, maxlag;
7437:   double fract, check, ip;
7438:   Dimension win_height, win_width;
7439:   XGCValues gcValues;
7440:   void AxisCorr();
7441:   int XAxisDepthCorrSetup();
7442: 
7443:   XClearWindow(XtDisplay(w), XtWindow(w));
7444: 
7445:   XtVaGetValues(w, XmNheight, &win_height, XmNwidth, &win_width, NULL);
7446:   xaxispixlen = ((int)win_width - (2 * SPACE))/2;
7447:   yaxispixlen = ((int)win_height - (2 * SPACE));
7448: 
7449:   if(have_corr == DO && lead_lag > 0) {
7450: 
7451:     /*calc. the length of the y axis and the half length 
7452:       of the x axis. adjust the length of x axis if its
7453:       total length is not divisable by ten
7454:     */
7455:     /* y=corr.coef. axis
7456:     */
7457:     check = yaxispixlen; 
7458:     fract = modf((check/5.0), &ip); 
7459:     if(fract == 0.0){    
7460:     }   
7461:     else if(fract < 0.5){  
7462:       yaxispixlen = ip * 5.0; 
7463:     }   
7464:     else { 
7465:       yaxispixlen = (ip * 5.0) + 5.0; 
7466:     }
7467:     check = yaxispixlen;
7468:     if((corrperpix = 2.0/check) <= 0) {
7469:       return;
7470:     }
7471: 
7472:     /* x=lead-lag axis
7473:     */
7474:     if((err = XAxisDepthCorrSetup(lead_lag, depstep, &xaxispixlen, &lagtic, &nlagtic, &lagperpix, &maxlag)) != 0) {
7475:       return;
7476:     }
7477: 
7478:     /*set the axis and label color
7479:     */
7480:     XSetForeground(XtDisplay(w), gc_drawingAreaTieCorrelation, 
7481:                    fgPixel[LABEL_COLOR]);
7482:     AxisCorr(XtDisplay(w), XtWindow(w), gc_drawingAreaTieCorrelation,
7483:                        lagtic, nlagtic, maxlag, yaxispixlen, xaxispixlen, 1);
7484: 
7485:     /*set the corr. coef. color 
7486:     */ 
7487:     XSetForeground(XtDisplay(w), gc_drawingAreaTieCorrelation, 
7488:                    fgPixel[CORRCOEF_COLOR]);
7489:     gcValues.line_width = 2;
7490:     XChangeGC(XtDisplay(w), gc_drawingAreaTieCorrelation, GCLineWidth, &gcValues);
7491:     for(i=0; i<corr.num_lead_lag[dset]-1; ++i){
7492:       sx=(corr.depleadlag[dset][i]/lagperpix) + SPACE + xaxispixlen;
7493:       sy= -1.0 * (corr.coef[dset][i]/corrperpix) + SPACE + yaxispixlen/2;
7494:       sdx=(corr.depleadlag[dset][i+1]/lagperpix) + SPACE + xaxispixlen;
7495:       sdy= -1.0 * (corr.coef[dset][i+1]/corrperpix) + SPACE + yaxispixlen/2;
7496:       XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaTieCorrelation,
7497:                            sx, sy, sdx, sdy);
7498:       if(i == best_corr_num || i+1 == best_corr_num){
7499:         XSetForeground(XtDisplay(w), gc_drawingAreaTieCorrelation,
7500:                    fgPixel[BESTCORR_COLOR]);
7501:         if(i == best_corr_num){
7502:           XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaTieCorrelation,
7503:                            sx, (SPACE + yaxispixlen/2) - 5, sx, (SPACE + yaxispixlen/2) + 5);
7504:         } 
7505:         else if(i+1 == best_corr_num){
7506:           XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaTieCorrelation, 
7507:                            sdx, (SPACE + yaxispixlen/2) - 5, sdx, (SPACE + yaxispixlen/2) + 5); 
7508:         }
7509:         XSetForeground(XtDisplay(w), gc_drawingAreaTieCorrelation,
7510:                    fgPixel[CORRCOEF_COLOR]);
7511:       }
7512:     }
7513:     gcValues.line_width = 0;
7514:     XChangeGC(XtDisplay(w), gc_drawingAreaTieCorrelation, GCLineWidth, &gcValues);
7515:     if(dataset_cnt > 1) {
7516:       XSetForeground(XtDisplay(w), gc_drawingAreaTieCorrelation,
7517:                    fgPixel[OVERLAYOUTCORR_COLOR]);
7518:       for(d=0; d<dataset_cnt; ++d) {
7519:         if(d != dset) {
7520:           for(i=0; i<corr.num_lead_lag[d]-1; ++i){
7521:             sx=(corr.depleadlag[d][i]/lagperpix) + SPACE + xaxispixlen;
7522:             sy= -1.0 * (corr.coef[d][i]/corrperpix) + SPACE + yaxispixlen/2;
7523:             sdx=(corr.depleadlag[d][i+1]/lagperpix) + SPACE + xaxispixlen;
7524:             sdy= -1.0 * (corr.coef[d][i+1]/corrperpix) + SPACE + yaxispixlen/2;
7525:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaTieCorrelation,
7526:                            sx, sy, sdx, sdy);
7527:           }
7528:         }
7529:       }
7530:     }
7531:   }  
7532:   else {
7533:   }
7534: }
7535: 
7536: /* ARGSUSED */
7537: void
7538: TieShiftAll(w, client, call)
7539: Widget w;
7540: XtPointer client;
7541: XtPointer call;
7542: {
7543:   /*SUPPRESS 594*/
7544: }
7545: 
7546: /* ARGSUSED */
7547: void
7548: TieShiftToBestCorr(w, client, call)
7549: Widget w;
7550: XtPointer client;
7551: XtPointer call;
7552: {
7553:   /*SUPPRESS 594*/
7554: 
7555:   char string[50];
7556: 
7557:   XtSetSensitive(textFieldTieAdjustDepth, True);  
7558:   XtVaSetValues(textFieldTieAdjustDepth,XmNeditable, False, NULL);
7559:   (void)sprintf(string, "%.2f", corr.depoffset[best_corr_num]);
7560:   XtVaSetValues(textFieldTieAdjustDepth, XmNvalue, string, NULL);
7561: 
7562:   (void)sprintf(string, "");
7563: }
7564: 
7565: /* ARGSUSED */
7566: void
7567: TieShiftToTie(w, client, call)
7568: Widget w;
7569: XtPointer client;
7570: XtPointer call;
7571: {
7572:   /*SUPPRESS 594*/
7573: 
7574:   char string[50]; 
7575:  
7576:   XtSetSensitive(textFieldTieAdjustDepth, True); 
7577:   XtVaSetValues(textFieldTieAdjustDepth,XmNeditable, False, NULL);
7578:   (void)sprintf(string, "%.2f", tiedepoffset); 
7579:   XtVaSetValues(textFieldTieAdjustDepth, XmNvalue, string, NULL); 
7580: 
7581:   (void)sprintf(string, "");
7582: }
7583: 
7584: /* ARGSUSED */
7585: void
7586: TieShiftToGiven(w, client, call)
7587: Widget w;
7588: XtPointer client;
7589: XtPointer call;
7590: {
7591:   /*SUPPRESS 594*/
7592: 
7593:   char string[50];
7594: 
7595:   (void)sprintf(string, "");
7596:   XtSetSensitive(textFieldTieAdjustDepth, True);
7597:   XtVaSetValues(textFieldTieAdjustDepth,XmNeditable, True, NULL);
7598:   XtVaSetValues(textFieldTieAdjustDepth, XmNvalue, string, NULL);
7599: 
7600:   (void)sprintf(string, "");
7601: }
7602: 
7603: /* ARGSUSED */
7604: void
7605: TieClear(w, client, call)
7606: Widget w;
7607: XtPointer client;
7608: XtPointer call;
7609: {
7610:   /*SUPPRESS 594*/
7611: 
7612:   char string[50];
7613:   XmString xmstring;
7614:   void DrawDrawingAreaEdit();
7615: 
7616:   have_tie = DONT;
7617:   have_shift = DONT;
7618:   have_corr = DONT;
7619:   last_tie = NONE;
7620:   have_tie1 = DONT;
7621:   have_tie2 = DONT;
7622: 
7623:   (void)sprintf(string, "");
7624:   xmstring = XmStringCreateSimple(string);
7625:   XtVaSetValues(labelTie1ID, XmNlabelString, xmstring, NULL);
7626:   XtVaSetValues(labelTie1var, XmNlabelString, xmstring, NULL);
7627:   XtVaSetValues(labelTie1sbd, XmNlabelString, xmstring, NULL);
7628:   XtVaSetValues(labelTie2ID, XmNlabelString, xmstring, NULL);
7629:   XtVaSetValues(labelTie2var, XmNlabelString, xmstring, NULL);
7630:   XtVaSetValues(labelTie2sbd, XmNlabelString, xmstring, NULL);
7631:   XmStringFree(xmstring);
7632:   XtVaSetValues(textFieldTieDepthStep, XmNvalue, string, NULL);
7633:   XtVaSetValues(textFieldTieAdjustDepth, XmNvalue, string, NULL);
7634: 
7635:   /* set all buttons except dismiss and tie insensitive
7636:   */
7637:   XtSetSensitive(pushButtonTieClear, FALSE);
7638:   XtSetSensitive(pushButtonTieCorrelation, FALSE);
7639:   XtSetSensitive(pushButtonTieShift, FALSE);
7640:   XtSetSensitive(pushButtonTieShiftUndo, False);
7641:   XtSetSensitive(toggleButtonTieUndoLast, False);
7642:   XtSetSensitive(toggleButtonTieUndoAll, False);
7643:   XtSetSensitive(textFieldTieAdjustDepth, False);  
7644:   XtVaSetValues(textFieldTieAdjustDepth,XmNeditable, False, NULL);
7645: 
7646:   /* reset window length and leadlag back to defaults
7647:   */   
7648:   (void)sprintf(string, "%.2f", WINLEN);
7649:   XtVaSetValues(textFieldTieWinLen, XmNvalue, string, NULL);
7650:   (void)sprintf(string, "%.2f", LEADLAG);
7651:   XtVaSetValues(textFieldTieLeadLag, XmNvalue, string, NULL);
7652:      
7653:   /* set the toggles back to defaults
7654:   */
7655:   XmToggleButtonSetState(toggleButtonTieShiftBestCorr, True, NULL);
7656:   XmToggleButtonSetState(toggleButtonTieShiftTie, False, NULL);
7657:   XmToggleButtonSetState(toggleButtonTieShiftGiven, False, NULL);
7658: 
7659:   XmToggleButtonSetState(toggleButtonTieShiftAll, True, NULL);
7660:   XmToggleButtonSetState(toggleButtonTieShiftCore, False, NULL);
7661:    
7662:   XtSetSensitive(toggleButtonTieShiftBestCorr, False); 
7663:   XtSetSensitive(toggleButtonTieShiftTie, False); 
7664:   XtSetSensitive(toggleButtonTieShiftGiven, False); 
7665:   XtSetSensitive(toggleButtonTieShiftAll, False); 
7666:   XtSetSensitive(toggleButtonTieShiftCore, False);
7667: 
7668:   /* clear the correlation plot and redraw the composite
7669:   */
7670:   if(XtIsManaged(XtParent(drawingAreaTieCorrelation))) {
7671:     XClearWindow(XtDisplay(drawingAreaTieCorrelation), XtWindow(drawingAreaTieCorrelation));
7672:   }
7673:   if(XtIsManaged(XtParent(drawingAreaEdit))) {
7674:     reason_for_redraw = DRAW_CLEARTIE;
7675:     DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
7676:   }
7677: 
7678:   tie1holenum = 0;
7679:   tie1corenum = 0;
7680:   tie1arraynum = 0;
7681:   tie2holenum = 0; 
7682:   tie2corenum = 0; 
7683:   tie2arraynum = 0;
7684: 
7685:   clip_x = 0;  
7686:   clip_y = 0;   
7687:   clip_width = 0;   
7688:   clip_height = 0;
7689: 
7690:   (void)sprintf(string, "");
7691: }
7692: 
7693: /* ARGSUSED */
7694: void
7695: ColorHelp(w, client, call)
7696: Widget w;
7697: XtPointer client;
7698: XtPointer call;
7699: {
7700:   /*SUPPRESS 594*/
7701: }
7702: 
7703: /* ARGSUSED */
7704: void
7705: CustomColor(w, client, call)
7706: Widget w;
7707: XtPointer client;
7708: XtPointer call;
7709: {
7710:   /*SUPPRESS 594*/
7711: 
7712:   int i;
7713:   void SetCustomeColorWidgetBGColors(), SetCustomeColorWidgetFGColors(), 
7714:        SetCustomeColorButtonColors(), SetColorSetBGandFG();
7715: 
7716:   XtManageChild(formSetColor);
7717:   XtPopup(XtParent(formSetColor), XtGrabNone);
7718: 
7719:   /* set the temp colors to the current colors using
7720:   */
7721:   tempbgPixel = bgPixel;
7722:   (void)sprintf(tempcolor[BG_COLOR], "%s", color[BG_COLOR]);
7723:   for(i=1; i<NCOLOR; ++i) { 
7724:     tempfgPixel[i] = fgPixel[i];
7725:     (void)sprintf(tempcolor[i], "%s", color[i]);
7726:   }
7727: 
7728:   (void)SetColorSetBGandFG();
7729:   (void)SetCustomeColorWidgetBGColors(bgPixel);
7730:   (void)SetCustomeColorWidgetFGColors(fgPixel[LABEL_COLOR]);
7731:   (void)SetCustomeColorButtonColors(bgPixel, fgPixel, color);
7732: }
7733: 
7734: /* ARGSUSED */
7735: void
7736: DisplayOK(w, client, call)
7737: Widget w;
7738: XtPointer client;
7739: XtPointer call;
7740: {
7741:   /*SUPPRESS 594*/
7742: 
7743:   int err;
7744:   void DrawDrawingAreaEdit(), DrawDrawingAreaView(), DrawDrawingAreaSpliceToAge();
7745: 
7746:   err = GetDisplayValues(dset);
7747: 
7748:   if(err == 0){
7749:     XtUnmanageChild(form);
7750:     reason_for_redraw = DISPLAY_CHANGE;
7751:     if(have_data == DO){
7752:       if(XtIsManaged(XtParent(drawingAreaEdit))) {
7753:         DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
7754:       }
7755:     }
7756:     if(have_splice == DO){
7757:       if(XtIsManaged(XtParent(drawingAreaView))) {
7758:         DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
7759:       }
7760:     }
7761:     if(have_splicetoage == DO) {
7762:       if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
7763:         DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
7764:       }
7765:     }
7766:   }
7767: }
7768: 
7769: /* ARGSUSED */
7770: void
7771: DisplayHelp(w, client, call)
7772: Widget w;
7773: XtPointer client;
7774: XtPointer call;
7775: {
7776:   /*SUPPRESS 594*/
7777: }
7778: 
7779: /* ARGSUSED */
7780: void
7781: GetSelectCore(w, client, call)
7782: Widget w;
7783: XtPointer client;
7784: XtPointer call;
7785: {
7786:   /*SUPPRESS 594*/
7787: 
7788:   int i, j, k, l, m, nv, ds, corename, check, sm, start, err, splhole, splcore;
7789:   char string[50], date[200];
7790:   float topdep, botdep, depth;
7791:   time_t tp;
7792:   String str;
7793:   XmString xmstring;
7794:   int CleanUpSpliceCore();
7795:   void DrawDrawingAreaView();
7796: 
7797:   /*  make the clear tie, correlate and splice to tie buttons insensitive
7798:   */
7799:   XtSetSensitive(pushButtonSpliceClearTie, False);
7800:   XtSetSensitive(pushButtonSpliceCorrelate, False);
7801:   XtSetSensitive(pushButtonSpliceToTie, False);
7802:   XtVaSetValues(pushButtonSpliceToTie, XmNborderWidth, 0, NULL);
7803: 
7804:   /* set the window length and  lead,lag to the defaults
7805:   */
7806:   (void)sprintf(string, "%.2f", WINLEN);
7807:   XtVaSetValues(textCompWindowLen, XmNvalue, string, NULL);
7808:   (void)sprintf(string, "%.2f", LEADLAG);
7809:   XtVaSetValues(textCompLeadLag, XmNvalue, string, NULL);
7810: 
7811:   /* make sure the ties and depth step are clear
7812:   */
7813:   (void)sprintf(string, "");
7814:   xmstring = XmStringCreateSimple(string);
7815:   XtVaSetValues(labelSpliceTie1ID, XmNlabelString, xmstring, NULL);
7816:   XtVaSetValues(labelSpliceTie1var, XmNlabelString, xmstring, NULL);
7817:   XtVaSetValues(labelSpliceTie1sbd, XmNlabelString, xmstring, NULL);
7818:   XtVaSetValues(labelSpliceTie2ID, XmNlabelString, xmstring, NULL);
7819:   XtVaSetValues(labelSpliceTie2var, XmNlabelString, xmstring, NULL);
7820:   XtVaSetValues(labelSpliceTie2sbd, XmNlabelString, xmstring, NULL);
7821:   XtVaSetValues(labelSpliceDifferenceInValue, XmNlabelString, xmstring, NULL);
7822:   XmStringFree(xmstring);
7823:   XtVaSetValues(textCompDepthStep, XmNvalue, string, NULL);
7824: 
7825:   /* get the text field for selected hole and find hole array number
7826:      check for leading blanks in text field.
7827:   */
7828:   str = XmTextGetString(textCompSelectHole);
7829:   check = -1;
7830:   for(m=0; isspace(str[m]); ++m);
7831:   for(i=0; i<data[dset]->numholes; ++i){
7832:     if(str[m] == data[dset]->holes[i]->name){
7833:       spliceholenum = i;
7834:       check = 1;
7835:       break;
7836:     }
7837:   }  
7838:   XtFree(str);
7839:   if(check == -1){
7840:     (void)sprintf(buffer, "Could not find a matching hole name.");
7841:     SpManageWarningBox(buffer);
7842:     return;
7843:   }
7844:   else {
7845:   }
7846:   
7847:   /* get the text field for selected core and find core array number
7848:   */
7849:   str = XmTextGetString(textCompSelectCore);
7850:   sscanf(str, "%d", &corename);
7851:   XtFree(str);
7852:   check = -1;
7853:   for(j=0; j<data[dset]->holes[spliceholenum]->numcores; ++j){
7854:     if(corename == data[dset]->holes[spliceholenum]->core[j]->num){
7855:       splicecorenum = j;
7856:       check = 1;
7857:       break;
7858:     }
7859:   }
7860:   if(check == -1){
7861:     (void)sprintf(buffer, "Could not find a matching core number.");
7862:     SpManageWarningBox(buffer);
7863:     return;
7864:   }
7865:   /* is this a culled core? not possible? but check anyway
7866:   */
7867:   else if(data[dset]->holes[spliceholenum]->core[splicecorenum]->value[0]->quality == BAD_CORE_NUM){
7868:     (void)sprintf(buffer, "This core has been culled from data set.");
7869:     SpManageWarningBox(buffer);
7870:     return;
7871:   }
7872:   /* are there good data pts. in this core?
7873:   */
7874:   for(i=0; data[dset]->holes[spliceholenum]->core[splicecorenum]->value[i]->quality != GOOD; ++i){
7875:     if(i >= data[dset]->holes[spliceholenum]->core[splicecorenum]->numvalues){
7876:       (void)sprintf(buffer, "There are no good data points in this core.");
7877:       SpManageWarningBox(buffer);
7878:       return;
7879:     }
7880:   }
7881: 
7882:   /* are starting a splice composite so this
7883:      core is the first and automatically becomes the first core
7884:      of the splice composite
7885:   */
7886:   if(have_splice == DONT){
7887: 
7888:     have_splice = DO;  
7889:     have_core_to_splice = DONT;
7890:     have_splice_tie = DONT;
7891:     last_sp_tie = NONE; 
7892:     have_sp_tie1 = DONT; 
7893:     have_sp_tie2 = DONT;
7894:     splice_how = NONE;
7895: 
7896:     XtSetSensitive(pushButtonSaveSplicerTable,True);
7897:     XtSetSensitive(pushButtonSaveSplicerData,True);
7898:     XtSetSensitive(pushButtonClearSplice, True);
7899:     XtSetSensitive(pushButtonOpenSplicerTable,False);
7900: 
7901:     /*report to report that have selected the first core of the splice record
7902:     */
7903:     /* write tie to  report
7904:     */
7905:     if(time(&tp)) {
7906:       (void)sprintf(date, "%s", ctime(&tp));
7907:     }
7908:     else {
7909:       (void)sprintf(date, "no date available\n");
7910:     }
7911:     if(are_splicing == CONSTRAINED) {
7912:       (void)sprintf(buffer,"\nSplice: Constrained;  hole %c core %d;  FIRST CORE OF SPLICE    %s", 
7913:                       data[dset]->holes[spliceholenum]->name, data[dset]->holes[spliceholenum]->core[splicecorenum]->num, date);
7914:     }  
7915:     else if(are_splicing == UNCONSTRAINED) {
7916:       (void)sprintf(buffer,"\nSplice: Unconstrained;  hole %c core %d;  FIRST CORE OF SPLICE    %s", date);
7917:     }  
7918:     else {
7919:       (void)sprintf(buffer,"");
7920:     }  
7921:     SpUpdateReport(buffer);
7922:    
7923:     /* make the undo button sensitive. it will stay so until
7924:        there are none to undo
7925:     */
7926:     XtSetSensitive(pushButtonSpliceUndoLast, True);
7927: 
7928:     /* and the clear grab  
7929:     */
7930:     XtSetSensitive(pushButtonClearGrab, False);
7931:     XtSetSensitive(pushButtonSpliceUndoLast, True);
7932: 
7933:     /* spcomp.var is always the raw, good data. so no matter what smooth options
7934:        are, send smooth = no to CleanUpSpliceCore()
7935:     */
7936:     sm = NO;
7937:     for(start=0; data[dset]->holes[spliceholenum]->core[splicecorenum]->value[start]->quality != GOOD; ++start);
7938: 
7939:     spcomp.Depthoffset[0] = data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset;
7940: 
7941:     spcomp.MapToOrig[0][0] = start;
7942: 
7943:     err = CleanUpSpliceCore(spliceholenum, splicecorenum, &spcomp.numpercore[0], 
7944:                 spcomp.sb_depth[0], spcomp.var[0], sm, 0, start, spcomp.MapToOrig[0]);
7945: 
7946:     if(err == 0){
7947:       /* set the map values; these are the array members numbers to use
7948:          to reference original data.
7949:       */
7950:       spcomp.hole[0] = spliceholenum;
7951:       spcomp.core[0] = splicecorenum;
7952:       spcomp.numcores = 1;     
7953:     }
7954:     else if(err > 0){
7955:       (void)sprintf(buffer, "Error trying to get selected core.");
7956:       SpManageWarningBox(buffer);
7957:       return;
7958:     }
7959: 
7960:     splicertable.alloc_cnt=ALLOC_INT;
7961:     if((splicertable.data=(SplicerTableInfo*)calloc(splicertable.alloc_cnt,sizeof(SplicerTableInfo)))==NULL)
7962:       SpBadMemAlloc("BAD MEM");
7963: 
7964:     /* put this in the splice table
7965:     */
7966:     splicertable.data[0].site = data[dset]->site;
7967:     splicertable.data[0].hole = data[dset]->holes[spliceholenum]->name;
7968:     splicertable.data[0].core = data[dset]->holes[spliceholenum]->core[splicecorenum]->num;
7969:     splicertable.data[0].core_type = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[0]->type;
7970:     (void)strcpy(splicertable.data[0].section, data[dset]->holes[spliceholenum]->core[splicecorenum]->value[0]->section);
7971:     splicertable.data[0].top_int = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[0]->top_int;
7972:     splicertable.data[0].bot_int = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[0]->bot_int;
7973:     splicertable.data[0].mbsf = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[0]->sb_depth;
7974:     splicertable.data[0].mcd = splicertable.data[0].mbsf + spcomp.Depthoffset[0];
7975:     (void)strcpy(splicertable.data[0].type_of_splice, "none");
7976:    
7977:     nv = data[dset]->holes[spliceholenum]->core[splicecorenum]->numvalues -1;
7978:     splicertable.data[1].site = data[dset]->site;
7979:     splicertable.data[1].hole = data[dset]->holes[spliceholenum]->name; 
7980:     splicertable.data[1].core = data[dset]->holes[spliceholenum]->core[splicecorenum]->num;  
7981:     splicertable.data[1].core_type = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[nv]->type; 
7982:     (void)strcpy(splicertable.data[1].type_of_splice, "none");
7983: 
7984:     /* if more than one data set find which dataset that has the depthest core
7985:     */
7986:     ds = dset;
7987:     splhole = spliceholenum;
7988:     splcore = splicecorenum;
7989:     if(dataset_cnt > 1) {
7990:       depth = data[ds]->holes[spliceholenum]->core[splicecorenum]->value[nv]->sb_depth;
7991:       for(j=0; j<dataset_cnt; ++j) {
7992:         if(j != dset) {
7993:           /* is the splice hole,core in this dataset?
7994:           */
7995:           for(k=0; k<data[j]->numholes; ++k) {
7996:             if(data[j]->holes[k]->name == data[dset]->holes[spliceholenum]->name) {
7997:               for(l=0; l<data[j]->holes[k]->numcores; ++l) {
7998:                 if(data[j]->holes[k]->core[l]->num == data[dset]->holes[spliceholenum]->core[splicecorenum]->num) {
7999:                   nv = data[j]->holes[k]->core[l]->numvalues - 1;
8000:                   if(data[j]->holes[k]->core[l]->value[nv]->sb_depth > depth) {
8001:                     ds = j;
8002:                     depth = data[j]->holes[k]->core[l]->value[nv]->sb_depth;
8003:                     splhole = k;
8004:                     splcore = l;
8005:                   }
8006:                 }
8007:               }
8008:             }
8009:           }
8010:         }
8011:       }
8012:     }
8013:     else {
8014:     }
8015:     nv = data[ds]->holes[splhole]->core[splcore]->numvalues - 1;
8016:     (void)strcpy(splicertable.data[1].section, data[ds]->holes[splhole]->core[splcore]->value[nv]->section);
8017:     splicertable.data[1].top_int = data[ds]->holes[splhole]->core[splcore]->value[nv]->top_int;
8018:     splicertable.data[1].bot_int = data[ds]->holes[splhole]->core[splcore]->value[nv]->bot_int;
8019:     splicertable.data[1].mbsf = data[ds]->holes[splhole]->core[splcore]->value[nv]->sb_depth;
8020:     splicertable.data[1].mcd = splicertable.data[1].mbsf + spcomp.Depthoffset[0];
8021: 
8022:     splicertable.data_cnt = 2;
8023:     spcomp.map_to_table[0] = 0;
8024: 
8025:     if(XtIsManaged(XtParent(drawingAreaView))) {
8026:       reason_for_redraw = DRAW_EVERYTHING;
8027:       DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
8028:     }
8029:   }
8030:   else if(have_splice == DO){
8031: 
8032:     /* check that this core has not been selected already
8033:     */
8034:     for(i=0; i<spcomp.numcores; ++i){
8035:       if(data[dset]->holes[spliceholenum]->name == data[dset]->holes[spcomp.hole[i]]->name &&
8036:          data[dset]->holes[spliceholenum]->core[splicecorenum]->num == data[dset]->holes[spcomp.hole[i]]->core[spcomp.core[i]]->num){
8037:         (void)sprintf(buffer, "you have selected a core that is already in the splice!");
8038:         SpManageWarningBox(buffer);
8039:         return;
8040:       }  
8041:     }
8042: 
8043:     /* check if there are missing core(s) from splicer table below 
8044:        last core of spcomp
8045:     */
8046:     if(spcomp.map_to_table[spcomp.numcores-1] < splicertable.data_cnt -2) {
8047:       (void)sprintf(buffer, "you can not splice when there are missing cores below last core.\n"); 
8048:       (void)strcat(buffer, "you must first delete these missing cores from the splice table.\n");
8049:       SpManageWarningBox(buffer);
8050:       return;
8051:     }
8052: 
8053:     /* find the top and bottom depth of the core to be spliced
8054:     */
8055:     i = 0;
8056:     while(data[dset]->holes[spliceholenum]->core[splicecorenum]->value[i]->quality != GOOD && 
8057:           i < data[dset]->holes[spliceholenum]->core[splicecorenum]->numvalues-1) {
8058:       ++i;
8059:     }
8060:     topdep = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[i]->sb_depth +
8061:              data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset;
8062:     i = data[dset]->holes[spliceholenum]->core[splicecorenum]->numvalues-1;
8063:     while(data[dset]->holes[spliceholenum]->core[splicecorenum]->value[i]->quality != GOOD && i > 0) {
8064:       --i;
8065:     }
8066:     botdep = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[i]->sb_depth +
8067:              data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset;
8068: 
8069:     /* check that the selected core falls deeper than
8070:        the top of the last core in splice
8071:     */
8072:     if(botdep < spcomp.sb_depth[spcomp.numcores-1][0]) {
8073:       (void)sprintf(buffer, "you can not splice a core that falls above the last core of the splice.\n");
8074:       SpManageWarningBox(buffer);
8075:       return;
8076:     }
8077: 
8078:     have_core_to_splice = DO;
8079:     have_spcorr = DONT;
8080:     have_splice_tie = DONT;
8081:     have_splice_shift = DONT;
8082:     last_sp_tie = NONE;
8083:     have_sp_tie1 = DONT;
8084:     have_sp_tie2 = DONT;
8085:     splice_how = NONE;
8086: 
8087:     /* make the clear grab sensitive. 
8088:        there is a core to splice that can be cleared or tied 
8089:        make undo last insenitive until clear core or splice
8090:     */   
8091:     XtSetSensitive(pushButtonClearGrab, True);
8092:     XtSetSensitive(pushButtonSpliceUndoLast, False);
8093:     XtSetSensitive(pushButtonSuggestTies, True);
8094: 
8095:     /* check whether core to splice overlaps splice. if it
8096:        does, disable append, otherwise enable it.
8097:        if the overlap is slight allow append
8098:     */
8099: 
8100:     if(topdep <= spcomp.sb_depth[spcomp.numcores-1][spcomp.numpercore[spcomp.numcores-1]-1]) {
8101:       if(ALLOWAPPENDOVERLAP + topdep >= spcomp.sb_depth[spcomp.numcores-1][spcomp.numpercore[spcomp.numcores-1]-1]) {
8102:         XtSetSensitive(pushButtonAppendSplice, True);
8103:         XtVaSetValues(pushButtonAppendSplice, XmNborderWidth, 1, NULL);
8104:         splice_overlap = OVERLAPAPPEND;
8105:       }
8106:       else {
8107:         XtSetSensitive(pushButtonAppendSplice, False);
8108:         XtVaSetValues(pushButtonAppendSplice, XmNborderWidth, 0, NULL);
8109:         splice_overlap = YES;
8110:       }
8111:     }
8112:     else {
8113:       XtSetSensitive(pushButtonAppendSplice, True);
8114:       XtVaSetValues(pushButtonAppendSplice, XmNborderWidth, 1, NULL);
8115:       splice_overlap = NO;
8116:     }
8117:      
8118:     /* and clear previous corr plot
8119:     */
8120:     if(XtIsManaged(XtParent(drawingAreaCompCorrelation))) {
8121:       XClearWindow(XtDisplay(drawingAreaCompCorrelation), XtWindow(drawingAreaCompCorrelation));
8122:     }
8123:     if(XtIsManaged(XtParent(drawingAreaView))) {
8124:       reason_for_redraw = DRAW_COREGRABBED;
8125:       DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
8126:     }
8127:   }
8128:  
8129:   (void)sprintf(string, "");
8130:   (void)sprintf(date, "");
8131: }
8132:  
8133:  
8134: /* ARGSUSED */
8135: void
8136: TieCorrelate(w, client, call)
8137: Widget w;
8138: XtPointer client;
8139: XtPointer call;
8140: {
8141:         /*SUPPRESS 594*/
8142:  
8143:   int i, j, n, h, c, d, core1n, core2n, core1offset, core2offset, tie1num, tie2num,
8144:       lag, nwin, sm, err, num_lead_lag, save_tie1, save_tie2,
8145:       start, newtie1hole, newtie1core, newtie1array, newtie2hole, newtie2core, newtie2array;
8146:   char string[50];
8147:   float coef, range1, range2, intpt, depth,
8148:         core1dep[MAXPERCORE], core1var[MAXPERCORE],
8149:         core2dep[MAXPERCORE], core2var[MAXPERCORE];
8150:   String str;
8151:   int CleanUpCore(), RepickDepth(), Correlate();
8152:   void DrawDrawingAreaEdit(), DrawDrawingAreaTieCorrelation();
8153:  
8154:  
8155:   /* make the shift button sensitive
8156:   */
8157:   XtSetSensitive(pushButtonTieShift, True);
8158:  
8159:   /* calc. the depth offset at tie
8160:   */
8161:   tiedepoffset = (data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->sb_depth +
8162:                   data[dset]->holes[tie1holenum]->core[tie1corenum]->cum_dep_offset)   -
8163:                  (data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->sb_depth +
8164:                   data[dset]->holes[tie2holenum]->core[tie2corenum]->cum_dep_offset);
8165: 
8166: 
8167:   /* clean up the cores and find the new array ties if
8168:      cull or average. return the two cores in temp arrays. 
8169:      repick the depth in temp arrays at constant depth step.
8170:   */
8171:   if(smooth.method == NONE){
8172:     sm = NO;
8173:   }
8174:   else if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
8175:           (smooth.plot == UNSMOOTHED)){
8176:     sm = NO;
8177:   }
8178:   else if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
8179:           (smooth.plot == SMOOTHED || smooth.plot == SMOOTHEDBOTH) &&
8180:           (data[dset]->holes[tie1holenum]->core[tie1corenum]->smooth_status == SMOK &&
8181:            data[dset]->holes[tie2holenum]->core[tie2corenum]->smooth_status == SMOK)){
8182:     sm = YES;
8183:   }
8184:   else {
8185:     sm = NO;
8186:   }
8187: 
8188:   tie1num = tie1arraynum;
8189:   tie2num = tie2arraynum;
8190: 
8191:   err = CleanUpCore(dset, tie1holenum, tie1corenum, &core1n, core1dep, core1var, sm, &tie1num);
8192:   if(err > 0){
8193:     (void)sprintf(buffer, "Error trying to get the first core.");
8194:     SpManageWarningBox(buffer);
8195:     return;
8196:   }
8197:   err = CleanUpCore(dset, tie2holenum, tie2corenum, &core2n, core2dep, core2var, sm, &tie2num);
8198:   if(err > 0){ 
8199:     (void)sprintf(buffer, "Error trying to get the second core."); 
8200:     SpManageWarningBox(buffer);
8201:     return; 
8202:   }
8203: 
8204:   str = XmTextGetString(textFieldTieDepthStep);
8205:   depstep = atof(str);
8206:   XtFree(str);
8207:   range1 = core1dep[core1n-1] - core1dep[0];
8208:   range2 = core2dep[core2n-1] - core2dep[0];
8209:   if(range1/depstep > MAXPERCORE || range2/depstep > MAXPERCORE){
8210:     (void)sprintf(buffer, "The depth step you have chosen exceeds the limits of samples allowed in cores to correlate.");
8211:     SpManageWarningBox(buffer);
8212:     XtSetSensitive(pushButtonTieCorrelation, True);
8213:     XtSetSensitive(pushButtonTieShift, False);
8214:     return;
8215:   }
8216:   else if(depstep > 0.0){
8217:     RepickDepth(core1dep, core1var, &core1n, &tie1num, depstep);
8218:     RepickDepth(core2dep, core2var, &core2n, &tie2num, depstep);
8219:   }
8220:   else {
8221:     (void)sprintf(buffer, "Error: The depth step is less than or equal to 0.0");
8222:     SpManageWarningBox(buffer);
8223:     XtSetSensitive(pushButtonTieCorrelation, True);
8224:     XtSetSensitive(pushButtonTieShift, False);
8225:     return;
8226:   }
8227: 
8228:   /*get the window length and find the first value(array member) of core 2
8229:     that is within the window. then count out to the last value that is in the window
8230:   */
8231:   str= XmTextGetString(textFieldTieWinLen);
8232:   winlen = atof(str);
8233:   XtFree(str);
8234:   if(winlen > 0.0) {
8235:     for(i=0; i<core2n; ++i){
8236:       if(core2dep[i] >= core2dep[tie2num]-winlen){
8237:         core2offset=i;
8238:         break;
8239:       }
8240:     }
8241:     nwin=0;
8242:     for(j=i; j<core2n; ++j){
8243:       if(core2dep[j] > core2dep[tie2num]+winlen){
8244:         break;
8245:       }
8246:       else {
8247:         ++nwin;
8248:       }
8249:     }
8250:   }
8251:   else {
8252:     (void)sprintf(buffer, "Error: The window length is less than or equal to 0.0."); 
8253:     SpManageWarningBox(buffer);
8254:     XtSetSensitive(pushButtonTieCorrelation, True);
8255:     XtSetSensitive(pushButtonTieShift, False);
8256:     return;
8257:   }
8258: 
8259: 
8260:   /* the lead,lag(in meters) and find the lead,lag
8261:     in data points
8262:   */
8263:   str = XmTextGetString(textFieldTieLeadLag);
8264:   leadlagmeters = atof(str);
8265:   XtFree(str);
8266:   if(leadlagmeters > 0.0){
8267:     lead_lag = leadlagmeters/depstep;
8268:     num_lead_lag = lead_lag * 2 + 1;
8269:     lag = -1.0 * lead_lag;
8270:   }
8271:   else {
8272:     lead_lag=0;
8273:     lag=0;
8274:   }
8275:   if(num_lead_lag > MAXCORR){
8276:     (void)sprintf(buffer, "The lead/lag you have chosen exceeds the limit for number of correlations allowed.");
8277:     SpManageWarningBox(buffer);
8278:     XtSetSensitive(pushButtonTieCorrelation, True);
8279:     XtSetSensitive(pushButtonTieShift, False);
8280:     return;
8281:   }
8282: 
8283:   /* calc. corr. coef. for each lead,lag in given window
8284:      note that core1offset causes core 1 to lag and then lead
8285:      core 2
8286:   */
8287:   corr.num_lead_lag[dset] = 0;
8288:   tie_corr_num = 0;
8289:   for(i=0;i<num_lead_lag; ++i){
8290:     core1offset = tie1num - tie2num - lag;
8291:     Correlate(core1n, nwin, core1offset, core2offset, core1var, core2var,
8292:                     &coef, &n);
8293: 
8294:     /* cull out any lead/lag that had less than TOOFEWCORRPAIRS 
8295:        which includes situations where the lead/lag caused core 1 
8296:        to not overlay core 2; n=0 
8297:     */ 
8298:     if(n < TOOFEWCORRPAIRS){
8299: 
8300:     }
8301:     else {
8302:       corr.coef[dset][corr.num_lead_lag[dset]] = coef;
8303:       corr.n[corr.num_lead_lag[dset]] = n;
8304:       corr.leadlag[dset][corr.num_lead_lag[dset]] = lag;
8305:       corr.depoffset[corr.num_lead_lag[dset]] = core1dep[tie1num] - core2dep[tie2num] - lag * depstep;
8306:       corr.depleadlag[dset][corr.num_lead_lag[dset]] = lag * depstep;
8307:       if(lag == 0){
8308:         tie_corr_num = corr.num_lead_lag[dset];
8309:       }
8310:       ++corr.num_lead_lag[dset];
8311:     }
8312:     ++lag;
8313:   }
8314: 
8315:   /* find the highest corr. coef. and save its array member number
8316:      and draw the correlation
8317:   */
8318:   if(lead_lag > 0){
8319:     best_corr = corr.coef[dset][0];
8320:     best_corr_num = 0;
8321:     for(i=1; i<corr.num_lead_lag[dset]; ++i){
8322:       if(corr.coef[dset][i] > best_corr){
8323:         best_corr = corr.coef[dset][i];
8324:         best_corr_num = i;
8325:       }
8326:     } 
8327:     have_corr = DO;
8328:   }
8329:   else {
8330:   }
8331: 
8332:   /* correlate any other data sets
8333:   */
8334:   if(dataset_cnt > 1) {
8335:     for(d=0; d<dataset_cnt; ++d) {
8336:       if(d != dset) {
8337: 
8338:         newtie1hole = -1;
8339:         newtie1core = -1;
8340:         newtie1array = -1;
8341:         newtie2hole = -1;
8342:         newtie2core = -1;
8343:         newtie2array = -1;
8344:         for(i=0; i<data[d]->numholes; ++i) {
8345:           if(data[d]->holes[i]->name == data[dset]->holes[tie1holenum]->name) {
8346:             newtie1hole = i;
8347:             break;
8348:           }
8349:         }
8350:         if(newtie1hole == -1) {
8351:         }
8352:         else {
8353:           for(i=0; i<data[d]->holes[newtie1hole]->numcores; ++i) {
8354:             if(data[d]->holes[newtie1hole]->core[i]->num == data[dset]->holes[tie1holenum]->core[tie1corenum]->num) {
8355:               newtie1core = i;
8356:               break;
8357:             }
8358:           }
8359:           if(newtie1core == -1) {
8360:           }
8361:           else {
8362:             h = newtie1hole;
8363:             c = newtie1core;
8364:             core1n = 0;
8365:             for(i=0; i<data[d]->holes[h]->core[c]->numvalues; ++i) {
8366:               if(data[d]->holes[h]->core[c]->value[i]->quality & BAD_SB_DEPTH) {
8367:               }
8368:               else if(data[d]->holes[h]->core[c]->value[i]->quality == GOOD) {
8369:                 core1dep[core1n] = data[d]->holes[h]->core[c]->value[i]->sb_depth;
8370:                 if(sm == YES) {
8371:                   core1var[core1n] = data[d]->holes[h]->core[c]->value[i]->sm_data;
8372:                 }
8373:                 else {
8374:                   core1var[core1n] = *data[d]->holes[h]->core[c]->value[i]->data;
8375:                 }
8376:                 ++core1n;
8377:               }
8378:             }
8379:             if(core1n > 5) {
8380: 
8381:               depth = data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->sb_depth;
8382:               if(depth < core1dep[0] || depth > core1dep[core1n-1]) {
8383:               }
8384:               else {
8385:                 err = InterpolateTiePtValue(core1n, core1dep, core1var, depth, &intpt, &start);
8386:                 if(err > 0) {
8387:                 }
8388:                 else if(start < 0 || start >= core1n) {
8389:                 }
8390:                 else {
8391:                   for(i=core1n; i>start+1; --i) {
8392:                     core1dep[i] = core1dep[i-1];
8393:                     core1var[i] = core1var[i-1];
8394:                   }
8395:                   ++core1n;
8396:                   core1dep[start + 1] = depth;
8397:                   core1var[start + 1] = intpt;
8398:                   newtie1array = start + 1;
8399:                 }
8400:               }
8401:             }
8402:           }
8403:         }
8404:         for(i=0; i<data[d]->numholes; ++i) {
8405:           if(data[d]->holes[i]->name == data[dset]->holes[tie2holenum]->name) {
8406:             newtie2hole = i;
8407:             break;
8408:           }
8409:         }
8410:         if(newtie2hole == -1) {
8411:         }
8412:         else {
8413:           for(i=0; i<data[d]->holes[newtie2hole]->numcores; ++i) {
8414:             if(data[d]->holes[newtie2hole]->core[i]->num == data[dset]->holes[tie2holenum]->core[tie2corenum]->num) {
8415:               newtie2core = i;
8416:               break;
8417:             }
8418:           }
8419:           if(newtie2core == -1) {
8420:           }
8421:           else {
8422:             h = newtie2hole;
8423:             c = newtie2core;
8424:             core2n = 0;
8425:             for(i=0; i<data[d]->holes[h]->core[c]->numvalues; ++i) {
8426:               if(data[d]->holes[h]->core[c]->value[i]->quality & BAD_SB_DEPTH) {
8427:               }
8428:               else if(data[d]->holes[h]->core[c]->value[i]->quality == GOOD) {
8429:                 core2dep[core2n] = data[d]->holes[h]->core[c]->value[i]->sb_depth;
8430:                 if(sm == YES) {
8431:                   core2var[core2n] = data[d]->holes[h]->core[c]->value[i]->sm_data;
8432:                 }
8433:                 else {
8434:                   core2var[core2n] = *data[d]->holes[h]->core[c]->value[i]->data;
8435:                 }
8436:                 ++core2n;
8437:               }
8438:             }
8439:             if(core2n > 5) {
8440: 
8441:               depth = data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->sb_depth;
8442:               if(depth < core2dep[0] || depth > core2dep[core2n-1]) {
8443:               }
8444:               else {
8445:                 err = InterpolateTiePtValue(core2n, core2dep, core2var, depth, &intpt, &start);
8446:                 if(err > 0) {
8447:                 }
8448:                 else if(start < 0 || start >= core2n) {
8449:                 }
8450:                 else {
8451:                   for(i=core2n; i>start+1; --i) {
8452:                     core2dep[i] = core2dep[i-1];
8453:                     core2var[i] = core2var[i-1];
8454:                   }
8455:                   ++core2n;
8456:                   core2dep[start + 1] = depth;
8457:                   core2var[start + 1] = intpt;
8458:                   newtie2array = start + 1;
8459:                 }
8460:               }
8461:             }
8462:           }
8463:         }
8464:         if(newtie1array != -1 && newtie2array != -1) {
8465:           if(err == 0){
8466:             range1 = core1dep[core1n-1] - core1dep[0];
8467:             range2 = core2dep[core2n-1] - core2dep[0];
8468:             if(range1/depstep < MAXPERCORE || range2/depstep < MAXPERCORE){
8469:               tie1num = newtie1array;
8470:               tie2num = newtie2array;
8471:               RepickDepth(core1dep, core1var, &core1n, &tie1num, depstep);
8472:               RepickDepth(core2dep, core2var, &core2n, &tie2num, depstep);
8473:             }
8474:             else {
8475:               err = 1;
8476:             }
8477:           }
8478:         }
8479:         if(newtie1array != -1 && newtie2array != -1 && err == 0) {
8480:        
8481:           for(i=0; i<core2n; ++i){
8482:             if(core2dep[i] >= core2dep[tie2num]-winlen){
8483:               core2offset=i;
8484:               break;
8485:             }
8486:           }
8487:           nwin=0;
8488:           for(j=i; j<core2n; ++j){
8489:             if(core2dep[j] > core2dep[tie2num]+winlen){
8490:               break;
8491:             }
8492:             else {
8493:               ++nwin;
8494:             }
8495:           }
8496:           if(leadlagmeters > 0.0){
8497:             lead_lag = leadlagmeters/depstep;
8498:             num_lead_lag = lead_lag * 2 + 1;
8499:             lag = -1.0 * lead_lag;
8500:           }
8501:           else {
8502:             lead_lag=0;
8503:             lag=0;
8504:           }
8505: 
8506:           corr.num_lead_lag[d] = 0;
8507:           for(i=0;i<num_lead_lag; ++i){
8508:             core1offset = tie1num - tie2num - lag;
8509:             Correlate(core1n, nwin, core1offset, core2offset, core1var, core2var,
8510:                     &coef, &n);
8511: 
8512:             if(n < TOOFEWCORRPAIRS){
8513:             }
8514:             else {
8515:               corr.coef[d][corr.num_lead_lag[d]] = coef;
8516:               corr.leadlag[d][corr.num_lead_lag[d]] = lag;
8517:               corr.depleadlag[d][corr.num_lead_lag[d]] = lag * depstep;
8518:               if(lag == 0){
8519:                 tie_corr_num = corr.num_lead_lag[d];
8520:               }
8521:               ++corr.num_lead_lag[d];
8522:             }
8523:             ++lag;
8524:           }
8525:         }
8526:       }
8527:     }
8528:   }
8529: 
8530:   /* set the adjust depth text to equal best correlation
8531:   */
8532:   XtSetSensitive(textFieldTieAdjustDepth, True);
8533:   XtVaSetValues(textFieldTieAdjustDepth,XmNeditable, False, NULL);
8534:   (void)sprintf(string, "%.2f", corr.depoffset[best_corr_num]);
8535:   XtVaSetValues(textFieldTieAdjustDepth, XmNvalue, string, NULL);
8536: 
8537:   /* set the defaults toggles on
8538:   */
8539:   XtSetSensitive(toggleButtonTieShiftBestCorr, True); 
8540:   XtSetSensitive(toggleButtonTieShiftTie, True); 
8541:   XtSetSensitive(toggleButtonTieShiftGiven, True); 
8542:   XtSetSensitive(toggleButtonTieShiftAll, True); 
8543:   XtSetSensitive(toggleButtonTieShiftCore, True);
8544:   XmToggleButtonSetState(toggleButtonTieShiftBestCorr, True, NULL);
8545:   XmToggleButtonSetState(toggleButtonTieShiftTie, False, NULL);
8546:   XmToggleButtonSetState(toggleButtonTieShiftGiven, False, NULL);
8547:   XmToggleButtonSetState(toggleButtonTieShiftAll, True, NULL);
8548:   XmToggleButtonSetState(toggleButtonTieShiftCore, False, NULL);
8549: 
8550:   /* draw the core 2 overlay of core 1
8551:   */
8552:   have_tie = DONT;
8553:   have_shift = DO;
8554:   if(XtIsManaged(XtParent(drawingAreaEdit))) {
8555:     reason_for_redraw = DRAW_TIES;
8556:     DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
8557:   }
8558:   if(XtIsManaged(XtParent(drawingAreaTieCorrelation))) {
8559:     DrawDrawingAreaTieCorrelation(drawingAreaTieCorrelation, (XtPointer)NULL, (XtPointer)NULL);
8560:   }
8561: 
8562:   (void)sprintf(string, "");
8563: }
8564: 
8565: 
8566: /* ARGSUSED */
8567: void
8568: SpliceClearTie(w, client, call)
8569: Widget w;
8570: XtPointer client;
8571: XtPointer call;
8572: {
8573:   /*SUPPRESS 594*/
8574: 
8575:   char string[50];
8576:   XmString xmstring;
8577:   void DrawDrawingAreaView();
8578: 
8579:   have_splice_tie = DONT;
8580:   have_splice_shift = DONT;
8581:   have_spcorr = DONT;
8582:   last_sp_tie = NONE; 
8583:   have_sp_tie1 = DONT; 
8584:   have_sp_tie2 = DONT;
8585:   splice_how = NONE;
8586: 
8587:   /* reset buttons and text
8588:   */
8589:   /* set the window length and  lead,lag to the defaults
8590:   */
8591:   (void)sprintf(string, "%.2f", WINLEN);
8592:   XtVaSetValues(textCompWindowLen, XmNvalue, string, NULL);
8593:   (void)sprintf(string, "%.2f", LEADLAG);
8594:   XtVaSetValues(textCompLeadLag, XmNvalue, string, NULL);
8595:  
8596:   /* make sure the ties, depth step and selected core text
8597:      are clear
8598:   */
8599:   (void)sprintf(string, "");
8600:   XtVaSetValues(textCompSelectHole, XmNvalue, string, NULL);
8601:   XtVaSetValues(textCompSelectCore, XmNvalue, string, NULL);
8602:   XtVaSetValues(textCompDepthStep, XmNvalue, string, NULL);
8603:   xmstring = XmStringCreateSimple(string);
8604:   XtVaSetValues(labelSpliceTie1ID, XmNlabelString, xmstring, NULL);
8605:   XtVaSetValues(labelSpliceTie1var, XmNlabelString, xmstring, NULL);
8606:   XtVaSetValues(labelSpliceTie1sbd, XmNlabelString, xmstring, NULL);
8607:   XtVaSetValues(labelSpliceTie2ID, XmNlabelString, xmstring, NULL); 
8608:   XtVaSetValues(labelSpliceTie2var, XmNlabelString, xmstring, NULL); 
8609:   XtVaSetValues(labelSpliceTie2sbd, XmNlabelString, xmstring, NULL); 
8610:   XtVaSetValues(labelSpliceDifferenceInValue, XmNlabelString, xmstring, NULL);
8611:   XmStringFree(xmstring);
8612:   
8613:   /* set all buttons except dismiss, grab, clear grab, and
8614:      undo last insensitive 
8615:   */ 
8616:   XtSetSensitive(pushButtonGetSelectCore, True); 
8617:   XtSetSensitive(pushButtonClearGrab, True); 
8618:   XtSetSensitive(pushButtonSpliceClearTie, FALSE); 
8619:   XtSetSensitive(pushButtonSpliceCorrelate, FALSE); 
8620:   XtSetSensitive(pushButtonSpliceToTie, False); 
8621:   XtVaSetValues(pushButtonSpliceToTie, XmNborderWidth, 0, NULL);
8622:   XtSetSensitive(pushButtonSuggestTies, True);
8623: 
8624:   if(splice_overlap == YES) {
8625:     XtSetSensitive(pushButtonAppendSplice, False);
8626:     XtVaSetValues(pushButtonAppendSplice, XmNborderWidth, 0, NULL);
8627:   }
8628:   else if(splice_overlap == NO || splice_overlap == OVERLAPAPPEND) {
8629:     XtSetSensitive(pushButtonAppendSplice, True);
8630:     XtVaSetValues(pushButtonAppendSplice, XmNborderWidth, 1, NULL);
8631:   }
8632:  
8633:   /* and clear the correlation window 
8634:   */
8635:   if(XtIsManaged(XtParent(drawingAreaCompCorrelation))) {
8636:     XClearWindow(XtDisplay(drawingAreaCompCorrelation), 
8637:                   XtWindow(drawingAreaCompCorrelation));
8638:   }
8639: 
8640:   if(XtIsManaged(XtParent(drawingAreaView))) {
8641:     reason_for_redraw = DRAW_EVERYTHING;
8642:     DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
8643:   }
8644: 
8645:   (void)sprintf(string, "");
8646: }
8647: 
8648: /* ARGSUSED */
8649: void
8650: SpliceCorrelate(w, client, call)
8651: Widget w;
8652: XtPointer client;
8653: XtPointer call;
8654: {
8655:   /*SUPPRESS 594*/
8656: 
8657:   int i, j, n, d, h, c, core1n, core2n, core1arraynum, core2arraynum, core1offset, core2offset,
8658:       lag, nwin, sm, err, num_lead_lag, tie1num, tie2num,
8659:       start, newtie1hole, newtie1core, newtie1array, newtie2hole, newtie2core, newtie2array;
8660:   float coef, range1, range2, intpt, depth,
8661:         core1dep[MAXPERCORE], core1var[MAXPERCORE],
8662:         core2dep[MAXPERCORE], core2var[MAXPERCORE];
8663:   String str;
8664:   int CleanUpCore(), RepickDepth(), Correlate();
8665:   void DrawDrawingAreaView(), DrawDrawingAreaCompCorrelation();
8666: 
8667:   XtSetSensitive(pushButtonSpliceToTie, True);
8668:   XtVaSetValues(pushButtonSpliceToTie, XmNborderWidth, 1, NULL);
8669:   XtSetSensitive(pushButtonSpliceClearTie, True);
8670:   XtSetSensitive(pushButtonClearGrab, True);
8671:   XtSetSensitive(pushButtonGetSelectCore, False);
8672:   XtSetSensitive(pushButtonAppendSplice, FALSE);
8673:   XtVaSetValues(pushButtonAppendSplice, XmNborderWidth, 0, NULL);
8674:   XtSetSensitive(pushButtonSpliceUndoLast, FALSE);
8675: 
8676:   /* calc. the depth offset at tie 
8677:   */
8678:   if(are_splicing == CONSTRAINED) {
8679:     splicedepoffset = 0.0;
8680:   }
8681:   else if(are_splicing == UNCONSTRAINED) {
8682:     splicedepoffset = (spcomp.sb_depth[spcompcorenum][spcomparraynum]) -
8683:                       (data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->sb_depth +
8684:                        data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset);
8685:   }
8686: 
8687:   /* clean up the core to splice(spliced comp allready clean)
8688:      and find the new array tie if cull or average.
8689:      put it and the spliced comp  in temp arrays.
8690:      repick the depth in temp arrays at constant depth step.
8691:   */
8692:   if(smooth.method == NONE){
8693:     sm = NO;
8694:   }
8695:   else if((smooth.method == GAUSSIAN || smooth.method == OTHER) && 
8696:           (smooth.plot == UNSMOOTHED)){ 
8697:     sm = NO; 
8698:   }
8699:   else if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
8700:           (smooth.plot == SMOOTHED || smooth.plot == SMOOTHEDBOTH) &&
8701:           (data[dset]->holes[spliceholenum]->core[splicecorenum]->smooth_status == SMOK &&
8702:            data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->smooth_status == SMOK)){
8703:     sm = YES;
8704:   }
8705:   else {
8706:     sm = NO;
8707:   }
8708: 
8709:   /* get the core to be spliced
8710:   */
8711:   core2arraynum = splicearraynum;
8712:   err = CleanUpCore(dset, spliceholenum, splicecorenum, &core2n, core2dep, core2var, sm, &core2arraynum);
8713:   if(err > 0){
8714:     (void)sprintf(buffer, "Error trying to get the core to splice.");
8715:     SpManageWarningBox(buffer);
8716:     return;
8717:   }
8718: 
8719:   /* if are splicing constrained and the tie is at an interpolated value;
8720:      need to put the interpolated point in core... array.
8721:      note that splicearraynum would then be the indicy of next real point
8722:   */
8723:   if(are_splicing == CONSTRAINED && splice_how == INTERPOLATED) {
8724:     for(i=core2n; i>core2arraynum; --i){
8725:       core2dep[i] = core2dep[i-1];
8726:       core2var[i] = core2var[i-1];
8727:     }
8728:     core2dep[core2arraynum] = interpsplice_spl_depth;
8729:     core2var[core2arraynum] = interpsplice_val;
8730:     ++core2n;
8731:   }
8732: 
8733:   /* put the spliced composite in a temp array
8734:   */
8735:   for(i=0; i<spcomp.numpercore[spcompcorenum]; ++i){
8736:     if(sm == YES && data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->value[spcomp.MapToOrig[spcompcorenum][i]]->smooth_ok >= SMOK){
8737:       core1var[i] = data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->value[spcomp.MapToOrig[spcompcorenum][i]]->sm_data;
8738:     }
8739:     else {
8740:       core1var[i] = spcomp.var[spcompcorenum][i];
8741:     }
8742:     core1dep[i] = spcomp.sb_depth[spcompcorenum][i];
8743:   } 
8744:   core1n = spcomp.numpercore[spcompcorenum];
8745:   core1arraynum = spcomparraynum;
8746: 
8747:   str = XmTextGetString(textCompDepthStep);
8748:   depstep = atof(str);
8749:   XtFree(str);
8750:   range1 = core1dep[core1n-1] - core1dep[0];
8751:   range2 = core2dep[core2n-1] - core2dep[0];
8752:   if(range1/depstep > MAXPERCORE || range2/depstep > MAXPERCORE){
8753:     (void)sprintf(buffer, "The depth step you have chosen exceeds the limits of samples allowed in cores to correlate.");
8754:     SpManageWarningBox(buffer);
8755:     XtSetSensitive(pushButtonSpliceCorrelate, True);
8756:     return;
8757:   }
8758:   else if(depstep > 0.0){
8759:     RepickDepth(core1dep, core1var, &core1n, &core1arraynum, depstep);
8760:     RepickDepth(core2dep, core2var, &core2n, &core2arraynum, depstep);
8761:   }
8762:   else {
8763:     (void)sprintf(buffer, "Error: The depth step is less than or equal to 0.0.");
8764:     SpManageWarningBox(buffer);
8765:     XtSetSensitive(pushButtonSpliceCorrelate, True);
8766:     return;
8767:   }
8768: 
8769:   /*get the window length and find the first value(array member) of core 2
8770:     that is within the window. then count out to the last value that is in the window
8771:   */
8772:   str = XmTextGetString(textCompWindowLen);
8773:   winlen = atof(str);
8774:   XtFree(str);
8775:   if(winlen > 0.0) {
8776:     for(i=0; i<core2n; ++i){
8777:       if(core2dep[i] >= core2dep[core2arraynum] - winlen){
8778:         core2offset=i;
8779:         break;
8780:       }  
8781:     }  
8782:     nwin=0;
8783:     for(j=i; j<core2n; ++j){
8784:       if(core2dep[j] > core2dep[core2arraynum] + winlen){
8785:         break;
8786:       }  
8787:       else {
8788:         ++nwin;
8789:       }  
8790:     }  
8791:   }  
8792:   else {
8793:     (void)sprintf(buffer, "Error: The window length is less than or equal to 0.0.");
8794:     SpManageWarningBox(buffer);
8795:     XtSetSensitive(pushButtonSpliceCorrelate, True);
8796:     return;
8797:   } 
8798: 
8799: 
8800:   /*get the lead,lag(in meters) and find the lead,lag
8801:     in data points
8802:   */
8803:   str= XmTextGetString(textCompLeadLag);
8804:   leadlagmeters = atof(str);
8805:   XtFree(str);
8806:   if(leadlagmeters > 0.0){
8807:     lead_lag = leadlagmeters/depstep;
8808:     num_lead_lag = lead_lag * 2 + 1;
8809:     lag = -1.0 * lead_lag;
8810:   }
8811:   else { 
8812:     lead_lag=0;  
8813:     lag=0;
8814:   }
8815:   if(num_lead_lag > MAXCORR){
8816:     (void)sprintf(buffer, "The lead/lag you have chosen exceeds the limit for number of correlations allowed.");
8817:     XtSetSensitive(pushButtonSpliceCorrelate, True);
8818:     SpManageWarningBox(buffer);
8819:     return;
8820:   }
8821: 
8822:   /* calc. corr. coef. for each lead,lag in given window
8823:      note that core1offset causes core 1 to lag and then lead
8824:      core 2
8825:   */
8826:   corr.num_lead_lag[dset] = 0;
8827:   tie_corr_num = 0;
8828:   for(i=0;i<num_lead_lag; ++i){
8829:     core1offset = core1arraynum - core2arraynum - lag;
8830:     Correlate(core1n, nwin, core1offset, core2offset, core1var, core2var,
8831:                   &coef, &n);
8832: 
8833:     /* cull out any lead/lag that had less than TOOFEWCORRPAIRS
8834:        which includes situations where the lead/lag caused core 1
8835:        to not overlay core 2; n=0
8836:     */
8837:     if(n < TOOFEWCORRPAIRS){
8838: 
8839:     }
8840:     else {
8841:       corr.coef[dset][corr.num_lead_lag[dset]] = coef;
8842:       corr.n[corr.num_lead_lag[dset]] = n;
8843:       corr.leadlag[dset][corr.num_lead_lag[dset]] = lag;
8844:       corr.depoffset[corr.num_lead_lag[dset]] = core1dep[core1arraynum] - core2dep[core2arraynum] - lag * depstep;
8845:       corr.depleadlag[dset][corr.num_lead_lag[dset]] = lag * depstep;
8846:       if(lag == 0){
8847:         tie_corr_num = corr.num_lead_lag[dset];
8848:       }  
8849:       ++corr.num_lead_lag[dset];
8850:     }
8851:     ++lag;
8852:   } 
8853: 
8854:   /* find the highest corr. coef. and remember its array member
8855:      number
8856:      and draw the correlation
8857:   */
8858:   if(lead_lag > 0){
8859:     best_corr = corr.coef[dset][0];
8860:     best_corr_num = 0;
8861:     for(i=1; i<corr.num_lead_lag[dset]; ++i){
8862:       if(corr.coef[dset][i] > best_corr){
8863:         best_corr = corr.coef[dset][i];
8864:         best_corr_num = i;
8865:       }  
8866:     }  
8867:     have_spcorr = DO;
8868:   }
8869:   else {
8870:   }
8871: 
8872:   /* correlate any other data sets
8873:   */
8874:   if(dataset_cnt > 1) {
8875:     for(d=0; d<dataset_cnt; ++d) {
8876:       if(d != dset) {
8877: 
8878:         newtie1hole = -1;
8879:         newtie1core = -1;
8880:         newtie1array = -1;
8881:         newtie2hole = -1;
8882:         newtie2core = -1;
8883:         newtie2array = -1;
8884: 
8885:         /* get the splice
8886:         */
8887:         for(i=0; i<data[d]->numholes; ++i) {
8888:           if(data[d]->holes[i]->name == data[dset]->holes[spcomp.hole[spcompcorenum]]->name) {
8889:             newtie1hole = i;
8890:             break;
8891:           }
8892:         }
8893:         if(newtie1hole == -1) {
8894:         }
8895:         else {
8896:           for(i=0; i<data[d]->holes[newtie1hole]->numcores; ++i) {
8897:             if(data[d]->holes[newtie1hole]->core[i]->num == 
8898:                    data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->num) {
8899:               newtie1core = i;
8900:               break;
8901:             }
8902:           }
8903:           if(newtie1core == -1) {
8904:           }
8905:           else {
8906:             h = newtie1hole;
8907:             c = newtie1core;
8908:             core1n = 0;
8909:             for(i=0; i<data[d]->holes[h]->core[c]->numvalues; ++i) {
8910:               if(data[d]->holes[h]->core[c]->value[i]->quality & BAD_SB_DEPTH) {
8911:               }
8912:               else if(data[d]->holes[h]->core[c]->value[i]->quality == GOOD) {
8913:                 core1dep[core1n] = data[d]->holes[h]->core[c]->value[i]->sb_depth +
8914:                                    data[d]->holes[h]->core[c]->cum_dep_offset;
8915:                 if(sm == YES) {
8916:                   core1var[core1n] = data[d]->holes[h]->core[c]->value[i]->sm_data;
8917:                 }
8918:                 else {
8919:                   core1var[core1n] = *data[d]->holes[h]->core[c]->value[i]->data;
8920:                 }
8921:                 ++core1n;
8922:               }
8923:             }
8924:             if(core1n > 5) {
8925:               depth = spcomp.sb_depth[spcompcorenum][spcomparraynum];
8926:               if(depth < core1dep[0] || depth > core1dep[core1n-1]) {
8927:               }
8928:               else {
8929:                 err = InterpolateTiePtValue(core1n, core1dep, core1var, depth, &intpt, &start);
8930:                 if(err > 0) {
8931:                 }
8932:                 else if(start < 0 || start >= core1n) {
8933:                 }
8934:                 else {
8935:                   for(i=core1n; i>start+1; --i) {
8936:                     core1dep[i] = core1dep[i-1];
8937:                     core1var[i] = core1var[i-1];
8938:                   }
8939:                   ++core1n;
8940:                   core1dep[start + 1] = depth;
8941:                   core1var[start + 1] = intpt;
8942:                   newtie1array = start + 1;
8943:                 }
8944:               }
8945:             }
8946:           }
8947:         }
8948: 
8949:         /* get the core to be spliced
8950:         */
8951:         for(i=0; i<data[d]->numholes; ++i) {
8952:           if(data[d]->holes[i]->name == data[dset]->holes[spliceholenum]->name) {
8953:             newtie2hole = i;
8954:             break;
8955:           }
8956:         }
8957:         if(newtie2hole == -1) {
8958:         }
8959:         else {
8960:           for(i=0; i<data[d]->holes[newtie2hole]->numcores; ++i) {
8961:             if(data[d]->holes[newtie2hole]->core[i]->num == data[dset]->holes[spliceholenum]->core[splicecorenum]->num) {
8962:               newtie2core = i;
8963:               break;
8964:             }
8965:           }
8966:           if(newtie2core == -1) {
8967:           }
8968:           else {
8969:             h = newtie2hole;
8970:             c = newtie2core;
8971:             core2n = 0;
8972:             for(i=0; i<data[d]->holes[h]->core[c]->numvalues; ++i) {
8973:               if(data[d]->holes[h]->core[c]->value[i]->quality & BAD_SB_DEPTH) {
8974:               }
8975:               else if(data[d]->holes[h]->core[c]->value[i]->quality == GOOD) {
8976:                 core2dep[core2n] = data[d]->holes[h]->core[c]->value[i]->sb_depth +
8977:                                    data[d]->holes[h]->core[c]->cum_dep_offset;
8978:                 if(sm == YES) {
8979:                   core2var[core2n] = data[d]->holes[h]->core[c]->value[i]->sm_data;
8980:                 }
8981:                 else {
8982:                   core2var[core2n] = *data[d]->holes[h]->core[c]->value[i]->data;
8983:                 }
8984:                 ++core2n;
8985:               }
8986:             }
8987:             if(core2n > 5) {
8988:               depth = interpsplice_spl_depth;
8989:               if(depth < core2dep[0] || depth > core2dep[core2n-1]) {
8990:               }
8991:               else {
8992:                 err = InterpolateTiePtValue(core2n, core2dep, core2var, depth, &intpt, &start);
8993:                 if(err > 0) {
8994:                 }
8995:                 else if(start < 0 || start >= core2n) {
8996:                 }
8997:                 else {
8998:                   for(i=core2n; i>start+1; --i) {
8999:                     core2dep[i] = core2dep[i-1];
9000:                     core2var[i] = core2var[i-1];
9001:                   }
9002:                   ++core2n;
9003:                   core2dep[start + 1] = depth;
9004:                   core2var[start + 1] = intpt;
9005:                   newtie2array = start + 1;
9006:                 }
9007:               }
9008:             }
9009:           }
9010:         }
9011:         if(newtie1array != -1 && newtie2array != -1) {
9012:           if(err == 0){
9013:             range1 = core1dep[core1n-1] - core1dep[0];
9014:             range2 = core2dep[core2n-1] - core2dep[0];
9015:             if(range1/depstep < MAXPERCORE || range2/depstep < MAXPERCORE){
9016:               tie1num = newtie1array;
9017:               tie2num = newtie2array;
9018:               RepickDepth(core1dep, core1var, &core1n, &tie1num, depstep);
9019:               RepickDepth(core2dep, core2var, &core2n, &tie2num, depstep);
9020:             }
9021:             else {
9022:               err = 1;
9023:             }
9024:           }
9025:         }
9026:         if(newtie1array != -1 && newtie2array != -1 && err == 0) {
9027:           for(i=0; i<core2n; ++i){
9028:             if(core2dep[i] >= core2dep[tie2num]-winlen){
9029:               core2offset=i;
9030:               break;
9031:             }
9032:           }
9033:           nwin=0;
9034:           for(j=i; j<core2n; ++j){
9035:             if(core2dep[j] > core2dep[tie2num]+winlen){
9036:               break;
9037:             }
9038:             else {
9039:               ++nwin;
9040:             }
9041:           }
9042:           if(leadlagmeters > 0.0){
9043:             lead_lag = leadlagmeters/depstep;
9044:             num_lead_lag = lead_lag * 2 + 1;
9045:             lag = -1.0 * lead_lag;
9046:           }
9047:           else {
9048:             lead_lag=0;
9049:             lag=0;
9050:           }
9051: 
9052:           corr.num_lead_lag[d] = 0;
9053:           for(i=0;i<num_lead_lag; ++i){
9054:             core1offset = tie1num - tie2num - lag;
9055:             Correlate(core1n, nwin, core1offset, core2offset, core1var, core2var,
9056:                     &coef, &n);
9057: 
9058:             if(n < TOOFEWCORRPAIRS){
9059:             }
9060:             else {
9061:               corr.coef[d][corr.num_lead_lag[d]] = coef;
9062:               corr.leadlag[d][corr.num_lead_lag[d]] = lag;
9063:               corr.depleadlag[d][corr.num_lead_lag[d]] = lag * depstep;
9064:               if(lag == 0){
9065:                 tie_corr_num = corr.num_lead_lag[d];
9066:               }
9067:               ++corr.num_lead_lag[d];
9068:             }
9069:             ++lag;
9070:           }
9071:         }
9072:       }
9073:     }
9074:   }
9075: 
9076:   /* draw the core 2 overlay of core 1
9077:   */
9078:   have_splice_tie = DONT;
9079:   have_splice_shift = DO;
9080:   if(XtIsManaged(XtParent(drawingAreaView))) {
9081:     reason_for_redraw = DRAW_TIES;
9082:     DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
9083:   }
9084:   if(XtIsManaged(XtParent(drawingAreaCompCorrelation))) {
9085:     DrawDrawingAreaCompCorrelation(drawingAreaCompCorrelation, (XtPointer)NULL, (XtPointer)NULL);
9086:   }
9087: }
9088: 
9089: /* ARGSUSED */
9090: void
9091: SpliceDismiss(w, client, call)
9092: Widget w;
9093: XtPointer client;
9094: XtPointer call;
9095: {
9096:   /*SUPPRESS 594*/
9097: 
9098:   void DrawDrawingAreaView();
9099: 
9100:   have_splice_tie = DONT;
9101:   have_splice_shift = DONT;
9102:   have_spcorr = DONT;
9103:   last_sp_tie = NO;
9104:   have_sp_tie1 = DONT;
9105:   have_sp_tie2 = DONT;
9106:   are_splicing = NO;
9107:   splice_how = NONE;
9108: 
9109:   if(XtIsManaged(XtParent(drawingAreaCompCorrelation))) {
9110:     XClearWindow(XtDisplay(drawingAreaCompCorrelation), XtWindow(drawingAreaCompCorrelation));
9111:   }
9112:   if(XtIsManaged(XtParent(drawingAreaView))) {
9113:     if(have_core_to_splice == DO) {
9114:       reason_for_redraw = DRAW_CORECLEARED;
9115:       DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
9116:     }
9117:   }
9118:   have_core_to_splice = DONT;
9119: 
9120:   XtUnmanageChild(formSplicing);
9121: }
9122: 
9123: /* ARGSUSED */
9124: void
9125: SpliceHelp(w, client, call)
9126: Widget w;
9127: XtPointer client;
9128: XtPointer call;
9129: {
9130:   /*SUPPRESS 594*/
9131: }
9132: 
9133: /* ARGSUSED */
9134: void
9135: AppendSplice(w, client, call)
9136: Widget w;
9137: XtPointer client;
9138: XtPointer call;
9139: {
9140:   /*SUPPRESS 594*/
9141: 
9142:   int i, j, l, n, nv, k, ds, err, sm, sect, array, splhole, splcore;
9143:   time_t tp;
9144:   char string[50], date[200], *ptr;
9145:   float depth, raw_val, sm_val, sect_dep;
9146:   double fract, ip;
9147:   XmString xmstring;
9148:   int CleanUpSpliceCore(), FindValueInCoreToSplice();
9149:   void DrawDrawingAreaView(), SpliceToTie();
9150: 
9151:   if(smooth.method == NONE){
9152:     sm = NO;
9153:   }
9154:   else if(smooth.method == GAUSSIAN || smooth.method == OTHER &&
9155:              smooth.plot == UNSMOOTHED){
9156:     sm = NO;
9157:   }
9158:   else if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
9159:           (smooth.plot == SMOOTHED || smooth.plot == SMOOTHEDBOTH)){
9160:     sm = YES;
9161:   }
9162:   else {
9163:     sm = NO;
9164:   }
9165: 
9166:   /* if the cores overlapped only slightly get the tie point
9167:      for the last value in the splice and go to SpliceToTie
9168:      to tie it
9169:   */
9170:   if(have_core_to_splice == DO && splice_overlap == OVERLAPAPPEND) {
9171:     depth = spcomp.sb_depth[spcomp.numcores-1][spcomp.numpercore[spcomp.numcores-1] - 1];
9172:     err = FindValueInCoreToSplice(dset, sm, depth, spliceholenum, splicecorenum,
9173:                                         &splicearraynum, &splice_how, &raw_val, &sm_val);
9174:     if(err == 0) {
9175:       spcompcorenum = spcomp.numcores-1;
9176:       spcomparraynum = spcomp.numpercore[spcomp.numcores-1] - 1;
9177:       interpsplice_val = raw_val;
9178:       interpsplice_sm_val = sm_val;
9179:       interpsplice_spl_depth = depth;
9180:       SpliceToTie((Widget)NULL, (XtPointer)NULL, (XtPointer)NULL);
9181:     }
9182:     else {
9183:     }
9184:     return;
9185:   }
9186: 
9187:   /* make sure the ties, depth step and selected core text
9188:      are clear
9189:   */
9190:   (void)sprintf(string, "");
9191:   XtVaSetValues(textCompSelectHole, XmNvalue, string, NULL);
9192:   XtVaSetValues(textCompSelectCore, XmNvalue, string, NULL);
9193:   XtVaSetValues(textCompDepthStep, XmNvalue, string, NULL);
9194:   xmstring = XmStringCreateSimple(string);
9195:   XtVaSetValues(labelSpliceTie1ID, XmNlabelString, xmstring, NULL);
9196:   XtVaSetValues(labelSpliceTie1var, XmNlabelString, xmstring, NULL);
9197:   XtVaSetValues(labelSpliceTie1sbd, XmNlabelString, xmstring, NULL);
9198:   XtVaSetValues(labelSpliceTie2ID, XmNlabelString, xmstring, NULL);
9199:   XtVaSetValues(labelSpliceTie2var, XmNlabelString, xmstring, NULL);
9200:   XtVaSetValues(labelSpliceTie2sbd, XmNlabelString, xmstring, NULL);
9201:   XtVaSetValues(labelSpliceDifferenceInValue, XmNlabelString, xmstring, NULL);
9202:   XmStringFree(xmstring);
9203: 
9204:   if(have_core_to_splice == DO){
9205:  
9206:     have_core_to_splice = DONT;
9207:     have_splice_tie = DONT;
9208:     have_splice_shift = DONT;
9209:     last_sp_tie = NONE; 
9210:     have_sp_tie1 = DONT; 
9211:     have_sp_tie2 = DONT;
9212:     splice_how = NONE;
9213:  
9214:     /* set all buttons except dismiss, undo and grab insensitive
9215:     */
9216:     XtSetSensitive(pushButtonGetSelectCore, True);
9217:     XtSetSensitive(pushButtonClearGrab, FALSE);
9218:     XtSetSensitive(pushButtonSpliceClearTie, FALSE);
9219:     XtSetSensitive(pushButtonSpliceCorrelate, FALSE);
9220:     XtSetSensitive(pushButtonSpliceToTie, FALSE);
9221:     XtVaSetValues(pushButtonSpliceToTie, XmNborderWidth, 0, NULL);
9222:     XtSetSensitive(pushButtonAppendSplice, FALSE);
9223:     XtVaSetValues(pushButtonAppendSplice, XmNborderWidth, 0, NULL);
9224:     XtSetSensitive(pushButtonSpliceUndoLast, True);
9225:     XtSetSensitive(pushButtonSuggestTies, False);
9226: 
9227:     i = spcomp.numcores;
9228:     ++spcomp.numcores;
9229:     splicearraynum = 0;
9230:    
9231:     spcomp.Depthoffset[i] = data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset; 
9232:     err = CleanUpSpliceCore(spliceholenum, splicecorenum, &spcomp.numpercore[i],
9233:                 spcomp.sb_depth[i], spcomp.var[i], sm, i, splicearraynum, spcomp.MapToOrig[i]);
9234:  
9235:     if(err > 0){
9236:       (void)sprintf(buffer, "ERROR; Could not append this core.");
9237:       SpManageWarningBox(buffer);
9238:       --spcomp.numcores;
9239:       XtSetSensitive(pushButtonClearGrab, True);   
9240:       return;
9241:     }
9242: 
9243:     /* check to see if the append core overlaps the splice composite
9244:     */ 
9245:     if(splice_overlap == YES && spcomp.sb_depth[i][0] <= spcomp.sb_depth[i-1][spcomp.numpercore[i-1] - 1]){ 
9246:       (void)sprintf(buffer, "ERROR;  the core to append overlaps the one above.");
9247:       SpManageWarningBox(buffer);
9248:       have_core_to_splice = DO;
9249:       XtSetSensitive(pushButtonClearGrab, True);
9250:       --spcomp.numcores;
9251:       return;
9252:     }
9253:     else {
9254:  
9255:       spcomp.hole[i] = spliceholenum;
9256:       spcomp.core[i] = splicecorenum;
9257:       spcomp.splice_how[i] = APPEND;
9258: 
9259:       n = splicertable.data_cnt -1;
9260:       (void)strcpy(splicertable.data[n].type_of_splice, "append");
9261:  
9262:       ++splicertable.data_cnt;
9263:       ++n;
9264:       splicertable.data[n].site = data[dset]->site;
9265:       splicertable.data[n].hole = data[dset]->holes[spliceholenum]->name;
9266:       splicertable.data[n].core = data[dset]->holes[spliceholenum]->core[splicecorenum]->num;
9267:       splicertable.data[n].core_type = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[0]->type;
9268:       (void)strcpy(splicertable.data[n].type_of_splice, "append");
9269:       if(strcmp(data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->section, "CC") == 0) {
9270:         sect = 1;
9271:         (void)sprintf(buffer, "Warning; The top of core to splice is in the core catcher.\n");
9272:         (void)strcat(buffer,  "         Unable to calculate core top depth.\n");
9273:         (void)strcat(buffer,  "         Proceding but beware; the splice table will be incorrect.");
9274:         SpManageWarningBox(buffer);
9275:       }
9276:       else {
9277:         sect = atoi(data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->section);
9278:       }  
9279:       sect_dep = (data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->bot_int - 
9280:                   data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->top_int)/2.0 +
9281:                      data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->top_int;
9282:       fract = modf(sect_dep/1.0, &ip);
9283:       if(fract <= 0.41) {
9284:         sect_dep = ip;
9285:       }
9286:       else if(fract >= 0.59) {
9287:         sect_dep = ip + 1.0;
9288:       }
9289:       else {
9290:         sect_dep = ip + 1.0;
9291:       }
9292:       (void)strcpy(splicertable.data[n].section, "1");
9293:       splicertable.data[n].top_int = 0.0;
9294:       splicertable.data[n].bot_int = 0.0;
9295:       splicertable.data[n].mbsf = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->sb_depth -
9296:                                     sect_dep/100.0 - ((sect - 1) * 1.5);
9297:       splicertable.data[n].mcd = splicertable.data[n].mbsf + spcomp.Depthoffset[i];
9298:  
9299:       spcomp.map_to_table[i] = n;
9300: 
9301:       if(splicertable.data[n].mcd <= spcomp.sb_depth[i-1][spcomp.numpercore[i-1] - 1]) {
9302:         (void)sprintf(buffer, "Warning;  the calc. depth of appended core top overlaps splice above.");
9303:         SpManageWarningBox(buffer);
9304:       }
9305: 
9306:       if(splicertable.data_cnt+1>=splicertable.alloc_cnt) {
9307:         if((ptr=(char*)realloc((char*)splicertable.data,(splicertable.alloc_cnt+=ALLOC_INT)*sizeof(SplicerTableInfo)))==NULL) {
9308:           SpBadMemAlloc("BAD MEM");
9309:         }
9310:         else {
9311:           splicertable.data=(SplicerTableInfo*)ptr;
9312:         }
9313:       }
9314: 
9315:       ++n; 
9316:       ++splicertable.data_cnt; 
9317:       nv = data[dset]->holes[spliceholenum]->core[splicecorenum]->numvalues - 1; 
9318:       splicertable.data[n].site = data[dset]->site;
9319:       splicertable.data[n].hole = data[dset]->holes[spliceholenum]->name;  
9320:       splicertable.data[n].core = data[dset]->holes[spliceholenum]->core[splicecorenum]->num;   
9321:       splicertable.data[n].core_type = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[nv]->type; 
9322: 
9323: 
9324:       /* if more than one data set find which dataset that has the depthest core
9325:       */
9326:       ds = dset;
9327:       splhole = spliceholenum;
9328:       splcore = splicecorenum;
9329:       if(dataset_cnt > 1) {
9330:         depth = data[ds]->holes[spliceholenum]->core[splicecorenum]->value[nv]->sb_depth;
9331:         for(j=0; j<dataset_cnt; ++j) {
9332:           if(j != dset) {
9333:             /* is the splice hole,core in this dataset?
9334:             */
9335:             for(k=0; k<data[j]->numholes; ++k) {
9336:               if(data[j]->holes[k]->name == data[dset]->holes[spliceholenum]->name) {
9337:                 for(l=0; l<data[j]->holes[k]->numcores; ++l) {
9338:                   if(data[j]->holes[k]->core[l]->num == data[dset]->holes[spliceholenum]->core[splicecorenum]->num) {
9339:                     nv = data[j]->holes[k]->core[l]->numvalues - 1;
9340:                     if(data[j]->holes[k]->core[l]->value[nv]->sb_depth > depth) {
9341:                       ds = j;
9342:                       depth = data[j]->holes[k]->core[l]->value[nv]->sb_depth;
9343:                       splhole = k;
9344:                       splcore = l;
9345:                     }
9346:                   }
9347:                 }
9348:               }
9349:             }
9350:           }
9351:         }
9352:       }
9353:       else {
9354:       }
9355:       nv = data[ds]->holes[splhole]->core[splcore]->numvalues - 1;
9356:       (void)strcpy(splicertable.data[n].section, data[ds]->holes[splhole]->core[splcore]->value[nv]->section);
9357:       splicertable.data[n].top_int = data[ds]->holes[splhole]->core[splcore]->value[nv]->top_int;
9358:       splicertable.data[n].bot_int = data[ds]->holes[splhole]->core[splcore]->value[nv]->bot_int;
9359:       splicertable.data[n].mbsf = data[ds]->holes[splhole]->core[splcore]->value[nv]->sb_depth;
9360:       splicertable.data[n].mcd = splicertable.data[n].mbsf + spcomp.Depthoffset[i];
9361: 
9362:       did_splicing = YES;
9363:       saved_splice = NO;
9364: 
9365:       /* write tie to  report
9366:       */
9367:       if(time(&tp)) {
9368:         (void)sprintf(date, "%s", ctime(&tp));
9369:       }
9370:       else {
9371:         (void)sprintf(date, "no date available\n");
9372:       }
9373:       if(are_splicing == CONSTRAINED) {
9374:         (void)sprintf(buffer,"\nSplice: Constrained;  hole %c core %d;  CORE APPEND TO SPLICE    %s", 
9375:                         data[dset]->holes[spliceholenum]->name, data[dset]->holes[spliceholenum]->core[splicecorenum]->num, date);
9376:       }  
9377:       else if(are_splicing == UNCONSTRAINED) {
9378:         (void)sprintf(buffer,"\nSplice: Unconstrained;  hole %c core %d;  CORE APPEND TO SPLICE    %s", 
9379:                         data[dset]->holes[spliceholenum]->name, data[dset]->holes[spliceholenum]->core[splicecorenum]->num, date);
9380:       }  
9381:       else {
9382:         (void)sprintf(buffer,"");
9383:       }  
9384:       SpUpdateReport(buffer);
9385:  
9386:       if(XtIsManaged(XtParent(drawingAreaView))) {
9387:         reason_for_redraw = DRAW_APPEND;
9388:         DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
9389:       }
9390:     }
9391:   }
9392: 
9393:   (void)sprintf(string, "");
9394:   (void)sprintf(date, "");
9395: }
9396: 
9397: /* ARGSUSED */
9398: void
9399: SpliceUndoLast(w, client, call)
9400: Widget w;
9401: XtPointer client;
9402: XtPointer call;
9403: {
9404:   /*SUPPRESS 594*/
9405: 
9406:   int i, j, k, l, splicer_cnt, ncore, dnum, hnum, cnum, anum, sm, err, changed;
9407:   float depth;
9408:   time_t tp;
9409:   char string[50], date[200];  
9410:   XmString xmstring;
9411:   int MakeSplice(), CleanUpSpliceCore();
9412:   void DrawDrawingAreaView(), DrawDrawingAreaAgeDepth(), XmListDeletePos(), PlotSpliceVsAge();
9413: 
9414: 
9415:   /* if have no more cores in splice make undo last
9416:      button insensitive. but not if still have cores
9417:      in splice table
9418:   */
9419:   if(spcomp.numcores - 1 < 1){
9420:     if(splicertable.data_cnt-2 > 0) {
9421:     }
9422:     else {
9423:       XtSetSensitive(pushButtonSpliceUndoLast, FALSE);
9424:       XtSetSensitive(pushButtonSaveSplicerTable,FALSE);
9425:       XtSetSensitive(pushButtonSaveSplicerData,FALSE);
9426:       XtSetSensitive(pushButtonClearSplice, False);
9427:       XtSetSensitive(pushButtonOpenSplicerTable,True);
9428:       did_splicing = NO;
9429:       saved_splice = NO;
9430:     }
9431:   }
9432: 
9433:   /* reset buttons and text
9434:   */
9435:   /* set the window length and  lead,lag to the defaults
9436:   */
9437:   (void)sprintf(string, "%.2f", WINLEN);
9438:   XtVaSetValues(textCompWindowLen, XmNvalue, string, NULL);
9439:   (void)sprintf(string, "%.2f", LEADLAG);
9440:   XtVaSetValues(textCompLeadLag, XmNvalue, string, NULL);
9441: 
9442:   /* make sure the ties, depth step and selected core text
9443:      are clear
9444:   */
9445:   (void)sprintf(string, "");
9446:   XtVaSetValues(textCompSelectHole, XmNvalue, string, NULL);
9447:   XtVaSetValues(textCompSelectCore, XmNvalue, string, NULL);
9448:   XtVaSetValues(textCompDepthStep, XmNvalue, string, NULL);
9449:   xmstring = XmStringCreateSimple(string);
9450:   XtVaSetValues(labelSpliceTie1ID, XmNlabelString, xmstring, NULL);
9451:   XtVaSetValues(labelSpliceTie1var, XmNlabelString, xmstring, NULL);
9452:   XtVaSetValues(labelSpliceTie1sbd, XmNlabelString, xmstring, NULL);
9453:   XtVaSetValues(labelSpliceTie2ID, XmNlabelString, xmstring, NULL);
9454:   XtVaSetValues(labelSpliceTie2var, XmNlabelString, xmstring, NULL);
9455:   XtVaSetValues(labelSpliceTie2sbd, XmNlabelString, xmstring, NULL);
9456:   XtVaSetValues(labelSpliceDifferenceInValue,XmNlabelString, xmstring, NULL);
9457:   XmStringFree(xmstring);
9458:  
9459:   /* set all buttons except dismiss, grab undo last insensitive
9460:   */
9461:   XtSetSensitive(pushButtonGetSelectCore, True);
9462:   XtSetSensitive(pushButtonClearGrab, FALSE);
9463:   XtSetSensitive(pushButtonSpliceClearTie, FALSE);
9464:   XtSetSensitive(pushButtonSpliceCorrelate, FALSE);
9465:   XtSetSensitive(pushButtonSpliceToTie, FALSE);
9466:   XtVaSetValues(pushButtonSpliceToTie, XmNborderWidth, 0, NULL);
9467:   XtSetSensitive(pushButtonAppendSplice, FALSE);
9468:   XtVaSetValues(pushButtonAppendSplice, XmNborderWidth, 0, NULL);
9469: 
9470:   /* and clear the correlation window
9471:   */
9472:   if(XtIsManaged(XtParent(drawingAreaCompCorrelation))) {
9473:     XClearWindow(XtDisplay(drawingAreaCompCorrelation), 
9474:                  XtWindow(drawingAreaCompCorrelation));
9475:   }
9476: 
9477: 
9478:   if(smooth.method == NONE){
9479:     sm = NO;
9480:   }    
9481:   else if(smooth.method == GAUSSIAN || smooth.method == OTHER &&
9482:              smooth.plot == UNSMOOTHED){
9483:     sm = NO;
9484:   }    
9485:   else if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
9486:           (smooth.plot == SMOOTHED || smooth.plot == SMOOTHEDBOTH)){
9487:     sm = YES;
9488:   }  
9489:   else {
9490:     sm = NO;
9491:   }
9492: 
9493:   /* get the time
9494:   */
9495:   ncore = spcomp.numcores - 1;
9496:   if(time(&tp)) {
9497:     (void)sprintf(date, "%s", ctime(&tp));
9498:   }
9499:   else {
9500:     (void)sprintf(date, "no date available\n");
9501:   }
9502: 
9503:   if(splicertable.data_cnt == 0) {
9504:   }
9505:   else if(spcomp.numcores > 1 && spcomp.map_to_table[ncore] == splicertable.data_cnt-2) {
9506:     --spcomp.numcores;
9507:     --ncore;
9508:     hnum = spcomp.hole[ncore];
9509:     cnum = spcomp.core[ncore];
9510:     anum = spcomp.MapToOrig[ncore][0];
9511: 
9512:     splicertable.data_cnt = splicertable.data_cnt -2;
9513: 
9514:     if(are_splicing == CONSTRAINED) {
9515:       (void)sprintf(buffer,"\nSplice: Constrained;  hole %c core %d;  CORE SPLICE UNDONE    %s",
9516:                   data[dset]->holes[spcomp.hole[ncore]]->name, data[dset]->holes[spcomp.hole[ncore]]->core[spcomp.core[ncore]]->num, date);
9517:     }
9518:     else if(are_splicing == UNCONSTRAINED) {
9519:       (void)sprintf(buffer,"\nSplice: Unconstrained;  hole %c core %d;  CORE SPLICE UNDONE    %s",
9520:                    data[dset]->holes[spcomp.hole[ncore]]->name, data[dset]->holes[spcomp.hole[ncore]]->core[spcomp.core[ncore]]->num, date);
9521:     }
9522:     else {
9523:       (void)sprintf(buffer,"");
9524:     }
9525:     SpUpdateReport(buffer);
9526:   }   
9527: 
9528:   else if(spcomp.numcores == 1 && spcomp.map_to_table[ncore] == splicertable.data_cnt-2) {
9529:     have_splice = DONT;  
9530:     splicertable.data_cnt = splicertable.data_cnt - 2;
9531:     spcomp.numcores = 0;
9532:     if(are_splicing == CONSTRAINED) { 
9533:       (void)sprintf(buffer,"\nSplice: Constrained;  hole %c core %d;  CORE SPLICE UNDONE    %s", 
9534:                   data[dset]->holes[spcomp.hole[ncore]]->name, data[dset]->holes[spcomp.hole[ncore]]->core[spcomp.core[ncore]]->num, date);
9535:     } 
9536:     else if(are_splicing == UNCONSTRAINED) { 
9537:       (void)sprintf(buffer,"\nSplice: Unconstrained;  hole %c core %d;  CORE SPLICE UNDONE    %s", 
9538:                    data[dset]->holes[spcomp.hole[ncore]]->name, data[dset]->holes[spcomp.hole[ncore]]->core[spcomp.core[ncore]]->num, date); 
9539:     } 
9540:     else { 
9541:       (void)sprintf(buffer,""); 
9542:     } 
9543:     SpUpdateReport(buffer);
9544:     (void)sprintf(buffer,"Last core of splice removed.\n",
9545:                 data[dset]->holes[spcomp.hole[0]]->name, data[dset]->holes[spcomp.hole[0]]->core[spcomp.core[0]]->num);
9546:     SpUpdateReport(buffer);
9547:   }
9548: 
9549:   else if(splicertable.data_cnt > 0) {
9550:     splicertable.data_cnt = splicertable.data_cnt -2;
9551:     if(are_splicing == CONSTRAINED) {  
9552:       (void)sprintf(buffer,"\nSplice: Constrained;  hole %c core %d;  SPLICE TABLE UNDONE    %s",  
9553:                   splicertable.data[splicertable.data_cnt].hole, splicertable.data[splicertable.data_cnt].core, date); 
9554:     }  
9555:     else if(are_splicing == UNCONSTRAINED) {  
9556:       (void)sprintf(buffer,"\nSplice: Unconstrained;  hole %c core %d;  SPLICE TABLE UNDONE    %s",  
9557:                   splicertable.data[splicertable.data_cnt].hole, splicertable.data[splicertable.data_cnt].core, date); 
9558:     }
9559:     else {  
9560:       (void)sprintf(buffer,"");  
9561:     } 
9562:     SpUpdateReport(buffer);
9563:   }
9564: 
9565:   else {
9566:     printf("unsplicing;  missed something.\n");
9567:   }
9568: 
9569:   /* make the last splice table record be end of core not tie
9570:      if more than one data set, find the deepest
9571:      if none of the data sets have the last core of the splice warn
9572:   */
9573:   if(spcomp.numcores >= 1 && splicertable.data_cnt >= 2) {
9574: 
9575:     dnum = -1;
9576:     hnum = -1;
9577:     cnum = -1;
9578:     depth = -9999.0;
9579:     for(j=0; j<dataset_cnt; ++j) {
9580:       /* is the splice hole,core in this dataset?
9581:       */
9582:       for(k=0; k<data[j]->numholes; ++k) {
9583:         if(data[j]->holes[k]->name == splicertable.data[splicertable.data_cnt-1].hole) {
9584:           for(l=0; l<data[j]->holes[k]->numcores; ++l) {
9585:             if(data[j]->holes[k]->core[l]->num == splicertable.data[splicertable.data_cnt-1].core) {
9586:               anum = data[j]->holes[k]->core[l]->numvalues - 1;
9587:               if(data[j]->holes[k]->core[l]->value[anum]->sb_depth > depth) {
9588:                 dnum = j;
9589:                 depth = data[j]->holes[k]->core[l]->value[anum]->sb_depth;
9590:                 hnum = k;
9591:                 cnum = l;
9592:               }
9593:             }
9594:           }
9595:         }
9596:       }
9597:     }
9598:     if(dnum != -1 && hnum != -1 && cnum != -1) {
9599:       anum = data[dnum]->holes[hnum]->core[cnum]->numvalues - 1;
9600:       (void)strcpy(splicertable.data[splicertable.data_cnt-1].section, data[dnum]->holes[hnum]->core[cnum]->value[anum]->section);
9601:       splicertable.data[splicertable.data_cnt-1].top_int = data[dnum]->holes[hnum]->core[cnum]->value[anum]->top_int;
9602:       splicertable.data[splicertable.data_cnt-1].bot_int = data[dnum]->holes[hnum]->core[cnum]->value[anum]->bot_int;
9603:       splicertable.data[splicertable.data_cnt-1].mbsf = data[dnum]->holes[hnum]->core[cnum]->value[anum]->sb_depth;
9604:       splicertable.data[splicertable.data_cnt-1].mcd = data[dnum]->holes[hnum]->core[cnum]->value[anum]->sb_depth +
9605:                                                        data[dnum]->holes[hnum]->core[cnum]->cum_dep_offset;
9606:     }
9607:     else {
9608:       (void)sprintf(buffer,"Warning: Could not restore the botton of the last core in splicer table.");
9609:       SpManageWarningBox(buffer);
9610:     }
9611:   }
9612: 
9613:   /* can't restore table, warn
9614:   */
9615:   else if(spcomp.numcores >= 1){
9616:     (void)sprintf(buffer,"Warning: Could not restore the botton of the last core in splicer table.");
9617:     SpManageWarningBox(buffer);
9618:   }
9619: 
9620:   /* remake the splice
9621:   */
9622:   if(spcomp.numcores >= 1) {
9623:     MakeSplice(dset, &spcomp);
9624:   }
9625: 
9626: 
9627:   /* if have agemodel, check if there are any hand age picks in part of splice removed
9628:      if so get rid of them
9629:   */
9630:   if(agemodel_cnt > 0) {
9631:     if(agemodel_cnt == 1 && agemodel[0].avembsf == 0.0) {
9632:     }
9633:     else {
9634:       changed = NO;
9635:       for(i=0; i<agemodel_cnt; ++i) {
9636:         if(agemodel[i].type == HANDPICK) {
9637:           if(agemodel[i].avemcd >= splicertable.data[splicertable.data_cnt].mcd && 
9638:              agemodel[i].avemcd <= splicertable.data[splicertable.data_cnt+1].mcd) {
9639:             
9640:             (void)XmListDeletePos(listConstructAgeModel, i+1);
9641:             for(j=i; j<agemodel_cnt-1; ++j) {
9642:               if(strcmp(agemodel[j+1].code, "X") == 0) {
9643:                 agemodel[j].aveage = agemodel[j+1].aveage;
9644:                 agemodel[j].avembsf = agemodel[j+1].avembsf;
9645:                 agemodel[j].avemcd = agemodel[j+1].avemcd;
9646:                 (void)sprintf(agemodel[j].code, "X");
9647:               }
9648:               else {
9649:                 agemodel[j] = agemodel[j+1];
9650:               }
9651:             }
9652:             --agemodel_cnt;
9653:             changed = YES;
9654:           }
9655:         }
9656:       }
9657:     }
9658:     if(changed == YES) {
9659:       if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
9660:         DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
9661:       }
9662:       PlotSpliceVsAge(NO);
9663:     }
9664:   }
9665: 
9666:   if(splicertable.data_cnt == 0) {
9667:     SpCleanUp(INPUTSPLICERTABLE);
9668:   }
9669:   else {
9670:     did_splicing = YES;
9671:     saved_splice = NO;
9672:   }
9673: 
9674:   if(XtIsManaged(XtParent(drawingAreaView))) {
9675:     reason_for_redraw = DRAW_UNDONE;
9676:     DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
9677:   }
9678: 
9679:   (void)sprintf(string, "");
9680:   (void)sprintf(date, "");
9681: }
9682: 
9683: /* ARGSUSED */
9684: void
9685: SpliceToTie(w, client, call)
9686: Widget w;
9687: XtPointer client;
9688: XtPointer call;
9689: {
9690:         /*SUPPRESS 594*/
9691: 
9692:   int i, j, k, l, n, nv, ds, err, sm, sect_above, sect_below, splhole, splcore;
9693:   float top_mbsf, depth;
9694:   time_t tp;
9695:   char date[200], *string, *ptr;
9696:   XmString xmstring;
9697:   double check;
9698:   int CleanUpSpliceCore();
9699:   void DrawDrawingAreaView();
9700: 
9701: /* note that i is the current spcomp  core so don't use it
9702:    in any loops!
9703: */
9704: 
9705:   if(have_core_to_splice == DO){
9706: 
9707:     /* warn if tie creates an additional offset that exceeds standard
9708:     */
9709:     if((fabs(splicedepoffset)) > CHECKSPLICEOFFSET){
9710:       (void)sprintf(buffer,"This tie creates an additional depth offset exceeding +/-%.2f meters.", CHECKSPLICEOFFSET);
9711:       SpManageWarningBox(buffer);
9712:     }
9713: 
9714:     have_core_to_splice = DONT;
9715:     have_splice_tie = DONT;
9716:     have_splice_shift = DONT;
9717:     last_sp_tie = NONE;
9718:     have_sp_tie1 = DONT;
9719:     have_sp_tie2 = DONT;
9720: 
9721:     /* set all buttons except dismiss, undo and grab insensitive
9722:     */
9723:     XtSetSensitive(pushButtonGetSelectCore, True);
9724:     XtSetSensitive(pushButtonClearGrab, FALSE);
9725:     XtSetSensitive(pushButtonSpliceClearTie, FALSE);
9726:     XtSetSensitive(pushButtonSpliceCorrelate, FALSE);
9727:     XtSetSensitive(pushButtonSpliceToTie, FALSE);
9728:     XtVaSetValues(pushButtonSpliceToTie, XmNborderWidth, 0, NULL);
9729:     XtSetSensitive(pushButtonAppendSplice, FALSE);
9730:     XtVaSetValues(pushButtonAppendSplice, XmNborderWidth, 0, NULL);
9731:     XtSetSensitive(pushButtonSpliceUndoLast, True);
9732: 
9733:     ++spcomp.numcores;
9734:     if(spcomp.numcores < 2){
9735:       (void)sprintf(buffer,"ERROR; SpliceToTie; something wrong with number of cores; n<2!");
9736:       SpManageWarningBox(buffer);
9737:       return;
9738:     }
9739:     else {
9740:       i = spcomp.numcores - 1;
9741:     }
9742: 
9743:     if(smooth.method == NONE){
9744:       sm = NO;
9745:     }
9746:     else if(smooth.method == GAUSSIAN || smooth.method == OTHER &&
9747:                smooth.plot == UNSMOOTHED){
9748:       sm = NO;
9749:     }
9750:     else if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
9751:             (smooth.plot == SMOOTHED || smooth.plot == SMOOTHEDBOTH)){
9752:       sm = YES;
9753:     }
9754:     else {
9755:       sm = NO;
9756:     }
9757: 
9758:     spcomp.Depthoffset[i] = data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset +
9759:                             splicedepoffset;                           
9760:     err = CleanUpSpliceCore(spliceholenum, splicecorenum, &spcomp.numpercore[i],
9761:                 spcomp.sb_depth[i], spcomp.var[i], sm, i, splicearraynum, spcomp.MapToOrig[i]);
9762: 
9763:     if(err > 0){
9764:       (void)sprintf(buffer,"ERROR; SpliceToTie; could not cleanup splice core");
9765:       SpManageWarningBox(buffer);
9766:       --spcomp.numcores;
9767:       return;
9768:     }
9769:     else {
9770:      
9771:       /* get rid of the points below the tie in the
9772:          splice composite
9773:       */
9774:       spcomp.numpercore[i-1] = spcomparraynum + 1;
9775: 
9776:       spcomp.hole[i] = spliceholenum;
9777:       spcomp.core[i] = splicecorenum;
9778: 
9779:       if(splice_how == REAL) {
9780:         spcomp.splice_how[i] = REAL;
9781:       }
9782:       else if(splice_how == INTERPOLATED) {
9783:         spcomp.splice_how[i] = INTERPOLATED;
9784:         spcomp.interpolated_spl_depth[i] = interpsplice_spl_depth;
9785:         spcomp.interpolated_sb_depth[i] = interpsplice_spl_depth - spcomp.Depthoffset[i];
9786:         spcomp.interpolated_value[i] = interpsplice_val;
9787:         spcomp.interpolated_sm_value[i] = interpsplice_sm_val;
9788: 
9789:         /* find the section and section depth for this interpolated point
9790:            note that the map to original will hold the indicy of the next real
9791:            point. and that this could never be the first or last value in core.
9792:            but check anyway
9793:         */
9794:         if(splicearraynum == 0 || splicearraynum == data[dset]->holes[spliceholenum]->core[splicecorenum]->numvalues - 1) {
9795:           (void)sprintf(buffer,"ERROR; SpliceToTie; something is wrong with interpolated point.");
9796:           SpManageWarningBox(buffer);
9797:           --spcomp.numcores;
9798:           return;
9799:         }
9800:         else {
9801: 
9802:           /* make the sections ints so easier to compare. if one or the other is the core catcher
9803:              signify this with -1
9804:           */
9805:           if(strcmp(data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum-1]->section, "CC") == 0) {
9806:             sect_above = -1;
9807:           }
9808:           else {
9809:             sect_above = atoi(data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum - 1]->section);
9810:           }
9811:           if(strcmp(data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->section, "CC") == 0) {
9812:             sect_below = -1;
9813:           }
9814:           else {
9815:             sect_below = atoi(data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->section);
9816:           }
9817: 
9818:           /* sections above and below interpolated point are the same
9819:           */
9820:           if(sect_above == sect_below) {
9821:             strcpy(spcomp.interpolated_section[i], data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->section);
9822:             spcomp.interpolated_top_int[i] = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->top_int - 
9823:              (150.0 * (data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->sb_depth - spcomp.interpolated_sb_depth[i]));
9824:             spcomp.interpolated_bot_int[i] = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->bot_int -
9825:              (150.0 * (data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->sb_depth - spcomp.interpolated_sb_depth[i]));
9826:             if(spcomp.interpolated_top_int[i] < 0.0 || spcomp.interpolated_top_int[i] > 150.0) {
9827:               (void)sprintf(buffer,"ERROR; SpliceToTie; something is wrong with interpolated point.");
9828:               SpManageWarningBox(buffer);
9829:               --spcomp.numcores;
9830:               return;
9831:             }
9832:           }
9833: 
9834:           /* the section below the interpolated point is the core catcher
9835:              and the one above is not
9836:           */
9837:           else if(sect_below == -1) {
9838:             (void)sprintf(buffer,"ERROR; SpliceToTie; real pt below interpolated pt in CC, no code yet.");
9839:               SpManageWarningBox(buffer);
9840:               --spcomp.numcores;
9841:               return;
9842:           }
9843: 
9844:           /* the section below the interpolated point is greater than the one above.
9845:              is it the next section?
9846:           */
9847:           else if(sect_below > sect_above) {
9848:             spcomp.interpolated_top_int[i] = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->top_int -
9849:              (150.0 * (data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->sb_depth - spcomp.interpolated_sb_depth[i]));
9850:             spcomp.interpolated_bot_int[i] = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->bot_int -
9851:              (150.0 * (data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->sb_depth - spcomp.interpolated_sb_depth[i]));
9852:             if(spcomp.interpolated_top_int[i] >= 0.0) {
9853:               strcpy(spcomp.interpolated_section[i], data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->section);
9854:             }
9855:             else {
9856:               --sect_below;
9857:               top_mbsf = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->sb_depth - 
9858:                          data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->top_int/100.0;
9859:               while(top_mbsf - spcomp.interpolated_sb_depth[i] > 1.5) {
9860:                 --sect_below;
9861:                 top_mbsf = top_mbsf - 1.50;
9862:               }     
9863:               if(sect_below < sect_above) {
9864:                 (void)sprintf(buffer,"ERROR; SpliceToTie; something is wrong with interpolated point.");
9865:                 SpManageWarningBox(buffer);
9866:                 --spcomp.numcores;
9867:                 return;
9868:               }
9869:               else {
9870:                 spcomp.interpolated_top_int[i] = 150.0 - ((top_mbsf - spcomp.interpolated_sb_depth[i]) * 100.0);
9871:                 spcomp.interpolated_bot_int[i] = 150.0 - ((top_mbsf - spcomp.interpolated_sb_depth[i]) * 100.0);
9872:                 sprintf(spcomp.interpolated_section[i], "%d", sect_below);     
9873:               }
9874:             }
9875:           }
9876: 
9877:           /* no other reasonable choices; right?
9878:           */
9879:           else {
9880:             (void)sprintf(buffer,"ERROR; SpliceToTie; something is wrong with interpolated point."); 
9881:             SpManageWarningBox(buffer); 
9882:             --spcomp.numcores; 
9883:             return;
9884:           }
9885:         }
9886:       }
9887:       else {
9888:         (void)sprintf(buffer,"ERROR; SpliceToTie; could not tell if splice real or interpolated.");
9889:         SpManageWarningBox(buffer);
9890:         --spcomp.numcores;
9891:         return;
9892:       }
9893: 
9894:       /* put info in splice table
9895:       */
9896:       n = splicertable.data_cnt -1;
9897:       splicertable.data[n].site = data[dset]->site;
9898:       splicertable.data[n].hole = data[dset]->holes[spcomp.hole[spcompcorenum]]->name;
9899:       splicertable.data[n].core = data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->num;
9900:       splicertable.data[n].core_type = 
9901:         data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->value[spcomp.MapToOrig[spcompcorenum][spcomparraynum]]->type;
9902:       (void)strcpy(splicertable.data[n].section, 
9903:         data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->value[spcomp.MapToOrig[spcompcorenum][spcomparraynum]]->section);
9904:       splicertable.data[n].top_int = 
9905:         data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->value[spcomp.MapToOrig[spcompcorenum][spcomparraynum]]->top_int;
9906:       splicertable.data[n].bot_int =  
9907:         data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->value[spcomp.MapToOrig[spcompcorenum][spcomparraynum]]->bot_int;
9908:       splicertable.data[n].mbsf = 
9909:         data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->value[spcomp.MapToOrig[spcompcorenum][spcomparraynum]]->sb_depth;
9910:       splicertable.data[n].mcd = 
9911:         data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->value[spcomp.MapToOrig[spcompcorenum][spcomparraynum]]->sb_depth +
9912:        spcomp.Depthoffset[i-1];
9913: 
9914:       if(splicertable.data_cnt+1>=splicertable.alloc_cnt) {
9915:         if((ptr=(char*)realloc((char*)splicertable.data,(splicertable.alloc_cnt+=ALLOC_INT)*sizeof(SplicerTableInfo)))==NULL) {
9916:           SpBadMemAlloc("BAD MEM");
9917:         }
9918:         else {
9919:           splicertable.data=(SplicerTableInfo*)ptr;
9920:         }
9921:       }
9922: 
9923:       ++n; 
9924:       ++splicertable.data_cnt;
9925:       splicertable.data[n].site = data[dset]->site;
9926:       splicertable.data[n].hole = data[dset]->holes[spliceholenum]->name;
9927:       splicertable.data[n].core = data[dset]->holes[spliceholenum]->core[splicecorenum]->num;
9928:       splicertable.data[n].core_type = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->type;
9929:       if(spcomp.splice_how[i] == REAL) {
9930:         (void)strcpy(splicertable.data[n].section, data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->section);
9931:         splicertable.data[n].top_int = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->top_int;
9932:         splicertable.data[n].bot_int = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->bot_int;
9933:         splicertable.data[n].mbsf = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->sb_depth;
9934:         (void)strcpy(splicertable.data[n].type_of_splice, "tie");
9935:       }
9936:       else if(spcomp.splice_how[i] == INTERPOLATED) {
9937:         (void)strcpy(splicertable.data[n].section, spcomp.interpolated_section[i]);
9938:         splicertable.data[n].top_int = spcomp.interpolated_top_int[i];
9939:         splicertable.data[n].bot_int = spcomp.interpolated_bot_int[i];
9940:         splicertable.data[n].mbsf = spcomp.interpolated_sb_depth[i];
9941:         (void)strcpy(splicertable.data[n].type_of_splice, "interp");
9942:       }
9943:       splicertable.data[n].mcd = splicertable.data[n].mbsf + spcomp.Depthoffset[i];
9944: 
9945:       spcomp.map_to_table[i] = n;
9946: 
9947:       if(splicertable.data_cnt+1>=splicertable.alloc_cnt) {
9948:         if((ptr=(char*)realloc((char*)splicertable.data,(splicertable.alloc_cnt+=ALLOC_INT)*sizeof(SplicerTableInfo)))==NULL) {
9949:           SpBadMemAlloc("BAD MEM");
9950:         }
9951:         else {
9952:           splicertable.data=(SplicerTableInfo*)ptr;
9953:         }
9954:       }
9955: 
9956:       ++n;
9957:       ++splicertable.data_cnt;
9958:       nv = data[dset]->holes[spliceholenum]->core[splicecorenum]->numvalues - 1;
9959:       splicertable.data[n].site = data[dset]->site;
9960:       splicertable.data[n].hole = data[dset]->holes[spliceholenum]->name; 
9961:       splicertable.data[n].core = data[dset]->holes[spliceholenum]->core[splicecorenum]->num;  
9962:       splicertable.data[n].core_type = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[nv]->type;
9963: 
9964:       /* if more than one data set find which dataset that has the depthest core
9965:       */
9966:       ds = dset;
9967:       splhole = spliceholenum;
9968:       splcore = splicecorenum;
9969:       if(dataset_cnt > 1) {
9970:         depth = data[ds]->holes[spliceholenum]->core[splicecorenum]->value[nv]->sb_depth;
9971:         for(j=0; j<dataset_cnt; ++j) {
9972:           if(j != dset) {
9973:             /* is the splice hole,core in this dataset?
9974:             */
9975:             for(k=0; k<data[j]->numholes; ++k) {
9976:               if(data[j]->holes[k]->name == data[dset]->holes[spliceholenum]->name) {
9977:                 for(l=0; l<data[j]->holes[k]->numcores; ++l) {
9978:                   if(data[j]->holes[k]->core[l]->num == data[dset]->holes[spliceholenum]->core[splicecorenum]->num) {
9979:                     nv = data[j]->holes[k]->core[l]->numvalues - 1;
9980:                     if(data[j]->holes[k]->core[l]->value[nv]->sb_depth > depth) {
9981:                       ds = j;
9982:                       depth = data[j]->holes[k]->core[l]->value[nv]->sb_depth;
9983:                       splhole = k;
9984:                       splcore = l;
9985:                     }
9986:                   }
9987:                 }
9988:               }
9989:             }
9990:           }
9991:         }
9992:       }
9993:       else {
9994:       }
9995:       nv = data[ds]->holes[splhole]->core[splcore]->numvalues - 1;
9996:       (void)strcpy(splicertable.data[n].section, data[ds]->holes[splhole]->core[splcore]->value[nv]->section);
9997:       splicertable.data[n].top_int = data[ds]->holes[splhole]->core[splcore]->value[nv]->top_int;
9998:       splicertable.data[n].bot_int = data[ds]->holes[splhole]->core[splcore]->value[nv]->bot_int;
9999:       splicertable.data[n].mbsf = data[ds]->holes[splhole]->core[splcore]->value[nv]->sb_depth;
10000:       splicertable.data[n].mcd = splicertable.data[n].mbsf + spcomp.Depthoffset[i];
10001: 
10002:       did_splicing = YES;
10003:       saved_splice = NO;
10004: 
10005:       /* write tie to  report
10006:       */
10007:       if(time(&tp)) {
10008:         (void)sprintf(date, "%s", ctime(&tp));
10009:       }
10010:       else {
10011:         (void)sprintf(date, "no date available\n");
10012:       }
10013:       if(are_splicing == CONSTRAINED) {
10014:         (void)sprintf(buffer,"\nSplice: Constrained;  hole %c core %d  CORE SPLICED    %s",
10015:                         data[dset]->holes[spliceholenum]->name, data[dset]->holes[spliceholenum]->core[splicecorenum]->num, date);
10016:       }
10017:       else if(are_splicing == UNCONSTRAINED) {
10018:         (void)sprintf(buffer,"\nSplice: Unconstrained;  hole %c core %d  CORE SPLICED    %s", 
10019:                        data[dset]->holes[spliceholenum]->name, data[dset]->holes[spliceholenum]->core[splicecorenum]->num, date);
10020:       }
10021:       else {
10022:         (void)sprintf(buffer,"");
10023:       }
10024:       SpUpdateReport(buffer);
10025: 
10026:       /* write splice tie to report 
10027:       */
10028:       (void)sprintf(buffer,"splice tie %d %d %c  %d %c %s %.1f %.1f  %.2f  to  %d %d %c  %d %c %s %.1f %.1f  %.2f\n",
10029:          data[dset]->leg,
10030:          data[dset]->site,
10031:          data[dset]->holes[spcomp.hole[spcompcorenum]]->name,
10032:          data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->num,
10033:          data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->value[spcomp.MapToOrig[spcompcorenum][spcomparraynum]]->type,
10034:          data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->value[spcomp.MapToOrig[spcompcorenum][spcomparraynum]]->section,
10035:          data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->value[spcomp.MapToOrig[spcompcorenum][spcomparraynum]]->top_int,
10036:          data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->value[spcomp.MapToOrig[spcompcorenum][spcomparraynum]]->bot_int,
10037:          data[dset]->holes[spcomp.hole[spcompcorenum]]->core[spcomp.core[spcompcorenum]]->value[spcomp.MapToOrig[spcompcorenum][spcomparraynum]]->sb_depth,
10038:          data[dset]->leg,
10039:          data[dset]->site,
10040:          data[dset]->holes[spliceholenum]->name,
10041:          data[dset]->holes[spliceholenum]->core[splicecorenum]->num,
10042:          data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->type,
10043:          data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->section,
10044:          data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->top_int,
10045:          data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->bot_int,
10046:          data[dset]->holes[spliceholenum]->core[splicecorenum]->value[splicearraynum]->sb_depth);
10047:       SpUpdateReport(buffer);
10048: 
10049:       /*write the correlation info to the report and the value difference
10050:       */
10051:       XtVaGetValues(labelSpliceDifferenceInValue, XmNlabelString, &xmstring, NULL );
10052:       XmStringGetLtoR(xmstring, XmFONTLIST_DEFAULT_TAG, &string);
10053:       if(are_splicing == CONSTRAINED && splice_how == INTERPOLATED) {
10054:         (void)sprintf(buffer,"Tie evaluation; corr. coef. %.3f,  value difference %s  INTERPOLATED TIE\n", 
10055:                                corr.coef[dset][best_corr_num], string);
10056:       }
10057:       else {
10058:         (void)sprintf(buffer,"Tie evaluation; corr. coef. %.3f,  value difference %s  REAL TIE\n", 
10059:                               corr.coef[dset][best_corr_num], string);
10060:       }
10061:       XtFree(string);
10062:       SpUpdateReport(buffer);
10063:       
10064:       if(XtIsManaged(XtParent(drawingAreaView))) {
10065:         reason_for_redraw = DRAW_SPLICED;
10066:         DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
10067:       }
10068:     }
10069:   }
10070: 
10071:   (void)sprintf(date, "");
10072: }
10073: 
10074: 
10075: /* ARGSUSED */
10076: void
10077: SpliceClearGrab(w, client, call)
10078: Widget w;
10079: XtPointer client;
10080: XtPointer call;
10081: {
10082:   /*SUPPRESS 594*/
10083: 
10084:   char string[50];
10085:   XmString xmstring;
10086:   void DrawDrawingAreaView();
10087:  
10088:   have_core_to_splice = DONT;
10089:   have_splice_tie = DONT;
10090:   have_splice_shift = DONT;
10091:   have_spcorr = DONT;
10092:   last_sp_tie = NONE; 
10093:   have_sp_tie1 = DONT; 
10094:   have_sp_tie2 = DONT;
10095:   splice_how = NONE;
10096: 
10097:   spliceholenum = 0;
10098:   splicecorenum = 0;
10099:   splicearraynum = 0;
10100:  
10101:   /* reset buttons and text 
10102:   */ 
10103:   /* set the window length and  lead,lag to the defaults
10104:   */ 
10105:   (void)sprintf(string, "%.2f", WINLEN); 
10106:   XtVaSetValues(textCompWindowLen, XmNvalue, string, NULL); 
10107:   (void)sprintf(string, "%.2f", LEADLAG); 
10108:   XtVaSetValues(textCompLeadLag, XmNvalue, string, NULL); 
10109:  
10110:   /* make sure the ties, depth step and selected core text 
10111:      are clear 
10112:   */ 
10113:   (void)sprintf(string, ""); 
10114:   XtVaSetValues(textCompSelectHole, XmNvalue, string, NULL); 
10115:   XtVaSetValues(textCompSelectCore, XmNvalue, string, NULL); 
10116:   XtVaSetValues(textCompDepthStep, XmNvalue, string, NULL);
10117:   xmstring = XmStringCreateSimple(string);
10118:   XtVaSetValues(labelSpliceTie1ID, XmNlabelString, xmstring, NULL); 
10119:   XtVaSetValues(labelSpliceTie1var, XmNlabelString, xmstring, NULL); 
10120:   XtVaSetValues(labelSpliceTie1sbd, XmNlabelString, xmstring, NULL);
10121:   XtVaSetValues(labelSpliceTie2ID, XmNlabelString, xmstring, NULL);  
10122:   XtVaSetValues(labelSpliceTie2var, XmNlabelString, xmstring, NULL);  
10123:   XtVaSetValues(labelSpliceTie2sbd, XmNlabelString, xmstring, NULL); 
10124:   XtVaSetValues(labelSpliceDifferenceInValue, XmNlabelString, xmstring, NULL);
10125:   XmStringFree(xmstring);
10126:    
10127:   /* set all buttons except dismiss, grab undo last insensitive  
10128:   */  
10129:   XtSetSensitive(pushButtonGetSelectCore, True);  
10130:   XtSetSensitive(pushButtonClearGrab, FALSE);  
10131:   XtSetSensitive(pushButtonSpliceClearTie, FALSE);  
10132:   XtSetSensitive(pushButtonSpliceCorrelate, FALSE);  
10133:   XtSetSensitive(pushButtonSpliceToTie, FALSE);  
10134:   XtVaSetValues(pushButtonSpliceToTie, XmNborderWidth, 0, NULL);
10135:   XtSetSensitive(pushButtonAppendSplice, FALSE);  
10136:   XtVaSetValues(pushButtonAppendSplice, XmNborderWidth, 0, NULL);
10137:   XtSetSensitive(pushButtonSpliceUndoLast, True);
10138:   XtSetSensitive(pushButtonSuggestTies, False);
10139:   
10140:   /* and clear the correlation window  
10141:   */ 
10142:   if(XtIsManaged(XtParent(drawingAreaCompCorrelation))) {
10143:     XClearWindow(XtDisplay(drawingAreaCompCorrelation),
10144:                  XtWindow(drawingAreaCompCorrelation));
10145:   }
10146:   if(XtIsManaged(XtParent(drawingAreaView))) {
10147:     reason_for_redraw = DRAW_CORECLEARED;
10148:     DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
10149:   }
10150: 
10151:   (void)sprintf(string, "");
10152: }
10153: 
10154: 
10155: /* ARGSUSED */
10156: void
10157: DrawDrawingAreaDepthOffset(w, client, call)
10158: Widget w;
10159: XtPointer client;
10160: XtPointer call;
10161: {
10162:   /*SUPPRESS 594*/
10163: 
10164:   int i, j, sx, sy, axispixlen, ticpixlen, annot, label, pixpermeter;
10165:   char s[50];
10166:   float max, maxmeter, maxoffset, unitinc, depticinc, sect, sect_dep, dep, percentdepchange;
10167:   double check, fract, ip;
10168:   String str;
10169:   Dimension win_width, win_height;
10170:   void HardwireAxis(), AxisDep(), AxisDepthOffset();
10171: 
10172:   XtVaGetValues(w, XmNheight, &win_height, XmNwidth, &win_width, NULL);
10173: 
10174:    /*clear the drawing area
10175:   */
10176:   XClearWindow(XtDisplay(w), XtWindow(w));
10177: 
10178:   max = 0.0;
10179:   if(have_data == DO){
10180:     for(i=0; i<data[dset]->numholes; ++i){
10181:       for(j=0; j<data[dset]->holes[i]->numcores; ++j){
10182:         if(data[dset]->holes[i]->core[j]->did_offset == YES && 
10183:            data[dset]->holes[i]->core[j]->value[0]->sb_depth > max){
10184:           max = data[dset]->holes[i]->core[j]->value[0]->sb_depth;
10185:         }
10186:       }
10187:     }
10188:   }
10189: 
10190:   unitinc = 0.0;  /*the starting value of the depth axis*/
10191: 
10192:   /*calc. the length of the  axis in pixels
10193:   */ 
10194:   axispixlen = (int)win_height - OFF - SPACE;
10195:      
10196:   /* hardwire the scale and such so maximize axis length
10197:   */
10198:   HardwireAxis(max, &maxmeter, &annot, &depticinc, &pixpermeter, &ticpixlen, &offsetdepperpix, axispixlen, 1);
10199: 
10200:   /* set color for axis and labels
10201:   */
10202:   XSetForeground(XtDisplay(w), gc_drawingAreaDepthOffset, fgPixel[LABEL_COLOR]);
10203:   label = YES;
10204:   AxisDep(w, XtDisplay(w), XtWindow(w), gc_drawingAreaDepthOffset,
10205:             maxmeter, OFF, 0, ticpixlen, depticinc, unitinc, offsetdepperpix, annot, label);
10206: 
10207:   unitinc = 0.0; 
10208:   depticinc = 5.0;
10209:   maxoffset = 10.0;
10210: 
10211:   /*calc. the length of the  axis
10212:     adjust the length of x axis if its   
10213:     total length is not divisable by ten
10214:   */ 
10215:   axispixlen = (int)win_width - OFF - SPACE;
10216:      
10217:   check = maxoffset/depticinc;
10218:   fract = modf(check, &ip);
10219:   if(fract == 0.0){
10220:   }  
10221:   else { 
10222:     maxoffset = (ip * depticinc) + depticinc;
10223:   } 
10224: 
10225:   if(have_data == DONT){
10226:   }
10227:   else { 
10228:     max = -9999.0;
10229:     for(i=0; i<data[dset]->numholes; ++i){
10230:       for(j=0; j<data[dset]->holes[i]->numcores; ++j){
10231:         if(data[dset]->holes[i]->core[j]->did_offset == YES && data[dset]->holes[i]->core[j]->cum_dep_offset > max){
10232:           max = data[dset]->holes[i]->core[j]->cum_dep_offset;
10233:         }   
10234:       }  
10235:     }    
10236: 
10237:     if(max < 10.0){
10238:       maxoffset = 10.0;
10239:     } 
10240:     else if(maxoffset < max){ 
10241:       if(max > 30.0){
10242:         depticinc = 10.0;
10243:       }
10244:       while(maxoffset < max){  
10245:         maxoffset = maxoffset + depticinc;
10246:       }
10247:     }
10248:   }  
10249: 
10250:   /* calculate how many pixels in a meter; truncate the result so mult.
10251:      meters are equal to a pixel value that is a whole number
10252:   */
10253:   check = axispixlen/maxoffset;
10254:   fract = modf(check, &ip);
10255:   pixpermeter = ip;
10256:  
10257:   ticpixlen = pixpermeter * depticinc;
10258:   check = pixpermeter;
10259:   depthoffsetperpix = 1.0/check;
10260: 
10261:   annot = 1;
10262:   AxisDepthOffset(w, XtDisplay(w), XtWindow(w), gc_drawingAreaDepthOffset,
10263:             maxoffset, OFF, 0, ticpixlen, depticinc, unitinc, depthoffsetperpix, annot);
10264: 
10265:   /* draw the percent cum depth change 'trend' line
10266:   */
10267:   str = XmTextGetString(textDepthChange);
10268:   percentdepchange = atof(str);
10269:   XtFree(str);
10270: 
10271:   if(percentdepchange <= 0){
10272:   }
10273:   else {
10274:     /* set color for the line
10275:     */
10276:     XSetForeground(XtDisplay(w), gc_drawingAreaDepthOffset, fgPixel[DEPOFFLINE_COLOR]);
10277:     if(percentdepchange/100.0 * maxmeter <= maxoffset){
10278:       sx = (percentdepchange/100.0 * maxmeter)/depthoffsetperpix + OFF;
10279:       sy = maxmeter/offsetdepperpix + OFF;
10280:     }
10281:     else {
10282:       sx = maxoffset/depthoffsetperpix + OFF;
10283:       sy = (maxoffset/(percentdepchange/100.0))/offsetdepperpix + OFF; 
10284:     }
10285:     XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaDepthOffset,
10286:                                 OFF, OFF, sx, sy);
10287:   }
10288: 
10289:   /* draw the offsets
10290:   */
10291:   if(have_data == DO && draw_offsets == YES){
10292:     
10293:     for(i=0; i<data[dset]->numholes; ++i){
10294:       
10295:       if(i+1 ==  1){
10296:         XSetForeground(XtDisplay(w), gc_drawingAreaDepthOffset, fgPixel[DEPOFFHOLE1_COLOR]);
10297:       }
10298:       else if(i+1 ==  2){ 
10299:         XSetForeground(XtDisplay(w), gc_drawingAreaDepthOffset, fgPixel[DEPOFFHOLE2_COLOR]); 
10300:       }
10301:       else if(i+1 ==  3){  
10302:         XSetForeground(XtDisplay(w), gc_drawingAreaDepthOffset, fgPixel[DEPOFFHOLE3_COLOR]); 
10303:       }
10304:       else if(i+1 ==  4){  
10305:         XSetForeground(XtDisplay(w), gc_drawingAreaDepthOffset, fgPixel[DEPOFFHOLE4_COLOR]); 
10306:       }
10307:       else if(i+1 ==  5){  
10308:         XSetForeground(XtDisplay(w), gc_drawingAreaDepthOffset, fgPixel[DEPOFFHOLE5_COLOR]); 
10309:       }
10310:       else if(i+1 ==  6){
10311:         XSetForeground(XtDisplay(w), gc_drawingAreaDepthOffset, fgPixel[DEPOFFHOLE6_COLOR]);
10312:       }
10313:       else if(i+1 ==  7){
10314:         XSetForeground(XtDisplay(w), gc_drawingAreaDepthOffset, fgPixel[DEPOFFHOLE7_COLOR]);
10315:       }
10316:       else if(i+1 ==  8){
10317:         XSetForeground(XtDisplay(w), gc_drawingAreaDepthOffset, fgPixel[DEPOFFHOLE8_COLOR]);
10318:       }
10319:       else if(i+1 ==  9){
10320:         XSetForeground(XtDisplay(w), gc_drawingAreaDepthOffset, fgPixel[DEPOFFHOLE9_COLOR]);
10321:       }
10322:       else if(i+1 ==  10){
10323:         XSetForeground(XtDisplay(w), gc_drawingAreaDepthOffset, fgPixel[DEPOFFHOLE10_COLOR]);
10324:       }
10325:       else if(i+1 == 11){
10326:         XSetForeground(XtDisplay(w), gc_drawingAreaDepthOffset, fgPixel[DEPOFFHOLE11_COLOR]); 
10327:       }
10328:       else {
10329:         XSetForeground(XtDisplay(w), gc_drawingAreaDepthOffset, fgPixel[DEPOFFHOLE1_COLOR]);
10330:       }
10331: 
10332:       for(j=0; j<data[dset]->holes[i]->numcores; ++j){
10333:          
10334:         if(data[dset]->holes[i]->core[j]->did_offset == YES){
10335:           if((int)strcmp(data[dset]->holes[i]->core[j]->value[0]->section, "CC") == 0){
10336:             sect = 1.0;
10337:           }
10338:           else {
10339:             sect = atof(data[dset]->holes[i]->core[j]->value[0]->section);
10340:           }
10341:           sx = data[dset]->holes[i]->core[j]->cum_dep_offset/depthoffsetperpix + OFF;
10342:           sect_dep = (data[dset]->holes[i]->core[j]->value[0]->bot_int - data[dset]->holes[i]->core[j]->value[0]->top_int)/2.0 +
10343:                      data[dset]->holes[i]->core[j]->value[0]->top_int;
10344:           fract = modf(sect_dep/1.0, &ip);
10345:           if(fract <= 0.41) {
10346:             sect_dep = ip;
10347:           }
10348:           else if(fract >= 0.59) {
10349:             sect_dep = ip + 1.0;
10350:           }
10351:           else {
10352:             sect_dep = ip + 1.0;
10353:           }
10354:           dep = data[dset]->holes[i]->core[j]->value[0]->sb_depth  - sect_dep/100.0 - ((sect - 1.0) * 1.5);
10355:           sy = dep/offsetdepperpix + OFF;
10356:           (void)sprintf(s, "%d", data[dset]->holes[i]->core[j]->num);
10357:           if(data[dset]->holes[i]->core[j]->num >= 10){
10358:             sx = sx - 4;
10359:           }
10360:           XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaDepthOffset,
10361:                         sx, sy + POINTSIZE, s, (int)strlen(s));
10362:         }
10363:       }
10364: 
10365:       (void)sprintf(s, "%d%c", data[dset]->site, data[dset]->holes[i]->name);
10366:       XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaDepthOffset,
10367:                       OFF + (i * OFF) + 10, win_height - (SPACE/2), s, (int)strlen(s));
10368:     }
10369:   }
10370:   else {
10371:   }
10372: 
10373:   (void)sprintf(s, "");
10374: }
10375: 
10376: /* ARGSUSED */
10377: void
10378: DepthOffsetDismiss(w, client, call)
10379: Widget w;
10380: XtPointer client;
10381: XtPointer call;
10382: {
10383:         /*SUPPRESS 594*/
10384: 
10385:   draw_offsets = NO;
10386: 
10387:   XtUnmanageChild(formDepthOffset);
10388: }
10389: 
10390: /* ARGSUSED */
10391: void
10392: DisplayPlotSmooth(w, client, call)
10393: Widget w;
10394: XtPointer client;
10395: XtPointer call;
10396: {
10397:   /*SUPPRESS 594*/
10398: 
10399: }
10400: 
10401: /* ARGSUSED */
10402: void
10403: DisplayPlotUnsmooth(w, client, call)
10404: Widget w;
10405: XtPointer client;
10406: XtPointer call;
10407: {
10408:   /*SUPPRESS 594*/
10409: 
10410: }
10411: 
10412: /* ARGSUSED */
10413: void
10414: DisplayPlotBoth(w, client, call)
10415: Widget w;
10416: XtPointer client;
10417: XtPointer call;
10418: {
10419:   /*SUPPRESS 594*/
10420: 
10421: }
10422: 
10423: /* ARGSUSED */
10424: void
10425: ViewDepthOffset(w, client, call)
10426: Widget w;
10427: XtPointer client;
10428: XtPointer call;
10429: {
10430:   /*SUPPRESS 594*/
10431: 
10432:   void DrawDrawingAreaDepthOffset();
10433: 
10434:   XtManageChild(formDepthOffset);
10435:   XtPopup(XtParent(formDepthOffset), XtGrabNone);
10436: 
10437:   draw_offsets = YES;
10438: 
10439:   if(XtIsManaged(XtParent(drawingAreaDepthOffset))) {
10440:     DrawDrawingAreaDepthOffset(drawingAreaDepthOffset, (XtPointer)NULL, (XtPointer)NULL);
10441:   }
10442: }
10443: 
10444: /* ARGSUSED */
10445: void
10446: TieSuggestTextActive(w, client, call)
10447: Widget w;
10448: XtPointer client;
10449: XtPointer call;
10450: {
10451:   /*SUPPRESS 594*/
10452: }
10453: 
10454: 
10455: /* ARGSUSED */
10456: void
10457: DepthOffsetTextActivate(w, client, call)
10458: Widget w;
10459: XtPointer client;
10460: XtPointer call;
10461: {
10462:   /*SUPPRESS 594*/
10463: 
10464:   void DrawDrawingAreaDepthOffset();
10465: 
10466:   if(XtIsManaged(XtParent(drawingAreaDepthOffset))) {
10467:     DrawDrawingAreaDepthOffset(drawingAreaDepthOffset, (XtPointer)NULL, (XtPointer)NULL);
10468:   }
10469: }
10470: 
10471: /* ARGSUSED */
10472: void
10473: SuggestTies(w, client, call)
10474: Widget w;
10475: XtPointer client;
10476: XtPointer call;
10477: {
10478:   /*SUPPRESS 594*/
10479: 
10480:   if((message.label=(char*)calloc(100,CHAR_SIZE))==NULL)
10481:                         SpBadMemAlloc("Sp");
10482:   (void)sprintf(message.label,"This Option is incomplete.");
10483:   SpManageMessage(message);
10484: /*
10485:   XtManageChild(formTieSuggestions);
10486:   XtPopup(XtParent(formTieSuggestions),XtGrabNone);
10487: */
10488: }
10489: 
10490: /* ARGSUSED */
10491: void
10492: TieSuggestionsDismiss(w, client, call)
10493: Widget w;
10494: XtPointer client;
10495: XtPointer call;
10496: {
10497:   /*SUPPRESS 594*/
10498: 
10499:   XtUnmanageChild(formTieSuggestions);
10500: }
10501: 
10502: /* ARGSUSED */
10503: void
10504: TieSuggestionsHelp(w, client, call)
10505: Widget w;
10506: XtPointer client;
10507: XtPointer call;
10508: {
10509:   /*SUPPRESS 594*/
10510: }
10511: 
10512: /* ARGSUSED */
10513: void
10514: TieSuggestReplot(w, client, call)
10515: Widget w;
10516: XtPointer client;
10517: XtPointer call;
10518: {
10519:   /*SUPPRESS 594*/
10520: }
10521: 
10522: 
10523: /*      Function Name:  BxPopupCB
10524:  *
10525:  *      Description:    This function accepts a string of the form:
10526:  *      "(WL)[widgetName, widgetName, ...]"
10527:  *      It attempts to convert the widget names to Widget IDs
10528:  *      and then popup the widgets WITHOUT any grab.
10529:  *
10530:  *      Arguments:      Widget    w:  the activating widget.
10531:  *      XtPointer client: the string of widget names to
10532:  *            popup.
10533:  *      XtPointer call: the call data (unused).
10534:  *
10535:  *      Notes:        * This function expects that there is an application
10536:  *                      shell from which all other widgets are descended.
10537:  *          * BxPopupCB can only work on Shell widgets.  It will not
10538:  *      work on other object types.  This is because popping up
10539:  *      can only be done to a shell.  A check is made using
10540:  *      XtIsShell() and an appropriate error is output if the
10541:  *      passed object is not a Shell.
10542:  */
10543: 
10544: /* ARGSUSED */
10545: void
10546: BxPopupCB ARGLIST((w, client, call))
10547: ARG( Widget, w)
10548: ARG( XtPointer, client)
10549: GRAU( XtPointer, call)
10550: {
10551:     WidgetList    widgets;
10552:     int     i;
10553: 
10554:     /*
10555:      * This function returns a NULL terminated WidgetList.  The memory for
10556:      * the list needs to be freed when it is no longer needed.
10557:      */
10558:     widgets = BxWidgetIdsFromNames(w, "BxPopupCB", (String)client);
10559: 
10560:     i = 0;
10561:     while( widgets && widgets[i] != NULL )
10562:     {
10563:   if ( XtIsShell(widgets[i]) )
10564:   {
10565:       XtPopup(widgets[i], XtGrabNone);
10566:   }
10567:   else
10568:   {
10569:       (void)printf("Callback Error (BxPopupCB):\n\t\
10570: Object %s is not a Shell\n", XtName(widgets[i]));
10571:   }
10572:   i++;
10573:     }
10574:     XtFree((char *)widgets);
10575: }
10576: 
10577: /* ARGSUSED */
10578: void
10579: DisplayDepthScale(w, client, call)
10580: Widget w;
10581: XtPointer client;
10582: XtPointer call;
10583: {
10584:   /*SUPPRESS 594*/
10585: 
10586:   int err;
10587:   int GetDisplayValues();
10588:   void DrawDrawingAreaEdit(), DrawDrawingAreaView(), DrawDrawingAreaSpliceToAge();
10589: 
10590:   err = GetDisplayValues(dset);
10591: 
10592:   if(err == 0){
10593:     reason_for_redraw = DISPLAY_CHANGE;
10594:     if(XtIsManaged(XtParent(drawingAreaEdit))) {
10595:       DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
10596:     }
10597:     if(XtIsManaged(XtParent(drawingAreaView))) {
10598:       DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
10599:     }
10600:     if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
10601:       DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
10602:     }
10603:   }
10604: }
10605: 
10606: /* ARGSUSED */
10607: void
10608: DisplayDepthTic(w, client, call)
10609: Widget w;
10610: XtPointer client;
10611: XtPointer call;
10612: {
10613:   /*SUPPRESS 594*/
10614: 
10615:   int err;
10616:   int GetDisplayValues(); 
10617:   void DrawDrawingAreaEdit(), DrawDrawingAreaView();
10618: 
10619:   err = GetDisplayValues(dset); 
10620: 
10621:   if(err == 0){
10622:     reason_for_redraw = DISPLAY_CHANGE;
10623:     if(XtIsManaged(XtParent(drawingAreaEdit))) { 
10624:       DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
10625:     }
10626:     if(XtIsManaged(XtParent(drawingAreaView))) { 
10627:       DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
10628:     }
10629:   }
10630: }
10631: 
10632: /* ARGSUSED */
10633: void
10634: DisplayVarAxisLen(w, client, call)
10635: Widget w;
10636: XtPointer client;
10637: XtPointer call;
10638: {
10639:   /*SUPPRESS 594*/
10640: 
10641:   int err;
10642:   int GetDisplayValues(); 
10643:   void DrawDrawingAreaEdit(), DrawDrawingAreaView(), DrawDrawingAreaSpliceToAge();
10644: 
10645:   err = GetDisplayValues(dset); 
10646: 
10647:   if(err == 0){
10648:     if(have_data == DO){ 
10649:       reason_for_redraw = DISPLAY_CHANGE;
10650:       if(XtIsManaged(XtParent(drawingAreaEdit))) {
10651:         DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL); 
10652:       }
10653:     } 
10654:     if(have_splice == DO){ 
10655:       if(XtIsManaged(XtParent(drawingAreaView))) {
10656:         DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL); 
10657:       }
10658:     }
10659:     if(have_splicetoage == DO) {
10660:       if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
10661:         DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
10662:       }
10663:     }
10664:   }
10665: }
10666: 
10667: /* ARGSUSED */
10668: void
10669: DisplayVarMin(w, client, call)
10670: Widget w;
10671: XtPointer client;
10672: XtPointer call;
10673: {
10674:   /*SUPPRESS 594*/
10675: 
10676:   int err;
10677:   int GetDisplayValues(); 
10678:   void DrawDrawingAreaEdit(), DrawDrawingAreaView(), DrawDrawingAreaSpliceToAge();
10679:  
10680:   err = GetDisplayValues(dset); 
10681: 
10682:   if(err == 0){
10683:     if(have_data == DO){ 
10684:       reason_for_redraw = DISPLAY_CHANGE;
10685:       if(XtIsManaged(XtParent(drawingAreaEdit))) {
10686:         DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL); 
10687:       }
10688:     } 
10689:     if(have_splice == DO){ 
10690:       if(XtIsManaged(XtParent(drawingAreaView))) {
10691:         DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL); 
10692:       }
10693:     }
10694:     if(have_splicetoage == DO) {
10695:       if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
10696:         DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
10697:       }
10698:     }
10699:   }
10700: }
10701: 
10702: /* ARGSUSED */
10703: void
10704: DisplayVarMax(w, client, call)
10705: Widget w;
10706: XtPointer client;
10707: XtPointer call;
10708: {
10709:   /*SUPPRESS 594*/
10710: 
10711:   int err;
10712:   int GetDisplayValues(); 
10713:   void DrawDrawingAreaEdit(), DrawDrawingAreaView(), DrawDrawingAreaSpliceToAge();
10714: 
10715:   err = GetDisplayValues(dset); 
10716: 
10717:   if(err == 0){
10718:     reason_for_redraw = DISPLAY_CHANGE;
10719:     if(have_data == DO){ 
10720:       if(XtIsManaged(XtParent(drawingAreaEdit))) {
10721:         DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL); 
10722:       }
10723:     } 
10724:     if(have_splice == DO){ 
10725:       if(XtIsManaged(XtParent(drawingAreaView))) {
10726:         DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL); 
10727:       }
10728:     }
10729:     if(have_splicetoage == DO) {
10730:       if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
10731:         DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
10732:       }
10733:     }
10734:   }
10735: }
10736: 
10737: /* ARGSUSED */
10738: void
10739: LockSlider(w, client, call)
10740: Widget w;
10741: XtPointer client;
10742: XtPointer call;
10743: {
10744:   /*SUPPRESS 594*/
10745: 
10746:   void DisplaySliderControl();
10747: 
10748:   DisplaySliderControl(1);
10749: }
10750: 
10751: /* ARGSUSED */
10752: void
10753: TextReportDown(w, client, call)
10754: Widget w;
10755: XtPointer client;
10756: XtPointer call;
10757: {
10758:         /*SUPPRESS 594*/
10759: 
10760:   XmString xmstring;
10761: 
10762:   xmstring=XmCvtCTToXmString("View Report");
10763:   XtVaSetValues(pushButtonViewReport,XmNlabelString,xmstring,NULL);
10764:   XmStringFree(xmstring);
10765: }
10766: 
10767: /* ARGSUSED */
10768: void
10769: TextReportUp(w, client, call)
10770: Widget w;
10771: XtPointer client;
10772: XtPointer call;
10773: {
10774:         /*SUPPRESS 594*/
10775: 
10776:   XmString xmstring;
10777: 
10778:   xmstring=XmCvtCTToXmString("Hide Report");
10779:   XtVaSetValues(pushButtonViewReport,XmNlabelString,xmstring,NULL);
10780:   XmStringFree(xmstring);
10781: }
10782: 
10783: /* ARGSUSED */
10784: void
10785: TextReportCreate(w, client, call)
10786: Widget w;
10787: XtPointer client;
10788: XtPointer call;
10789: {
10790:   /*SUPPRESS 594*/
10791: 
10792: }
10793: 
10794: /* ARGSUSED */
10795: void
10796: TextReportDestroy(w, client, call)
10797: Widget w;
10798: XtPointer client;
10799: XtPointer call;
10800: {
10801:   /*SUPPRESS 594*/
10802: printf("report destroyed\n");
10803: }
10804: 
10805: /* ARGSUSED */
10806: void
10807: DrawDepthOffsetCreate(w, client, call)
10808: Widget w;
10809: XtPointer client;
10810: XtPointer call;
10811: {
10812:   /*SUPPRESS 594*/
10813: }
10814: 
10815: /* ARGSUSED */
10816: void
10817: DrawDepthOffsetDestroy(w, client, call)
10818: Widget w;
10819: XtPointer client;
10820: XtPointer call;
10821: {
10822:   /*SUPPRESS 594*/
10823: }
10824: 
10825: /* ARGSUSED */
10826: void
10827: DrawDepthOffsetDown(w, client, call)
10828: Widget w;
10829: XtPointer client;
10830: XtPointer call;
10831: {
10832:   /*SUPPRESS 594*/
10833: }
10834: 
10835: /* ARGSUSED */
10836: void
10837: DrawDepthOffsetUp(w, client, call)
10838: Widget w;
10839: XtPointer client;
10840: XtPointer call;
10841: {
10842:   /*SUPPRESS 594*/
10843: }
10844: 
10845: /* ARGSUSED */
10846: void
10847: Splicing(w, client, call)
10848: Widget w;
10849: XtPointer client;
10850: XtPointer call;
10851: {
10852:   /*SUPPRESS 594*/
10853: 
10854: 
10855:   char string[50];
10856:   char *pclient = (char*) client;
10857:   XmString xmstring;
10858: 
10859:   XtManageChild(formSplicing);
10860:   XtPopup(XtParent(formSplicing),XtGrabNone);
10861:  
10862:   have_spcorr = DONT;
10863:   have_core_to_splice = DONT;
10864:   have_splice_tie = DONT;
10865:   have_splice_shift = DONT;
10866:   last_sp_tie = NONE;
10867:   have_sp_tie1 = DONT;
10868:   have_sp_tie2 = DONT;
10869:   splice_how = NONE;
10870: 
10871:   if(*pclient == 'C') {
10872:     are_splicing = CONSTRAINED;
10873:     XtVaSetValues(xmDialogShellSplicing, XmNtitle, "Splicing: Constrained", NULL);
10874:   }
10875:   else if(*pclient == 'U') {
10876:     are_splicing = UNCONSTRAINED;
10877:     XtVaSetValues(xmDialogShellSplicing, XmNtitle, "Splicing: Unconstrained", NULL);
10878:   }
10879:   else {
10880:     (void)sprintf(buffer, "Unknown splicing style. cannot proceed.");
10881:     SpManageWarningBox(buffer);
10882:     return;
10883:   }
10884: 
10885:   /* set the window length and  lead,lag to the defaults
10886:   */ 
10887:   (void)sprintf(string, "%.2f", WINLEN);
10888:   XtVaSetValues(textCompWindowLen, XmNvalue, string, NULL);
10889:   (void)sprintf(string, "%.2f", LEADLAG);
10890:   XtVaSetValues(textCompLeadLag, XmNvalue, string, NULL);
10891:  
10892:   /* make sure the ties, depth step and selected core text
10893:      are clear
10894:   */
10895:   (void)sprintf(string, "");
10896:   XtVaSetValues(textCompSelectHole, XmNvalue, string, NULL);
10897:   XtVaSetValues(textCompSelectCore, XmNvalue, string, NULL);
10898:   XtVaSetValues(textCompDepthStep, XmNvalue, string, NULL);
10899:   xmstring = XmStringCreateSimple(string);
10900:   XtVaSetValues(labelSpliceTie1ID, XmNlabelString, xmstring, NULL);
10901:   XtVaSetValues(labelSpliceTie1var, XmNlabelString, xmstring, NULL);
10902:   XtVaSetValues(labelSpliceTie1sbd, XmNlabelString, xmstring, NULL);
10903:   XtVaSetValues(labelSpliceTie2ID, XmNlabelString, xmstring, NULL);
10904:   XtVaSetValues(labelSpliceTie2var, XmNlabelString, xmstring, NULL);
10905:   XtVaSetValues(labelSpliceTie2sbd, XmNlabelString, xmstring, NULL);
10906:   XtVaSetValues(labelSpliceDifferenceInValue,XmNlabelString, xmstring, NULL);
10907:   XmStringFree(xmstring);
10908: 
10909:   if(are_splicing == CONSTRAINED) {
10910:     XtVaSetValues(pushButtonSuggestTies, XmNmappedWhenManaged, False, NULL);
10911:   }
10912:   else if(are_splicing == UNCONSTRAINED) { 
10913:     XtVaSetValues(pushButtonSuggestTies, XmNmappedWhenManaged, True, NULL);
10914:   }
10915: 
10916:   /* set all buttons except dismiss and grab insensitive
10917:      and undo last if have a splice
10918:   */
10919:   if(have_data == DONT){
10920:     XtSetSensitive(pushButtonGetSelectCore, False);
10921:   }
10922:   else if(have_data == DO){
10923:     XtSetSensitive(pushButtonGetSelectCore, True);
10924:   }
10925:   XtSetSensitive(pushButtonClearGrab, False);
10926:   XtSetSensitive(pushButtonSpliceClearTie, False);
10927:   XtSetSensitive(pushButtonSpliceCorrelate, False);
10928:   XtSetSensitive(pushButtonSpliceToTie, False);
10929:   XtVaSetValues(pushButtonSpliceToTie, XmNborderWidth, 0, NULL);
10930:   XtSetSensitive(pushButtonAppendSplice, False);
10931:   XtVaSetValues(pushButtonAppendSplice, XmNborderWidth, 0, NULL);
10932:   if(have_splice == DONT){
10933:     XtSetSensitive(pushButtonSpliceUndoLast, False);
10934:   }
10935:   else if(have_splice == DO){
10936:     XtSetSensitive(pushButtonSpliceUndoLast, True);
10937:   }
10938:  
10939:   PlaceDialog(formSplicing, BOTLEFT);
10940: 
10941:   (void)sprintf(string, "");
10942: 
10943: }
10944: 
10945: /* ARGSUSED */
10946: void
10947: ApplyAffineSplice(w, client, call)
10948: Widget w;
10949: XtPointer client;
10950: XtPointer call;
10951: {
10952:   /*SUPPRESS 594*/
10953: 
10954:   if((message.label=(char*)calloc(100,CHAR_SIZE))==NULL)
10955:                         SpBadMemAlloc("Sp");
10956:   (void)sprintf(message.label,"This Option is incomplete.");
10957:   SpManageMessage(message);
10958: }
10959: 
10960: /* ARGSUSED */
10961: void
10962: ScaleDragYes(w, client, call)
10963: Widget w;
10964: XtPointer client;
10965: XtPointer call;
10966: {
10967:   /*SUPPRESS 594*/
10968: }
10969: 
10970: /* ARGSUSED */
10971: void
10972: ScaleDragNo(w, client, call)
10973: Widget w;
10974: XtPointer client;
10975: XtPointer call;
10976: {
10977:   /*SUPPRESS 594*/
10978: }
10979: 
10980: /* ARGSUSED */
10981: void
10982: ScaleCoreChanged(w, client, call)
10983: Widget w;
10984: XtPointer client;
10985: XtPointer call;
10986: {
10987:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
10988: 
10989:   void DrawDRawingAreaEdit();
10990: 
10991:   if(XtIsManaged(XtParent(drawingAreaEdit))) {
10992:     reason_for_redraw = DRAW_EVERYTHING;
10993:     DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
10994:   }
10995: }
10996: 
10997: /* ARGSUSED */
10998: void
10999: ScaleCoreDragged(w, client, call)
11000: Widget w;
11001: XtPointer client;
11002: XtPointer call;
11003: {
11004:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11005: 
11006:   void DrawDRawingAreaEdit();
11007: 
11008:   if(XtIsManaged(XtParent(drawingAreaEdit))) {
11009:     reason_for_redraw = DRAW_EVERYTHING;
11010:     DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
11011:   }
11012: }
11013: 
11014: 
11015: /* ARGSUSED */
11016: void
11017: CustomeColorDismiss(w, client, call)
11018: Widget w;
11019: XtPointer client;
11020: XtPointer call;
11021: {
11022:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11023:   
11024:   int i;
11025:   void DrawDrawingAreaEdit(), DrawDrawingAreaView(), DrawDrawingAreaTieCorrelation(),
11026:        DrawDrawingAreaCompCorrelation(), DrawDrawingAreaDepthOffset();
11027: 
11028:   (void)sprintf(color[BG_COLOR], "%s", tempcolor[BG_COLOR]);
11029:   if(colorset == CUSTOME_COLORSET) {
11030:     (void)sprintf(cust_color[BG_COLOR], "%s", tempcolor[BG_COLOR]);
11031:   }
11032:   bgPixel = tempbgPixel;
11033:   for(i=1; i<NCOLOR; ++i) {
11034:     fgPixel[i] = tempfgPixel[i];
11035:     (void)sprintf(color[i], "%s", tempcolor[i]);
11036:     if(colorset == CUSTOME_COLORSET) {
11037:       (void)sprintf(cust_color[i], "%s", tempcolor[i]);
11038:     }
11039:   }
11040: 
11041:   XtVaSetValues(drawingAreaEdit, XmNbackground, bgPixel, NULL);
11042:   XtVaSetValues(drawingAreaView, XmNbackground, bgPixel, NULL);
11043:   XtVaSetValues(drawingAreaTieCorrelation, XmNbackground, bgPixel, NULL);
11044:   XtVaSetValues(drawingAreaCompCorrelation, XmNbackground, bgPixel, NULL);
11045:   XtVaSetValues(drawingAreaDepthOffset, XmNbackground, bgPixel, NULL);
11046:   XtVaSetValues(drawingAreaAgeDepth, XmNbackground, bgPixel, NULL);
11047:   XtVaSetValues(drawingAreaSpliceToAge, XmNbackground, bgPixel, NULL);
11048:   XtVaSetValues(drawingAreaTieToTimeSeriesCorr, XmNbackground, bgPixel, NULL);
11049: 
11050:   /* set the border color of labels for cursor location and ties to
11051:      the drawing areas background color
11052:   */
11053:   XtVaSetValues(labelCursorLocation, XmNborderColor, bgPixel, NULL);
11054:   XtVaSetValues(labelDepthOffsetCursorLocation, XmNborderColor, bgPixel, NULL);
11055:   XtVaSetValues(labelSpliceCursorLocation, XmNborderColor, bgPixel, NULL);
11056:   XtVaSetValues(labelAgeDepthCursorLocation, XmNborderColor, bgPixel, NULL);
11057:   XtVaSetValues(labelSpliceToAgeCursorLocation, XmNborderColor, bgPixel, NULL);
11058:   XtVaSetValues(labelTie1ID, XmNborderColor, bgPixel, NULL);
11059:   XtVaSetValues(labelTie2ID, XmNborderColor, bgPixel, NULL);
11060:   XtVaSetValues(labelTie1var, XmNborderColor, bgPixel, NULL);
11061:   XtVaSetValues(labelTie2var, XmNborderColor, bgPixel, NULL);
11062:   XtVaSetValues(labelTie1sbd, XmNborderColor, bgPixel, NULL);
11063:   XtVaSetValues(labelTie2sbd, XmNborderColor, bgPixel, NULL);
11064:   XtVaSetValues(labelSpliceTie1ID, XmNborderColor, bgPixel, NULL);
11065:   XtVaSetValues(labelSpliceTie2ID, XmNborderColor, bgPixel, NULL);
11066:   XtVaSetValues(labelSpliceTie1var, XmNborderColor, bgPixel, NULL);
11067:   XtVaSetValues(labelSpliceTie2var, XmNborderColor, bgPixel, NULL);
11068:   XtVaSetValues(labelSpliceTie1sbd, XmNborderColor, bgPixel, NULL);
11069:   XtVaSetValues(labelSpliceTie2sbd, XmNborderColor, bgPixel, NULL);
11070:   XtVaSetValues(labelSpliceDifferenceInValue, XmNborderColor, bgPixel, NULL);
11071:  
11072:   /* if no foreground and or background color were read on command line args 
11073:      set the colors for hsplicer foreground and background to the drawing
11074:      area background and labels
11075:   */
11076:   if(prgfg == NO || prgbg == NO) {
11077:     (void)sprintf(prgfgcolor, "");
11078:     (void)sprintf(prgfgcolor, color[LABEL_COLOR]);
11079:     (void)sprintf(prgbgcolor, "");
11080:     (void)sprintf(prgbgcolor, color[BG_COLOR]);
11081:   }
11082: 
11083:   reason_for_redraw = DRAW_EVERYTHING;
11084:   if(XtIsManaged(XtParent(drawingAreaEdit))) {
11085:     DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
11086:   }
11087:   if(XtIsManaged(XtParent(drawingAreaView))) {
11088:     DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
11089:   }
11090:   if(XtIsManaged(XtParent(drawingAreaTieCorrelation))) {
11091:     DrawDrawingAreaTieCorrelation(drawingAreaTieCorrelation, (XtPointer)NULL, (XtPointer)NULL);
11092:   }
11093:   if(XtIsManaged(XtParent(drawingAreaCompCorrelation))) {
11094:     DrawDrawingAreaCompCorrelation(drawingAreaCompCorrelation, (XtPointer)NULL, (XtPointer)NULL);
11095:   }
11096:   if(XtIsManaged(XtParent(drawingAreaDepthOffset))) {
11097:     DrawDrawingAreaDepthOffset(drawingAreaDepthOffset, (XtPointer)NULL, (XtPointer)NULL);
11098:   }
11099: 
11100:   XtUnmanageChild(formSetColor);
11101: }
11102: 
11103: 
11104: /* ARGSUSED */
11105: void
11106: ColorSelected(w, client, call)
11107: Widget w;
11108: XtPointer client;
11109: XtPointer call;
11110: {
11111:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11112: 
11113:   int item_count;
11114:   char *rgbcolor;
11115:   XmString *pcolor;
11116:   Pixel sampPixel;
11117:   int GetColorPixelValue();
11118: 
11119:   /* get the selected color name from the list
11120:   */
11121:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count,
11122:                 XmNselectedItems,&pcolor, NULL);
11123:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor);
11124: 
11125:   /* and change the background color of the color display area
11126:   */
11127:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11128:   XtVaSetValues(drawingAreaColorSelect, XmNbackground, sampPixel, NULL);
11129:   XtFree(rgbcolor);
11130: }
11131: 
11132: /* ARGSUSED */
11133: void
11134: ColorApply(w, client, call)
11135: Widget w;
11136: XtPointer client;
11137: XtPointer call;
11138: {
11139:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11140: 
11141:   int i;
11142:   void DrawDrawingAreaEdit(), DrawDrawingAreaView(), DrawDrawingAreaTieCorrelation(),
11143:        DrawDrawingAreaCompCorrelation(), DrawDrawingAreaDepthOffset(),
11144:        DrawDrawingAreaAgeDepth(), DrawDrawingAreaSpliceToAge(), SetColorSetBGandFG();
11145: 
11146:   (void)sprintf(color[BG_COLOR], "%s", tempcolor[BG_COLOR]);
11147:   if(colorset == CUSTOME_COLORSET) {
11148:     (void)sprintf(cust_color[BG_COLOR], "%s", tempcolor[BG_COLOR]);
11149:   }
11150:   bgPixel = tempbgPixel;
11151:   for(i=1; i<NCOLOR; ++i) {
11152:     fgPixel[i] = tempfgPixel[i];
11153:     (void)sprintf(color[i], "%s", tempcolor[i]);
11154:     if(colorset == CUSTOME_COLORSET) {
11155:       (void)sprintf(cust_color[i], "%s", tempcolor[i]);
11156:     }
11157:   }
11158:   (void)SetColorSetBGandFG();
11159: 
11160:   XtVaSetValues(drawingAreaEdit, XmNbackground, bgPixel, NULL);
11161:   XtVaSetValues(drawingAreaView, XmNbackground, bgPixel, NULL);
11162:   XtVaSetValues(drawingAreaTieCorrelation, XmNbackground, bgPixel, NULL);
11163:   XtVaSetValues(drawingAreaCompCorrelation, XmNbackground, bgPixel, NULL);
11164:   XtVaSetValues(drawingAreaDepthOffset, XmNbackground, bgPixel, NULL);
11165:   XtVaSetValues(drawingAreaAgeDepth, XmNbackground, bgPixel, NULL);
11166:   XtVaSetValues(drawingAreaSpliceToAge, XmNbackground, bgPixel, NULL);
11167:   XtVaSetValues(drawingAreaTieToTimeSeriesCorr, XmNbackground, bgPixel, NULL);
11168:      
11169:   /* set the border color of labels for cursor location and ties to
11170:      the drawing areas background color
11171:   */
11172:   XtVaSetValues(labelCursorLocation, XmNborderColor, bgPixel, NULL);
11173:   XtVaSetValues(labelDepthOffsetCursorLocation, XmNborderColor, bgPixel, NULL);
11174:   XtVaSetValues(labelSpliceCursorLocation, XmNborderColor, bgPixel, NULL);
11175:   XtVaSetValues(labelAgeDepthCursorLocation, XmNborderColor, bgPixel, NULL);
11176:   XtVaSetValues(labelSpliceToAgeCursorLocation, XmNborderColor, bgPixel, NULL);
11177:   XtVaSetValues(labelTie1ID, XmNborderColor, bgPixel, NULL);
11178:   XtVaSetValues(labelTie2ID, XmNborderColor, bgPixel, NULL);
11179:   XtVaSetValues(labelTie1var, XmNborderColor, bgPixel, NULL);
11180:   XtVaSetValues(labelTie2var, XmNborderColor, bgPixel, NULL);
11181:   XtVaSetValues(labelTie1sbd, XmNborderColor, bgPixel, NULL);
11182:   XtVaSetValues(labelTie2sbd, XmNborderColor, bgPixel, NULL);
11183:   XtVaSetValues(labelSpliceTie1ID, XmNborderColor, bgPixel, NULL);
11184:   XtVaSetValues(labelSpliceTie2ID, XmNborderColor, bgPixel, NULL);
11185:   XtVaSetValues(labelSpliceTie1var, XmNborderColor, bgPixel, NULL);
11186:   XtVaSetValues(labelSpliceTie2var, XmNborderColor, bgPixel, NULL);
11187:   XtVaSetValues(labelSpliceTie1sbd, XmNborderColor, bgPixel, NULL);
11188:   XtVaSetValues(labelSpliceTie2sbd, XmNborderColor, bgPixel, NULL);
11189:   XtVaSetValues(labelSpliceDifferenceInValue, XmNborderColor, bgPixel, NULL);
11190: 
11191:   /* if no foreground and or background color were read on command line args 
11192:      set the colors for hsplicer foreground and background to the drawing
11193:      area background and labels
11194:   */
11195:   if(prgfg == NO || prgbg == NO) {
11196:     (void)sprintf(prgfgcolor, "");
11197:     (void)sprintf(prgfgcolor, color[LABEL_COLOR]);
11198:     (void)sprintf(prgbgcolor, "");
11199:     (void)sprintf(prgbgcolor, color[BG_COLOR]);
11200:   }
11201:  
11202: 
11203:   reason_for_redraw = DRAW_EVERYTHING;
11204:   if(XtIsManaged(XtParent(drawingAreaEdit))) { 
11205:     DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
11206:   } 
11207:   if(XtIsManaged(XtParent(drawingAreaView))) { 
11208:     DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
11209:   }
11210:   if(XtIsManaged(XtParent(drawingAreaTieCorrelation))) {
11211:     DrawDrawingAreaTieCorrelation(drawingAreaTieCorrelation, (XtPointer)NULL, (XtPointer)NULL); 
11212:   } 
11213:   if(XtIsManaged(XtParent(drawingAreaCompCorrelation))) { 
11214:     DrawDrawingAreaCompCorrelation(drawingAreaCompCorrelation, (XtPointer)NULL, (XtPointer)NULL); 
11215:   }
11216:   if(XtIsManaged(XtParent(drawingAreaDepthOffset))) {
11217:     DrawDrawingAreaDepthOffset(drawingAreaDepthOffset, (XtPointer)NULL, (XtPointer)NULL);
11218:   }
11219:   if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
11220:     DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
11221:   }
11222:   if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
11223:     DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
11224:   }
11225: }
11226: 
11227: /* ARGSUSED */
11228: void
11229: ColorDrawingAreaBG(w, client, call)
11230: Widget w;
11231: XtPointer client;
11232: XtPointer call;
11233: {
11234:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11235: 
11236:   int item_count;
11237:   char *rgbcolor;
11238:   XmString *pcolor;
11239:   Pixel sampPixel;
11240:   int GetColorPixelValue();
11241:   void SetCustomeColorWidgetBGColors();
11242:  
11243:   /* get the selected color name from the list
11244:   */
11245:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count,
11246:                 XmNselectedItems,&pcolor, NULL);
11247:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor);
11248:  
11249:   /* and change the  color of the core label button
11250:   */
11251:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11252:   XtVaSetValues(pushButtonDrawingAreaColorBG, XmNbackground, sampPixel, NULL);
11253:   XtVaSetValues(pushButtonDrawingAreaColorBG, XmNlabelString, pcolor[0], NULL);
11254:   (void)sprintf(tempcolor[BG_COLOR], "%s", rgbcolor);
11255:   tempbgPixel = sampPixel;
11256:   XtFree(rgbcolor);
11257:  
11258:   /* set the row-column background color
11259:   */
11260:   SetCustomeColorWidgetBGColors(sampPixel);
11261: }
11262: 
11263: /* ARGSUSED */
11264: void
11265: ColorDrawingAreaLabels(w, client, call)
11266: Widget w;
11267: XtPointer client;
11268: XtPointer call;
11269: {
11270:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11271: 
11272:   int item_count;
11273:   char *rgbcolor;
11274:   XmString *pcolor;
11275:   Pixel sampPixel;
11276:   int GetColorPixelValue();
11277:   void SetCustomeColorWidgetFGColors();
11278:  
11279:   /* get the selected color name from the list
11280:   */
11281:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count,
11282:                 XmNselectedItems,&pcolor, NULL);
11283:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor);
11284:  
11285:   /* and change the  color of the core label button
11286:   */
11287:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11288:   XtVaSetValues(pushButtonDrawingAreaColorLabels, XmNbackground, sampPixel, NULL);
11289:   
11290:   XtVaSetValues(pushButtonDrawingAreaColorLabels, XmNlabelString, pcolor[0], NULL);
11291:   (void)sprintf(tempcolor[LABEL_COLOR], "%s", rgbcolor);
11292:   tempfgPixel[LABEL_COLOR] = sampPixel;
11293:   XtFree(rgbcolor);
11294:  
11295:   /* set the row-column label colors
11296:   */
11297:   SetCustomeColorWidgetFGColors(sampPixel);
11298: }
11299: 
11300: /* ARGSUSED */
11301: void
11302: ColorCorembsf(w, client, call)
11303: Widget w;
11304: XtPointer client;
11305: XtPointer call;
11306: {
11307:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11308: 
11309:   int item_count;
11310:   char *rgbcolor;
11311:   XmString *pcolor;
11312:   Pixel sampPixel;
11313:   int GetColorPixelValue();
11314: 
11315:   /* get the selected color name from the list
11316:   */
11317:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count,
11318:                 XmNselectedItems,&pcolor, NULL);
11319:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor);
11320: 
11321:   /* and change the  color of the core label button
11322:   */
11323:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11324:   XtVaSetValues(pushButtonColorCorembsf, XmNbackground, sampPixel, NULL);
11325: 
11326:   XtVaSetValues(pushButtonColorCorembsf, XmNlabelString, pcolor[0], NULL);
11327:   (void)sprintf(tempcolor[MBSF_COLOR], "%s", rgbcolor);
11328:   tempfgPixel[MBSF_COLOR] = sampPixel;
11329:   XtFree(rgbcolor);
11330: }
11331: 
11332: /* ARGSUSED */
11333: void
11334: ColorCoremcd(w, client, call)
11335: Widget w;
11336: XtPointer client;
11337: XtPointer call;
11338: {
11339:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11340: 
11341:   int item_count;
11342:   char *rgbcolor;
11343:   XmString *pcolor;
11344:   Pixel sampPixel;
11345:   int GetColorPixelValue();
11346: 
11347:   /* get the selected color name from the list
11348:   */
11349:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count,
11350:                 XmNselectedItems,&pcolor, NULL);
11351:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor);
11352: 
11353:   /* and change the  color of the core label button
11354:   */
11355:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11356:   XtVaSetValues(pushButtonColorCoremcd, XmNbackground, sampPixel, NULL);
11357:  
11358:   XtVaSetValues(pushButtonColorCoremcd, XmNlabelString, pcolor[0], NULL);
11359:   (void)sprintf(tempcolor[MCD_COLOR], "%s", rgbcolor);
11360:   tempfgPixel[MCD_COLOR] = sampPixel;
11361:   XtFree(rgbcolor);
11362: }
11363: 
11364: /* ARGSUSED */
11365: void
11366: ColorSmooth(w, client, call)
11367: Widget w;
11368: XtPointer client;
11369: XtPointer call;
11370: {
11371:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11372: 
11373:   int item_count; 
11374:   char *rgbcolor; 
11375:   XmString *pcolor; 
11376:   Pixel sampPixel;
11377:   int GetColorPixelValue();
11378:  
11379:   /* get the selected color name from the list 
11380:   */ 
11381:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
11382:                 XmNselectedItems,&pcolor, NULL); 
11383:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
11384:  
11385:   /* and change the  color of the core label button 
11386:   */ 
11387:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11388:   XtVaSetValues(pushButtonColorSmooth, XmNbackground, sampPixel, NULL);
11389:   
11390:   XtVaSetValues(pushButtonColorSmooth, XmNlabelString, pcolor[0], NULL); 
11391:   (void)sprintf(tempcolor[SMOOTH_COLOR], "%s", rgbcolor); 
11392:   tempfgPixel[SMOOTH_COLOR] = sampPixel;
11393:   XtFree(rgbcolor);
11394: }
11395: 
11396: /* ARGSUSED */
11397: void
11398: ColorSplice(w, client, call)
11399: Widget w;
11400: XtPointer client;
11401: XtPointer call;
11402: {
11403:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11404: 
11405:   int item_count; 
11406:   char *rgbcolor; 
11407:   XmString *pcolor; 
11408:   Pixel sampPixel;
11409:   int GetColorPixelValue();
11410:  
11411:   /* get the selected color name from the list 
11412:   */ 
11413:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
11414:                 XmNselectedItems,&pcolor, NULL); 
11415:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
11416:  
11417:   /* and change the  color of the core label button 
11418:   */ 
11419:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11420:   XtVaSetValues(pushButtonColorSplice, XmNbackground, sampPixel, NULL);
11421:   
11422:   XtVaSetValues(pushButtonColorSplice, XmNlabelString, pcolor[0], NULL); 
11423:   (void)sprintf(tempcolor[SPLICE_COLOR], "%s", rgbcolor); 
11424:   tempfgPixel[SPLICE_COLOR] = sampPixel;
11425:   XtFree(rgbcolor);
11426: }
11427: 
11428: /* ARGSUSED */
11429: void
11430: ColorSpliceLocation(w, client, call)
11431: Widget w;
11432: XtPointer client;
11433: XtPointer call;
11434: {
11435:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11436: 
11437:   int item_count; 
11438:   char *rgbcolor; 
11439:   XmString *pcolor; 
11440:   Pixel sampPixel;
11441:   int GetColorPixelValue();
11442:  
11443:   /* get the selected color name from the list 
11444:   */ 
11445:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
11446:                 XmNselectedItems,&pcolor, NULL); 
11447:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
11448:  
11449:   /* and change the  color of the core label button 
11450:   */ 
11451:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11452:   XtVaSetValues(pushButtonColorSpliceLocation, XmNbackground, sampPixel, NULL);
11453:   
11454:   XtVaSetValues(pushButtonColorSpliceLocation, XmNlabelString, pcolor[0], NULL); 
11455:   (void)sprintf(tempcolor[SPLICELOCATION_COLOR], "%s", rgbcolor); 
11456:   tempfgPixel[SPLICELOCATION_COLOR] = sampPixel;
11457:   XtFree(rgbcolor);
11458: }
11459: 
11460: /* ARGSUSED */
11461: void
11462: ColorTiePtFixed(w, client, call)
11463: Widget w;
11464: XtPointer client;
11465: XtPointer call;
11466: {
11467:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11468: 
11469:   int item_count; 
11470:   char *rgbcolor; 
11471:   XmString *pcolor; 
11472:   Pixel sampPixel;
11473:   int GetColorPixelValue();
11474:  
11475:   /* get the selected color name from the list 
11476:   */ 
11477:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
11478:                 XmNselectedItems,&pcolor, NULL); 
11479:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
11480:  
11481:   /* and change the  color of the core label button 
11482:   */ 
11483:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11484:   XtVaSetValues(pushButtonColorTiePtFixed, XmNbackground, sampPixel, NULL);
11485:   
11486:   XtVaSetValues(pushButtonColorTiePtFixed, XmNlabelString, pcolor[0], NULL); 
11487:   (void)sprintf(tempcolor[TIEPTFIXED_COLOR], "%s", rgbcolor); 
11488:   tempfgPixel[TIEPTFIXED_COLOR] = sampPixel;
11489:   XtFree(rgbcolor);
11490: }
11491: 
11492: /* ARGSUSED */
11493: void
11494: ColorTieLine(w, client, call)
11495: Widget w;
11496: XtPointer client;
11497: XtPointer call;
11498: {
11499:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11500: 
11501:   int item_count; 
11502:   char *rgbcolor; 
11503:   XmString *pcolor; 
11504:   Pixel sampPixel;
11505:   int GetColorPixelValue();
11506:  
11507:   /* get the selected color name from the list 
11508:   */ 
11509:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
11510:                 XmNselectedItems,&pcolor, NULL); 
11511:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
11512:  
11513:   /* and change the  color of the core label button 
11514:   */ 
11515:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11516:   XtVaSetValues(pushButtonColorTieLine, XmNbackground, sampPixel, NULL);
11517:   
11518:   XtVaSetValues(pushButtonColorTieLine, XmNlabelString, pcolor[0], NULL); 
11519:   (void)sprintf(tempcolor[TIELINE_COLOR], "%s", rgbcolor); 
11520:   tempfgPixel[TIELINE_COLOR] = sampPixel;
11521:   XtFree(rgbcolor);
11522: }
11523: 
11524: /* ARGSUSED */
11525: void
11526: ColorOverlayInCorr(w, client, call)
11527: Widget w;
11528: XtPointer client;
11529: XtPointer call;
11530: {
11531:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11532: 
11533:   int item_count; 
11534:   char *rgbcolor; 
11535:   XmString *pcolor; 
11536:   Pixel sampPixel;
11537:   int GetColorPixelValue();
11538:  
11539:   /* get the selected color name from the list 
11540:   */ 
11541:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
11542:                 XmNselectedItems,&pcolor, NULL); 
11543:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
11544:  
11545:   /* and change the  color of the core label button 
11546:   */ 
11547:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11548:   XtVaSetValues(pushButtonColorOverlayInCorr, XmNbackground, sampPixel, NULL);
11549:   
11550:   XtVaSetValues(pushButtonColorOverlayInCorr, XmNlabelString, pcolor[0], NULL); 
11551:   (void)sprintf(tempcolor[OVERLAYINCORR_COLOR], "%s", rgbcolor); 
11552:   tempfgPixel[OVERLAYINCORR_COLOR] = sampPixel;
11553:   XtFree(rgbcolor);
11554: }
11555: 
11556: /* ARGSUSED */
11557: void
11558: ColorOverlayOutCorr(w, client, call)
11559: Widget w;
11560: XtPointer client;
11561: XtPointer call;
11562: {
11563:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11564: 
11565:   int item_count; 
11566:   char *rgbcolor; 
11567:   XmString *pcolor; 
11568:   Pixel sampPixel;
11569:   int GetColorPixelValue();
11570:  
11571:   /* get the selected color name from the list 
11572:   */ 
11573:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
11574:                 XmNselectedItems,&pcolor, NULL); 
11575:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
11576:  
11577:   /* and change the  color of the core label button 
11578:   */ 
11579:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11580:   XtVaSetValues(pushButtonColorOverlayOutCorr, XmNbackground, sampPixel, NULL);
11581:   
11582:   XtVaSetValues(pushButtonColorOverlayOutCorr, XmNlabelString, pcolor[0], NULL); 
11583:   (void)sprintf(tempcolor[OVERLAYOUTCORR_COLOR], "%s", rgbcolor); 
11584:   tempfgPixel[OVERLAYOUTCORR_COLOR] = sampPixel;
11585:   XtFree(rgbcolor);
11586: }
11587: 
11588: /* ARGSUSED */
11589: void
11590: ColorPaleomag(w, client, call)
11591: Widget w;
11592: XtPointer client;
11593: XtPointer call;
11594: {
11595:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11596: 
11597:   int item_count; 
11598:   char *rgbcolor; 
11599:   XmString *pcolor; 
11600:   Pixel sampPixel;
11601:   int GetColorPixelValue();
11602:  
11603:   /* get the selected color name from the list 
11604:   */ 
11605:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
11606:                 XmNselectedItems,&pcolor, NULL); 
11607:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
11608:  
11609:   /* and change the  color of the core label button 
11610:   */ 
11611:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11612:   XtVaSetValues(pushButtonColorPaleomag, XmNbackground, sampPixel, NULL);
11613:   
11614:   XtVaSetValues(pushButtonColorPaleomag, XmNlabelString, pcolor[0], NULL); 
11615:   (void)sprintf(tempcolor[PALEOMAG_COLOR], "%s", rgbcolor); 
11616:   tempfgPixel[PALEOMAG_COLOR] = sampPixel;
11617:   XtFree(rgbcolor);
11618: }
11619: 
11620: /* ARGSUSED */
11621: void
11622: ColorDiatom(w, client, call)
11623: Widget w;
11624: XtPointer client;
11625: XtPointer call;
11626: {
11627:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11628: 
11629:   int item_count; 
11630:   char *rgbcolor; 
11631:   XmString *pcolor; 
11632:   Pixel sampPixel;
11633:   int GetColorPixelValue();
11634:  
11635:   /* get the selected color name from the list 
11636:   */ 
11637:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
11638:                 XmNselectedItems,&pcolor, NULL); 
11639:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
11640:  
11641:   /* and change the  color of the core label button 
11642:   */ 
11643:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11644:   XtVaSetValues(pushButtonColorDiatom, XmNbackground, sampPixel, NULL);
11645:   
11646:   XtVaSetValues(pushButtonColorDiatom, XmNlabelString, pcolor[0], NULL); 
11647:   (void)sprintf(tempcolor[DIATOM_COLOR], "%s", rgbcolor); 
11648:   tempfgPixel[DIATOM_COLOR] = sampPixel;
11649:   XtFree(rgbcolor);
11650: }
11651: 
11652: /* ARGSUSED */
11653: void
11654: ColorRad(w, client, call)
11655: Widget w;
11656: XtPointer client;
11657: XtPointer call;
11658: {
11659:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11660: 
11661:   int item_count; 
11662:   char *rgbcolor; 
11663:   XmString *pcolor; 
11664:   Pixel sampPixel;
11665:   int GetColorPixelValue();
11666:  
11667:   /* get the selected color name from the list 
11668:   */ 
11669:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
11670:                 XmNselectedItems,&pcolor, NULL); 
11671:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
11672:  
11673:   /* and change the  color of the core label button 
11674:   */ 
11675:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11676:   XtVaSetValues(pushButtonColorRad, XmNbackground, sampPixel, NULL);
11677:   
11678:   XtVaSetValues(pushButtonColorRad, XmNlabelString, pcolor[0], NULL); 
11679:   (void)sprintf(tempcolor[RAD_COLOR], "%s", rgbcolor); 
11680:   tempfgPixel[RAD_COLOR] = sampPixel;
11681:   XtFree(rgbcolor);
11682: }
11683: 
11684: /* ARGSUSED */
11685: void
11686: ColorForam(w, client, call)
11687: Widget w;
11688: XtPointer client;
11689: XtPointer call;
11690: {
11691:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11692: 
11693:   int item_count; 
11694:   char *rgbcolor; 
11695:   XmString *pcolor; 
11696:   Pixel sampPixel;
11697:   int GetColorPixelValue();
11698:  
11699:   /* get the selected color name from the list 
11700:   */ 
11701:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
11702:                 XmNselectedItems,&pcolor, NULL); 
11703:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
11704:  
11705:   /* and change the  color of the core label button 
11706:   */ 
11707:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11708:   XtVaSetValues(pushButtonColorForam, XmNbackground, sampPixel, NULL);
11709:   
11710:   XtVaSetValues(pushButtonColorForam, XmNlabelString, pcolor[0], NULL); 
11711:   (void)sprintf(tempcolor[FORAM_COLOR], "%s", rgbcolor); 
11712:   tempfgPixel[FORAM_COLOR] = sampPixel;
11713:   XtFree(rgbcolor);
11714: }
11715: 
11716: /* ARGSUSED */
11717: void
11718: ColorNanno(w, client, call)
11719: Widget w;
11720: XtPointer client;
11721: XtPointer call;
11722: {
11723:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11724: 
11725:   int item_count; 
11726:   char *rgbcolor; 
11727:   XmString *pcolor; 
11728:   Pixel sampPixel;
11729:   int GetColorPixelValue();
11730:  
11731:   /* get the selected color name from the list 
11732:   */ 
11733:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
11734:                 XmNselectedItems,&pcolor, NULL); 
11735:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
11736:  
11737:   /* and change the  color of the core label button 
11738:   */ 
11739:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11740:   XtVaSetValues(pushButtonColorNanno, XmNbackground, sampPixel, NULL);
11741:   
11742:   XtVaSetValues(pushButtonColorNanno, XmNlabelString, pcolor[0], NULL); 
11743:   (void)sprintf(tempcolor[NANNO_COLOR], "%s", rgbcolor); 
11744:   tempfgPixel[NANNO_COLOR] = sampPixel;
11745:   XtFree(rgbcolor);
11746: }
11747: 
11748: /* ARGSUSED */
11749: void
11750: ColorCorrCoef(w, client, call)
11751: Widget w;
11752: XtPointer client;
11753: XtPointer call;
11754: {
11755:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11756: 
11757:   int item_count;
11758:   char *rgbcolor;
11759:   XmString *pcolor;
11760:   Pixel sampPixel;
11761:   int GetColorPixelValue();
11762:  
11763:   /* get the selected color name from the list
11764:   */
11765:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count,
11766:                 XmNselectedItems,&pcolor, NULL);
11767:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor);
11768:  
11769:   /* and change the  color of the core label button
11770:   */
11771:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11772:   XtVaSetValues(pushButtonColorCorrCoef, XmNbackground, sampPixel, NULL);
11773:  
11774:   XtVaSetValues(pushButtonColorCorrCoef, XmNlabelString, pcolor[0], NULL);
11775:   (void)sprintf(tempcolor[CORRCOEF_COLOR], "%s", rgbcolor);
11776:   tempfgPixel[CORRCOEF_COLOR] = sampPixel;
11777:   XtFree(rgbcolor);
11778: }
11779: 
11780: /* ARGSUSED */
11781: void
11782: ColorBestCorr(w, client, call)
11783: Widget w;
11784: XtPointer client;
11785: XtPointer call;
11786: {
11787:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11788: 
11789:   int item_count;
11790:   char *rgbcolor;
11791:   XmString *pcolor;
11792:   Pixel sampPixel;
11793:   int GetColorPixelValue();
11794:  
11795:   /* get the selected color name from the list
11796:   */
11797:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count,
11798:                 XmNselectedItems,&pcolor, NULL);
11799:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor);
11800:  
11801:   /* and change the  color of the core label button
11802:   */
11803:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11804:   XtVaSetValues(pushButtonColorBestCorr, XmNbackground, sampPixel, NULL);
11805:  
11806:   XtVaSetValues(pushButtonColorBestCorr, XmNlabelString, pcolor[0], NULL);
11807:   (void)sprintf(tempcolor[BESTCORR_COLOR], "%s", rgbcolor);
11808:   tempfgPixel[BESTCORR_COLOR] = sampPixel;
11809:   XtFree(rgbcolor);
11810: }
11811: 
11812: /* ARGSUSED */
11813: void
11814: ColorDepthOffsetLine(w, client, call)
11815: Widget w;
11816: XtPointer client;
11817: XtPointer call;
11818: {
11819:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11820: 
11821:   int item_count;
11822:   char *rgbcolor;
11823:   XmString *pcolor;
11824:   Pixel sampPixel;
11825:   int GetColorPixelValue();
11826:  
11827:   /* get the selected color name from the list
11828:   */
11829:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count,
11830:                 XmNselectedItems,&pcolor, NULL);
11831:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor);
11832:  
11833:   /* and change the  color of the core label button
11834:   */
11835:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11836:   XtVaSetValues(pushButtonColorDepthOffsetLine, XmNbackground, sampPixel, NULL);
11837:  
11838:   XtVaSetValues(pushButtonColorDepthOffsetLine, XmNlabelString, pcolor[0], NULL);
11839:   (void)sprintf(tempcolor[DEPOFFLINE_COLOR], "%s", rgbcolor);
11840:   tempfgPixel[DEPOFFLINE_COLOR] = sampPixel;
11841:   XtFree(rgbcolor);
11842: }
11843: 
11844: /* ARGSUSED */
11845: void
11846: ColorDepthOffsetHole1(w, client, call)
11847: Widget w;
11848: XtPointer client;
11849: XtPointer call;
11850: {
11851:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11852: 
11853:   int item_count;
11854:   char *rgbcolor;
11855:   XmString *pcolor;
11856:   Pixel sampPixel;
11857:   int GetColorPixelValue();
11858: 
11859:   /* get the selected color name from the list
11860:   */
11861:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count,
11862:                 XmNselectedItems,&pcolor, NULL);
11863:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor);
11864: 
11865:   /* and change the  color of the core label button
11866:   */
11867:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11868:   XtVaSetValues(pushButtonColorDepthOffsetHole1, XmNbackground, sampPixel, NULL);
11869: 
11870:   XtVaSetValues(pushButtonColorDepthOffsetHole1, XmNlabelString, pcolor[0], NULL);
11871:   (void)sprintf(tempcolor[DEPOFFHOLE1_COLOR], "%s", rgbcolor);
11872:   tempfgPixel[DEPOFFHOLE1_COLOR] = sampPixel;
11873:   XtFree(rgbcolor);
11874: }
11875: 
11876: /* ARGSUSED */
11877: void
11878: ColorDepthOffsetHole2(w, client, call)
11879: Widget w;
11880: XtPointer client;
11881: XtPointer call;
11882: {
11883:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11884: 
11885:   int item_count;
11886:   char *rgbcolor;
11887:   XmString *pcolor;
11888:   Pixel sampPixel;
11889:   int GetColorPixelValue();
11890:  
11891:   /* get the selected color name from the list
11892:   */
11893:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count,
11894:                 XmNselectedItems,&pcolor, NULL);
11895:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor);
11896:  
11897:   /* and change the  color of the core label button
11898:   */
11899:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11900:   XtVaSetValues(pushButtonColorDepthOffsetHole2, XmNbackground, sampPixel, NULL);
11901:  
11902:   XtVaSetValues(pushButtonColorDepthOffsetHole2, XmNlabelString, pcolor[0], NULL);
11903:   (void)sprintf(tempcolor[DEPOFFHOLE2_COLOR], "%s", rgbcolor);
11904:   tempfgPixel[DEPOFFHOLE2_COLOR] = sampPixel;
11905:   XtFree(rgbcolor);
11906: }
11907: 
11908: /* ARGSUSED */
11909: void
11910: ColorDepthOffsetHole3(w, client, call)
11911: Widget w;
11912: XtPointer client;
11913: XtPointer call;
11914: {
11915:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11916: 
11917:   int item_count; 
11918:   char *rgbcolor; 
11919:   XmString *pcolor; 
11920:   Pixel sampPixel;
11921:   int GetColorPixelValue();
11922:   
11923:   /* get the selected color name from the list 
11924:   */ 
11925:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
11926:                 XmNselectedItems,&pcolor, NULL); 
11927:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
11928:   
11929:   /* and change the  color of the core label button 
11930:   */ 
11931:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11932:   XtVaSetValues(pushButtonColorDepthOffsetHole3, XmNbackground, sampPixel, NULL);
11933:   
11934:   XtVaSetValues(pushButtonColorDepthOffsetHole3, XmNlabelString, pcolor[0], NULL); 
11935:   (void)sprintf(tempcolor[DEPOFFHOLE3_COLOR], "%s", rgbcolor); 
11936:   tempfgPixel[DEPOFFHOLE3_COLOR] = sampPixel;
11937:   XtFree(rgbcolor);
11938: }
11939: 
11940: /* ARGSUSED */
11941: void
11942: ColorDepthOffsetHole4(w, client, call)
11943: Widget w;
11944: XtPointer client;
11945: XtPointer call;
11946: {
11947:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11948: 
11949:   int item_count;
11950:   char *rgbcolor; 
11951:   XmString *pcolor;
11952:   Pixel sampPixel;
11953:   int GetColorPixelValue();
11954:  
11955:   /* get the selected color name from the list
11956:   */
11957:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count,
11958:                 XmNselectedItems,&pcolor, NULL);
11959:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor);
11960:  
11961:   /* and change the  color of the core label button
11962:   */
11963:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11964:   XtVaSetValues(pushButtonColorDepthOffsetHole4, XmNbackground, sampPixel, NULL);
11965:  
11966:   XtVaSetValues(pushButtonColorDepthOffsetHole4, XmNlabelString, pcolor[0], NULL);
11967:   (void)sprintf(tempcolor[DEPOFFHOLE4_COLOR], "%s", rgbcolor);
11968:   tempfgPixel[DEPOFFHOLE4_COLOR] = sampPixel;
11969:   XtFree(rgbcolor);
11970: }
11971: 
11972: /* ARGSUSED */
11973: void
11974: ColorDepthOffsetHole5(w, client, call)
11975: Widget w;
11976: XtPointer client;
11977: XtPointer call;
11978: {
11979:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
11980: 
11981:   int item_count; 
11982:   char *rgbcolor; 
11983:   XmString *pcolor; 
11984:   Pixel sampPixel;
11985:   int GetColorPixelValue();
11986:   
11987:   /* get the selected color name from the list 
11988:   */ 
11989:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
11990:                 XmNselectedItems,&pcolor, NULL); 
11991:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
11992:   
11993:   /* and change the  color of the core label button 
11994:   */ 
11995:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
11996:   XtVaSetValues(pushButtonColorDepthOffsetHole5, XmNbackground, sampPixel, NULL);
11997:   
11998:   XtVaSetValues(pushButtonColorDepthOffsetHole5, XmNlabelString, pcolor[0], NULL); 
11999:   (void)sprintf(tempcolor[DEPOFFHOLE5_COLOR], "%s", rgbcolor); 
12000:   tempfgPixel[DEPOFFHOLE5_COLOR] = sampPixel;
12001:   XtFree(rgbcolor);
12002: }
12003: 
12004: /* ARGSUSED */
12005: void
12006: ColorDepthOffsetHole6(w, client, call)
12007: Widget w;
12008: XtPointer client;
12009: XtPointer call;
12010: {
12011:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12012: 
12013:   int item_count; 
12014:   char *rgbcolor; 
12015:   XmString *pcolor; 
12016:   Pixel sampPixel;
12017:   int GetColorPixelValue();
12018:   
12019:   /* get the selected color name from the list 
12020:   */ 
12021:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
12022:                 XmNselectedItems,&pcolor, NULL); 
12023:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
12024:   
12025:   /* and change the  color of the core label button 
12026:   */ 
12027:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
12028:   XtVaSetValues(pushButtonColorDepthOffsetHole6, XmNbackground, sampPixel, NULL);
12029:   
12030:   XtVaSetValues(pushButtonColorDepthOffsetHole6, XmNlabelString, pcolor[0], NULL); 
12031:   (void)sprintf(tempcolor[DEPOFFHOLE6_COLOR], "%s", rgbcolor); 
12032:   tempfgPixel[DEPOFFHOLE6_COLOR] = sampPixel;
12033:   XtFree(rgbcolor);
12034: }
12035: 
12036: /* ARGSUSED */
12037: void
12038: ColorDepthOffsetHole7(w, client, call)
12039: Widget w;
12040: XtPointer client;
12041: XtPointer call;
12042: {
12043:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12044: 
12045:   int item_count; 
12046:   char *rgbcolor; 
12047:   XmString *pcolor; 
12048:   Pixel sampPixel;
12049:   int GetColorPixelValue();
12050:   
12051:   /* get the selected color name from the list 
12052:   */ 
12053:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
12054:                 XmNselectedItems,&pcolor, NULL); 
12055:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
12056:   
12057:   /* and change the  color of the core label button 
12058:   */ 
12059:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
12060:   XtVaSetValues(pushButtonColorDepthOffsetHole7, XmNbackground, sampPixel, NULL);
12061:   
12062:   XtVaSetValues(pushButtonColorDepthOffsetHole7, XmNlabelString, pcolor[0], NULL); 
12063:   (void)sprintf(tempcolor[DEPOFFHOLE7_COLOR], "%s", rgbcolor); 
12064:   tempfgPixel[DEPOFFHOLE7_COLOR] = sampPixel;
12065:   XtFree(rgbcolor);
12066: }
12067: 
12068: /* ARGSUSED */
12069: void
12070: ColorDepthOffsetHole8(w, client, call)
12071: Widget w;
12072: XtPointer client;
12073: XtPointer call;
12074: {
12075:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12076: 
12077:   int item_count; 
12078:   char *rgbcolor; 
12079:   XmString *pcolor; 
12080:   Pixel sampPixel;
12081:   int GetColorPixelValue();
12082:   
12083:   /* get the selected color name from the list 
12084:   */ 
12085:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
12086:                 XmNselectedItems,&pcolor, NULL); 
12087:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
12088:   
12089:   /* and change the  color of the core label button 
12090:   */ 
12091:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
12092:   XtVaSetValues(pushButtonColorDepthOffsetHole8, XmNbackground, sampPixel, NULL);
12093:   
12094:   XtVaSetValues(pushButtonColorDepthOffsetHole8, XmNlabelString, pcolor[0], NULL); 
12095:   (void)sprintf(tempcolor[DEPOFFHOLE8_COLOR], "%s", rgbcolor); 
12096:   tempfgPixel[DEPOFFHOLE8_COLOR] = sampPixel;
12097:   XtFree(rgbcolor);
12098: }
12099: 
12100: /* ARGSUSED */
12101: void
12102: ColorDepthOffsetHole9(w, client, call)
12103: Widget w;
12104: XtPointer client;
12105: XtPointer call;
12106: {
12107:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12108: 
12109:   int item_count; 
12110:   char *rgbcolor; 
12111:   XmString *pcolor; 
12112:   Pixel sampPixel;
12113:   int GetColorPixelValue();
12114:   
12115:   /* get the selected color name from the list 
12116:   */ 
12117:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
12118:                 XmNselectedItems,&pcolor, NULL); 
12119:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
12120:   
12121:   /* and change the  color of the core label button 
12122:   */ 
12123:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
12124:   XtVaSetValues(pushButtonColorDepthOffsetHole9, XmNbackground, sampPixel, NULL);
12125:   
12126:   XtVaSetValues(pushButtonColorDepthOffsetHole9, XmNlabelString, pcolor[0], NULL); 
12127:   (void)sprintf(tempcolor[DEPOFFHOLE9_COLOR], "%s", rgbcolor); 
12128:   tempfgPixel[DEPOFFHOLE9_COLOR] = sampPixel;
12129:   XtFree(rgbcolor);
12130: }
12131: 
12132: /* ARGSUSED */
12133: void
12134: ColorDepthOffsetHole10(w, client, call)
12135: Widget w;
12136: XtPointer client;
12137: XtPointer call;
12138: {
12139:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12140: 
12141:   int item_count; 
12142:   char *rgbcolor; 
12143:   XmString *pcolor; 
12144:   Pixel sampPixel;
12145:   int GetColorPixelValue();
12146:   
12147:   /* get the selected color name from the list 
12148:   */ 
12149:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
12150:                 XmNselectedItems,&pcolor, NULL); 
12151:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
12152:   
12153:   /* and change the  color of the core label button 
12154:   */ 
12155:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
12156:   XtVaSetValues(pushButtonColorDepthOffsetHole10, XmNbackground, sampPixel, NULL);
12157:   
12158:   XtVaSetValues(pushButtonColorDepthOffsetHole10, XmNlabelString, pcolor[0], NULL); 
12159:   (void)sprintf(tempcolor[DEPOFFHOLE10_COLOR], "%s", rgbcolor); 
12160:   tempfgPixel[DEPOFFHOLE10_COLOR] = sampPixel;
12161:   XtFree(rgbcolor);
12162: }
12163: 
12164: /* ARGSUSED */
12165: void
12166: ColorDepthOffsetHole11(w, client, call)
12167: Widget w;
12168: XtPointer client;
12169: XtPointer call;
12170: {
12171:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12172: 
12173:   int item_count; 
12174:   char *rgbcolor; 
12175:   XmString *pcolor; 
12176:   Pixel sampPixel;
12177:   int GetColorPixelValue();
12178:   
12179:   /* get the selected color name from the list 
12180:   */ 
12181:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
12182:                 XmNselectedItems,&pcolor, NULL); 
12183:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
12184:   
12185:   /* and change the  color of the core label button 
12186:   */ 
12187:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
12188:   XtVaSetValues(pushButtonColorDepthOffsetHole11, XmNbackground, sampPixel, NULL);
12189:   
12190:   XtVaSetValues(pushButtonColorDepthOffsetHole11, XmNlabelString, pcolor[0], NULL); 
12191:   (void)sprintf(tempcolor[DEPOFFHOLE11_COLOR], "%s", rgbcolor); 
12192:   tempfgPixel[DEPOFFHOLE11_COLOR] = sampPixel;
12193:   XtFree(rgbcolor);
12194: }
12195: 
12196: /* ARGSUSED */
12197: void
12198: ColorCancel(w, client, call)
12199: Widget w;
12200: XtPointer client;
12201: XtPointer call;
12202: {
12203:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12204: 
12205:   XtUnmanageChild(formSetColor);
12206: }
12207: 
12208: /* ARGSUSED */
12209: void
12210: ColorTiePtShift(w, client, call)
12211: Widget w;
12212: XtPointer client;
12213: XtPointer call;
12214: {
12215:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12216: 
12217:   int item_count; 
12218:   char *rgbcolor; 
12219:   XmString *pcolor; 
12220:   Pixel sampPixel;
12221:   int GetColorPixelValue();
12222:   
12223:   /* get the selected color name from the list 
12224:   */ 
12225:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count, 
12226:                 XmNselectedItems,&pcolor, NULL); 
12227:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor); 
12228:   
12229:   /* and change the  color of the core label button 
12230:   */ 
12231:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
12232:   XtVaSetValues(pushButtonColorTiePtShift, XmNbackground, sampPixel, NULL);
12233:   
12234:   XtVaSetValues(pushButtonColorTiePtShift, XmNlabelString, pcolor[0], NULL); 
12235:   (void)sprintf(tempcolor[TIEPTSHIFT_COLOR], "%s", rgbcolor); 
12236:   tempfgPixel[TIEPTSHIFT_COLOR] = sampPixel;
12237:   XtFree(rgbcolor);
12238: }
12239: 
12240: /* ARGSUSED */
12241: void
12242: SpliceUndoCancel(w, client, call)
12243: Widget w;
12244: XtPointer client;
12245: XtPointer call;
12246: {
12247:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12248: 
12249:   XtUnmanageChild(formSpliceUndo);
12250: 
12251:   /* XtSetSensitive(pushButtonGetSelectCore, False); */
12252: 
12253:   (void)sprintf(buffer, "You may only add to the splice");
12254:   SpManageWarningBox(buffer);
12255: }
12256: 
12257: /* ARGSUSED */
12258: void
12259: SpliceUndoHelp(w, client, call)
12260: Widget w;
12261: XtPointer client;
12262: XtPointer call;
12263: {
12264:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12265: }
12266: 
12267: /* ARGSUSED */
12268: void
12269: SpliceUndoOK(w, client, call)
12270: Widget w;
12271: XtPointer client;
12272: XtPointer call;
12273: {
12274:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12275: 
12276:   XtUnmanageChild(formSpliceUndo);
12277: 
12278:   SpliceUndoLast(NULL, "ok", NULL);
12279: }
12280: 
12281: /* ARGSUSED */
12282: void
12283: ViewAgeDepth(w, client, call)
12284: Widget w;
12285: XtPointer client;
12286: XtPointer call;
12287: {
12288:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12289: 
12290:   int i;
12291:   char string[20];
12292:   XmString xmstring;
12293:   void DrawDrawingAreaAgeDepth(), XmListAddItem(), AgeDepthConstructAgeModel();
12294: 
12295:   XtManageChild(formAgeDepth);
12296:   XtPopup(XtParent(formAgeDepth), XtGrabNone);
12297:  
12298:   (void)sprintf(string, "1");
12299:   XtVaSetValues(textAgeDepthZoomFactor, XmNvalue, string, NULL);
12300: 
12301:   /* put the strat types in the list
12302:   */
12303:   if(have_strat == DO) {
12304: 
12305:     if(have_affine == DO) {
12306:       XtSetSensitive(toggleButtonAgeDepthmcd, True);
12307:     }
12308:     else {
12309:       XtSetSensitive(toggleButtonAgeDepthmcd, False);
12310:     }
12311:     XtSetSensitive(toggleButtonAgeDepthmbsf, True);
12312:     XtSetSensitive(formAgeDepthControls, True);
12313: 
12314:     for(i=0; i<strat_file_cnt; ++i) {
12315:       agedepth_use_type[i] = YES;
12316:     }
12317:   }
12318:   else {
12319:     XtSetSensitive(formAgeDepthControls, False);
12320:   }
12321: 
12322:   top_age_agedepth = 0.0;
12323:   top_meter_agedepth = 0.0;
12324: 
12325:   AgeDepthConstructAgeModel((Widget)NULL, (XtPointer)NULL, (XtPointer)NULL);
12326: 
12327:   (void)sprintf(string, "");
12328: }
12329: 
12330: /* ARGSUSED */
12331: void
12332: AgeDepthDismiss(w, client, call)
12333: Widget w;
12334: XtPointer client;
12335: XtPointer call;
12336: {
12337:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12338: 
12339:   are_agemodelling = NO;
12340: 
12341:   XtUnmanageChild(formAgeDepth);
12342: }
12343: 
12344: /* ARGSUSED */
12345: void
12346: AgeDepthHelp(w, client, call)
12347: Widget w;
12348: XtPointer client;
12349: XtPointer call;
12350: {
12351:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12352: }
12353: 
12354: /* ARGSUSED */
12355: void
12356: AgeDepthmbsf(w, client, call)
12357: Widget w;
12358: XtPointer client;
12359: XtPointer call;
12360: {
12361:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12362: 
12363:   void DrawDrawingAreaAgeDepth();
12364: 
12365:   agemodelling_depth_type = MBSF;
12366:   if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
12367:     DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
12368:   }
12369: }
12370: 
12371: /* ARGSUSED */
12372: void
12373: AgeDepthmcd(w, client, call)
12374: Widget w;
12375: XtPointer client;
12376: XtPointer call;
12377: {
12378:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12379: 
12380:   void DrawDrawingAreaAgeDepth();
12381: 
12382:   agemodelling_depth_type = MCD;
12383:   if(XtIsManaged(XtParent(drawingAreaAgeDepth))) { 
12384:     DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
12385:   } 
12386: }
12387: 
12388: /* ARGSUSED */
12389: void
12390: AgeDepthSave(w, client, call)
12391: Widget w;
12392: XtPointer client;
12393: XtPointer call;
12394: {
12395:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12396: 
12397:   if((message.label=(char*)calloc(100,CHAR_SIZE))==NULL)
12398:                         SpBadMemAlloc("Sp");
12399:   (void)sprintf(message.label,"This Option is incomplete.");
12400:   SpManageMessage(message);
12401: }
12402: 
12403: /* ARGSUSED */
12404: void
12405: DrawAgeDepthCreate(w, client, call)
12406: Widget w;
12407: XtPointer client;
12408: XtPointer call;
12409: {
12410:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12411: }
12412: 
12413: /* ARGSUSED */
12414: void
12415: DrawDrawingAreaAgeDepth(w, client, call)
12416: Widget w;
12417: XtPointer client;
12418: XtPointer call;
12419: {
12420:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12421: 
12422:   int i, j, k, sx, sdx, sy, sdy, axispixlen, ticpixlen, annot, label, pixpermeter, pixperage, core, array,
12423:       zoom, topoff, botoff, left;
12424:   char s[50];
12425:   float  max, maxmeter, maxage, maxoffset, unitinc, depticlen, sect, sect_dep, 
12426:          dep, percentdepchange, ageticlen, adj1, adj2;
12427:   double check, fract, ip;
12428:   String str;
12429:   Dimension win_width, win_height;
12430:   XGCValues gcValues;
12431:   void HardwireAxis(), AxisDep(), AxisAge();
12432:  
12433:   XtVaGetValues(w, XmNheight, &win_height, XmNwidth, &win_width, NULL);
12434: 
12435:    /*clear the drawing area
12436:   */
12437:   XClearWindow(XtDisplay(w), XtWindow(w));
12438: 
12439:   if(have_strat == DONT) {
12440:     return;
12441:   }
12442: 
12443:   /* get the zoom factor
12444:   */
12445:   str = XmTextGetString(textAgeDepthZoomFactor);
12446:   zoom = atoi(str);
12447:   XtFree(str);
12448: 
12449:   if(agemodelling_depth_type == MBSF) {
12450:     label = MBSF;
12451:   }
12452:   else if(agemodelling_depth_type == MCD) {
12453:     label = MCD;
12454:   }
12455:   else {
12456:     return;
12457:   }
12458: 
12459:   top_off_agedepth_depth = OFF;
12460:   maxmeter = maxagedepdepth;
12461:   depticlen = 10.0;
12462:   annot = 5;
12463:   top_off_agedepth_depth = OFF;
12464:   botoff = SPACE;
12465: 
12466:   /* get the axis scales and such
12467:   */
12468:   AgeDepthPlotValues((int)win_height, &maxmeter, top_meter_agedepth, &unitinc, top_off_agedepth_depth, botoff, &left,
12469:                        &ticpixlen, depticlen, &pixpermeter);  
12470: 
12471: /*test
12472: */
12473: depperpixagemodel = 1.0/pixpermeter;
12474: depperpixagemodel = depperpixagemodel/zoom;
12475: left = left * zoom;
12476: ticpixlen = ticpixlen * zoom;
12477: pixpermeter = pixpermeter * zoom;
12478:  
12479:   /* set color for axis and labels
12480:   */
12481:   XSetForeground(XtDisplay(w), gc_drawingAreaAgeDepth, fgPixel[LABEL_COLOR]);
12482:   AxisDep(w, XtDisplay(w), XtWindow(w), gc_drawingAreaAgeDepth,
12483:             maxmeter, top_off_agedepth_depth, left, ticpixlen, depticlen, unitinc, depperpixagemodel, annot, label);
12484: 
12485:   /*calc. the length of the age axis in pixels
12486:   */ 
12487:   top_off_agedepth_age = OFF;
12488:   botoff = SPACE;
12489:   axispixlen = (int)win_width - OFF - SPACE;
12490:   ticpixlen = axispixlen;
12491:   ageticlen = 1.0;
12492:   maxage = maxagedepage;
12493:   unitinc = 0.0;
12494:   ageperpix = maxagedepage/axispixlen;
12495:   annot = 1;
12496: 
12497:   AgeDepthPlotValues((int)win_width, &maxage, top_age_agedepth, &unitinc, top_off_agedepth_age, botoff, &left,
12498:                        &ticpixlen, ageticlen, &pixperage);
12499: 
12500: /*test
12501: */
12502: ageperpix = 1.0/pixperage;
12503: ageperpix = ageperpix/zoom;
12504: pixperage = pixperage * zoom;
12505: left = left * zoom;
12506: ticpixlen = ticpixlen * zoom;
12507: 
12508:   XSetForeground(XtDisplay(w), gc_drawingAreaAgeDepth, fgPixel[LABEL_COLOR]);
12509:   AxisAge(w, XtDisplay(w), XtWindow(w), gc_drawingAreaAgeDepth,
12510:             maxage, top_off_agedepth_age, left, ticpixlen, ageticlen, unitinc, ageperpix, annot);
12511: 
12512:   /* draw the datums. use their codes as symbols
12513:   */
12514:   for(i=0; i<strat_file_cnt; ++i){
12515:     if(agedepth_use_type[i] == YES) {
12516:       if(strat[i]->type == PALEOMAG) {
12517:         XSetForeground(XtDisplay(w), gc_drawingAreaAgeDepth, fgPixel[PALEOMAG_COLOR]);
12518:       }  
12519:       else if(strat[i]->type == DIATOMS){
12520:         XSetForeground(XtDisplay(w), gc_drawingAreaAgeDepth, fgPixel[DIATOM_COLOR]);
12521:       }  
12522:       else if(strat[i]->type == RADIOLARIA){
12523:         XSetForeground(XtDisplay(w), gc_drawingAreaAgeDepth, fgPixel[RAD_COLOR]);
12524:       }  
12525:       else if(strat[i]->type == FORAMINIFERA){
12526:         XSetForeground(XtDisplay(w), gc_drawingAreaAgeDepth, fgPixel[FORAM_COLOR]);
12527:       }  
12528:       else if(strat[i]->type == NANNOFOSSILS){
12529:         XSetForeground(XtDisplay(w), gc_drawingAreaAgeDepth, fgPixel[NANNO_COLOR]);
12530:       }  
12531: 
12532:       for(j=0; j<strat[i]->data_cnt; ++j){
12533: 
12534:         if(strat[i]->data[j].hole_is_in_dataset == YES &&
12535:            (strat[i]->data[j].top.in_affine == YES || strat[i]->data[j].bot.in_affine == YES)) {
12536:           sx = (strat[i]->data[j].top_age - top_age_agedepth)/ageperpix + top_off_agedepth_age;
12537:           sdx = (strat[i]->data[j].bot_age - top_age_agedepth)/ageperpix + top_off_agedepth_age;
12538:           if(agemodelling_depth_type == MBSF) {
12539:             sy = (strat[i]->data[j].top.sb_depth - top_meter_agedepth)/depperpixagemodel + top_off_agedepth_depth;
12540:             sdy = (strat[i]->data[j].bot.sb_depth - top_meter_agedepth)/depperpixagemodel + top_off_agedepth_depth;
12541:           }
12542:           else if(agemodelling_depth_type == MCD) {
12543:             sy = (strat[i]->data[j].top.sb_depth + strat[i]->data[j].top.offset - top_meter_agedepth)/depperpixagemodel + top_off_agedepth_depth;
12544:             sdy = (strat[i]->data[j].bot.sb_depth + strat[i]->data[j].bot.offset - top_meter_agedepth)/depperpixagemodel + top_off_agedepth_depth;
12545:           }
12546: 
12547:           if((sy > (int)win_height) || (sx > (int)win_width) || 
12548:              (sy < 0  && sdy < 0) || (sx < 0 && sdx < 0)){
12549:             strat[i]->data[j].x_pix_loc_agedepth = -100;
12550:             strat[i]->data[j].y_pix_loc_agedepth = -100;
12551:           }
12552:           else {
12553:             gcValues.line_width = 2;
12554:             XChangeGC(XtDisplay(w), gc_drawingAreaAgeDepth, GCLineWidth, &gcValues);
12555:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaAgeDepth,
12556:                           sx, sy, sdx, sy);
12557:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaAgeDepth,
12558:                         sx, sdy, sdx, sdy);
12559:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaAgeDepth,
12560:                           sx + (sdx - sx), sy, sx + (sdx - sx), sdy);
12561:             strat[i]->data[j].x_pix_loc_agedepth = sx - 5;
12562:             strat[i]->data[j].y_pix_loc_agedepth = sy - 5;
12563:             gcValues.line_width = 0;
12564:             XChangeGC(XtDisplay(w), gc_drawingAreaAgeDepth, GCLineWidth, &gcValues);
12565:             (void)sprintf(s, "%s", strat[i]->data[j].code);
12566:             XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaAgeDepth, sx-5, sy-5, s, (int)strlen(s));
12567:           }
12568:         }
12569:         else {
12570:           strat[i]->data[j].x_pix_loc_agedepth = -100;
12571:           strat[i]->data[j].y_pix_loc_agedepth = -100;
12572:         }
12573:       }
12574:     }
12575:     else {
12576:       for(j=0; j<strat[i]->data_cnt; ++j){
12577:         strat[i]->data[j].x_pix_loc_agedepth = -100;
12578:         strat[i]->data[j].y_pix_loc_agedepth = -100;
12579:       }
12580:     }
12581:   }
12582: 
12583:   if(agemodel_cnt > 1 && are_agemodelling == YES) {
12584:     XSetForeground(XtDisplay(w), gc_drawingAreaAgeDepth, fgPixel[AGEDEPLINE_COLOR]);
12585:     for(i=0; i<agemodel_cnt-1; ++i) {
12586:       if(agemodelling_depth_type == MBSF) {
12587:         sy = (agemodel[i].avembsf - top_meter_agedepth)/depperpixagemodel + top_off_agedepth_depth;
12588:         sdy = (agemodel[i+1].avembsf - top_meter_agedepth)/depperpixagemodel + top_off_agedepth_depth;
12589:       }
12590:       else if(agemodelling_depth_type == MCD) {
12591:         sy = (agemodel[i].avemcd - top_meter_agedepth)/depperpixagemodel + top_off_agedepth_depth;
12592:         sdy = (agemodel[i+1].avemcd - top_meter_agedepth)/depperpixagemodel + top_off_agedepth_depth;
12593:       }
12594:       sx = (agemodel[i].aveage - top_age_agedepth)/ageperpix + top_off_agedepth_age;
12595:       sdx = (agemodel[i+1].aveage - top_age_agedepth)/ageperpix + top_off_agedepth_age;
12596:       XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaAgeDepth, sx, sy, sdx, sdy);
12597:     }
12598:   }
12599: 
12600:   if(agemodel_cnt >= 1 && are_agemodelling == YES) {
12601:     XSetForeground(XtDisplay(w), gc_drawingAreaAgeDepth, fgPixel[AGEDEPHANDPICK_COLOR]);
12602:     for(i=0; i<agemodel_cnt; ++i) {
12603:       if(agemodelling_depth_type == MBSF) {
12604:         sy = (agemodel[i].avembsf - top_meter_agedepth)/depperpixagemodel + top_off_agedepth_depth;
12605:       }
12606:       else if(agemodelling_depth_type == MCD) {
12607:         sy = (agemodel[i].avemcd - top_meter_agedepth)/depperpixagemodel + top_off_agedepth_depth;
12608:       }
12609:       sx = (agemodel[i].aveage - top_age_agedepth)/ageperpix + top_off_agedepth_age;
12610:       agemodel[i].x_pix_loc_agedepth = sx;
12611:       agemodel[i].y_pix_loc_agedepth = sy;
12612:       if(strcmp(agemodel[i].code, "X") == 0) {
12613:         (void)sprintf(s, "X");
12614:         XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaAgeDepth, sx-5, sy, s, (int)strlen(s));
12615:       }
12616:       else if(strcmp(agemodel[i].code, "T") == 0) {
12617: /*
12618:         (void)sprintf(s, "T");
12619:         XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaAgeDepth, sx-5, sy, s, (int)strlen(s));
12620: */
12621:       }
12622:       XFillArc(XtDisplay(drawingAreaAgeDepth), XtWindow(drawingAreaAgeDepth),
12623:                            gc_drawingAreaAgeDepth,
12624:                            sx-(POINTSIZE/2), sy-(POINTSIZE/2),
12625:                            POINTSIZE, POINTSIZE, 0, 360*64);
12626:     }
12627:   }
12628: 
12629:   (void)sprintf(s, "");
12630: }
12631: 
12632: /* ARGSUSED */
12633: void
12634: AgeDepthStratListMultSelect(w, client, call)
12635: Widget w;
12636: XtPointer client;
12637: XtPointer call;
12638: {
12639:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12640: 
12641:   int i, j, count, *position;
12642:   Boolean XmListGetSelectedPos();
12643: 
12644:   if(!XmListGetSelectedPos(listAgeDepthStrat, &position, &count)) {
12645:     return;
12646:   }
12647:   
12648:   if(count > 0) {
12649:     for(j=0; j<strat_file_cnt; ++j) {
12650:       agedepth_use_type[j] = NO;
12651:       for(i=0; i<count; ++i) {
12652:         if(j == position[i]-1) {
12653:           agedepth_use_type[j] = YES;
12654:         }
12655:       }
12656:     }
12657:   }
12658:   XtFree((char *)position);
12659: 
12660:   if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
12661:       DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
12662:   }
12663: }
12664: 
12665: /* ARGSUSED */
12666: void
12667: AgeDepthListMultSelect(w, client, call)
12668: Widget w;
12669: XtPointer client;
12670: XtPointer call;
12671: {
12672:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12673: }
12674: 
12675: /* ARGSUSED */
12676: void
12677: AgeDepthConstructAgeModel(w, client, call)
12678: Widget w;
12679: XtPointer client;
12680: XtPointer call;
12681: {
12682:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12683: 
12684:   int i;
12685:   char string[200];
12686:   XmString xmstring;
12687:   void PlotSpliceVsAge(), DrawDrawingAreaAgeDepth();
12688: 
12689:   if(have_strat == DONT) {
12690:     return;
12691:   }
12692: 
12693:   XtVaSetValues(XtParent(formAgeDepth), XmNwidth, 990, NULL);
12694:   XtManageChild(formConstructAgeModel);
12695:   are_agemodelling = YES;
12696:   top_age_splicetoage = 0.0;
12697:   lastagescaleval = 0;
12698: 
12699:   /* set the age and depth text fields to 0.0, 0.0
12700:   */
12701:   (void)sprintf(string, "0.0");
12702:   XtVaSetValues(textFieldAgeDepthHandPickDepth, XmNvalue, string, NULL);
12703:   XtVaSetValues(textFieldAgeDepthHandPickAge, XmNvalue, string, NULL);
12704: 
12705:   /* put a hand pick of 0.0, 0.0 in age model and list
12706:   */
12707:   if(agemodel_cnt < 1) {
12708:     agemodel_cnt = 1;
12709:     agemodel[0].avembsf = 0.0;
12710:     agemodel[0].avemcd = 0.0;
12711:     agemodel[0].aveage = 0.0;
12712:     agemodel[0].type = HANDPICK;
12713:     (void)sprintf(agemodel[0].name, "handpick");
12714:     (void)sprintf(agemodel[0].code, "X");
12715:     (void)sprintf(string, "%7.2f  %7.2f   %7.3f    %s %s", agemodel[0].avembsf, agemodel[0].avemcd,
12716:                 agemodel[0].aveage, agemodel[0].name, agemodel[0].code);
12717:     xmstring = XmStringCreateSimple(string);
12718:     XmListAddItemUnselected(listConstructAgeModel, xmstring, 0);
12719:     XmStringFree(xmstring);
12720:     XtSetSensitive(pushButtonPlotSpliceVsAge, False);
12721:     XtSetSensitive(pushButtonSaveAgeMode, False);
12722:     XtSetSensitive(pushButtonSaveSpliceToAge, False);
12723:     XtSetSensitive(pushButtonOpenAgeSignal, False);
12724:     XtSetSensitive(pushButtonOpenTimeSeries, False);
12725:     have_splicetoage = DONT;
12726:   }
12727:   else if(agemodel_cnt == 1) {
12728:     XtSetSensitive(pushButtonPlotSpliceVsAge, False);
12729:     XtSetSensitive(pushButtonSaveAgeMode, False);
12730:     XtSetSensitive(pushButtonSaveSpliceToAge, False);
12731:     XtSetSensitive(pushButtonOpenAgeSignal, False);
12732:     XtSetSensitive(pushButtonOpenTimeSeries, False);
12733:     have_splicetoage = DONT;
12734:   }
12735:   else {
12736:     XtSetSensitive(pushButtonSaveAgeMode, True);
12737:     if(have_splice == DONT) {
12738:       XtSetSensitive(pushButtonPlotSpliceVsAge, False);
12739:       XtSetSensitive(pushButtonSaveSpliceToAge, False);
12740:       XtSetSensitive(pushButtonOpenAgeSignal, False);
12741:       XtSetSensitive(pushButtonOpenTimeSeries, False);
12742:     }
12743:     else if(have_splice == DO) {
12744:       XtSetSensitive(pushButtonPlotSpliceVsAge, True);
12745:       XtSetSensitive(pushButtonSaveSpliceToAge, True);
12746:       if(have_time_series == DONT) {
12747:         XtSetSensitive(pushButtonOpenAgeSignal, True);
12748:         XtSetSensitive(pushButtonOpenTimeSeries, True);
12749:       }
12750:       else if(have_time_series == DO) {
12751:         XtSetSensitive(pushButtonOpenAgeSignal, False);
12752:         XtSetSensitive(pushButtonOpenTimeSeries, False);
12753:       }
12754:       have_splicetoage = DO;
12755:     }
12756:   } 
12757: 
12758:   if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
12759:     DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
12760:   }
12761:   PlotSpliceVsAge(NO);
12762: }
12763: 
12764: /* ARGSUSED */
12765: void
12766: ConstructAgeModelDismiss(w, client, call)
12767: Widget w;
12768: XtPointer client;
12769: XtPointer call;
12770: {
12771:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12772: 
12773:   void DrawDrawingAreaAgeDepth();
12774: 
12775:   XtUnmanageChild(formConstructAgeModel);
12776:   XtVaSetValues(XtParent(formAgeDepth), XmNwidth, 600, NULL);
12777:   are_agemodelling = NO;
12778: 
12779:   if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
12780:       DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
12781:   }
12782: }
12783: 
12784: /* ARGSUSED */
12785: void
12786: RemoveSelectDatum(w, client, call)
12787: Widget w;
12788: XtPointer client;
12789: XtPointer call;
12790: {
12791:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12792: 
12793:   int     i, j, count, *position;
12794:   char    *string;
12795:   XmString  xmstring;
12796:   Boolean XmListGetSelectedPos();
12797:   void    XmListDeletePos(), RecalcDatumAges(), DrawDrawingAreaAgeDepth(), PlotSpliceVsAge();
12798: 
12799:   if(!XmListGetSelectedPos(listConstructAgeModel, &position, &count)) {
12800:     return;
12801:   }
12802:   if(count == agemodel_cnt) {
12803:     XmListDeleteAllItems(listConstructAgeModel);
12804:     agemodel_cnt = 0;
12805:     have_splicetoage = DONT;
12806:     did_agemodel = NO;
12807:     saved_agemodel = NO;
12808:     XtSetSensitive(pushButtonPlotSpliceVsAge, False);
12809:     XtSetSensitive(pushButtonSaveAgeMode, False);
12810:     XtSetSensitive(pushButtonSaveSpliceToAge, False);
12811:     XtSetSensitive(pushButtonRemoveSelectDatum, False);
12812:     XtSetSensitive(pushButtonAgeDepthClearAgeMododelList, False);
12813:     XtSetSensitive(pushButtonOpenAgeSignal, False);
12814:     XtSetSensitive(pushButtonOpenTimeSeries, False);
12815:   }
12816:   else if(count > 0) {
12817:     for(i=count-1; i>=0; --i) {
12818:       for(j=position[i]-1; j<agemodel_cnt-1; ++j) {
12819:         if(strcmp(agemodel[j+1].code, "X") == 0) {
12820:           agemodel[j].aveage = agemodel[j+1].aveage;
12821:           agemodel[j].avembsf = agemodel[j+1].avembsf;
12822:           agemodel[j].avemcd = agemodel[j+1].avemcd;
12823:           (void)sprintf(agemodel[j].code, "X");
12824:         }
12825:         else {
12826:           agemodel[j] = agemodel[j+1];
12827:         }
12828:       }
12829:       --agemodel_cnt;
12830:     }
12831:     if(agemodel_cnt == 1) {
12832:       XtSetSensitive(pushButtonPlotSpliceVsAge, False);
12833:       XtSetSensitive(pushButtonSaveAgeMode, False);
12834:       XtSetSensitive(pushButtonSaveSpliceToAge, False);
12835:       XtSetSensitive(pushButtonOpenAgeSignal, False);
12836:       XtSetSensitive(pushButtonOpenTimeSeries, False);
12837:       have_splicetoage = DONT;
12838:       did_agemodel = NO;
12839:       saved_agemodel = NO;
12840:     }
12841:     else {
12842:       XtSetSensitive(pushButtonPlotSpliceVsAge, True);
12843:       XtSetSensitive(pushButtonSaveAgeMode, True);
12844:       XtSetSensitive(pushButtonSaveSpliceToAge, True);
12845:       if(have_time_series == DONT) {
12846:         XtSetSensitive(pushButtonOpenAgeSignal, True);
12847:         XtSetSensitive(pushButtonOpenTimeSeries, True);
12848:       }
12849:       else if(have_time_series == DO) {
12850:         XtSetSensitive(pushButtonOpenAgeSignal, False);
12851:         XtSetSensitive(pushButtonOpenTimeSeries, False);
12852:       }
12853:       have_splicetoage = DO;
12854:     }
12855:     RecalcDatumAges();
12856:     XmListDeleteAllItems(listConstructAgeModel);
12857:     for(i=0; i<agemodel_cnt; ++i) {
12858:       if((string=(char*)calloc((int)strlen(agemodel[i].name)+(int)strlen(agemodel[i].code)+100,CHAR_SIZE))==NULL)
12859:                         SpBadMemAlloc("SpliceToAgeAddTiedDatum");
12860:       (void)sprintf(string, "%7.2f  %7.2f   %7.3f    %s %s", agemodel[i].avembsf, agemodel[i].avemcd,
12861:                                             agemodel[i].aveage, agemodel[i].name, agemodel[i].code);
12862:       xmstring = XmStringCreateSimple(string);
12863:       XmListAddItemUnselected(listConstructAgeModel, xmstring, i + 1);
12864:       XmStringFree(xmstring);
12865:       free(string);
12866:     }
12867:   }
12868:   XtFree((char *)position);
12869: 
12870:   if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
12871:     DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
12872:   }
12873:   PlotSpliceVsAge(NO);
12874: }
12875: 
12876: /* ARGSUSED */
12877: void
12878: AgeDepthBothmbsfAndmcd(w, client, call)
12879: Widget w;
12880: XtPointer client;
12881: XtPointer call;
12882: {
12883:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12884: }
12885: 
12886: /* ARGSUSED */
12887: void
12888: ConstructAgeModelHelp(w, client, call)
12889: Widget w;
12890: XtPointer client;
12891: XtPointer call;
12892: {
12893:   /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12894: }
12895: 
12896: /* ARGSUSED */
12897: void
12898: ClearComposite(w, client, call)
12899: {
12900:         /*SUPPRESS 594*/XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call;
12901: 
12902:   if((message.label=(char*)calloc(100,CHAR_SIZE))==NULL)
12903:                         SpBadMemAlloc("Sp");
12904:   (void)sprintf(message.label,"This Option is incomplete.");
12905:   SpManageMessage(message);
12906: }
12907: 
12908: void
12909: ClearStrat(w, client_data, call_data)
12910:  Widget w;
12911:  XtPointer client_data;
12912:  XtPointer call_data;
12913: {
12914:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
12915: 
12916:   if((message.label=(char*)calloc(100,CHAR_SIZE))==NULL)
12917:                         SpBadMemAlloc("Sp");
12918:   (void)sprintf(message.label,"This Option is incomplete.");
12919:   SpManageMessage(message);
12920: }
12921: 
12922: void
12923: AgeDepthClearAgeModelList(w, client_data, call_data)
12924:  Widget w;
12925:  XtPointer client_data;
12926:  XtPointer call_data;
12927: {
12928:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
12929: 
12930:   void DrawDrawingAreaAgeDepth();
12931: 
12932:   XmListDeleteAllItems(listConstructAgeModel);
12933: 
12934:   /* clear agemodel
12935:   */
12936:   agemodel_cnt = 0;
12937:   have_splicetoage = DONT;
12938:   did_agemodel = NO;
12939:   saved_agemodel = NO;
12940:   XtSetSensitive(pushButtonPlotSpliceVsAge, False);
12941:   XtSetSensitive(pushButtonSaveAgeMode, False);
12942:   XtSetSensitive(pushButtonSaveSpliceToAge, False);
12943:   XtSetSensitive(pushButtonRemoveSelectDatum, False);
12944:   XtSetSensitive(pushButtonAgeDepthClearAgeMododelList, False);
12945:   XtSetSensitive(pushButtonOpenAgeSignal, False);
12946:   XtSetSensitive(pushButtonOpenTimeSeries, False);
12947: 
12948:   if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
12949:     DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
12950:   }
12951:   if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
12952:     XClearWindow(XtDisplay(drawingAreaSpliceToAge), XtWindow(drawingAreaSpliceToAge));
12953:   }
12954: }
12955: 
12956: void
12957: AgeDepthAddHandPickToList(w, client_data, call_data)
12958:  Widget w;
12959:  XtPointer client_data;
12960:  XtPointer call_data;
12961: {
12962:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
12963: 
12964:   int i, k, found, pos, array;
12965:   char string[50];
12966:   float age, depth;
12967:   String str;
12968:   XmString xmstring;
12969:   void DrawDrawingAreaAgeDepth(), PlotSpliceVsAge();
12970: 
12971:   /* check that have not reached array limit
12972:   */
12973:   if(agemodel_cnt + 1 > MAXAGE) {
12974:     (void)sprintf(buffer, "You have exceeded the limit on the number of values in age model.");
12975:     SpManageWarningBox(buffer);
12976:     return;
12977:   }
12978: 
12979:   if(are_agemodelling == YES) {
12980: 
12981:     str = XmTextGetString(textFieldAgeDepthHandPickAge);
12982:     age = atof(str);
12983:     XtFree(str);
12984:     str = XmTextGetString(textFieldAgeDepthHandPickDepth);
12985:     depth = atof(str);
12986:     XtFree(str);
12987: 
12988:     /* check to see that this pick falls within a splice table core
12989:     */
12990:     if(age == 0.0 && depth == 0.0) {
12991:       found = 0;
12992:     }
12993:     else if(have_splice == DONT && agemodelling_depth_type == MBSF) {
12994:       (void)sprintf(buffer, "You cannot do a hand pick unless you have a splice. Because without\n");
12995:       (void)strcat(buffer, "a splice record there is no way to convert depth from mbsf to mcd.");
12996:       SpManageWarningBox(buffer);
12997:       return;
12998:     }
12999:     else if(have_splice == DONT && agemodelling_depth_type == MCD) {
13000:       (void)sprintf(buffer, "You cannot do a hand pick unless you have a splice. Because without\n");
13001:       (void)strcat(buffer, "a splice record there is no way to convert depth from mcd to mbsf.");
13002:       SpManageWarningBox(buffer);
13003:       return;
13004:     }
13005:     else {
13006:       found = -1;
13007:       k=0;
13008:       while(k<splicertable.data_cnt-1) {
13009:         if(agemodelling_depth_type == MBSF) {
13010:           if(depth >= splicertable.data[k].mbsf && depth <= splicertable.data[k+1].mbsf) {
13011:             found = k;
13012:             break;
13013:           }
13014:         }
13015:         else if(agemodelling_depth_type == MCD) {
13016:           if(depth >= splicertable.data[k].mcd && depth <= splicertable.data[k+1].mcd) {
13017:             found = k;
13018:             break;
13019:           }
13020:         }
13021:         k = k+2;
13022:       }
13023:       if(found == -1) {
13024:         (void)sprintf(buffer, "The hand picked date does not fall within the splice. It must Because without\n");
13025:         (void)strcat(buffer, "a splice record there is no way to convert depth between mcd and mbsf.");
13026:         SpManageWarningBox(buffer);
13027:         return;
13028:       }
13029:     }
13030: 
13031:     /* put this hand picked datum in age model struct in order by both age and depth
13032:        there must not be conflicts with age and depth
13033:     */
13034:     if(agemodel_cnt >= 1) {
13035:       pos = -1;
13036:       for(k=0; k<agemodel_cnt; ++k) {
13037:         if(agemodelling_depth_type == MBSF) {
13038:           if(k == 0 && age < agemodel[k].aveage && depth < agemodel[k].avembsf) {
13039:             pos = k;
13040:           }
13041:           else if(k == agemodel_cnt-1 &&
13042:             age > agemodel[k].aveage && depth > agemodel[k].avembsf) {
13043:             pos = k + 1;
13044:           }
13045:           else if(k < agemodel_cnt-1 &&
13046:             age > agemodel[k].aveage && depth > agemodel[k].avembsf &&
13047:             age < agemodel[k+1].aveage && depth < agemodel[k+1].avembsf) {
13048:             pos = k + 1;
13049:           }
13050:         }
13051:         else if(agemodelling_depth_type == MCD) {
13052:           if(k == 0 && age < agemodel[k].aveage && depth < agemodel[k].avemcd) {
13053:             pos = k;
13054:           }
13055:           else if(k == agemodel_cnt-1 &&
13056:             age > agemodel[k].aveage && depth > agemodel[k].avemcd) {
13057:             pos = k + 1;
13058:           }
13059:           else if(k < agemodel_cnt-1 &&
13060:             age > agemodel[k].aveage && depth > agemodel[k].avemcd &&
13061:             age < agemodel[k+1].aveage && depth < agemodel[k+1].avemcd) {
13062:             pos = k + 1;
13063:           }
13064:         }
13065:       }
13066:       if(pos == -1) {
13067:         (void)sprintf(buffer, "The age datum picked conflicts with one's already in the list.");
13068:         SpManageWarningBox(buffer);
13069:         return;
13070:       }
13071:       else {
13072:         ++agemodel_cnt;
13073:         if(pos == agemodel_cnt-1) {
13074:           array = agemodel_cnt-1;
13075:         }
13076:         else {
13077:           for(k=agemodel_cnt-1; k>pos; --k) {
13078:             agemodel[k] = agemodel[k-1];
13079:           }
13080:           array = pos;
13081:         }
13082:       }
13083:     }
13084:     else if(agemodel_cnt == 0) {
13085:       agemodel_cnt = 1;
13086:       array = 0;
13087:     }
13088: 
13089:     agemodel[array].aveage = age;
13090:     agemodel[array].type = HANDPICK;
13091:     (void)sprintf(agemodel[array].code, "X");
13092:     (void)sprintf(agemodel[array].name, "handpick");
13093: 
13094:     if(age == 0.0 && depth == 0.0) {
13095:       agemodel[array].avembsf = 0.0;
13096:       agemodel[array].avemcd = 0.0;
13097:     }
13098:     else if(agemodelling_depth_type == MBSF) {
13099:       agemodel[array].avembsf = depth;
13100:       agemodel[array].avemcd = depth + (splicertable.data[found].mcd - splicertable.data[found].mbsf);
13101:     }
13102:     else if(agemodelling_depth_type == MCD) {
13103:       agemodel[array].avemcd = depth;
13104:       agemodel[array].avembsf = depth + (splicertable.data[found].mbsf - splicertable.data[found].mcd);
13105:     }
13106: 
13107: 
13108:     (void)sprintf(string, "%7.2f  %7.2f   %7.3f    handpick", agemodel[array].avembsf, agemodel[array].avemcd, agemodel[array].aveage);
13109:     xmstring = XmStringCreateSimple(string);
13110:     XmListAddItemUnselected(listConstructAgeModel, xmstring, pos + 1);
13111:     XmStringFree(xmstring);
13112:   }
13113: 
13114:   if(agemodel_cnt > 1) {
13115:     XtSetSensitive(pushButtonSaveAgeMode, True);
13116:     XtSetSensitive(pushButtonRemoveSelectDatum, True);
13117:     XtSetSensitive(pushButtonAgeDepthClearAgeMododelList, True);
13118:     if(have_splice == DO) {
13119:       XtSetSensitive(pushButtonPlotSpliceVsAge, True);
13120:       XtSetSensitive(pushButtonSaveSpliceToAge, True);
13121:       if(have_time_series == DONT) {
13122:         XtSetSensitive(pushButtonOpenAgeSignal, True);
13123:         XtSetSensitive(pushButtonOpenTimeSeries, True);
13124:       }
13125:       else if(have_time_series == DO) {
13126:         XtSetSensitive(pushButtonOpenAgeSignal, False);
13127:         XtSetSensitive(pushButtonOpenTimeSeries, False);
13128:       }
13129:       have_splicetoage = DO;
13130:     }
13131:     else {
13132:       XtSetSensitive(pushButtonPlotSpliceVsAge, False);
13133:       XtSetSensitive(pushButtonSaveSpliceToAge, False);
13134:       XtSetSensitive(pushButtonOpenAgeSignal, False);
13135:       XtSetSensitive(pushButtonOpenTimeSeries, False);
13136:       have_splicetoage = DONT;
13137:     }
13138:     did_agemodel = YES;
13139:     saved_agemodel = NO;
13140:   }
13141:   else {
13142:     XtSetSensitive(pushButtonPlotSpliceVsAge, False);
13143:     XtSetSensitive(pushButtonSaveAgeMode, False);
13144:     XtSetSensitive(pushButtonSaveSpliceToAge, False);
13145:     XtSetSensitive(pushButtonRemoveSelectDatum, False);
13146:     XtSetSensitive(pushButtonAgeDepthClearAgeMododelList, False);
13147:     XtSetSensitive(pushButtonOpenAgeSignal, False);
13148:     XtSetSensitive(pushButtonOpenTimeSeries, False);
13149:     have_splicetoage = DONT;
13150:   }
13151:   if(agemodel_cnt > 0) {
13152:     XtSetSensitive(pushButtonRemoveSelectDatum, True);
13153:     XtSetSensitive(pushButtonAgeDepthClearAgeMododelList, True);
13154:   }
13155:   else {
13156:     XtSetSensitive(pushButtonRemoveSelectDatum, False);
13157:     XtSetSensitive(pushButtonAgeDepthClearAgeMododelList, False);
13158:   }
13159: 
13160: 
13161:   if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
13162:     DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
13163:   }
13164:   if(have_splicetoage == DO) {
13165:     PlotSpliceVsAge(NO);
13166:   }
13167: 
13168:   (void)sprintf(string, "");
13169: }
13170: 
13171: void
13172: ScaleAgeDepthDrag(w, client_data, call_data)
13173:  Widget w;
13174:  XtPointer client_data;
13175:  XtPointer call_data;
13176: {
13177:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
13178: }
13179: 
13180: void
13181: ScaleAgeDepthChange(w, client_data, call_data)
13182:  Widget w;
13183:  XtPointer client_data;
13184:  XtPointer call_data;
13185: {
13186:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
13187: }
13188: 
13189: void
13190: AgeDepthReplot(w, client_data, call_data)
13191:  Widget w;
13192:  XtPointer client_data;
13193:  XtPointer call_data;
13194: {
13195:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
13196: }
13197: 
13198: void
13199: DrawDrawingAreaAgeModel(w, client_data, call_data)
13200:  Widget w;
13201:  XtPointer client_data;
13202:  XtPointer call_data;
13203: {
13204:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
13205: }
13206: 
13207: void
13208: ScaleAgeDepthAgeDrag(w, client_data, call_data)
13209:  Widget w;
13210:  XtPointer client_data;
13211:  XtPointer call_data;
13212: {
13213:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
13214: 
13215:   void DrawDrawingAreaAgeDepth();
13216: 
13217:   if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
13218:      DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
13219:   }
13220: }
13221: 
13222: void
13223: AgeDepthTextZoomActivate(w, client_data, call_data)
13224:  Widget w;
13225:  XtPointer client_data;
13226:  XtPointer call_data;
13227: {
13228:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
13229: 
13230:   char string[20];
13231:   int zoomfactor;
13232:   float zfactor;
13233:   String str;
13234: 
13235:   str = XmTextGetString(textAgeDepthZoomFactor);
13236:   zfactor = atof(str);
13237:   XtFree(str);
13238: 
13239:   if(zfactor < 1.0) {
13240:     zoomfactor = 1;
13241:     (void)sprintf(string, "%d", zoomfactor);
13242:     XtVaSetValues(textAgeDepthZoomFactor, XmNvalue, string, NULL);
13243:     (void)sprintf(string, "");
13244:   }
13245: 
13246:   if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
13247:     DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
13248:   }
13249: }
13250: 
13251: void
13252: AgeDepthZoomDown(w, client_data, call_data)
13253:  Widget w;
13254:  XtPointer client_data;
13255:  XtPointer call_data;
13256: {
13257:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
13258: 
13259:   char string[20];
13260:   int zoomfactor;
13261:   String str;
13262:   void DrawDrawingAreaAgeDepth();
13263: 
13264:   str = XmTextGetString(textAgeDepthZoomFactor);
13265:   zoomfactor = atoi(str);
13266:   XtFree(str);
13267: 
13268:   if(zoomfactor > 1) {
13269:     --zoomfactor;
13270:   }
13271:   (void)sprintf(string, "%d", zoomfactor);
13272:   XtVaSetValues(textAgeDepthZoomFactor, XmNvalue, string, NULL);
13273:   (void)sprintf(string, "");
13274: 
13275:   if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
13276:     DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
13277:   }
13278: }
13279: 
13280: void
13281: DepthOffsetArrowUp(w, client_data, call_data)
13282:  Widget w;
13283:  XtPointer client_data;
13284:  XtPointer call_data;
13285: {
13286:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
13287: 
13288:   char string[20];
13289:   float depthchange;
13290:   String str;
13291:   void DrawDrawingAreaDepthOffset();
13292: 
13293:   str = XmTextGetString(textDepthChange);
13294:   depthchange = atof(str);
13295:   XtFree(str);
13296: 
13297:   if(depthchange <= 99.9) {
13298:     depthchange = depthchange + 1.0;
13299:   }
13300:   (void)sprintf(string, "%.2f", depthchange);
13301:   XtVaSetValues(textDepthChange, XmNvalue, string, NULL);
13302:   (void)sprintf(string, "");
13303: 
13304:   if(XtIsManaged(XtParent(drawingAreaDepthOffset))) {
13305:     DrawDrawingAreaDepthOffset(drawingAreaDepthOffset, (XtPointer)NULL, (XtPointer)NULL);
13306:   }
13307: }
13308: 
13309: void
13310: ScaleAgeDepthDepthChange(w, client_data, call_data)
13311:  Widget w;
13312:  XtPointer client_data;
13313:  XtPointer call_data;
13314: {
13315:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
13316: 
13317:   void DrawDrawingAreaAgeDepth();
13318: 
13319:   if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
13320:      DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
13321:   }
13322: }
13323: 
13324: void
13325: ScaleAgeDepthDepthDrag(w, client_data, call_data)
13326:  Widget w;
13327:  XtPointer client_data;
13328:  XtPointer call_data;
13329: {
13330:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
13331: 
13332:   void DrawDrawingAreaAgeDepth();
13333: 
13334:   if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
13335:      DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
13336:   }
13337: }
13338: 
13339: void
13340: ScaleAgeDepthAgeChange(w, client_data, call_data)
13341:  Widget w;
13342:  XtPointer client_data;
13343:  XtPointer call_data;
13344: {
13345:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
13346: 
13347:   void DrawDrawingAreaAgeDepth();
13348: 
13349:   if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
13350:      DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
13351:   }
13352: }
13353: 
13354: void
13355: AgeDepthZoomUp(w, client_data, call_data)
13356:  Widget w;
13357:  XtPointer client_data;
13358:  XtPointer call_data;
13359: {
13360:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
13361: 
13362:   char string[20];
13363:   int zoomfactor;
13364:   String str;
13365:   void DrawDrawingAreaAgeDepth();
13366: 
13367:   str = XmTextGetString(textAgeDepthZoomFactor);
13368:   zoomfactor = atoi(str);
13369:   XtFree(str);
13370: 
13371:   if(zoomfactor < 10) {
13372:     ++zoomfactor;
13373:   }
13374:   (void)sprintf(string, "%d", zoomfactor);
13375:   XtVaSetValues(textAgeDepthZoomFactor, XmNvalue, string, NULL);
13376:   (void)sprintf(string, "");
13377: 
13378:   if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
13379:     DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
13380:   }
13381: }
13382: 
13383: void
13384: DepthOffsetArrowDown(w, client_data, call_data)
13385:  Widget w;
13386:  XtPointer client_data;
13387:  XtPointer call_data;
13388: {
13389:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
13390: 
13391:   char string[20];
13392:   float depthchange;
13393:   String str;
13394:   void DrawDrawingAreaDepthOffset();
13395: 
13396:   str = XmTextGetString(textDepthChange);
13397:   depthchange = atof(str);
13398:   XtFree(str);
13399: 
13400:   if(depthchange >= 1.0) {
13401:     depthchange = depthchange - 1.0;
13402:   }
13403:   (void)sprintf(string, "%.2f", depthchange);
13404:   XtVaSetValues(textDepthChange, XmNvalue, string, NULL);
13405:   (void)sprintf(string, "");
13406: 
13407:   if(XtIsManaged(XtParent(drawingAreaDepthOffset))) {
13408:     DrawDrawingAreaDepthOffset(drawingAreaDepthOffset, (XtPointer)NULL, (XtPointer)NULL);
13409:   }
13410: }
13411: 
13412: void
13413: ColorAgeDepthHandPick(w, client_data, call_data)
13414:  Widget w;
13415:  XtPointer client_data;
13416:  XtPointer call_data;
13417: {
13418:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
13419: 
13420:   int item_count;
13421:   char *rgbcolor;
13422:   XmString *pcolor;
13423:   Pixel sampPixel;
13424:   int GetColorPixelValue();
13425: 
13426:   /* get the selected color name from the list
13427:   */
13428:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count,
13429:                 XmNselectedItems,&pcolor, NULL);
13430:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor);
13431: 
13432:   /* and change the  color of the core label button
13433:   */
13434:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
13435:   XtVaSetValues(pushButtonColorAgeDepthHandPick, XmNbackground, sampPixel, NULL);
13436: 
13437:   XtVaSetValues(pushButtonColorAgeDepthHandPick, XmNlabelString, pcolor[0], NULL);
13438:   (void)sprintf(tempcolor[AGEDEPHANDPICK_COLOR], "%s", rgbcolor);
13439:   tempfgPixel[AGEDEPHANDPICK_COLOR] = sampPixel;
13440:   XtFree(rgbcolor);
13441: }
13442: 
13443: void
13444: ColorAgeDepthLine(w, client_data, call_data)
13445:  Widget w;
13446:  XtPointer client_data;
13447:  XtPointer call_data;
13448: {
13449:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
13450: 
13451:   int item_count;
13452:   char *rgbcolor;
13453:   XmString *pcolor;
13454:   Pixel sampPixel;
13455:   int GetColorPixelValue();
13456: 
13457:   /* get the selected color name from the list
13458:   */
13459:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count,
13460:                 XmNselectedItems,&pcolor, NULL);
13461:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor);
13462: 
13463:   /* and change the  color of the core label button
13464:   */
13465:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
13466:   XtVaSetValues(pushButtonColorAgeDepthLine, XmNbackground, sampPixel, NULL);
13467: 
13468:   XtVaSetValues(pushButtonColorAgeDepthLine, XmNlabelString, pcolor[0], NULL);
13469:   (void)sprintf(tempcolor[AGEDEPLINE_COLOR], "%s", rgbcolor);
13470:   tempfgPixel[AGEDEPLINE_COLOR] = sampPixel;
13471:   XtFree(rgbcolor);
13472: }
13473: 
13474: void
13475: SaveAgeModel(w, client_data, call_data)
13476:  Widget w;
13477:  XtPointer client_data;
13478:  XtPointer call_data;
13479: {
13480:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
13481: 
13482:   char *str, *path;
13483:   int  len;
13484:   XmString xmstring;
13485: 
13486:   void SpUpdateFileSelection();
13487: 
13488:   XtManageChild(formFileSelection);
13489:   XtPopup(XtParent(formFileSelection),XtGrabNone);
13490:   xmstring=XmCvtCTToXmString("Save");
13491:   XtVaSetValues(pushButtonFileSelectionOK,XmNlabelString,xmstring,NULL);
13492:   XmStringFree(xmstring);
13493: 
13494:   fileselection = SAVEAGEMODEL;
13495: 
13496:   XtVaSetValues(xmDialogShellFileSelection, XmNtitle, "Save Age Model", NULL);
13497:   XtVaSetValues(textFileSelectionSelected, XmNvalue, "", NULL);
13498: 
13499:   if((path=(char*)calloc((int)strlen(outagemodel_dirname)+1000,CHAR_SIZE))==NULL)
13500:                                 SpBadMemAlloc("OpenSplicerTable");
13501:   (void)sprintf(path, "%s", outagemodel_dirname);
13502: 
13503:   len = (int)strlen(path);
13504:   if(strcmp(&path[len-1], "/") == 0) {
13505:     *strrchr(path,'/')= '\0';
13506:   }
13507: 
13508:   if((str=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
13509:     SpBadMemAlloc("OpenSplicerTable");
13510:   }
13511:   (void)sprintf(str,"%s/*", path);
13512:   XtVaSetValues(textFileSelectionFilter, XmNvalue, str, NULL);
13513:   free(str);
13514: 
13515:   XtVaSetValues(textFileSelectionSelected, XmNvalue, outagemodel_filename, NULL);
13516: 
13517:   SpUpdateFileSelection(FILE_FILTER, SAVEAGEMODEL, path);
13518:   (void)sprintf(preview_input_path,"%s",path);
13519: 
13520:   free(path);
13521:   if(path)
13522:     path = NULL;
13523: }
13524: 
13525: void
13526: ScaleSpliceToAgeChange(w, client_data, call_data)
13527:  Widget w;
13528:  XtPointer client_data;
13529:  XtPointer call_data;
13530: {
13531:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
13532: 
13533:   void DrawDrawingAreaSpliceToAge(); 
13534: 
13535:   if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
13536:     DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
13537:   }
13538: }
13539: 
13540: void
13541: DrawDrawingAreaSpliceToAge(w, client_data, call_data)
13542:  Widget w;
13543:  XtPointer client_data;
13544:  XtPointer call_data;
13545: {
13546:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
13547: 
13548:   int i, j, k, kk, sm, sx, sy, sdx, sdy, xoff, yoff, pixperspliceage, scaleval, scalemax, 
13549:       dummy, diff, left, ticpixlen, annot, label;
13550:   char s[10], *string;
13551:   float current_agedisplayed, maxsedrate, maxage, zoom, scaleinc, agediff, agetic, unitinc,
13552:         timeseries_age, splice_age, ageoffset, flip_adj, flip_off;
13553:   double check, fract, ip;
13554:   Dimension win_height, win_width;
13555:   String str;
13556:   XmString xmstring;
13557:   void AxisSpliceAge();
13558: 
13559:   XClearWindow(XtDisplay(w), XtWindow(w));
13560: 
13561:   XtVaGetValues(w, XmNheight, &win_height, XmNwidth, &win_width, NULL);
13562:   XmScaleGetValue(scaleSpliceToAge, &scaleval);
13563: 
13564:   scaleinc = AGESCALEBARINC;  /* increment scale bar at 1 20th of age displayed */
13565: 
13566: 
13567:   /* get the zoom factor
13568:   */
13569:   str = XmTextGetString(textSpliceToAgeZoomFactor);
13570:   zoom = atof(str);
13571:   XtFree(str);
13572:   if(zoom <= 0.0) {
13573:     zoom = 1.0;
13574:   }
13575: 
13576:   if(have_splicetoage == DONT) {
13577:     top_off_splicetoage = 0;
13578:     top_age_splicetoage = 0.0;
13579:     spliceageperpix = 1.0;
13580:     sedrateperpix = 1.0;
13581:     if(have_data == DONT) {
13582:       varperpix = 1.0;
13583:     }
13584:   }
13585:   else if(have_splicetoage == DO) {
13586: 
13587:     xoff = OFF + SPACE;
13588:     if(scaleval == 0) {
13589:       top_off_splicetoage = OFF;
13590:     }
13591:     else {
13592:       top_off_splicetoage = 0;
13593:     }
13594: 
13595:     if(spcomp.age[spcomp.numcores-1][spcomp.numpercore[spcomp.numcores-1]-1] >= agemodel[agemodel_cnt-1].aveage) {
13596:       maxage = spcomp.age[spcomp.numcores-1][spcomp.numpercore[spcomp.numcores-1]-1];
13597:     }
13598:     else {
13599:       maxage = agemodel[agemodel_cnt-1].aveage;
13600:     }
13601: 
13602:     current_agedisplayed = agedisplayed;
13603: 
13604:     agetic = 0.1;
13605:     dummy = current_agedisplayed * 10.0;
13606:     /* cannot display less than 0.1Ma at zoom fact 1
13607:     */
13608:     if(dummy < 1) {
13609:       dummy = 1;
13610:     }
13611:     current_agedisplayed = dummy/10.0;
13612:     check = ((int)win_height - top_off_splicetoage)/current_agedisplayed; 
13613:     fract = modf(check, &ip);
13614:     pixperspliceage = ip;
13615: 
13616:     pixperspliceage = pixperspliceage * zoom;
13617:     spliceageperpix = 1.0/pixperspliceage;
13618:     agetic = agetic/zoom;
13619: 
13620:     /* recalc age displayed
13621:     */
13622:     current_agedisplayed = ((int)win_height - top_off_splicetoage) * spliceageperpix;
13623: 
13624:     /* find out what the top age should be
13625:     */
13626:     if(scaleval == 0) {                       /* top age is 0.0 */
13627:       top_age_splicetoage = 0.0;
13628:       lastagescaleval = 0;
13629:     }
13630:     else if(lastagescaleval == scaleval) {    /* top age has not changed */
13631:     }
13632:     else if(lastagescaleval < scaleval) {      /* top age is deeper */
13633:       diff = scaleval - lastagescaleval;
13634:       agediff = (current_agedisplayed * scaleinc) * diff;
13635:       top_age_splicetoage = top_age_splicetoage + agediff;
13636:     }
13637:     else if(lastagescaleval > scaleval) {     /* top age is shallower */
13638:       diff = lastagescaleval - scaleval;
13639:       agediff = (current_agedisplayed * scaleinc) * diff;
13640:       top_age_splicetoage = top_age_splicetoage - agediff;
13641:     }
13642: 
13643:     scaleval = top_age_splicetoage/(current_agedisplayed*scaleinc) + 0.1;
13644:     XtVaSetValues(scaleSpliceToAge, XmNvalue, scaleval, NULL);
13645:     lastagescaleval = scaleval;
13646: 
13647:     /* find out what the scale bar max value should be
13648:     */
13649:     XtVaGetValues(scaleSpliceToAge, XmNmaximum, &scalemax, NULL);
13650:     dummy = (maxage/current_agedisplayed) * 1.0/scaleinc;
13651:     if(scalemax != dummy) {
13652:       scalemax = dummy;
13653:       XtVaSetValues(scaleSpliceToAge, XmNmaximum, scalemax, NULL);
13654:     }
13655: 
13656:     /* stuff for age axis
13657:     */
13658:     
13659:     check = top_age_splicetoage/agetic;
13660:     fract = modf(check, &ip);       /* is the top value divisable by tic or is there a remainder*/
13661: 
13662:     if(fract == 0.0) {              /*if no remainder than y axis starts at a tic*/
13663:       unitinc = top_age_splicetoage;
13664:     }
13665:     else {                          /*there is a remainder so axis does not start at a tic*/
13666:       unitinc = agetic * ip + agetic;     /*so the first tic is the next one down*/
13667:     }
13668: 
13669:     ticpixlen = pixperspliceage * agetic;
13670: 
13671:     if(unitinc == top_age_splicetoage){    /*if axis does not start at a tic calculate the distance*/
13672:       left = 0;                       /*in pixels from top of axis to first tic*/
13673:     }
13674:     else {
13675:       left = (unitinc - top_age_splicetoage) * pixperspliceage;
13676:     }
13677: 
13678:     annot = 1;
13679:     label = YES;
13680:     XSetForeground(XtDisplay(w), gc_drawingAreaSpliceToAge, fgPixel[LABEL_COLOR]);
13681:     AxisSpliceAge(w, XtDisplay(w), XtWindow(w), gc_drawingAreaSpliceToAge,
13682:             maxage, top_off_splicetoage, left, ticpixlen, agetic, unitinc, spliceageperpix, annot, label);
13683: 
13684:     minvar = data[dset]->min;
13685:     maxvar = data[dset]->max;
13686:     
13687:     for(j=0; j<spcomp.numcores; ++j){
13688: 
13689:       if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
13690:                    smooth.plot == SMOOTHEDBOTH){
13691: 
13692:         /* if are drawing both smoothed and unsmoothed
13693:            draw the smoothed
13694:         */
13695:         if(spcomp.numpercore[j] < 2) {
13696:         }
13697:         else if(data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->smooth_status != SMOK) {
13698:         }
13699:         else {
13700:           XSetForeground(XtDisplay(w), gc_drawingAreaSpliceToAge, fgPixel[SMOOTH_COLOR]);
13701:           if(j < 1){
13702:             if(data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][0]]->smooth_ok >= SMOK){
13703:               sx = (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][0]]->sm_data - minvar)/varperpix + xoff;
13704:             }
13705:             else {
13706:               sx = (spcomp.var[j][0] - minvar)/varperpix + xoff;
13707:             }
13708:             sy = (spcomp.age[j][0] - top_age_splicetoage)/spliceageperpix + top_off_splicetoage;
13709:             kk = 1;
13710:           }
13711:           else if(j > 0 && (spcomp.splice_how[j] == REAL || spcomp.splice_how[j] == INTERPOLATED) &&
13712:                   spcomp.map_to_table[j-1] == spcomp.map_to_table[j] - 2){
13713:             if(data[dset]->holes[spcomp.hole[j-1]]->core[spcomp.core[j-1]]->value[spcomp.MapToOrig[j-1][spcomp.numpercore[j-1]-1]]->smooth_ok >= SMOK){
13714:               sx = (data[dset]->holes[spcomp.hole[j-1]]->core[spcomp.core[j-1]]->value[spcomp.MapToOrig[j-1][spcomp.numpercore[j-1]-1]]->sm_data -
13715:                    minvar)/varperpix + xoff;
13716:             }
13717:             else {
13718:               sx = (spcomp.var[j-1][spcomp.numpercore[j-1]-1] - minvar)/varperpix + xoff;
13719:             }
13720:             sy = (spcomp.age[j-1][spcomp.numpercore[j-1]-1] - top_age_splicetoage)/spliceageperpix + top_off_splicetoage;
13721:             kk = 0;
13722:           }
13723:           else if(j > 0){
13724:             if(data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][0]]->smooth_ok >= SMOK){
13725:               sx = (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][0]]->sm_data - minvar)/varperpix + xoff;
13726:             }
13727:             else {
13728:               sx = (spcomp.var[j][0] - minvar)/varperpix + xoff;
13729:             }
13730:             sy = (spcomp.age[j][0] - top_age_splicetoage)/spliceageperpix + top_off_splicetoage;
13731:             kk = 1;
13732:           }
13733: 
13734:           for(k=kk; k<spcomp.numpercore[j]; ++k) {
13735:             if(data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][k]]->smooth_ok >= SMOK){
13736:               sdx = (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][k]]->sm_data - minvar)/varperpix + xoff;
13737:             }
13738:             else {
13739:               sdx = (spcomp.var[j][k] - minvar)/varperpix + xoff;
13740:             }
13741:             sdy = (spcomp.age[j][k] - top_age_splicetoage)/spliceageperpix + top_off_splicetoage;
13742:             if(sy > (int)win_height) {
13743:               break;
13744:             }
13745:             if(sy <= 0 && sdy <= 0) {
13746:             }
13747:             else {
13748:               if(sy < 0 && sdy > 0) {
13749:                 sx = sx + ((sdx - sx)/(sdy - sy)) * sdy;
13750:                 sy = 0;
13751:               }
13752:               XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaSpliceToAge,
13753:                           sx, sy, sdx, sdy);
13754:             }
13755:             sx = sdx;
13756:             sy = sdy;
13757:           }
13758:         }
13759:       }
13760: 
13761:       /* depending on plot choice draw the smoothed or unsmoothed
13762:       */
13763:       if(smooth.method == NONE || smooth.plot == UNSMOOTHED){
13764:           sm = NO;
13765:       }
13766:       else if(smooth.plot == SMOOTHEDBOTH){
13767:         sm = NO;
13768:       }
13769:       else if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
13770:                    smooth.plot == SMOOTHED){
13771:         sm = YES;
13772:       }
13773:       else {
13774:         sm = NO;
13775:       }
13776: 
13777:       if(spcomp.numpercore[j] < 2) {
13778:       }
13779:       else if(sm == YES && data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->smooth_status != SMOK) {
13780:       }
13781:       else {
13782:         if(sm == NO) {
13783:           XSetForeground(XtDisplay(w), gc_drawingAreaSpliceToAge, fgPixel[SPLICE_COLOR]);
13784:         }
13785:         else if(sm == YES) {
13786:           XSetForeground(XtDisplay(w), gc_drawingAreaSpliceToAge, fgPixel[SMOOTH_COLOR]);
13787:         }
13788: 
13789:         if(j < 1){
13790:           if(sm == YES && (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][0]]->smooth_ok >= SMOK)){
13791:             sx = (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][0]]->sm_data - minvar)/varperpix + xoff;
13792:           }
13793:           else {
13794:             sx = (spcomp.var[j][0] - minvar)/varperpix + xoff;
13795:           }
13796:           sy = (spcomp.age[j][0] - top_age_splicetoage)/spliceageperpix + top_off_splicetoage;
13797:           kk = 1;
13798:         }
13799:         else if(j > 0 && (spcomp.splice_how[j] == REAL || spcomp.splice_how[j] == INTERPOLATED) &&
13800:                 spcomp.map_to_table[j-1] == spcomp.map_to_table[j] - 2){
13801:           if(sm == YES && 
13802:             (data[dset]->holes[spcomp.hole[j-1]]->core[spcomp.core[j-1]]->value[spcomp.MapToOrig[j-1][spcomp.numpercore[j-1]-1]]->smooth_ok >= SMOK)){
13803:             sx = (data[dset]->holes[spcomp.hole[j-1]]->core[spcomp.core[j-1]]->value[spcomp.MapToOrig[j-1][spcomp.numpercore[j-1]-1]]->sm_data -
13804:                   minvar)/varperpix + xoff;
13805:           }
13806:           else {
13807:             sx = (spcomp.var[j-1][spcomp.numpercore[j-1]-1] - minvar)/varperpix + xoff;
13808:           }
13809:           sy = (spcomp.age[j-1][spcomp.numpercore[j-1]-1] - top_age_splicetoage)/spliceageperpix + top_off_splicetoage;
13810:           kk = 0;
13811:         }
13812:         else if(j > 0){
13813:           if(sm == YES && (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][0]]->smooth_ok >= SMOK)){
13814:             sx = (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][0]]->sm_data - minvar)/varperpix + xoff;
13815:           }
13816:           else {
13817:             sx = (spcomp.var[j][0] - minvar)/varperpix + xoff;
13818:           }
13819:           sy = (spcomp.age[j][0] - top_age_splicetoage)/spliceageperpix + top_off_splicetoage;
13820:           kk = 1;
13821:         }
13822:         for(k=kk; k<spcomp.numpercore[j]; ++k) {
13823:           if(sm == YES && (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][k]]->smooth_ok >= SMOK)){
13824:             sdx = (data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->value[spcomp.MapToOrig[j][k]]->sm_data - minvar)/varperpix + xoff;
13825:           }
13826:           else {
13827:             sdx = (spcomp.var[j][k] - minvar)/varperpix + xoff;
13828:           }
13829:           sdy = (spcomp.age[j][k] - top_age_splicetoage)/spliceageperpix + top_off_splicetoage;
13830:           if(sy > (int)win_height) {
13831:             break;
13832:           }
13833:           if(sy <= 0 && sdy <= 0) {
13834:           }
13835:           else {
13836:             if(sy < 0 && sdy > 0) {
13837:               sx = sx + ((sdx - sx)/(sdy - sy)) * sdy;
13838:               sy = 0;
13839:             }
13840:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaSpliceToAge,
13841:                           sx, sy, sdx, sdy);
13842:           }
13843:           sx = sdx;
13844:           sy = sdy;
13845:         }
13846: 
13847:         /*  label the core
13848:         */
13849:         sx = xoff - SPACE/2.0;
13850:         sy = sy - 5;
13851:         XSetForeground(XtDisplay(w), gc_drawingAreaSpliceToAge, fgPixel[LABEL_COLOR]);
13852:         (void)sprintf(s, "%c%d", data[dset]->holes[spcomp.hole[j]]->name,
13853:                            data[dset]->holes[spcomp.hole[j]]->core[spcomp.core[j]]->num);
13854:         XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaSpliceToAge,
13855:                        sx, sy, s, (int)strlen(s));
13856:       }
13857:     }
13858: 
13859:     /* draw the datums
13860:     */
13861:     for(i=0; i<agemodel_cnt; ++i) {
13862:       if(agemodel[i].type == PALEOMAG) {
13863:         XSetForeground(XtDisplay(w), gc_drawingAreaSpliceToAge, fgPixel[PALEOMAG_COLOR]);
13864:       }
13865:       else if(agemodel[i].type == DIATOMS){
13866:         XSetForeground(XtDisplay(w), gc_drawingAreaSpliceToAge, fgPixel[DIATOM_COLOR]);
13867:       }
13868:       else if(agemodel[i].type == RADIOLARIA){
13869:         XSetForeground(XtDisplay(w), gc_drawingAreaSpliceToAge, fgPixel[RAD_COLOR]);
13870:       }
13871:       else if(agemodel[i].type == FORAMINIFERA){
13872:         XSetForeground(XtDisplay(w), gc_drawingAreaSpliceToAge, fgPixel[FORAM_COLOR]);
13873:       }
13874:       else if(agemodel[i].type == NANNOFOSSILS){
13875:         XSetForeground(XtDisplay(w), gc_drawingAreaSpliceToAge, fgPixel[NANNO_COLOR]);
13876:       }
13877:       else if(agemodel[i].type == HANDPICK || agemodel[i].type == TIME){
13878:         XSetForeground(XtDisplay(w), gc_drawingAreaSpliceToAge, fgPixel[AGEDEPHANDPICK_COLOR]);
13879:       }
13880:       else {
13881:         XSetForeground(XtDisplay(w), gc_drawingAreaSpliceToAge, fgPixel[LABEL_COLOR]);
13882:       }
13883:       sy = (agemodel[i].aveage - top_age_splicetoage)/spliceageperpix + top_off_splicetoage;
13884:       (void)sprintf(s, "%s", agemodel[i].code);
13885:       agemodel[i].x_pix_loc_splicetoage = varaxislen + xoff + SPACE/2;
13886:       agemodel[i].y_pix_loc_splicetoage = sy;
13887:       XDrawString(XtDisplay(w), XtWindow(w), gc_drawingAreaSpliceToAge,
13888:                    agemodel[i].x_pix_loc_splicetoage, agemodel[i].y_pix_loc_splicetoage, s, (int)strlen(s));
13889:       XSetForeground(XtDisplay(w), gc_drawingAreaSpliceToAge, fgPixel[DATUMLOC_COLOR]);
13890:       XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaSpliceToAge, OFF+SPACE+20, sy, OFF+SPACE+varaxislen-20, sy);
13891: 
13892:     }
13893: 
13894:     /* if have time series draw it
13895:     */
13896:     if(have_time_series == DO && timeseries.n >= 2) {
13897:       if(XmToggleButtonGetState(toggleButtonTimeSeriesInvertNo) == True) {
13898:         flip_adj = 1.0;
13899:         flip_off = 0.0;
13900:       }
13901:       else if(XmToggleButtonGetState(toggleButtonTimeSeriesInvertYes) == True) {
13902:         flip_adj = -1.0;
13903:         flip_off = timeseries.maxval - timeseries.minval;
13904:       }
13905:       XSetForeground(XtDisplay(w), gc_drawingAreaSpliceToAge, fgPixel[TIMESERIES_COLOR]);
13906:       xoff = OFF +  SPACE + varaxislen + SPACE;
13907:       timeseries.valperpix = (timeseries.maxval-timeseries.minval)/varaxislen;
13908:       sx = (flip_adj * (timeseries.val[0] - timeseries.minval) + flip_off)/timeseries.valperpix + xoff;
13909:       sy = (timeseries.age[0] - top_age_splicetoage)/spliceageperpix + top_off_splicetoage;
13910:       for(i=1; i<timeseries.n; ++i) {
13911:         sdx = (flip_adj * (timeseries.val[i] - timeseries.minval) + flip_off)/timeseries.valperpix + xoff;
13912:         sdy = (timeseries.age[i] - top_age_splicetoage)/spliceageperpix + top_off_splicetoage;
13913:         if(sy > (int)win_height) {
13914:           break;
13915:         }
13916:         if(sy <= 0 && sdy <= 0) {
13917:         }
13918:         else {
13919:           if(sy < 0 && sdy > 0) {
13920:             sx = sx + ((sdx - sx)/(sdy - sy)) * sdy;
13921:             sy = 0;
13922:           }
13923:           XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaSpliceToAge,
13924:                           sx, sy, sdx, sdy);
13925:         }
13926:         sx = sdx;
13927:         sy = sdy;
13928:       }
13929: 
13930:       if(have_splicetoage_tie == DO && have_timeseries_tie == DO){
13931: 
13932:         /* get the ages at tie and draw the time series over the splice
13933:         */
13934:         XtVaGetValues(labelSpliceToAgeTimeSeriesAge, XmNlabelString, &xmstring, NULL);
13935:         XmStringGetLtoR(xmstring, XmFONTLIST_DEFAULT_TAG, &string);
13936:         timeseries_age = atof(string);
13937:         XtFree(string);
13938:         XtVaGetValues(labelSpliceToAgeTieSpliceAge, XmNlabelString, &xmstring, NULL);
13939:         XmStringGetLtoR(xmstring, XmFONTLIST_DEFAULT_TAG, &string);
13940:         splice_age = atof(string);
13941:         XtFree(string);
13942:         ageoffset = splice_age - timeseries_age;
13943:       
13944:         xoff= OFF + SPACE;
13945:         sx = (flip_adj * (timeseries.val[0] - timeseries.minval) + flip_off)/timeseries.valperpix + xoff;
13946:         sy = (timeseries.age[0] - top_age_splicetoage + ageoffset)/spliceageperpix + top_off_splicetoage;
13947:         for(i=1; i<timeseries.n; ++i) {
13948:           sdx = (flip_adj * (timeseries.val[i] - timeseries.minval) + flip_off)/timeseries.valperpix + xoff;
13949:           sdy = (timeseries.age[i] - top_age_splicetoage + ageoffset)/spliceageperpix + top_off_splicetoage;
13950:           if(sy > (int)win_height) {
13951:             break;
13952:           }
13953:           if(sy <= 0 && sdy <= 0) {
13954:           }
13955:           else {
13956:             if(timeseries.age[i] >= timeseries.age[timeseriesarraynum] - winlen && 
13957:                timeseries.age[i] <= timeseries.age[timeseriesarraynum] + winlen){
13958:               XSetForeground(XtDisplay(w), gc_drawingAreaSpliceToAge, fgPixel[OVERLAYINCORR_COLOR]);
13959:             }
13960:             else {
13961:               XSetForeground(XtDisplay(w), gc_drawingAreaSpliceToAge, fgPixel[OVERLAYOUTCORR_COLOR]);
13962:             }
13963:             if(sy < 0 && sdy > 0) {
13964:               sx = sx + ((sdx - sx)/(sdy - sy)) * sdy;
13965:               sy = 0;
13966:             }
13967:             XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaSpliceToAge,
13968:                           sx, sy, sdx, sdy);
13969:           }
13970:           sx = sdx;
13971:           sy = sdy;
13972:         }
13973:       }
13974:     }
13975: 
13976:     /* if have tie point(s) draw
13977:     */
13978:     if(have_splicetoage_tie == DO){
13979:       if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
13980:          (smooth.plot == SMOOTHED || smooth.plot == SMOOTHEDBOTH) &&
13981:          (data[dset]->holes[spcomp.hole[splicetoagecorenum]]->core[spcomp.core[splicetoagecorenum]]->smooth_status == SMOK) ){
13982: 
13983:         if(data[dset]->holes[spcomp.hole[splicetoagecorenum]]->core[spcomp.core[splicetoagecorenum]]->value[spcomp.MapToOrig[splicetoagecorenum][splicetoagearraynum]]->smooth_ok >= SMOK){
13984:           sx = (data[dset]->holes[spcomp.hole[splicetoagecorenum]]->core[spcomp.core[splicetoagecorenum]]->value[spcomp.MapToOrig[splicetoagecorenum][splicetoagearraynum]]->sm_data - minvar)/varperpix + OFF + SPACE;
13985:         }
13986:         else {
13987:           sx = (spcomp.var[splicetoagecorenum][splicetoagearraynum] - minvar)/varperpix + OFF + SPACE;
13988:         }
13989:       }
13990:       else if(smooth.plot != SMOOTHED) {
13991:         sx = (spcomp.var[splicetoagecorenum][splicetoagearraynum] - minvar)/varperpix + OFF + SPACE;
13992:       }
13993:       if((data[dset]->holes[spcomp.hole[splicetoagecorenum]]->core[spcomp.core[splicetoagecorenum]]->smooth_status != SMOK) &&
13994:          smooth.plot == SMOOTHED) {
13995:       }
13996:       else {
13997:         sy = (spcomp.age[splicetoagecorenum][splicetoagearraynum] - top_age_splicetoage)/spliceageperpix + top_off_splicetoage;
13998:         XSetForeground(XtDisplay(drawingAreaSpliceToAge), gc_drawingAreaSpliceToAge,
13999:                      fgPixel[TIEPTSHIFT_COLOR]);
14000:         XFillArc(XtDisplay(drawingAreaSpliceToAge), XtWindow(drawingAreaSpliceToAge),
14001:                          gc_drawingAreaSpliceToAge,
14002:                          sx-(POINTSIZE/2), sy-(POINTSIZE/2),
14003:                          POINTSIZE, POINTSIZE, 0, 360*64);
14004:       }
14005:     }
14006:     if(have_timeseries_tie == DO) {
14007:       xoff = OFF +  SPACE + varaxislen + SPACE;
14008:       sdx = (flip_adj * (timeseries.val[timeseriesarraynum] - timeseries.minval) + flip_off)/timeseries.valperpix + xoff;
14009:       sdy = (timeseries.age[timeseriesarraynum] - top_age_splicetoage)/spliceageperpix + top_off_splicetoage;
14010:       XSetForeground(XtDisplay(drawingAreaSpliceToAge), gc_drawingAreaSpliceToAge,
14011:                      fgPixel[TIEPTFIXED_COLOR]);
14012:         XFillArc(XtDisplay(drawingAreaSpliceToAge), XtWindow(drawingAreaSpliceToAge),
14013:                          gc_drawingAreaSpliceToAge,
14014:                          sdx-(POINTSIZE/2), sdy-(POINTSIZE/2),
14015:                          POINTSIZE, POINTSIZE, 0, 360*64);
14016:     }
14017:     if(have_splicetoage_tie == DO && have_timeseries_tie == DO) {
14018:       XSetForeground(XtDisplay(w), gc_drawingAreaSpliceToAge, fgPixel[TIELINE_COLOR]);
14019:       XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaSpliceToAge, sx, sy, sdx, sdy);
14020:     }
14021: 
14022:     /* draw the sed rate
14023:     */
14024:     XSetForeground(XtDisplay(w), gc_drawingAreaSpliceToAge, fgPixel[SEDRATE_COLOR]);
14025:     maxsedrate = 0.0;
14026:     for(i=0; i<agemodel_cnt; ++i) {
14027:       if(agemodel[i].sedrate > maxsedrate) {
14028:         maxsedrate = agemodel[i].sedrate;
14029:       }
14030:     }
14031:     sedrateperpix = maxsedrate/varaxislen;
14032:     if(have_time_series == DONT) {
14033:       xoff = OFF +  SPACE + varaxislen + SPACE;
14034:     }
14035:     else if(have_time_series == DO) {
14036:       xoff = OFF +  SPACE + varaxislen + SPACE + varaxislen + SPACE;
14037:     }
14038:     else {
14039:       xoff = OFF +  SPACE + varaxislen + SPACE;
14040:     }
14041: 
14042:     for(i=0; i<agemodel_cnt - 1; ++i) {
14043:       sx = agemodel[i].sedrate/sedrateperpix + xoff;
14044:       sdx = agemodel[i+1].sedrate/sedrateperpix + xoff;
14045:       sy = (agemodel[i].aveage - top_age_splicetoage)/spliceageperpix + top_off_splicetoage; 
14046:       sdy = (agemodel[i+1].aveage - top_age_splicetoage)/spliceageperpix + top_off_splicetoage;
14047: 
14048:       if(sy > (int)win_height) {
14049:         break;
14050:       }
14051:       else if(sdy < top_off_splicetoage) {
14052:       }
14053:       else {
14054: 
14055:         if(sdy > (int)win_height) {
14056:           sdy = (int)win_height;
14057:         }
14058: 
14059:         XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaSpliceToAge,
14060:                           sx, sy, sx, sdy);
14061:         XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaSpliceToAge,
14062:                           sx, sdy, sdx, sdy);
14063:       }
14064:     }
14065:   }
14066: }
14067: 
14068: void
14069: SpliceToAgeDismiss(w, client_data, call_data)
14070:  Widget w;
14071:  XtPointer client_data;
14072:  XtPointer call_data;
14073: {
14074:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14075: 
14076:   have_splicetoage_corr = DONT;
14077:   have_splicetoage_tie = DONT;
14078:   have_timeseries_tie = DONT;
14079:   XtUnmanageChild(formSpliceToAge);
14080: }
14081: 
14082: void
14083: ScaleSpliceToAgeDrag(w, client_data, call_data)
14084:  Widget w;
14085:  XtPointer client_data;
14086:  XtPointer call_data;
14087: {
14088:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14089: 
14090:   void DrawDrawingAreaSpliceToAge();
14091: 
14092:   if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
14093:     DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
14094:   }
14095: }
14096: 
14097: void
14098: PlotSpliceVsAge(from_view_splicetoage)
14099: int from_view_splicetoage;
14100: {
14101:   int err;
14102:   int CalcAge();
14103:   void DrawDrawingAreaSpliceToAge();
14104: 
14105:   if(have_splice == DO && have_strat == DO) {
14106:     if(agemodel_cnt > 1) {
14107:       err = CalcAge();
14108:       if(err == NO) {
14109:         /* call came from ViewSpliceVsAge; calculate the age displayed
14110:            in the drawing area
14111:         */
14112:         if(from_view_splicetoage == YES) {
14113:           agedisplayed = depmeterdisplayed/agemodel_avesedrate;
14114:         }
14115:         have_splicetoage = DO;
14116:         if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
14117:           DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
14118:         }
14119:       }
14120:       else {
14121:         have_splicetoage = DONT;
14122:       }
14123:     }
14124:     else {
14125:       have_splicetoage = DONT;
14126:     }
14127:   }
14128: }
14129: 
14130: void
14131: SaveAgeModelOK(w, client_data, call_data)
14132:  Widget w;
14133:  XtPointer client_data;
14134:  XtPointer call_data;
14135: {
14136:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14137: }
14138: 
14139: void
14140: SpliceToAgeZoomDown(w, client_data, call_data)
14141:  Widget w;
14142:  XtPointer client_data;
14143:  XtPointer call_data;
14144: {
14145:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14146: 
14147:   char string[20];
14148:   int zoomfact;
14149:   float zfact;
14150:   String str;
14151:   void DrawDrawingAreaSpliceToAge();
14152: 
14153:   str = XmTextGetString(textSpliceToAgeZoomFactor);
14154:   zfact = atof(str);
14155:   XtFree(str);
14156: 
14157:   if(zfact > 1.0) {
14158:     zoomfact = zfact + .1;
14159:     --zoomfact;
14160:   }
14161:   else {
14162:     if(zfact == 1) {
14163:       zfact = 0.50;
14164:     }
14165:     else if(zfact == 0.50) {
14166:       zfact = 0.25;
14167:     }
14168:     else if(zfact == 0.25) {
14169:       zfact = 0.10;
14170:     }
14171:     else {
14172:       zfact = 0.10;
14173:     }
14174:   }
14175:   if(zfact >= 1.0) {
14176:     (void)sprintf(string, "%d", zoomfact);
14177:   }
14178:   else {
14179:     (void)sprintf(string, "%4.2f", zfact);
14180:   }
14181:   XtVaSetValues(textSpliceToAgeZoomFactor, XmNvalue, string, NULL);
14182:   (void)sprintf(string, "");
14183: 
14184:   if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
14185:     DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
14186:   }
14187: }
14188: 
14189: void
14190: SpliceToAgeZoomUp(w, client_data, call_data)
14191:  Widget w;
14192:  XtPointer client_data;
14193:  XtPointer call_data;
14194: {
14195:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14196: 
14197:   char string[20];
14198:   int zoomfact;
14199:   float zfact;
14200:   String str;
14201:   void DrawDrawingAreaSpliceToAge();
14202: 
14203:   str = XmTextGetString(textSpliceToAgeZoomFactor);
14204:   zfact = atof(str);
14205:   XtFree(str);
14206: 
14207:   zoomfact = zfact * 100.0;
14208:   zfact = zoomfact/100.0; 
14209:   zoomfact = 1;
14210: 
14211:   if(zfact >= 20.0) {
14212:     zoomfact = 20;
14213:   }
14214:   else if(zfact >= 1.0) {
14215:     zoomfact = zfact + .1;
14216:     ++zoomfact;
14217:   }
14218:   else {
14219:     if(zfact == 0.5) {
14220:       zfact = 1.0;
14221:       zoomfact = 1;
14222:     }
14223:     else if(zfact == 0.25) {
14224:       zfact = 0.50;
14225:     }
14226:     else if(zfact == 0.1) {
14227:       zfact = 0.25;
14228:     }
14229:     else {
14230:       zfact = 1.0;
14231:     }
14232:   }
14233: 
14234:   if(zfact >= 1.0) {
14235:     (void)sprintf(string, "%d", zoomfact);
14236:   }
14237:   else {
14238:     (void)sprintf(string, "%4.2f", zfact);
14239:   }
14240:   XtVaSetValues(textSpliceToAgeZoomFactor, XmNvalue, string, NULL);
14241:   (void)sprintf(string, "");
14242: 
14243:   if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
14244:     DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
14245:   }
14246: }
14247: 
14248: void
14249: SpliceToAgeTextZoomActivate(w, client_data, call_data)
14250:  Widget w;
14251:  XtPointer client_data;
14252:  XtPointer call_data;
14253: {
14254:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14255: 
14256:   char string[20];
14257:   int zoomfact;
14258:   float zfact;
14259:   String str;
14260:   void DrawDrawingAreaSpliceToAge();
14261: 
14262:   str = XmTextGetString(textSpliceToAgeZoomFactor);
14263:   zfact = atof(str);
14264:   XtFree(str);
14265: 
14266:   if(zfact <= .1) {
14267:     (void)sprintf(string, "0.1");
14268:     XtVaSetValues(textSpliceToAgeZoomFactor, XmNvalue, string, NULL);
14269:     (void)sprintf(string, "");
14270:   }
14271:   else if(zfact > 20.0) {
14272:     (void)sprintf(string, "20");
14273:     XtVaSetValues(textSpliceToAgeZoomFactor, XmNvalue, string, NULL);
14274:     (void)sprintf(string, "");
14275:   }
14276:   else if(zfact > 1.0) {
14277:     zoomfact = zfact;
14278:     (void)sprintf(string, "%d", zoomfact);
14279:     XtVaSetValues(textSpliceToAgeZoomFactor, XmNvalue, string, NULL);
14280:     (void)sprintf(string, "");
14281:   }
14282:   else if(zfact < 1.0 && zfact != 0.1 && zfact != 0.25 && zfact != 0.5) {
14283:     (void)sprintf(string, "1");
14284:     XtVaSetValues(textSpliceToAgeZoomFactor, XmNvalue, string, NULL);
14285:     (void)sprintf(string, "");
14286:   }
14287: 
14288:   if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
14289:     DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
14290:   }
14291: }
14292: 
14293: void
14294: ViewSpliceVsAge(w, client_data, call_data)
14295:  Widget w;
14296:  XtPointer client_data;
14297:  XtPointer call_data;
14298: {
14299:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14300: 
14301:   int width;
14302:   char string[20];
14303:   float dt;
14304: 
14305:   XtManageChild(formSpliceToAge);
14306:   XtPopup(XtParent(formSpliceToAge),XtGrabNone);
14307:   XtVaSetValues(textSpliceToAgeZoomFactor, XmNvalue, "1", NULL);
14308:   XtVaSetValues(scaleSpliceToAge, XmNvalue, 0, NULL);
14309:   XtSetSensitive(pushButtonSpliceToAgeAddTiedDatum, False);
14310:   XtSetSensitive(pushButtonSpliceToAgeRecorrelate, False);
14311:   XtSetSensitive(pushButtonSpliceToAgeClearTie, False);
14312: 
14313:   if(have_time_series == DO) {
14314:     have_splicetoage_corr = DONT;
14315:     width = 920;
14316:     XtManageChild(formSpliceToAgeTieToTimeSeries);
14317:     XtManageChild(labelInvertTimeSeries);
14318:     XtManageChild(radioBoxInvertTimeSeries);
14319:     XtSetSensitive(pushButtonSpliceToAgeRemoveTimeSeries, True);
14320: 
14321:     (void)sprintf(string, "%.3f", WINLENMYR);
14322:     XtVaSetValues(textFieldSpliceToAgeWinLen, XmNvalue, string, NULL);
14323:     (void)sprintf(string, "%.3f", LEADLAGMYR);
14324:     XtVaSetValues(textFieldSpliceToAgeLeadLag, XmNvalue, string, NULL);
14325:     (void)sprintf(string, "");
14326:     if(have_splicetoage == DO) {
14327:       FindSpliceAveAge(&dt);
14328:       (void)sprintf(string, "%.5f", dt);
14329:       XtVaSetValues(textFieldSpliceToAgeTimeStep, XmNvalue, string, NULL);
14330:     }
14331: 
14332:     if(XmToggleButtonGetState(toggleButtonTimeSeriesInvertYes) == True) {
14333:       XmToggleButtonSetState(toggleButtonInvertYes, True, False);
14334:       XmToggleButtonSetState(toggleButtonInvertNo, False, False);
14335:     }
14336:     else if(XmToggleButtonGetState(toggleButtonTimeSeriesInvertNo) == True) {
14337:       XmToggleButtonSetState(toggleButtonInvertNo, True, False);
14338:       XmToggleButtonSetState(toggleButtonInvertYes, False, False);
14339:     }
14340:     else {
14341:       XmToggleButtonSetState(toggleButtonInvertNo, True, False);
14342:       XmToggleButtonSetState(toggleButtonInvertYes, False, False);
14343:     }
14344:   }
14345:   else {
14346:     width = 560;
14347:     XtSetSensitive(pushButtonSpliceToAgeRemoveTimeSeries, False);
14348:     XtUnmanageChild(formSpliceToAgeTieToTimeSeries);
14349:     XtUnmanageChild(labelInvertTimeSeries);
14350:     XtUnmanageChild(radioBoxInvertTimeSeries);
14351:   }
14352:   XtVaSetValues(XtParent(formSpliceToAge), XmNwidth, width, NULL);
14353: 
14354:   PlotSpliceVsAge(YES);
14355: }
14356: 
14357: void
14358: AgeDepthDrag(w, client_data, call_data)
14359:  Widget w;
14360:  XtPointer client_data;
14361:  XtPointer call_data;
14362: {
14363:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14364: 
14365:   XmString xmstring;
14366:   char  *string;
14367:   XColor return_color, unused;
14368: 
14369:   XtVaGetValues(pushButtonAgeDepthDrag, XmNlabelString, &xmstring, NULL);
14370:   if(!XmStringGetLtoR(xmstring,XmFONTLIST_DEFAULT_TAG,&string))
14371:   {
14372:         message.error=True;
14373:         message.fatal=False;
14374:         message.caller=NONE;
14375:         message.type=XmDIALOG_WARNING;
14376:         message.default_button=XmDIALOG_OK_BUTTON;
14377:         if((message.label=(char*)calloc(200,CHAR_SIZE))==NULL)
14378:                 SpBadMemAlloc("SpViewReportCB 1");
14379:         else
14380:                 (void)sprintf(message.label,"Unable to convert report label to char");
14381:         SpManageMessage(message);
14382:   }
14383:   if((int)strcmp(string, "Enable Drag") == 0){
14384: 
14385:     drag_cursor = XCreateFontCursor(XtDisplay(drawingAreaAgeDepth), XC_hand2);
14386:     if(drag_cursor != BadAlloc && drag_cursor != BadFont && drag_cursor != BadValue) {
14387:       XDefineCursor(XtDisplay(drawingAreaAgeDepth), XtWindow(drawingAreaAgeDepth), drag_cursor);
14388:     }
14389:     are_dragging = YES;
14390: 
14391:     xmstring=XmCvtCTToXmString("Disable Drag");
14392:     XtVaSetValues(pushButtonAgeDepthDrag,XmNlabelString,xmstring,NULL);
14393:     XmStringFree(xmstring);
14394:   }
14395:   else if((int)strcmp(string, "Disable Drag") == 0) {
14396: 
14397:     if(drag_cursor) {
14398:       XUndefineCursor(XtDisplay(drawingAreaAgeDepth), XtWindow(drawingAreaAgeDepth));
14399:       XFreeCursor(XtDisplay(drawingAreaAgeDepth), drag_cursor);
14400:     }
14401:     are_dragging = NO;
14402:     top_age_agedepth = 0.0;
14403:     top_meter_agedepth = 0.0;
14404:     last_x_agedepth = 0;
14405:     last_y_agedepth = 0;
14406: 
14407:     if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
14408:       DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
14409:     }
14410: 
14411:     xmstring=XmCvtCTToXmString("Enable Drag");
14412:     XtVaSetValues(pushButtonAgeDepthDrag,XmNlabelString,xmstring,NULL);
14413:     XmStringFree(xmstring);
14414:   }
14415:   XtFree(string);
14416: }
14417: 
14418: void
14419: AgeDepthScaleArrowDown(w, client_data, call_data)
14420:  Widget w;
14421:  XtPointer client_data;
14422:  XtPointer call_data;
14423: {
14424:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14425: }
14426: 
14427: void
14428: SaveSpliceToAge(w, client_data, call_data)
14429:  Widget w;
14430:  XtPointer client_data;
14431:  XtPointer call_data;
14432: {
14433:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14434: 
14435:   char *str, *path;
14436:   int  len;
14437:   XmString xmstring;
14438: 
14439:   void SpUpdateFileSelection();
14440: 
14441:   XtManageChild(formFileSelection);
14442:   XtPopup(XtParent(formFileSelection),XtGrabNone);
14443:   xmstring=XmCvtCTToXmString("Save");
14444:   XtVaSetValues(pushButtonFileSelectionOK,XmNlabelString,xmstring,NULL);
14445:   XmStringFree(xmstring);
14446: 
14447:   fileselection = SAVESPLICEVSAGE;
14448: 
14449:   XtVaSetValues(xmDialogShellFileSelection, XmNtitle, "Save Splice vs Age", NULL);
14450:   XtVaSetValues(textFileSelectionSelected, XmNvalue, "", NULL);
14451: 
14452:   if((path=(char*)calloc((int)strlen(outsplicetoage_dirname)+1000,CHAR_SIZE))==NULL)
14453:                                 SpBadMemAlloc("OpenSplicerTable");
14454:   (void)sprintf(path, "%s", outsplicetoage_dirname);
14455: 
14456:   len = (int)strlen(path);
14457:   if(strcmp(&path[len-1], "/") == 0) {
14458:     *strrchr(path,'/')= '\0';
14459:   }
14460: 
14461:   if((str=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
14462:     SpBadMemAlloc("OpenSplicerTable");
14463:   }
14464:   (void)sprintf(str,"%s/*", path);
14465:   XtVaSetValues(textFileSelectionFilter, XmNvalue, str, NULL);
14466:   free(str);
14467: 
14468:   XtVaSetValues(textFileSelectionSelected, XmNvalue, outsplicetoage_filename, NULL);
14469: 
14470:   SpUpdateFileSelection(FILE_FILTER, SAVESPLICEVSAGE, path);
14471:   (void)sprintf(preview_input_path,"%s",path);
14472: 
14473:   free(path);
14474:   if(path)
14475:     path = NULL;
14476: }
14477: 
14478: void
14479: AgeDepthScaleArrowUp(w, client_data, call_data)
14480:  Widget w;
14481:  XtPointer client_data;
14482:  XtPointer call_data;
14483: {
14484:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14485: }
14486: 
14487: void
14488: ColorDatumLocation(w, client_data, call_data)
14489:  Widget w;
14490:  XtPointer client_data;
14491:  XtPointer call_data;
14492: {
14493:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14494: 
14495:   int item_count;
14496:   char *rgbcolor;
14497:   XmString *pcolor;
14498:   Pixel sampPixel;
14499:   int GetColorPixelValue();
14500: 
14501:   /* get the selected color name from the list
14502:   */
14503:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count,
14504:                 XmNselectedItems,&pcolor, NULL);
14505:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor);
14506: 
14507:   /* and change the  color of the core label button
14508:   */
14509:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
14510:   XtVaSetValues(pushButtonColorDatumLocation, XmNbackground, sampPixel, NULL);
14511: 
14512:   XtVaSetValues(pushButtonColorDatumLocation, XmNlabelString, pcolor[0], NULL);
14513:   (void)sprintf(tempcolor[DATUMLOC_COLOR], "%s", rgbcolor);
14514:   tempfgPixel[DATUMLOC_COLOR] = sampPixel;
14515:   XtFree(rgbcolor);
14516: }
14517: 
14518: void
14519: ColorSetCorporate(w, client_data, call_data)
14520:  Widget w;
14521:  XtPointer client_data;
14522:  XtPointer call_data;
14523: {
14524:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14525: 
14526:   int i;
14527:   void SetInitialColors(), SetColorSetBGandFG();
14528: 
14529:   colorset = CORPORATE_COLORSET;
14530:   SetInitialColors(XtDisplay(w));
14531:   (void)SetColorSetBGandFG();
14532: 
14533:   /* set the temp colors to the current colors using
14534:   */
14535:   tempbgPixel = bgPixel;
14536:   (void)sprintf(tempcolor[BG_COLOR], "%s", color[BG_COLOR]);
14537:   for(i=1; i<NCOLOR; ++i) {
14538:     tempfgPixel[i] = fgPixel[i];
14539:     (void)sprintf(tempcolor[i], "%s", color[i]);
14540:   }
14541: }
14542: 
14543: void
14544: ColorSetSantaFe(w, client_data, call_data)
14545:  Widget w;
14546:  XtPointer client_data;
14547:  XtPointer call_data;
14548: {
14549:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14550: 
14551:   int i;
14552:   void SetInitialColors(), SetColorSetBGandFG();
14553: 
14554:   colorset = SANTAFE_COLORSET;
14555:   SetInitialColors(XtDisplay(w));
14556:   (void)SetColorSetBGandFG();
14557: 
14558:   /* set the temp colors to the current colors using
14559:   */
14560:   tempbgPixel = bgPixel;
14561:   (void)sprintf(tempcolor[BG_COLOR], "%s", color[BG_COLOR]);
14562:   for(i=1; i<NCOLOR; ++i) {
14563:     tempfgPixel[i] = fgPixel[i];
14564:     (void)sprintf(tempcolor[i], "%s", color[i]);
14565:   }
14566: }
14567: 
14568: void
14569: ColorSetODP(w, client_data, call_data)
14570:  Widget w;
14571:  XtPointer client_data;
14572:  XtPointer call_data;
14573: {
14574:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14575: 
14576:   int i;
14577:   void SetInitialColors(), SetColorSetBGandFG();
14578: 
14579:   colorset = ODP_COLORSET;
14580:   SetInitialColors(XtDisplay(w));
14581:   (void)SetColorSetBGandFG();
14582: 
14583:   /* set the temp colors to the current colors using
14584:   */
14585:   tempbgPixel = bgPixel;
14586:   (void)sprintf(tempcolor[BG_COLOR], "%s", color[BG_COLOR]);
14587:   for(i=1; i<NCOLOR; ++i) {
14588:     tempfgPixel[i] = fgPixel[i];
14589:     (void)sprintf(tempcolor[i], "%s", color[i]);
14590:   }
14591: }
14592: 
14593: void
14594: ColorSetEarth(w, client_data, call_data)
14595:  Widget w;
14596:  XtPointer client_data;
14597:  XtPointer call_data;
14598: {
14599:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14600: 
14601:   int i;
14602:   void SetInitialColors(), SetColorSetBGandFG();
14603: 
14604:   colorset = EARTH_COLORSET;
14605:   SetInitialColors(XtDisplay(w));
14606:   (void)SetColorSetBGandFG();
14607: 
14608:   /* set the temp colors to the current colors using
14609:   */
14610:   tempbgPixel = bgPixel;
14611:   (void)sprintf(tempcolor[BG_COLOR], "%s", color[BG_COLOR]);
14612:   for(i=1; i<NCOLOR; ++i) {
14613:     tempfgPixel[i] = fgPixel[i];
14614:     (void)sprintf(tempcolor[i], "%s", color[i]);
14615:   }
14616: }
14617: 
14618: void
14619: ColorSetOther(w, client_data, call_data)
14620:  Widget w;
14621:  XtPointer client_data;
14622:  XtPointer call_data;
14623: {
14624:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14625: }
14626: 
14627: void
14628: ColorSedRate(w, client_data, call_data)
14629:  Widget w;
14630:  XtPointer client_data;
14631:  XtPointer call_data;
14632: {
14633:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14634: 
14635:   int item_count;
14636:   char *rgbcolor;
14637:   XmString *pcolor;
14638:   Pixel sampPixel;
14639:   int GetColorPixelValue();
14640: 
14641:   /* get the selected color name from the list
14642:   */
14643:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count,
14644:                 XmNselectedItems,&pcolor, NULL);
14645:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor);
14646: 
14647:   /* and change the  color of the core label button
14648:   */
14649:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
14650:   XtVaSetValues(pushButtonColorSedRate, XmNbackground, sampPixel, NULL);
14651: 
14652:   XtVaSetValues(pushButtonColorSedRate, XmNlabelString, pcolor[0], NULL);
14653:   (void)sprintf(tempcolor[SEDRATE_COLOR], "%s", rgbcolor);
14654:   tempfgPixel[SEDRATE_COLOR] = sampPixel;
14655:   XtFree(rgbcolor);
14656: }
14657: 
14658: void
14659: ColorSetMaritime(w, client_data, call_data)
14660:  Widget w;
14661:  XtPointer client_data;
14662:  XtPointer call_data;
14663: {
14664:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14665: 
14666:   int i;
14667:   void SetInitialColors(), SetColorSetBGandFG();
14668: 
14669:   colorset = MARITIME_COLORSET;
14670:   SetInitialColors(XtDisplay(w));
14671:   (void)SetColorSetBGandFG();
14672: 
14673:   /* set the temp colors to the current colors using
14674:   */
14675:   tempbgPixel = bgPixel;
14676:   (void)sprintf(tempcolor[BG_COLOR], "%s", color[BG_COLOR]);
14677:   for(i=1; i<NCOLOR; ++i) {
14678:     tempfgPixel[i] = fgPixel[i];
14679:     (void)sprintf(tempcolor[i], "%s", color[i]);
14680:   }
14681: }
14682: 
14683: void
14684: SaveAgeModelCancel(w, client_data, call_data)
14685:  Widget w;
14686:  XtPointer client_data;
14687:  XtPointer call_data;
14688: {
14689:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14690: }
14691: 
14692: void
14693: ColorSetCustome(w, client_data, call_data)
14694:  Widget w;
14695:  XtPointer client_data;
14696:  XtPointer call_data;
14697: {
14698:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14699: 
14700:   int i;
14701:   void SetInitialColors(), SetColorSetBGandFG();
14702: 
14703:   colorset = CUSTOME_COLORSET;
14704:   SetInitialColors(XtDisplay(w));
14705:   (void)SetColorSetBGandFG();
14706: 
14707:   /* set the temp colors to the current colors using
14708:   */
14709:   tempbgPixel = bgPixel;
14710:   (void)sprintf(tempcolor[BG_COLOR], "%s", color[BG_COLOR]);
14711:   for(i=1; i<NCOLOR; ++i) {
14712:     tempfgPixel[i] = fgPixel[i];
14713:     (void)sprintf(tempcolor[i], "%s", color[i]);
14714:   }
14715: }
14716: 
14717: void
14718: SaveColorSettingsAsCustome(w, client_data, call_data)
14719:  Widget w;
14720:  XtPointer client_data;
14721:  XtPointer call_data;
14722: {
14723:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14724: 
14725:   int i;
14726:   void SetInitialColors(), SetColorSetBGandFG();
14727: 
14728:   (void)sprintf(cust_color[BG_COLOR], "%s", tempcolor[BG_COLOR]);
14729:   bgPixel = tempbgPixel;
14730:   for(i=1; i<NCOLOR; ++i) {
14731:     fgPixel[i] = tempfgPixel[i];
14732:     (void)sprintf(cust_color[i], "%s", tempcolor[i]);
14733:   }
14734: 
14735:   colorset = CUSTOME_COLORSET;
14736:   SetInitialColors(XtDisplay(w));
14737: 
14738:   (void)SetColorSetBGandFG();
14739: }
14740: 
14741: void
14742: OpenAgeModel(w, client_data, call_data)
14743:  Widget w;
14744:  XtPointer client_data;
14745:  XtPointer call_data;
14746: {
14747:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14748: 
14749:   char *str, *path;
14750:   int  len;
14751:   XmString xmstring;
14752: 
14753:   void SpUpdateFileSelection();
14754: 
14755:   XtManageChild(formFileSelection);
14756:   XtPopup(XtParent(formFileSelection),XtGrabNone);
14757:   xmstring=XmCvtCTToXmString("Read");
14758:   XtVaSetValues(pushButtonFileSelectionOK,XmNlabelString,xmstring,NULL);
14759:   XmStringFree(xmstring);
14760: 
14761:   fileselection = OPENAGEMODEL;
14762: 
14763:   XtVaSetValues(xmDialogShellFileSelection, XmNtitle, "Open Age Model", NULL);
14764:   XtVaSetValues(textFileSelectionSelected, XmNvalue, "", NULL);
14765: 
14766:   if((path=(char*)calloc((int)strlen(inagemodel_dirname)+1000,CHAR_SIZE))==NULL)
14767:                                 SpBadMemAlloc("OpenSplicerTable");
14768:   (void)sprintf(path, "%s", inagemodel_dirname);
14769: 
14770:   len = (int)strlen(path);
14771:   if(strcmp(&path[len-1], "/") == 0) {
14772:     *strrchr(path,'/')= '\0';
14773:   }
14774: 
14775:   if((str=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
14776:     SpBadMemAlloc("OpenSplicerTable");
14777:   }
14778:   (void)sprintf(str,"%s/*", path);
14779:   XtVaSetValues(textFileSelectionFilter, XmNvalue, str, NULL);
14780:   free(str);
14781: 
14782:   XtVaSetValues(textFileSelectionSelected, XmNvalue, inagemodel_filename, NULL);
14783: 
14784:   SpUpdateFileSelection(FILE_FILTER, OPENAGEMODEL, path);
14785:   (void)sprintf(preview_input_path,"%s",path);
14786: 
14787:   free(path);
14788:   if(path)
14789:     path = NULL;
14790: }
14791: 
14792: void
14793: OpenStratDismiss(w, client_data, call_data)
14794:  Widget w;
14795:  XtPointer client_data;
14796:  XtPointer call_data;
14797: {
14798:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14799: }
14800: 
14801: void
14802: TopLevelDestroy(w, client_data, call_data)
14803:  Widget w;
14804:  XtPointer client_data;
14805:  XtPointer call_data;
14806: {
14807:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14808: 
14809:   void    exit();
14810: 
14811:   printf("\nSplicer's windowed environment was destroyed by the main window's menu close option.\n");
14812:   printf("At present there is no way to recover. Must exit the program\n\n");
14813: 
14814:   SpExit();
14815:   exit(0);
14816: }
14817: 
14818: void
14819: SpSaveReportCB(w, client_data, call_data)
14820:  Widget w;
14821:  XtPointer client_data;
14822:  XtPointer call_data;
14823: {
14824:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14825: }
14826: 
14827: void
14828: Clear(w, client_data, call_data)
14829:  Widget w;
14830:  XtPointer client_data;
14831:  XtPointer call_data;
14832: {
14833:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14834: 
14835:   char *pclient = (char*) client_data;
14836:   XmTextPosition last_pos;
14837: 
14838:   if(have_data == DONT) {
14839:     return;
14840:   }
14841: 
14842:   if(*pclient == 'A') {
14843: 
14844:     if((did_affine == YES && saved_affine == NO) || (did_splicing == YES && saved_splice == NO) ||
14845:        (did_agemodel == YES && saved_agemodel == NO)) {
14846:       last_pos=XmTextGetLastPosition(textWarnClear);
14847:       XmTextInsert(textWarnClear,last_pos, "\n");
14848:       if(did_affine == YES && saved_affine == NO) {
14849:         last_pos=XmTextGetLastPosition(textWarnClear);
14850:         XmTextInsert(textWarnClear,last_pos,"  You have done compositing but you have not saved your work.\n");
14851:       }
14852:       if(did_splicing == YES && saved_splice == NO) {
14853:         last_pos=XmTextGetLastPosition(textWarnClear);
14854:         XmTextInsert(textWarnClear,last_pos,"  You have done splicing but you have not saved your work.\n");
14855:       }
14856:       if(did_agemodel == YES && saved_agemodel == NO) {
14857:         last_pos=XmTextGetLastPosition(textWarnClear);
14858:         XmTextInsert(textWarnClear,last_pos,"  You have done agemodelling but you have not saved your work.\n");
14859:       }
14860:   
14861:       last_pos=XmTextGetLastPosition(textWarnClear);
14862:       XmTextInsert(textWarnClear,last_pos,"\n  Your work will be lost if you clear.\n");
14863:       last_pos=XmTextGetLastPosition(textWarnClear);
14864:       XmTextInsert(textWarnClear,last_pos,"  Please verify that you want to clear all data.\n");
14865:       XtManageChild(formWarnClear);
14866:       clear_what = ALL;
14867:     }
14868:     else {
14869:       XtManageChild(messageBoxClearWorkspace);
14870:     }
14871:   }
14872:   
14873:   else if(*pclient == 'C') {
14874:     clear_what = INPUTDATA;
14875:   }
14876: 
14877:   else if(*pclient == 'S' && have_splice == DO) {
14878: 
14879:     /* check if have been splicing but have not saved the work
14880:     */
14881:     if(did_splicing == YES && saved_splice == NO) {
14882:       last_pos=XmTextGetLastPosition(textWarnClear);
14883:       XmTextInsert(textWarnClear,last_pos, "\n");
14884:       last_pos=XmTextGetLastPosition(textWarnClear);
14885:       XmTextInsert(textWarnClear,last_pos,"  You have done splicing but you have not saved your work.\n");
14886:       last_pos=XmTextGetLastPosition(textWarnClear);
14887:       XmTextInsert(textWarnClear,last_pos,"\n  Your work will be lost if you clear.\n");
14888:       last_pos=XmTextGetLastPosition(textWarnClear);
14889:       XmTextInsert(textWarnClear,last_pos,"  Please verify that you want to clear all data.\n");
14890:       XtManageChild(formWarnClear);
14891:       clear_what = INPUTSPLICERTABLE;
14892:     }
14893:     else {
14894:       SpCleanUp(INPUTSPLICERTABLE);
14895:     }
14896:   }
14897: 
14898:   else if(*pclient == 'D' && have_strat == DO) {
14899:     clear_what = INPUTSTRAT;
14900:   }
14901: 
14902:   else {
14903:     clear_what = CANCEL;
14904:   } 
14905: }
14906: 
14907: void
14908: VerifyExitCB(w, client_data, call_data)
14909:  Widget w;
14910:  XtPointer client_data;
14911:  XtPointer call_data;
14912: {
14913:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14914: 
14915:   XmTextPosition last_pos;
14916: 
14917:   if(have_data == DO) {
14918: 
14919:     if((did_affine == YES && saved_affine == NO) || 
14920:        (have_splice == DO && did_splicing == YES && saved_splice == NO) ||
14921:        (have_strat == DO && did_agemodel == YES && saved_agemodel == NO)) {
14922:       last_pos=XmTextGetLastPosition(textWarnExit);
14923:       XmTextInsert(textWarnExit,last_pos,"\n");
14924:       if(did_affine == YES && saved_affine == NO) {
14925:         last_pos=XmTextGetLastPosition(textWarnExit);
14926:         XmTextInsert(textWarnExit,last_pos,"  You have done compositing but you have not saved your work.\n");
14927:       }
14928:       if(have_splice == DO && did_splicing == YES && saved_splice == NO) {
14929:         last_pos=XmTextGetLastPosition(textWarnExit);
14930:         XmTextInsert(textWarnExit,last_pos,"  You have done splicing but you have not saved your work.\n");
14931:       }
14932:       if(have_strat == DO && did_agemodel == YES && saved_agemodel == NO) {
14933:         last_pos=XmTextGetLastPosition(textWarnExit);
14934:         XmTextInsert(textWarnExit,last_pos,"  You have done agemodelling but you have not saved your work.\n");
14935:       }
14936:  
14937:       last_pos=XmTextGetLastPosition(textWarnExit);
14938:       XmTextInsert(textWarnExit,last_pos,"\n  Your work will be lost if you exit.\n");
14939:       last_pos=XmTextGetLastPosition(textWarnExit);
14940:       XmTextInsert(textWarnExit,last_pos,"  Please verify that you want to exit the program.\n");
14941:       XtManageChild(formWarnExit);
14942:     }
14943:     else {
14944:       XtManageChild(messageBoxExit);
14945:     }
14946:   }
14947:   else {
14948:     XtManageChild(messageBoxExit);
14949:   }
14950: }
14951: 
14952: void
14953: WarnExitOK(w, client_data, call_data)
14954:  Widget w;
14955:  XtPointer client_data;
14956:  XtPointer call_data;
14957: {
14958:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14959: 
14960:   XmTextPosition last_pos;
14961: 
14962:   last_pos=XmTextGetLastPosition(textWarnExit);
14963: 
14964:   XmTextReplace(textWarnExit, 0, last_pos, "");
14965: 
14966:   XtUnmanageChild(formWarnExit);
14967: 
14968:   SpExitCB((Widget)NULL, 0, (XtPointer)NULL);
14969: }
14970: 
14971: void
14972: WarnClearCancel(w, client_data, call_data)
14973:  Widget w;
14974:  XtPointer client_data;
14975:  XtPointer call_data;
14976: {
14977:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14978: 
14979:   XmTextPosition last_pos;
14980: 
14981:   last_pos=XmTextGetLastPosition(textWarnClear);
14982: 
14983:   XmTextReplace(textWarnClear, 0, last_pos, "");
14984: 
14985:   XtUnmanageChild(formWarnClear);
14986: }
14987: 
14988: void
14989: WarnExitCancel(w, client_data, call_data)
14990:  Widget w;
14991:  XtPointer client_data;
14992:  XtPointer call_data;
14993: {
14994:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
14995: 
14996:   XmTextPosition last_pos;
14997: 
14998:   last_pos=XmTextGetLastPosition(textWarnExit);
14999: 
15000:   XmTextReplace(textWarnExit, 0, last_pos, "");
15001:  
15002:   XtUnmanageChild(formWarnExit);
15003: }
15004: 
15005: void
15006: WarnClearOK(w, client_data, call_data)
15007:  Widget w;
15008:  XtPointer client_data;
15009:  XtPointer call_data;
15010: {
15011:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
15012: 
15013:   XmTextPosition last_pos;
15014: 
15015:   last_pos=XmTextGetLastPosition(textWarnClear);
15016: 
15017:   XmTextReplace(textWarnClear, 0, last_pos, "");
15018: 
15019:   XtUnmanageChild(formWarnClear);
15020: 
15021:   /* clear all the data
15022:   */
15023:   SpCleanUp(clear_what);
15024: }
15025: 
15026: void
15027: ExitCB(w, client_data, call_data)
15028:  Widget w;
15029:  XtPointer client_data;
15030:  XtPointer call_data;
15031: {
15032:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
15033: }
15034: 
15035: void
15036: OpenFormatsOtherCancel(w, client_data, call_data)
15037:  Widget w;
15038:  XtPointer client_data;
15039:  XtPointer call_data;
15040: {
15041:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
15042: 
15043:   XtUnmanageChild(formOpenFormatsOther);
15044: }
15045: 
15046: void
15047: OpenFormatsOtherOK(w, client_data, call_data)
15048:  Widget w;
15049:  XtPointer client_data;
15050:  XtPointer call_data;
15051: {
15052:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
15053: 
15054:   XtUnmanageChild(formOpenFormatsOther);
15055: }
15056: 
15057: void
15058: CullActivate(w, client_data, call_data)
15059:  Widget w;
15060:  XtPointer client_data;
15061:  XtPointer call_data;
15062: {
15063:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
15064: }
15065: 
15066: void
15067: DecimateActivate(w, client_data, call_data)
15068:  Widget w;
15069:  XtPointer client_data;
15070:  XtPointer call_data;
15071: {
15072:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
15073: }
15074: 
15075: void
15076: DetrendActivate(w, client_data, call_data)
15077:  Widget w;
15078:  XtPointer client_data;
15079:  XtPointer call_data;
15080: {
15081:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
15082: }
15083: 
15084: void
15085: DataSetActivate(w, client_data, call_data)
15086:  Widget w;
15087:  XtPointer client_data;
15088:  XtPointer call_data;
15089: {
15090:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
15091: 
15092:   int i, k, sm, olddset, oldsplhole, oldsplcore, oldsplarray, newtiehole, newtiecore, newtiearray,
15093:       err, err2, top, bot, hole, core, num,
15094:       spltiecore, spl_last_core_exist;
15095:   char *pclient = (char*) client_data;
15096:   char idstring[100], string[20], *str;
15097:   char spltiename;
15098:   float depth, diff, checkdepth, chlow, chhigh, raw_val, sm_val, *var_val, var,
15099:         avedep, avedep1, avedep2, spltiedepth;
15100:   XmString xmstring;
15101:   int  MakeSplice(), FindValueInCoreToSplice(), FindAveDepth();
15102:   void SetMinMax(), DrawDrawingAreaEdit(), DrawDrawingAreaView(), DrawDrawingAreaDepthOffset(), PlotSpliceVsAge(), 
15103:        WaitCursor(), TieCorrelate(), SpliceCorrelate();
15104: 
15105:   WaitCursor(DEFINEWAITCURSOR);
15106: 
15107:   olddset = dset;
15108: 
15109:   if(*pclient == '1') {
15110:     dset = 0;
15111:   }
15112:   else if(*pclient == '2') {
15113:     dset = 1;
15114:   }
15115:   else if(*pclient == '3') {
15116:     dset = 2;
15117:   }
15118:   else if(*pclient == '4') {
15119:     dset = 3;
15120:   }
15121:   else if(*pclient == '5') {
15122:     dset = 4;
15123:   }
15124:   else if(*pclient == '6') {
15125:     dset = 5;
15126:   }
15127:   else if(*pclient == '7') {
15128:     dset = 6;
15129:   }
15130:   else if(*pclient == '8') {
15131:     dset = 7;
15132:   }
15133:   else if(*pclient == '9') {
15134:     dset = 8;
15135:   }
15136:   else {
15137:   }
15138: 
15139:   /* if are composing and have a tie find the nearest
15140:      sample for tie in new dataset
15141:   */
15142:   if(are_compositing == YES) {
15143:     if(have_tie1 == YES) {
15144:       /* check that tie1 hole and core exists in new datset
15145:       */
15146:       newtiehole = -1;
15147:       for(i=0; i<data[dset]->numholes; ++i) {
15148:         if(data[dset]->holes[i]->name == data[olddset]->holes[tie1holenum]->name) {
15149:           newtiehole = i;
15150:         }
15151:       }
15152:       if(newtiehole == -1) {
15153:         have_tie1 = DONT;
15154:       }
15155:       else {
15156:         newtiecore = -1;
15157:         for(i=0; i<data[dset]->holes[newtiehole]->numcores; ++i) {
15158:           if(data[dset]->holes[newtiehole]->core[i]->num == data[olddset]->holes[tie1holenum]->core[tie1corenum]->num) {
15159:             newtiecore = i;
15160:           }
15161:         }
15162:         if(newtiecore == -1) {
15163:           have_tie1 = DONT;
15164:         }
15165:         else {
15166:           newtiearray = -1;
15167:           depth = data[olddset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->sb_depth;
15168:           diff = 99999.0; 
15169:           for(i=0; i<data[dset]->holes[newtiehole]->core[newtiecore]->numvalues; ++i) {
15170:             if(data[dset]->holes[newtiehole]->core[newtiecore]->value[i]->quality != GOOD) {
15171:             }
15172:             else {
15173:               checkdepth = depth - data[dset]->holes[newtiehole]->core[newtiecore]->value[i]->sb_depth;
15174:               if(fabs(checkdepth) < diff) {
15175:                 diff = fabs(checkdepth);
15176:                 newtiearray = i;
15177:               }
15178:             }
15179:           }
15180:           if(newtiearray == -1) {
15181:             have_tie1 = DONT;
15182:           }
15183:           else {
15184:             tie1holenum = newtiehole;
15185:             tie1corenum = newtiecore;
15186:             tie1arraynum = newtiearray;
15187:           }
15188:         }
15189:       }
15190:       if(have_tie1 == DO) {
15191:         var_val = data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->data;
15192:         depth = data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->sb_depth +
15193:                 data[dset]->holes[tie1holenum]->core[tie1corenum]->cum_dep_offset;
15194:         (void)sprintf(idstring,"%d %c %d %c %s  %.1f    %.2f",
15195:                        data[dset]->site,
15196:                        data[dset]->holes[tie1holenum]->name,
15197:                        data[dset]->holes[tie1holenum]->core[tie1corenum]->num,
15198:                        data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->type,
15199:                        data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->section,
15200:                        data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->top_int,
15201:                        data[dset]->holes[tie1holenum]->core[tie1corenum]->value[tie1arraynum]->sb_depth);
15202:         xmstring = XmStringCreateSimple(idstring);
15203:         XtVaSetValues(labelTie1ID, XmNlabelString, xmstring, NULL);
15204:         XmStringFree(xmstring);
15205:         (void)sprintf(string, "%.2f", *var_val);
15206:         xmstring = XmStringCreateSimple(string);
15207:         XtVaSetValues(labelTie1var, XmNlabelString, xmstring, NULL);
15208:         XmStringFree(xmstring);
15209:         (void)sprintf(string, "%.2f", depth);
15210:         xmstring = XmStringCreateSimple(string);
15211:         XtVaSetValues(labelTie1sbd, XmNlabelString, xmstring, NULL);
15212:         XmStringFree(xmstring);
15213:       }
15214:       else {
15215:         xmstring = XmStringCreateSimple("");
15216:         XtVaSetValues(labelTie1ID, XmNlabelString, xmstring, NULL);
15217:         XtVaSetValues(labelTie1var, XmNlabelString, xmstring, NULL);
15218:         XtVaSetValues(labelTie1sbd, XmNlabelString, xmstring, NULL);
15219:         XmStringFree(xmstring);
15220:       }
15221:     }
15222:     if(have_tie2 == YES) {
15223:       /* check that tie1 hole and core exists in new datset
15224:       */
15225:       newtiehole = -1;
15226:       for(i=0; i<data[dset]->numholes; ++i) {
15227:         if(data[dset]->holes[i]->name == data[olddset]->holes[tie2holenum]->name) {
15228:           newtiehole = i;
15229:         }
15230:       }
15231:       if(newtiehole == -1) {
15232:         have_tie2 = DONT;
15233:       }
15234:       else {
15235:         newtiecore = -1;
15236:         for(i=0; i<data[dset]->holes[newtiehole]->numcores; ++i) {
15237:           if(data[dset]->holes[newtiehole]->core[i]->num == data[olddset]->holes[tie2holenum]->core[tie2corenum]->num) {
15238:             newtiecore = i;
15239:           }
15240:         }
15241:         if(newtiecore == -1) {
15242:           have_tie2 = DONT;
15243:         }
15244:         else {
15245:           newtiearray = -1;
15246:           depth = data[olddset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->sb_depth;
15247:           diff = 99999.0;
15248:           for(i=0; i<data[dset]->holes[newtiehole]->core[newtiecore]->numvalues; ++i) {
15249:             if(data[dset]->holes[newtiehole]->core[newtiecore]->value[i]->quality != GOOD) {
15250:             }
15251:             else {
15252:               checkdepth = depth - data[dset]->holes[newtiehole]->core[newtiecore]->value[i]->sb_depth;
15253:               if(fabs(checkdepth) < diff) {
15254:                 diff = fabs(checkdepth);
15255:                 newtiearray = i;
15256:               }
15257:             }
15258:           }
15259:           if(newtiearray == -1) {
15260:             have_tie2 = DONT;
15261:           }
15262:           else {
15263:             tie2holenum = newtiehole;
15264:             tie2corenum = newtiecore;
15265:             tie2arraynum = newtiearray;
15266:           }
15267:         }
15268:       }
15269:       if(have_tie2 == DO) {
15270:         var_val = data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->data;
15271:         depth = data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->sb_depth +
15272:                 data[dset]->holes[tie2holenum]->core[tie2corenum]->cum_dep_offset;
15273:         (void)sprintf(idstring,"%d %c %d %c %s  %.1f    %.2f",
15274:                        data[dset]->site,
15275:                        data[dset]->holes[tie2holenum]->name,
15276:                        data[dset]->holes[tie2holenum]->core[tie2corenum]->num,
15277:                        data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->type,
15278:                        data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->section,
15279:                        data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->top_int,
15280:                        data[dset]->holes[tie2holenum]->core[tie2corenum]->value[tie2arraynum]->sb_depth);
15281:         xmstring = XmStringCreateSimple(idstring);
15282:         XtVaSetValues(labelTie2ID, XmNlabelString, xmstring, NULL);
15283:         XmStringFree(xmstring);
15284:         (void)sprintf(string, "%.2f", *var_val);
15285:         xmstring = XmStringCreateSimple(string);
15286:         XtVaSetValues(labelTie2var, XmNlabelString, xmstring, NULL);
15287:         XmStringFree(xmstring);
15288:         (void)sprintf(string, "%.2f", depth);
15289:         xmstring = XmStringCreateSimple(string);
15290:         XtVaSetValues(labelTie2sbd, XmNlabelString, xmstring, NULL);
15291:         XmStringFree(xmstring);
15292:       }
15293:       else {
15294:         xmstring = XmStringCreateSimple("");
15295:         XtVaSetValues(labelTie2ID, XmNlabelString, xmstring, NULL);
15296:         XtVaSetValues(labelTie2var, XmNlabelString, xmstring, NULL);
15297:         XtVaSetValues(labelTie2sbd, XmNlabelString, xmstring, NULL);
15298:         XmStringFree(xmstring);
15299:       }
15300:     }
15301:     if(have_tie1 == DO && have_tie2 == DO) {
15302:       have_shift = DO;
15303:       /* calculate the average depth step for current
15304:          'tied' cores. and set the text fields with
15305:          ave depth step, default window length
15306:          and lead,lag
15307:       */
15308:       err = FindAveDepth(tie1holenum, tie1corenum, &avedep1);
15309:       err2 = FindAveDepth(tie2holenum, tie2corenum, &avedep2);
15310:       if(err > 1 || err2 > 1) {
15311:         avedep = 0.05;
15312:       }
15313:       else {
15314:         avedep = (avedep1 + avedep2)/2.0;
15315:       }
15316: 
15317:       /* set the text field with ave depth
15318:       */
15319:       str = XmTextGetString(textFieldTieDepthStep);
15320:       (void)sprintf(string, "%.2f", avedep);
15321:       if((int)strcmp(str, string) != 0) {
15322:         XtVaSetValues(textFieldTieDepthStep, XmNvalue, string, NULL);
15323:       }
15324:       XtFree(str);
15325: 
15326:       /* make clear and correlate buttons sensitive
15327:       */
15328:       XtSetSensitive(pushButtonTieClear, True);
15329:       XtSetSensitive(pushButtonTieCorrelation, True);
15330:       XtSetSensitive(pushButtonTieShift, True);
15331:       XtVaSetValues(pushButtonTieShift, XmNborderWidth, 1, NULL);
15332:       XtSetSensitive(textFieldTieAdjustDepth, True);
15333:       XtSetSensitive(toggleButtonTieShiftBestCorr, True);
15334:       XtSetSensitive(toggleButtonTieShiftTie, True);
15335:       XtSetSensitive(toggleButtonTieShiftGiven, True);
15336:       XtSetSensitive(toggleButtonTieShiftAll, True);
15337:       XtSetSensitive(toggleButtonTieShiftCore, True);
15338:       XtSetSensitive(pushButtonTieShiftUndo, False);
15339:       XtSetSensitive(toggleButtonTieUndoLast, False);
15340:       XtSetSensitive(toggleButtonTieUndoAll, False);
15341: 
15342:       /* set the toggles back to defaults
15343:       */
15344:       XmToggleButtonSetState(toggleButtonTieShiftBestCorr, True, NULL);
15345:       XmToggleButtonSetState(toggleButtonTieShiftTie, False, NULL);
15346:       XmToggleButtonSetState(toggleButtonTieShiftGiven, False, NULL);
15347:       XmToggleButtonSetState(toggleButtonTieShiftAll, True, NULL);
15348:       XmToggleButtonSetState(toggleButtonTieShiftCore, False, NULL);
15349: 
15350:       TieCorrelate((Widget)NULL, (XtPointer)NULL, (XtPointer)NULL);
15351:     }
15352:     else {
15353:       have_shift = DONT;
15354: 
15355:       XtSetSensitive(pushButtonTieClear, FALSE);
15356:       XtSetSensitive(pushButtonTieCorrelation, FALSE);
15357:       XtSetSensitive(pushButtonTieShift, FALSE);
15358:       XtVaSetValues(pushButtonTieShift, XmNborderWidth, 1, NULL);
15359:       XtSetSensitive(textFieldTieAdjustDepth, False);
15360:       XtSetSensitive(toggleButtonTieShiftBestCorr, False);
15361:       XtSetSensitive(toggleButtonTieShiftTie, False);
15362:       XtSetSensitive(toggleButtonTieShiftGiven, False);
15363:       XtSetSensitive(toggleButtonTieShiftAll, False);
15364:       XtSetSensitive(toggleButtonTieShiftCore, False);
15365:       if(have_tie1 == DO || have_tie2 == DO) {
15366:         XtSetSensitive(pushButtonTieShiftUndo, False);
15367:         XtSetSensitive(toggleButtonTieUndoLast, False);
15368:         XtSetSensitive(toggleButtonTieUndoAll, False);
15369:       }
15370:     }
15371:   }
15372: 
15373:   /* if have the splice table make the splice for new data set
15374:      and if have a tie point in the splice save its hole name,
15375:      core number and depth
15376:   */
15377:   if(have_splice == DO) {
15378:     if(are_splicing > NO && spcomp.numcores > 0) {
15379:       spltiename = data[olddset]->holes[spcomp.hole[spcomp.numcores-1]]->name;
15380:       spltiecore = data[olddset]->holes[spcomp.hole[spcomp.numcores-1]]->core[spcomp.core[spcomp.numcores-1]]->num;
15381:       if(have_sp_tie1 == DO) {
15382:         spltiedepth = spcomp.sb_depth[spcomp.numcores-1][spcomparraynum];
15383:       }
15384:       if(have_sp_tie2 == DO) {
15385:         oldsplhole = spliceholenum;
15386:         oldsplcore = splicecorenum;
15387:         oldsplarray = splicearraynum;
15388:       }
15389:     }
15390:     MakeSplice(dset, &spcomp);
15391:   }
15392:     
15393:     
15394:   /* if are splicing and have a core to splice
15395:   */
15396:   if(have_splice == DO && are_splicing > NO && have_core_to_splice == DO) {
15397: 
15398:     /* for current data set does the last core of splice exist
15399:     */
15400:     if(spcomp.numcores > 0) {
15401:       hole = spcomp.hole[spcomp.numcores-1];
15402:       core = spcomp.core[spcomp.numcores-1];
15403:       if(data[dset]->holes[hole]->name == spltiename &&
15404:          data[dset]->holes[hole]->core[core]->num == spltiecore) {
15405:         spcompcorenum = spcomp.numcores-1;
15406:         spl_last_core_exist = YES;
15407:       }
15408:       else {
15409:         spl_last_core_exist = NO;
15410:       }
15411:     }
15412:     else {
15413:       spl_last_core_exist = NO;
15414:     }
15415: 
15416:     /* for current data set does core to splice exist
15417:     */
15418:     if(have_core_to_splice == DO) {
15419:       newtiehole = -1;
15420:       for(i=0; i<data[dset]->numholes; ++i) {
15421:         if(data[dset]->holes[i]->name == data[olddset]->holes[spliceholenum]->name) {
15422:           newtiehole = i;
15423:           break;
15424:         }
15425:       }
15426:       if(newtiehole == -1) {
15427:         have_core_to_splice = DONT;
15428:       }
15429:       else {
15430:         spliceholenum = newtiehole;
15431:         newtiecore = -1;
15432:         for(i=0; i<data[dset]->holes[newtiehole]->numcores; ++i) {
15433:           if(data[dset]->holes[newtiehole]->core[i]->num ==
15434:                                data[olddset]->holes[spliceholenum]->core[splicecorenum]->num) {
15435:             newtiecore = i;
15436:             break;
15437:           }
15438:         }
15439:         if(newtiecore == -1) {
15440:           have_core_to_splice = DONT;
15441:         }
15442:         else {
15443:           splicecorenum = newtiecore;
15444:         }
15445:       }
15446:     }
15447:     else {
15448:     }
15449: 
15450:     /* check for overlap, if none allow append
15451:     */
15452:     if(have_core_to_splice == DO && spl_last_core_exist == YES) {
15453:       i = 0;
15454:       while(data[dset]->holes[spliceholenum]->core[splicecorenum]->value[i]->quality != GOOD &&
15455:             i < data[dset]->holes[spliceholenum]->core[splicecorenum]->numvalues-1) {
15456:         ++i;
15457:       }
15458:       depth = data[dset]->holes[spliceholenum]->core[splicecorenum]->value[i]->sb_depth +
15459:                data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset;
15460:       if(depth <= spcomp.sb_depth[spcomp.numcores-1][spcomp.numpercore[spcomp.numcores-1]-1]) {
15461:         if(ALLOWAPPENDOVERLAP + depth >= spcomp.sb_depth[spcomp.numcores-1][spcomp.numpercore[spcomp.numcores-1]-1]) {
15462:           XtSetSensitive(pushButtonAppendSplice, True);
15463:           XtVaSetValues(pushButtonAppendSplice, XmNborderWidth, 1, NULL);
15464:           splice_overlap = OVERLAPAPPEND;
15465:         }
15466:         else {
15467:           XtSetSensitive(pushButtonAppendSplice, False);
15468:           XtVaSetValues(pushButtonAppendSplice, XmNborderWidth, 0, NULL);
15469:           splice_overlap = YES;
15470:         }
15471:       }
15472:       else {
15473:         XtSetSensitive(pushButtonAppendSplice, True);
15474:         XtVaSetValues(pushButtonAppendSplice, XmNborderWidth, 1, NULL);
15475:         splice_overlap = NO;
15476:         have_sp_tie1 = DONT;
15477:         have_sp_tie2 = DONT;
15478:       }
15479:     }
15480:     else if(have_core_to_splice == DONT || spl_last_core_exist == NO) {
15481:       have_sp_tie1 = DONT;
15482:       have_sp_tie2 = DONT;
15483:       XtSetSensitive(pushButtonAppendSplice, False);
15484:       XtVaSetValues(pushButtonAppendSplice, XmNborderWidth, 0, NULL);
15485:     }
15486: 
15487:     if(have_sp_tie1 == DO && spl_last_core_exist == YES) {
15488:       newtiearray = -1;
15489:       diff = 99999.0;
15490:       for(i=0; i<spcomp.numpercore[spcompcorenum]; ++i) {
15491:         checkdepth = spltiedepth - spcomp.sb_depth[spcompcorenum][i];
15492:         if(fabs(checkdepth) < diff) {
15493:           diff = fabs(checkdepth);
15494:           newtiearray = i;
15495:         }
15496:       }
15497:       if(newtiearray == -1) {
15498:         have_sp_tie1 = DONT;
15499:       }
15500:       else {
15501:         spcomparraynum = newtiearray;
15502:         spltiedepth = spcomp.sb_depth[spcompcorenum][spcomparraynum];
15503:       }
15504:     }
15505:     else {
15506:       have_sp_tie1 = DONT;
15507:     }
15508: 
15509:     if(are_splicing == CONSTRAINED && have_sp_tie1 == DONT) {
15510:       have_sp_tie2 == DONT;
15511:     }
15512:     else if(have_sp_tie2 == DO && have_core_to_splice == DO) {
15513: 
15514:       newtiearray = -1;
15515:       if(are_splicing == CONSTRAINED) {
15516:         top = -1;
15517:         bot = -1;
15518:         for(k=0; k<data[dset]->holes[spliceholenum]->core[splicecorenum]->numvalues; ++k){
15519:           if(data[dset]->holes[spliceholenum]->core[splicecorenum]->value[k]->quality == GOOD) {
15520:             top = k;
15521:             break;
15522:           }
15523:         }
15524:         for(k=data[dset]->holes[spliceholenum]->core[splicecorenum]->numvalues-1; k>=0; --k){
15525:           if(data[dset]->holes[spliceholenum]->core[splicecorenum]->value[k]->quality == GOOD) {
15526:             bot = k;
15527:             break;
15528:           }
15529:         }
15530:         if(top != -1 && bot != -1) {
15531:           chlow=data[dset]->holes[spliceholenum]->core[splicecorenum]->value[top]->sb_depth +
15532:                              data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset;
15533:           chhigh= data[dset]->holes[spliceholenum]->core[splicecorenum]->value[bot]->sb_depth +
15534:                              data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset;
15535:         }
15536: 
15537:         if(top == -1 || bot == -1) {
15538:           have_sp_tie1 = DONT;
15539:           have_sp_tie2 = DONT;
15540:         }
15541:         else if(chlow >= chhigh) {
15542:           have_sp_tie1 = DONT;
15543:           have_sp_tie2 = DONT;
15544:         }
15545:         else if(spltiedepth < chlow || spltiedepth > chhigh){
15546:           have_sp_tie1 = DONT;
15547:           have_sp_tie2 = DONT;
15548:           (void)sprintf(buffer,"Warning: For current data set the tie in the splice no longer overlaps the core to splice.");
15549:           SpManageWarningBox(buffer);
15550:         }
15551:         else {
15552: 
15553:           if(smooth.plot == NONE || smooth.plot == UNSMOOTHED){
15554:             sm = NO;
15555:           }
15556:           else if((smooth.method == GAUSSIAN || smooth.method == OTHER) &&
15557:                   (smooth.plot == SMOOTHED || smooth.plot == SMOOTHEDBOTH)){
15558:             sm = YES;
15559:           }
15560:           else {
15561:             sm = NO;
15562:           }
15563: 
15564:           /* note that if find real value at 'depth' then splicearraynum comes back
15565:              with indicy of real point. but if interpolated a point then splicearraynum
15566:              is the indicy of next real point.
15567:           */
15568:           err = FindValueInCoreToSplice(dset, sm, spltiedepth, spliceholenum, splicecorenum,
15569:                                 &newtiearray, &splice_how, &raw_val, &sm_val);
15570:           if(err != 0 || newtiearray == -1) {
15571:             have_sp_tie1 = DONT;
15572:             have_sp_tie2 = DONT;
15573:           }
15574:           else if(err == 0) {
15575:             splicearraynum = newtiearray;
15576:             have_sp_tie2 = YES;
15577:             interpsplice_val = raw_val;
15578:             interpsplice_sm_val = sm_val;
15579:             interpsplice_spl_depth = spltiedepth;
15580:           }
15581:         }
15582:       }
15583:       else if(are_splicing == UNCONSTRAINED && have_core_to_splice == DO) {
15584:         diff = 99999.0;
15585:         depth = data[olddset]->holes[oldsplhole]->core[oldsplcore]->value[oldsplarray]->sb_depth +
15586:                 data[olddset]->holes[oldsplhole]->core[oldsplcore]->cum_dep_offset;
15587:         for(i=0; i<data[dset]->holes[spliceholenum]->core[splicecorenum]->numvalues; ++i){
15588:           if(data[dset]->holes[spliceholenum]->core[splicecorenum]->value[i]->quality != GOOD){
15589:           }
15590:           else {
15591:             checkdepth = depth - (data[dset]->holes[spliceholenum]->core[splicecorenum]->value[i]->sb_depth +
15592:                             data[dset]->holes[spliceholenum]->core[splicecorenum]->cum_dep_offset);
15593:             if(fabs(checkdepth) < diff) {
15594:               diff = fabs(checkdepth);
15595:               newtiearray= i;
15596:             }
15597:           }
15598:         }
15599:         if(newtiearray == 0) {
15600:           have_sp_tie1 = DONT;
15601:           have_sp_tie2 = DONT;
15602:         }
15603:         else {
15604:           splicearraynum = newtiearray;
15605:           have_sp_tie2 = YES;
15606:           splice_how = REAL;
15607:         }
15608:       }
15609:     }
15610:     else {
15611:       have_sp_tie2 = DONT;
15612:     }
15613: 
15614:     if(have_sp_tie1 == DO) {
15615:       hole = spcomp.hole[spcompcorenum];
15616:       core = spcomp.core[spcompcorenum];
15617:       num =  spcomp.MapToOrig[spcompcorenum][spcomparraynum];
15618:       depth = spcomp.sb_depth[spcompcorenum][spcomparraynum];
15619:       var = spcomp.var[spcompcorenum][spcomparraynum];
15620:       (void)sprintf(idstring,"%d %c %d %c %s  %.1f    %.2f",
15621:                      data[dset]->site,
15622:                      data[dset]->holes[hole]->name,
15623:                      data[dset]->holes[hole]->core[core]->num,
15624:                      data[dset]->holes[hole]->core[core]->value[num]->type,
15625:                      data[dset]->holes[hole]->core[core]->value[num]->section,
15626:                      data[dset]->holes[hole]->core[core]->value[num]->top_int,
15627:                      data[dset]->holes[hole]->core[core]->value[num]->sb_depth);
15628:       xmstring = XmStringCreateSimple(idstring);
15629:       XtVaSetValues(labelSpliceTie1ID, XmNlabelString, xmstring, NULL);
15630:       XmStringFree(xmstring);
15631:       (void)sprintf(string, "%.2f", var);
15632:       xmstring = XmStringCreateSimple(string);
15633:       XtVaSetValues(labelSpliceTie1var, XmNlabelString, xmstring, NULL);
15634:       XmStringFree(xmstring);
15635:       (void)sprintf(string, "%.2f", depth);
15636:       xmstring = XmStringCreateSimple(string);
15637:       XtVaSetValues(labelSpliceTie1sbd, XmNlabelString, xmstring, NULL);
15638:       XmStringFree(xmstring);
15639:     }
15640:     else {
15641:       xmstring = XmStringCreateSimple("");
15642:       XtVaSetValues(labelSpliceTie1ID, XmNlabelString, xmstring, NULL);
15643:       XtVaSetValues(labelSpliceTie1var, XmNlabelString, xmstring, NULL);
15644:       XtVaSetValues(labelSpliceTie1sbd, XmNlabelString, xmstring, NULL);
15645:       XmStringFree(xmstring);
15646:     }
15647:     if(have_sp_tie2 == DO) {
15648:       hole = spliceholenum;
15649:       core = splicecorenum;
15650:       num =  splicearraynum;
15651:       if(splice_how == INTERPOLATED){
15652:         (void)sprintf(idstring,"%d %c %d %c    interpolated",
15653:                      data[dset]->site,
15654:                      data[dset]->holes[hole]->name,
15655:                      data[dset]->holes[hole]->core[core]->num,
15656:                      data[dset]->holes[hole]->core[core]->value[num]->type);
15657:         depth = interpsplice_spl_depth;
15658:         var = interpsplice_val;
15659:       }
15660:       else if(splice_how == REAL) {
15661:         depth = (data[dset]->holes[hole]->core[core]->value[num]->sb_depth +
15662:                           data[dset]->holes[hole]->core[core]->cum_dep_offset);
15663:         var = *data[dset]->holes[hole]->core[core]->value[num]->data;
15664:         (void)sprintf(idstring,"%d %c %d %c %s  %.1f    %.2f",
15665:                      data[dset]->site,
15666:                      data[dset]->holes[hole]->name,
15667:                      data[dset]->holes[hole]->core[core]->num,
15668:                      data[dset]->holes[hole]->core[core]->value[num]->type,
15669:                      data[dset]->holes[hole]->core[core]->value[num]->section,
15670:                      data[dset]->holes[hole]->core[core]->value[num]->top_int,
15671:                      data[dset]->holes[hole]->core[core]->value[num]->sb_depth);
15672:       }
15673:       xmstring = XmStringCreateSimple(idstring);
15674:       XtVaSetValues(labelSpliceTie2ID, XmNlabelString, xmstring, NULL);
15675:       XmStringFree(xmstring);
15676:       (void)sprintf(string, "%.2f", var);
15677:       xmstring = XmStringCreateSimple(string);
15678:       XtVaSetValues(labelSpliceTie2var, XmNlabelString, xmstring, NULL);
15679:       XmStringFree(xmstring);
15680:       (void)sprintf(string, "%.2f", depth);
15681:       xmstring = XmStringCreateSimple(string);
15682:       XtVaSetValues(labelSpliceTie2sbd, XmNlabelString, xmstring, NULL);
15683:       XmStringFree(xmstring);
15684:     }
15685:     else {
15686:       xmstring = XmStringCreateSimple("");
15687:       XtVaSetValues(labelSpliceTie2ID, XmNlabelString, xmstring, NULL);
15688:       XtVaSetValues(labelSpliceTie2var, XmNlabelString, xmstring, NULL);
15689:       XtVaSetValues(labelSpliceTie2sbd, XmNlabelString, xmstring, NULL);
15690:       XmStringFree(xmstring);
15691:     }
15692: 
15693:     if(have_sp_tie1 == DO && have_sp_tie2 == DO) {
15694: 
15695:       have_splice_tie = DO;
15696:       have_splice_shift = DO;
15697: 
15698:       /* calculate the average depth step for current
15699:          'tied' cores. and set the text fields with
15700:           ave depth step, default window length
15701:           and lead,lag
15702:       */
15703:       err = FindAveDepth(spcomp.hole[spcompcorenum], spcomp.core[spcompcorenum], &avedep1);
15704:       err2 = FindAveDepth(spliceholenum, splicecorenum, &avedep2);
15705:       if(err > 1 || err2 > 1) {
15706:         avedep = 0.05;
15707:       }
15708:       else {
15709:         avedep = (avedep1 + avedep2)/2.0;
15710:       }
15711: 
15712:       /* set the text field with ave depth
15713:       */
15714:       str = XmTextGetString(textCompDepthStep);
15715:       (void)sprintf(string, "%.2f", avedep);
15716:       if((int)strcmp(str, string) != 0) {
15717:         XtVaSetValues(textCompDepthStep, XmNvalue, string, NULL);
15718:       } 
15719:       XtFree(str);
15720: 
15721:      /* calculate the difference in value at the tie (tie1 - tie2) and write it to text
15722:       */
15723:       diff = spcomp.var[spcompcorenum][spcomparraynum] - interpsplice_val;
15724:       (void)sprintf(string, "%.2f", diff);
15725:       xmstring = XmStringCreateSimple(string);
15726:       XtVaSetValues(labelSpliceDifferenceInValue, XmNlabelString, xmstring, NULL);
15727:       XmStringFree(xmstring);
15728: 
15729:       /* make the clear tie and correlate buttons sensitive
15730:          and the grab core insensitive. should not be able
15731:          to grab another core until clear tie or splice
15732:       */
15733:       XtSetSensitive(pushButtonClearGrab, False);
15734:       XtSetSensitive(pushButtonSpliceClearTie, True);
15735:       XtSetSensitive(pushButtonSpliceCorrelate, True);
15736:       XtSetSensitive(pushButtonGetSelectCore, False);
15737:       XtSetSensitive(pushButtonSuggestTies, False);
15738:       XtSetSensitive(pushButtonSpliceToTie, True);
15739:       XtVaSetValues(pushButtonSpliceToTie, XmNborderWidth, 1, NULL);
15740:       XtSetSensitive(pushButtonSpliceUndoLast, False);
15741: 
15742:       SpliceCorrelate((Widget)NULL, (XtPointer)NULL, (XtPointer)NULL);
15743:     }
15744:     else {
15745:       have_splice_tie = DONT;
15746:       have_splice_shift = DONT;
15747:       have_spcorr = DONT;
15748: 
15749:       XtSetSensitive(pushButtonSpliceClearTie, False);
15750:       XtSetSensitive(pushButtonSpliceCorrelate, False);
15751:       XtSetSensitive(pushButtonGetSelectCore, True);
15752:       XtSetSensitive(pushButtonSuggestTies, False);
15753:       XtSetSensitive(pushButtonSpliceToTie, False);
15754:       XtVaSetValues(pushButtonSpliceToTie, XmNborderWidth, 0, NULL);
15755:       if(have_core_to_splice == DO) {
15756:         XtSetSensitive(pushButtonClearGrab, True);
15757:         XtSetSensitive(pushButtonSpliceUndoLast, False);
15758:       }
15759:       else if(have_core_to_splice == DONT) {
15760:         XtSetSensitive(pushButtonClearGrab, False);
15761:         XtSetSensitive(pushButtonSpliceUndoLast, True);
15762:       }
15763: 
15764:       /* and clear the correlation window
15765:       */
15766:       if(XtIsManaged(XtParent(drawingAreaCompCorrelation))) {
15767:         XClearWindow(XtDisplay(drawingAreaCompCorrelation),
15768:                   XtWindow(drawingAreaCompCorrelation));
15769:       }
15770:     }
15771:   }
15772: 
15773:   else if(have_splice == DO && are_splicing > NO && have_core_to_splice == DONT) {
15774:     have_sp_tie1 = DONT;
15775:     have_sp_tie2 = DONT;
15776:     have_splice_tie = DONT;
15777:     have_splice_shift = DONT;
15778:     have_spcorr = DONT;
15779: 
15780:     XtSetSensitive(pushButtonClearGrab, False);
15781:     XtSetSensitive(pushButtonSpliceClearTie, False);
15782:     XtSetSensitive(pushButtonSpliceCorrelate, False);
15783:     XtSetSensitive(pushButtonGetSelectCore, True);
15784:     XtSetSensitive(pushButtonAppendSplice, False);
15785:     XtVaSetValues(pushButtonAppendSplice, XmNborderWidth, 0, NULL);
15786:     XtSetSensitive(pushButtonSuggestTies, False);
15787:     XtSetSensitive(pushButtonSpliceToTie, False);
15788:     XtVaSetValues(pushButtonSpliceToTie, XmNborderWidth, 0, NULL);
15789:     XtSetSensitive(pushButtonSpliceUndoLast, True);
15790: 
15791:     /* and clear the correlation window
15792:     */
15793:     if(XtIsManaged(XtParent(drawingAreaCompCorrelation))) {
15794:       XClearWindow(XtDisplay(drawingAreaCompCorrelation),
15795:                   XtWindow(drawingAreaCompCorrelation));
15796:     }
15797:   }
15798: 
15799:   SetMinMax(dset);
15800: 
15801:   if(data[dset]->numholes > 1) {
15802:     XtSetSensitive(pushButtonComposite,True);
15803:     XtSetSensitive(cascadeButtonSplice,True);
15804:   }
15805:   else {
15806:     XtSetSensitive(pushButtonComposite, False);
15807:     XtSetSensitive(cascadeButtonSplice, False);
15808:   }
15809: 
15810:   if(XtIsManaged(XtParent(drawingAreaEdit))) {
15811:       reason_for_redraw = DRAW_EVERYTHING;
15812:       DrawDrawingAreaEdit(drawingAreaEdit, (XtPointer)NULL, (XtPointer)NULL);
15813:   }
15814: 
15815:   if(have_splice == DO) {
15816:     if(XtIsManaged(XtParent(drawingAreaView))) {
15817:       reason_for_redraw = DRAW_EVERYTHING;
15818:       DrawDrawingAreaView(drawingAreaView, (XtPointer)NULL, (XtPointer)NULL);
15819:     }
15820:   }
15821: 
15822:   /* draw the depth offsets
15823:   */
15824:   if(draw_offsets == YES){
15825:     if(XtIsManaged(XtParent(drawingAreaDepthOffset))) {
15826:       DrawDrawingAreaDepthOffset(drawingAreaDepthOffset, (XtPointer)NULL, (XtPointer)NULL);
15827:     }
15828:   }
15829: 
15830:   if(are_agemodelling == YES) {
15831:     if(have_time_series == DO) {
15832:       have_splicetoage_tie = DONT;
15833:       have_timeseries_tie = DONT;
15834:     }
15835:     PlotSpliceVsAge(NO);
15836:   }
15837: 
15838:   WaitCursor(FREEWAITCURSOR);
15839: }
15840: 
15841: void
15842: SmoothActivate(w, client_data, call_data)
15843:  Widget w;
15844:  XtPointer client_data;
15845:  XtPointer call_data;
15846: {
15847:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
15848: }
15849: 
15850: void
15851: OpenAgeSignal(w, client_data, call_data)
15852:  Widget w;
15853:  XtPointer client_data;
15854:  XtPointer call_data;
15855: {
15856:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
15857: 
15858:   int  len;
15859:   char *str, *path;
15860:   XmString xmstring;
15861: 
15862:   void SpUpdateFileSelection();
15863: 
15864:   XtManageChild(formFileSelection);
15865:   XtPopup(XtParent(formFileSelection),XtGrabNone);
15866:   xmstring=XmCvtCTToXmString("Read");
15867:   XtVaSetValues(pushButtonFileSelectionOK,XmNlabelString,xmstring,NULL);
15868:   XmStringFree(xmstring);
15869: 
15870:   fileselection = OPENTIMESERIES;
15871: 
15872:   XtVaSetValues(xmDialogShellFileSelection, XmNtitle, "Open Time Series", NULL);
15873:   XtVaSetValues(textFileSelectionSelected, XmNvalue, "", NULL);
15874:   XtManageChild(formFileSelectionTimeSeries);
15875:   XtVaSetValues(formFileSelectionTimeSeries, XmNmappedWhenManaged, True, NULL);
15876:   XtVaSetValues(XtParent(formFileSelection), XmNheight, 720, NULL);
15877: 
15878:   XmToggleButtonSetState(toggleButtonTimeSeriesAgeMa,False,False);
15879:   XmToggleButtonSetState(toggleButtonTimeSeriesAgeKyr,True,False);
15880:   XmToggleButtonSetState(toggleButtonTimeSeriesAgeYrs,False,False);
15881:   XmToggleButtonSetState(toggleButtonTimeSeriesInvertNo,True,False);
15882:   XmToggleButtonSetState(toggleButtonTimeSeriesInvertYes,False,False);
15883:   XtVaSetValues(textFieldTimeSeriesToAge, XmNvalue, "", NULL);
15884:   XtVaSetValues(textFieldTimeSeriesFromAge, XmNvalue, "0.0", NULL);
15885:   XtVaSetValues(textFieldTimeSeriesAgeCol, XmNvalue, "1", NULL);
15886:   XtVaSetValues(textFieldTimeSeriesValCol, XmNvalue, "2", NULL);
15887: 
15888:   if((path=(char*)calloc((int)strlen(timeseries.dirname)+1000,CHAR_SIZE))==NULL)
15889:                                 SpBadMemAlloc("SelectTimeSeriesFileName");
15890:   (void)sprintf(path, "%s", timeseries.dirname);
15891: 
15892:   len = (int)strlen(path);
15893:   if(strcmp(&path[len-1], "/") == 0) {
15894:     *strrchr(path,'/')= '\0';
15895:   }
15896: 
15897:   if((str=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
15898:     SpBadMemAlloc("SelectTimeSeriesFileName");
15899:   }
15900:   (void)sprintf(str,"%s/*", path);
15901:   XtVaSetValues(textFileSelectionFilter, XmNvalue, str, NULL);
15902:   XtVaSetValues(textFileSelectionSelected, XmNvalue, timeseries.filename, NULL);
15903:   free(str);
15904: 
15905:   SpUpdateFileSelection(FILE_FILTER, OPENTIMESERIES, path);
15906:   (void)sprintf(preview_input_path,"%s",path);
15907: 
15908:   free(path);
15909:   if(path)
15910:     path = NULL;
15911: }
15912: 
15913: void
15914: PreviewInput(w, client_data, call_data)
15915:  Widget w;
15916:  XtPointer client_data;
15917:  XtPointer call_data;
15918: {
15919:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
15920: 
15921:   char *str;
15922:   XmString xmstring;
15923:   
15924:   void SpUpdateFileSelection();
15925: 
15926:   XtManageChild(formFileSelectionPreviewInput);
15927:   XtPopup(XtParent(formFileSelectionPreviewInput),XtGrabNone);
15928: 
15929:   XtVaSetValues(textFileSelectionSelectedPreviewInput, XmNvalue, "", NULL);
15930: 
15931:   if((str=(char*)calloc((int)strlen(preview_input_path)+10, CHAR_SIZE)) == NULL) {
15932:     SpBadMemAlloc("PreviewInput");
15933:   }
15934:   (void)sprintf(str, "%s", preview_input_path);
15935:   XtVaSetValues(textFileSelectionSelectedPreviewInput, XmNvalue, str, NULL);
15936:   (void)strncat(str,"/*",2);
15937:   XtVaSetValues(textFileSelectionFilterPreviewInput, XmNvalue, str, NULL);
15938:   free(str);
15939:   
15940:   SpUpdateFileSelection(FILE_FILTER, PREVIEWINPUT, preview_input_path);
15941: }
15942: 
15943: void
15944: PreviewInputDismiss(w, client_data, call_data)
15945:  Widget w;
15946:  XtPointer client_data;
15947:  XtPointer call_data;
15948: {
15949:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
15950: 
15951:   XmTextPosition last_pos;
15952: 
15953:   last_pos=XmTextGetLastPosition(textPreviewInput);
15954: 
15955:   XmTextReplace(textPreviewInput, 0, last_pos, "");
15956: 
15957:   XtUnmanageChild(formPreviewInput);
15958: }
15959: 
15960: void
15961: FileSelectionCancel(w, client_data, call_data)
15962:  Widget w;
15963:  XtPointer client_data;
15964:  XtPointer call_data;
15965: {
15966:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
15967: 
15968:   XtUnmanageChild(formFileSelection);
15969: 
15970:   if(fileselection == OPENTIMESERIES) {
15971:     XtUnmanageChild(formFileSelectionTimeSeries);
15972:     XtVaSetValues(XtParent(formFileSelection), XmNheight, 640, NULL);
15973:   }
15974:   else if(fileselection == OPENSTRAT) {
15975:     XtUnmanageChild(optionMenuStratType1);
15976:     XtUnmanageChild(labelStratType1);
15977:     XtVaSetValues(XtParent(formFileSelection), XmNheight, 640, NULL);
15978:   }
15979:   else if(fileselection == OPENAFFINE) {
15980:     XtManageChild(formUseAffine);
15981:   }
15982:   else if(fileselection == OPENCULLTABLE) {
15983:     XtManageChild(formCull);
15984:   }
15985: }
15986: 
15987: void
15988: DirectToHelp(w, client_data, call_data)
15989:  Widget w;
15990:  XtPointer client_data;
15991:  XtPointer call_data;
15992: {
15993:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
15994: 
15995:   char *helpname;
15996:   int ishelp;
15997: 
15998:   if((helpname=(char*)calloc(100, CHAR_SIZE)) == NULL) {
15999:     SpBadMemAlloc("FileSelectionOK1");
16000:   }
16001: 
16002:   if(fileselection == OPENSTRAT) {
16003:     (void)sprintf(helpname, "SpOpenStrat.help");
16004:     ishelp = YES;
16005:   }
16006:   else if(fileselection == SAVESTRAT) {
16007:     (void)sprintf(helpname, "SpSaveStrat.help");
16008:     ishelp = YES;
16009:   }
16010:   else if(fileselection == OPENSPLICETABLE) {
16011:     (void)sprintf(helpname, "SpOpenSplicerTable.help");
16012:     ishelp = YES;
16013:   }
16014:   else if(fileselection == SAVESPLICETABLE) {
16015:     (void)sprintf(helpname, "SpSaveSplicerTable.help");
16016:     ishelp = YES;
16017:   }
16018:   else if(fileselection == OPENAFFINE) {
16019:     (void)sprintf(helpname, "SpAffineOpen.help");
16020:     ishelp = YES;
16021:   }
16022:   else if(fileselection == SAVEAFFINE) {
16023:     (void)sprintf(helpname, "SpAffineSave.help");
16024:     ishelp = YES;
16025:   }
16026:   else if(fileselection == OPENTIMESERIES) {
16027:     (void)sprintf(helpname, "SpOpenTimeSeries.help");
16028:     ishelp = YES;
16029:   }
16030:   else if(fileselection == OPENCULLTABLE) {
16031:     (void)sprintf(helpname, "SpCullOpen.help");
16032:     ishelp = YES;
16033:   }
16034:   else if(fileselection == OPENAGEMODEL) {
16035:     (void)sprintf(helpname, "SpOpenAgeModel.help");
16036:     ishelp = YES;
16037:   }
16038:   else if(fileselection == SAVECULLTABLE) {
16039:     (void)sprintf(helpname, "SpCullSave.help");
16040:     ishelp = YES;
16041:   }
16042:   else if(fileselection == SAVESPLICEDATA) {
16043:     (void)sprintf(helpname, "SpSaveSplicerData.help");
16044:     ishelp = YES;
16045:   }
16046:   else if(fileselection == SAVEAGEMODEL) {
16047:     (void)sprintf(helpname, "SpSaveAgeModel.help");
16048:     ishelp = YES;
16049:   }
16050:   else if(fileselection == SAVESPLICEVSAGE) {
16051:     (void)sprintf(helpname, "SpSaveSpliceVsAge.help");
16052:     ishelp = YES;
16053:   }
16054:   else {
16055:     ishelp = NO;
16056:   }
16057: 
16058:   if(ishelp == YES) {
16059:     SplicerHelpCB((Widget)NULL, helpname, (XtPointer)NULL);
16060:   }
16061:   free(helpname);
16062: }
16063: 
16064: void
16065: FileSelectionOK(w, client_data, call_data)
16066:  Widget w;
16067:  XtPointer client_data;
16068:  XtPointer call_data;
16069: {
16070:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
16071: 
16072:   int           nfile, i, readable, age, err;
16073:   char          *selectfile, *path;
16074:   XmString      str, xmstring;
16075:   int SpInputStrat(),SpOutputStrat(),SpInputSplicerTable(),
16076:                 SpOutputData(), SpOutputAgeModel(), SpInputAgeModel(),
16077:                 SpWriteSplicerData(), VerifyFileReadable(), ReadTimeSeries();
16078:   Widget        tmp_widget;
16079: 
16080:   selectfile = XmTextGetString(textFileSelectionSelected);
16081:   path = XmTextGetString(textFileSelectionFilter);
16082:   *strrchr(path,'*')= '\0';
16083:   
16084:   if(strlen(selectfile) == 0) {
16085:     return;
16086:   }
16087:   
16088:   if(fileselection == OPENTIMESERIES) {
16089: 
16090:     /* check that filename is a valid name
16091:     */
16092:     readable = VerifyFileReadable(selectfile, OPEN, OPENTIMESERIES);
16093:     if(readable == NO) {
16094:       (void)sprintf(buffer,"Error opening time series.  %s is not a readable file.",selectfile);
16095:       SpManageWarningBox(buffer);
16096:     }
16097:     else {
16098:       io_wait_cursor = XCreateFontCursor(XtDisplay(formFileSelection), XC_watch);
16099:       if(io_wait_cursor != BadAlloc && io_wait_cursor != BadFont && io_wait_cursor != BadValue) {
16100:         XDefineCursor(XtDisplay(formFileSelection), XtWindow(formFileSelection), io_wait_cursor);
16101:       }
16102: 
16103:       XtFree(timeseries.filename);
16104:       if((timeseries.filename=(char*)calloc((int)strlen(selectfile)+10, CHAR_SIZE)) == NULL) {
16105:         SpBadMemAlloc("FileSelectionOK1");
16106:       }
16107:       (void)sprintf(timeseries.filename, "%s", selectfile);
16108:       XtFree(timeseries.dirname);
16109:       if((timeseries.dirname=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
16110:         SpBadMemAlloc("FileSelectionOK2");
16111:       }
16112:       (void)sprintf(timeseries.dirname, "%s", path);
16113: 
16114:       /* check if there is already a time series allocated. if so, free it
16115:       */
16116:       if(have_time_series == DO) {
16117:         SpCleanUp(TIMESERIES);
16118:       }
16119:       if((err = ReadTimeSeries(selectfile)) > 0) {
16120:       }
16121:       else {
16122:  
16123:         have_timeseries_tie = DONT;
16124:         have_splicetoage_tie = DONT;
16125:         last_splicetoage_tie = NONE;
16126:  
16127:         XtUnmanageChild(formFileSelectionTimeSeries);
16128:         XtVaSetValues(XtParent(formFileSelection), XmNheight, 640, NULL);
16129:         XtSetSensitive(pushButtonSpliceToAgeRemoveTimeSeries, True);
16130:         XtUnmanageChild(formFileSelection);
16131: 
16132:         xmstring=XmCvtCTToXmString("Have Time Series");
16133:         XtVaSetValues(pushButtonOpenTimeSeries,XmNlabelString,xmstring,NULL);
16134:         XtVaSetValues(pushButtonOpenAgeSignal,XmNlabelString,xmstring,NULL);
16135:         XmStringFree(xmstring);
16136:       }
16137: 
16138:       if(io_wait_cursor) {
16139:         XUndefineCursor(XtDisplay(formFileSelection), XtWindow(formFileSelection));
16140:         XFreeCursor(XtDisplay(formFileSelection), io_wait_cursor);
16141:       }
16142:     }
16143:   }
16144:   else if(fileselection == OPENSPLICETABLE) {
16145: 
16146:     /* check that filename is a valid name
16147:     */
16148:     readable = VerifyFileReadable(selectfile, OPEN, OPENSPLICETABLE);
16149:     if(readable == NO) {
16150:       (void)sprintf(buffer,"Error opening splicer table.  %s is not a readable file.",selectfile);
16151:       SpManageWarningBox(buffer);
16152:     }
16153:     else {
16154:       XtUnmanageChild(formFileSelection);
16155:       XtFree(splicertable.filename);
16156:       if((splicertable.filename=(char*)calloc((int)strlen(selectfile)+10, CHAR_SIZE)) == NULL) {
16157:         SpBadMemAlloc("FileSelectionOK1");
16158:       }
16159:       (void)sprintf(splicertable.filename, "%s", selectfile);
16160:       XtFree(splicertable.dirname);
16161:       if((splicertable.dirname=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
16162:         SpBadMemAlloc("FileSelectionOK2");
16163:       }
16164:       (void)sprintf(splicertable.dirname, "%s", path);
16165: 
16166:       work_id=XtAppAddWorkProc(app,(XtWorkProc)SpInputSplicerTable(),messageBoxWorking);
16167:       /* display working box */
16168:       if((charptr=(char*)calloc(100+(int)strlen(splicertable.filename),CHAR_SIZE))==NULL)
16169:                                 SpBadMemAlloc("FileSelectionOK 3");
16170:       (void)sprintf(charptr,"Splicer : Reading splicer table %s.",splicertable.filename);
16171:       str=XmStringCreateLocalized(charptr);
16172:       XtVaSetValues(messageBoxWorking,XmNmessageString,str, NULL);
16173:       XmStringFree(str);
16174:       free(charptr);
16175:       XtManageChild(messageBoxWorking);
16176:       XtPopup(XtParent(messageBoxWorking),XtGrabNone);
16177:     }
16178:   }
16179:   else if(fileselection == SAVESPLICETABLE) {
16180:     /* check that filename is a valid name
16181:     */
16182:     readable = VerifyFileReadable(selectfile, SAVE, SAVESPLICETABLE);
16183:     if(readable == NO) {
16184:       (void)sprintf(buffer,"Error saving splice table.  %s is not a writable file.",selectfile);
16185:       SpManageWarningBox(buffer);
16186:     }
16187:     else {
16188:       XtUnmanageChild(formFileSelection);
16189:       /* get new file and directory name */
16190:       XtFree(splicertable.filename);
16191:       if((splicertable.filename=(char*)calloc((int)strlen(selectfile)+10, CHAR_SIZE)) == NULL) {
16192:         SpBadMemAlloc("FileSelectionOK1");
16193:       }
16194:       (void)sprintf(splicertable.filename, "%s", selectfile);
16195:       XtFree(splicertable.dirname);
16196:       if((splicertable.dirname=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
16197:         SpBadMemAlloc("FileSelectionOK2");
16198:       }
16199:       (void)sprintf(splicertable.dirname, "%s", path);
16200: 
16201:       SpWriteSplicerTable(selectfile);
16202:       saved_splice = YES;
16203:       write_report = YES;
16204:       if((charptr=(char*)calloc(50+(int)strlen(splicertable.filename),CHAR_SIZE))==NULL)
16205:                             SpBadMemAlloc("FileSelectionOK");
16206:       (void)sprintf(charptr,"\nSplicer table written to %s.",splicertable.filename);
16207:       SpUpdateReport(charptr);
16208:       free(charptr);
16209:     }
16210:   }
16211:   else if(fileselection == OPENAFFINE) {
16212:     /* check that filename is a valid name
16213:     */
16214:     readable = VerifyFileReadable(selectfile, OPEN, OPENAFFINE);
16215:     if(readable == NO) {
16216:       (void)sprintf(buffer,"Error opening affine table.  %s is not a readable file.",selectfile);
16217:       XmToggleButtonSetState(toggleButtonUseAffine, False, False);
16218:       XmToggleButtonSetState(toggleButtonNotUseAffine, True, False);
16219:       affine.usetable = False;
16220:       XmTextSetString(textFieldAffineFileName,"");
16221:       SpManageWarningBox(buffer);
16222:     }
16223:     else {
16224:       XtUnmanageChild(formFileSelection);
16225:       XtFree(affine.filename);
16226:       if((affine.filename=(char*)calloc((int)strlen(selectfile)+10, CHAR_SIZE)) == NULL) {
16227:         SpBadMemAlloc("FileSelectionOK4");
16228:       }
16229:       (void)sprintf(affine.filename, "%s", selectfile);
16230:       XtFree(affine.dirname);
16231:       if((affine.dirname=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
16232:         SpBadMemAlloc("FileSelectionOK5");
16233:       }
16234:       (void)sprintf(affine.dirname, "%s", path);
16235:       if((charptr=(char*)calloc((int)strlen(affine.filename)+5,CHAR_SIZE))==NULL)
16236:                 SpBadMemAlloc("FileSelectionOK6");
16237:       (void)sprintf(charptr,"%s",affine.filename);
16238:       XmTextSetString(textFieldAffineFileName,charptr);
16239:       free(charptr);
16240:       XmToggleButtonSetState(toggleButtonUseAffine, True, False);
16241:       XmToggleButtonSetState(toggleButtonNotUseAffine, False, False);
16242:       affine.usetable = TRUE;
16243:       xmstring=XmCvtCTToXmString("Use Affine...");
16244:       XtVaSetValues(pushButtonOpenAffine,XmNlabelString,xmstring,NULL);
16245:       XmStringFree(xmstring);
16246:     }
16247:   }
16248:   else if(fileselection == SAVEAFFINE) {
16249: 
16250:     /* check that filename is a valid name
16251:     */
16252:     readable = VerifyFileReadable(selectfile, SAVE, SAVEAFFINE);
16253:     if(readable == NO) {
16254:       (void)sprintf(buffer,"Error saving affine table.  %s is not a writable file.",selectfile);
16255:       SpManageWarningBox(buffer);
16256:     }
16257:     else {
16258:       XtUnmanageChild(formFileSelection);
16259:       XtFree(affine.filename);
16260:       if((affine.filename=(char*)calloc((int)strlen(selectfile)+10, CHAR_SIZE)) == NULL) {
16261:         SpBadMemAlloc("FileSelectionOK4");
16262:       }
16263:       (void)sprintf(affine.filename, "%s", selectfile);
16264:       XtFree(affine.dirname);
16265:       if((affine.dirname=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
16266:         SpBadMemAlloc("FileSelectionOK5");
16267:       }
16268:       (void)sprintf(affine.dirname, "%s", path);
16269: 
16270:       if(!SpWriteAffineTable(&affinetable,affine.filename))
16271:       {
16272:             if((message.label=(char*)calloc(100+(int)strlen(affine.filename),CHAR_SIZE))==NULL)
16273:                                SpBadMemAlloc("FileSelectionOK");
16274:             (void)sprintf(buffer,"Error writing output affine table %s",affine.filename);
16275:             SpManageWarningBox(buffer);
16276:       }
16277:       else
16278:       {
16279:              saved_affine = YES;
16280:              write_report = YES;
16281: 
16282:              /* write affine table */
16283:              if((charptr=(char*)calloc(50+(int)strlen(affine.filename),CHAR_SIZE))==NULL)
16284:                                 SpBadMemAlloc("FileSelectionOK");
16285:              (void)sprintf(charptr,"\nAffine table written to %s.",affine.filename);
16286:              SpUpdateReport(charptr);
16287:              free(charptr);
16288:       }
16289:     }
16290:   }
16291:   else if(fileselection == OPENSTRAT) {
16292: 
16293:     /* check that filename is a valid name
16294:     */
16295:     readable = VerifyFileReadable(selectfile, OPEN, OPENSTRAT);
16296:     if(readable == NO) {
16297:       (void)sprintf(buffer,"Error opening stratigraphy.  %s is not a readable file.",selectfile);
16298:       SpManageWarningBox(buffer);
16299:     }
16300:     else {
16301: 
16302:       if(strat_file_cnt > 1) {
16303:         for(i=0; i<strat_file_cnt-1; ++i) {
16304:           if(strcmp(strat[i]->filename, selectfile) == 0) {
16305:             (void)sprintf(buffer,"You have already read this stratigraphy file.");
16306:             SpManageWarningBox(buffer);
16307:             return;
16308:           }
16309:         }
16310:       }
16311: 
16312:       if(strat_file_cnt<=0)
16313:       {
16314:         if((strat=(StratFile**)calloc(1,sizeof(StratFile*)))==NULL)
16315:                                 SpBadMemAlloc("FileSelectionOK7");
16316:       }
16317:       else
16318:       {
16319:         if((charptr=(char*)realloc((char*)strat,(strat_file_cnt+1)*sizeof(StratFile*)))==NULL)
16320:                                 SpBadMemAlloc("FileSelectionOK8");
16321:         else
16322:           strat=(StratFile**)charptr;
16323:       }
16324:       if((strat[strat_file_cnt]=(StratFile*)calloc(1,sizeof(StratFile)))==NULL)
16325:                         SpBadMemAlloc("FileSelectionOK9");
16326:       strat_file_cnt++;
16327:       strat[strat_file_cnt-1]->alloc_cnt=strat[strat_file_cnt-1]->data_cnt=0;
16328: 
16329:       strat[strat_file_cnt-1]->filename=(char*)calloc((int)strlen(selectfile)+10, CHAR_SIZE);
16330:       (void)sprintf(strat[strat_file_cnt-1]->filename, "%s", selectfile);
16331:       if((strat[strat_file_cnt-1]->dirname=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
16332:         SpBadMemAlloc("FileSelectionOK10");
16333:       }
16334:       (void)sprintf(strat[strat_file_cnt-1]->dirname, "%s", path);
16335:       XtFree(default_strat_dirname);
16336:       default_strat_dirname=NULL;
16337:       if((default_strat_dirname=(char*)calloc((int)strlen(path)+5,CHAR_SIZE))==NULL)
16338:                                 SpBadMemAlloc("OpenSplicerTable");
16339:       (void)sprintf(default_strat_dirname, "%s", path);
16340: 
16341:       /* get strat type set */
16342:       XtVaGetValues(optionMenuStratType1,XmNmenuHistory,&tmp_widget,NULL);
16343:       if(tmp_widget==pushButtonDiatoms1)
16344:         strat[strat_file_cnt-1]->type=DIATOMS;
16345:       else if(tmp_widget==pushButtonRadiolaria1)
16346:         strat[strat_file_cnt-1]->type=RADIOLARIA;
16347:       else if(tmp_widget==pushButtonForaminifera1)
16348:         strat[strat_file_cnt-1]->type=FORAMINIFERA;
16349:       else if(tmp_widget==pushButtonNannofossils1)
16350:         strat[strat_file_cnt-1]->type=NANNOFOSSILS;
16351:       else if(tmp_widget==pushButtonPaleomag1)
16352:         strat[strat_file_cnt-1]->type=PALEOMAG;
16353: 
16354:       /* start working procedure for reading strat file */
16355:       if((charptr=(char*)calloc(50+(int)strlen(strat[strat_file_cnt-1]->filename),CHAR_SIZE))==NULL)
16356:                                 SpBadMemAlloc("FileSelectionOK11");
16357:       (void)sprintf(charptr,"Strat: Reading stratigraphy file %s.",strat[strat_file_cnt-1]->filename);
16358:       str=XmStringCreateLocalized(charptr);
16359:       XtVaSetValues(messageBoxWorking,XmNmessageString,str, NULL);
16360:       XmStringFree(str);
16361:       free(charptr);
16362:       work_id=XtAppAddWorkProc(app,(XtWorkProc)SpInputStrat(),messageBoxWorking);
16363:       XtManageChild(messageBoxWorking);
16364:       XtPopup(XtParent(messageBoxWorking),XtGrabNone);
16365:     }
16366:   }
16367:   else if(fileselection == SAVESTRAT) {
16368:     readable = VerifyFileReadable(selectfile, SAVE, SAVESTRAT);
16369:     if(readable == NO) {
16370:       (void)sprintf(buffer,"Error saving stratigraphy.  %s is not a writable file.",selectfile);
16371:       SpManageWarningBox(buffer);
16372:     }
16373:     else {
16374:       XtUnmanageChild(formFileSelection);
16375:       XtFree(outstrat.filename);
16376:       if((outstrat.filename=(char*)calloc((int)strlen(selectfile)+10, CHAR_SIZE)) == NULL) {
16377:         SpBadMemAlloc("FileSelectionOK4");
16378:       }
16379:       (void)sprintf(outstrat.filename, "%s", selectfile);
16380:       XtFree(outstrat.dirname);
16381:       if((outstrat.dirname=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
16382:         SpBadMemAlloc("FileSelectionOK5");
16383:       }
16384:       (void)sprintf(outstrat.dirname, "%s", path);
16385: 
16386:       if((charptr=(char*)calloc(100+(int)strlen(outstrat.filename),CHAR_SIZE))==NULL)
16387:                                  SpBadMemAlloc("SpFileSelectionBoxOKCB 18");
16388:       (void)sprintf(charptr,"Strat: Writing stratigraphy file %s.",outstrat.filename);
16389:       str=XmStringCreateLocalized(charptr);
16390:       XtVaSetValues(messageBoxWorking,XmNmessageString,str, NULL);
16391:       XmStringFree(str);
16392:       free(charptr);
16393:       work_id=XtAppAddWorkProc(app,(XtWorkProc)SpOutputStrat(),messageBoxWorking);
16394:       XtManageChild(messageBoxWorking);
16395:       XtPopup(XtParent(messageBoxWorking),XtGrabNone);
16396:     }
16397:   }
16398:   else if(fileselection == OPENCULLTABLE) {
16399:      /* check that filename is a valid name
16400:     */
16401:     readable = VerifyFileReadable(selectfile, OPEN, OPENCULLTABLE);
16402:     if(readable == NO) {
16403:       (void)sprintf(buffer,"Error opening cull table.  %s is not a readable file.",selectfile);
16404:       XmToggleButtonSetState(toggleButtonUseCullTable, False, False);
16405:       XmToggleButtonSetState(toggleButtonDontUseCullTable, True, False);
16406:       XmTextSetString(textFieldCullTableFilename,"");
16407:       SpManageWarningBox(buffer);
16408:     }
16409:     else {
16410:       XtUnmanageChild(formFileSelection);
16411:       XtManageChild(formCull);
16412:       XtFree(cull.filename);
16413:       if((cull.filename=(char*)calloc((int)strlen(selectfile)+10, CHAR_SIZE)) == NULL) {
16414:         SpBadMemAlloc("FileSelectionOK4");
16415:       }
16416:       (void)sprintf(cull.filename, "%s", selectfile);
16417:       XtFree(cull.dirname);
16418:       if((cull.dirname=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
16419:         SpBadMemAlloc("FileSelectionOK5");
16420:       }
16421:       (void)sprintf(cull.dirname, "%s", path);
16422:       if((charptr=(char*)calloc((int)strlen(cull.filename)+5,CHAR_SIZE))==NULL)
16423:                 SpBadMemAlloc("FileSelectionOK6");
16424:       (void)sprintf(charptr,"%s",cull.filename);
16425:       XmTextSetString(textFieldCullTableFilename,charptr);
16426:       free(charptr);
16427:       XmToggleButtonSetState(toggleButtonUseCullTable, True, False);
16428:       XmToggleButtonSetState(toggleButtonDontUseCullTable, False, False);
16429:     }
16430:   }
16431:   else if(fileselection == SAVECULLTABLE) {
16432:     /* check that filename is a valid name
16433:     */
16434:     readable = VerifyFileReadable(selectfile, SAVE, SAVECULLTABLE);
16435:     if(readable == NO) {
16436:       (void)sprintf(buffer,"Error saving cull table.  %s is not a writable file.",selectfile);
16437:       SpManageWarningBox(buffer);
16438:     }
16439:     else {
16440:       XtUnmanageChild(formFileSelection);
16441:       XtFree(cull.filename);
16442:       if((cull.filename=(char*)calloc((int)strlen(selectfile)+10, CHAR_SIZE)) == NULL) {
16443:         SpBadMemAlloc("FileSelectionOK4");
16444:       }
16445:       (void)sprintf(cull.filename, "%s", selectfile);
16446:       XtFree(cull.dirname);
16447:       if((cull.dirname=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
16448:         SpBadMemAlloc("FileSelectionOK5");
16449:       }
16450:       (void)sprintf(cull.dirname, "%s", path);
16451: 
16452:       if(!SpWriteCullTable(data[dset], cull.filename))
16453:       {
16454:         if((charptr=(char*)calloc(100+(int)strlen(cull.filename),CHAR_SIZE))==NULL)
16455:                                SpBadMemAlloc("SpFileSelectionBoxOKCB 3");
16456:         (void)sprintf(charptr,"Error writing output cull table %s",cull.filename);
16457:         SpManageWarningBox(charptr);
16458:         free(charptr);
16459:       }
16460:       else
16461:       {
16462:         if((charptr=(char*)calloc(50+(int)strlen(cull.filename),CHAR_SIZE))==NULL)
16463:                               SpBadMemAlloc("SpFileSelectionBoxOKCB 3");
16464:         (void)sprintf(charptr,"\nCull table written to %s.",cull.filename);
16465:         SpUpdateReport(charptr);
16466:         free(charptr);
16467:       }
16468:     }
16469:   }
16470:   else if(fileselection == OPENAGEMODEL) {
16471:     /* check that filename is a valid name
16472:     */
16473:     readable = VerifyFileReadable(selectfile, OPEN, OPENAGEMODEL);
16474:     if(readable == NO) {
16475:       (void)sprintf(buffer,"Error opening age model.  %s is not a readable file.",selectfile);
16476:       SpManageWarningBox(buffer);
16477:     }
16478:     else {
16479:       XtUnmanageChild(formFileSelection);
16480:       XtFree(inagemodel_filename);
16481:       if((inagemodel_filename=(char*)calloc((int)strlen(selectfile)+10, CHAR_SIZE)) == NULL) {
16482:         SpBadMemAlloc("FileSelectionOK4");
16483:       }
16484:       (void)sprintf(inagemodel_filename, "%s", selectfile);
16485:       XtFree(inagemodel_dirname);
16486:       if((inagemodel_dirname=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
16487:         SpBadMemAlloc("FileSelectionOK5");
16488:       }
16489:       (void)sprintf(inagemodel_dirname, "%s", path);
16490: 
16491:       if((charptr=(char*)calloc(100+(int)strlen(inagemodel_filename),CHAR_SIZE))==NULL)
16492:                                  SpBadMemAlloc("SpFileSelectionBoxOKCB 18");
16493:       (void)sprintf(charptr,"Age Model: Reading age model file %s.",inagemodel_filename);
16494:       str=XmStringCreateLocalized(charptr);
16495:       XtVaSetValues(messageBoxWorking,XmNmessageString,str, NULL);
16496:       XmStringFree(str);
16497:       free(charptr);
16498:       work_id=XtAppAddWorkProc(app,(XtWorkProc)SpInputAgeModel(),messageBoxWorking);
16499:       XtManageChild(messageBoxWorking);
16500:       XtPopup(XtParent(messageBoxWorking),XtGrabNone);
16501: 
16502:       XtSetSensitive(pushButtonOpenAgeSignal, True);
16503:       XtSetSensitive(pushButtonOpenTimeSeries, True);
16504:     }
16505:   }
16506:   else if(fileselection == SAVEAGEMODEL) {
16507:      /* check that filename is a valid name
16508:     */
16509:     readable = VerifyFileReadable(selectfile, SAVE, SAVEAGEMODEL);
16510:     if(readable == NO) {
16511:       (void)sprintf(buffer,"Error saving age model.  %s is not a writable file.",selectfile);
16512:       SpManageWarningBox(buffer);
16513:     }
16514:     else {
16515:       XtUnmanageChild(formFileSelection);
16516:       XtFree(outagemodel_filename);
16517:       if((outagemodel_filename=(char*)calloc((int)strlen(selectfile)+10, CHAR_SIZE)) == NULL) {
16518:         SpBadMemAlloc("FileSelectionOK4");
16519:       }
16520:       (void)sprintf(outagemodel_filename, "%s", selectfile);
16521:       XtFree(outagemodel_dirname);
16522:       if((outagemodel_dirname=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
16523:         SpBadMemAlloc("FileSelectionOK5");
16524:       }
16525:       (void)sprintf(outagemodel_dirname, "%s", path);
16526: 
16527:       if((charptr=(char*)calloc(50+(int)strlen(outagemodel_filename),CHAR_SIZE))==NULL)
16528:                                  SpBadMemAlloc("SpFileSelectionBoxOKCB 18");
16529:       (void)sprintf(charptr,"Age Model: Writing age model file %s.",outagemodel_filename);
16530:       str=XmStringCreateLocalized(charptr);
16531:       XtVaSetValues(messageBoxWorking,XmNmessageString,str, NULL);
16532:       XmStringFree(str);
16533:       free(charptr);
16534:       work_id=XtAppAddWorkProc(app,(XtWorkProc)SpOutputAgeModel(),messageBoxWorking);
16535:       saved_agemodel = YES;
16536:       write_report = YES;
16537:       XtManageChild(messageBoxWorking);
16538:       XtPopup(XtParent(messageBoxWorking),XtGrabNone);
16539:     }
16540:   }
16541:   else if(fileselection == SAVESPLICEDATA) {
16542:      /* check that filename is a valid name
16543:     */
16544:     readable = VerifyFileReadable(selectfile, SAVE, SAVESPLICEDATA);
16545:     if(readable == NO) {
16546:       (void)sprintf(buffer,"Error saving splice data.  %s is not a writable file.",selectfile);
16547:       SpManageWarningBox(buffer);
16548:     }
16549:     else {
16550:       XtUnmanageChild(formFileSelection);
16551:       XtFree(outspdata_filename);
16552:       if((outspdata_filename=(char*)calloc((int)strlen(selectfile)+10, CHAR_SIZE)) == NULL) {
16553:         SpBadMemAlloc("FileSelectionOK4");
16554:       }
16555:       (void)sprintf(outspdata_filename, "%s", selectfile);
16556:       XtFree(outspdata_dirname);
16557:       if((outspdata_dirname=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
16558:         SpBadMemAlloc("FileSelectionOK5");
16559:       }
16560:       (void)sprintf(outspdata_dirname, "%s", path);
16561: 
16562:       if((charptr=(char*)calloc(50+(int)strlen(outspdata_filename),CHAR_SIZE))==NULL)
16563:                                  SpBadMemAlloc("FileSelectionOK");
16564:       (void)sprintf(charptr,"Spliced output data file %s.",outspdata_filename);
16565:       SpUpdateReport(charptr);
16566:       free(charptr);
16567:       age = NO;
16568:       SpWriteSplicerData(outspdata_filename, age);
16569:     }
16570:   }
16571:   else if(fileselection == SAVESPLICEVSAGE) {
16572:     /* check that filename is a valid name
16573:     */
16574:     readable = VerifyFileReadable(selectfile, SAVE, SAVESPLICEVSAGE);
16575:     if(readable == NO) {
16576:       (void)sprintf(buffer,"Error saving splice vs age.  %s is not a writable file.",selectfile);
16577:       SpManageWarningBox(buffer);
16578:     }
16579:     else {
16580:       XtUnmanageChild(formFileSelection);
16581:       XtFree(outsplicetoage_filename);
16582:       if((outsplicetoage_filename=(char*)calloc((int)strlen(selectfile)+10, CHAR_SIZE)) == NULL) {
16583:         SpBadMemAlloc("FileSelectionOK4");
16584:       }
16585:       (void)sprintf(outsplicetoage_filename, "%s", selectfile);
16586:       XtFree(outsplicetoage_dirname);
16587:       if((outsplicetoage_dirname=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
16588:         SpBadMemAlloc("FileSelectionOK5");
16589:       }
16590:       (void)sprintf(outsplicetoage_dirname, "%s", path);
16591: 
16592:       if((charptr=(char*)calloc(50+(int)strlen(outsplicetoage_filename),CHAR_SIZE))==NULL)
16593:                                  SpBadMemAlloc("FileSelectionOK");
16594:       (void)sprintf(charptr,"Spliced output data file %s.",outsplicetoage_filename);
16595:       SpUpdateReport(charptr);
16596:       free(charptr);
16597:       age = YES;
16598:       SpWriteSplicerData(outsplicetoage_filename, age);
16599:     }
16600:   }
16601:   else {
16602:   }
16603: 
16604:   XtFree(selectfile);
16605:   if(selectfile)
16606:     selectfile = NULL;
16607:   XtFree(path);
16608:   if(path)
16609:     path = NULL;
16610: }
16611: 
16612: void
16613: FileSelectionFile(w, client_data, call_data)
16614:  Widget w;
16615:  XtPointer client_data;
16616:  XtPointer call_data;
16617: {
16618:     XmListCallbackStruct *acs=(XmListCallbackStruct*)call_data;
16619: 
16620:   int   nfile, len;
16621:   char  *filter, *infile, *path, *filename;
16622: 
16623:   /* get selected file name 
16624:   */
16625:   filter = XmTextGetString(textFileSelectionFilter);
16626:   if((path=(char*)calloc((int)strlen(filter)+10,CHAR_SIZE))==NULL)
16627:                         SpBadMemAlloc("FileSelectionFile");
16628:   (void)sprintf(path,"%s", filter);
16629:   *strrchr(path,'*')= '\0';
16630:   len = (int)strlen(path);
16631:   if(len > 0) {
16632:     if(strcmp(&path[len-1], "/") != 0) {
16633:       strcat(path, "/");
16634:     }
16635:   }
16636:   XmStringGetLtoR(acs->item,XmFONTLIST_DEFAULT_TAG,&infile);
16637:   if((filename=(char*)calloc((int)strlen(path) + (int)strlen(infile)+50,CHAR_SIZE))==NULL)
16638:                         SpBadMemAlloc("FileSelectionFile");
16639: 
16640:   (void)sprintf(filename,"%s%s",path, infile);
16641:   XtVaSetValues(textFileSelectionSelected, XmNvalue, filename, NULL);
16642: 
16643:   free(filter);
16644:   free(filename);
16645:   free(infile);
16646:   free(path);
16647: }
16648: 
16649: void
16650: FileSelectionDirectory(w, client_data, call_data)
16651:  Widget w;
16652:  XtPointer client_data;
16653:  XtPointer call_data;
16654: {
16655:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
16656: 
16657:   char *filter, *path;
16658: 
16659:   void SpUpdateFileSelection();
16660: 
16661:   filter = XmTextGetString(textFileSelectionFilter);
16662:   /* allocate a lot of space for path so don't need to
16663:      reallocate in SpUpdateFileSelection
16664:      when reallocate there lose the pointer
16665:   */
16666:   if((path=(char*)calloc((int)strlen(filter) + 1000,CHAR_SIZE))==NULL)
16667:                         SpBadMemAlloc("FileSelectionDirectory");
16668:   (void)sprintf(path, "%s", filter);
16669:   *strrchr(path,'*')= '\0';
16670:   *strrchr(path,'/')= '\0';
16671: 
16672:   SpUpdateFileSelection(DIRECTORIES,fileselection, path);
16673:   (void)sprintf(preview_input_path,"%s",path);
16674: 
16675:   XtVaSetValues(textFileSelectionSelected, XmNvalue, path, NULL);
16676: 
16677:   free(path);
16678: }
16679: 
16680: void
16681: FileSelectionFilter(w, client_data, call_data)
16682:  Widget w;
16683:  XtPointer client_data;
16684:  XtPointer call_data;
16685: {
16686:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
16687: 
16688:   char *filter, *path;
16689:   void SpUpdateFileSelection();
16690:  
16691:   filter = XmTextGetString(textFileSelectionFilter);
16692:   /* allocate a lot of space for path so don't need to
16693:      reallocate in SpUpdateFileSelection
16694:      when reallocate there lose the pointer
16695:   */
16696:   if((path=(char*)calloc((int)strlen(filter) + 1000,CHAR_SIZE))==NULL)
16697:                         SpBadMemAlloc("FileSelectionFilter");
16698:   (void)sprintf(path, "%s", filter);
16699:   *strrchr(path,'*')= '\0';
16700: 
16701:   SpUpdateFileSelection(FILE_FILTER, fileselection, path);
16702:   (void)sprintf(preview_input_path,"%s",path);
16703: 
16704:   XtVaSetValues(textFileSelectionSelected, XmNvalue, path, NULL);
16705:   free(path);
16706: }
16707: 
16708: void
16709: OpenFormatsOtherToggleArm1(w, client_data, call_data)
16710:  Widget w;
16711:  XtPointer client_data;
16712:  XtPointer call_data;
16713: {
16714:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
16715: 
16716:   char string[10];
16717: 
16718:   (void)sprintf(string, "10");
16719:   XtVaSetValues(textFieldOpenFormatOtherValueColumn, XmNvalue, string, NULL);
16720: 
16721:   (void)sprintf(string, "");
16722: }
16723: 
16724: void
16725: OpenFormatsOtherToggleArm2(w, client_data, call_data)
16726:  Widget w;
16727:  XtPointer client_data;
16728:  XtPointer call_data;
16729: {
16730:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
16731: 
16732:   char string[10];
16733: 
16734:   (void)sprintf(string, "9");
16735:   XtVaSetValues(textFieldOpenFormatOtherValueColumn, XmNvalue, string, NULL);
16736: 
16737:   (void)sprintf(string, "");
16738: }
16739: 
16740: void
16741: OpenFormatsOtherToggleArm3(w, client_data, call_data)
16742:  Widget w;
16743:  XtPointer client_data;
16744:  XtPointer call_data;
16745: {
16746:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
16747: 
16748:   char string[10];
16749: 
16750:   (void)sprintf(string, "8");
16751:   XtVaSetValues(textFieldOpenFormatOtherValueColumn, XmNvalue, string, NULL);
16752: 
16753:   (void)sprintf(string, "");
16754: }
16755: 
16756: void
16757: OpenFormatsOtherToggleArm4(w, client_data, call_data)
16758:  Widget w;
16759:  XtPointer client_data;
16760:  XtPointer call_data;
16761: {
16762:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
16763: 
16764:   char string[10];
16765: 
16766:   (void)sprintf(string, "7");
16767:   XtVaSetValues(textFieldOpenFormatOtherValueColumn, XmNvalue, string, NULL);
16768: 
16769:   (void)sprintf(string, "");
16770: }
16771: 
16772: void
16773: OpenFormatsOtherToggleArm5(w, client_data, call_data)
16774:  Widget w;
16775:  XtPointer client_data;
16776:  XtPointer call_data;
16777: {
16778:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
16779: 
16780:   char string[10];
16781: 
16782:   (void)sprintf(string, "9");
16783:   XtVaSetValues(textFieldOpenFormatOtherValueColumn, XmNvalue, string, NULL);
16784: 
16785:   (void)sprintf(string, "");
16786: }
16787: 
16788: void
16789: OpenFormatsOtherToggleArm(w, client_data, call_data)
16790:  Widget w;
16791:  XtPointer client_data;
16792:  XtPointer call_data;
16793: {
16794:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
16795: }
16796: 
16797: void
16798: SpliceToAgeRecorrelate(w, client_data, call_data)
16799:  Widget w;
16800:  XtPointer client_data;
16801:  XtPointer call_data;
16802: {
16803:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
16804: 
16805:   int i, j, startcore, endcore, timen, spln, timetie, spltie, num_lead_lag, lag,
16806:       sploffset, timeoffset, nwin, tie_corr_num, n, ndiv;
16807:   float dt, leadlagmyrs, startage, endage, timeage[MAXCORR], timeval[MAXCORR], 
16808:         splage[MAXCORR], splvar[MAXCORR], coef, flip, sumval;
16809:   String str;
16810:   int RepickDepth();
16811:   void DrawDrawingAreaTieToTimeSeriesCorr(), DrawDrawingAreaSpliceToAge();
16812: 
16813:   /* get corr info
16814:   */
16815:   str = XmTextGetString(textFieldSpliceToAgeTimeStep);
16816:   dt = atof(str);
16817:   XtFree(str);
16818: 
16819:   str = XmTextGetString(textFieldSpliceToAgeWinLen);
16820:   winlen = atof(str);
16821:   XtFree(str);
16822: 
16823:   str= XmTextGetString(textFieldSpliceToAgeLeadLag);
16824:   leadlagmyrs = atof(str);
16825:   XtFree(str);
16826: 
16827:   /* put data of winlen +/- lead/lag length in temp arrays
16828:      and repick at dt
16829:   */
16830:   startage = timeseries.age[timeseriesarraynum] - winlen/2.0 - leadlagmyrs;
16831:   endage = timeseries.age[timeseriesarraynum] + winlen/2.0 + leadlagmyrs;
16832:   i = timeseriesarraynum;
16833:   while(i>0 && timeseries.age[i] > startage) {
16834:     --i;
16835:   }
16836:   timetie = timeseriesarraynum - i;
16837:   timen = 0;
16838:   if(XmToggleButtonGetState(toggleButtonTimeSeriesInvertNo) == True) {
16839:     flip = 1.0;
16840:   }
16841:   else if(XmToggleButtonGetState(toggleButtonTimeSeriesInvertYes) == True) {
16842:     flip = -1.0;
16843:   }
16844:   while(i<timeseries.n && timeseries.age[i]< endage) {
16845:     timeage[timen] = timeseries.age[i];
16846:     timeval[timen] = flip * timeseries.val[i];
16847:     ++timen;
16848:     ++i;
16849:   }
16850:   
16851:   startage = spcomp.age[splicetoagecorenum][splicetoagearraynum] - winlen/2.0 - leadlagmyrs;
16852:   endage = spcomp.age[splicetoagecorenum][splicetoagearraynum] + winlen/2.0 + leadlagmyrs;
16853:   startcore = splicetoagecorenum;
16854:   while(startcore>0 && spcomp.age[startcore][0] > startage) {
16855:     --startcore;
16856:   }
16857:   endcore = splicetoagecorenum;
16858:   while(endcore<spcomp.numcores && spcomp.age[endcore][spcomp.numpercore[endcore]-1] < endage) {
16859:     ++endcore;
16860:   }
16861:   spln = 0;
16862:   spltie = -1;
16863:   for(i=startcore; i<=endcore; ++i) {
16864:     for(j=0; j<spcomp.numpercore[i]; ++j) {
16865:       if(spcomp.age[i][j] < startage) {
16866:       }
16867:       else if(spcomp.age[i][j] > endage) {
16868:         break;
16869:       }
16870:       else {
16871:         splage[spln] = spcomp.age[i][j];
16872:         splvar[spln] = spcomp.var[i][j];
16873:         ++spln;
16874:       }
16875:     }
16876:   }
16877: 
16878:   /* check for mult samples per level
16879:   */
16880:   sumval = splvar[0];
16881:   n = 0;
16882:   ndiv = 1;
16883:   for(i=1; i<spln; ++i) {
16884:     if(splage[i] == splage[i-1] && i < spln - 1) {
16885:       sumval = sumval + splvar[i];
16886:       ++ndiv;
16887:     }
16888:     else if(splage[i] == splage[i-1] && i == spln - 1) {
16889:       sumval = sumval + splvar[i];
16890:       ++ndiv;
16891:       splage[n] = splage[i-1];
16892:       splvar[n] = sumval/ndiv;
16893:       ++n;
16894:     }
16895:     else if(splage[i] > splage[i-1] && i < spln - 1) {
16896:       splage[n] = splage[i-1];
16897:       splvar[n] = sumval/ndiv;
16898:       sumval = splvar[i];
16899:       ndiv = 1;
16900:       ++n;
16901:     }
16902:     else if(splage[i] > splage[i-1] && i == spln - 1) {
16903:       splage[n] = splage[i-1];
16904:       splvar[n] = sumval/ndiv;
16905:       ++n;
16906:       splage[n] = splage[i];
16907:       splvar[n] = splvar[i];
16908:       ++n;
16909:     }
16910:     else {
16911:     }
16912:   }
16913:   spln = n;
16914: 
16915:   /* find tie array location
16916:   */
16917:   for(i=0; i<spln; ++i) {
16918:     if(fabs(splage[i] - spcomp.age[splicetoagecorenum][splicetoagearraynum]) < 0.000005) {
16919:       spltie = i;
16920:     }
16921:   }
16922:   if(spltie == -1) {
16923:     (void)sprintf(buffer, "Was unable to find the splice tie for temp correlation array.");
16924:     SpManageWarningBox(buffer);
16925:     return;
16926:   }
16927: 
16928:   /* repick time and spl at dt
16929:   */
16930:   RepickDepth(timeage, timeval, &timen, &timetie, dt);
16931:   RepickDepth(splage, splvar, &spln, &spltie, dt);
16932: 
16933:   /*from lead,lag(in meters) find the lead,lag
16934:     in data points
16935:   */
16936:   if(leadlagmyrs > 0.0){
16937:     lead_lag = leadlagmyrs/dt;
16938:     num_lead_lag = lead_lag * 2 + 1;
16939:     lag = -1.0 * lead_lag;
16940:   }
16941:   else {
16942:     lead_lag=0;
16943:     lag=0;
16944:   }
16945:   if(num_lead_lag > MAXCORR){
16946:     (void)sprintf(buffer, "The lead/lag you have chosen exceeds the limit for number of correlations allowed.");
16947:     XtSetSensitive(pushButtonSpliceCorrelate, True);
16948:     SpManageWarningBox(buffer);
16949:     return;
16950:   }
16951: 
16952:   /*from window length find the first value(array member) of temp splice data array
16953:     that is within the window. then count out to the last value that is in the window
16954:   */
16955:   if(winlen > 0.0) {
16956:     for(i=0; i<spln; ++i){
16957:       if(splage[i] >= splage[spltie] - winlen){
16958:         sploffset=i;
16959:         break;
16960:       }
16961:     }
16962:     nwin=0;
16963:     for(j=i; j<spln; ++j){
16964:       if(splage[j] > splage[spltie] + winlen){
16965:         break;
16966:       }
16967:       else {
16968:         ++nwin;
16969:       }
16970:     }
16971:   }
16972:   else {
16973:     (void)sprintf(buffer, "Error: The window length is less than or equal to 0.0.");
16974:     SpManageWarningBox(buffer);
16975:     XtSetSensitive(pushButtonSpliceCorrelate, True);
16976:     return;
16977:   }
16978: 
16979:   /* calc. corr. coef. for each lead,lag in given window
16980:      note that timeoffset causes timeseries to lag and then lead
16981:      splice
16982:   */
16983:   corr.num_lead_lag[dset] = 0;
16984:   tie_corr_num = 0;
16985:   for(i=0;i<num_lead_lag; ++i){
16986:     timeoffset = timetie - spltie - lag;
16987:     Correlate(timen, nwin, timeoffset, sploffset, timeval, splvar,
16988:                     &coef, &n);
16989: 
16990:     /* cull out any lead/lag that had less than TOOFEWCORRPAIRS
16991:        which includes situations where the lead/lag caused core 1
16992:        to not overlay core 2; n=0
16993:     */
16994:     if(n < TOOFEWCORRPAIRS){
16995: 
16996:     }
16997:     else {
16998:       corr.coef[dset][corr.num_lead_lag[dset]] = coef;
16999:       corr.n[corr.num_lead_lag[dset]] = n;
17000:       corr.leadlag[dset][corr.num_lead_lag[dset]] = lag;
17001:       corr.depoffset[corr.num_lead_lag[dset]] = timeage[timetie] - splage[spltie] - lag * dt;
17002:       corr.depleadlag[dset][corr.num_lead_lag[dset]] = lag * dt;
17003:       if(lag == 0){
17004:         tie_corr_num = corr.num_lead_lag[dset];
17005:       }
17006:       ++corr.num_lead_lag[dset];
17007:     }
17008:     ++lag;
17009:   }
17010: 
17011:   best_corr = corr.coef[dset][0];
17012:   best_corr_num = 0;
17013:   for(i=1; i<corr.num_lead_lag[dset]; ++i){
17014:     if(corr.coef[dset][i] > best_corr){
17015:       best_corr = corr.coef[dset][i];
17016:       best_corr_num = i;
17017:     }
17018:   }
17019: 
17020:   have_splicetoage_corr = DO;
17021:   if(XtIsManaged(XtParent(drawingAreaTieToTimeSeriesCorr))) {
17022:     DrawDrawingAreaTieToTimeSeriesCorr(drawingAreaTieToTimeSeriesCorr, (XtPointer)NULL, (XtPointer)NULL);
17023:   }
17024:   if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
17025:     DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
17026:   }
17027: }
17028: 
17029: void
17030: SpliceToAgeAddTiedDatum(w, client_data, call_data)
17031:  Widget w;
17032:  XtPointer client_data;
17033:  XtPointer call_data;
17034: {
17035:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17036: 
17037:   int i, k, l, found, pos, array;
17038:   char *string;
17039:   float timeseries_age, spl_mbsf, spl_mcd, sedrat;
17040:   XmString xmstring;
17041:   void RecalcDatumAges(), DrawDrawingAreaAgeDepth(), PlotSpliceVsAge();
17042: 
17043:   XtSetSensitive(pushButtonSpliceToAgeAddTiedDatum, False);
17044:   XtSetSensitive(pushButtonSpliceToAgeRecorrelate, False);
17045:   XtSetSensitive(pushButtonSpliceToAgeClearTie, False);
17046:   have_timeseries_tie = DONT;
17047:   have_splicetoage_tie = DONT;
17048:   have_splicetoage_corr = DONT;
17049:   last_splicetoage_tie = NONE;
17050:   XClearWindow(XtDisplay(drawingAreaTieToTimeSeriesCorr), XtWindow(drawingAreaTieToTimeSeriesCorr));
17051: 
17052:   /* check that have not reached array limit
17053:   */
17054:   if(agemodel_cnt + 1 > MAXAGE) {
17055:     (void)sprintf(buffer, "You have exceeded the limit on the number of values in age model.");
17056:     SpManageWarningBox(buffer);
17057:     return;
17058:   }
17059: 
17060:   if(are_agemodelling == YES) {
17061: 
17062:     XtVaGetValues(labelSpliceToAgeTimeSeriesAge, XmNlabelString, &xmstring, NULL);
17063:     XmStringGetLtoR(xmstring, XmFONTLIST_DEFAULT_TAG, &string);
17064:     timeseries_age = atof(string);
17065:     XtFree(string);
17066:     XtVaGetValues(labelSpliceToAgeTiembsf, XmNlabelString, &xmstring, NULL);
17067:     XmStringGetLtoR(xmstring, XmFONTLIST_DEFAULT_TAG, &string);
17068:     spl_mbsf = atof(string);
17069:     XtFree(string);
17070:     XtVaGetValues(labelSpliceToAgeTieSplicemcd, XmNlabelString, &xmstring, NULL);
17071:     XmStringGetLtoR(xmstring, XmFONTLIST_DEFAULT_TAG, &string);
17072:     spl_mcd = atof(string);
17073:     XtFree(string);
17074: 
17075:     xmstring = XmStringCreateSimple("");
17076:     XtVaSetValues(labelSpliceToAgeTimeSeriesAge, XmNlabelString, xmstring, NULL);
17077:     XtVaSetValues(labelSpliceToAgeTiembsf, XmNlabelString, xmstring, NULL);
17078:     XtVaSetValues(labelSpliceToAgeTieID, XmNlabelString, xmstring, NULL);
17079:     XtVaSetValues(labelSpliceToAgeTieVar, XmNlabelString, xmstring, NULL);
17080:     XtVaSetValues(labelSpliceToAgeTieSpliceAge, XmNlabelString, xmstring, NULL);
17081:     XtVaSetValues(labelSpliceToAgeTieSplicemcd, XmNlabelString, xmstring, NULL);
17082:     XmStringFree(xmstring);
17083: 
17084:     /* put this time series tied datum in age model struct in order by both age and depth
17085:        there must not be conflicts other timeseries age and depth but ignore conflicts
17086:        with strat datums
17087:        if needed, calculate a new age for start datums that conflict with timeseries
17088:        note that pos = the array indicy of the added date
17089:     */
17090:     if(agemodel_cnt >= 1) {
17091:       pos = -1;
17092:       for(k=0; k<agemodel_cnt; ++k) {
17093:         if(k == 0 && spl_mcd < agemodel[k].avemcd) {
17094:           pos = k;
17095:           break;
17096:         }
17097:         else if(k == agemodel_cnt-1 && spl_mcd > agemodel[k].avemcd) {
17098:           pos = k + 1;
17099:           break;
17100:         }
17101:         else if(k < agemodel_cnt-1 && spl_mcd > agemodel[k].avemcd && spl_mcd < agemodel[k+1].avemcd) {
17102:           pos = k + 1;
17103:           break;
17104:         }
17105:       }
17106: 
17107:       /* check that have not picked a tuned age that conflicts with other
17108:          tuned age(s) in age model
17109:       */
17110:       if(pos != -1) {
17111:         i=pos - 1;
17112:         while(i>0 && timeseries_age < agemodel[i].aveage && 
17113:               agemodel[i].type != TIME  && agemodel[i].type != HANDPICK) {
17114:           --i;
17115:         }
17116:         if(i == 0) {
17117:         }
17118:         else if(timeseries_age < agemodel[i].aveage && (agemodel[i].type == TIME  || agemodel[i].type == HANDPICK)) {
17119:           (void)sprintf(buffer, "The time series age datum conflicts with a tuned datum above it.");
17120:           SpManageWarningBox(buffer);
17121:           return;
17122:         }
17123:         i=pos;
17124:         while(i<agemodel_cnt-1 && timeseries_age > agemodel[i].aveage && 
17125:               agemodel[i].type != TIME  && agemodel[i].type != HANDPICK) {
17126:           ++i;
17127:         }
17128:         if(i == agemodel_cnt+1) {
17129:         }
17130:         else if(timeseries_age > agemodel[i].aveage && (agemodel[i].type == TIME  || agemodel[i].type == HANDPICK)) {
17131:           (void)sprintf(buffer, "The time series age datum conflicts with a tuned datum below it.");
17132:           SpManageWarningBox(buffer);
17133:           return;
17134:         }
17135:       }
17136: 
17137:       if(pos == -1) {
17138:         (void)sprintf(buffer, "Could not place the time series age datum in the list.");
17139:         SpManageWarningBox(buffer);
17140:         return;
17141:       }
17142:       else {
17143:         ++agemodel_cnt;
17144:         if(pos == agemodel_cnt-1) {
17145:           array = agemodel_cnt-1;
17146:         }
17147:         else {
17148:           for(k=agemodel_cnt-1; k>pos; --k) {
17149:             agemodel[k] = agemodel[k-1];
17150:           }
17151:           array = pos;
17152:         }
17153:       }
17154:     }
17155:     else if(agemodel_cnt == 0) {
17156:       agemodel_cnt = 1;
17157:       array = 0;
17158:     }
17159: 
17160:     agemodel[array].aveage = timeseries_age;
17161:     agemodel[array].type = TIME;
17162:     (void)sprintf(agemodel[array].code, "T");
17163:     (void)sprintf(agemodel[array].name, "timeseries");
17164: 
17165:     if(timeseries_age == 0.0 && spl_mcd == 0.0) {
17166:       agemodel[array].avembsf = 0.0;
17167:       agemodel[array].avemcd = 0.0;
17168:     }
17169:     else {
17170:       agemodel[array].avembsf = spl_mbsf;
17171:       agemodel[array].avemcd = spl_mcd;
17172:     }
17173: 
17174:     RecalcDatumAges();
17175: 
17176:     XmListDeleteAllItems(listConstructAgeModel);
17177:     for(i=0; i<agemodel_cnt; ++i) {
17178:       if((string=(char*)calloc((int)strlen(agemodel[i].name)+(int)strlen(agemodel[i].code)+100,CHAR_SIZE))==NULL)
17179:                         SpBadMemAlloc("SpliceToAgeAddTiedDatum");
17180:       (void)sprintf(string, "%7.2f  %7.2f   %7.3f    %s %s", agemodel[i].avembsf, agemodel[i].avemcd,
17181:                                             agemodel[i].aveage, agemodel[i].name, agemodel[i].code);
17182:       xmstring = XmStringCreateSimple(string);
17183:       XmListAddItemUnselected(listConstructAgeModel, xmstring, i + 1);
17184:       XmStringFree(xmstring);
17185:       free(string);
17186:     } 
17187: 
17188:   }
17189: 
17190:   if(agemodel_cnt > 1) {
17191:     XtSetSensitive(pushButtonSaveAgeMode, True);
17192:     XtSetSensitive(pushButtonRemoveSelectDatum, True);
17193:     XtSetSensitive(pushButtonAgeDepthClearAgeMododelList, True);
17194:     if(have_splice == DO) {
17195:       XtSetSensitive(pushButtonPlotSpliceVsAge, True);
17196:       XtSetSensitive(pushButtonSaveSpliceToAge, True);
17197:       if(have_time_series == DONT) {
17198:         XtSetSensitive(pushButtonOpenAgeSignal, True);
17199:         XtSetSensitive(pushButtonOpenTimeSeries, True);
17200:       }
17201:       else if(have_time_series == DO) {
17202:         XtSetSensitive(pushButtonOpenAgeSignal, False);
17203:         XtSetSensitive(pushButtonOpenTimeSeries, False);
17204:       }
17205:       have_splicetoage = DO;
17206:     }
17207:     else {
17208:       XtSetSensitive(pushButtonPlotSpliceVsAge, False);
17209:       XtSetSensitive(pushButtonSaveSpliceToAge, False);
17210:       XtSetSensitive(pushButtonOpenAgeSignal, False);
17211:       XtSetSensitive(pushButtonOpenTimeSeries, False);
17212:       have_splicetoage = DONT;
17213:     }
17214:     did_agemodel = YES;
17215:     saved_agemodel = NO;
17216:   }
17217:   else {
17218:     XtSetSensitive(pushButtonPlotSpliceVsAge, False);
17219:     XtSetSensitive(pushButtonSaveAgeMode, False);
17220:     XtSetSensitive(pushButtonSaveSpliceToAge, False);
17221:     XtSetSensitive(pushButtonRemoveSelectDatum, False);
17222:     XtSetSensitive(pushButtonAgeDepthClearAgeMododelList, False);
17223:     XtSetSensitive(pushButtonOpenAgeSignal, False);
17224:     XtSetSensitive(pushButtonOpenTimeSeries, False);
17225:     have_splicetoage = DONT;
17226:   }
17227:   if(agemodel_cnt > 0) {
17228:     XtSetSensitive(pushButtonRemoveSelectDatum, True);
17229:     XtSetSensitive(pushButtonAgeDepthClearAgeMododelList, True);
17230:   }
17231:   else {
17232:     XtSetSensitive(pushButtonRemoveSelectDatum, False);
17233:     XtSetSensitive(pushButtonAgeDepthClearAgeMododelList, False);
17234:   }
17235: 
17236: 
17237:   if(XtIsManaged(XtParent(drawingAreaAgeDepth))) {
17238:     DrawDrawingAreaAgeDepth(drawingAreaAgeDepth, (XtPointer)NULL, (XtPointer)NULL);
17239:   }
17240:   if(have_splicetoage == DO) {
17241:     PlotSpliceVsAge(NO);
17242:   }
17243: }
17244: 
17245: /* ARGSUSED */
17246: void
17247: DrawDrawingAreaTieToTimeSeriesCorr(w, client_data, call_data)
17248: Widget w;
17249: XtPointer client_data;
17250: XtPointer call_data;
17251: {
17252:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17253: 
17254:   int i, nlagtic, sx, sy, sdx, sdy,
17255:       xaxispixlen, yaxispixlen, err;
17256:   float lagtic, maxlag;
17257:   double fract, check, ip;
17258:   Dimension win_height, win_width;
17259:   XGCValues gcValues;
17260:   void AxisCorr();
17261:   int XAxisTimeCorrSetup();
17262: 
17263:   XClearWindow(XtDisplay(w), XtWindow(w));
17264:   XtVaGetValues(w, XmNheight, &win_height, XmNwidth, &win_width, NULL);
17265: 
17266:   /*calc. the length of the y axis and the half length
17267:     of the x axis. adjust the length of x axis if its
17268:     total length is not divisable by ten
17269:   */
17270:   xaxispixlen = ((int)win_width - (2 * SPACE))/2;
17271:   yaxispixlen = ((int)win_height - (2 * SPACE));
17272: 
17273:   if(have_splicetoage_corr == DO &&  lead_lag > 0){
17274:     check = yaxispixlen;
17275:     fract = modf((check/10.0), &ip);
17276:     if(fract == 0.0){
17277:     }
17278:     else if(fract < 0.5){
17279:       yaxispixlen = ip * 10.0;
17280:     }
17281:     else {
17282:       yaxispixlen = (ip * 10.0) + 10.0;
17283:     }
17284:     check = yaxispixlen;
17285:     if((corrperpix = 2.0/check) <= 0) {
17286:       return;
17287:     }
17288: 
17289:     /* x=lead-lag axis
17290:     */
17291:     if((err = XAxisTimeCorrSetup(lead_lag, depstep, &xaxispixlen, &lagtic, &nlagtic, &lagperpix, &maxlag)) != 0) {
17292:       return;
17293:     }
17294: 
17295:     /*set the axis and label color
17296:     */
17297:     XSetForeground(XtDisplay(w), gc_drawingAreaTieToTimeSeriesCorr,
17298:                    fgPixel[LABEL_COLOR]);
17299:     AxisCorr(XtDisplay(w), XtWindow(w), gc_drawingAreaTieToTimeSeriesCorr,
17300:                        lagtic, nlagtic, maxlag, yaxispixlen, xaxispixlen, 2);
17301: 
17302:     /*set the corr. coef. color
17303:     */
17304:     XSetForeground(XtDisplay(w), gc_drawingAreaTieToTimeSeriesCorr,
17305:                    fgPixel[CORRCOEF_COLOR]);
17306:     gcValues.line_width = 2;
17307:     XChangeGC(XtDisplay(w), gc_drawingAreaTieToTimeSeriesCorr, GCLineWidth, &gcValues);
17308:     for(i=0; i<corr.num_lead_lag[dset]-1; ++i){
17309:       sx=(corr.depleadlag[dset][i]/lagperpix) + SPACE + xaxispixlen;
17310:       sy= -1.0 * (corr.coef[dset][i]/corrperpix) + SPACE + yaxispixlen/2;
17311:       sdx=(corr.depleadlag[dset][i+1]/lagperpix) + SPACE + xaxispixlen;
17312:       sdy= -1.0 * (corr.coef[dset][i+1]/corrperpix) + SPACE + yaxispixlen/2;
17313:       XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaTieToTimeSeriesCorr,
17314:                            sx, sy, sdx, sdy);
17315:       if(i == best_corr_num || i+1 == best_corr_num){
17316:         XSetForeground(XtDisplay(w), gc_drawingAreaTieToTimeSeriesCorr,
17317:                    fgPixel[BESTCORR_COLOR]);
17318:         if(i == best_corr_num){
17319:           XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaTieToTimeSeriesCorr,
17320:                            sx, (SPACE + yaxispixlen/2) - 5, sx, (SPACE + yaxispixlen/2) + 5);
17321:         }
17322:         else if(i+1 == best_corr_num){
17323:           XDrawLine(XtDisplay(w), XtWindow(w), gc_drawingAreaTieToTimeSeriesCorr,
17324:                            sdx, (SPACE + yaxispixlen/2) - 5, sdx, (SPACE + yaxispixlen/2) + 5);
17325:         }
17326:         XSetForeground(XtDisplay(w), gc_drawingAreaTieToTimeSeriesCorr,
17327:                    fgPixel[CORRCOEF_COLOR]);
17328:       }
17329:     }
17330:     gcValues.line_width = 0;
17331:     XChangeGC(XtDisplay(w), gc_drawingAreaTieToTimeSeriesCorr, GCLineWidth, &gcValues);
17332:   } 
17333:   else {
17334:   }
17335: }
17336: 
17337: /* ARGSUSED */
17338: void
17339: EventProcDrawingAreaTieToTimeSeriesCorr(w, event, args, num_args)
17340: Widget w;
17341: XButtonEvent *event;
17342: String *args;
17343: int *num_args;
17344: {
17345:   int x, i, kk, diff, xaxispixlen, idum, err;
17346:   char string[200];
17347:   float  fdum;
17348:   double check, fract, ip;
17349:   XmString xmstring;
17350:   Dimension  win_width;
17351:   int XAxisTimeCorrSetup();
17352: 
17353:   x = event->x;
17354: 
17355:   if(have_splicetoage_corr == DONT){
17356:     (void)sprintf(string, "");
17357:   }
17358:   else if(have_splicetoage_corr == DO && corr.num_lead_lag[dset] > 0){
17359: 
17360:     XtVaGetValues(w, XmNwidth, &win_width, NULL);
17361: 
17362:     /*calc. the length of the y axis and the half length
17363:       of the x axis. adjust the length of x axis if its
17364:       total length is not divisable by ten
17365:     */
17366:     xaxispixlen = ((int)win_width - (2 * SPACE))/2;
17367: 
17368:     /*
17369:     */
17370:     if((err = XAxisTimeCorrSetup(lead_lag, depstep, &xaxispixlen, &fdum, &idum, &lagperpix, &fdum)) != 0) {
17371:       return;
17372:     }
17373: 
17374:     check = corr.depleadlag[dset][0]/lagperpix + SPACE + xaxispixlen;
17375:     diff= fabs(x-check);
17376:     kk = 0;
17377:     for(i=1; i<corr.num_lead_lag[dset]; ++i){
17378:       check = corr.depleadlag[dset][i]/lagperpix + SPACE + xaxispixlen;
17379:       if(fabs(x-check) < diff){
17380:         diff = fabs(x-check);
17381:         kk=i;
17382:       }
17383:     }
17384:     (void)sprintf(string, "lead/leg = %.4fMa  coef = %4.2f  n = %3d  age offset = %10.4fMa",
17385:               corr.depleadlag[dset][kk], corr.coef[dset][kk], corr.n[kk], corr.depoffset[kk]);
17386:   }
17387:   else {
17388:     (void)sprintf(string, "");
17389:   }
17390: 
17391:   if((int)strcmp(args[0], "but_1_down") == 0 || (int)strcmp(args[0], "but_1_move") == 0) {
17392:     xmstring = XmStringCreateSimple(string);
17393:     XtVaSetValues(labelSpliceToAgeCursorLocation, XmNlabelString, xmstring, NULL);
17394:     XmStringFree(xmstring);
17395:   }
17396:   else if((int)strcmp(args[0], "but_1_up") == 0) {
17397:     (void)sprintf(string, "");
17398:     xmstring = XmStringCreateSimple(string);
17399:     XtVaSetValues(labelSpliceToAgeCursorLocation, XmNlabelString, xmstring, NULL);
17400:     XmStringFree(xmstring);
17401:   }
17402: 
17403:   (void)sprintf(string, "");
17404: }
17405: 
17406: void
17407: SpliceToAgeRemoveTimeSeries(w, client_data, call_data)
17408:  Widget w;
17409:  XtPointer client_data;
17410:  XtPointer call_data;
17411: {
17412:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17413: 
17414:   XmString xmstring;
17415:   void DrawDrawingAreaSpliceToAge();
17416: 
17417:   SpCleanUp(TIMESERIES);
17418: 
17419:   have_time_series = DONT;
17420:   have_timeseries_tie = DONT;
17421:   have_splicetoage_tie = DONT;
17422:   XtUnmanageChild(formSpliceToAgeTieToTimeSeries);
17423:   XtUnmanageChild(labelInvertTimeSeries);
17424:   XtUnmanageChild(radioBoxInvertTimeSeries);
17425:   XtVaSetValues(XtParent(formSpliceToAge), XmNwidth, 560, NULL);
17426:   XtSetSensitive(pushButtonOpenAgeSignal, True);
17427:   XtSetSensitive(pushButtonOpenTimeSeries, True);
17428:   XtSetSensitive(radioBoxInvertTimeSeries, False);
17429:   XtSetSensitive(pushButtonSpliceToAgeRemoveTimeSeries, False);
17430:   xmstring=XmCvtCTToXmString("Open Time Series");
17431:   XtVaSetValues(pushButtonOpenTimeSeries,XmNlabelString,xmstring,NULL);
17432:   XtVaSetValues(pushButtonOpenAgeSignal,XmNlabelString,xmstring,NULL);
17433:   XmStringFree(xmstring);
17434: 
17435:   if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
17436:     reason_for_redraw = DRAW_EVERYTHING;
17437:     DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
17438:   }
17439: }
17440: 
17441: void
17442: SpliceToAgeClearTie(w, client_data, call_data)
17443:  Widget w;
17444:  XtPointer client_data;
17445:  XtPointer call_data;
17446: {
17447:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17448: 
17449:   void DrawDrawingAreaSpliceToAge();
17450: 
17451:   have_timeseries_tie = DONT;
17452:   have_splicetoage_tie = DONT;
17453:   last_splicetoage_tie = NONE;
17454:   XtSetSensitive(pushButtonSpliceToAgeAddTiedDatum, False);
17455:   XtSetSensitive(pushButtonSpliceToAgeRecorrelate, False);
17456:   XtSetSensitive(pushButtonSpliceToAgeClearTie, False);
17457: 
17458:   if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
17459:     reason_for_redraw = DRAW_EVERYTHING;
17460:     DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
17461:   } 
17462: }
17463: 
17464: void
17465: OpenSplicerTable(w, client_data, call_data)
17466:  Widget w;
17467:  XtPointer client_data;
17468:  XtPointer call_data;
17469: {
17470:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17471: 
17472:   char *str, *path;
17473:   int  len;
17474:   XmString xmstring;
17475: 
17476:   void SpUpdateFileSelection();
17477: 
17478:   XtManageChild(formFileSelection);
17479:   XtPopup(XtParent(formFileSelection),XtGrabNone);
17480:   xmstring=XmCvtCTToXmString("Read");
17481:   XtVaSetValues(pushButtonFileSelectionOK,XmNlabelString,xmstring,NULL);
17482:   XmStringFree(xmstring);
17483: 
17484:   fileselection = OPENSPLICETABLE;
17485: 
17486:   XtVaSetValues(xmDialogShellFileSelection, XmNtitle, "Open Splicer Table", NULL);
17487:   XtVaSetValues(textFileSelectionSelected, XmNvalue, "", NULL);
17488: 
17489:   if((path=(char*)calloc((int)strlen(splicertable.dirname)+1000,CHAR_SIZE))==NULL)
17490:                                 SpBadMemAlloc("OpenSplicerTable");
17491:   (void)sprintf(path, "%s", splicertable.dirname);
17492: 
17493:   len = (int)strlen(path);
17494:   if(strcmp(&path[len-1], "/") == 0) {
17495:     *strrchr(path,'/')= '\0';   
17496:   }
17497: 
17498:   if((str=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
17499:     SpBadMemAlloc("OpenSplicerTable");
17500:   }
17501:   (void)sprintf(str,"%s/*", path);
17502:   XtVaSetValues(textFileSelectionFilter, XmNvalue, str, NULL);
17503:   free(str);
17504: 
17505:   XtVaSetValues(textFileSelectionSelected, XmNvalue, splicertable.filename, NULL);
17506: 
17507:   SpUpdateFileSelection(FILE_FILTER, OPENSPLICETABLE, path);
17508:   (void)sprintf(preview_input_path,"%s",path);
17509: 
17510:   free(path);
17511:   if(path)
17512:     path = NULL;
17513: }
17514: 
17515: void
17516: OpenStrat(w, client_data, call_data)
17517:  Widget w;
17518:  XtPointer client_data;
17519:  XtPointer call_data;
17520: {
17521:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17522: 
17523:   int  len;
17524:   char *str, *path;
17525:   XmString xmstring;
17526: 
17527:   void SpUpdateFileSelection();
17528: 
17529:   XtManageChild(formFileSelection);
17530:   XtPopup(XtParent(formFileSelection),XtGrabNone);
17531:   xmstring=XmCvtCTToXmString("Read");
17532:   XtVaSetValues(pushButtonFileSelectionOK,XmNlabelString,xmstring,NULL);
17533:   XmStringFree(xmstring);
17534:   XtVaSetValues(XtParent(formFileSelection), XmNheight, 670, NULL);
17535:   XtVaSetValues(optionMenuStratType1, XmNmappedWhenManaged, True, NULL);
17536:   XtVaSetValues(labelStratType1, XmNmappedWhenManaged, True, NULL);
17537:   XtManageChild(optionMenuStratType1);
17538:   XtManageChild(labelStratType1);
17539: 
17540:   fileselection = OPENSTRAT;
17541: 
17542:   XtVaSetValues(xmDialogShellFileSelection, XmNtitle, "Open Stratigraphy", NULL);
17543:   XtVaSetValues(textFileSelectionSelected, XmNvalue, "", NULL);
17544: 
17545:   if((path=(char*)calloc((int)strlen(default_strat_dirname)+1000,CHAR_SIZE))==NULL)
17546:                                 SpBadMemAlloc("OpenSplicerTable");
17547:   (void)sprintf(path, "%s", default_strat_dirname);
17548: 
17549:   len = (int)strlen(path);
17550:   if(strcmp(&path[len-1], "/") == 0) {
17551:     *strrchr(path,'/')= '\0';
17552:   }
17553: 
17554:   if((str=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
17555:     SpBadMemAlloc("OpenStrat");
17556:   }
17557:   (void)sprintf(str, "%s", path);
17558:   XtVaSetValues(textFileSelectionSelected, XmNvalue, str, NULL);
17559:   (void)strncat(str,"/*",2);
17560:   XtVaSetValues(textFileSelectionFilter, XmNvalue, str, NULL);
17561:   free(str);
17562: 
17563:   SpUpdateFileSelection(FILE_FILTER,OPENSTRAT, path);
17564:   (void)sprintf(preview_input_path,"%s",path);
17565: 
17566:   free(path);
17567:   if(path)
17568:     path = NULL;
17569: }
17570: 
17571: void
17572: FileSelectionPreviewInputFilter(w, client_data, call_data)
17573:  Widget w;
17574:  XtPointer client_data;
17575:  XtPointer call_data;
17576: {
17577:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17578: 
17579:   void SpUpdateFileSelection();
17580: 
17581:   SpUpdateFileSelection(FILE_FILTER, PREVIEWINPUT, preview_input_path);
17582:   XtVaSetValues(textFileSelectionSelectedPreviewInput, XmNvalue, preview_input_path, NULL);
17583: }
17584: 
17585: void
17586: FileSelectionPreviewInputOK(w, client_data, call_data)
17587:  Widget w;
17588:  XtPointer client_data;
17589:  XtPointer call_data;
17590: {
17591:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17592: 
17593:   char *infile;
17594:   FILE *fd;
17595: 
17596:   infile = XmTextGetString(textFileSelectionSelectedPreviewInput);
17597:   if(strlen(infile) == 0) {
17598:     return;
17599:   }
17600: 
17601:   /* check that filename is a valid name
17602:   */
17603:   if((fd=fopen(infile, "r")) == NULL) {
17604:     (void)sprintf(buffer,"Error opening preview input file %s", infile);
17605:     SpManageWarningBox(buffer);
17606:   }
17607:   else {
17608: 
17609:     fclose(fd);
17610:     ReadPreviewInput(infile);
17611:     XtManageChild(formPreviewInput);
17612:     XtPopup(XtParent(formPreviewInput),XtGrabNone);
17613:   }
17614: 
17615:   free(infile);
17616: }
17617: 
17618: void
17619: FileSelectionPreviewInputCancel(w, client_data, call_data)
17620:  Widget w;
17621:  XtPointer client_data;
17622:  XtPointer call_data;
17623: {
17624:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17625: 
17626:   XtUnmanageChild(formFileSelectionPreviewInput);
17627: }
17628: 
17629: void
17630: FileSelectionDirectoryPreviewInput(w, client_data, call_data)
17631:  Widget w;
17632:  XtPointer client_data;
17633:  XtPointer call_data;
17634: {
17635:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17636: 
17637:   void SpUpdateFileSelection();
17638: 
17639:   SpUpdateFileSelection(DIRECTORIES,PREVIEWINPUT, preview_input_path);
17640: 
17641:   XtVaSetValues(textFileSelectionSelectedPreviewInput, XmNvalue, preview_input_path, NULL);
17642: 
17643: }
17644: 
17645: void
17646: FileSelectionFilePreviewInput(w, client_data, call_data)
17647:  Widget w;
17648:  XtPointer client_data;
17649:  XtPointer call_data;
17650: {
17651:     XmListCallbackStruct *acs=(XmListCallbackStruct*)call_data;
17652: 
17653:   int nfile;
17654:   char *infile, *path;
17655: 
17656:   /* get selected file name
17657:   */
17658: 
17659:   XmStringGetLtoR(acs->item,XmFONTLIST_DEFAULT_TAG,&infile);
17660:   if((path=(char*)calloc((int)strlen(preview_input_path) + (int)strlen(infile)+50,CHAR_SIZE))==NULL)
17661:                         SpBadMemAlloc("FileSelectionFile");
17662: 
17663:   (void)sprintf(path,"%s/%s",preview_input_path, infile);
17664:   XtVaSetValues(textFileSelectionSelectedPreviewInput, XmNvalue, path, NULL);
17665: 
17666:   free(infile);
17667:   free(path);
17668: }
17669: 
17670: void
17671: InvertTimeSeries(w, client_data, call_data)
17672:  Widget w;
17673:  XtPointer client_data;
17674:  XtPointer call_data;
17675: {
17676:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17677: 
17678:   void SpliceToAgeRecorrelate();
17679:   char *pclient = (char*) client_data;
17680: 
17681:   if(*pclient == 'Y') {
17682:     XmToggleButtonSetState(toggleButtonTimeSeriesInvertYes, True, False);
17683:     XmToggleButtonSetState(toggleButtonTimeSeriesInvertNo, False, False);
17684:   }
17685:   else if(*pclient == 'N') {
17686:     XmToggleButtonSetState(toggleButtonTimeSeriesInvertNo, True, False);
17687:     XmToggleButtonSetState(toggleButtonTimeSeriesInvertYes, False, False);
17688:   }
17689: 
17690:   else {
17691:     XmToggleButtonSetState(toggleButtonTimeSeriesInvertNo, True, False);
17692:     XmToggleButtonSetState(toggleButtonTimeSeriesInvertYes, False, False);
17693:   }
17694: 
17695:   if(have_time_series == DO) {
17696:     if(XtIsManaged(XtParent(drawingAreaSpliceToAge))) {
17697:       DrawDrawingAreaSpliceToAge(drawingAreaSpliceToAge, (XtPointer)NULL, (XtPointer)NULL);
17698:     }
17699:   }
17700: 
17701:   if(have_splicetoage_tie == DO && have_timeseries_tie == DO &&
17702:     have_splicetoage == DO && have_time_series == DO) {
17703:     SpliceToAgeRecorrelate((Widget)NULL, (XtPointer)NULL, (XtPointer)NULL);
17704:   }
17705: }
17706: 
17707: void
17708: SpDontUseAffineCB(w, client_data, call_data)
17709:  Widget w;
17710:  XtPointer client_data;
17711:  XtPointer call_data;
17712: {
17713:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17714: 
17715:         XmToggleButtonCallbackStruct *toggle_info=(XmToggleButtonCallbackStruct *) call_data;
17716:         affine.usetable = False;
17717:         if(toggle_info->set) {
17718:           XmTextSetString(textFieldAffineFileName,"");
17719:           XtSetSensitive(pushButtonSelectAffineFileName, False);
17720:         }
17721: }
17722: 
17723: void
17724: OpenFormatODPOtherActive(w, client_data, call_data)
17725:  Widget w;
17726:  XtPointer client_data;
17727:  XtPointer call_data;
17728: {
17729:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17730: 
17731:    char string [10];
17732: 
17733:   XtManageChild(formOpenFormatsOther);
17734:   XtPopup(XtParent(formOpenFormatsOther),XtGrabNone);
17735:   XtSetSensitive(pushButtonOpenReflectance, True);
17736:   XtSetSensitive(pushButtonOpenGrape, True);
17737:   XtSetSensitive(pushButtonOpenPwave, True);
17738:   XtSetSensitive(pushButtonOpenSusceptibility, True);
17739:   XtSetSensitive(pushButtonOpenNaturalGamma, True);
17740:   XtSetSensitive(pushButtonOpenOtherType, True);
17741:   XtSetSensitive(toggleButtonHeaderNo, True);
17742:   XtSetSensitive(toggleButtonHeaderYes, True);
17743:   XtSetSensitive(textFieldNHeader, True);
17744: 
17745:   if(XmToggleButtonGetState(toggleButtonOpenFormatsOther1) == True) {
17746:     (void)sprintf(string, "10");
17747:   }
17748:   else if(XmToggleButtonGetState(toggleButtonOpenFormatsOther2) == True) {
17749:     (void)sprintf(string, "9");
17750:   }
17751:   else if(XmToggleButtonGetState(toggleButtonOpenFormatsOther3) == True) {
17752:     (void)sprintf(string, "8");
17753:   }
17754:   else if(XmToggleButtonGetState(toggleButtonOpenFormatsOther4) == True) {
17755:     (void)sprintf(string, "7");
17756:   }
17757:   else if(XmToggleButtonGetState(toggleButtonOpenFormatsOther5) == True) {
17758:     (void)sprintf(string, "9");
17759:   }
17760:   else {
17761:     (void)sprintf(string, "?");
17762:   }
17763:   XtVaSetValues(textFieldOpenFormatOtherValueColumn, XmNvalue, string, NULL);
17764: 
17765:   (void)sprintf(string, "");
17766: }
17767: 
17768: void
17769: SelectAffineTableFileName(w, client_data, call_data)
17770:  Widget w;
17771:  XtPointer client_data;
17772:  XtPointer call_data;
17773: {
17774:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17775: 
17776:   char *str, *path;
17777:   int  len;
17778:   XmString xmstring;
17779: 
17780:   void SpUpdateFileSelection();
17781: 
17782:   XtUnmanageChild(formUseAffine);
17783:   XtManageChild(formFileSelection);
17784:   XtPopup(XtParent(formFileSelection),XtGrabNone);
17785:   xmstring=XmCvtCTToXmString("OK");
17786:   XtVaSetValues(pushButtonFileSelectionOK,XmNlabelString,xmstring,NULL);
17787:   XmStringFree(xmstring);
17788: 
17789:   fileselection = OPENAFFINE;
17790: 
17791:   XtVaSetValues(xmDialogShellFileSelection, XmNtitle, "Open Affine Table", NULL);
17792:   XtVaSetValues(textFileSelectionSelected, XmNvalue, "", NULL);
17793: 
17794:   if((path=(char*)calloc((int)strlen(affine.dirname)+1000,CHAR_SIZE))==NULL)
17795:                                 SpBadMemAlloc("SelectAffineTableFileName");
17796:   (void)sprintf(path, "%s", affine.dirname);
17797: 
17798:   len = (int)strlen(path);
17799:   if(strcmp(&path[len-1], "/") == 0) {
17800:     *strrchr(path,'/')= '\0';
17801:   }
17802: 
17803:   if((str=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
17804:     SpBadMemAlloc("SelectAffineTableFileName");
17805:   }
17806:   (void)sprintf(str,"%s/*", path);
17807:   XtVaSetValues(textFileSelectionFilter, XmNvalue, str, NULL);
17808:   free(str);
17809: 
17810:   XtVaSetValues(textFileSelectionSelected, XmNvalue, affine.filename, NULL);
17811: 
17812:   SpUpdateFileSelection(FILE_FILTER, OPENAFFINE, path);
17813:   (void)sprintf(preview_input_path,"%s",path);
17814: 
17815:   free(path);
17816:   if(path)
17817:     path = NULL;
17818: }
17819: 
17820: void
17821: OpenFormatTKActive(w, client_data, call_data)
17822:  Widget w;
17823:  XtPointer client_data;
17824:  XtPointer call_data;
17825: {
17826:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17827: 
17828:   Widget tmp_widget;
17829: 
17830:   XtVaGetValues(optionMenuOpenType,XmNmenuHistory,&tmp_widget,NULL);
17831:   if(tmp_widget == pushButtonOpenOtherType) {
17832:     XtVaSetValues(optionMenuOpenType, XmNmenuHistory, pushButtonOpenGrape, NULL);
17833:   }
17834:   XtSetSensitive(pushButtonOpenReflectance, True);
17835:   XtSetSensitive(pushButtonOpenGrape, True);
17836:   XtSetSensitive(pushButtonOpenPwave, True);
17837:   XtSetSensitive(pushButtonOpenSusceptibility, True);
17838:   XtSetSensitive(pushButtonOpenNaturalGamma, True);
17839:   XtSetSensitive(pushButtonOpenOtherType, False);
17840:   XtSetSensitive(toggleButtonHeaderNo, True);
17841:   XtSetSensitive(toggleButtonHeaderYes, True);
17842:   XtSetSensitive(textFieldNHeader, True);
17843: }
17844: 
17845: void
17846: OpenFormatMST95Active(w, client_data, call_data)
17847:  Widget w;
17848:  XtPointer client_data;
17849:  XtPointer call_data;
17850: {
17851:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17852:  
17853:   Widget tmp_widget;
17854: 
17855:   XtVaGetValues(optionMenuOpenType,XmNmenuHistory,&tmp_widget,NULL);
17856:   if(tmp_widget == pushButtonOpenOtherType) {
17857:     XtVaSetValues(optionMenuOpenType, XmNmenuHistory, pushButtonOpenGrape, NULL);
17858:   }
17859:   XtSetSensitive(pushButtonOpenReflectance, True);
17860:   XtSetSensitive(pushButtonOpenGrape, True);
17861:   XtSetSensitive(pushButtonOpenPwave, True);
17862:   XtSetSensitive(pushButtonOpenSusceptibility, True);
17863:   XtSetSensitive(pushButtonOpenNaturalGamma, True);
17864:   XtSetSensitive(pushButtonOpenOtherType, False);
17865:   XtSetSensitive(toggleButtonHeaderNo, True);
17866:   XtSetSensitive(toggleButtonHeaderYes, True);
17867:   XtSetSensitive(textFieldNHeader, True);
17868: }
17869: 
17870: void
17871: OpenFormatOSUSCATActive(w, client_data, call_data)
17872:  Widget w;
17873:  XtPointer client_data;
17874:  XtPointer call_data;
17875: {
17876:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17877: 
17878:   XtVaSetValues(optionMenuOpenType, XmNmenuHistory, pushButtonOpenReflectance, NULL);
17879:   XtSetSensitive(pushButtonOpenReflectance, True);
17880:   XtSetSensitive(pushButtonOpenGrape, False);
17881:   XtSetSensitive(pushButtonOpenPwave, False);
17882:   XtSetSensitive(pushButtonOpenSusceptibility, False);
17883:   XtSetSensitive(pushButtonOpenNaturalGamma, False);
17884:   XtSetSensitive(pushButtonOpenOtherType, False);
17885:   XtSetSensitive(toggleButtonHeaderNo, True);
17886:   XtSetSensitive(toggleButtonHeaderYes, True);
17887:   XtSetSensitive(textFieldNHeader, True);
17888: }
17889: 
17890: void
17891: ColorTimeSeries(w, client_data, call_data)
17892:  Widget w;
17893:  XtPointer client_data;
17894:  XtPointer call_data;
17895: {
17896:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17897: 
17898:   int item_count;
17899:   char *rgbcolor;
17900:   XmString *pcolor;
17901:   Pixel sampPixel;
17902:   int GetColorPixelValue();
17903: 
17904:   /* get the selected color name from the list
17905:   */
17906:   XtVaGetValues(listColor, XmNselectedItemCount,&item_count,
17907:                 XmNselectedItems,&pcolor, NULL);
17908:   XmStringGetLtoR(pcolor[0], XmFONTLIST_DEFAULT_TAG, &rgbcolor);
17909: 
17910:   /* and change the  color of the core label button
17911:   */
17912:   GetColorPixelValue(XtDisplay(w), rgbcolor, &sampPixel);
17913:   XtVaSetValues(pushButtonColorTimeSeries, XmNbackground, sampPixel, NULL);
17914: 
17915:   XtVaSetValues(pushButtonColorTimeSeries, XmNlabelString, pcolor[0], NULL);
17916:   (void)sprintf(tempcolor[TIMESERIES_COLOR], "%s", rgbcolor);
17917:   tempfgPixel[TIMESERIES_COLOR] = sampPixel;
17918:   XtFree(rgbcolor);
17919: }
17920: 
17921: void
17922: SaveAffineTable(w, client_data, call_data)
17923:  Widget w;
17924:  XtPointer client_data;
17925:  XtPointer call_data;
17926: {
17927:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17928: 
17929:   char *str, *path;
17930:   int  len;
17931:   XmString xmstring;
17932:  
17933:   void SpUpdateFileSelection();
17934: 
17935:   XtManageChild(formFileSelection);
17936:   XtPopup(XtParent(formFileSelection),XtGrabNone);
17937:   xmstring=XmCvtCTToXmString("Save");
17938:   XtVaSetValues(pushButtonFileSelectionOK,XmNlabelString,xmstring,NULL);
17939:   XmStringFree(xmstring);
17940: 
17941:   fileselection = SAVEAFFINE;
17942: 
17943:   XtVaSetValues(xmDialogShellFileSelection, XmNtitle, "Save Affine Table", NULL);
17944:   XtVaSetValues(textFileSelectionSelected, XmNvalue, "", NULL);
17945: 
17946:   if((path=(char*)calloc((int)strlen(affine.dirname)+1000,CHAR_SIZE))==NULL)
17947:                                 SpBadMemAlloc("SaveAffineTable");
17948:   (void)sprintf(path, "%s", affine.dirname);
17949: 
17950:   len = (int)strlen(path);
17951:   if(strcmp(&path[len-1], "/") == 0) {
17952:     *strrchr(path,'/')= '\0';
17953:   }
17954: 
17955:   if((str=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
17956:     SpBadMemAlloc("SaveAffineTable");
17957:   }
17958:   (void)sprintf(str,"%s/*", path);
17959:   XtVaSetValues(textFileSelectionFilter, XmNvalue, str, NULL);
17960:   free(str);
17961: 
17962:   XtVaSetValues(textFileSelectionSelected, XmNvalue, affine.filename, NULL);
17963: 
17964:   SpUpdateFileSelection(FILE_FILTER, SAVEAFFINE, path);
17965:   (void)sprintf(preview_input_path,"%s",path);
17966: 
17967:   free(path);
17968:   if(path)
17969:     path = NULL;
17970: }
17971: 
17972: void
17973: SaveSpliceTable(w, client_data, call_data)
17974:  Widget w;
17975:  XtPointer client_data;
17976:  XtPointer call_data;
17977: {
17978:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
17979: 
17980:   char *str, *path;
17981:   int  len;
17982:   XmString xmstring;
17983: 
17984:   void SpUpdateFileSelection();
17985: 
17986:   XtManageChild(formFileSelection);
17987:   XtPopup(XtParent(formFileSelection),XtGrabNone);
17988:   xmstring=XmCvtCTToXmString("Save");
17989:   XtVaSetValues(pushButtonFileSelectionOK,XmNlabelString,xmstring,NULL);
17990:   XmStringFree(xmstring);
17991: 
17992:   fileselection = SAVESPLICETABLE;
17993: 
17994:   XtVaSetValues(xmDialogShellFileSelection, XmNtitle, "Save Splicer Table", NULL);
17995:   XtVaSetValues(textFileSelectionSelected, XmNvalue, "", NULL);
17996: 
17997:   if((path=(char*)calloc((int)strlen(splicertable.dirname)+1000,CHAR_SIZE))==NULL)
17998:                                 SpBadMemAlloc("SaveSplicerTable");
17999:   (void)sprintf(path, "%s", splicertable.dirname);
18000: 
18001:   len = (int)strlen(path);
18002:   if(strcmp(&path[len-1], "/") == 0) {
18003:     *strrchr(path,'/')= '\0';
18004:   }
18005: 
18006:   if((str=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
18007:     SpBadMemAlloc("SaveSplicerTable");
18008:   }
18009:   (void)sprintf(str,"%s/*", path);
18010:   XtVaSetValues(textFileSelectionFilter, XmNvalue, str, NULL);
18011:   free(str);
18012: 
18013:   XtVaSetValues(textFileSelectionSelected, XmNvalue, splicertable.filename, NULL);
18014: 
18015:   SpUpdateFileSelection(FILE_FILTER, SAVESPLICETABLE, path);
18016:   (void)sprintf(preview_input_path,"%s",path);
18017: 
18018:   free(path);
18019:   if(path)
18020:     path = NULL;
18021: }
18022: 
18023: void
18024: DontUseCullTable(w, client_data, call_data)
18025:  Widget w;
18026:  XtPointer client_data;
18027:  XtPointer call_data;
18028: {
18029:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
18030: 
18031:   XtSetSensitive(pushButtonSelectCullTableFilename, False);
18032:   XtVaSetValues(textFieldCullTableFilename, XmNvalue, "", NULL);
18033: }
18034: 
18035: void
18036: SelectCullTableFilename(w, client_data, call_data)
18037:  Widget w;
18038:  XtPointer client_data;
18039:  XtPointer call_data;
18040: {
18041:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
18042: 
18043:   char *str, *path;
18044:   int  len;
18045:   XmString xmstring;
18046: 
18047:   void SpUpdateFileSelection();
18048: 
18049:   XtUnmanageChild(formCull);
18050:   XtManageChild(formFileSelection);
18051:   XtPopup(XtParent(formFileSelection),XtGrabNone);
18052:   xmstring=XmCvtCTToXmString("OK");
18053:   XtVaSetValues(pushButtonFileSelectionOK,XmNlabelString,xmstring,NULL);
18054:   XmStringFree(xmstring);
18055: 
18056:   fileselection = OPENCULLTABLE;
18057: 
18058:   XtVaSetValues(xmDialogShellFileSelection, XmNtitle, "Open Cull Table", NULL);
18059:   XtVaSetValues(textFileSelectionSelected, XmNvalue, "", NULL);
18060: 
18061:   if((path=(char*)calloc((int)strlen(cull.dirname)+1000,CHAR_SIZE))==NULL)
18062:                                 SpBadMemAlloc("SelectAffineTableFileName");
18063:   (void)sprintf(path, "%s", cull.dirname);
18064: 
18065:   len = (int)strlen(path);
18066:   if(strcmp(&path[len-1], "/") == 0) {
18067:     *strrchr(path,'/')= '\0';
18068:   }
18069: 
18070:   if((str=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
18071:     SpBadMemAlloc("SelectAffineTableFileName");
18072:   }
18073:   (void)sprintf(str,"%s/*", path);
18074:   XtVaSetValues(textFileSelectionFilter, XmNvalue, str, NULL);
18075:   free(str);
18076: 
18077:   XtVaSetValues(textFileSelectionSelected, XmNvalue, cull.filename, NULL);
18078: 
18079:   SpUpdateFileSelection(FILE_FILTER, OPENCULLTABLE, path);
18080:   (void)sprintf(preview_input_path,"%s",path);
18081: 
18082:   free(path);
18083:   if(path)
18084:     path = NULL;
18085: }
18086: 
18087: void
18088: UseCullTable(w, client_data, call_data)
18089:  Widget w;
18090:  XtPointer client_data;
18091:  XtPointer call_data;
18092: {
18093:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
18094: 
18095:   XtSetSensitive(pushButtonSelectCullTableFilename, True);
18096:   if((charptr=(char*)calloc((int)strlen(cull.filename)+10,CHAR_SIZE))==NULL)
18097:                         SpBadMemAlloc("UseCullTable");
18098:   (void)sprintf(charptr,"%s",cull.filename);
18099:   XtVaSetValues(textFieldCullTableFilename, XmNvalue, charptr, NULL);
18100:   free(charptr);
18101: }
18102: 
18103: void
18104: DontUseCullParameters(w, client_data, call_data)
18105:  Widget w;
18106:  XtPointer client_data;
18107:  XtPointer call_data;
18108: {
18109:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
18110: 
18111:   XtSetSensitive(formCullOptions,False);
18112: }
18113: 
18114: void
18115: UseCullParameters(w, client_data, call_data)
18116:  Widget w;
18117:  XtPointer client_data;
18118:  XtPointer call_data;
18119: {
18120:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
18121: 
18122:   XtSetSensitive(formCullOptions,True);
18123: }
18124: 
18125: void
18126: SaveSplice(w, client_data, call_data)
18127:  Widget w;
18128:  XtPointer client_data;
18129:  XtPointer call_data;
18130: {
18131:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
18132: 
18133:   char *str, *path;
18134:   int  len;
18135:   XmString xmstring;
18136: 
18137:   void SpUpdateFileSelection();
18138: 
18139:   XtManageChild(formFileSelection);
18140:   XtPopup(XtParent(formFileSelection),XtGrabNone);
18141:   xmstring=XmCvtCTToXmString("Save");
18142:   XtVaSetValues(pushButtonFileSelectionOK,XmNlabelString,xmstring,NULL);
18143:   XmStringFree(xmstring);
18144: 
18145:   fileselection = SAVESPLICEDATA;
18146: 
18147:   XtVaSetValues(xmDialogShellFileSelection, XmNtitle, "Save Splice", NULL);
18148:   XtVaSetValues(textFileSelectionSelected, XmNvalue, "", NULL);
18149: 
18150:   if((path=(char*)calloc((int)strlen(outspdata_dirname)+1000,CHAR_SIZE))==NULL)
18151:                                 SpBadMemAlloc("OpenSplicerTable");
18152:   (void)sprintf(path, "%s", outspdata_dirname);
18153: 
18154:   len = (int)strlen(path);
18155:   if(strcmp(&path[len-1], "/") == 0) {
18156:     *strrchr(path,'/')= '\0';
18157:   }
18158: 
18159:   if((str=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
18160:     SpBadMemAlloc("OpenSplicerTable");
18161:   }
18162:   (void)sprintf(str,"%s/*", path);
18163:   XtVaSetValues(textFileSelectionFilter, XmNvalue, str, NULL);
18164:   free(str);
18165: 
18166:   XtVaSetValues(textFileSelectionSelected, XmNvalue, outspdata_filename, NULL);
18167: 
18168:   SpUpdateFileSelection(FILE_FILTER, SAVESPLICEDATA, path);
18169:   (void)sprintf(preview_input_path,"%s",path);
18170: 
18171:   free(path);
18172:   if(path)
18173:     path = NULL;
18174: }
18175: 
18176: void
18177: SaveDataDirectory(w, client_data, call_data)
18178:  Widget w;
18179:  XtPointer client_data;
18180:  XtPointer call_data;
18181: {
18182:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
18183: 
18184:   char *filter, *path;
18185: 
18186:   void SpUpdateFileSelection();
18187: 
18188:   filter = XmTextGetString(textFieldSaveDataFilter);
18189:   /* allocate a lot of space for path so don't need to
18190:      reallocate in SpUpdateFileSelection
18191:      when reallocate there lose the pointer
18192:   */
18193:   if((path=(char*)calloc((int)strlen(filter) + 1000,CHAR_SIZE))==NULL)
18194:                         SpBadMemAlloc("FileSelectionFile");
18195:   (void)sprintf(path, "%s", filter);
18196:   *strrchr(path,'*')= '\0';
18197:   *strrchr(path,'/')= '\0';
18198: 
18199:   SpUpdateFileSelection(DIRECTORIES,SAVEDATA, path);
18200:   (void)sprintf(preview_input_path,"%s",path);
18201: 
18202:   XtVaSetValues(textFieldSaveDataDirectory, XmNvalue, path, NULL);
18203: 
18204:   free(path);
18205: }
18206: 
18207: void
18208: SaveData(w, client_data, call_data)
18209:  Widget w;
18210:  XtPointer client_data;
18211:  XtPointer call_data;
18212: {
18213:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
18214: 
18215:   int   len;
18216:   char  *str, *path;
18217:   void    XmTextFieldSetString(), SpUpdateFileSelection();
18218: 
18219:   XtManageChild(formOutput);
18220:   (void)XmTextFieldSetString(textFieldOutputPrefix,output_type[data[dset]->type]);
18221:   (void)XmTextFieldSetString(textFieldOutputSuffix,"mod");
18222: 
18223:   if((path=(char*)calloc((int)strlen(outdata_dirname)+1000,CHAR_SIZE))==NULL)
18224:                                 SpBadMemAlloc("SaveData");
18225:   (void)sprintf(path, "%s", outdata_dirname);
18226: 
18227:   len = (int)strlen(path);
18228:   if(strcmp(&path[len-1], "/") == 0) {
18229:     *strrchr(path,'/')= '\0';
18230:   }
18231: 
18232:   if((str=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
18233:     SpBadMemAlloc("SaveData");
18234:   }
18235:   (void)sprintf(str, "%s/", path);
18236:   XtVaSetValues(textFieldSaveDataDirectory, XmNvalue, str, NULL);
18237:   (void)strncat(str,"*",1);
18238:   XtVaSetValues(textFieldSaveDataFilter, XmNvalue, str, NULL);
18239:   free(str);
18240: 
18241:   SpUpdateFileSelection(FILE_FILTER,SAVEDATA, path);
18242: 
18243:   free(path);
18244: }
18245: 
18246: void
18247: SaveCullTable(w, client_data, call_data)
18248:  Widget w;
18249:  XtPointer client_data;
18250:  XtPointer call_data;
18251: {
18252:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
18253: 
18254:   char *str, *path;
18255:   int  len;
18256:   XmString xmstring;
18257: 
18258:   void SpUpdateFileSelection();
18259: 
18260:   XtUnmanageChild(formCull);
18261:   XtManageChild(formFileSelection);
18262:   XtPopup(XtParent(formFileSelection),XtGrabNone);
18263:   xmstring=XmCvtCTToXmString("Save");
18264:   XtVaSetValues(pushButtonFileSelectionOK,XmNlabelString,xmstring,NULL);
18265:   XmStringFree(xmstring);
18266: 
18267:   fileselection = SAVECULLTABLE;
18268: 
18269:   XtVaSetValues(xmDialogShellFileSelection, XmNtitle, "Save Cull Table", NULL);
18270:   XtVaSetValues(textFileSelectionSelected, XmNvalue, "", NULL);
18271: 
18272:   if((path=(char*)calloc((int)strlen(cull.dirname)+1000,CHAR_SIZE))==NULL)
18273:                                 SpBadMemAlloc("SelectAffineTableFileName");
18274:   (void)sprintf(path, "%s", cull.dirname);
18275: 
18276:   len = (int)strlen(path);
18277:   if(strcmp(&path[len-1], "/") == 0) {
18278:     *strrchr(path,'/')= '\0';
18279:   }
18280: 
18281:   if((str=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
18282:     SpBadMemAlloc("SelectAffineTableFileName");
18283:   }
18284:   (void)sprintf(str,"%s/*", path);
18285:   XtVaSetValues(textFileSelectionFilter, XmNvalue, str, NULL);
18286:   free(str);
18287: 
18288:   XtVaSetValues(textFileSelectionSelected, XmNvalue, cull.filename, NULL);
18289: 
18290:   SpUpdateFileSelection(FILE_FILTER, SAVECULLTABLE, path);
18291:   (void)sprintf(preview_input_path,"%s",path);
18292: 
18293:   free(path);
18294:   if(path)
18295:     path = NULL;
18296: }
18297: 
18298: void
18299: SaveStrat(w, client_data, call_data)
18300:  Widget w;
18301:  XtPointer client_data;
18302:  XtPointer call_data;
18303: {
18304:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
18305: 
18306:   int  len;
18307:   char *str, *path;
18308:   XmString xmstring;
18309: 
18310:   void SpUpdateFileSelection();
18311: 
18312:   XtManageChild(formFileSelection);
18313:   XtPopup(XtParent(formFileSelection),XtGrabNone);
18314:   xmstring=XmCvtCTToXmString("Save");
18315:   XtVaSetValues(pushButtonFileSelectionOK,XmNlabelString,xmstring,NULL);
18316:   XmStringFree(xmstring);
18317: 
18318:   fileselection = SAVESTRAT;
18319: 
18320:   XtVaSetValues(xmDialogShellFileSelection, XmNtitle, "Save Stratigraphy", NULL);
18321:   XtVaSetValues(textFileSelectionSelected, XmNvalue, "", NULL);
18322: 
18323:   if((path=(char*)calloc((int)strlen(default_strat_dirname)+1000,CHAR_SIZE))==NULL)
18324:                                 SpBadMemAlloc("OpenSplicerTable");
18325:   (void)sprintf(path, "%s", default_strat_dirname);
18326: 
18327:   len = (int)strlen(path);
18328:   if(strcmp(&path[len-1], "/") == 0) {
18329:     *strrchr(path,'/')= '\0';
18330:   }
18331: 
18332:   if((str=(char*)calloc((int)strlen(path)+10, CHAR_SIZE)) == NULL) {
18333:     SpBadMemAlloc("OpenStrat");
18334:   }
18335:   (void)sprintf(str, "%s", path);
18336:   XtVaSetValues(textFileSelectionSelected, XmNvalue, str, NULL);
18337:   (void)strncat(str,"/*",2);
18338:   XtVaSetValues(textFileSelectionFilter, XmNvalue, str, NULL);
18339:   free(str);
18340: 
18341:   SpUpdateFileSelection(FILE_FILTER,SAVESTRAT, path);
18342:   (void)sprintf(preview_input_path,"%s",path);
18343: 
18344:   free(path);
18345:   if(path)
18346:     path = NULL;
18347: }
18348: 
18349: void
18350: SaveDataFilter(w, client_data, call_data)
18351:  Widget w;
18352:  XtPointer client_data;
18353:  XtPointer call_data;
18354: {
18355:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
18356: 
18357:   char *filter, *path;
18358:   void SpUpdateFileSelection();
18359: 
18360:   filter = XmTextGetString(textFieldSaveDataFilter);
18361:   /* allocate a lot of space for path so don't need to
18362:      reallocate in SpUpdateFileSelection
18363:      when reallocate there lose the pointer
18364:   */
18365:   if((path=(char*)calloc((int)strlen(filter) + 1000,CHAR_SIZE))==NULL)
18366:                         SpBadMemAlloc("FileSelectionFile");
18367:   (void)sprintf(path, "%s", filter);
18368:   *strrchr(path,'*')= '\0';
18369: 
18370:   SpUpdateFileSelection(FILE_FILTER, SAVEDATA, path);
18371:   (void)sprintf(preview_input_path,"%s",path);
18372: 
18373:   XtVaSetValues(textFieldSaveDataDirectory, XmNvalue, path, NULL);
18374:   free(path);
18375: }
18376: 
18377: void
18378: SpLaunchSeekerCB(w, client_data, call_data)
18379:  Widget w;
18380:  XtPointer client_data;
18381:  XtPointer call_data;
18382: {
18383:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
18384: 
18385:   char    *path, *getenv(), *where;
18386: 
18387:   /* put together command and submit it
18388:   */
18389:   if((path=(char*)calloc(1000,CHAR_SIZE))==NULL)
18390:                 SpBadMemAlloc("Sa");
18391: 
18392: /*  (void)strcpy(path,(char*)getenv("SEEKER_PATH"));
18393: */
18394:   (void)strcpy(path,"/turf/ouzel/eqt/seeker/seeker_code");
18395: 
18396:   if((where=(char*)calloc(10,CHAR_SIZE))==NULL)
18397:                 SpBadMemAlloc("Sa");
18398:   if(whereami == SHORE) {
18399:     (void)strcpy(where, "SHORE");
18400:   }
18401:   else if(whereami == SHIP) {
18402:     (void)strcpy(where, "SHIP");
18403:   }
18404:   else {
18405:     (void)strcpy(where, "SHORE");
18406:   }
18407:   if((charptr=(char*)calloc((int)strlen(path) + 200, CHAR_SIZE))==NULL)
18408:                 SpBadMemAlloc("Sa");
18409:   (void)sprintf(charptr,"%s/seeker-c -bg lightgray -fg black -who SAGAN -where %s & ", path, where);
18410:   (void)system(charptr);
18411:   free(charptr);
18412:   free(path);
18413:   path = NULL;
18414:   free(where);
18415:   where = NULL;
18416: }
18417: 
18418: void
18419: OpenFormatJanusActive(w, client_data, call_data)
18420:  Widget w;
18421:  XtPointer client_data;
18422:  XtPointer call_data;
18423: {
18424:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
18425: 
18426:   XtManageChild(formJanus);
18427: }
18428: 
18429: void
18430: OverwriteCancel(w, client_data, call_data)
18431:  Widget w;
18432:  XtPointer client_data;
18433:  XtPointer call_data;
18434: {
18435:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
18436: }
18437: 
18438: void
18439: OverwriteFile(w, client_data, call_data)
18440:  Widget w;
18441:  XtPointer client_data;
18442:  XtPointer call_data;
18443: {
18444:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
18445: }
18446: 
18447: 
18448: void
18449: GenericTextDismiss(w, client_data, call_data)
18450:  Widget w;
18451:  XtPointer client_data;
18452:  XtPointer call_data;
18453: {
18454:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
18455: 
18456:   XtUnmanageChild(formGenericText);
18457: }
18458: 
18459: void
18460: JanusOK(w, client_data, call_data)
18461:  Widget w;
18462:  XtPointer client_data;
18463:  XtPointer call_data;
18464: {
18465:     XmAnyCallbackStruct *acs=(XmAnyCallbackStruct*)call_data;
18466: 
18467:   int    tmp_format;
18468:   Widget tmp_widget;
18469: 
18470:   XtUnmanageChild(formJanus);
18471: 
18472:   XtVaGetValues(optionMenuOpenType,XmNmenuHistory,&tmp_widget,NULL);
18473:   if(tmp_widget == pushButtonOpenOtherType) {
18474:     XtVaSetValues(optionMenuOpenType, XmNmenuHistory, pushButtonOpenGrape, NULL);
18475:   }
18476:   XtSetSensitive(pushButtonOpenReflectance, True);
18477:   XtSetSensitive(pushButtonOpenGrape, True);
18478:   XtSetSensitive(pushButtonOpenPwave, True);
18479:   XtSetSensitive(pushButtonOpenSusceptibility, True);
18480:   XtSetSensitive(pushButtonOpenNaturalGamma, True);
18481:   XtSetSensitive(pushButtonOpenOtherType, False);
18482:   XtVaGetValues(optionMenuOpenFormat,XmNmenuHistory,&tmp_widget,NULL);
18483:   XtVaGetValues(tmp_widget,XmNuserData,&tmp_format,NULL);
18484:   if(tmp_format == JANUS) {
18485:     if(XmToggleButtonGetState(toggleButtonJanusClean) == True) {
18486:       XtSetSensitive(toggleButtonHeaderNo, True);
18487:       XtSetSensitive(toggleButtonHeaderYes, True);
18488:       XtSetSensitive(textFieldNHeader, True);
18489:     }
18490:     else if(XmToggleButtonGetState(toggleButtonJanusOrig) == True) {
18491:       XmToggleButtonSetState(toggleButtonHeaderNo, True, NULL);
18492:       XmToggleButtonSetState(toggleButtonHeaderYes, False, NULL);
18493:       XtSetSensitive(toggleButtonHeaderNo, False);
18494:       XtSetSensitive(toggleButtonHeaderYes, False);
18495:       XtSetSensitive(textFieldNHeader, False);
18496:     }
18497:   }
18498: }
18499: 
18500: 








































Html form generated by Xrefactory version 1.6.7 on Fri Sep 03 17:18:59 2004