[comp.sys.mac.programmer] Programming problem

tarr-michael@CS.Yale.EDU (michael tarr) (07/09/90)

**************************************************************************

Help! I am trying to get a window to the screen with scroll bars in
Think C 4.0!!!  I call InitMessageWindow and it inits fine, but then
sometime soon after I call dPrompt the system freezes up completely.
What am I doing wrong?

Thanks in advance.

Mike Tarr
tarr@cs.yale.edu
**************************************************************************

/**** InitMessageWindow ****/
void InitMessageWindow(void)
{
    Rect messageRect;
    char titleStr[20];
    
    SetRect( &messageRect,
        screenBits.bounds.left + 2, screenBits.bounds.top + MBarHeight * 2,
        screenBits.bounds.right - 3, screenBits.bounds.bottom - 3 );

    strcpy(titleStr, "macExp Version ");
    strcat(titleStr, PtoCstr(gVersion));
    CtoPstr(gVersion);
    CtoPstr(titleStr);
    gMessageWindow = NewWindow( NIL_POINTER, &messageRect,
        titleStr, VISIBLE, documentProc, MOVE_TO_FRONT, NO_GO_AWAY,
        NIL_REF_CON );
    
    SetPort( gMessageWindow );
    InitMessageScrollBar();
    gCurrRow = 0;
    gMaxRow = messageRect.bottom - messageRect.top - ROWHEIGHT;
}

#define SCROLL_BAR_PIXELS    16
#define START_VALUE            1
#define MIN_VALUE            1
#define MAX_VALUE            100

/*** InitMessageScrollBar ***/
static void InitMessageScrollBar(void)
{
    Rect vScrollRect;
    
    vScrollRect = gMessageWindow->portRect;
    vScrollRect.top -= 1;
    vScrollRect.bottom += 1;
    vScrollRect.left = vScrollRect.right - SCROLL_BAR_PIXELS + 1;
    vScrollRect.right += 1;
    gMessageScrollBarHandle = NewControl( gMessageWindow, &vScrollRect, NIL_TITLE,
                        VISIBLE, START_VALUE, MIN_VALUE, MAX_VALUE, scrollBarProc,
                        NIL_REF_CON );
}

#define OK_BUTTON            1

#define DITL_ID                500
#define THE_PROMPT            2
#define THE_RESPONSE        3

#define STRT_SEL            0
#define END_SEL                32767

/**** dPrompt ****/

char* dPrompt(prompt, defaultReply)
char* prompt;
char* defaultReply;
{

    Handle        itemList, itemHandle;
    DialogPtr    codeDialog;
    GrafPtr     oldPort;
    Rect        boundsRect, itemRect;
    Boolean        dialogDone = FALSE;
    int            itemType, itemHit;
    char        tempString[255];
    
    if ( (itemList = GetResource( 'DITL', DITL_ID )) == NIL_POINTER ) {
        ErrorHandler("dPrompt", "Couldn't find DITL", (char*) NIL_POINTER);
        FatalError();
    }
    
    SetRect(&boundsRect, (screenBits.bounds.right / 2) - 200,
                        (screenBits.bounds.bottom / 2) - 80,
                        (screenBits.bounds.right / 2) + 200,
                        (screenBits.bounds.bottom / 2) + 80);

    codeDialog = NewDialog( NIL_POINTER, &boundsRect, NIL_TITLE, TRUE,
                dBoxProc, MOVE_TO_FRONT, NO_GO_AWAY, NIL_REF_CON, itemList );
    
    ShowCursor();

    GetDItem( codeDialog, OK_BUTTON, &itemType, &itemHandle, &itemRect );
    GetPort( &oldPort );
    SetPort( codeDialog );
    PenSize(3, 3);
    InsetRect( &itemRect, -4, -4 );
    FrameRoundRect( &itemRect, 16, 16 );
    PenSize(1, 1);
    SetPort( oldPort );

    GetDItem( codeDialog, THE_PROMPT, &itemType, &itemHandle, &itemRect );
    SetIText( itemHandle, CtoPstr(prompt) );
    PtoCstr(prompt);
    
    GetDItem( codeDialog, THE_RESPONSE, &itemType, &itemHandle, &itemRect );
    SetIText( itemHandle, CtoPstr(defaultReply) );
    PtoCstr(defaultReply);

    SelIText( codeDialog, THE_RESPONSE, STRT_SEL, END_SEL );

    while ( !dialogDone )
    {
        ModalDialog( NIL_POINTER, &itemHit );
        switch ( itemHit )
        {
            case OK_BUTTON:
            
                GetDItem( codeDialog, THE_RESPONSE, &itemType, &itemHandle, &itemRect );
                GetIText( itemHandle, &tempString );
                PtoCstr(tempString);
                dialogDone = TRUE;
                break;
        }
    }

    DisposDialog( codeDialog );
    ReleaseResource( itemList );

    HideCursor();
    DrawClearScreen();
    
    return(tempString);
}