MacTech Network:   MacForge.net  |  Computer Memory  |  Register Domains  |  Printer Supplies  |  Cables  |  iPod Deals  |  Mac Deals  |  Mac Book Shelf


  MacTech Magazine

The journal of Macintosh technology

 
 
Visit Smalldog.com

Magazine In Print
  About MacTech  
  Home Page  
  Subscribe  
  Archives DVD  
  Submit News  
  Submit a Tip!  
  Get a copy of MacTech RISK FREE  
Google
Entire Web
mactech.com
Mac Community
More...
MacTech Central
  by Category  
  by Company  
  by Product  
MacTech News
  MacTech News  
  Previous News  
  MacTech RSS  
Article Archives
  Show Indices  
  by Volume  
  by Author  
  Source Code FTP  
Inside MacTech
  Writer's Kit  
  Editorial Staff  
  Editorial Calendar  
  Back Issues  
  Advertising  
Contact Us
  Customer Service  
  MacTech Store  
  Legal/Disclaimers  
  Webmaster Feedback  

Demonstration Program Controls3

Goto Contents

// *******************************************************************************************
// Controls3.h                                                             CLASSIC EVENT MODEL
// *******************************************************************************************
//
// This program demonstrates the creation and handling of those controls not demonstrated in
// the programs Controls1 and Controls2 (Chapter 7), with the exception of List boxes
// and determinate progress bars.
// 
// The program utilises the following resources:
//
// o  A 'plst' resource.
//
// o  An 'MBAR' resource, and 'MENU' resources for Apple, File, Edit, and Demonstration menus
//    (preload, non-purgeable).
//
// o  'MENU' resources (non-purgeable) for bevel button menus and for a pop-up group box.
//
// o  A 'WIND' resource (purgeable) (initially not visible).
//
// o  'DLOG' resources and associated 'DITL', 'dlgx' and 'dftb' resources (purgeable).  
//
// o  'CNTL' resources (purgeable).
//
// o  A 'tab#' resource (purgeable.
//
// o  An icon family resource (purgeable).
//
// o  'PICT' resources (purgeable).
//
// o  'cicn' resources (purgeable).
//
// o  'STR#' resources (purgeable).
//
// o  'TEXT' and 'styl' resources (purgeable).
//
// o  'hrct' and an 'hwin' resources (preload, purgeable), which provide help balloons
//    describing  the various controls.  
//
// o  A 'SIZE' resource with the acceptSuspendResumeEvents, canBackground, 
//    doesActivateOnFGSwitch, and isHighLevelEventAware flags set.
//
// *******************************************************************************************

// .................................................................................. includes

#include <Carbon.h>
#include <string.h>

// ................................................................................... defines

#define rMenubar                128
#define mAppleApplication       128
#define  iAbout                 1
#define mFile                   129
#define  iQuit                  12
#define mDemonstration          131
#define  iBevelAndImage          1
#define  iTabEditClock          2
#define  iGroupArrowsProgress   3
#define  iSliders               4
#define  iTextBoxes             5
#define  iSmallControls         6
#define rBevelImageWindow       128
#define  cBevelButton1          128
#define  cBevelButton2          129
#define  cBevelButton3          130
#define  cBevelButton4          131
#define  cBevelButton5          132
#define  cBevelButton6          133
#define  cBevelButton7          134
#define  cBevelButton8          135
#define  cBevelButton9          136
#define  cBevelButton10         137
#define  cBevelButton11         138
#define  cBevelButton12         139
#define  cBevelButton13         140
#define  cBevelButton14         141
#define  cBevelButton15         142
#define  cBevelButton16         143
#define  cBevelButton17         144
#define  cBevelButton18         145
#define  cBevelButton19         146
#define  cBevelButton20         147
#define  cBevelButton21         148
#define  cImageWell1            149
#define  cImageWell2            150
#define  cPicture1              151
#define  cPicture2              152
#define  cColourIcon1           153
#define  cColourIcon2           154
#define  cIconSuite1            155
#define  cIconSuite2            156
#define  cWindowHeader          157
#define  rPartCodeStrings       128
#define  rGraphicAlignStrings   129
#define  rTextAlignStrings      130
#define  rTextPlacementStrings  131
#define rTabEditClockDialog     128
#define  iTabs                  2
#define  tabEditText            1
#define  tabClocks              2
#define  iEditTextUserPane      3
#define  iEditText1             5
#define  iEditText2             7
#define  iEditText3             9
#define  iExtractEditText       10
#define  iClocksUserPane        12
#define  iImageWellEditText     11
#define  iClocks1               14
#define  iClocks2               16
#define  iClocks3               18
#define  iExtractClocks         19
#define  iImageWellClocks       20
#define  kLeftArrow             0x1C
#define  kRightArrow            0x1D
#define  kUpArrow               0x1E
#define  kDownArrow             0x1F
#define  kBackspace             0x08
#define  kDelete                0x7F
#define rGroupArrowsProgDialog  129
#define  iCheckboxGroup         2
#define  iRadioGroupColour      3
#define  iStaticTextColourDepth 7
#define  iPopupGroup            8
#define  iUserPaneNamesInitials 9
#define  iRadioGroupNames       10
#define  iCheckboxShowInitials  13
#define  iUserPaneScoreAverage  15
#define  iRadioGroupScores      16
#define  iCheckboxShowAverages  19
#define  iStaticTextCache       26
#define  iLittleArrows          27
#define  iPushButtonExtract     28
#define  iImageWell             29
#define  iDisclosureTriangle    31
#define  iStaticTextDisclosure  32
#define  iProgressBar           34
#define rSlidersDialog          131
#define  iSlider1               2
#define  iSlider2               3
#define  iSlider3               4
#define  iSlider4               5
#define  iSlider1StaticText     9
#define  iSlider2StaticText     11
#define  iSlider3StaticText     13
#define  iSlider4StaticText     15
#define  iSlider5               17
#define  iUserPane1             18
#define  iSlider6               19
#define cSmallPopup             203
#define rSmallControlsString    136
#define rAboutDialog            132
#define MAX_UINT32              0xFFFFFFFF
#define MIN(a,b)                ((a) < (b) ? (a) : (b))

// .................................................................................. typedefs

typedef struct
{
  ControlRef bevelButton1Ref;
  ControlRef bevelButton2Ref;
  ControlRef bevelButton3Ref;
  ControlRef bevelButton4Ref;
  ControlRef bevelButton5Ref;
  ControlRef bevelButton6Ref;
  ControlRef bevelButton7Ref;
  ControlRef bevelButton8Ref;
  ControlRef bevelButton9Ref;
  ControlRef bevelButton10Ref;
  ControlRef bevelButton11Ref;
  ControlRef bevelButton12Ref;
  ControlRef bevelButton13Ref;
  ControlRef bevelButton14Ref;
  ControlRef bevelButton15Ref;
  ControlRef bevelButton16Ref;
  ControlRef bevelButton17Ref;
  ControlRef bevelButton18Ref;
  ControlRef bevelButton19Ref;
  ControlRef bevelButton20Ref;
  ControlRef bevelButton21Ref;
  ControlRef imageWell1Ref;
  ControlRef imageWell2Ref;
  ControlRef picture1Ref;
  ControlRef picture2Ref;
  ControlRef colourIcon1Ref;
  ControlRef colourIcon2Ref;
  ControlRef iconSuite1Ref;
  ControlRef iconSuite2Ref;
  ControlRef windowHeaderRef;
} BevelDocStruc;

typedef BevelDocStruc **BevelDocStrucHandle;

// ....................................................................... function prototypes

void    main                          (void);
void    doPreliminaries               (void);
OSErr   quitAppEventHandler           (AppleEvent *,AppleEvent *,SInt32);
void    doGetControls                 (WindowRef);
void    doEvents                      (EventRecord *);
void    doMouseDown                   (EventRecord *);
void    doMenuChoice                  (SInt32);
void    doUpdate                      (EventRecord *);
void    doActivate                    (EventRecord *);
void    doActivateWindow              (WindowRef,Boolean);
void    doConcatPStrings              (Str255,Str255);
void    doCopyPString                 (Str255,Str255);

void    doBevelImagePictIcon          (void);
void    doBevelImagePictIconContent   (EventRecord *,WindowRef);
void    doDrawPartCode                (WindowRef,ControlRef,SInt16,SInt16);
void    doGraphicAlignment            (WindowRef,ControlRef,ControlRef);
void    doTextAlignment               (WindowRef,ControlRef,ControlRef);
void    doTextOffset                  (WindowRef,ControlRef,ControlRef);
void    doTextPlacement               (WindowRef,ControlRef,ControlRef);
void    doDrawMessage                 (WindowRef,Boolean);
void    doDrawLegends                 (WindowRef,Boolean);
void    helpTagsBevelImagePictIcon    (WindowRef);

void    doTabEditClock                (void);
void    doExtractEditText             (DialogRef);
void    doExtractDateTime             (DialogRef);
void    helpTagsTabEditClock          (DialogRef);

void    doGroupArrowsProgress         (void);
void    doCheckBoxGroupBox            (DialogRef);
void    doPopupGroupBox               (DialogRef);
void    doChasingAndProgress          (DialogRef);
void    doExtractCurrentStatus        (DialogRef);
void    helpTagsGroupArrowsProgress   (DialogRef);

void    doSliderUserPane              (void);
void    doDrawSliderValues            (DialogRef,ControlRef);
void    helpTagsSliders               (DialogRef);

void    doTextBox                     (void);

void    doSmallControls               (void);
void    doMouseDownSmallControls      (WindowRef,EventRecord *);

Boolean eventFilter                   (DialogRef,EventRecord *,SInt16 *);
void    editTextValidator             (ControlRef);
ControlKeyFilterResult  numericFilter (ControlRef,SInt16 *,SInt16 *,EventModifiers *);
void    arrowsActionFunction          (ControlRef,SInt16);
void    sliderActionFunction1         (ControlRef,SInt16);
void    sliderActionFunction2         (ControlRef,SInt16);
void    userPaneDrawFunction          (ControlRef,SInt16);
void    userPaneActivateFunction      (ControlRef,Boolean);

// *******************************************************************************************
// Controls3.c
// *******************************************************************************************

// .................................................................................. includes

#include "Controls3.h"

// .......................................................................... global variables

Boolean gRunningOnX                = false;
Boolean gInBackground              = false;
Boolean gDone;
Str255  gCurrentString;
Boolean gBevelAndImageActive       = false;
Boolean gGroupArrowsProgressActive = false;
Boolean gSlidersActive             = false;

// ************************************************************************************** main

void  main(void)
{
  MenuBarHandle menubarHdl;
  SInt32        response;
  MenuRef       menuRef;
  EventRecord   eventStructure;

  // ......................................................................... do prelimiaries

  doPreliminaries();

  // ............................................................... set up menu bar and menus
  
  menubarHdl = GetNewMBar(rMenubar);
  if(menubarHdl == NULL)
    ExitToShell();
  SetMenuBar(menubarHdl);
  DrawMenuBar();

  Gestalt(gestaltMenuMgrAttr,&response);
  if(response & gestaltMenuMgrAquaLayoutMask)
  {
    menuRef = GetMenuRef(mFile);
    if(menuRef != NULL)
    {
      DeleteMenuItem(menuRef,iQuit);
      DeleteMenuItem(menuRef,iQuit - 1);
      DisableMenuItem(menuRef,0);
    }

    menuRef = GetMenuRef(mDemonstration);
    if(menuRef != NULL)
      EnableMenuItem(menuRef,iSmallControls);

    gRunningOnX = true;
  }

  // ........................................................................ enter eventLoop

  gDone = false;

  while(!gDone)
  {
    if(WaitNextEvent(everyEvent,&eventStructure,MAX_UINT32,NULL))
      doEvents(&eventStructure);
  }
}

// *************************************************************************** doPreliminaries

void  doPreliminaries(void)
{
  OSErr osError;

  MoreMasterPointers(512);
  InitCursor();
  FlushEvents(everyEvent,0);

  osError = AEInstallEventHandler(kCoreEventClass,kAEQuitApplication,
                            NewAEEventHandlerUPP((AEEventHandlerProcPtr) quitAppEventHandler),
                            0L,false);
  if(osError != noErr)
    ExitToShell();
}

// **************************************************************************** doQuitAppEvent

OSErr  quitAppEventHandler(AppleEvent *appEvent,AppleEvent *reply,SInt32 handlerRefcon)
{
  OSErr    osError;
  DescType returnedType;
  Size     actualSize;

  osError = AEGetAttributePtr(appEvent,keyMissedKeywordAttr,typeWildCard,&returnedType,NULL,0,
                              &actualSize);

  if(osError == errAEDescNotFound)
  {
    gDone = true;
    osError = noErr;
  } 
  else if(osError == noErr)
    osError = errAEParamMissed;

  return osError;
}

// ********************************************************************************** doEvents

void  doEvents(EventRecord *eventStrucPtr)
{
  SInt32 menuChoice;
  SInt16 menuID, menuItem;

  switch(eventStrucPtr->what)
  {
    case kHighLevelEvent:
      AEProcessAppleEvent(eventStrucPtr);
      break;

    case keyDown:
      if((eventStrucPtr->modifiers & cmdKey) != 0)
      {
        menuChoice = MenuEvent(eventStrucPtr);
        menuID = HiWord(menuChoice);
        menuItem = LoWord(menuChoice);
        if(menuID == mFile && menuItem  == iQuit)
          gDone = true;
      }
      break;

    case mouseDown:
      doMouseDown(eventStrucPtr);
      break;

    case updateEvt:
      doUpdate(eventStrucPtr);
      break;

    case activateEvt:
      doActivate(eventStrucPtr);
      break;

    case osEvt:
      switch((eventStrucPtr->message >> 24) & 0x000000FF)
      {
        case suspendResumeMessage:
          if((eventStrucPtr->message & resumeFlag) == 1)
          {
            SetThemeCursor(kThemeArrowCursor);
            gInBackground = false;
          }
          else
            gInBackground = true;
      }
      break;
  }
}

// ******************************************************************************* doMouseDown

void  doMouseDown(EventRecord *eventStrucPtr)
{
  WindowPartCode partCode;
  WindowRef      windowRef;
  MenuRef        menuRef;
  WindowClass    windowClass;

  partCode = FindWindow(eventStrucPtr->where,&windowRef);

  switch(partCode)
  {
    case inMenuBar:
      menuRef = GetMenuRef(mDemonstration);
      if(gBevelAndImageActive)
        DisableMenuItem(menuRef,iBevelAndImage);
      else
        EnableMenuItem(menuRef,iBevelAndImage);
      doMenuChoice(MenuSelect(eventStrucPtr->where));
      break;

    case inContent:
      GetWindowClass(windowRef,&windowClass);
      if(windowClass == kFloatingWindowClass)
        doMouseDownSmallControls(windowRef,eventStrucPtr);
      else if(windowRef != FrontNonFloatingWindow())
        SelectWindow(windowRef);
      else
      {
        if(gBevelAndImageActive)
          doBevelImagePictIconContent(eventStrucPtr,windowRef);
      }
      break;

    case inDrag:
      DragWindow(windowRef,eventStrucPtr->where,NULL);
      break;

    case inGoAway:
      if(TrackGoAway(windowRef,eventStrucPtr->where) == true)
      {
        DisposeWindow(windowRef);
        gBevelAndImageActive = false;
      }
      break;

  }
}

// ****************************************************************************** doMenuChoice

void  doMenuChoice(SInt32 menuChoice)
{
  MenuID        menuID;
  MenuItemIndex menuItem;
  MenuRef       menuRef;
  
  menuID = HiWord(menuChoice);
  menuItem = LoWord(menuChoice);

  if(menuID == 0)
    return;

  switch(menuID)
  {
    case mAppleApplication:
      if(menuItem == iAbout)
        SysBeep(10);
      break;

    case mFile:
      if(menuItem == iQuit)
        gDone = true;
      break;

    case mDemonstration:
      switch(menuItem)
      {
        case iBevelAndImage:
          gBevelAndImageActive = true;
          doBevelImagePictIcon();
          break;

        case iTabEditClock:
          doTabEditClock();
          break;

        case iGroupArrowsProgress:
          gGroupArrowsProgressActive = true;
          doGroupArrowsProgress();
          break;
        
        case iSliders:
          gSlidersActive = true;
          doSliderUserPane();
          break;

        case iTextBoxes:
          doTextBox();
          break;

        case iSmallControls:
          doSmallControls();
          menuRef = GetMenuRef(mDemonstration);
          DisableMenuItem(menuRef,iSmallControls);
          break;
      }
      break;
  }

  HiliteMenu(0);
}

// ********************************************************************************** doUpdate

void  doUpdate(EventRecord *eventStrucPtr)
{
  WindowRef windowRef;
  RgnHandle visibleRegionHdl = NewRgn();
  Boolean   drawMode = false;

  windowRef = (WindowRef) eventStrucPtr->message;

  BeginUpdate(windowRef);

  SetPortWindowPort(windowRef);
    
  GetPortVisibleRegion(GetWindowPort(windowRef),visibleRegionHdl);
  UpdateControls(windowRef,visibleRegionHdl);

  if(gBevelAndImageActive)
  {
    if(windowRef == FrontNonFloatingWindow())
    {    
      doDrawMessage(windowRef,!gInBackground);
      doDrawLegends(windowRef,!gInBackground);
    }
    else
    {
      doDrawMessage(windowRef,gInBackground);
      doDrawLegends(windowRef,gInBackground);
    }
  }

  EndUpdate(windowRef);
}

// ******************************************************************************** doActivate

void  doActivate(EventRecord *eventStrucPtr)
{
  WindowRef windowRef;
  Boolean   becomingActive;

  windowRef = (WindowRef) eventStrucPtr->message;
  becomingActive = ((eventStrucPtr->modifiers & activeFlag) == activeFlag);

  doActivateWindow(windowRef,becomingActive);
}

// ************************************************************************** doActivateWindow

void  doActivateWindow(WindowRef windowRef,Boolean becomingActive)
{  
  ControlRef controlRef;

  GetRootControl(windowRef,&controlRef);

  if(becomingActive)
  {
    if(gBevelAndImageActive)
    {
      ActivateControl(controlRef);
      doDrawMessage(windowRef,becomingActive);
      doDrawLegends(windowRef,becomingActive);
    }
  }
  else
  {
    if(gBevelAndImageActive)
    {
      DeactivateControl(controlRef);
      doDrawMessage(windowRef,becomingActive);
      doDrawLegends(windowRef,becomingActive);
    }
  }
}

// ************************************************************************** doConcatPStrings

void  doConcatPStrings(Str255 targetString,Str255 appendString)
{
  SInt16 appendLength;

  appendLength = MIN(appendString[0],255 - targetString[0]);

  if(appendLength > 0)
  {
    BlockMoveData(appendString+1,targetString+targetString[0]+1,(SInt32) appendLength);
    targetString[0] += appendLength;
  }
}

// ***************************************************************************** doCopyPString

void  doCopyPString(Str255 sourceString,Str255 destinationString)
{
  SInt16 stringLength;

  stringLength = sourceString[0];
  BlockMove(sourceString + 1,destinationString + 1,stringLength);
  destinationString[0] = stringLength;
}

// *******************************************************************************************
// BevelImagePictIcon.c
// *******************************************************************************************

// .................................................................................. includes

#include "Controls3.h"

// .......................................................................... global variables

WindowRef gWindowRef;

extern Boolean gRunningOnX;
extern Str255  gCurrentString;
extern Boolean gInBackground;

// ********************************************************************** doBevelImagePictIcon

void  doBevelImagePictIcon(void)
{
  BevelDocStrucHandle bevelDocStrucHdl;

  // ................................................. initial advisory text for window header

  doCopyPString("\pBalloon (OS 8/9) and Help tag (OS X) help is available",gCurrentString);

  // ............. open a window, set font size, set theme-compliant colour/pattern for window

  if(!(gWindowRef = GetNewCWindow(rBevelImageWindow,NULL,(WindowRef)-1)))
    ExitToShell();

  SetPortWindowPort(gWindowRef);
  UseThemeFont(kThemeSmallSystemFont,smSystemScript);

  SetThemeWindowBackground(gWindowRef,kThemeBrushDialogBackgroundActive,true);

  // ........... get block for document structure, assign handle to window record refCon field

  if(!(bevelDocStrucHdl = (BevelDocStrucHandle) NewHandle(sizeof(BevelDocStruc))))
    ExitToShell();

  SetWRefCon(gWindowRef,(SInt32) bevelDocStrucHdl);

  // ........................................ get controls, help tags if OS X, and show window

  doGetControls(gWindowRef);

  if(gRunningOnX)
    helpTagsBevelImagePictIcon(gWindowRef);

  ShowWindow(gWindowRef);
}

// ***************************************************************************** doGetControls

void  doGetControls(WindowRef windowRef)
{
  ControlRef                 controlRef;
  BevelDocStrucHandle        bevelDocStrucHdl;
  ThemeButtonKind            buttonKind = kThemeRoundedBevelButton;
  ControlButtonTextPlacement textPlacementBelow = kControlBevelButtonPlaceBelowGraphic;
  ControlButtonTextPlacement textPlacementAbove = kControlBevelButtonPlaceAboveGraphic;
  Boolean                    centrePopupGlyph = true;
  ControlFontStyleRec        controlFontStyleStruc;

  // ............... create root control for window, get handle to window's document structure

  if(!gRunningOnX)
    CreateRootControl(windowRef,&controlRef);

  bevelDocStrucHdl = (BevelDocStrucHandle) (GetWRefCon(windowRef));

  // ........................................................................ get the controls

  if(!((*bevelDocStrucHdl)->bevelButton1Ref = GetNewControl(cBevelButton1,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton2Ref = GetNewControl(cBevelButton2,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton3Ref = GetNewControl(cBevelButton3,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton4Ref = GetNewControl(cBevelButton4,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton5Ref = GetNewControl(cBevelButton5,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton6Ref = GetNewControl(cBevelButton6,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton7Ref = GetNewControl(cBevelButton7,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton8Ref = GetNewControl(cBevelButton8,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton9Ref = GetNewControl(cBevelButton9,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton10Ref = GetNewControl(cBevelButton10,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton11Ref = GetNewControl(cBevelButton11,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton12Ref = GetNewControl(cBevelButton12,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton13Ref = GetNewControl(cBevelButton13,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton14Ref = GetNewControl(cBevelButton14,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton15Ref = GetNewControl(cBevelButton15,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton16Ref = GetNewControl(cBevelButton16,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton17Ref = GetNewControl(cBevelButton17,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton18Ref = GetNewControl(cBevelButton18,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton19Ref = GetNewControl(cBevelButton19,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton20Ref = GetNewControl(cBevelButton20,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->bevelButton21Ref = GetNewControl(cBevelButton21,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->imageWell1Ref = GetNewControl(cImageWell1,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->imageWell2Ref = GetNewControl(cImageWell2,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->picture1Ref = GetNewControl(cPicture1,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->picture2Ref = GetNewControl(cPicture2,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->colourIcon1Ref = GetNewControl(cColourIcon1,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->colourIcon2Ref = GetNewControl(cColourIcon2,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->iconSuite1Ref= GetNewControl(cIconSuite1,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->iconSuite2Ref= GetNewControl(cIconSuite2,windowRef)))
    ExitToShell();
  if(!((*bevelDocStrucHdl)->windowHeaderRef = GetNewControl(cWindowHeader,windowRef)))
    ExitToShell();

  // ............................... if running on OS X, make first four bevel buttons rounded

  if(gRunningOnX)
  {
    SetControlData((*bevelDocStrucHdl)->bevelButton1Ref,kControlEntireControl,
                   kControlBevelButtonKindTag,sizeof(buttonKind),&buttonKind);
    SetControlData((*bevelDocStrucHdl)->bevelButton2Ref,kControlEntireControl,
                   kControlBevelButtonKindTag,sizeof(buttonKind),&buttonKind);
    SetControlData((*bevelDocStrucHdl)->bevelButton3Ref,kControlEntireControl,
                   kControlBevelButtonKindTag,sizeof(buttonKind),&buttonKind);
    SetControlData((*bevelDocStrucHdl)->bevelButton4Ref,kControlEntireControl,
                   kControlBevelButtonKindTag,sizeof(buttonKind),&buttonKind);
  }

  // ........................................ set text placement for 2nd and 21st bevel button

  SetControlData((*bevelDocStrucHdl)->bevelButton2Ref,kControlEntireControl,
                 kControlBevelButtonTextPlaceTag,sizeof(textPlacementBelow),
                 &textPlacementBelow);
  SetControlData((*bevelDocStrucHdl)->bevelButton21Ref,kControlEntireControl,
                 kControlBevelButtonTextPlaceTag,sizeof(textPlacementAbove),
                 &textPlacementAbove);
                 
  // ........................................ set position of pop-up arrow in 6th bevel button

  SetControlData((*bevelDocStrucHdl)->bevelButton6Ref,kControlEntireControl,
                 kControlBevelButtonCenterPopupGlyphTag,sizeof(centrePopupGlyph),
                 ¢rePopupGlyph);

  // ................................ set font for 20th bevel button to small bold system font

  controlFontStyleStruc.flags = kControlUseFontMask;
  controlFontStyleStruc.font = kControlFontSmallBoldSystemFont;
  SetControlFontStyle((*bevelDocStrucHdl)->bevelButton20Ref,&controlFontStyleStruc);

  // ................................................. set 3rd bevel button to the mixed state

  SetControlValue((*bevelDocStrucHdl)->bevelButton3Ref,2);
}

// *************************************************************** doBevelImagePictIconContent

void  doBevelImagePictIconContent(EventRecord *eventStrucPtr,WindowRef windowRef)
{
  BevelDocStrucHandle bevelDocStrucHdl;
  ControlRef          controlRef;
  SInt16              partCode, menuItem;

  bevelDocStrucHdl = (BevelDocStrucHandle) (GetWRefCon(windowRef));

  SetPortWindowPort(windowRef);
  GlobalToLocal(&eventStrucPtr->where);
  partCode = FindControl(eventStrucPtr->where,windowRef,&controlRef);

  doDrawPartCode(windowRef,(*bevelDocStrucHdl)->windowHeaderRef,partCode,1234);

  if(partCode)
  {
    partCode = TrackControl(controlRef,eventStrucPtr->where,NULL);

    if(controlRef == (*bevelDocStrucHdl)->bevelButton1Ref ||
       controlRef == (*bevelDocStrucHdl)->bevelButton2Ref ||
       controlRef == (*bevelDocStrucHdl)->bevelButton3Ref ||
       controlRef == (*bevelDocStrucHdl)->bevelButton4Ref ||
       controlRef == (*bevelDocStrucHdl)->bevelButton9Ref ||
       controlRef == (*bevelDocStrucHdl)->bevelButton13Ref ||
       controlRef == (*bevelDocStrucHdl)->bevelButton14Ref ||
       controlRef == (*bevelDocStrucHdl)->bevelButton15Ref ||
       controlRef == (*bevelDocStrucHdl)->bevelButton16Ref ||
       controlRef == (*bevelDocStrucHdl)->bevelButton17Ref)  
    {
      doDrawPartCode(windowRef,(*bevelDocStrucHdl)->windowHeaderRef,partCode,4321);
    }
    else if(controlRef == (*bevelDocStrucHdl)->bevelButton5Ref ||
            controlRef == (*bevelDocStrucHdl)->bevelButton6Ref ||
            controlRef == (*bevelDocStrucHdl)->bevelButton7Ref ||
            controlRef == (*bevelDocStrucHdl)->bevelButton8Ref)
    {
      if(partCode == kControlMenuPart)
      {
        GetBevelButtonMenuValue(controlRef,&menuItem);
        doDrawPartCode(windowRef,(*bevelDocStrucHdl)->windowHeaderRef,partCode,menuItem);
      }
      else
        doDrawPartCode(windowRef,(*bevelDocStrucHdl)->windowHeaderRef,partCode,4321);
    }
    else if(controlRef == (*bevelDocStrucHdl)->bevelButton10Ref ||
            controlRef == (*bevelDocStrucHdl)->bevelButton11Ref ||
            controlRef == (*bevelDocStrucHdl)->bevelButton12Ref)
    {
      if(partCode != kControlEntireControl)
      {
        SetControlValue((*bevelDocStrucHdl)->bevelButton10Ref,0);
        SetControlValue((*bevelDocStrucHdl)->bevelButton11Ref,0);
        SetControlValue((*bevelDocStrucHdl)->bevelButton12Ref,0);
        SetControlValue(controlRef,1);
      }
      doDrawPartCode(windowRef,(*bevelDocStrucHdl)->windowHeaderRef,partCode,4321);
    }
    else if(controlRef == (*bevelDocStrucHdl)->bevelButton18Ref)
    {
      doDrawPartCode(windowRef,(*bevelDocStrucHdl)->windowHeaderRef,partCode,4321);
      doGraphicAlignment(windowRef,controlRef,(*bevelDocStrucHdl)->windowHeaderRef);
    }
    else if(controlRef == (*bevelDocStrucHdl)->bevelButton19Ref)
    {
      doDrawPartCode(windowRef,(*bevelDocStrucHdl)->windowHeaderRef,partCode,4321);
      doTextAlignment(windowRef,controlRef,(*bevelDocStrucHdl)->windowHeaderRef);
    }
    else if(controlRef == (*bevelDocStrucHdl)->bevelButton20Ref)
    {
      doDrawPartCode(windowRef,(*bevelDocStrucHdl)->windowHeaderRef,partCode,4321);
      doTextOffset(windowRef,controlRef,(*bevelDocStrucHdl)->windowHeaderRef);
    }
    else if(controlRef == (*bevelDocStrucHdl)->bevelButton21Ref)
    {
      doDrawPartCode(windowRef,(*bevelDocStrucHdl)->windowHeaderRef,partCode,4321);
      doTextPlacement(windowRef,controlRef,(*bevelDocStrucHdl)->windowHeaderRef);
    }
    else
      doDrawPartCode(windowRef,(*bevelDocStrucHdl)->windowHeaderRef,partCode,4321);
  }
}

// **************************************************************************** doDrawPartCode

void  doDrawPartCode(WindowRef windowRef,ControlRef windowHeaderRef,SInt16 partCode,
                     SInt16 menuItem)
{
  SInt16 stringIndex;
  Str255 theString;

  if(partCode == kControlEntireControl)
    stringIndex = 1;
  else if(partCode == kControlMenuPart)
    stringIndex = 2;
  else if(partCode == kControlTrianglePart)
    stringIndex = 3;
  else if(partCode == kControlEditTextPart)
    stringIndex = 4;
  else if(partCode == kControlPicturePart)
    stringIndex = 5;
  else if(partCode == kControlIconPart)
    stringIndex = 6;
  else if(partCode == kControlClockPart)
    stringIndex = 7;
  else if(partCode == kControlListBoxPart)
    stringIndex = 8;
  else if(partCode == kControlListBoxDoubleClickPart)
    stringIndex = 9;
  else if(partCode == kControlImageWellPart)
    stringIndex = 10;
  else if(partCode == kControlRadioGroupPart)
    stringIndex = 11;
  else if(partCode == kControlButtonPart)
    stringIndex = 12;
  else if(partCode == kControlIndicatorPart)
    stringIndex = 13;

  if(menuItem > 0 && menuItem < 1234)
  {
    doCopyPString("\pTrackControl returned ",gCurrentString);
    GetIndString(theString,rPartCodeStrings,stringIndex);
    doConcatPStrings(gCurrentString,theString);
    doConcatPStrings(gCurrentString,"\p    GetBevelButtonMenuValue returned menu item ");
    NumToString((SInt32) menuItem,theString);
    doConcatPStrings(gCurrentString,theString);
  }
  else if(menuItem == 1234 || menuItem == 4321)
  {
    if(menuItem == 1234)
      doCopyPString("\pMouse-down in ",gCurrentString);
    else if(menuItem == 4321)
      doCopyPString("\pTrackControl returned ",gCurrentString);
    GetIndString(theString,rPartCodeStrings,stringIndex);
    doConcatPStrings(gCurrentString,theString);
  }

  Draw1Control(windowHeaderRef);
  doDrawMessage(windowRef,true);
}

// ************************************************************************ doGraphicAlignment

void  doGraphicAlignment(WindowRef windowRef,ControlRef controlRef,ControlRef windowHeaderRef)
{
  SInt16                        a, b;
  UInt32                        finalTicks;
  ControlButtonGraphicAlignment alignmentConstant = 0;
  
  if(!gRunningOnX)
    SetThemeCursor(kThemeWatchCursor);

  for(a=1;a<10;a++)
  {
    Delay(60,&finalTicks);
    alignmentConstant++;
    if(alignmentConstant == 9)
      alignmentConstant = 0;

    Draw1Control(windowHeaderRef);
    GetIndString(gCurrentString,rGraphicAlignStrings,a);
    doDrawMessage(windowRef,true);

    for(b=0;b<=52;b++)
    {
      SetBevelButtonGraphicAlignment(controlRef,alignmentConstant,b,b);
      Delay(2,&finalTicks);
      Draw1Control(controlRef);
      QDFlushPortBuffer(GetWindowPort(FrontNonFloatingWindow()),NULL);
    }
  }

  if(!gRunningOnX)
    SetThemeCursor(kThemeArrowCursor);
}

// *************************************************************************** doTextAlignment

void  doTextAlignment(WindowRef windowRef,ControlRef controlRef,ControlRef windowHeaderRef)
{
  SInt16                     a, b;
  UInt32                     finalTicks;
  ControlButtonTextAlignment alignmentConstant = -3;

  if(!gRunningOnX)
    SetThemeCursor(kThemeWatchCursor);

  for(a=1;a<4;a++)
  {
    Delay(60,&finalTicks);
    alignmentConstant++;
    if(alignmentConstant == 0)
      alignmentConstant++;

    Draw1Control(windowHeaderRef);
    GetIndString(gCurrentString,rTextAlignStrings,a);
    doDrawMessage(windowRef,true);

    for(b=0;b<=40;b++)
    {
      SetBevelButtonTextAlignment(controlRef,alignmentConstant,b);
      Delay(2,&finalTicks);
      Draw1Control(controlRef);
      QDFlushPortBuffer(GetWindowPort(FrontNonFloatingWindow()),NULL);
    }
  }

  if(!gRunningOnX)
    SetThemeCursor(kThemeArrowCursor);
}

// ****************************************************************************** doTextOffset

void  doTextOffset(WindowRef windowRef,ControlRef controlRef,ControlRef windowHeaderRef)
{
  ControlButtonTextAlignment alignmentConstant;
  SInt16                     offset;
  UInt32                     finalTicks;

  if(!gRunningOnX)
    SetThemeCursor(kThemeWatchCursor);

  Draw1Control(windowHeaderRef);
  doCopyPString("\pOffset from left",gCurrentString);
  doDrawMessage(windowRef,true);

  alignmentConstant = kControlBevelButtonAlignTextFlushLeft;
  SetControlData(controlRef,kControlEntireControl,kControlBevelButtonTextAlignTag,
                  sizeof(alignmentConstant),&alignmentConstant);
  Draw1Control(controlRef);

  for(offset=1;offset<27;offset++)
  {
    Delay(15,&finalTicks);
    SetControlData(controlRef,kControlEntireControl,kControlBevelButtonTextOffsetTag,
                   sizeof(offset),&offset);
    Draw1Control(controlRef);
    QDFlushPortBuffer(GetWindowPort(FrontNonFloatingWindow()),NULL);
  }

  Delay(60,&finalTicks);

  Draw1Control(windowHeaderRef);
  doCopyPString("\pOffset from right",gCurrentString);
  doDrawMessage(windowRef,true);

  alignmentConstant = kControlBevelButtonAlignTextFlushRight;
  SetControlData(controlRef,kControlEntireControl,kControlBevelButtonTextAlignTag,
                  sizeof(alignmentConstant),&alignmentConstant);

  for(offset=0;offset<13;offset++)
  {
    Delay(15,&finalTicks);
    SetControlData(controlRef,kControlEntireControl,kControlBevelButtonTextOffsetTag,
                   sizeof(offset),&offset);
    Draw1Control(controlRef);
    QDFlushPortBuffer(GetWindowPort(FrontNonFloatingWindow()),NULL);
  }

  if(!gRunningOnX)
    SetThemeCursor(kThemeArrowCursor);
}

// *************************************************************************** doTextPlacement

void  doTextPlacement(WindowRef windowRef,ControlRef controlRef,ControlRef windowHeaderRef)
{
  ControlButtonTextPlacement placementConstant;
  UInt32                     finalTicks;

  if(!gRunningOnX)
    SetThemeCursor(kThemeWatchCursor);

  for(placementConstant = 1;placementConstant < 5;placementConstant++)
  {
    Delay(60,&finalTicks);
    SetBevelButtonTextPlacement(controlRef,placementConstant);
    Draw1Control(controlRef);
    Draw1Control(windowHeaderRef);
    GetIndString(gCurrentString,rTextPlacementStrings,placementConstant);
    doDrawMessage(windowRef,true);
    QDFlushPortBuffer(GetWindowPort(FrontNonFloatingWindow()),NULL);
  }

  if(!gRunningOnX)
    SetThemeCursor(kThemeArrowCursor);
}

// ***************************************************************************** doDrawMessage

void  doDrawMessage(WindowRef windowRef,Boolean inState)
{
  Rect        portRect;
  CFStringRef stringRef;
  Rect        textBoxRect;

  if(windowRef == gWindowRef)
  {
    SetPortWindowPort(windowRef);

    GetWindowPortBounds(windowRef,&portRect);

    stringRef = CFStringCreateWithPascalString(NULL,gCurrentString,kCFStringEncodingMacRoman);
    SetRect(&textBoxRect,portRect.left,7,portRect.right,22);

    if(inState == kThemeStateActive)
      TextMode(srcOr);
    else
      TextMode(grayishTextOr);

    DrawThemeTextBox(stringRef,kThemeSmallSystemFont,inState,true,&textBoxRect,teJustCenter,
                       NULL);
    if(stringRef != NULL)
      CFRelease(stringRef);
  }
}

// ***************************************************************************** doDrawLegends

void  doDrawLegends(WindowRef windowRef,Boolean inState)
{
  Rect theRect;

  if(windowRef == gWindowRef)
  {
    SetPortWindowPort(windowRef);

    if(gRunningOnX)
    {
      SetRect(&theRect,30,54,585,67);
      EraseRect(&theRect);
      OffsetRect(&theRect,0,91);
      EraseRect(&theRect);
      OffsetRect(&theRect,0,92);
      EraseRect(&theRect);
    }

    if(inState == kThemeStateActive)
      TextMode(srcOr);
    else
      TextMode(grayishTextOr);

    SetRect(&theRect,30,53,220,68);
    if(gRunningOnX)
      DrawThemeTextBox(CFSTR("Bevel button content"),kThemeSmallSystemFont,inState,false,
                       &theRect,teJustLeft,NULL);
    else
      DrawThemeTextBox(CFSTR("Bevel sizes and bevel button content"),kThemeSmallSystemFont,
                       inState,false,&theRect,teJustLeft,NULL);
    SetRect(&theRect,313,53,513,68);
    DrawThemeTextBox(CFSTR("Menu position and behaviour"),kThemeSmallSystemFont,inState,
                     false,&theRect,teJustLeft,NULL);
    SetRect(&theRect,30,144,180,159);
    DrawThemeTextBox(CFSTR("Bevel button behaviour"),kThemeSmallSystemFont,inState,false,
                     &theRect,teJustLeft,NULL);
    SetRect(&theRect,313,144,513,159);
    DrawThemeTextBox(CFSTR("Graphic/text alignment & offset"),kThemeSmallSystemFont,inState,
                     false,&theRect,teJustLeft,NULL);
    SetRect(&theRect,490,144,640,159);
    DrawThemeTextBox(CFSTR("Text placement"),kThemeSmallSystemFont,inState,false,&theRect,
                     teJustLeft,NULL);
    SetRect(&theRect,30,235,180,250);
    DrawThemeTextBox(CFSTR("Image wells"),kThemeSmallSystemFont,inState,false,&theRect,
                     teJustLeft,NULL);
    SetRect(&theRect,168,235,308,250);
    DrawThemeTextBox(CFSTR("Picture controls"),kThemeSmallSystemFont,inState,false,&theRect,
                     teJustLeft,NULL);
    SetRect(&theRect,313,235,463,250);
    DrawThemeTextBox(CFSTR("Icon controls (cicn)"),kThemeSmallSystemFont,inState,false,
                     &theRect,teJustLeft,NULL);
    SetRect(&theRect,451,235,601,250);
    DrawThemeTextBox(CFSTR("Icon controls (icon suite)"),kThemeSmallSystemFont,inState,false,
                     &theRect,teJustLeft,NULL);
  }
}

// **************************************************************** helpTagsBevelImagePictIcon

void  helpTagsBevelImagePictIcon(WindowRef windowRef)
{
  BevelDocStrucHandle bevelDocStrucHdl;
  HMHelpContentRec    helpContent;

  bevelDocStrucHdl = (BevelDocStrucHandle) (GetWRefCon(windowRef));

  memset(&helpContent,0,sizeof(helpContent));
  HMSetTagDelay(500);
  HMSetHelpTagsDisplayed(true);

  helpContent.version = kMacHelpVersion;
  helpContent.tagSide = kHMOutsideTopCenterAligned;
  helpContent.content[kHMMinimumContentIndex].contentType = kHMStringResContent;
  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmResID = 132;

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 1;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton1Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 2;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton2Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 3;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton3Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 4;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton4Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 5;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton5Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 6;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton6Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 7;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton7Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 8;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton8Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 9;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton9Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 10;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton10Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 10;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton11Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 10;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton12Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 11;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton13Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 11;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton14Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 11;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton15Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 12;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton16Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 13;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton17Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 14;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton18Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 15;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton19Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 16;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton20Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 17;
  HMSetControlHelpContent((*bevelDocStrucHdl)->bevelButton21Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 18;
  HMSetControlHelpContent((*bevelDocStrucHdl)->imageWell1Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 19;
  HMSetControlHelpContent((*bevelDocStrucHdl)->imageWell2Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 20;
  HMSetControlHelpContent((*bevelDocStrucHdl)->picture1Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 21;
  HMSetControlHelpContent((*bevelDocStrucHdl)->picture2Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 22;
  HMSetControlHelpContent((*bevelDocStrucHdl)->colourIcon1Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 23;
  HMSetControlHelpContent((*bevelDocStrucHdl)->colourIcon2Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 24;
  HMSetControlHelpContent((*bevelDocStrucHdl)->iconSuite1Ref,&helpContent);

  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 25;
  HMSetControlHelpContent((*bevelDocStrucHdl)->iconSuite2Ref,&helpContent);
}

// *******************************************************************************************
// TabEditClock.c
// *******************************************************************************************

// .................................................................................. includes

#include "Controls3.h"

// .......................................................................... global variables

extern Boolean  gRunningOnX;

// **************************************************************************** doTabEditClock

void  doTabEditClock(void)
{
  DialogRef                    dialogRef;
  ControlRef                   controlRef;
  Str255                       initialName = "\pYour name here";
  ControlEditTextSelectionRec  selectionRec;
  ControlKeyFilterUPP          numericFilterUPP;
  ModalFilterUPP               eventFilterUPP;
  ControlEditTextValidationUPP editTextValidatorUPP;
  SInt16                       tabHit, itemHit;

  if(FrontNonFloatingWindow())
    doActivateWindow(FrontNonFloatingWindow(),false);

  if(!(dialogRef = GetNewDialog(rTabEditClockDialog,NULL,(WindowRef) -1)))
    ExitToShell();

  SetWTitle(GetDialogWindow(dialogRef),"\pTab, Edit Text, and Clock Controls");
  SetPortDialogPort(dialogRef);

  // .................................................. set default button and cursor tracking

  SetDialogDefaultItem(dialogRef,kStdOkItemIndex);
  SetDialogTracksCursor(dialogRef,true);

  // ..................................................... hide user pane with embedded clocks

  GetDialogItemAsControl(dialogRef,iClocksUserPane,&controlRef);
  HideControl(controlRef);

  // ............... assign some text to the first edit text control and select the whole text

  GetDialogItemAsControl(dialogRef,iEditText1,&controlRef);
  SetControlData(controlRef,kControlEntireControl,kControlEditTextTextTag,initialName[0],
                 &initialName[1]);
  selectionRec.selStart = 0;
  selectionRec.selEnd = 32767;
  SetControlData(controlRef,kControlEntireControl,kControlEditTextSelectionTag,
                 sizeof(selectionRec),&selectionRec);
                 
  // create universal procedure pointers for event filter, key filter, and edit text validator

  eventFilterUPP        = NewModalFilterUPP((ModalFilterProcPtr) eventFilter);
  numericFilterUPP      = NewControlKeyFilterUPP((ControlKeyFilterProcPtr) numericFilter);
  editTextValidatorUPP  = NewControlEditTextValidationUPP((ControlEditTextValidationProcPtr)
                                                          editTextValidator); 

  // .................. attach an edit text validation function to the first edit text control
  
  GetDialogItemAsControl(dialogRef,iEditText1,&controlRef);
  SetControlData(controlRef,kControlEntireControl,kControlEditTextValidationProcTag,
                 sizeof(editTextValidatorUPP),&editTextValidatorUPP);

// .............................. attach a key filter function to the second edit text control

  GetDialogItemAsControl(dialogRef,iEditText2,&controlRef);
  SetControlData(controlRef,kControlEntireControl,kControlEditTextKeyFilterTag,
                 sizeof(numericFilterUPP),&numericFilterUPP);

  // ................................. set help tags, show dialog, and enter modal dialog loop

  if(gRunningOnX)
    helpTagsTabEditClock(dialogRef);

  ShowWindow(GetDialogWindow(dialogRef));

  do
  {
    ModalDialog(eventFilterUPP,&itemHit);

    if(itemHit == iTabs)
    {
      GetDialogItemAsControl(dialogRef,iTabs,&controlRef);
      tabHit = GetControlValue(controlRef);
      
      if(tabHit == tabEditText)
      {
        SetWTitle(GetDialogWindow(dialogRef),"\pTab, Edit Text, and Clock Controls");

        GetDialogItemAsControl(dialogRef,iClocksUserPane,&controlRef);
        HideControl(controlRef);

        GetDialogItemAsControl(dialogRef,iEditTextUserPane,&controlRef);
        ActivateControl(controlRef);
        ShowControl(controlRef);

        GetDialogItemAsControl(dialogRef,iEditText1,&controlRef);
        SetKeyboardFocus(GetDialogWindow(dialogRef),controlRef,kControlFocusNextPart);
      }
      else if(tabHit == tabClocks)
      {
        SetWTitle(GetDialogWindow(dialogRef),"\pTab, Clock, and Edit Text Controls");

        GetDialogItemAsControl(dialogRef,iEditTextUserPane,&controlRef);
        DeactivateControl(controlRef);
        HideControl(controlRef);

        GetDialogItemAsControl(dialogRef,iClocksUserPane,&controlRef);
        ShowControl(controlRef);

        GetDialogItemAsControl(dialogRef,iClocks1,&controlRef);
        SetKeyboardFocus(GetDialogWindow(dialogRef),controlRef,kControlFocusNextPart);
      }
    }
    else if(itemHit == iExtractEditText)
    {
      GetDialogItemAsControl(dialogRef,iImageWellEditText,&controlRef);
      Draw1Control(controlRef);
      doExtractEditText(dialogRef);
    }
    else if(itemHit == iExtractClocks)
    {
      GetDialogItemAsControl(dialogRef,iImageWellClocks,&controlRef);
      Draw1Control(controlRef);
      doExtractDateTime(dialogRef);
    }
  } while(itemHit != kStdOkItemIndex);

  DisposeDialog(dialogRef);
  DisposeModalFilterUPP(eventFilterUPP);
  DisposeControlKeyFilterUPP(numericFilterUPP);
  DisposeControlEditTextValidationUPP(editTextValidatorUPP);
}

// ************************************************************************* doExtractEditText

void  doExtractEditText(DialogRef dialogRef)
{
  GrafPtr     oldPort;
  RGBColor    saveBackColour, whiteColour = { 0xFFFF, 0xFFFF, 0xFFFF };
  SInt16      iType;
  Handle      theHandle;
  Rect        theRect;
  Str255      theString;
  CFStringRef stringRef;
  ControlRef  controlRef;
  Size        actualSize;

  GetPort(&oldPort);
  SetPortDialogPort(dialogRef);
  GetBackColor(&saveBackColour);
  RGBBackColor(&whiteColour);
  
  GetDialogItem(dialogRef,iEditText1,&iType,&theHandle,&theRect);
  GetDialogItemText(theHandle,theString);
  if(!gRunningOnX)
  {
    MoveTo(124,177);
    DrawString(theString);
  }
  else
  {
    stringRef = CFStringCreateWithPascalString(NULL,theString,kCFStringEncodingMacRoman);
    SetRect(&theRect,124,166,314,181);
    DrawThemeTextBox(stringRef,kThemeSmallSystemFont,true,false,&theRect,teJustLeft,NULL);
  }

  GetDialogItem(dialogRef,iEditText2,&iType,&theHandle,&theRect);
  GetDialogItemText(theHandle,theString);
  if(!gRunningOnX)
  {
    MoveTo(124,190);
    DrawString(theString);
  }
  else
  {
    stringRef = CFStringCreateWithPascalString(NULL,theString,kCFStringEncodingMacRoman);
    SetRect(&theRect,124,179,314,194);
    DrawThemeTextBox(stringRef,kThemeSmallSystemFont,true,false,&theRect,teJustLeft,NULL);
  }

  GetDialogItemAsControl(dialogRef,iEditText3,&controlRef);
  GetControlDataSize(controlRef,kControlEditTextPart,kControlEditTextTextTag,&actualSize);
  GetControlData(controlRef,kControlEntireControl,kControlEditTextPasswordTag,actualSize,
                 &theString[1],NULL);
  theString[0] = actualSize;
  if(!gRunningOnX)
  {
    MoveTo(124,203);
    DrawString(theString);
  }
  else
  {
    stringRef = CFStringCreateWithPascalString(NULL,theString,kCFStringEncodingMacRoman);
    SetRect(&theRect,124,192,314,207);
    DrawThemeTextBox(stringRef,kThemeSmallSystemFont,true,false,&theRect,teJustLeft,NULL);
  }

  if(gRunningOnX)
  {
    if(stringRef != NULL)
      CFRelease(stringRef);
  }

  RGBBackColor(&saveBackColour);
  SetPort(oldPort);
}

// ************************************************************************* doExtractDateTime

void  doExtractDateTime(DialogRef dialogRef)
{
  GrafPtr     oldPort;
  RGBColor    saveBackColour, whiteColour = { 0xFFFF, 0xFFFF, 0xFFFF };
  ControlRef  controlRef;
  LongDateRec longDateTimeStruc;
  SInt16      second, minute, hour, day, month, year;
  Str255      theString, tempString;
  CFStringRef stringRef;
  Rect        theRect;
    
  GetPort(&oldPort);
  SetPortDialogPort(dialogRef);
  GetBackColor(&saveBackColour);
  RGBBackColor(&whiteColour);

  GetDialogItemAsControl(dialogRef,iClocks1,&controlRef);
  GetControlData(controlRef,kControlEntireControl,kControlClockLongDateTag,
                 sizeof(longDateTimeStruc),&longDateTimeStruc,NULL);
  hour = longDateTimeStruc.ld.hour;
  minute = longDateTimeStruc.ld.minute;
  second = longDateTimeStruc.ld.second;
  doCopyPString("\pHour ",theString);  
  NumToString((SInt32) hour,tempString);
  doConcatPStrings(theString,tempString);
  doConcatPStrings(theString,"\p, Minute ");
  NumToString((SInt32) minute,tempString);
  doConcatPStrings(theString,tempString);
  doConcatPStrings(theString,"\p, Second ");
  NumToString((SInt32) second,tempString);
  doConcatPStrings(theString,tempString);
  MoveTo(124,177);
  if(!gRunningOnX)
    DrawString(theString);
  else
  {
    stringRef = CFStringCreateWithPascalString(NULL,theString,kCFStringEncodingMacRoman);
    SetRect(&theRect,124,166,314,181);
    DrawThemeTextBox(stringRef,kThemeSmallSystemFont,true,false,&theRect,teJustLeft,NULL);
    if(stringRef != NULL)    
      CFRelease(stringRef);
  }
  
  GetDialogItemAsControl(dialogRef,iClocks2,&controlRef);
  GetControlData(controlRef,kControlEntireControl,kControlClockLongDateTag,
                 sizeof(longDateTimeStruc),&longDateTimeStruc,NULL);
  day = longDateTimeStruc.ld.day;
  month = longDateTimeStruc.ld.month;
  year = longDateTimeStruc.ld.year;
  doCopyPString("\pDay ",theString);  
  NumToString((SInt32) day,tempString);
  doConcatPStrings(theString,tempString);
  doConcatPStrings(theString,"\p, Month ");
  NumToString((SInt32) month,tempString);
  doConcatPStrings(theString,tempString);
  doConcatPStrings(theString,"\p, Year ");
  NumToString((SInt32) year,tempString);
  doConcatPStrings(theString,tempString);
  MoveTo(124,190);
  if(!gRunningOnX)
    DrawString(theString);
  else
  {
    stringRef = CFStringCreateWithPascalString(NULL,theString,kCFStringEncodingMacRoman);
    SetRect(&theRect,124,179,314,194);
    DrawThemeTextBox(stringRef,kThemeSmallSystemFont,true,false,&theRect,teJustLeft,NULL);
    if(stringRef != NULL)    
      CFRelease(stringRef);
  }

  GetDialogItemAsControl(dialogRef,iClocks3,&controlRef);
  GetControlData(controlRef,kControlEntireControl,kControlClockLongDateTag,
                 sizeof(longDateTimeStruc),&longDateTimeStruc,NULL);
  month = longDateTimeStruc.ld.month;
  year = longDateTimeStruc.ld.year;
  doCopyPString("\pMonth ",theString);  
  NumToString((SInt32) month,tempString);
  doConcatPStrings(theString,tempString);
  doConcatPStrings(theString,"\p, Year ");
  NumToString((SInt32) year,tempString);
  doConcatPStrings(theString,tempString);
  MoveTo(124,203);
  if(!gRunningOnX)
    DrawString(theString);
  else
  {
    stringRef = CFStringCreateWithPascalString(NULL,theString,kCFStringEncodingMacRoman);
    SetRect(&theRect,124,192,314,207);
    DrawThemeTextBox(stringRef,kThemeSmallSystemFont,true,false,&theRect,teJustLeft,NULL);
    if(stringRef != NULL)    
      CFRelease(stringRef);
  }

  RGBBackColor(&saveBackColour);
  SetPort(oldPort);
}

// ***************************************************************************** numericFilter

ControlKeyFilterResult  numericFilter(ControlRef controlRef,SInt16* keyCode,SInt16 *charCode,
                                      EventModifiers *modifiers)
{
  if(((char) *charCode >= '0') && ((char) *charCode <= '9') || 
     (BitTst(modifiers,15 - cmdKeyBit)))
  {
    return kControlKeyFilterPassKey;
  }

  switch(*charCode)
  {
    case kLeftArrow:
    case kRightArrow:
    case kUpArrow:
    case kDownArrow:
    case kBackspace:
    case kDelete:
      return kControlKeyFilterPassKey;
      break;
  }
    
  SysBeep(10);
  return kControlKeyFilterBlockKey;
}

// ************************************************************************* editTextValidator

void  editTextValidator(ControlRef controlRef)
{
  Str255 oldText, newText;
  Size   actualSize;
  UInt8  a, count = 0;

  GetControlData(controlRef,kControlEntireControl,kControlEditTextTextTag,sizeof(oldText) -1,
                 &oldText[1],&actualSize);

  if(actualSize <= 255)
    oldText[0] = actualSize;
  else
    oldText[0] = 255;
    
  for(a=1;a<=oldText[0];a++)
  {
    if(((oldText[a] >= 'A') && (oldText[a] <= 'Z') ||
        (oldText[a] >= 'a') && (oldText[a] <= 'z')) ||
        (oldText[a] == ' ') || (oldText[a] == '.'))
    {
      newText[count + 1] = oldText[a];
      count++;  
    }
  }

  newText[0] = count;

  SetControlData(controlRef,kControlEntireControl,kControlEditTextTextTag,newText[0],
                 &newText[1]);

  Draw1Control(controlRef);
}

// ********************************************************************** helpTagsTabEditClock

void  helpTagsTabEditClock(DialogRef dialogRef)
{
  HMHelpContentRec helpContent;
  SInt16           a;
  static SInt16    itemNumber[10] = { 2,5,7,9,11,21,14,16,18,20 };
  ControlRef       controlRef;

  memset(&helpContent,0,sizeof(helpContent));
  HMSetTagDelay(500);
  HMSetHelpTagsDisplayed(true);

  helpContent.version = kMacHelpVersion;
  helpContent.tagSide = kHMOutsideTopCenterAligned;
  helpContent.content[kHMMinimumContentIndex].contentType = kHMStringResContent;
  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmResID = 133;

  for(a = 1;a <= 10; a++)
  {
    helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = a;
    GetDialogItemAsControl(dialogRef,itemNumber[a - 1],&controlRef);
    HMSetControlHelpContent(controlRef,&helpContent);
  }
}

// *******************************************************************************************
// GroupArrowsProgress.c
// *******************************************************************************************

// .................................................................................. includes

#include "Controls3.h"

// .......................................................................... global variables

ControlRef       gCacheSizeControlRef;
ControlRef       gLittleArrowsControlRef;
ControlActionUPP gArrowsActionFunctionUPP;
extern Boolean   gRunningOnX;
extern Boolean   gGroupArrowsProgressActive;

// ********************************************************************* doGroupArrowsProgress

void  doGroupArrowsProgress(void)
{
  DialogRef      dialogRef;
  ControlRef     controlRef;
  ModalFilterUPP eventFilterUPP;
  SInt16         controlValue, itemHit;
  Str255         theString;

  if(FrontNonFloatingWindow())
    doActivateWindow(FrontNonFloatingWindow(),false);

  if(!(dialogRef = GetNewDialog(rGroupArrowsProgDialog,NULL,(WindowRef) -1)))
    ExitToShell();

  SetPortDialogPort(dialogRef);

  // ........................................................... set default button, help tags

  SetDialogDefaultItem(dialogRef,kStdOkItemIndex);

  // .. create universal procedure pointers for event filter and little arrows action function

  eventFilterUPP            = NewModalFilterUPP((ModalFilterProcPtr) eventFilter);
  gArrowsActionFunctionUPP  = NewControlActionUPP((ControlActionProcPtr) arrowsActionFunction);

  // ................................................ set initial value for checkbox group box

  GetDialogItemAsControl(dialogRef,iCheckboxGroup,&controlRef);
  SetControlValue(controlRef,1);

  // ....................................... get and set initial cache value for little arrows

  GetDialogItemAsControl(dialogRef,iLittleArrows,&gLittleArrowsControlRef);
  NumToString((SInt32) GetControlValue(gLittleArrowsControlRef),theString);
  doConcatPStrings(theString,"\pK");
  GetDialogItemAsControl(dialogRef,iStaticTextCache,&gCacheSizeControlRef);
  SetControlData(gCacheSizeControlRef,kControlEntireControl,kControlStaticTextTextTag,
                 theString[0],&theString[1]);

  // ............................................... hide second user pane in pop-up group box

  GetDialogItemAsControl(dialogRef,iUserPaneScoreAverage,&controlRef);
  HideControl(controlRef);

  // .................................. set help tags, show dialog, and enter ModalDialog loop

  if(gRunningOnX)
    helpTagsGroupArrowsProgress(dialogRef);

  ShowWindow(GetDialogWindow(dialogRef));

  do
  {
    ModalDialog(eventFilterUPP,&itemHit);

    if(itemHit == iCheckboxGroup)
    {
      doCheckBoxGroupBox(dialogRef);
    }    
    else if(itemHit == iPopupGroup)
    {
      doPopupGroupBox(dialogRef);
    }
    else if(itemHit == iCheckboxShowInitials)
    {
      GetDialogItemAsControl(dialogRef,iCheckboxShowInitials,&controlRef);
      controlValue = (!(GetControlValue(controlRef)));
      SetControlValue(controlRef,controlValue);
    }
    else if(itemHit == iCheckboxShowAverages)
    {
      GetDialogItemAsControl(dialogRef,iCheckboxShowAverages,&controlRef);
      controlValue = (!(GetControlValue(controlRef)));
      SetControlValue(controlRef,controlValue);
    }
    else if(itemHit == iDisclosureTriangle)
    {
      doChasingAndProgress(dialogRef);
    }
    else if(itemHit == iPushButtonExtract)
    {
      GetDialogItemAsControl(dialogRef,iImageWell,&controlRef);
      Draw1Control(controlRef);
      doExtractCurrentStatus(dialogRef);
    }
  } while(itemHit != kStdOkItemIndex);

  // ................................................................................ clean up

  DisposeDialog(dialogRef);
  DisposeModalFilterUPP(eventFilterUPP);
  DisposeControlActionUPP(gArrowsActionFunctionUPP);

  gGroupArrowsProgressActive = false;
}

// ************************************************************************ doCheckBoxGroupBox

void  doCheckBoxGroupBox(DialogRef dialogRef)
{
  ControlRef controlRef;
  SInt16     controlValue;

  GetDialogItemAsControl(dialogRef,iCheckboxGroup,&controlRef);
  controlValue = (!(GetControlValue(controlRef)));
  SetControlValue(controlRef,controlValue);
  
  if(controlValue == 0)
  {
    GetDialogItemAsControl(dialogRef,iRadioGroupColour,&controlRef);
    DeactivateControl(controlRef);  
    GetDialogItemAsControl(dialogRef,iStaticTextColourDepth,&controlRef);
    DeactivateControl(controlRef);  
  }
  else if(controlValue == 1)
  {
    GetDialogItemAsControl(dialogRef,iRadioGroupColour,&controlRef);
    ActivateControl(controlRef);  
    GetDialogItemAsControl(dialogRef,iStaticTextColourDepth,&controlRef);
    ActivateControl(controlRef);  
  }
}

// *************************************************************************** doPopupGroupBox

void  doPopupGroupBox(DialogRef dialogRef)
{
  ControlRef controlRef;
  SInt16     controlValue;

  GetDialogItemAsControl(dialogRef,iPopupGroup,&controlRef);
  controlValue = GetControlValue(controlRef);

  if(controlValue == 1)
  {
    GetDialogItemAsControl(dialogRef,iUserPaneScoreAverage,&controlRef);
    HideControl(controlRef);
    GetDialogItemAsControl(dialogRef,iUserPaneNamesInitials,&controlRef);
    ShowControl(controlRef);
  }
  else if(controlValue == 2)
  {
    GetDialogItemAsControl(dialogRef,iUserPaneNamesInitials,&controlRef);
    HideControl(controlRef);
    GetDialogItemAsControl(dialogRef,iUserPaneScoreAverage,&controlRef);
    ShowControl(controlRef);
  }
}

// ********************************************************************** doChasingAndProgress

void  doChasingAndProgress(DialogRef dialogRef)
{
  ControlRef controlRef;
  SInt16     controlValue;
  Handle     ditlHdl;
  Boolean    indeterminateFlag = 1;
  Str255     expandString   = "\pHide Progress Bar and Chasing Arrows";
  Str255     collapseString = "\pShow Progress Bar and Chasing Arrows";

  GetDialogItemAsControl(dialogRef,iDisclosureTriangle,&controlRef);
  controlValue = (!(GetControlValue(controlRef)));
  SetControlValue(controlRef,controlValue);

  if(controlValue == 1)
  {
    ditlHdl = GetResource('DITL',130);
    AppendDITL(dialogRef,ditlHdl,appendDITLBottom);
    ReleaseResource(ditlHdl);

    GetDialogItemAsControl(dialogRef,iProgressBar,&controlRef);
    SetControlData(controlRef,kControlEntireControl,kControlProgressBarIndeterminateTag,
                   sizeof(indeterminateFlag),&indeterminateFlag);

    GetDialogItemAsControl(dialogRef,kStdOkItemIndex,&controlRef);
    MoveControl(controlRef,277,351);
    
    GetDialogItemAsControl(dialogRef,iStaticTextDisclosure,&controlRef);
    SetControlData(controlRef,kControlEntireControl,kControlStaticTextTextTag,
                   expandString[0],&expandString[1]);
    Draw1Control(controlRef);
  }
  else if(controlValue == 0)
  {
    GetDialogItemAsControl(dialogRef,kStdOkItemIndex,&controlRef);
    MoveControl(controlRef,277,280);

    ShortenDITL(dialogRef,3);
    SizeWindow(GetDialogWindow(dialogRef),362,321,false);

    GetDialogItemAsControl(dialogRef,iStaticTextDisclosure,&controlRef);
    SetControlData(controlRef,kControlEntireControl,kControlStaticTextTextTag,
                   collapseString[0],&collapseString[1]);
    Draw1Control(controlRef);
  }
}

// ******************************************************************** doExtractCurrentStatus

void  doExtractCurrentStatus(DialogRef dialogRef)
{
  GrafPtr     oldPort;
  RGBColor    saveBackColour, whiteColour = { 0xFFFF, 0xFFFF, 0xFFFF };
  ControlRef  controlRef;
  SInt16      controlValue;
  Str255      theString;
  CFStringRef stringRef;
  Rect        theRect;

  GetPort(&oldPort);
  SetPortDialogPort(dialogRef);
  GetBackColor(&saveBackColour);
  RGBBackColor(&whiteColour);

  GetDialogItemAsControl(dialogRef,iCheckboxGroup,&controlRef);
  controlValue = GetControlValue(controlRef);  
  if(controlValue)
  {
    doCopyPString("\pUse colour,",theString);
    GetDialogItemAsControl(dialogRef,iRadioGroupColour,&controlRef);
    controlValue = GetControlValue(controlRef);
    if(controlValue == 1)
      doConcatPStrings(theString,"\p 8 bit.");
    else if(controlValue == 2)
      doConcatPStrings(theString,"\p 16 bit.");
    else if(controlValue == 3)
      doConcatPStrings(theString,"\p 32 bit.");
  }
  else
    doCopyPString("\pDont use colour.",theString);

  if(!gRunningOnX)
  {
    MoveTo(108,216);
    DrawString(theString);
  }
  else
  {
    stringRef = CFStringCreateWithPascalString(NULL,theString,kCFStringEncodingMacRoman);
    SetRect(&theRect,108,205,347,220);
    DrawThemeTextBox(stringRef,kThemeSmallSystemFont,true,false,&theRect,teJustLeft,NULL);
    if(stringRef != NULL)    
      CFRelease(stringRef);
  }

  GetDialogItemAsControl(dialogRef,iPopupGroup,&controlRef);
  controlValue = GetControlValue(controlRef);  
  if(controlValue == 1)
  {
    doCopyPString("\pPlayer, ",theString);
    GetDialogItemAsControl(dialogRef,iRadioGroupNames,&controlRef);
    controlValue = GetControlValue(controlRef);
    if(controlValue == 1)
      doConcatPStrings(theString,"\pname first,");
    else if(controlValue == 2)
      doConcatPStrings(theString,"\pname last,");
    GetDialogItemAsControl(dialogRef,iCheckboxShowInitials,&controlRef);
    controlValue = GetControlValue(controlRef);
    if(controlValue == 1)
      doConcatPStrings(theString,"\p show number.");
    else if(controlValue == 0)
      doConcatPStrings(theString,"\p no number.");
  }
  else if(controlValue == 2)
  {
    doCopyPString("\pScore, ",theString);
    GetDialogItemAsControl(dialogRef,iRadioGroupScores,&controlRef);
    controlValue = GetControlValue(controlRef);
    if(controlValue == 1)
      doConcatPStrings(theString,"\pbatting, ");
    else if(controlValue == 2)
      doConcatPStrings(theString,"\pbowling, ");
    GetDialogItemAsControl(dialogRef,iCheckboxShowAverages,&controlRef);
    controlValue = GetControlValue(controlRef);
    if(controlValue == 1)
      doConcatPStrings(theString,"\pshow average.");
    else if(controlValue == 0)
      doConcatPStrings(theString,"\pno average.");
  }

  if(!gRunningOnX)
  {
    MoveTo(108,229);
    DrawString(theString);
  }
  else
  {
    stringRef = CFStringCreateWithPascalString(NULL,theString,kCFStringEncodingMacRoman);
    SetRect(&theRect,108,219,347,234);
    DrawThemeTextBox(stringRef,kThemeSmallSystemFont,true,false,&theRect,teJustLeft,NULL);
    if(stringRef != NULL)    
      CFRelease(stringRef);
  }

  if(!gRunningOnX)
  {
    MoveTo(108,242);      
    DrawString("\pCache size: ");
  }
  else
  {
    stringRef = CFStringCreateWithPascalString(NULL,"\pCache size: ",
                                               kCFStringEncodingMacRoman);
    SetRect(&theRect,108,232,347,247);
    DrawThemeTextBox(stringRef,kThemeSmallSystemFont,true,false,&theRect,teJustLeft,NULL);
    if(stringRef != NULL)    
      CFRelease(stringRef);
  }

  GetDialogItemAsControl(dialogRef,iLittleArrows,&controlRef);
  NumToString((SInt32) GetControlValue(controlRef),theString);
  if(!gRunningOnX)
    DrawString(theString);
  else
  {
    stringRef = CFStringCreateWithPascalString(NULL,theString,kCFStringEncodingMacRoman);
    SetRect(&theRect,174,232,347,247);
    DrawThemeTextBox(stringRef,kThemeSmallSystemFont,true,false,&theRect,teJustLeft,NULL);
    if(stringRef != NULL)    
      CFRelease(stringRef);
  }

  RGBBackColor(&saveBackColour);
  SetPort(oldPort);
}

// *************************************************************** helpTagsGroupArrowsProgress

void  helpTagsGroupArrowsProgress(DialogRef dialogRef)
{
  HMHelpContentRec helpContent;
  SInt16           a;
  static SInt16    itemNumber[8] = { 2,9,21,25,27,29,31,32 };
  ControlRef       controlRef;

  memset(&helpContent,0,sizeof(helpContent));
  HMSetTagDelay(500);
  HMSetHelpTagsDisplayed(true);

  helpContent.version = kMacHelpVersion;
  helpContent.tagSide = kHMOutsideTopCenterAligned;
  helpContent.content[kHMMinimumContentIndex].contentType = kHMStringResContent;
  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmResID = 134;

  for(a = 1;a <= 8; a++)
  {
    helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = a;
    GetDialogItemAsControl(dialogRef,itemNumber[a - 1],&controlRef);
    HMSetControlHelpContent(controlRef,&helpContent);
  }
}

// *******************************************************************************************
// Sliders.c
// *******************************************************************************************

// .................................................................................. includes

#include "Controls3.h"

// .......................................................................... global variables

extern Boolean gRunningOnX;

// .......................................................................... global variables

ControlActionUPP           gSliderActionFunction1UPP;
ControlActionUPP           gSliderActionFunction2UPP;
ControlUserPaneDrawUPP     gUserPaneDrawFunctionUPP;
ControlUserPaneActivateUPP gUserPaneActivateFunctionUPP;
ControlRef                 gSlider1Ref;
ControlRef                 gSlider2Ref;
ControlRef                 gSlider3Ref;
ControlRef                 gSlider4Ref;
ControlRef                 gSlider5Ref;
ControlRef                 gSlider6Ref;
RGBColor                   gRedColour;
RGBColor                   gBlueColour;
RGBColor                   gBlackColour   = { 0x0000, 0x0000, 0x0000 };
Boolean                    gDrawActivated = true;
extern Boolean             gSlidersActive;

// ************************************************************************** doSliderUserPane

void  doSliderUserPane(void)
{
  DialogRef      dialogRef;
  ModalFilterUPP eventFilterUPP;
  ControlRef     controlRef;
  SInt16         itemHit;

  if(FrontNonFloatingWindow())
    doActivateWindow(FrontNonFloatingWindow(),false);

  if(!(dialogRef = GetNewDialog(rSlidersDialog,NULL,(WindowRef) -1)))
    ExitToShell();

  // ...................................................................... set default button

  SetDialogDefaultItem(dialogRef,kStdOkItemIndex);

  // ............................ create universal procedure pointer for event filter function

  eventFilterUPP = NewModalFilterUPP((ModalFilterProcPtr) eventFilter);

  // ......................... create universal procedure pointers for slider action functions

  gSliderActionFunction1UPP = NewControlActionUPP((ControlActionProcPtr)
                              sliderActionFunction1);
  gSliderActionFunction2UPP = NewControlActionUPP((ControlActionProcPtr) 
                              sliderActionFunction2);

  // .... create universal procedure pointers for user pane functions, set user pane functions

  gUserPaneDrawFunctionUPP = NewControlUserPaneDrawUPP((ControlUserPaneDrawProcPtr)
                                                       userPaneDrawFunction);
  GetDialogItemAsControl(dialogRef,iUserPane1,&controlRef);
  SetControlData(controlRef,kControlEntireControl,kControlUserPaneDrawProcTag, 
                 sizeof(gUserPaneDrawFunctionUPP),&gUserPaneDrawFunctionUPP);

  gUserPaneActivateFunctionUPP = NewControlUserPaneActivateUPP((ControlUserPaneActivateProcPtr)
                                                               userPaneActivateFunction);
  GetDialogItemAsControl(dialogRef,iUserPane1,&controlRef);
  SetControlData(controlRef,kControlEntireControl,kControlUserPaneActivateProcTag, 
                 sizeof(gUserPaneActivateFunctionUPP),&gUserPaneActivateFunctionUPP);

  // ........... get control handles of, and draw initial control values for, top four sliders
  
  GetDialogItemAsControl(dialogRef,iSlider1,&gSlider1Ref);
  doDrawSliderValues(dialogRef,gSlider1Ref);
  GetDialogItemAsControl(dialogRef,iSlider2,&gSlider2Ref);
  doDrawSliderValues(dialogRef,gSlider2Ref);
  GetDialogItemAsControl(dialogRef,iSlider3,&gSlider3Ref);
  doDrawSliderValues(dialogRef,gSlider3Ref);
  GetDialogItemAsControl(dialogRef,iSlider4,&gSlider4Ref);
  doDrawSliderValues(dialogRef,gSlider4Ref);

  // ....................... get control handles and values for bottom two sliders, set colour

  GetDialogItemAsControl(dialogRef,iSlider5,&gSlider5Ref);
  gRedColour.red = 2 * GetControlValue(gSlider5Ref);
  GetDialogItemAsControl(dialogRef,iSlider6,&gSlider6Ref);
  gBlueColour.blue = 2 * GetControlValue(gSlider5Ref);

  // .................................. set help tags, show dialog, and enter ModalDialog loop

  if(gRunningOnX)
    helpTagsSliders(dialogRef);

  ShowWindow(GetDialogWindow(dialogRef));

  do
  {
    ModalDialog(eventFilterUPP,&itemHit);
  } while(itemHit != kStdOkItemIndex);

  // ................................................................................ clean up

  DisposeDialog(dialogRef);
  DisposeModalFilterUPP(eventFilterUPP);
  DisposeControlActionUPP(gSliderActionFunction1UPP);
  DisposeControlActionUPP(gSliderActionFunction2UPP);
  DisposeControlUserPaneDrawUPP(gUserPaneDrawFunctionUPP);
  DisposeControlUserPaneActivateUPP(gUserPaneActivateFunctionUPP);
  gSlidersActive = false;
}

// ************************************************************************ doDrawSliderValues

void  doDrawSliderValues(DialogRef dialogRef,ControlRef controlRef)
{
  Str255  theString;
  SInt16  staticTextItem;

  NumToString((SInt32) GetControlValue(controlRef),theString);

  if(controlRef == gSlider1Ref)
    staticTextItem = iSlider1StaticText;
  else if(controlRef == gSlider2Ref)
    staticTextItem = iSlider2StaticText;
  else if(controlRef == gSlider3Ref)
    staticTextItem = iSlider3StaticText;
  else if(controlRef == gSlider4Ref)
    staticTextItem = iSlider4StaticText;

  GetDialogItemAsControl(dialogRef,staticTextItem,&controlRef);
  SetControlData(controlRef,kControlEntireControl,kControlStaticTextTextTag,theString[0],
                 &theString[1]);
  Draw1Control(controlRef);
}

// ********************************************************************** userPaneDrawFunction

void  userPaneDrawFunction(ControlRef theControl,SInt16 thePart)
{
  Rect theRect;

  SetRect(&theRect,218,175,238,195);
  DrawThemePlacard(&theRect,gDrawActivated);
  InsetRect(&theRect,2,2);

  if(gDrawActivated)
  {
    RGBForeColor(&gRedColour);
    PaintRect(&theRect);
  }

  SetRect(&theRect,218,196,238,216);
  DrawThemePlacard(&theRect,gDrawActivated);
  InsetRect(&theRect,2,2);

  if(gDrawActivated)
  {
    RGBForeColor(&gBlueColour);
    PaintRect(&theRect);
  }

 }

// ****************************************************************** userPaneActivateFunction

void  userPaneActivateFunction(ControlRef control,Boolean activating)
{
  if(activating)
    gDrawActivated = true;
  else
    gDrawActivated = false;
}

// *************************************************************************** helpTagsSliders

void  helpTagsSliders(DialogRef dialogRef)
{
  HMHelpContentRec helpContent;
  SInt16           a;
  static SInt16    itemNumber[7] = { 2,3,4,5,17,19,18 };
  ControlRef       controlRef;

  memset(&helpContent,0,sizeof(helpContent));
  HMSetTagDelay(500);
  HMSetHelpTagsDisplayed(true);

  helpContent.version = kMacHelpVersion;
  helpContent.tagSide = kHMOutsideTopCenterAligned;
  helpContent.content[kHMMinimumContentIndex].contentType = kHMStringResContent;
  helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmResID = 135;

  for(a = 1;a <= 7; a++)
  {
    helpContent.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = a;
    GetDialogItemAsControl(dialogRef,itemNumber[a - 1],&controlRef);
    HMSetControlHelpContent(controlRef,&helpContent);
  }
}

// *******************************************************************************************
// TextBox.c
//********************************************************************************************

// .................................................................................. includes

#include "Controls3.h"

// ********************************************************************************* doTextBox

void  doTextBox(void)
{
  DialogRef      dialogRef;
  ModalFilterUPP eventFilterUPP;
  SInt16         itemHit;

  if(FrontNonFloatingWindow())
    doActivateWindow(FrontNonFloatingWindow(),false);

  if(!(dialogRef = GetNewDialog(rAboutDialog,NULL,(WindowRef) -1)))
    ExitToShell();

  // ...................................................................... set default button

  SetDialogDefaultItem(dialogRef,kStdOkItemIndex);
  
  // ..................................... create universal procedure pointer for event filter

  eventFilterUPP = NewModalFilterUPP((ModalFilterProcPtr) eventFilter);

  // ................................................. show dialog and enter modal dialog loop

  ShowWindow(GetDialogWindow(dialogRef));

  do
  {
    ModalDialog(eventFilterUPP,&itemHit);
  } while(itemHit != kStdOkItemIndex);

  DisposeDialog(dialogRef);
  DisposeModalFilterUPP(eventFilterUPP);
}

// *******************************************************************************************
// Callbacks.c
//********************************************************************************************

// .................................................................................. includes

#include "Controls3.h"

// .......................................................................... global variables

extern Boolean          gGroupArrowsProgressActive;
extern Boolean          gSlidersActive;
extern ControlActionUPP gArrowsActionFunctionUPP;
extern ControlActionUPP gSliderActionFunction1UPP;
extern ControlActionUPP gSliderActionFunction2UPP;
extern ControlRef       gLittleArrowsControlRef;
extern ControlRef       gCacheSizeControlRef;
extern ControlRef       gSlider1Ref;
extern ControlRef       gSlider2Ref;
extern ControlRef       gSlider3Ref;
extern ControlRef       gSlider4Ref;
extern ControlRef       gSlider5Ref;
extern ControlRef       gSlider6Ref;
extern RGBColor         gRedColour;
extern RGBColor         gBlueColour;
extern RGBColor         gBlackColour;

// ******************************************************************************* eventFilter

Boolean  eventFilter(DialogRef dialogRef,EventRecord *eventStrucPtr,SInt16 *itemHit)
{
  Boolean    handledEvent;
  GrafPtr    oldPort;
  Point      mouseXY;
  ControlRef controlRef;

  handledEvent = false;

  if((eventStrucPtr->what == updateEvt) && 
     ((WindowRef) eventStrucPtr->message != GetDialogWindow(dialogRef)))
  {
    doUpdate(eventStrucPtr);
  }
  else if((eventStrucPtr->what == autoKey) && ((eventStrucPtr->modifiers & cmdKey) != 0))
  {
    handledEvent = true;
    return handledEvent;
  }
  else
  {
    GetPort(&oldPort);
    SetPortDialogPort(dialogRef);

    if(gGroupArrowsProgressActive)
    {
      if(eventStrucPtr->what == mouseDown)
      {
        mouseXY = eventStrucPtr->where;
        GlobalToLocal(&mouseXY);
        if(FindControl(mouseXY,GetDialogWindow(dialogRef),&controlRef))
        {
          if(controlRef == gLittleArrowsControlRef)
          {
            TrackControl(controlRef,mouseXY,gArrowsActionFunctionUPP);
            handledEvent = true;
          }
        }
      }
    }
    else if(gSlidersActive)
    {
      if(eventStrucPtr->what == mouseDown)
      {
        mouseXY = eventStrucPtr->where;
        GlobalToLocal(&mouseXY);
        if(FindControl(mouseXY,GetDialogWindow(dialogRef),&controlRef))
        {
          if(controlRef == gSlider1Ref || controlRef == gSlider2Ref)
          {
            TrackControl(controlRef,mouseXY,NULL);
            doDrawSliderValues(dialogRef,controlRef);
            handledEvent = true;
          }
          else if(controlRef == gSlider3Ref || controlRef == gSlider4Ref)
          {
            TrackControl(controlRef,mouseXY,gSliderActionFunction1UPP);
            handledEvent = true;
          }
          else if(controlRef == gSlider5Ref || controlRef == gSlider6Ref)
          {
            TrackControl(controlRef,mouseXY,gSliderActionFunction2UPP);
            handledEvent = true;
          }
        }
      }
    }
    else
    {
      handledEve