From: Unknown (JL) <nobody@localhost> Date: Thu, 18 Nov 1999 23:10:31 +0000 (+0000) Subject: Used when the Apparence Manager is not installed X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/72582399ed717e47bf5dbc7f334dcc0887b4cb99 Used when the Apparence Manager is not installed git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4617 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/mac/aga.cpp b/src/mac/aga.cpp new file mode 100644 index 0000000000..40abb5cbb9 --- /dev/null +++ b/src/mac/aga.cpp @@ -0,0 +1,2581 @@ +#include <wx/mac/uma.h> +#include <wx/mac/aga.h> +#include <extcdef.h> +#include <PictUtils.h> + +pascal SInt32 AGAProgressBarDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param); +pascal SInt32 AGAPlacardDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param); +pascal SInt32 AGAStaticTextDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) ; +pascal SInt32 AGAListControlDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) ; +pascal SInt32 AGAEditTextDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) ; +pascal SInt32 AGAStaticGroupBoxTextDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) ; + +#define B 13 +#define W 0 + +SInt16 kAGARootControlProcID ; +int gAGABackgroundColor = 0 ; + +const RGBColor gAGAColorArray[] = { {0xFFFF, 0xFFFF, 0xFFFF}, // W + {0xEEEE, 0xEEEE, 0xEEEE}, // 1 + {0xDDDD, 0xDDDD, 0xDDDD}, // 2 + {0xCCCC, 0xCCCC, 0xCCCC}, // 3 + {0xBBBB, 0xBBBB, 0xBBBB}, // 4 + {0xAAAA, 0xAAAA, 0xAAAA}, // 5 + {0x9999, 0x9999, 0x9999}, // 6 + {0x8888, 0x8888, 0x8888}, // 7 + {0x7777, 0x7777, 0x7777}, // 8 + {0x6666, 0x6666, 0x6666}, // 9 + {0x5555, 0x5555, 0x5555}, // 10 + {0x4444, 0x4444, 0x4444}, // 11 + {0x2222, 0x2222, 0x2222}, // 12 + {0x0000, 0x0000, 0x0000} // B + }; + +char LAGADefaultOutline_mCorners[4][5][5] = { + // topleft + { + { -1, -1, -1, 12, B }, + { -1, -1, B, 2, 2 }, + { -1, B, 2, 2, 5 }, + { 12, 2, 2, 2, 8 }, + { B, 2, 5, 8, -1 } + }, + // topright + { + { B, 12, -1, -1, -1 }, + { 2, 3, B, -1, -1 }, + { 5, 5, 4, B, -1 }, + { 8, 5, 5, 7, 12 }, + { -1, 8, 5, 8, B } + }, + // bottomleft + { + { B, 2, 5, 8, -1 }, + { 12, 3, 5, 5, 8 }, + { -1, B, 4, 5, 5 }, + { -1, -1, B, 7, 8 }, + { -1, -1, -1, 12, B } + }, + // bottomright + { + { -1, 8, 5, 8, B }, + { 8, 5, 7, 8, 12 }, + { 5, 7, 8, B, -1 }, + { 8, 8, B, -1, -1 }, + { B, 12, -1, -1, -1 } + } + }; + +char LAGAPushButton_mCorners[3][4][4][4] = { + // Enabled + { + // topleft + { + { -1, -1, 12, B }, + { -1, B, 4, 2 }, + { 12, 4, W, W }, + { B, 2, W, W } + }, + // topright + { + { B, 12, -1, -1 }, + { 2, 4, B, -1 }, + { W, 2, 5, 12 }, + { 2, 5, 8, B } + }, + // bottomleft + { + { B, 2, W, 2 }, + { 12, 4, 2, 5 }, + { -1, B, 4, 8 }, + { -1, -1, 12, B } + }, + // bottomright + { + { 5, 5, 8, B }, + { 5, 8, 8, 12 }, + { 8, 8, B, -1 }, + { B, 12, -1, -1 } + } + }, + // Pressed + { + // topleft + { + { -1, -1, 12, B }, + { -1, B, 10, 8 }, + { 12, 10, 8, 4 }, + { B, 8, 4, 4 } + }, + // topright + { + { B, 12, -1, -1 }, + { 8, 10, B, -1 }, + { 4, 4, 8, 12 }, + { 4, 4, 4, B } + }, + // bottomleft + { + { B, 8, 4, 4 }, + { 12, 10, 4, 4 }, + { -1, B, 10, 4 }, + { -1, -1, 12, B } + }, + // bottomright + { + { 4, 4, 4, B }, + { 4, 4, 10, 12 }, + { 4, 10, B, -1 }, + { B, 12, -1, -1 } + } + }, + // Disabled + { + // topleft + { + { -1, -1, 7, 7 }, + { -1, 7, 4, 2 }, + { 7, 4, 1, 1 }, + { 7, 2, 1, 1 } + }, + // topright + { + { 7, 7, -1, -1 }, + { 2, 4, 7, -1 }, + { 1, 2, 4, 7 }, + { 2, 4, 5, 7 } + }, + // bottomleft + { + { 7, 2, 1, 2 }, + { 7, 4, 2, 4 }, + { -1, 7, 4, 5 }, + { -1, -1, 7, 7 } + }, + // bottomright + { + { 4, 4, 5, 7 }, + { 4, 5, 5, 7 }, + { 5, 5, 7, -1 }, + { 7, 7, -1, -1 } + } + } + }; + +RGBColor gAGARamp[] = +{ + /* black */ + { 0 , 0 , 0 } , + /* white */ + { 65535 , 65535 , 65535 } , + /* 1 */ + { 61166 , 61166 , 61166 } , + /* 2 */ + { 56797 , 56797 , 56797 } , + /* 3 */ + { 52428 , 52428 , 52428 } , + /* 4 */ + { 48059 , 48059 , 48059 } , + /* 5 */ + { 43690 , 43690 , 43690 } , + /* 6 */ + { 39321 , 39321 , 39321 } , + /* 7 */ + { 34952 , 34952 , 34952 } , + /* 8 */ + { 30583 , 30583 , 30583 } , + /* 9 */ + { 26214 , 26214 , 26214 } , + /* 10 */ + { 21845 , 21845 , 21845 } , + /* 11 */ + { 17476 , 17476 , 17476 } , + /* 12 */ + { 13107 , 13107 , 13107 } , + /* A1 */ + { 8738 , 8738 , 8738 } , + /* A2 */ + { 4369 , 4369 , 4369 } , + +} ; + +RGBColor gAGABlueRamp[] = +{ + /* black */ + { 0 , 0 , 0 } , + /* white */ + { 65535 , 65535 , 65535 } , + /* 1 */ + { 61166 , 61166 , 65535 } , + /* 2 */ + { 56797 , 56797 , 65535 } , + /* 3 */ + { 52428 , 52428 , 65535 } , + /* 4 */ + { 48059 , 48059 , 65535 } , + /* 5 */ + { 43690 , 43690 , 65535 } , + /* 6 */ + { 39321 , 39321 , 65535 } , + /* 7 */ + { 34952 , 34952 , 65535 } , + /* 8 */ + { 30583 , 30583 , 65535 } , + /* 9 */ + { 26214 , 26214 , 65535 } , + /* 10 */ + { 21845 , 21845 , 65535 } , + /* 11 */ + { 17476 , 17476 , 65535 } , + /* 12 */ + { 13107 , 13107 , 65535 } , + /* A1 */ + { 8738 , 8738 , 65535 } , + /* A2 */ + { 4369 , 4369 , 65535 } , + +} ; + +enum eAGARampColor { + kAGATransparent = -1 , + kAGABlack = 0 , + kAGAWhite = 1 , + kAGA1 = 2 , + kAGA2 = 3 , + kAGA3 = 4 , + kAGA4 = 5 , + kAGA5 = 6 , + kAGA6 = 7 , + kAGA7 = 8 , + kAGA8 = 9 , + kAGA9 = 10 , + kAGA10 = 11 , + kAGA11 = 12 , + kAGA12 = 13 , + kAGAA1 = 14 , + kAGAA2 = 15 , +} ; +// defprocs + +enum eAGAState { + kAGAStateEnabled = 0 , + kAGAStatePressed = 1 , + kAGAStateDisabled = 2 , + kAGAStateInactive = 3 +} ; + +/* +typedef struct sControlData +{ + ControlPartCode m_part ; + ResType m_tag ; + Size m_size ; +} ; + +OSErr AGAFindControlData( ControlHandle inControl , ControlPartCode inPart , ResType inTagName , long *outOffset) ; +OSErr AGAFindControlData( ControlHandle inControl , ControlPartCode inPart , ResType inTagName , long *outOffset) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + long offset = 0 ; + long size = GetHandleSize( info->data ) ; + char* data = *(info->data) ; + sControlData* current ; + while( offset + sizeof( sControlData ) <= size ) + { + current = (sControlData*) (data+offset ) ; + if ( ( inPart == kControlEntireControl || inPart == current->m_part ) && inTagName == current->m_tag ) + { + *outOffset = offset ; + return noErr ; + } + } + return errDataNotSupported ; // nothing found +} + +OSErr AGARemoveControlData( ControlHandle inControl , ControlPartCode inPart , ResType inTagName ) ; +OSErr AGARemoveControlData( ControlHandle inControl , ControlPartCode inPart , ResType inTagName ) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + long offset = 0 ; + long size = GetHandleSize( info->data ) ; + char* data = *(info->data) ; + sControlData* current ; + while( offset + sizeof( sControlData ) <= size ) + { + current = (sControlData*) (data+offset ) ; + if ( ( inPart == kControlEntireControl || inPart == current->m_part ) && inTagName == current->m_tag ) + { + long chunkSize = current->m_size + sizeof ( sControlData ) ; + memcpy( data + offset , data + offset + chunkSize , size - offset - chunkSize ) ; + SetHandleSize( info->data , size - chunkSize ) ; + return noErr ; + } + } + return noErr ; +} + +OSErr AGAAddControlData( ControlHandle inControl , ControlPartCode inPart , ResType inTagName , Size inSize, Ptr inData) ; +OSErr AGAAddControlData( ControlHandle inControl , ControlPartCode inPart , ResType inTagName , Size inSize, Ptr inData) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + long offset = 0 ; + long size = GetHandleSize( info->data ) ; + SetHandleSize( info->data , size + sizeof( sControlData ) + inSize ) ; + if ( MemError() == noErr ) + { + char* data = *(info->data) ; + sControlData* current = (sControlData*)( data + size ) ; + current->m_tag = inTagName ; + current->m_part = inPart ; + current->m_size = inSize ; + memcpy( data + size + sizeof( sControlData ) , inData , inSize ) ; + return noErr ; + } + return errDataNotSupported ; +} + + +OSErr AGAGetControlDataSize (ControlHandle inControl, + ControlPartCode inPart, + ResType inTagName, + Size * outMaxSize) +{ + long offset ; + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + char* data = *(info->data) ; + + OSErr err = AGAFindControlData( inControl , inPart , inTagName , &offset ) ; + if ( !err ) + { + sControlData* current = (sControlData*) (data+offset ) ; + *outMaxSize = current->m_size ; + } + return err ; +} + +OSErr AGAGetControlData (ControlHandle inControl, + ControlPartCode inPart, + ResType inTagName, + Size inBufferSize, + Ptr outBuffer, + Size * outActualSize) +{ + long offset ; + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + char* data = *(info->data) ; + + OSErr err = AGAFindControlData( inControl , inPart , inTagName , &offset ) ; + if ( !err ) + { + sControlData* current = (sControlData*) (data+offset ) ; + *outActualSize = current->m_size ; + if ( outBuffer ) + { + if ( inBufferSize <= current->m_size ) + memcpy( outBuffer , data + offset + sizeof( sControlData ) , current->m_size ) ; + else + err = errDataNotSupported ; + } + } + return err ; +} + +OSErr AGASetControlData (ControlHandle inControl, + ControlPartCode inPart, + ResType inTagName, + Size inSize, + Ptr inData) +{ + long offset ; + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + char* data = *(info->data) ; + + OSErr err = AGAFindControlData( inControl , inPart , inTagName , &offset ) ; + if ( !err ) + { + sControlData* current = (sControlData*) (data+offset ) ; + if ( current->m_size == inSize ) + { + memcpy( data + offset + sizeof( sControlData ) , inData , inSize) ; + } + else + { + AGARemoveControlData( inControl , inPart , inTagName ) ; + AGAAddControlData( inControl , inPart , inTagName , inSize , inData ) ; + } + } + else + { + AGAAddControlData( inControl , inPart , inTagName , inSize , inData ) ; + } + return err ; +} +*/ + +OSErr AGASetControlFontStyle (ControlHandle inControl, + const ControlFontStyleRec * inStyle) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + if ( inStyle->flags == 0 ) + { + // back to defaults + } + else + { + if ( inStyle->flags & kControlUseFontMask ) + { + info->fontStyle.font = inStyle->font ; + } + if ( inStyle->flags & kControlUseSizeMask ) + { + info->fontStyle.size = inStyle->size ; + } + if ( inStyle->flags & kControlUseFaceMask ) + { + info->fontStyle.style = inStyle->style ; + } + if ( inStyle->flags & kControlUseModeMask ) + { + info->fontStyle.mode = inStyle->mode ; + } + if ( inStyle->flags & kControlUseJustMask ) + { + info->fontStyle.just = inStyle->just ; + } + if ( inStyle->flags & kControlUseForeColorMask ) + { + info->fontStyle.foreColor = inStyle->foreColor ; + } + if ( inStyle->flags & kControlUseBackColorMask ) + { + info->fontStyle.backColor = inStyle->backColor ; + } + } + return noErr ; +} + +OSErr AGASetControlData (ControlHandle inControl, + ControlPartCode inPart, + ResType inTagName, + Size inSize, + Ptr inData) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + ControlDataAccessRec rec ; + + rec.tag = inTagName ; + rec.part = inPart ; + rec.size = inSize ; + rec.dataPtr = inData ; + + return info->defProc( info->procID , inControl , kControlMsgSetData , (long) &rec ) ; +} + +SInt16 AGAHandleControlKey (ControlHandle inControl, + SInt16 inKeyCode, + SInt16 inCharCode, + SInt16 inModifiers) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + ControlKeyDownRec rec ; + + rec.modifiers = inModifiers ; + rec.keyCode = inKeyCode ; + rec.charCode = inCharCode ; + + return info->defProc( info->procID , inControl , kControlMsgKeyDown , (long) &rec ) ; +} + +ControlPartCode AGAHandleControlClick (ControlHandle inControl, + Point inWhere, + SInt16 inModifiers, + ControlActionUPP inAction) +{ + return TrackControl( inControl , inWhere , inAction ) ; +} + +Boolean AGATestForNewControl( ControlHandle inControl ) +{ + if ( (**inControl).contrlRfCon > 0x100 && !( (**inControl).contrlRfCon % 2 ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + return info->magic == kExtCDEFMagic ; + } + return FALSE ; +} +void AGAIdleControls (WindowPtr inWindow) +{ + ControlHandle iter = (ControlHandle) ((WindowPeek)inWindow)->controlList ; + while ( iter ) + { + if ( AGATestForNewControl( iter ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**iter).contrlRfCon ; + if ( info->defProc( info->procID , iter , kControlMsgTestNewMsgSupport , 0 ) == kControlSupportsNewMessages ) + { + if ( info->defProc( info->procID , iter , kControlMsgGetFeatures , 0 ) & kControlWantsIdle ) + { + info->defProc( info->procID , iter , kControlMsgIdle , 0 ) ; + } + } + } + + iter = (**iter).nextControl ; + } +} + +void AGAUpdateOneControl( ControlHandle control , RgnHandle inRgn ) +{ + DrawOneControl( control ) ; + ControlHandle iter = (ControlHandle) ((WindowPeek)(**control).contrlOwner)->controlList ; + while ( iter ) + { + if ( AGATestForNewControl( iter ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**iter).contrlRfCon ; + if ( info->containerControl == control ) + { + AGAUpdateOneControl( iter , inRgn ) ; + } + } + + iter = (**iter).nextControl ; + } +} + +void AGAUpdateControls( WindowPtr inWindow , RgnHandle inRgn ) +{ + ControlHandle root ; + AGAGetRootControl( inWindow , &root ) ; + AGAUpdateOneControl( root , inRgn ) ; + + // and then all others + + ControlHandle iter = (ControlHandle) ((WindowPeek)inWindow)->controlList ; + while ( iter ) + { + if ( AGATestForNewControl( iter ) ) + { + } + else + { + DrawOneControl( iter ) ; + } + + iter = (**iter).nextControl ; + } +} + +OSErr AGAGetRootControl( WindowPtr inWindow , ControlHandle *outControl ) +{ + ControlHandle iter = (ControlHandle) ((WindowPeek)inWindow)->controlList ; + while ( iter ) + { + if ( AGATestForNewControl( iter ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**iter).contrlRfCon ; + if ( info->procID == kAGARootControlProcID ) + { + *outControl = iter ; + return noErr ; + } + } + + iter = (**iter).nextControl ; + } + return -1 ; +} + +void AGADeactivateControl( ControlHandle inControl ) +{ + if ( AGATestForNewControl( inControl ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + if ( info->defProc( info->procID , inControl , kControlMsgTestNewMsgSupport , 0 ) == kControlSupportsNewMessages ) + { + if ( info->defProc( info->procID , inControl , kControlMsgGetFeatures , 0 ) & kControlWantsActivate ) + { + info->defProc( info->procID , inControl , kControlMsgActivate , 0 ) ; + } + } + } +} + +void AGAActivateControl( ControlHandle inControl ) +{ + if ( AGATestForNewControl( inControl ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + if ( info->defProc( info->procID , inControl , kControlMsgTestNewMsgSupport , 0 ) == kControlSupportsNewMessages ) + { + if ( info->defProc( info->procID , inControl , kControlMsgGetFeatures , 0 ) & kControlWantsActivate ) + { + info->defProc( info->procID , inControl , kControlMsgActivate , 1 ) ; + } + } + } +} + +OSErr AGASetKeyboardFocus (WindowPtr inWindow, + ControlHandle inControl, + ControlFocusPart inPart) +{ + if ( AGATestForNewControl( inControl ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + if ( info->defProc( info->procID , inControl , kControlMsgTestNewMsgSupport , 0 ) == kControlSupportsNewMessages ) + { + if ( info->defProc( info->procID , inControl , kControlMsgGetFeatures , 0 ) & kControlSupportsFocus ) + { + return info->defProc( info->procID , inControl , kControlMsgFocus , inPart ) ; + } + } + } + return errControlDoesntSupportFocus ; +} + +OSErr AGAGetBestControlRect (ControlHandle inControl, + Rect * outRect, + SInt16 * outBaseLineOffset) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + ControlCalcSizeRec rec ; + rec.width = (**inControl).contrlRect.right - (**inControl).contrlRect.left ; + rec.height = (**inControl).contrlRect.bottom - (**inControl).contrlRect.top ; + rec.baseLine = 0; + + OSErr err = info->defProc( info->procID , inControl , kControlMsgCalcBestRect , (long) &rec ) ; + if ( !err ) + { + outRect->left = outRect->top = 0 ; + outRect->right = rec. width ; + outRect->bottom = rec. height ; + *outBaseLineOffset = rec. baseLine ; + } + return err ; +} + + +OSErr AGAGetControlData (ControlHandle inControl, + ControlPartCode inPart, + ResType inTagName, + Size inBufferSize, + Ptr outBuffer, + Size * outActualSize) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + ControlDataAccessRec rec ; + + rec.tag = inTagName ; + rec.part = inPart ; + rec.size = inBufferSize ; + rec.dataPtr = outBuffer ; + + OSErr err = info->defProc( info->procID , inControl , kControlMsgGetData , (long) &rec ) ; + *outActualSize = rec.size ; + return err ; +} + +OSErr AGAGetControlDataSize (ControlHandle inControl, + ControlPartCode inPart, + ResType inTagName, + Size * outMaxSize) +{ + return AGAGetControlData( inControl , inPart , inTagName , 0 , NULL , outMaxSize ) ; +} + + +void NewExtCDEFInfo( ControlHandle theControl , ControlDefProcPtr defproc , SInt16 procID , long refcon ) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) malloc( sizeof( ExtCDEFInfo ) ) ; + info->defProc = defproc ; + info->hasFocus = false ; + info->magic = kExtCDEFMagic ; + info->contrlRfCon = refcon ; + info->procID = procID ; + info->containerControl = NULL ; + info->children = NewHandle(0) ; + info->fontStyle.flags = 0 ; + info->fontStyle.font = 0 ; + info->fontStyle.size = 12 ; + info->fontStyle.style = 0 ; + info->fontStyle.mode = 0 ; + info->fontStyle.just = 0 ; + info->fontStyle.foreColor = gAGARamp[ kAGABlack ] ; + info->fontStyle.backColor = gAGARamp[ kAGA2 ] ; + (**theControl).contrlRfCon = (long) info ; + defproc( info->procID, theControl, initCntl, 0) ; +} + +void DisposeExtCDEFInfo( ControlHandle theControl) +{ + if ( AGATestForNewControl( theControl ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + if ( info ) + { + DisposeHandle( info->children ) ; + info->children = NULL ; + free( (void*) (**theControl).contrlRfCon ) ; + } + } +} + +const short kAGAProgressHeight = 14 ; + +void AGADrawRectPlacard( const Rect *inRect , eAGAState inState , bool fill = false ) ; +void AGADrawRectProgress( const Rect *inRect , eAGAState inState , double percentage ) ; + +void AGADrawRectPlacard( const Rect *inRect , eAGAState inState , bool fill ) +{ + Rect rect = *inRect ; + RGBColor pixelColor ; + if ( inState == kAGAStateInactive ) + { + RGBForeColor( &gAGARamp[ kAGA10 ] ) ; + FrameRect( &rect ) ; + if ( fill ) + { + InsetRect( &rect , 1 , 1 ) ; + RGBForeColor( &gAGARamp[ kAGA1 ] ) ; + PaintRect( &rect ) ; + } + return ; + } + + RGBForeColor( &gAGARamp[ kAGABlack ] ) ; + FrameRect( &rect ) ; + InsetRect( &rect , 1 , 1 ) ; + + if ( inState == kAGAStateEnabled || inState == kAGAStateDisabled ) + RGBForeColor( &gAGARamp[ kAGAWhite ] ) ; + else + RGBForeColor( &gAGARamp[ kAGABlack ] ) ; + + MoveTo( rect.left , rect.bottom - 1 -1 ) ; + LineTo( rect.left , rect.top ) ; + LineTo( rect.right-1-1 , rect.top ) ; + + if ( inState == kAGAStateEnabled || inState == kAGAStateDisabled ) + pixelColor = gAGARamp[ kAGA2 ] ; + else + pixelColor = gAGARamp[ kAGA8 ] ; + + SetCPixel( rect.right-1 , rect.top , &pixelColor ) ; + SetCPixel( rect.left , rect.bottom-1 , &pixelColor ) ; + + if ( inState == kAGAStateEnabled ) + RGBForeColor( &gAGARamp[ kAGA5 ] ) ; + else if ( inState == kAGAStateDisabled ) + RGBForeColor( &gAGARamp[ kAGA4 ] ) ; + else + RGBForeColor( &gAGARamp[ kAGA6 ] ) ; + + MoveTo( rect.left + 1 , rect.bottom-1 ) ; + LineTo( rect.right-1 , rect.bottom-1 ) ; + LineTo( rect.right-1 , rect.top-1 ) ; + + if ( fill ) + { + InsetRect( &rect , 1 , 1 ) ; + if ( inState == kAGAStateEnabled || inState == kAGAStateDisabled ) + RGBForeColor( &gAGARamp[ kAGA2 ] ) ; + else + RGBForeColor( &gAGARamp[ kAGA8 ] ) ; + PaintRect( &rect ) ; + } +} + +void AGADrawRectProgress( const Rect *inRect , eAGAState inState , double percentage ) +{ + Rect rect = *inRect ; + rect.bottom = rect.top + 14 ; + RGBColor pixelColor ; + + RGBForeColor( &gAGARamp[ kAGA5 ]) ; + MoveTo( rect.left , rect.bottom - 1 -1 ) ; + LineTo( rect.left , rect.top ) ; + LineTo( rect.right-1-1 , rect.top ) ; + + RGBForeColor( &gAGARamp[ kAGAWhite ] ) ; + MoveTo( rect.left + 1 , rect.bottom -1 ) ; + LineTo( rect.right-1 , rect.bottom -1 ) ; + LineTo( rect.right-1 , rect.top-1 ) ; + + InsetRect( &rect , 1 , 1 ) ; + RGBForeColor( &gAGARamp[ kAGABlack ] ) ; + + Rect barLeft = rect , barRight = rect ; + + int position = percentage * ( rect.right - rect.left ) ; + barLeft.right = barLeft.left + position ; + barRight.left = barLeft.left + position ; + FrameRect( &barLeft ) ; + FrameRect( &barRight ) ; + + InsetRect( &barLeft , 1 , 1 ) ; + + InsetRect( &barRight , 1 , 1 ) ; + + if ( !EmptyRect( &barRight ) ) + { + RGBForeColor( &gAGARamp[ kAGA10 ] ) ; + MoveTo( barRight.left , barRight.bottom -1 ) ; + LineTo( barRight.left , barRight.top ) ; + barRight.left += 1 ; + if ( !EmptyRect( &barRight ) ) + { + RGBForeColor( &gAGARamp[ kAGA7 ] ) ; + MoveTo( barRight.left , barRight.bottom-1 ) ; + LineTo( barRight.left , barRight.top ) ; + LineTo( barRight.right-1-1 , barRight.top ) ; + RGBForeColor( &gAGARamp[ kAGA2 ] ) ; + MoveTo( barRight.left + 1 , barRight.bottom -1 ) ; + LineTo( barRight.right-1 , barRight.bottom -1 ) ; + LineTo( barRight.right-1 , barRight.top - 1) ; + pixelColor = gAGARamp[ kAGA4 ] ; + SetCPixel( barRight.right-1 , barRight.top , &pixelColor ) ; + InsetRect( &barRight , 1 , 1) ; + if ( !EmptyRect( &barRight ) ) + { + RGBForeColor( &gAGARamp[ kAGA4 ] ) ; + PaintRect( &barRight ) ; + } + } + if ( !EmptyRect( &barLeft ) ) + { + RGBForeColor( &gAGABlueRamp[ kAGA8 ] ) ; + MoveTo( barLeft.left , barLeft.bottom -1 ) ; + LineTo( barLeft.left , barLeft.top ) ; + LineTo( barLeft.left+1 , barLeft.top ) ; + RGBForeColor( &gAGABlueRamp[ kAGA12 ] ) ; + MoveTo( barLeft.left + 2, barLeft.bottom-1 ) ; + LineTo( barLeft.right-1 , barLeft.bottom-1 ) ; + LineTo( barLeft.right-1 , barLeft.top -1 ) ; + RGBForeColor( &gAGABlueRamp[ kAGA10 ] ) ; + MoveTo( barLeft.left + 2, barLeft.top ) ; + LineTo( barLeft.right-1 , barLeft.top ) ; + pixelColor = gAGABlueRamp[ kAGA10] ; + SetCPixel( barLeft.left + 1, barLeft.bottom-1 , &pixelColor ) ; + InsetRect( &barLeft , 1 , 1 ) ; + if ( !EmptyRect( &barLeft ) ) + { + // do more here + RGBForeColor( &gAGABlueRamp[ kAGA3 ] ) ; + PaintRect( &barLeft ) ; + } + } + } +} + +SInt32 AGAGetDataHelper( ControlDataAccessRec *rec , Size size , Ptr data ) ; +SInt32 AGAGetDataHelper( ControlDataAccessRec *rec , Size size , Ptr data ) +{ + if ( rec->dataPtr == NULL ) + { + rec->size = size ; + return noErr ; + } + else + { + if ( rec->size < size ) + return errDataSizeMismatch ; + + rec->size = size ; + memcpy( rec->dataPtr , data , size ) ; + return noErr ; + } +} + +void AGASetFontStyle( ControlFontStyleRec *fontstyle ) ; +void AGASetFontStyle( ControlFontStyleRec *fontstyle ) +{ + if( fontstyle->font >= 0 ) + { + ::TextFont( fontstyle->font ) ; + ::TextSize( fontstyle->size ) ; + ::TextFace( fontstyle->style ) ; + } + else + { + switch( fontstyle->font ) + { + case kControlFontBigSystemFont : + ::TextFont( systemFont ) ; + ::TextSize( 12 ) ; + ::TextFace( 0 ) ; + break ; + case kControlFontSmallSystemFont : + ::TextFont( kFontIDGeneva ) ; + ::TextSize( 10 ) ; + ::TextFace( 0 ) ; + break ; + case kControlFontSmallBoldSystemFont : + ::TextFont( kFontIDGeneva ) ; + ::TextSize( 10 ) ; + ::TextFace( bold ) ; + break ; + } + } + ::RGBForeColor( &fontstyle->foreColor ) ; + ::RGBBackColor( &fontstyle->backColor ) ; +} ; + +class AGAPortHelper +{ +public : + AGAPortHelper() + { + GetPenState( &oldPenState ) ; + GetBackColor( &oldBackColor ) ; + GetForeColor( &oldForeColor ) ; + + GetPort( &port ) ; + clip = NewRgn() ; + GetClip( clip ); + font = port->txFont; + size = port->txSize; + style = port->txFace; + mode = port->txMode; + + } + ~AGAPortHelper() + { + SetPort( port ) ; + SetClip( clip ) ; + DisposeRgn( clip ) ; + RGBForeColor(&oldForeColor); + RGBBackColor(&oldBackColor); + SetPenState(&oldPenState); + + TextFont( font ); + TextSize( size ); + TextFace( style ); + TextMode( mode ); + } + +private : + GrafPtr port ; + PenState oldPenState ; + RGBColor oldForeColor ; + RGBColor oldBackColor ; + RgnHandle clip ; + short font ; + short size ; + short style ; + short mode ; +} ; + +pascal SInt32 AGAProgressBarDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + switch( message ) + { + case drawCntl : + { + if (!(**theControl).contrlVis) + return 0 ; + PenState oldPenState; + RGBColor oldForeColor ; + RGBColor oldBackColor ; + RGBColor backColor ; + RGBColor foreColor ; + + GetPenState( &oldPenState ) ; + GetBackColor( &oldBackColor ) ; + GetForeColor( &oldForeColor ) ; + + { + int theValue = GetControlValue(theControl) ; + int theMinimum = GetControlMinimum(theControl) ; + int theMaximum = GetControlMaximum(theControl) ; + + AGADrawRectProgress( &(**theControl).contrlRect , kAGAStateEnabled , (( double )( theValue - theMinimum )) / ( theMaximum-theMinimum ) ) ; + } + + RGBForeColor(&oldForeColor); + RGBBackColor(&oldBackColor); + SetPenState(&oldPenState); + } + break ; + case calcCntlRgn : + RectRgn((RgnHandle) param , &(**theControl).contrlRect ) ; + break ; + default : + break ; + } + + return 0 ; +} + + +pascal SInt32 AGAPlacardDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + switch( message ) + { + case drawCntl : + { + if (!(**theControl).contrlVis) + return 0 ; + PenState oldPenState; + RGBColor oldForeColor ; + RGBColor oldBackColor ; + RGBColor backColor ; + RGBColor foreColor ; + + GetPenState( &oldPenState ) ; + GetBackColor( &oldBackColor ) ; + GetForeColor( &oldForeColor ) ; + + { + AGADrawRectPlacard( &(**theControl).contrlRect , kAGAStateEnabled , true ) ; + } + + RGBForeColor(&oldForeColor); + RGBBackColor(&oldBackColor); + SetPenState(&oldPenState); + } + break ; + default : + break ; + } + + return 0 ; +} + +pascal SInt32 AGABevelButtonDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + switch( message ) + { + case initCntl : + info->privateData = (long) malloc( sizeof( ControlButtonContentInfo ) ) ; + memset( (char*) info->privateData , 0 , sizeof( ControlButtonContentInfo ) ) ; + break ; + case dispCntl : + free( (void*) info->privateData ) ; + break ; + case kControlMsgSetData : + { + ControlDataAccessRec *rec = (ControlDataAccessRec *) param ; + if ( rec->tag == kControlBevelButtonContentTag ) + { + memcpy( (char*) info->privateData , rec->dataPtr , rec->size ) ; + return noErr ; + } + return errDataNotSupported ; + } + case kControlMsgCalcBestRect : + { + ControlCalcSizeRec *rec = (ControlCalcSizeRec *) param ; + rec->width = 0 ; + rec->height = 20 ; + rec->baseLine = 0; + } + break ; + case drawCntl : + { + if (!(**theControl).contrlVis) + return 0 ; + + { + AGAPortHelper help() ; + AGASetFontStyle( &info->fontStyle ) ; + Boolean mRadioBehavior = false ; + + int mValue = GetControlValue( theControl ) ; + long theValue = (mRadioBehavior ? mValue : 0); + Boolean inPushed = (**theControl).contrlHilite ; + Boolean down = inPushed || (theValue != 0); + Boolean hasColor = 1; + int mEnabled = 1 ; + int triState_Off = 3 ; + Boolean disabled = (mEnabled == triState_Off); + + Rect frame = (**theControl).contrlRect ; + + // Draw the black frame; + ::MoveTo(frame.left + 1, frame.top); + ::LineTo(frame.right - 2, frame.top); + ::MoveTo(frame.right - 1, frame.top + 1); + ::LineTo(frame.right - 1, frame.bottom - 2); + ::MoveTo(frame.right - 2, frame.bottom - 1); + ::LineTo(frame.left + 1, frame.bottom - 1); + ::MoveTo(frame.left, frame.bottom - 2); + ::LineTo(frame.left, frame.top + 1); + + // Draw the inside (w/o the Icon) + ::InsetRect(&frame, 1, 1); + if (hasColor) + { + AGASetFontStyle( &info->fontStyle ) ; + if (down) + ::RGBBackColor(&gAGAColorArray[4]); + } + ::EraseRect(&frame); + + // Draw the shadows + if (hasColor) + { + ::RGBForeColor(&gAGAColorArray[7]); + if (down) + { + ::MoveTo(frame.left, frame.bottom - 1); + ::LineTo(frame.left, frame.top); + ::LineTo(frame.right - 1, frame.top); + } + else + { + ::MoveTo(frame.right - 1, frame.top); + ::LineTo(frame.right - 1, frame.bottom - 1); + ::LineTo(frame.left, frame.bottom - 1); + ::MoveTo(frame.right - 2, frame.top + 1); + ::LineTo(frame.right - 2, frame.bottom - 2); + ::LineTo(frame.left + 1, frame.bottom - 2); + ::ForeColor(whiteColor); + ::MoveTo(frame.left, frame.bottom - 2); + ::LineTo(frame.left, frame.top); + ::LineTo(frame.right - 2, frame.top); + } + } + + // Draw the Icon + + frame = (**theControl).contrlRect ; + PictInfo theInfo ; + PicHandle thePict = ((ControlButtonContentInfo*) info->privateData)->u.picture ; + if ( thePict ) + { + GetPictInfo( thePict , &theInfo , 0 , 0 , systemMethod , 0 ) ; + Rect bitmaprect = { 0 , 0 , theInfo.sourceRect.bottom - theInfo.sourceRect.top , + theInfo.sourceRect.right - theInfo.sourceRect.left } ; + ::OffsetRect( &bitmaprect , (frame.right + frame.left)/2 - bitmaprect.right / 2 , (frame.bottom + frame.top) / 2 - bitmaprect.bottom / 2 ) ; + if (inPushed) + ::OffsetRect( &bitmaprect , 1 , 1 ) ; + ::DrawPicture( thePict , &bitmaprect ) ; + } + } + } + break ; + case testCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) ) + return kControlButtonPart ; + else + return NULL ; + } + break ; + case calcCntlRgn : + RectRgn((RgnHandle) param , &(**theControl).contrlRect ) ; + break ; + case posCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) ) + return kControlButtonPart ; + else + return NULL ; + } + break ; + default : + break ; + } + + return 0 ; +} + +pascal SInt32 AGAButtonDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + switch( message ) + { + case initCntl : + (**theControl).contrlData = NULL ; + break ; + case kControlMsgSetData : + { + ControlDataAccessRec *rec = (ControlDataAccessRec *) param ; + Boolean isDefault = *((Boolean*)rec->dataPtr ) ; + (**theControl).contrlData = (Handle) isDefault ; + return noErr ; + } + break ; + case kControlMsgCalcBestRect : + { + ControlCalcSizeRec *rec = (ControlCalcSizeRec *) param ; + rec->width = 0 ; + rec->height = 20 ; + rec->baseLine = 0; + } + break ; + case drawCntl : + { + if (!(**theControl).contrlVis) + return 0 ; + + { + AGAPortHelper help() ; + AGASetFontStyle( &info->fontStyle ) ; + Boolean mRadioBehavior = false ; + + Rect frame, tempRect; + int mValue = GetControlValue( theControl ) ; + long theValue = (mRadioBehavior ? mValue : 0); + Boolean inPushed = (**theControl).contrlHilite ; + Boolean down = inPushed || (theValue != 0); + Boolean hasColor = 1; + int mEnabled = 1 ; + int triState_Off = 3 ; + Boolean disabled = (mEnabled == triState_Off); + +// theState.Normalize(); +// CalcLocalFrameRect(frame); + frame= (**theControl).contrlRect ; + + if ( (**theControl).contrlData ) + { + InsetRect( &frame , -3 , -3 ) ; + { + ::MoveTo(frame.left + 3, frame.top); + ::LineTo(frame.right - 4, frame.top); + ::LineTo(frame.right - 1, frame.top + 3); + ::LineTo(frame.right - 1, frame.bottom - 4); + ::LineTo(frame.right - 4, frame.bottom - 1); + ::LineTo(frame.left + 3, frame.bottom - 1); + ::LineTo(frame.left, frame.bottom - 4); + ::LineTo(frame.left, frame.top + 3); + ::LineTo(frame.left + 3, frame.top); + + if (hasColor) + { + const RGBColor *col = gAGAColorArray; + for (int i = 0; i < 5; i++) + for (int j = 0; j < 5; j++) + { + if (LAGADefaultOutline_mCorners[0][i][j] != -1) + ::SetCPixel(frame.left + j, frame.top + i, &col[LAGADefaultOutline_mCorners[0][i][j]]); + if (LAGADefaultOutline_mCorners[1][i][j] != -1) + ::SetCPixel(frame.right - 5 + j, frame.top + i, &col[LAGADefaultOutline_mCorners[1][i][j]]); + if (LAGADefaultOutline_mCorners[2][i][j] != -1) + ::SetCPixel(frame.left + j, frame.bottom - 5 + i, &col[LAGADefaultOutline_mCorners[2][i][j]]); + if (LAGADefaultOutline_mCorners[3][i][j] != -1) + ::SetCPixel(frame.right - 5 + j, frame.bottom - 5 + i, &col[LAGADefaultOutline_mCorners[3][i][j]]); + } + + ::RGBForeColor(&gAGAColorArray[2]); + ::MoveTo(frame.left + 1, frame.top + 5); + ::LineTo(frame.left + 1, frame.bottom - 6); + ::MoveTo(frame.left + 5, frame.top + 1); + ::LineTo(frame.right - 6, frame.top + 1); + + ::RGBForeColor(&gAGAColorArray[5]); + ::MoveTo(frame.left + 4, frame.top + 2); + ::LineTo(frame.right - 5, frame.top + 2); + ::LineTo(frame.right - 3, frame.top + 4); + ::LineTo(frame.right - 3, frame.bottom - 5); + ::LineTo(frame.right - 5, frame.bottom - 3); + ::LineTo(frame.left + 4, frame.bottom - 3); + ::LineTo(frame.left + 2, frame.bottom - 5); + ::LineTo(frame.left + 2, frame.top + 4); + ::LineTo(frame.left + 4, frame.top + 2); + + ::RGBForeColor(&gAGAColorArray[8]); + ::MoveTo(frame.right - 2, frame.top + 5); + ::LineTo(frame.right - 2, frame.bottom - 6); + ::MoveTo(frame.left + 5, frame.bottom - 2); + ::LineTo(frame.right - 6, frame.bottom - 2); + } + } + } + + AGASetFontStyle( &info->fontStyle ) ; + frame= (**theControl).contrlRect ; + + tempRect = frame; + ::InsetRect(&tempRect, 1, 1); + if (hasColor) + { + if (down) + ::RGBBackColor(&gAGAColorArray[4]); + } + EraseRect(&tempRect); + + // Draw the frame; + if (disabled) + { + if (hasColor) + ::RGBForeColor(&gAGAColorArray[7]); + else + ::PenPat(&qd.gray); + } + ::MoveTo(frame.left + 2, frame.top); + ::LineTo(frame.right - 3, frame.top); + ::LineTo(frame.right - 1, frame.top + 2); + ::LineTo(frame.right - 1, frame.bottom - 3); + ::LineTo(frame.right - 3, frame.bottom - 1); + ::LineTo(frame.left + 2, frame.bottom - 1); + ::LineTo(frame.left, frame.bottom - 3); + ::LineTo(frame.left, frame.top + 2); + ::LineTo(frame.left + 2, frame.top); + if (disabled && !hasColor) + ::PenNormal(); + + // Draw the four corners around + if (hasColor) + { + short pattern = (disabled ? 2 : (down ? 1 : 0)); + const RGBColor *col = gAGAColorArray; + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + { + if (LAGAPushButton_mCorners[pattern][0][i][j] != -1) + ::SetCPixel(frame.left + j, frame.top + i, &col[LAGAPushButton_mCorners[pattern][0][i][j]]); + if (LAGAPushButton_mCorners[pattern][1][i][j] != -1) + ::SetCPixel(frame.right - 4 + j, frame.top + i, &col[LAGAPushButton_mCorners[pattern][1][i][j]]); + if (LAGAPushButton_mCorners[pattern][2][i][j] != -1) + ::SetCPixel(frame.left + j, frame.bottom - 4 + i, &col[LAGAPushButton_mCorners[pattern][2][i][j]]); + if (LAGAPushButton_mCorners[pattern][3][i][j] != -1) + ::SetCPixel(frame.right - 4 + j, frame.bottom - 4 + i, &col[LAGAPushButton_mCorners[pattern][3][i][j]]); + } + + if (down) + ::RGBForeColor(&gAGAColorArray[8]); + else + ::RGBForeColor(&gAGAColorArray[2]); + ::MoveTo(frame.left + 1, frame.top + 4); + ::LineTo(frame.left + 1, frame.bottom - 5); + ::MoveTo(frame.left + 4, frame.top + 1); + ::LineTo(frame.right - 5, frame.top + 1); + + if (!down) + { + if (disabled) + ::RGBForeColor(&gAGAColorArray[1]); + else + ::ForeColor(whiteColor); + ::MoveTo(frame.left + 2, frame.bottom - 5); + ::LineTo(frame.left + 2, frame.top + 2); + ::LineTo(frame.right - 5, frame.top + 2); + + if (disabled) + ::RGBForeColor(&gAGAColorArray[5]); + else + ::RGBForeColor(&gAGAColorArray[8]); + ::MoveTo(frame.left + 4, frame.bottom - 2); + ::LineTo(frame.right - 5, frame.bottom - 2); + ::MoveTo(frame.right - 2, frame.bottom - 5); + ::LineTo(frame.right - 2, frame.top + 4); + + if (disabled) + ::RGBForeColor(&gAGAColorArray[4]); + else + ::RGBForeColor(&gAGAColorArray[5]); + ::MoveTo(frame.left + 4, frame.bottom - 3); + ::LineTo(frame.right - 5, frame.bottom - 3); + ::MoveTo(frame.right - 3, frame.bottom - 5); + ::LineTo(frame.right - 3, frame.top + 4); + } + } + AGASetFontStyle( &info->fontStyle ) ; + int x = ( (**theControl).contrlRect.left + (**theControl).contrlRect.right ) / 2 ; + int y = ( (**theControl).contrlRect.top + (**theControl).contrlRect.bottom ) / 2 ; + FontInfo fi ; + ::GetFontInfo( &fi ) ; + + y += fi.ascent / 2 ; + int length = (**theControl).contrlTitle[0] ; + if ( length ) + { + int width = TextWidth( &(**theControl).contrlTitle[1] , 0, length ) ; + x -= width / 2 ; + ::MoveTo( x , y ); + ::DrawText( &(**theControl).contrlTitle[1] , 0, length); + } + + } + } + break ; + case testCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) ) + return kControlButtonPart ; + else + return NULL ; + } + break ; + case calcCntlRgn : + RectRgn((RgnHandle) param , &(**theControl).contrlRect ) ; + break ; + case posCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) ) + return kControlButtonPart ; + else + return NULL ; + } + break ; + default : + break ; + } + + return 0 ; +} + +const int kAGACheckBoxWidth = 12 ; +const int kAGACheckBoxHeigth = 12 ; + +pascal SInt32 AGACheckBoxDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + switch( message ) + { + case drawCntl : + { + if (!(**theControl).contrlVis) + return 0 ; + PenState oldPenState; + RGBColor oldForeColor ; + RGBColor oldBackColor ; + RGBColor backColor ; + RGBColor foreColor ; + + + { + if (!(**theControl).contrlVis) + return 0 ; + + { + AGAPortHelper help() ; + Rect frame = (**theControl).contrlRect ; + Boolean hasColor = true; + Boolean disabled = (*theControl)->contrlHilite == 255 ; + int mValue = GetControlValue( theControl ) ; + Boolean inPushed = (**theControl).contrlHilite ; + int mEnabled = 1 ; + int triState_Off = 3 ; + + frame.right = frame.left + kAGACheckBoxWidth; + frame.bottom = frame.top + kAGACheckBoxHeigth; + + // Draw the frame of the checkbox + if (disabled) + if (hasColor) + ::RGBForeColor(&gAGAColorArray[7]); + else + PenPat(&qd.gray); + + ::FrameRect(&frame); + + if (!hasColor) + PenNormal(); + + ::InsetRect(&frame, 1, 1); + if (hasColor) + ::RGBBackColor(inPushed ? &gAGAColorArray[8] : &gAGAColorArray[2]); + ::EraseRect(&frame); + + if (hasColor) + { + if (inPushed) + ::RGBForeColor(&gAGAColorArray[10]); + else + ForeColor(whiteColor); + ::MoveTo(frame.left, frame.bottom - 2); + ::LineTo(frame.left, frame.top); + ::LineTo(frame.right - 2, frame.top); + + if (inPushed) + ::RGBForeColor(&gAGAColorArray[6]); + else + ::RGBForeColor(mEnabled != triState_Off ? &gAGAColorArray[7] : &gAGAColorArray[5]); + ::MoveTo(frame.left + 1, frame.bottom - 1); + ::LineTo(frame.right - 1, frame.bottom - 1); + ::LineTo(frame.right - 1, frame.top + 1); + } + + if (mValue) + { + if (mValue == 1) + { + // Checked state + if (hasColor) + { + ::RGBForeColor(inPushed ? &gAGAColorArray[10] : &gAGAColorArray[5]); + ::MoveTo(frame.left + 3, frame.bottom - 2); + ::LineTo(frame.right - 2, frame.top + 3); + ::MoveTo(frame.right - 2, frame.bottom - 2); + ::LineTo(frame.right - 2, frame.bottom - 2); + + if (mEnabled != triState_Off) + ::RGBForeColor(inPushed ? &gAGAColorArray[11] : &gAGAColorArray[8]); + ::MoveTo(frame.left + 3, frame.bottom - 3); + ::LineTo(frame.right - 2, frame.top + 2); + ::MoveTo(frame.right - 2, frame.bottom - 3); + ::LineTo(frame.right - 2, frame.bottom - 3); + + if (mEnabled != triState_Off) + ::ForeColor(blackColor); + else + ::RGBForeColor(&gAGAColorArray[7]); + } + ::MoveTo(frame.left + 2, frame.top + 1); + ::LineTo(frame.right - 3, frame.bottom - 4); + ::MoveTo(frame.left + 2, frame.top + 2); + ::LineTo(frame.right - 3, frame.bottom - 3); + ::MoveTo(frame.left + 2, frame.bottom - 4); + ::LineTo(frame.right - 3, frame.top + 1); + ::MoveTo(frame.left + 2, frame.bottom - 3); + ::LineTo(frame.right - 3, frame.top + 2); + } + else + { + // Mixed state + if (hasColor) + { + ::RGBForeColor(inPushed ? &gAGAColorArray[10] : &gAGAColorArray[5]); + ::MoveTo(frame.left + 3, frame.top + 6); + ::LineTo(frame.right - 2, frame.top + 6); + ::LineTo(frame.right - 2, frame.top + 4); + + if (mEnabled != triState_Off) + ::ForeColor(blackColor); + else + ::RGBForeColor(&gAGAColorArray[7]); + } + ::MoveTo(frame.left + 2, frame.top + 4); + ::LineTo(frame.right - 3, frame.top + 4); + ::MoveTo(frame.left + 2, frame.top + 5); + ::LineTo(frame.right - 3, frame.top + 5); + } + } + + if (inPushed && !hasColor) + InvertRect(&frame); + + AGASetFontStyle( &info->fontStyle ) ; + int x = (**theControl).contrlRect.left + kAGACheckBoxWidth + 5 ; + int y = ( (**theControl).contrlRect.top + (**theControl).contrlRect.bottom ) / 2 ; + FontInfo fi ; + ::GetFontInfo( &fi ) ; + + y += fi.ascent / 2 ; + ::MoveTo( x , y ); + int length = (**theControl).contrlTitle[0] ; + if ( length ) + { + ::DrawText( &(**theControl).contrlTitle[1] , 0, length); + } + } + } + + } + break ; + case testCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) && ((*theControl)->contrlVis != 0) && ((*theControl)->contrlHilite != 255) ) + return kControlCheckBoxPart ; + else + return NULL ; + } + break ; + case posCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) ) + { + if ( (**theControl).contrlValue ) + (**theControl).contrlValue = 0 ; + else + (**theControl).contrlValue = 1 ; + + return 0 ; + } + else + return 0 ; + } + break ; + case calcThumbRgn : + case calcCntlRgn : + if ( !EmptyRect(&(**theControl).contrlRect ) ) + RectRgn((RgnHandle) param , &(**theControl).contrlRect ) ; + break ; + case kControlMsgCalcBestRect : + { + ControlCalcSizeRec *rec = (ControlCalcSizeRec *) param ; + rec->width = (**theControl).contrlRect.right - (**theControl).contrlRect.left ; + rec->height = kAGACheckBoxHeigth ; + rec->baseLine = 0; + } + break ; + default : + break ; + } + + return 0 ; +} + +pascal SInt32 AGARadioButtonDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ +//TO DO +/* ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + switch( message ) + { + case drawCntl : + { + if (!(**theControl).contrlVis) + return 0 ; + PenState oldPenState; + RGBColor oldForeColor ; + RGBColor oldBackColor ; + RGBColor backColor ; + RGBColor foreColor ; + + + { + if (!(**theControl).contrlVis) + return 0 ; + + { + AGAPortHelper help() ; + Rect frame = (**theControl).contrlRect ; + Boolean hasColor = true; + Boolean disabled = (*theControl)->contrlHilite == 255 ; + int mValue = GetControlValue( theControl ) ; + Boolean inPushed = (**theControl).contrlHilite ; + int mEnabled = 1 ; + int triState_Off = 3 ; + + frame.right = frame.left + kAGACheckBoxWidth; + frame.bottom = frame.top + kAGACheckBoxHeigth; + + // Draw the frame of the checkbox + if (disabled) + if (hasColor) + ::RGBForeColor(&gAGAColorArray[7]); + else + PenPat(&qd.gray); + + ::FrameRect(&frame); + + if (!hasColor) + PenNormal(); + + ::InsetRect(&frame, 1, 1); + if (hasColor) + ::RGBBackColor(inPushed ? &gAGAColorArray[8] : &gAGAColorArray[2]); + ::EraseRect(&frame); + + if (hasColor) + { + if (inPushed) + ::RGBForeColor(&gAGAColorArray[10]); + else + ForeColor(whiteColor); + ::MoveTo(frame.left, frame.bottom - 2); + ::LineTo(frame.left, frame.top); + ::LineTo(frame.right - 2, frame.top); + + if (inPushed) + ::RGBForeColor(&gAGAColorArray[6]); + else + ::RGBForeColor(mEnabled != triState_Off ? &gAGAColorArray[7] : &gAGAColorArray[5]); + ::MoveTo(frame.left + 1, frame.bottom - 1); + ::LineTo(frame.right - 1, frame.bottom - 1); + ::LineTo(frame.right - 1, frame.top + 1); + } + + if (mValue) + { + if (mValue == 1) + { + // Checked state + if (hasColor) + { + ::RGBForeColor(inPushed ? &gAGAColorArray[10] : &gAGAColorArray[5]); + ::MoveTo(frame.left + 3, frame.bottom - 2); + ::LineTo(frame.right - 2, frame.top + 3); + ::MoveTo(frame.right - 2, frame.bottom - 2); + ::LineTo(frame.right - 2, frame.bottom - 2); + + if (mEnabled != triState_Off) + ::RGBForeColor(inPushed ? &gAGAColorArray[11] : &gAGAColorArray[8]); + ::MoveTo(frame.left + 3, frame.bottom - 3); + ::LineTo(frame.right - 2, frame.top + 2); + ::MoveTo(frame.right - 2, frame.bottom - 3); + ::LineTo(frame.right - 2, frame.bottom - 3); + + if (mEnabled != triState_Off) + ::ForeColor(blackColor); + else + ::RGBForeColor(&gAGAColorArray[7]); + } + ::MoveTo(frame.left + 2, frame.top + 1); + ::LineTo(frame.right - 3, frame.bottom - 4); + ::MoveTo(frame.left + 2, frame.top + 2); + ::LineTo(frame.right - 3, frame.bottom - 3); + ::MoveTo(frame.left + 2, frame.bottom - 4); + ::LineTo(frame.right - 3, frame.top + 1); + ::MoveTo(frame.left + 2, frame.bottom - 3); + ::LineTo(frame.right - 3, frame.top + 2); + } + else + { + // Mixed state + if (hasColor) + { + ::RGBForeColor(inPushed ? &gAGAColorArray[10] : &gAGAColorArray[5]); + ::MoveTo(frame.left + 3, frame.top + 6); + ::LineTo(frame.right - 2, frame.top + 6); + ::LineTo(frame.right - 2, frame.top + 4); + + if (mEnabled != triState_Off) + ::ForeColor(blackColor); + else + ::RGBForeColor(&gAGAColorArray[7]); + } + ::MoveTo(frame.left + 2, frame.top + 4); + ::LineTo(frame.right - 3, frame.top + 4); + ::MoveTo(frame.left + 2, frame.top + 5); + ::LineTo(frame.right - 3, frame.top + 5); + } + } + + if (inPushed && !hasColor) + InvertRect(&frame); + + AGASetFontStyle( &info->fontStyle ) ; + int x = (**theControl).contrlRect.left + kAGACheckBoxWidth + 5 ; + int y = ( (**theControl).contrlRect.top + (**theControl).contrlRect.bottom ) / 2 ; + FontInfo fi ; + ::GetFontInfo( &fi ) ; + + y += fi.ascent / 2 ; + ::MoveTo( x , y ); + int length = (**theControl).contrlTitle[0] ; + if ( length ) + { + ::DrawText( &(**theControl).contrlTitle[1] , 0, length); + } + } + } + + } + break ; + case testCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) && ((*theControl)->contrlVis != 0) && ((*theControl)->contrlHilite != 255) ) + return kControlCheckBoxPart ; + else + return NULL ; + } + break ; + case posCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) ) + { + if ( (**theControl).contrlValue ) + (**theControl).contrlValue = 0 ; + else + (**theControl).contrlValue = 1 ; + + return 0 ; + } + else + return 0 ; + } + break ; + case calcThumbRgn : + case calcCntlRgn : + if ( !EmptyRect(&(**theControl).contrlRect ) ) + RectRgn((RgnHandle) param , &(**theControl).contrlRect ) ; + break ; + case kControlMsgCalcBestRect : + { + ControlCalcSizeRec *rec = (ControlCalcSizeRec *) param ; + rec->width = (**theControl).contrlRect.right - (**theControl).contrlRect.left ; + rec->height = kAGACheckBoxHeigth ; + rec->baseLine = 0; + } + break ; + default : + break ; + } + */ + return 0 ; +} + +pascal SInt32 AGAStaticGroupBoxTextDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + + switch( message ) + { + case initCntl : + break ; + case dispCntl : + break ; + case drawCntl : + { + if (!(**theControl).contrlVis) + return 0 ; + + { + bool disabled = false ; + bool hasColor = true ; + AGAPortHelper help() ; + AGASetFontStyle( &info->fontStyle ) ; + FontInfo fi ; + ::GetFontInfo( &fi ) ; + + Rect labelRect = (**theControl).contrlRect ; + Rect theFrame = (**theControl).contrlRect ; + int width = StringWidth((**theControl).contrlTitle) ; + theFrame.top += fi.ascent + fi.leading >> 1 ; + labelRect.bottom = theFrame.top + 8 ; + labelRect.left += 10 ; + labelRect.right =labelRect.left + width + 6 ; + + theFrame.bottom--; + theFrame.right--; + + if (disabled) + { + RGBForeColor( &gAGAColorArray[4] ) ; + } + else + { + RGBForeColor( &gAGAColorArray[7] ) ; + } + FrameRect( &theFrame ) ; + + if (disabled) + ::RGBForeColor(&gAGAColorArray[1]); + else + ::ForeColor(whiteColor); + ::MoveTo(theFrame.left + 1, theFrame.bottom - 2); + ::LineTo(theFrame.left + 1, theFrame.top + 1); + ::LineTo(theFrame.right - 2, theFrame.top + 1); + ::MoveTo(theFrame.left , theFrame.bottom); + ::LineTo(theFrame.right, theFrame.bottom); + ::LineTo(theFrame.right, theFrame.top); + + AGASetFontStyle( &info->fontStyle ) ; + ::EraseRect( &labelRect ) ; + ::MoveTo(labelRect.left + 3, labelRect.top + fi.ascent + (fi.leading >> 1)); + ::DrawString((**theControl).contrlTitle); + } + } + break ; + case kControlMsgCalcBestRect : + { + ControlCalcSizeRec *rec = (ControlCalcSizeRec *) param ; + rec->width = (**theControl).contrlRect.right - (**theControl).contrlRect.left ; + rec->height = (**theControl).contrlRect.bottom - (**theControl).contrlRect.top ; + rec->baseLine = 0; + } + break ; + case kControlMsgSetData : + break ; + case calcCntlRgn : + RectRgn((RgnHandle) param , &(**theControl).contrlRect ) ; + break ; + default : + break ; + } + + return 0 ; +} + +pascal SInt32 AGAStaticTextDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + Handle macText = (**theControl).contrlData ; + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + + switch( message ) + { + case initCntl : + { + macText = NewHandle(0) ; + (**theControl).contrlData = (Handle) macText ; + } + break ; + case dispCntl : + DisposeHandle( macText ) ; + break ; + case drawCntl : + { + if (!(**theControl).contrlVis) + return 0 ; + + { + AGAPortHelper help() ; + AGASetFontStyle( &info->fontStyle ) ; + int x = (**theControl).contrlRect.left ; + int y = (**theControl).contrlRect.top ; + int lineheight ; + FontInfo fi ; + ::GetFontInfo( &fi ) ; + + y += fi.ascent ; + lineheight = fi.ascent + fi.descent + fi.leading ; + int length = GetHandleSize( macText ) ; + if ( length ) + { + int laststop = 0 ; + int i = 0 ; + HLock( macText ) ; + RGBColor gray = { 0xDDDD , 0xDDDD, 0xDDDD } ; + ::RGBBackColor( &gray ) ; + while( i < length ) + { + if ( (*macText)[i] == 0x0d ) + { + ::MoveTo( x , y ); + ::DrawText( *macText , laststop, i-laststop); + laststop = i+1 ; + y += lineheight ; + } + i++ ; + } + ::MoveTo( x , y ); + ::DrawText( *macText , laststop, i-laststop); + laststop = i+1 ; + HUnlock( macText ) ; + } + } + } + break ; + case kControlMsgCalcBestRect : + { + ControlCalcSizeRec *rec = (ControlCalcSizeRec *) param ; + rec->width = (**theControl).contrlRect.right - (**theControl).contrlRect.left ; + rec->height = (**theControl).contrlRect.bottom - (**theControl).contrlRect.top ; + rec->baseLine = 0; + } + break ; + case kControlMsgSetData : + { + ControlDataAccessRec *rec = (ControlDataAccessRec *) param ; + if ( rec->tag == kControlStaticTextTextTag ) + { + SetHandleSize( macText , rec->size ) ; + memcpy( *macText , rec->dataPtr , rec->size ) ; + return noErr ; + } + return errDataNotSupported ; + } + default : + break ; + } + + return 0 ; +} + +void AGAMoveControl(ControlHandle inControl , short x , short y ) +{ + if ( AGATestForNewControl( inControl ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + if ( info->magic == kExtCDEFMagic ) + { + if ( info->procID == kControlEditTextProc) + { + int dx ; + int dy ; + + dx= x - (**inControl).contrlRect.left ; + dy= y - (**inControl).contrlRect.top ; + + MoveControl( inControl , x ,y ) ; + TEHandle macTE ; + + macTE = (TEHandle) (**inControl).contrlData ; + (**macTE).destRect.left += dx ; + (**macTE).destRect.top += dy ; + (**macTE).destRect.right += dx ; + (**macTE).destRect.bottom += dy ; + (**macTE).viewRect.left += dx ; + (**macTE).viewRect.top += dy ; + (**macTE).viewRect.right += dx ; + (**macTE).viewRect.bottom += dy ; + return ; + } + if ( info->procID == kControlListBoxProc) + { + int dx ; + int dy ; + + dx= x - (**inControl).contrlRect.left ; + dy= y - (**inControl).contrlRect.top ; + + MoveControl( inControl , x ,y ) ; + ListHandle macList ; + + macList = (ListHandle) (**inControl).contrlData ; + (**macList).rView.left += dx ; + (**macList).rView.top += dy ; + (**macList).rView.right += dx ; + (**macList).rView.bottom += dy ; + return ; + } + } + } + MoveControl( inControl , x ,y ) ; +} + +void AGASizeControl(ControlHandle inControl , short x , short y ) +{ + if ( AGATestForNewControl( inControl ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + if ( info->magic == kExtCDEFMagic ) + { + if ( info->procID == kControlEditTextProc) + { + int dx ; + int dy ; + + dx= x - ( (**inControl).contrlRect.right - (**inControl).contrlRect.left ) ; + dy= y - ( (**inControl).contrlRect.bottom - (**inControl).contrlRect.top ) ; + + SizeControl( inControl , x ,y ) ; + TEHandle macTE ; + + macTE = (TEHandle) (**inControl).contrlData ; + (**macTE).destRect.right += dx ; + (**macTE).destRect.bottom += dy ; + (**macTE).viewRect.right += dx ; + (**macTE).viewRect.bottom += dy ; + return ; + } + if ( info->procID == kControlListBoxProc) + { + int dx ; + int dy ; + + dx= x - ( (**inControl).contrlRect.right - (**inControl).contrlRect.left ) ; + dy= y - ( (**inControl).contrlRect.bottom - (**inControl).contrlRect.top ) ; + + SizeControl( inControl , x ,y ) ; + ListHandle macList ; + + macList = (ListHandle) (**inControl).contrlData ; + (**macList).rView.right += dx ; + (**macList).rView.bottom += dy ; + return ; + } + } + } + SizeControl( inControl , x ,y ) ; +} + +pascal SInt32 AGARootControlDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + + switch( message ) + { + case initCntl : + break ; + case dispCntl : + break ; + case drawCntl : + break ; + case kControlMsgCalcBestRect : + break ; + case kControlMsgSetData : + default : + break ; + } + + return 0 ; +} + +pascal SInt32 AGAEditTextDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + Size result ; + TEHandle macTE ; + + macTE = (TEHandle) (**theControl).contrlData ; + + switch( message ) + { + case initCntl : + { + AGAPortHelper help() ; + SetPort( (**theControl).contrlOwner ) ; + ::TextFont( kFontIDGeneva ) ; + ::TextSize( 10 ) ; + ::TextFace( 0 ) ; + RGBBackColor( &gAGARamp[ kAGAWhite ] ) ; + RGBForeColor( &gAGARamp[ kAGABlack ] ) ; + Rect bounds = (**theControl).contrlRect ; + InsetRect( &bounds , 4 , 1 ) ; + FontInfo fi ; + ::GetFontInfo( &fi ) ; + + bounds.top = bounds.bottom - abs( fi.descent ) - fi.ascent - 3; + macTE = TENew( &bounds , &bounds) ; + (**theControl).contrlData = (Handle) macTE ; + } + break ; + case dispCntl : + TEDispose( macTE ) ; + break ; + case drawCntl : + { + AGAPortHelper help() ; + AGASetFontStyle( &info->fontStyle ) ; + SetPort( (**theControl).contrlOwner ) ; + RGBBackColor( &gAGARamp[ kAGAWhite ] ) ; + RGBForeColor( &gAGARamp[ kAGABlack ] ) ; + EraseRect( &(**theControl).contrlRect ) ; + FrameRect( &(**theControl).contrlRect ) ; + TEUpdate( &(**theControl).contrlRect , macTE ) ; + } + break ; + case testCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) ) + return kControlButtonPart ; + else + return NULL ; + } + break ; + case posCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) ) + { + TEClick( pt , false , macTE ) ; + } + } + break ; + case kControlMsgGetData : + { + ControlDataAccessRec *rec = (ControlDataAccessRec *) param ; + if ( rec->tag == kControlEditTextTEHandleTag ) + { + return AGAGetDataHelper( rec , sizeof( TEHandle ) , (char*) &macTE ) ; + } + else if ( rec->tag == kControlEditTextTextTag ) + { + return AGAGetDataHelper( rec , (**macTE).teLength , (char*) *(**macTE).hText ) ; + } + else if ( rec->tag == kControlEditTextSelectionTag ) + { + } + return errDataNotSupported ; + } + break ; + case kControlMsgSetData : + { + ControlDataAccessRec *rec = (ControlDataAccessRec *) param ; + if ( rec->tag == kControlEditTextTextTag ) + { + TESetText( rec->dataPtr , rec->size , macTE ) ; + return noErr ; + } + return errDataNotSupported ; + } + case kControlMsgCalcBestRect : + { + ControlCalcSizeRec *rec = (ControlCalcSizeRec *) param ; + rec->width = (**theControl).contrlRect.right - (**theControl).contrlRect.left ; + rec->height = (**theControl).contrlRect.bottom - (**theControl).contrlRect.top ; + rec->baseLine = 0; + } + case kControlMsgFocus : + { + if ( param == kControlFocusNoPart ) + { + info->hasFocus = false ; + TEDeactivate( macTE ) ; + return kControlFocusNoPart ; + } + else if ( param == kControlFocusNextPart || param == kControlFocusPrevPart ) + { + if ( info->hasFocus ) + { + info->hasFocus = false ; + TEDeactivate( macTE ) ; + return kControlFocusNoPart ; + } + else + { + info->hasFocus = true ; + TEActivate( macTE ) ; + return kControlEditTextPart ; + } + } + else if ( param == kControlEditTextPart ) + { + if ( !info->hasFocus ) + { + info->hasFocus = true ; + TEActivate( macTE ) ; + return kControlEditTextPart ; + } + } + } + break ; + case kControlMsgIdle : + { + TEIdle( macTE ) ; + } + break ; + case kControlMsgKeyDown : + { + AGAPortHelper help() ; + AGASetFontStyle( &info->fontStyle ) ; + SetPort( (**theControl).contrlOwner ) ; + RGBBackColor( &gAGARamp[ kAGAWhite ] ) ; + RGBForeColor( &gAGARamp[ kAGABlack ] ) ; + ControlKeyDownRec * rec = (ControlKeyDownRec*) param ; + TEKey( rec->charCode , macTE ) ; + } + break ; + case kControlMsgActivate : + { + /* + if ( param ) + TEActivate( macTE ) ; + else + TEDeactivate( macTE ) ; + */ + } + break ; + case calcCntlRgn : + RectRgn((RgnHandle) param , &(**theControl).contrlRect ) ; + break ; + case kControlMsgTestNewMsgSupport : + return kControlSupportsNewMessages ; + case kControlMsgGetFeatures : + return +// kControlSupportsGhosting | +// kControlSupportsEmbedding | + kControlSupportsFocus | + kControlWantsIdle | + kControlWantsActivate | +// kControlHandlesTracking | + kControlSupportsDataAccess | +// kControlHasSpecialBackground | +// kControlGetsFocusOnClick | + kControlSupportsCalcBestRect | +// kControlSupportsLiveFeedback | +// kControlHasRadioBehavior | + 0 ; + default : + break ; + } + + return 0 ; +} + +pascal SInt32 AGAListControlDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + Size result ; + ListHandle macList ; + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + + macList = (ListHandle) (**theControl).contrlData ; + + static inLoop = false ; + static lastClick = NULL ; + + switch( message ) + { + case initCntl : + { + Rect databounds = { 0,0,0,0} ; + Point cellsize = { 0,0} ; + Rect listBounds = (**theControl).contrlRect ; + + InsetRect( &listBounds , 1 , 1 ) ; + + macList = LNew( &listBounds , &databounds , cellsize , 128 , + (**theControl).contrlOwner , false /*drawit*/ , false /*hasGrow*/, + false /* horzScroll */, true /*vertScroll*/ ) ; + (**theControl).contrlData = (Handle) macList ; + info->privateData = NULL ; + } + break ; + case dispCntl : + (**macList).vScroll = NULL ; // will be disposed by the window itself + (**macList).hScroll = NULL ; // will be disposed by the window itself + LDispose( macList ) ; + break ; + case calcCntlRgn : + RectRgn((RgnHandle) param , &(**theControl).contrlRect ) ; + break ; + case testCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + Rect listRect ; + Rect allRect = (**theControl).contrlRect ; + listRect = allRect ; + if ( !inLoop ) + allRect.right += 16 ; + if ( PtInRect( pt , &allRect ) ) + { + if ( !inLoop && StillDown() ) + { + inLoop = true ; + LActivate( true , macList ) ; + Boolean doubleClick = LClick( pt , 0 /* todo modifiers*/ , macList ) ; + info->privateData = doubleClick ; + inLoop = false ; + } + return kControlListBoxPart ; + } + else + return NULL ; + } + break ; + case drawCntl : + { + AGAPortHelper help() ; + AGASetFontStyle( &info->fontStyle ) ; + RGBBackColor( &gAGARamp[ kAGAWhite ] ) ; + EraseRect( &(**theControl).contrlRect ) ; + FrameRect( &(**theControl).contrlRect ) ; + RgnHandle controlRgn = NewRgn() ; + SetRectRgn( controlRgn, (**theControl).contrlRect.left , + (**theControl).contrlRect.top, + (**theControl).contrlRect.right, + (**theControl).contrlRect.bottom ) ; + LUpdate( controlRgn, macList ) ; + } + break ; + case posCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + Rect listRect ; + Rect allRect = (**theControl).contrlRect ; + listRect = allRect ; + allRect.right += 16 ; + if ( PtInRect( pt , &listRect ) ) + { + if ( !inLoop && StillDown() ) + { + inLoop = true ; + LActivate( true , macList ) ; + Boolean doubleClick = LClick( pt , 0 /* todo modifiers*/ , macList ) ; + info->privateData = doubleClick ; + inLoop = false ; + } + return kControlListBoxPart ; + } + else if ( PtInRect( pt , &allRect ) ) + { + if ( !inLoop && StillDown() ) + { + inLoop = true ; + // LActivate( true , macList ) ; + Boolean doubleClick = LClick( pt , 0 /* todo modifiers*/ , macList ) ; + info->privateData = doubleClick ; + inLoop = false ; + } + return kControlPageDownPart ; + } + else + return NULL ; + } + break ; + case kControlMsgGetData : + { + ControlDataAccessRec *rec = (ControlDataAccessRec *) param ; + if ( rec->tag == kControlListBoxListHandleTag ) + { + return AGAGetDataHelper( rec , sizeof( ListHandle ) , (char*) &macList ) ; + } + else if ( rec->tag == kControlListBoxDoubleClickTag ) + { + Boolean doubleClick = info->privateData ; + return AGAGetDataHelper( rec , sizeof( Boolean ) , (char*) &doubleClick ) ; + } + return errDataNotSupported ; + } + break ; + default : + break ; + } + + return 0 ; +} + +OSErr AGACreateRootControl (WindowPtr inWindow, + ControlHandle * outControl) +{ + ControlHandle theControl = NULL ; + + SInt16 extCDEFID = kExtCDEFID << 4 + 0 ; + + theControl = NewControl( inWindow , &inWindow->portRect , "\p" , true , + 0 , 0 , 1 , extCDEFID , 0 ) ; + NewExtCDEFInfo( theControl , AGARootControlDefProc , kAGARootControlProcID , 0 ) ; + + *outControl = theControl ; + return noErr ; +} + +OSErr AGAEmbedControl (ControlHandle inControl, + ControlHandle inContainer) +{ + if ( AGATestForNewControl( inControl ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + info->containerControl = inContainer ; + } + return noErr ; +} + +void AGADrawControl( ControlHandle control ) +{ + DrawOneControl( control ) ; + ControlHandle iter = (ControlHandle) ((WindowPeek)(**control).contrlOwner)->controlList ; + while ( iter ) + { + if ( AGATestForNewControl( iter ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**iter).contrlRfCon ; + if ( info->containerControl == control ) + { + AGADrawControl( iter ) ; + } + } + + iter = (**iter).nextControl ; + } +} + + +ControlHandle AGANewControl(WindowPtr owningWindow, + const Rect * bounds, + ConstStr255Param controlTitle, + Boolean initiallyVisible, + SInt16 initialValue, + SInt16 minimumValue, + SInt16 maximumValue, + SInt16 procID, + SInt32 controlReference) +{ + ControlHandle theControl = NULL ; + Rect boundsRect = *bounds ; + SInt16 extCDEFID = kExtCDEFID << 4 + 0 ; + SInt16 oldProcID = extCDEFID ; + switch( procID ) + { + case kControlScrollBarProc : + case kControlScrollBarLiveProc : + oldProcID = scrollBarProc ; + break ; + case kControlListBoxProc : + initialValue = 0 ; + default : + break ; + } + if ( oldProcID == extCDEFID && procID == kControlListBoxProc ) + { + boundsRect.right -= 16 ; + } + theControl = NewControl( owningWindow , &boundsRect , controlTitle , initiallyVisible , + initialValue , minimumValue , maximumValue , oldProcID , controlReference ) ; + if ( oldProcID == extCDEFID ) + { + ControlDefProcPtr theProcPtr = NULL ; + SInt16 theVarCode = 0 ; + switch( procID ) + { + case kControlPushButtonProc : + theProcPtr = AGAButtonDefProc ; + break ; + case kControlCheckBoxProc : + theProcPtr = AGACheckBoxDefProc ; + break ; + case kControlRadioButtonProc : + theProcPtr = AGARadioButtonDefProc ; + break ; + case kControlProgressBarProc : + theProcPtr = AGAProgressBarDefProc ; + break ; + case kControlPlacardProc : + theProcPtr = AGAPlacardDefProc ; + break ; + case kControlStaticTextProc : + theProcPtr = AGAStaticTextDefProc ; + break ; + case kControlListBoxProc : + theProcPtr = AGAListControlDefProc ; + break ; + case kControlEditTextProc : + theProcPtr = AGAEditTextDefProc ; + break ; + case kControlGroupBoxTextTitleProc : + theProcPtr = AGAStaticGroupBoxTextDefProc ; + break ; + case kControlBevelButtonNormalBevelProc : + theProcPtr = AGABevelButtonDefProc ; + break ; + } + + if ( theProcPtr ) + { + NewExtCDEFInfo( theControl , theProcPtr , procID , controlReference ) ; + } + } + return theControl ; +} + +void AGASetThemeWindowBackground (WindowRef inWindow, + ThemeBrush inBrush, + Boolean inUpdate) +{ + GrafPtr port ; + GetPort( &port ) ; + SetPort( inWindow ) ; + if ( inBrush == kThemeBrushDialogBackgroundActive ) + { + gAGABackgroundColor = 2 ; + } + else + { + gAGABackgroundColor = 0 ; + } + RGBBackColor( &gAGAColorArray[gAGABackgroundColor] ) ; + SetPort( port ) ; +} + + diff --git a/src/mac/carbon/aga.cpp b/src/mac/carbon/aga.cpp new file mode 100644 index 0000000000..40abb5cbb9 --- /dev/null +++ b/src/mac/carbon/aga.cpp @@ -0,0 +1,2581 @@ +#include <wx/mac/uma.h> +#include <wx/mac/aga.h> +#include <extcdef.h> +#include <PictUtils.h> + +pascal SInt32 AGAProgressBarDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param); +pascal SInt32 AGAPlacardDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param); +pascal SInt32 AGAStaticTextDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) ; +pascal SInt32 AGAListControlDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) ; +pascal SInt32 AGAEditTextDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) ; +pascal SInt32 AGAStaticGroupBoxTextDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) ; + +#define B 13 +#define W 0 + +SInt16 kAGARootControlProcID ; +int gAGABackgroundColor = 0 ; + +const RGBColor gAGAColorArray[] = { {0xFFFF, 0xFFFF, 0xFFFF}, // W + {0xEEEE, 0xEEEE, 0xEEEE}, // 1 + {0xDDDD, 0xDDDD, 0xDDDD}, // 2 + {0xCCCC, 0xCCCC, 0xCCCC}, // 3 + {0xBBBB, 0xBBBB, 0xBBBB}, // 4 + {0xAAAA, 0xAAAA, 0xAAAA}, // 5 + {0x9999, 0x9999, 0x9999}, // 6 + {0x8888, 0x8888, 0x8888}, // 7 + {0x7777, 0x7777, 0x7777}, // 8 + {0x6666, 0x6666, 0x6666}, // 9 + {0x5555, 0x5555, 0x5555}, // 10 + {0x4444, 0x4444, 0x4444}, // 11 + {0x2222, 0x2222, 0x2222}, // 12 + {0x0000, 0x0000, 0x0000} // B + }; + +char LAGADefaultOutline_mCorners[4][5][5] = { + // topleft + { + { -1, -1, -1, 12, B }, + { -1, -1, B, 2, 2 }, + { -1, B, 2, 2, 5 }, + { 12, 2, 2, 2, 8 }, + { B, 2, 5, 8, -1 } + }, + // topright + { + { B, 12, -1, -1, -1 }, + { 2, 3, B, -1, -1 }, + { 5, 5, 4, B, -1 }, + { 8, 5, 5, 7, 12 }, + { -1, 8, 5, 8, B } + }, + // bottomleft + { + { B, 2, 5, 8, -1 }, + { 12, 3, 5, 5, 8 }, + { -1, B, 4, 5, 5 }, + { -1, -1, B, 7, 8 }, + { -1, -1, -1, 12, B } + }, + // bottomright + { + { -1, 8, 5, 8, B }, + { 8, 5, 7, 8, 12 }, + { 5, 7, 8, B, -1 }, + { 8, 8, B, -1, -1 }, + { B, 12, -1, -1, -1 } + } + }; + +char LAGAPushButton_mCorners[3][4][4][4] = { + // Enabled + { + // topleft + { + { -1, -1, 12, B }, + { -1, B, 4, 2 }, + { 12, 4, W, W }, + { B, 2, W, W } + }, + // topright + { + { B, 12, -1, -1 }, + { 2, 4, B, -1 }, + { W, 2, 5, 12 }, + { 2, 5, 8, B } + }, + // bottomleft + { + { B, 2, W, 2 }, + { 12, 4, 2, 5 }, + { -1, B, 4, 8 }, + { -1, -1, 12, B } + }, + // bottomright + { + { 5, 5, 8, B }, + { 5, 8, 8, 12 }, + { 8, 8, B, -1 }, + { B, 12, -1, -1 } + } + }, + // Pressed + { + // topleft + { + { -1, -1, 12, B }, + { -1, B, 10, 8 }, + { 12, 10, 8, 4 }, + { B, 8, 4, 4 } + }, + // topright + { + { B, 12, -1, -1 }, + { 8, 10, B, -1 }, + { 4, 4, 8, 12 }, + { 4, 4, 4, B } + }, + // bottomleft + { + { B, 8, 4, 4 }, + { 12, 10, 4, 4 }, + { -1, B, 10, 4 }, + { -1, -1, 12, B } + }, + // bottomright + { + { 4, 4, 4, B }, + { 4, 4, 10, 12 }, + { 4, 10, B, -1 }, + { B, 12, -1, -1 } + } + }, + // Disabled + { + // topleft + { + { -1, -1, 7, 7 }, + { -1, 7, 4, 2 }, + { 7, 4, 1, 1 }, + { 7, 2, 1, 1 } + }, + // topright + { + { 7, 7, -1, -1 }, + { 2, 4, 7, -1 }, + { 1, 2, 4, 7 }, + { 2, 4, 5, 7 } + }, + // bottomleft + { + { 7, 2, 1, 2 }, + { 7, 4, 2, 4 }, + { -1, 7, 4, 5 }, + { -1, -1, 7, 7 } + }, + // bottomright + { + { 4, 4, 5, 7 }, + { 4, 5, 5, 7 }, + { 5, 5, 7, -1 }, + { 7, 7, -1, -1 } + } + } + }; + +RGBColor gAGARamp[] = +{ + /* black */ + { 0 , 0 , 0 } , + /* white */ + { 65535 , 65535 , 65535 } , + /* 1 */ + { 61166 , 61166 , 61166 } , + /* 2 */ + { 56797 , 56797 , 56797 } , + /* 3 */ + { 52428 , 52428 , 52428 } , + /* 4 */ + { 48059 , 48059 , 48059 } , + /* 5 */ + { 43690 , 43690 , 43690 } , + /* 6 */ + { 39321 , 39321 , 39321 } , + /* 7 */ + { 34952 , 34952 , 34952 } , + /* 8 */ + { 30583 , 30583 , 30583 } , + /* 9 */ + { 26214 , 26214 , 26214 } , + /* 10 */ + { 21845 , 21845 , 21845 } , + /* 11 */ + { 17476 , 17476 , 17476 } , + /* 12 */ + { 13107 , 13107 , 13107 } , + /* A1 */ + { 8738 , 8738 , 8738 } , + /* A2 */ + { 4369 , 4369 , 4369 } , + +} ; + +RGBColor gAGABlueRamp[] = +{ + /* black */ + { 0 , 0 , 0 } , + /* white */ + { 65535 , 65535 , 65535 } , + /* 1 */ + { 61166 , 61166 , 65535 } , + /* 2 */ + { 56797 , 56797 , 65535 } , + /* 3 */ + { 52428 , 52428 , 65535 } , + /* 4 */ + { 48059 , 48059 , 65535 } , + /* 5 */ + { 43690 , 43690 , 65535 } , + /* 6 */ + { 39321 , 39321 , 65535 } , + /* 7 */ + { 34952 , 34952 , 65535 } , + /* 8 */ + { 30583 , 30583 , 65535 } , + /* 9 */ + { 26214 , 26214 , 65535 } , + /* 10 */ + { 21845 , 21845 , 65535 } , + /* 11 */ + { 17476 , 17476 , 65535 } , + /* 12 */ + { 13107 , 13107 , 65535 } , + /* A1 */ + { 8738 , 8738 , 65535 } , + /* A2 */ + { 4369 , 4369 , 65535 } , + +} ; + +enum eAGARampColor { + kAGATransparent = -1 , + kAGABlack = 0 , + kAGAWhite = 1 , + kAGA1 = 2 , + kAGA2 = 3 , + kAGA3 = 4 , + kAGA4 = 5 , + kAGA5 = 6 , + kAGA6 = 7 , + kAGA7 = 8 , + kAGA8 = 9 , + kAGA9 = 10 , + kAGA10 = 11 , + kAGA11 = 12 , + kAGA12 = 13 , + kAGAA1 = 14 , + kAGAA2 = 15 , +} ; +// defprocs + +enum eAGAState { + kAGAStateEnabled = 0 , + kAGAStatePressed = 1 , + kAGAStateDisabled = 2 , + kAGAStateInactive = 3 +} ; + +/* +typedef struct sControlData +{ + ControlPartCode m_part ; + ResType m_tag ; + Size m_size ; +} ; + +OSErr AGAFindControlData( ControlHandle inControl , ControlPartCode inPart , ResType inTagName , long *outOffset) ; +OSErr AGAFindControlData( ControlHandle inControl , ControlPartCode inPart , ResType inTagName , long *outOffset) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + long offset = 0 ; + long size = GetHandleSize( info->data ) ; + char* data = *(info->data) ; + sControlData* current ; + while( offset + sizeof( sControlData ) <= size ) + { + current = (sControlData*) (data+offset ) ; + if ( ( inPart == kControlEntireControl || inPart == current->m_part ) && inTagName == current->m_tag ) + { + *outOffset = offset ; + return noErr ; + } + } + return errDataNotSupported ; // nothing found +} + +OSErr AGARemoveControlData( ControlHandle inControl , ControlPartCode inPart , ResType inTagName ) ; +OSErr AGARemoveControlData( ControlHandle inControl , ControlPartCode inPart , ResType inTagName ) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + long offset = 0 ; + long size = GetHandleSize( info->data ) ; + char* data = *(info->data) ; + sControlData* current ; + while( offset + sizeof( sControlData ) <= size ) + { + current = (sControlData*) (data+offset ) ; + if ( ( inPart == kControlEntireControl || inPart == current->m_part ) && inTagName == current->m_tag ) + { + long chunkSize = current->m_size + sizeof ( sControlData ) ; + memcpy( data + offset , data + offset + chunkSize , size - offset - chunkSize ) ; + SetHandleSize( info->data , size - chunkSize ) ; + return noErr ; + } + } + return noErr ; +} + +OSErr AGAAddControlData( ControlHandle inControl , ControlPartCode inPart , ResType inTagName , Size inSize, Ptr inData) ; +OSErr AGAAddControlData( ControlHandle inControl , ControlPartCode inPart , ResType inTagName , Size inSize, Ptr inData) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + long offset = 0 ; + long size = GetHandleSize( info->data ) ; + SetHandleSize( info->data , size + sizeof( sControlData ) + inSize ) ; + if ( MemError() == noErr ) + { + char* data = *(info->data) ; + sControlData* current = (sControlData*)( data + size ) ; + current->m_tag = inTagName ; + current->m_part = inPart ; + current->m_size = inSize ; + memcpy( data + size + sizeof( sControlData ) , inData , inSize ) ; + return noErr ; + } + return errDataNotSupported ; +} + + +OSErr AGAGetControlDataSize (ControlHandle inControl, + ControlPartCode inPart, + ResType inTagName, + Size * outMaxSize) +{ + long offset ; + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + char* data = *(info->data) ; + + OSErr err = AGAFindControlData( inControl , inPart , inTagName , &offset ) ; + if ( !err ) + { + sControlData* current = (sControlData*) (data+offset ) ; + *outMaxSize = current->m_size ; + } + return err ; +} + +OSErr AGAGetControlData (ControlHandle inControl, + ControlPartCode inPart, + ResType inTagName, + Size inBufferSize, + Ptr outBuffer, + Size * outActualSize) +{ + long offset ; + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + char* data = *(info->data) ; + + OSErr err = AGAFindControlData( inControl , inPart , inTagName , &offset ) ; + if ( !err ) + { + sControlData* current = (sControlData*) (data+offset ) ; + *outActualSize = current->m_size ; + if ( outBuffer ) + { + if ( inBufferSize <= current->m_size ) + memcpy( outBuffer , data + offset + sizeof( sControlData ) , current->m_size ) ; + else + err = errDataNotSupported ; + } + } + return err ; +} + +OSErr AGASetControlData (ControlHandle inControl, + ControlPartCode inPart, + ResType inTagName, + Size inSize, + Ptr inData) +{ + long offset ; + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + char* data = *(info->data) ; + + OSErr err = AGAFindControlData( inControl , inPart , inTagName , &offset ) ; + if ( !err ) + { + sControlData* current = (sControlData*) (data+offset ) ; + if ( current->m_size == inSize ) + { + memcpy( data + offset + sizeof( sControlData ) , inData , inSize) ; + } + else + { + AGARemoveControlData( inControl , inPart , inTagName ) ; + AGAAddControlData( inControl , inPart , inTagName , inSize , inData ) ; + } + } + else + { + AGAAddControlData( inControl , inPart , inTagName , inSize , inData ) ; + } + return err ; +} +*/ + +OSErr AGASetControlFontStyle (ControlHandle inControl, + const ControlFontStyleRec * inStyle) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + if ( inStyle->flags == 0 ) + { + // back to defaults + } + else + { + if ( inStyle->flags & kControlUseFontMask ) + { + info->fontStyle.font = inStyle->font ; + } + if ( inStyle->flags & kControlUseSizeMask ) + { + info->fontStyle.size = inStyle->size ; + } + if ( inStyle->flags & kControlUseFaceMask ) + { + info->fontStyle.style = inStyle->style ; + } + if ( inStyle->flags & kControlUseModeMask ) + { + info->fontStyle.mode = inStyle->mode ; + } + if ( inStyle->flags & kControlUseJustMask ) + { + info->fontStyle.just = inStyle->just ; + } + if ( inStyle->flags & kControlUseForeColorMask ) + { + info->fontStyle.foreColor = inStyle->foreColor ; + } + if ( inStyle->flags & kControlUseBackColorMask ) + { + info->fontStyle.backColor = inStyle->backColor ; + } + } + return noErr ; +} + +OSErr AGASetControlData (ControlHandle inControl, + ControlPartCode inPart, + ResType inTagName, + Size inSize, + Ptr inData) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + ControlDataAccessRec rec ; + + rec.tag = inTagName ; + rec.part = inPart ; + rec.size = inSize ; + rec.dataPtr = inData ; + + return info->defProc( info->procID , inControl , kControlMsgSetData , (long) &rec ) ; +} + +SInt16 AGAHandleControlKey (ControlHandle inControl, + SInt16 inKeyCode, + SInt16 inCharCode, + SInt16 inModifiers) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + ControlKeyDownRec rec ; + + rec.modifiers = inModifiers ; + rec.keyCode = inKeyCode ; + rec.charCode = inCharCode ; + + return info->defProc( info->procID , inControl , kControlMsgKeyDown , (long) &rec ) ; +} + +ControlPartCode AGAHandleControlClick (ControlHandle inControl, + Point inWhere, + SInt16 inModifiers, + ControlActionUPP inAction) +{ + return TrackControl( inControl , inWhere , inAction ) ; +} + +Boolean AGATestForNewControl( ControlHandle inControl ) +{ + if ( (**inControl).contrlRfCon > 0x100 && !( (**inControl).contrlRfCon % 2 ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + return info->magic == kExtCDEFMagic ; + } + return FALSE ; +} +void AGAIdleControls (WindowPtr inWindow) +{ + ControlHandle iter = (ControlHandle) ((WindowPeek)inWindow)->controlList ; + while ( iter ) + { + if ( AGATestForNewControl( iter ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**iter).contrlRfCon ; + if ( info->defProc( info->procID , iter , kControlMsgTestNewMsgSupport , 0 ) == kControlSupportsNewMessages ) + { + if ( info->defProc( info->procID , iter , kControlMsgGetFeatures , 0 ) & kControlWantsIdle ) + { + info->defProc( info->procID , iter , kControlMsgIdle , 0 ) ; + } + } + } + + iter = (**iter).nextControl ; + } +} + +void AGAUpdateOneControl( ControlHandle control , RgnHandle inRgn ) +{ + DrawOneControl( control ) ; + ControlHandle iter = (ControlHandle) ((WindowPeek)(**control).contrlOwner)->controlList ; + while ( iter ) + { + if ( AGATestForNewControl( iter ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**iter).contrlRfCon ; + if ( info->containerControl == control ) + { + AGAUpdateOneControl( iter , inRgn ) ; + } + } + + iter = (**iter).nextControl ; + } +} + +void AGAUpdateControls( WindowPtr inWindow , RgnHandle inRgn ) +{ + ControlHandle root ; + AGAGetRootControl( inWindow , &root ) ; + AGAUpdateOneControl( root , inRgn ) ; + + // and then all others + + ControlHandle iter = (ControlHandle) ((WindowPeek)inWindow)->controlList ; + while ( iter ) + { + if ( AGATestForNewControl( iter ) ) + { + } + else + { + DrawOneControl( iter ) ; + } + + iter = (**iter).nextControl ; + } +} + +OSErr AGAGetRootControl( WindowPtr inWindow , ControlHandle *outControl ) +{ + ControlHandle iter = (ControlHandle) ((WindowPeek)inWindow)->controlList ; + while ( iter ) + { + if ( AGATestForNewControl( iter ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**iter).contrlRfCon ; + if ( info->procID == kAGARootControlProcID ) + { + *outControl = iter ; + return noErr ; + } + } + + iter = (**iter).nextControl ; + } + return -1 ; +} + +void AGADeactivateControl( ControlHandle inControl ) +{ + if ( AGATestForNewControl( inControl ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + if ( info->defProc( info->procID , inControl , kControlMsgTestNewMsgSupport , 0 ) == kControlSupportsNewMessages ) + { + if ( info->defProc( info->procID , inControl , kControlMsgGetFeatures , 0 ) & kControlWantsActivate ) + { + info->defProc( info->procID , inControl , kControlMsgActivate , 0 ) ; + } + } + } +} + +void AGAActivateControl( ControlHandle inControl ) +{ + if ( AGATestForNewControl( inControl ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + if ( info->defProc( info->procID , inControl , kControlMsgTestNewMsgSupport , 0 ) == kControlSupportsNewMessages ) + { + if ( info->defProc( info->procID , inControl , kControlMsgGetFeatures , 0 ) & kControlWantsActivate ) + { + info->defProc( info->procID , inControl , kControlMsgActivate , 1 ) ; + } + } + } +} + +OSErr AGASetKeyboardFocus (WindowPtr inWindow, + ControlHandle inControl, + ControlFocusPart inPart) +{ + if ( AGATestForNewControl( inControl ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + if ( info->defProc( info->procID , inControl , kControlMsgTestNewMsgSupport , 0 ) == kControlSupportsNewMessages ) + { + if ( info->defProc( info->procID , inControl , kControlMsgGetFeatures , 0 ) & kControlSupportsFocus ) + { + return info->defProc( info->procID , inControl , kControlMsgFocus , inPart ) ; + } + } + } + return errControlDoesntSupportFocus ; +} + +OSErr AGAGetBestControlRect (ControlHandle inControl, + Rect * outRect, + SInt16 * outBaseLineOffset) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + ControlCalcSizeRec rec ; + rec.width = (**inControl).contrlRect.right - (**inControl).contrlRect.left ; + rec.height = (**inControl).contrlRect.bottom - (**inControl).contrlRect.top ; + rec.baseLine = 0; + + OSErr err = info->defProc( info->procID , inControl , kControlMsgCalcBestRect , (long) &rec ) ; + if ( !err ) + { + outRect->left = outRect->top = 0 ; + outRect->right = rec. width ; + outRect->bottom = rec. height ; + *outBaseLineOffset = rec. baseLine ; + } + return err ; +} + + +OSErr AGAGetControlData (ControlHandle inControl, + ControlPartCode inPart, + ResType inTagName, + Size inBufferSize, + Ptr outBuffer, + Size * outActualSize) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + ControlDataAccessRec rec ; + + rec.tag = inTagName ; + rec.part = inPart ; + rec.size = inBufferSize ; + rec.dataPtr = outBuffer ; + + OSErr err = info->defProc( info->procID , inControl , kControlMsgGetData , (long) &rec ) ; + *outActualSize = rec.size ; + return err ; +} + +OSErr AGAGetControlDataSize (ControlHandle inControl, + ControlPartCode inPart, + ResType inTagName, + Size * outMaxSize) +{ + return AGAGetControlData( inControl , inPart , inTagName , 0 , NULL , outMaxSize ) ; +} + + +void NewExtCDEFInfo( ControlHandle theControl , ControlDefProcPtr defproc , SInt16 procID , long refcon ) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) malloc( sizeof( ExtCDEFInfo ) ) ; + info->defProc = defproc ; + info->hasFocus = false ; + info->magic = kExtCDEFMagic ; + info->contrlRfCon = refcon ; + info->procID = procID ; + info->containerControl = NULL ; + info->children = NewHandle(0) ; + info->fontStyle.flags = 0 ; + info->fontStyle.font = 0 ; + info->fontStyle.size = 12 ; + info->fontStyle.style = 0 ; + info->fontStyle.mode = 0 ; + info->fontStyle.just = 0 ; + info->fontStyle.foreColor = gAGARamp[ kAGABlack ] ; + info->fontStyle.backColor = gAGARamp[ kAGA2 ] ; + (**theControl).contrlRfCon = (long) info ; + defproc( info->procID, theControl, initCntl, 0) ; +} + +void DisposeExtCDEFInfo( ControlHandle theControl) +{ + if ( AGATestForNewControl( theControl ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + if ( info ) + { + DisposeHandle( info->children ) ; + info->children = NULL ; + free( (void*) (**theControl).contrlRfCon ) ; + } + } +} + +const short kAGAProgressHeight = 14 ; + +void AGADrawRectPlacard( const Rect *inRect , eAGAState inState , bool fill = false ) ; +void AGADrawRectProgress( const Rect *inRect , eAGAState inState , double percentage ) ; + +void AGADrawRectPlacard( const Rect *inRect , eAGAState inState , bool fill ) +{ + Rect rect = *inRect ; + RGBColor pixelColor ; + if ( inState == kAGAStateInactive ) + { + RGBForeColor( &gAGARamp[ kAGA10 ] ) ; + FrameRect( &rect ) ; + if ( fill ) + { + InsetRect( &rect , 1 , 1 ) ; + RGBForeColor( &gAGARamp[ kAGA1 ] ) ; + PaintRect( &rect ) ; + } + return ; + } + + RGBForeColor( &gAGARamp[ kAGABlack ] ) ; + FrameRect( &rect ) ; + InsetRect( &rect , 1 , 1 ) ; + + if ( inState == kAGAStateEnabled || inState == kAGAStateDisabled ) + RGBForeColor( &gAGARamp[ kAGAWhite ] ) ; + else + RGBForeColor( &gAGARamp[ kAGABlack ] ) ; + + MoveTo( rect.left , rect.bottom - 1 -1 ) ; + LineTo( rect.left , rect.top ) ; + LineTo( rect.right-1-1 , rect.top ) ; + + if ( inState == kAGAStateEnabled || inState == kAGAStateDisabled ) + pixelColor = gAGARamp[ kAGA2 ] ; + else + pixelColor = gAGARamp[ kAGA8 ] ; + + SetCPixel( rect.right-1 , rect.top , &pixelColor ) ; + SetCPixel( rect.left , rect.bottom-1 , &pixelColor ) ; + + if ( inState == kAGAStateEnabled ) + RGBForeColor( &gAGARamp[ kAGA5 ] ) ; + else if ( inState == kAGAStateDisabled ) + RGBForeColor( &gAGARamp[ kAGA4 ] ) ; + else + RGBForeColor( &gAGARamp[ kAGA6 ] ) ; + + MoveTo( rect.left + 1 , rect.bottom-1 ) ; + LineTo( rect.right-1 , rect.bottom-1 ) ; + LineTo( rect.right-1 , rect.top-1 ) ; + + if ( fill ) + { + InsetRect( &rect , 1 , 1 ) ; + if ( inState == kAGAStateEnabled || inState == kAGAStateDisabled ) + RGBForeColor( &gAGARamp[ kAGA2 ] ) ; + else + RGBForeColor( &gAGARamp[ kAGA8 ] ) ; + PaintRect( &rect ) ; + } +} + +void AGADrawRectProgress( const Rect *inRect , eAGAState inState , double percentage ) +{ + Rect rect = *inRect ; + rect.bottom = rect.top + 14 ; + RGBColor pixelColor ; + + RGBForeColor( &gAGARamp[ kAGA5 ]) ; + MoveTo( rect.left , rect.bottom - 1 -1 ) ; + LineTo( rect.left , rect.top ) ; + LineTo( rect.right-1-1 , rect.top ) ; + + RGBForeColor( &gAGARamp[ kAGAWhite ] ) ; + MoveTo( rect.left + 1 , rect.bottom -1 ) ; + LineTo( rect.right-1 , rect.bottom -1 ) ; + LineTo( rect.right-1 , rect.top-1 ) ; + + InsetRect( &rect , 1 , 1 ) ; + RGBForeColor( &gAGARamp[ kAGABlack ] ) ; + + Rect barLeft = rect , barRight = rect ; + + int position = percentage * ( rect.right - rect.left ) ; + barLeft.right = barLeft.left + position ; + barRight.left = barLeft.left + position ; + FrameRect( &barLeft ) ; + FrameRect( &barRight ) ; + + InsetRect( &barLeft , 1 , 1 ) ; + + InsetRect( &barRight , 1 , 1 ) ; + + if ( !EmptyRect( &barRight ) ) + { + RGBForeColor( &gAGARamp[ kAGA10 ] ) ; + MoveTo( barRight.left , barRight.bottom -1 ) ; + LineTo( barRight.left , barRight.top ) ; + barRight.left += 1 ; + if ( !EmptyRect( &barRight ) ) + { + RGBForeColor( &gAGARamp[ kAGA7 ] ) ; + MoveTo( barRight.left , barRight.bottom-1 ) ; + LineTo( barRight.left , barRight.top ) ; + LineTo( barRight.right-1-1 , barRight.top ) ; + RGBForeColor( &gAGARamp[ kAGA2 ] ) ; + MoveTo( barRight.left + 1 , barRight.bottom -1 ) ; + LineTo( barRight.right-1 , barRight.bottom -1 ) ; + LineTo( barRight.right-1 , barRight.top - 1) ; + pixelColor = gAGARamp[ kAGA4 ] ; + SetCPixel( barRight.right-1 , barRight.top , &pixelColor ) ; + InsetRect( &barRight , 1 , 1) ; + if ( !EmptyRect( &barRight ) ) + { + RGBForeColor( &gAGARamp[ kAGA4 ] ) ; + PaintRect( &barRight ) ; + } + } + if ( !EmptyRect( &barLeft ) ) + { + RGBForeColor( &gAGABlueRamp[ kAGA8 ] ) ; + MoveTo( barLeft.left , barLeft.bottom -1 ) ; + LineTo( barLeft.left , barLeft.top ) ; + LineTo( barLeft.left+1 , barLeft.top ) ; + RGBForeColor( &gAGABlueRamp[ kAGA12 ] ) ; + MoveTo( barLeft.left + 2, barLeft.bottom-1 ) ; + LineTo( barLeft.right-1 , barLeft.bottom-1 ) ; + LineTo( barLeft.right-1 , barLeft.top -1 ) ; + RGBForeColor( &gAGABlueRamp[ kAGA10 ] ) ; + MoveTo( barLeft.left + 2, barLeft.top ) ; + LineTo( barLeft.right-1 , barLeft.top ) ; + pixelColor = gAGABlueRamp[ kAGA10] ; + SetCPixel( barLeft.left + 1, barLeft.bottom-1 , &pixelColor ) ; + InsetRect( &barLeft , 1 , 1 ) ; + if ( !EmptyRect( &barLeft ) ) + { + // do more here + RGBForeColor( &gAGABlueRamp[ kAGA3 ] ) ; + PaintRect( &barLeft ) ; + } + } + } +} + +SInt32 AGAGetDataHelper( ControlDataAccessRec *rec , Size size , Ptr data ) ; +SInt32 AGAGetDataHelper( ControlDataAccessRec *rec , Size size , Ptr data ) +{ + if ( rec->dataPtr == NULL ) + { + rec->size = size ; + return noErr ; + } + else + { + if ( rec->size < size ) + return errDataSizeMismatch ; + + rec->size = size ; + memcpy( rec->dataPtr , data , size ) ; + return noErr ; + } +} + +void AGASetFontStyle( ControlFontStyleRec *fontstyle ) ; +void AGASetFontStyle( ControlFontStyleRec *fontstyle ) +{ + if( fontstyle->font >= 0 ) + { + ::TextFont( fontstyle->font ) ; + ::TextSize( fontstyle->size ) ; + ::TextFace( fontstyle->style ) ; + } + else + { + switch( fontstyle->font ) + { + case kControlFontBigSystemFont : + ::TextFont( systemFont ) ; + ::TextSize( 12 ) ; + ::TextFace( 0 ) ; + break ; + case kControlFontSmallSystemFont : + ::TextFont( kFontIDGeneva ) ; + ::TextSize( 10 ) ; + ::TextFace( 0 ) ; + break ; + case kControlFontSmallBoldSystemFont : + ::TextFont( kFontIDGeneva ) ; + ::TextSize( 10 ) ; + ::TextFace( bold ) ; + break ; + } + } + ::RGBForeColor( &fontstyle->foreColor ) ; + ::RGBBackColor( &fontstyle->backColor ) ; +} ; + +class AGAPortHelper +{ +public : + AGAPortHelper() + { + GetPenState( &oldPenState ) ; + GetBackColor( &oldBackColor ) ; + GetForeColor( &oldForeColor ) ; + + GetPort( &port ) ; + clip = NewRgn() ; + GetClip( clip ); + font = port->txFont; + size = port->txSize; + style = port->txFace; + mode = port->txMode; + + } + ~AGAPortHelper() + { + SetPort( port ) ; + SetClip( clip ) ; + DisposeRgn( clip ) ; + RGBForeColor(&oldForeColor); + RGBBackColor(&oldBackColor); + SetPenState(&oldPenState); + + TextFont( font ); + TextSize( size ); + TextFace( style ); + TextMode( mode ); + } + +private : + GrafPtr port ; + PenState oldPenState ; + RGBColor oldForeColor ; + RGBColor oldBackColor ; + RgnHandle clip ; + short font ; + short size ; + short style ; + short mode ; +} ; + +pascal SInt32 AGAProgressBarDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + switch( message ) + { + case drawCntl : + { + if (!(**theControl).contrlVis) + return 0 ; + PenState oldPenState; + RGBColor oldForeColor ; + RGBColor oldBackColor ; + RGBColor backColor ; + RGBColor foreColor ; + + GetPenState( &oldPenState ) ; + GetBackColor( &oldBackColor ) ; + GetForeColor( &oldForeColor ) ; + + { + int theValue = GetControlValue(theControl) ; + int theMinimum = GetControlMinimum(theControl) ; + int theMaximum = GetControlMaximum(theControl) ; + + AGADrawRectProgress( &(**theControl).contrlRect , kAGAStateEnabled , (( double )( theValue - theMinimum )) / ( theMaximum-theMinimum ) ) ; + } + + RGBForeColor(&oldForeColor); + RGBBackColor(&oldBackColor); + SetPenState(&oldPenState); + } + break ; + case calcCntlRgn : + RectRgn((RgnHandle) param , &(**theControl).contrlRect ) ; + break ; + default : + break ; + } + + return 0 ; +} + + +pascal SInt32 AGAPlacardDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + switch( message ) + { + case drawCntl : + { + if (!(**theControl).contrlVis) + return 0 ; + PenState oldPenState; + RGBColor oldForeColor ; + RGBColor oldBackColor ; + RGBColor backColor ; + RGBColor foreColor ; + + GetPenState( &oldPenState ) ; + GetBackColor( &oldBackColor ) ; + GetForeColor( &oldForeColor ) ; + + { + AGADrawRectPlacard( &(**theControl).contrlRect , kAGAStateEnabled , true ) ; + } + + RGBForeColor(&oldForeColor); + RGBBackColor(&oldBackColor); + SetPenState(&oldPenState); + } + break ; + default : + break ; + } + + return 0 ; +} + +pascal SInt32 AGABevelButtonDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + switch( message ) + { + case initCntl : + info->privateData = (long) malloc( sizeof( ControlButtonContentInfo ) ) ; + memset( (char*) info->privateData , 0 , sizeof( ControlButtonContentInfo ) ) ; + break ; + case dispCntl : + free( (void*) info->privateData ) ; + break ; + case kControlMsgSetData : + { + ControlDataAccessRec *rec = (ControlDataAccessRec *) param ; + if ( rec->tag == kControlBevelButtonContentTag ) + { + memcpy( (char*) info->privateData , rec->dataPtr , rec->size ) ; + return noErr ; + } + return errDataNotSupported ; + } + case kControlMsgCalcBestRect : + { + ControlCalcSizeRec *rec = (ControlCalcSizeRec *) param ; + rec->width = 0 ; + rec->height = 20 ; + rec->baseLine = 0; + } + break ; + case drawCntl : + { + if (!(**theControl).contrlVis) + return 0 ; + + { + AGAPortHelper help() ; + AGASetFontStyle( &info->fontStyle ) ; + Boolean mRadioBehavior = false ; + + int mValue = GetControlValue( theControl ) ; + long theValue = (mRadioBehavior ? mValue : 0); + Boolean inPushed = (**theControl).contrlHilite ; + Boolean down = inPushed || (theValue != 0); + Boolean hasColor = 1; + int mEnabled = 1 ; + int triState_Off = 3 ; + Boolean disabled = (mEnabled == triState_Off); + + Rect frame = (**theControl).contrlRect ; + + // Draw the black frame; + ::MoveTo(frame.left + 1, frame.top); + ::LineTo(frame.right - 2, frame.top); + ::MoveTo(frame.right - 1, frame.top + 1); + ::LineTo(frame.right - 1, frame.bottom - 2); + ::MoveTo(frame.right - 2, frame.bottom - 1); + ::LineTo(frame.left + 1, frame.bottom - 1); + ::MoveTo(frame.left, frame.bottom - 2); + ::LineTo(frame.left, frame.top + 1); + + // Draw the inside (w/o the Icon) + ::InsetRect(&frame, 1, 1); + if (hasColor) + { + AGASetFontStyle( &info->fontStyle ) ; + if (down) + ::RGBBackColor(&gAGAColorArray[4]); + } + ::EraseRect(&frame); + + // Draw the shadows + if (hasColor) + { + ::RGBForeColor(&gAGAColorArray[7]); + if (down) + { + ::MoveTo(frame.left, frame.bottom - 1); + ::LineTo(frame.left, frame.top); + ::LineTo(frame.right - 1, frame.top); + } + else + { + ::MoveTo(frame.right - 1, frame.top); + ::LineTo(frame.right - 1, frame.bottom - 1); + ::LineTo(frame.left, frame.bottom - 1); + ::MoveTo(frame.right - 2, frame.top + 1); + ::LineTo(frame.right - 2, frame.bottom - 2); + ::LineTo(frame.left + 1, frame.bottom - 2); + ::ForeColor(whiteColor); + ::MoveTo(frame.left, frame.bottom - 2); + ::LineTo(frame.left, frame.top); + ::LineTo(frame.right - 2, frame.top); + } + } + + // Draw the Icon + + frame = (**theControl).contrlRect ; + PictInfo theInfo ; + PicHandle thePict = ((ControlButtonContentInfo*) info->privateData)->u.picture ; + if ( thePict ) + { + GetPictInfo( thePict , &theInfo , 0 , 0 , systemMethod , 0 ) ; + Rect bitmaprect = { 0 , 0 , theInfo.sourceRect.bottom - theInfo.sourceRect.top , + theInfo.sourceRect.right - theInfo.sourceRect.left } ; + ::OffsetRect( &bitmaprect , (frame.right + frame.left)/2 - bitmaprect.right / 2 , (frame.bottom + frame.top) / 2 - bitmaprect.bottom / 2 ) ; + if (inPushed) + ::OffsetRect( &bitmaprect , 1 , 1 ) ; + ::DrawPicture( thePict , &bitmaprect ) ; + } + } + } + break ; + case testCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) ) + return kControlButtonPart ; + else + return NULL ; + } + break ; + case calcCntlRgn : + RectRgn((RgnHandle) param , &(**theControl).contrlRect ) ; + break ; + case posCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) ) + return kControlButtonPart ; + else + return NULL ; + } + break ; + default : + break ; + } + + return 0 ; +} + +pascal SInt32 AGAButtonDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + switch( message ) + { + case initCntl : + (**theControl).contrlData = NULL ; + break ; + case kControlMsgSetData : + { + ControlDataAccessRec *rec = (ControlDataAccessRec *) param ; + Boolean isDefault = *((Boolean*)rec->dataPtr ) ; + (**theControl).contrlData = (Handle) isDefault ; + return noErr ; + } + break ; + case kControlMsgCalcBestRect : + { + ControlCalcSizeRec *rec = (ControlCalcSizeRec *) param ; + rec->width = 0 ; + rec->height = 20 ; + rec->baseLine = 0; + } + break ; + case drawCntl : + { + if (!(**theControl).contrlVis) + return 0 ; + + { + AGAPortHelper help() ; + AGASetFontStyle( &info->fontStyle ) ; + Boolean mRadioBehavior = false ; + + Rect frame, tempRect; + int mValue = GetControlValue( theControl ) ; + long theValue = (mRadioBehavior ? mValue : 0); + Boolean inPushed = (**theControl).contrlHilite ; + Boolean down = inPushed || (theValue != 0); + Boolean hasColor = 1; + int mEnabled = 1 ; + int triState_Off = 3 ; + Boolean disabled = (mEnabled == triState_Off); + +// theState.Normalize(); +// CalcLocalFrameRect(frame); + frame= (**theControl).contrlRect ; + + if ( (**theControl).contrlData ) + { + InsetRect( &frame , -3 , -3 ) ; + { + ::MoveTo(frame.left + 3, frame.top); + ::LineTo(frame.right - 4, frame.top); + ::LineTo(frame.right - 1, frame.top + 3); + ::LineTo(frame.right - 1, frame.bottom - 4); + ::LineTo(frame.right - 4, frame.bottom - 1); + ::LineTo(frame.left + 3, frame.bottom - 1); + ::LineTo(frame.left, frame.bottom - 4); + ::LineTo(frame.left, frame.top + 3); + ::LineTo(frame.left + 3, frame.top); + + if (hasColor) + { + const RGBColor *col = gAGAColorArray; + for (int i = 0; i < 5; i++) + for (int j = 0; j < 5; j++) + { + if (LAGADefaultOutline_mCorners[0][i][j] != -1) + ::SetCPixel(frame.left + j, frame.top + i, &col[LAGADefaultOutline_mCorners[0][i][j]]); + if (LAGADefaultOutline_mCorners[1][i][j] != -1) + ::SetCPixel(frame.right - 5 + j, frame.top + i, &col[LAGADefaultOutline_mCorners[1][i][j]]); + if (LAGADefaultOutline_mCorners[2][i][j] != -1) + ::SetCPixel(frame.left + j, frame.bottom - 5 + i, &col[LAGADefaultOutline_mCorners[2][i][j]]); + if (LAGADefaultOutline_mCorners[3][i][j] != -1) + ::SetCPixel(frame.right - 5 + j, frame.bottom - 5 + i, &col[LAGADefaultOutline_mCorners[3][i][j]]); + } + + ::RGBForeColor(&gAGAColorArray[2]); + ::MoveTo(frame.left + 1, frame.top + 5); + ::LineTo(frame.left + 1, frame.bottom - 6); + ::MoveTo(frame.left + 5, frame.top + 1); + ::LineTo(frame.right - 6, frame.top + 1); + + ::RGBForeColor(&gAGAColorArray[5]); + ::MoveTo(frame.left + 4, frame.top + 2); + ::LineTo(frame.right - 5, frame.top + 2); + ::LineTo(frame.right - 3, frame.top + 4); + ::LineTo(frame.right - 3, frame.bottom - 5); + ::LineTo(frame.right - 5, frame.bottom - 3); + ::LineTo(frame.left + 4, frame.bottom - 3); + ::LineTo(frame.left + 2, frame.bottom - 5); + ::LineTo(frame.left + 2, frame.top + 4); + ::LineTo(frame.left + 4, frame.top + 2); + + ::RGBForeColor(&gAGAColorArray[8]); + ::MoveTo(frame.right - 2, frame.top + 5); + ::LineTo(frame.right - 2, frame.bottom - 6); + ::MoveTo(frame.left + 5, frame.bottom - 2); + ::LineTo(frame.right - 6, frame.bottom - 2); + } + } + } + + AGASetFontStyle( &info->fontStyle ) ; + frame= (**theControl).contrlRect ; + + tempRect = frame; + ::InsetRect(&tempRect, 1, 1); + if (hasColor) + { + if (down) + ::RGBBackColor(&gAGAColorArray[4]); + } + EraseRect(&tempRect); + + // Draw the frame; + if (disabled) + { + if (hasColor) + ::RGBForeColor(&gAGAColorArray[7]); + else + ::PenPat(&qd.gray); + } + ::MoveTo(frame.left + 2, frame.top); + ::LineTo(frame.right - 3, frame.top); + ::LineTo(frame.right - 1, frame.top + 2); + ::LineTo(frame.right - 1, frame.bottom - 3); + ::LineTo(frame.right - 3, frame.bottom - 1); + ::LineTo(frame.left + 2, frame.bottom - 1); + ::LineTo(frame.left, frame.bottom - 3); + ::LineTo(frame.left, frame.top + 2); + ::LineTo(frame.left + 2, frame.top); + if (disabled && !hasColor) + ::PenNormal(); + + // Draw the four corners around + if (hasColor) + { + short pattern = (disabled ? 2 : (down ? 1 : 0)); + const RGBColor *col = gAGAColorArray; + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + { + if (LAGAPushButton_mCorners[pattern][0][i][j] != -1) + ::SetCPixel(frame.left + j, frame.top + i, &col[LAGAPushButton_mCorners[pattern][0][i][j]]); + if (LAGAPushButton_mCorners[pattern][1][i][j] != -1) + ::SetCPixel(frame.right - 4 + j, frame.top + i, &col[LAGAPushButton_mCorners[pattern][1][i][j]]); + if (LAGAPushButton_mCorners[pattern][2][i][j] != -1) + ::SetCPixel(frame.left + j, frame.bottom - 4 + i, &col[LAGAPushButton_mCorners[pattern][2][i][j]]); + if (LAGAPushButton_mCorners[pattern][3][i][j] != -1) + ::SetCPixel(frame.right - 4 + j, frame.bottom - 4 + i, &col[LAGAPushButton_mCorners[pattern][3][i][j]]); + } + + if (down) + ::RGBForeColor(&gAGAColorArray[8]); + else + ::RGBForeColor(&gAGAColorArray[2]); + ::MoveTo(frame.left + 1, frame.top + 4); + ::LineTo(frame.left + 1, frame.bottom - 5); + ::MoveTo(frame.left + 4, frame.top + 1); + ::LineTo(frame.right - 5, frame.top + 1); + + if (!down) + { + if (disabled) + ::RGBForeColor(&gAGAColorArray[1]); + else + ::ForeColor(whiteColor); + ::MoveTo(frame.left + 2, frame.bottom - 5); + ::LineTo(frame.left + 2, frame.top + 2); + ::LineTo(frame.right - 5, frame.top + 2); + + if (disabled) + ::RGBForeColor(&gAGAColorArray[5]); + else + ::RGBForeColor(&gAGAColorArray[8]); + ::MoveTo(frame.left + 4, frame.bottom - 2); + ::LineTo(frame.right - 5, frame.bottom - 2); + ::MoveTo(frame.right - 2, frame.bottom - 5); + ::LineTo(frame.right - 2, frame.top + 4); + + if (disabled) + ::RGBForeColor(&gAGAColorArray[4]); + else + ::RGBForeColor(&gAGAColorArray[5]); + ::MoveTo(frame.left + 4, frame.bottom - 3); + ::LineTo(frame.right - 5, frame.bottom - 3); + ::MoveTo(frame.right - 3, frame.bottom - 5); + ::LineTo(frame.right - 3, frame.top + 4); + } + } + AGASetFontStyle( &info->fontStyle ) ; + int x = ( (**theControl).contrlRect.left + (**theControl).contrlRect.right ) / 2 ; + int y = ( (**theControl).contrlRect.top + (**theControl).contrlRect.bottom ) / 2 ; + FontInfo fi ; + ::GetFontInfo( &fi ) ; + + y += fi.ascent / 2 ; + int length = (**theControl).contrlTitle[0] ; + if ( length ) + { + int width = TextWidth( &(**theControl).contrlTitle[1] , 0, length ) ; + x -= width / 2 ; + ::MoveTo( x , y ); + ::DrawText( &(**theControl).contrlTitle[1] , 0, length); + } + + } + } + break ; + case testCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) ) + return kControlButtonPart ; + else + return NULL ; + } + break ; + case calcCntlRgn : + RectRgn((RgnHandle) param , &(**theControl).contrlRect ) ; + break ; + case posCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) ) + return kControlButtonPart ; + else + return NULL ; + } + break ; + default : + break ; + } + + return 0 ; +} + +const int kAGACheckBoxWidth = 12 ; +const int kAGACheckBoxHeigth = 12 ; + +pascal SInt32 AGACheckBoxDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + switch( message ) + { + case drawCntl : + { + if (!(**theControl).contrlVis) + return 0 ; + PenState oldPenState; + RGBColor oldForeColor ; + RGBColor oldBackColor ; + RGBColor backColor ; + RGBColor foreColor ; + + + { + if (!(**theControl).contrlVis) + return 0 ; + + { + AGAPortHelper help() ; + Rect frame = (**theControl).contrlRect ; + Boolean hasColor = true; + Boolean disabled = (*theControl)->contrlHilite == 255 ; + int mValue = GetControlValue( theControl ) ; + Boolean inPushed = (**theControl).contrlHilite ; + int mEnabled = 1 ; + int triState_Off = 3 ; + + frame.right = frame.left + kAGACheckBoxWidth; + frame.bottom = frame.top + kAGACheckBoxHeigth; + + // Draw the frame of the checkbox + if (disabled) + if (hasColor) + ::RGBForeColor(&gAGAColorArray[7]); + else + PenPat(&qd.gray); + + ::FrameRect(&frame); + + if (!hasColor) + PenNormal(); + + ::InsetRect(&frame, 1, 1); + if (hasColor) + ::RGBBackColor(inPushed ? &gAGAColorArray[8] : &gAGAColorArray[2]); + ::EraseRect(&frame); + + if (hasColor) + { + if (inPushed) + ::RGBForeColor(&gAGAColorArray[10]); + else + ForeColor(whiteColor); + ::MoveTo(frame.left, frame.bottom - 2); + ::LineTo(frame.left, frame.top); + ::LineTo(frame.right - 2, frame.top); + + if (inPushed) + ::RGBForeColor(&gAGAColorArray[6]); + else + ::RGBForeColor(mEnabled != triState_Off ? &gAGAColorArray[7] : &gAGAColorArray[5]); + ::MoveTo(frame.left + 1, frame.bottom - 1); + ::LineTo(frame.right - 1, frame.bottom - 1); + ::LineTo(frame.right - 1, frame.top + 1); + } + + if (mValue) + { + if (mValue == 1) + { + // Checked state + if (hasColor) + { + ::RGBForeColor(inPushed ? &gAGAColorArray[10] : &gAGAColorArray[5]); + ::MoveTo(frame.left + 3, frame.bottom - 2); + ::LineTo(frame.right - 2, frame.top + 3); + ::MoveTo(frame.right - 2, frame.bottom - 2); + ::LineTo(frame.right - 2, frame.bottom - 2); + + if (mEnabled != triState_Off) + ::RGBForeColor(inPushed ? &gAGAColorArray[11] : &gAGAColorArray[8]); + ::MoveTo(frame.left + 3, frame.bottom - 3); + ::LineTo(frame.right - 2, frame.top + 2); + ::MoveTo(frame.right - 2, frame.bottom - 3); + ::LineTo(frame.right - 2, frame.bottom - 3); + + if (mEnabled != triState_Off) + ::ForeColor(blackColor); + else + ::RGBForeColor(&gAGAColorArray[7]); + } + ::MoveTo(frame.left + 2, frame.top + 1); + ::LineTo(frame.right - 3, frame.bottom - 4); + ::MoveTo(frame.left + 2, frame.top + 2); + ::LineTo(frame.right - 3, frame.bottom - 3); + ::MoveTo(frame.left + 2, frame.bottom - 4); + ::LineTo(frame.right - 3, frame.top + 1); + ::MoveTo(frame.left + 2, frame.bottom - 3); + ::LineTo(frame.right - 3, frame.top + 2); + } + else + { + // Mixed state + if (hasColor) + { + ::RGBForeColor(inPushed ? &gAGAColorArray[10] : &gAGAColorArray[5]); + ::MoveTo(frame.left + 3, frame.top + 6); + ::LineTo(frame.right - 2, frame.top + 6); + ::LineTo(frame.right - 2, frame.top + 4); + + if (mEnabled != triState_Off) + ::ForeColor(blackColor); + else + ::RGBForeColor(&gAGAColorArray[7]); + } + ::MoveTo(frame.left + 2, frame.top + 4); + ::LineTo(frame.right - 3, frame.top + 4); + ::MoveTo(frame.left + 2, frame.top + 5); + ::LineTo(frame.right - 3, frame.top + 5); + } + } + + if (inPushed && !hasColor) + InvertRect(&frame); + + AGASetFontStyle( &info->fontStyle ) ; + int x = (**theControl).contrlRect.left + kAGACheckBoxWidth + 5 ; + int y = ( (**theControl).contrlRect.top + (**theControl).contrlRect.bottom ) / 2 ; + FontInfo fi ; + ::GetFontInfo( &fi ) ; + + y += fi.ascent / 2 ; + ::MoveTo( x , y ); + int length = (**theControl).contrlTitle[0] ; + if ( length ) + { + ::DrawText( &(**theControl).contrlTitle[1] , 0, length); + } + } + } + + } + break ; + case testCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) && ((*theControl)->contrlVis != 0) && ((*theControl)->contrlHilite != 255) ) + return kControlCheckBoxPart ; + else + return NULL ; + } + break ; + case posCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) ) + { + if ( (**theControl).contrlValue ) + (**theControl).contrlValue = 0 ; + else + (**theControl).contrlValue = 1 ; + + return 0 ; + } + else + return 0 ; + } + break ; + case calcThumbRgn : + case calcCntlRgn : + if ( !EmptyRect(&(**theControl).contrlRect ) ) + RectRgn((RgnHandle) param , &(**theControl).contrlRect ) ; + break ; + case kControlMsgCalcBestRect : + { + ControlCalcSizeRec *rec = (ControlCalcSizeRec *) param ; + rec->width = (**theControl).contrlRect.right - (**theControl).contrlRect.left ; + rec->height = kAGACheckBoxHeigth ; + rec->baseLine = 0; + } + break ; + default : + break ; + } + + return 0 ; +} + +pascal SInt32 AGARadioButtonDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ +//TO DO +/* ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + switch( message ) + { + case drawCntl : + { + if (!(**theControl).contrlVis) + return 0 ; + PenState oldPenState; + RGBColor oldForeColor ; + RGBColor oldBackColor ; + RGBColor backColor ; + RGBColor foreColor ; + + + { + if (!(**theControl).contrlVis) + return 0 ; + + { + AGAPortHelper help() ; + Rect frame = (**theControl).contrlRect ; + Boolean hasColor = true; + Boolean disabled = (*theControl)->contrlHilite == 255 ; + int mValue = GetControlValue( theControl ) ; + Boolean inPushed = (**theControl).contrlHilite ; + int mEnabled = 1 ; + int triState_Off = 3 ; + + frame.right = frame.left + kAGACheckBoxWidth; + frame.bottom = frame.top + kAGACheckBoxHeigth; + + // Draw the frame of the checkbox + if (disabled) + if (hasColor) + ::RGBForeColor(&gAGAColorArray[7]); + else + PenPat(&qd.gray); + + ::FrameRect(&frame); + + if (!hasColor) + PenNormal(); + + ::InsetRect(&frame, 1, 1); + if (hasColor) + ::RGBBackColor(inPushed ? &gAGAColorArray[8] : &gAGAColorArray[2]); + ::EraseRect(&frame); + + if (hasColor) + { + if (inPushed) + ::RGBForeColor(&gAGAColorArray[10]); + else + ForeColor(whiteColor); + ::MoveTo(frame.left, frame.bottom - 2); + ::LineTo(frame.left, frame.top); + ::LineTo(frame.right - 2, frame.top); + + if (inPushed) + ::RGBForeColor(&gAGAColorArray[6]); + else + ::RGBForeColor(mEnabled != triState_Off ? &gAGAColorArray[7] : &gAGAColorArray[5]); + ::MoveTo(frame.left + 1, frame.bottom - 1); + ::LineTo(frame.right - 1, frame.bottom - 1); + ::LineTo(frame.right - 1, frame.top + 1); + } + + if (mValue) + { + if (mValue == 1) + { + // Checked state + if (hasColor) + { + ::RGBForeColor(inPushed ? &gAGAColorArray[10] : &gAGAColorArray[5]); + ::MoveTo(frame.left + 3, frame.bottom - 2); + ::LineTo(frame.right - 2, frame.top + 3); + ::MoveTo(frame.right - 2, frame.bottom - 2); + ::LineTo(frame.right - 2, frame.bottom - 2); + + if (mEnabled != triState_Off) + ::RGBForeColor(inPushed ? &gAGAColorArray[11] : &gAGAColorArray[8]); + ::MoveTo(frame.left + 3, frame.bottom - 3); + ::LineTo(frame.right - 2, frame.top + 2); + ::MoveTo(frame.right - 2, frame.bottom - 3); + ::LineTo(frame.right - 2, frame.bottom - 3); + + if (mEnabled != triState_Off) + ::ForeColor(blackColor); + else + ::RGBForeColor(&gAGAColorArray[7]); + } + ::MoveTo(frame.left + 2, frame.top + 1); + ::LineTo(frame.right - 3, frame.bottom - 4); + ::MoveTo(frame.left + 2, frame.top + 2); + ::LineTo(frame.right - 3, frame.bottom - 3); + ::MoveTo(frame.left + 2, frame.bottom - 4); + ::LineTo(frame.right - 3, frame.top + 1); + ::MoveTo(frame.left + 2, frame.bottom - 3); + ::LineTo(frame.right - 3, frame.top + 2); + } + else + { + // Mixed state + if (hasColor) + { + ::RGBForeColor(inPushed ? &gAGAColorArray[10] : &gAGAColorArray[5]); + ::MoveTo(frame.left + 3, frame.top + 6); + ::LineTo(frame.right - 2, frame.top + 6); + ::LineTo(frame.right - 2, frame.top + 4); + + if (mEnabled != triState_Off) + ::ForeColor(blackColor); + else + ::RGBForeColor(&gAGAColorArray[7]); + } + ::MoveTo(frame.left + 2, frame.top + 4); + ::LineTo(frame.right - 3, frame.top + 4); + ::MoveTo(frame.left + 2, frame.top + 5); + ::LineTo(frame.right - 3, frame.top + 5); + } + } + + if (inPushed && !hasColor) + InvertRect(&frame); + + AGASetFontStyle( &info->fontStyle ) ; + int x = (**theControl).contrlRect.left + kAGACheckBoxWidth + 5 ; + int y = ( (**theControl).contrlRect.top + (**theControl).contrlRect.bottom ) / 2 ; + FontInfo fi ; + ::GetFontInfo( &fi ) ; + + y += fi.ascent / 2 ; + ::MoveTo( x , y ); + int length = (**theControl).contrlTitle[0] ; + if ( length ) + { + ::DrawText( &(**theControl).contrlTitle[1] , 0, length); + } + } + } + + } + break ; + case testCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) && ((*theControl)->contrlVis != 0) && ((*theControl)->contrlHilite != 255) ) + return kControlCheckBoxPart ; + else + return NULL ; + } + break ; + case posCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) ) + { + if ( (**theControl).contrlValue ) + (**theControl).contrlValue = 0 ; + else + (**theControl).contrlValue = 1 ; + + return 0 ; + } + else + return 0 ; + } + break ; + case calcThumbRgn : + case calcCntlRgn : + if ( !EmptyRect(&(**theControl).contrlRect ) ) + RectRgn((RgnHandle) param , &(**theControl).contrlRect ) ; + break ; + case kControlMsgCalcBestRect : + { + ControlCalcSizeRec *rec = (ControlCalcSizeRec *) param ; + rec->width = (**theControl).contrlRect.right - (**theControl).contrlRect.left ; + rec->height = kAGACheckBoxHeigth ; + rec->baseLine = 0; + } + break ; + default : + break ; + } + */ + return 0 ; +} + +pascal SInt32 AGAStaticGroupBoxTextDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + + switch( message ) + { + case initCntl : + break ; + case dispCntl : + break ; + case drawCntl : + { + if (!(**theControl).contrlVis) + return 0 ; + + { + bool disabled = false ; + bool hasColor = true ; + AGAPortHelper help() ; + AGASetFontStyle( &info->fontStyle ) ; + FontInfo fi ; + ::GetFontInfo( &fi ) ; + + Rect labelRect = (**theControl).contrlRect ; + Rect theFrame = (**theControl).contrlRect ; + int width = StringWidth((**theControl).contrlTitle) ; + theFrame.top += fi.ascent + fi.leading >> 1 ; + labelRect.bottom = theFrame.top + 8 ; + labelRect.left += 10 ; + labelRect.right =labelRect.left + width + 6 ; + + theFrame.bottom--; + theFrame.right--; + + if (disabled) + { + RGBForeColor( &gAGAColorArray[4] ) ; + } + else + { + RGBForeColor( &gAGAColorArray[7] ) ; + } + FrameRect( &theFrame ) ; + + if (disabled) + ::RGBForeColor(&gAGAColorArray[1]); + else + ::ForeColor(whiteColor); + ::MoveTo(theFrame.left + 1, theFrame.bottom - 2); + ::LineTo(theFrame.left + 1, theFrame.top + 1); + ::LineTo(theFrame.right - 2, theFrame.top + 1); + ::MoveTo(theFrame.left , theFrame.bottom); + ::LineTo(theFrame.right, theFrame.bottom); + ::LineTo(theFrame.right, theFrame.top); + + AGASetFontStyle( &info->fontStyle ) ; + ::EraseRect( &labelRect ) ; + ::MoveTo(labelRect.left + 3, labelRect.top + fi.ascent + (fi.leading >> 1)); + ::DrawString((**theControl).contrlTitle); + } + } + break ; + case kControlMsgCalcBestRect : + { + ControlCalcSizeRec *rec = (ControlCalcSizeRec *) param ; + rec->width = (**theControl).contrlRect.right - (**theControl).contrlRect.left ; + rec->height = (**theControl).contrlRect.bottom - (**theControl).contrlRect.top ; + rec->baseLine = 0; + } + break ; + case kControlMsgSetData : + break ; + case calcCntlRgn : + RectRgn((RgnHandle) param , &(**theControl).contrlRect ) ; + break ; + default : + break ; + } + + return 0 ; +} + +pascal SInt32 AGAStaticTextDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + Handle macText = (**theControl).contrlData ; + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + + switch( message ) + { + case initCntl : + { + macText = NewHandle(0) ; + (**theControl).contrlData = (Handle) macText ; + } + break ; + case dispCntl : + DisposeHandle( macText ) ; + break ; + case drawCntl : + { + if (!(**theControl).contrlVis) + return 0 ; + + { + AGAPortHelper help() ; + AGASetFontStyle( &info->fontStyle ) ; + int x = (**theControl).contrlRect.left ; + int y = (**theControl).contrlRect.top ; + int lineheight ; + FontInfo fi ; + ::GetFontInfo( &fi ) ; + + y += fi.ascent ; + lineheight = fi.ascent + fi.descent + fi.leading ; + int length = GetHandleSize( macText ) ; + if ( length ) + { + int laststop = 0 ; + int i = 0 ; + HLock( macText ) ; + RGBColor gray = { 0xDDDD , 0xDDDD, 0xDDDD } ; + ::RGBBackColor( &gray ) ; + while( i < length ) + { + if ( (*macText)[i] == 0x0d ) + { + ::MoveTo( x , y ); + ::DrawText( *macText , laststop, i-laststop); + laststop = i+1 ; + y += lineheight ; + } + i++ ; + } + ::MoveTo( x , y ); + ::DrawText( *macText , laststop, i-laststop); + laststop = i+1 ; + HUnlock( macText ) ; + } + } + } + break ; + case kControlMsgCalcBestRect : + { + ControlCalcSizeRec *rec = (ControlCalcSizeRec *) param ; + rec->width = (**theControl).contrlRect.right - (**theControl).contrlRect.left ; + rec->height = (**theControl).contrlRect.bottom - (**theControl).contrlRect.top ; + rec->baseLine = 0; + } + break ; + case kControlMsgSetData : + { + ControlDataAccessRec *rec = (ControlDataAccessRec *) param ; + if ( rec->tag == kControlStaticTextTextTag ) + { + SetHandleSize( macText , rec->size ) ; + memcpy( *macText , rec->dataPtr , rec->size ) ; + return noErr ; + } + return errDataNotSupported ; + } + default : + break ; + } + + return 0 ; +} + +void AGAMoveControl(ControlHandle inControl , short x , short y ) +{ + if ( AGATestForNewControl( inControl ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + if ( info->magic == kExtCDEFMagic ) + { + if ( info->procID == kControlEditTextProc) + { + int dx ; + int dy ; + + dx= x - (**inControl).contrlRect.left ; + dy= y - (**inControl).contrlRect.top ; + + MoveControl( inControl , x ,y ) ; + TEHandle macTE ; + + macTE = (TEHandle) (**inControl).contrlData ; + (**macTE).destRect.left += dx ; + (**macTE).destRect.top += dy ; + (**macTE).destRect.right += dx ; + (**macTE).destRect.bottom += dy ; + (**macTE).viewRect.left += dx ; + (**macTE).viewRect.top += dy ; + (**macTE).viewRect.right += dx ; + (**macTE).viewRect.bottom += dy ; + return ; + } + if ( info->procID == kControlListBoxProc) + { + int dx ; + int dy ; + + dx= x - (**inControl).contrlRect.left ; + dy= y - (**inControl).contrlRect.top ; + + MoveControl( inControl , x ,y ) ; + ListHandle macList ; + + macList = (ListHandle) (**inControl).contrlData ; + (**macList).rView.left += dx ; + (**macList).rView.top += dy ; + (**macList).rView.right += dx ; + (**macList).rView.bottom += dy ; + return ; + } + } + } + MoveControl( inControl , x ,y ) ; +} + +void AGASizeControl(ControlHandle inControl , short x , short y ) +{ + if ( AGATestForNewControl( inControl ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + if ( info->magic == kExtCDEFMagic ) + { + if ( info->procID == kControlEditTextProc) + { + int dx ; + int dy ; + + dx= x - ( (**inControl).contrlRect.right - (**inControl).contrlRect.left ) ; + dy= y - ( (**inControl).contrlRect.bottom - (**inControl).contrlRect.top ) ; + + SizeControl( inControl , x ,y ) ; + TEHandle macTE ; + + macTE = (TEHandle) (**inControl).contrlData ; + (**macTE).destRect.right += dx ; + (**macTE).destRect.bottom += dy ; + (**macTE).viewRect.right += dx ; + (**macTE).viewRect.bottom += dy ; + return ; + } + if ( info->procID == kControlListBoxProc) + { + int dx ; + int dy ; + + dx= x - ( (**inControl).contrlRect.right - (**inControl).contrlRect.left ) ; + dy= y - ( (**inControl).contrlRect.bottom - (**inControl).contrlRect.top ) ; + + SizeControl( inControl , x ,y ) ; + ListHandle macList ; + + macList = (ListHandle) (**inControl).contrlData ; + (**macList).rView.right += dx ; + (**macList).rView.bottom += dy ; + return ; + } + } + } + SizeControl( inControl , x ,y ) ; +} + +pascal SInt32 AGARootControlDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + + switch( message ) + { + case initCntl : + break ; + case dispCntl : + break ; + case drawCntl : + break ; + case kControlMsgCalcBestRect : + break ; + case kControlMsgSetData : + default : + break ; + } + + return 0 ; +} + +pascal SInt32 AGAEditTextDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + Size result ; + TEHandle macTE ; + + macTE = (TEHandle) (**theControl).contrlData ; + + switch( message ) + { + case initCntl : + { + AGAPortHelper help() ; + SetPort( (**theControl).contrlOwner ) ; + ::TextFont( kFontIDGeneva ) ; + ::TextSize( 10 ) ; + ::TextFace( 0 ) ; + RGBBackColor( &gAGARamp[ kAGAWhite ] ) ; + RGBForeColor( &gAGARamp[ kAGABlack ] ) ; + Rect bounds = (**theControl).contrlRect ; + InsetRect( &bounds , 4 , 1 ) ; + FontInfo fi ; + ::GetFontInfo( &fi ) ; + + bounds.top = bounds.bottom - abs( fi.descent ) - fi.ascent - 3; + macTE = TENew( &bounds , &bounds) ; + (**theControl).contrlData = (Handle) macTE ; + } + break ; + case dispCntl : + TEDispose( macTE ) ; + break ; + case drawCntl : + { + AGAPortHelper help() ; + AGASetFontStyle( &info->fontStyle ) ; + SetPort( (**theControl).contrlOwner ) ; + RGBBackColor( &gAGARamp[ kAGAWhite ] ) ; + RGBForeColor( &gAGARamp[ kAGABlack ] ) ; + EraseRect( &(**theControl).contrlRect ) ; + FrameRect( &(**theControl).contrlRect ) ; + TEUpdate( &(**theControl).contrlRect , macTE ) ; + } + break ; + case testCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) ) + return kControlButtonPart ; + else + return NULL ; + } + break ; + case posCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + if ( PtInRect( pt , &(**theControl).contrlRect ) ) + { + TEClick( pt , false , macTE ) ; + } + } + break ; + case kControlMsgGetData : + { + ControlDataAccessRec *rec = (ControlDataAccessRec *) param ; + if ( rec->tag == kControlEditTextTEHandleTag ) + { + return AGAGetDataHelper( rec , sizeof( TEHandle ) , (char*) &macTE ) ; + } + else if ( rec->tag == kControlEditTextTextTag ) + { + return AGAGetDataHelper( rec , (**macTE).teLength , (char*) *(**macTE).hText ) ; + } + else if ( rec->tag == kControlEditTextSelectionTag ) + { + } + return errDataNotSupported ; + } + break ; + case kControlMsgSetData : + { + ControlDataAccessRec *rec = (ControlDataAccessRec *) param ; + if ( rec->tag == kControlEditTextTextTag ) + { + TESetText( rec->dataPtr , rec->size , macTE ) ; + return noErr ; + } + return errDataNotSupported ; + } + case kControlMsgCalcBestRect : + { + ControlCalcSizeRec *rec = (ControlCalcSizeRec *) param ; + rec->width = (**theControl).contrlRect.right - (**theControl).contrlRect.left ; + rec->height = (**theControl).contrlRect.bottom - (**theControl).contrlRect.top ; + rec->baseLine = 0; + } + case kControlMsgFocus : + { + if ( param == kControlFocusNoPart ) + { + info->hasFocus = false ; + TEDeactivate( macTE ) ; + return kControlFocusNoPart ; + } + else if ( param == kControlFocusNextPart || param == kControlFocusPrevPart ) + { + if ( info->hasFocus ) + { + info->hasFocus = false ; + TEDeactivate( macTE ) ; + return kControlFocusNoPart ; + } + else + { + info->hasFocus = true ; + TEActivate( macTE ) ; + return kControlEditTextPart ; + } + } + else if ( param == kControlEditTextPart ) + { + if ( !info->hasFocus ) + { + info->hasFocus = true ; + TEActivate( macTE ) ; + return kControlEditTextPart ; + } + } + } + break ; + case kControlMsgIdle : + { + TEIdle( macTE ) ; + } + break ; + case kControlMsgKeyDown : + { + AGAPortHelper help() ; + AGASetFontStyle( &info->fontStyle ) ; + SetPort( (**theControl).contrlOwner ) ; + RGBBackColor( &gAGARamp[ kAGAWhite ] ) ; + RGBForeColor( &gAGARamp[ kAGABlack ] ) ; + ControlKeyDownRec * rec = (ControlKeyDownRec*) param ; + TEKey( rec->charCode , macTE ) ; + } + break ; + case kControlMsgActivate : + { + /* + if ( param ) + TEActivate( macTE ) ; + else + TEDeactivate( macTE ) ; + */ + } + break ; + case calcCntlRgn : + RectRgn((RgnHandle) param , &(**theControl).contrlRect ) ; + break ; + case kControlMsgTestNewMsgSupport : + return kControlSupportsNewMessages ; + case kControlMsgGetFeatures : + return +// kControlSupportsGhosting | +// kControlSupportsEmbedding | + kControlSupportsFocus | + kControlWantsIdle | + kControlWantsActivate | +// kControlHandlesTracking | + kControlSupportsDataAccess | +// kControlHasSpecialBackground | +// kControlGetsFocusOnClick | + kControlSupportsCalcBestRect | +// kControlSupportsLiveFeedback | +// kControlHasRadioBehavior | + 0 ; + default : + break ; + } + + return 0 ; +} + +pascal SInt32 AGAListControlDefProc (SInt16 procID, ControlHandle theControl, ControlDefProcMessage message, SInt32 param) +{ + Size result ; + ListHandle macList ; + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**theControl).contrlRfCon ; + + macList = (ListHandle) (**theControl).contrlData ; + + static inLoop = false ; + static lastClick = NULL ; + + switch( message ) + { + case initCntl : + { + Rect databounds = { 0,0,0,0} ; + Point cellsize = { 0,0} ; + Rect listBounds = (**theControl).contrlRect ; + + InsetRect( &listBounds , 1 , 1 ) ; + + macList = LNew( &listBounds , &databounds , cellsize , 128 , + (**theControl).contrlOwner , false /*drawit*/ , false /*hasGrow*/, + false /* horzScroll */, true /*vertScroll*/ ) ; + (**theControl).contrlData = (Handle) macList ; + info->privateData = NULL ; + } + break ; + case dispCntl : + (**macList).vScroll = NULL ; // will be disposed by the window itself + (**macList).hScroll = NULL ; // will be disposed by the window itself + LDispose( macList ) ; + break ; + case calcCntlRgn : + RectRgn((RgnHandle) param , &(**theControl).contrlRect ) ; + break ; + case testCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + Rect listRect ; + Rect allRect = (**theControl).contrlRect ; + listRect = allRect ; + if ( !inLoop ) + allRect.right += 16 ; + if ( PtInRect( pt , &allRect ) ) + { + if ( !inLoop && StillDown() ) + { + inLoop = true ; + LActivate( true , macList ) ; + Boolean doubleClick = LClick( pt , 0 /* todo modifiers*/ , macList ) ; + info->privateData = doubleClick ; + inLoop = false ; + } + return kControlListBoxPart ; + } + else + return NULL ; + } + break ; + case drawCntl : + { + AGAPortHelper help() ; + AGASetFontStyle( &info->fontStyle ) ; + RGBBackColor( &gAGARamp[ kAGAWhite ] ) ; + EraseRect( &(**theControl).contrlRect ) ; + FrameRect( &(**theControl).contrlRect ) ; + RgnHandle controlRgn = NewRgn() ; + SetRectRgn( controlRgn, (**theControl).contrlRect.left , + (**theControl).contrlRect.top, + (**theControl).contrlRect.right, + (**theControl).contrlRect.bottom ) ; + LUpdate( controlRgn, macList ) ; + } + break ; + case posCntl : + { + Point pt ; + pt.h = LoWord( param ) ; + pt.v = HiWord( param ) ; + Rect listRect ; + Rect allRect = (**theControl).contrlRect ; + listRect = allRect ; + allRect.right += 16 ; + if ( PtInRect( pt , &listRect ) ) + { + if ( !inLoop && StillDown() ) + { + inLoop = true ; + LActivate( true , macList ) ; + Boolean doubleClick = LClick( pt , 0 /* todo modifiers*/ , macList ) ; + info->privateData = doubleClick ; + inLoop = false ; + } + return kControlListBoxPart ; + } + else if ( PtInRect( pt , &allRect ) ) + { + if ( !inLoop && StillDown() ) + { + inLoop = true ; + // LActivate( true , macList ) ; + Boolean doubleClick = LClick( pt , 0 /* todo modifiers*/ , macList ) ; + info->privateData = doubleClick ; + inLoop = false ; + } + return kControlPageDownPart ; + } + else + return NULL ; + } + break ; + case kControlMsgGetData : + { + ControlDataAccessRec *rec = (ControlDataAccessRec *) param ; + if ( rec->tag == kControlListBoxListHandleTag ) + { + return AGAGetDataHelper( rec , sizeof( ListHandle ) , (char*) &macList ) ; + } + else if ( rec->tag == kControlListBoxDoubleClickTag ) + { + Boolean doubleClick = info->privateData ; + return AGAGetDataHelper( rec , sizeof( Boolean ) , (char*) &doubleClick ) ; + } + return errDataNotSupported ; + } + break ; + default : + break ; + } + + return 0 ; +} + +OSErr AGACreateRootControl (WindowPtr inWindow, + ControlHandle * outControl) +{ + ControlHandle theControl = NULL ; + + SInt16 extCDEFID = kExtCDEFID << 4 + 0 ; + + theControl = NewControl( inWindow , &inWindow->portRect , "\p" , true , + 0 , 0 , 1 , extCDEFID , 0 ) ; + NewExtCDEFInfo( theControl , AGARootControlDefProc , kAGARootControlProcID , 0 ) ; + + *outControl = theControl ; + return noErr ; +} + +OSErr AGAEmbedControl (ControlHandle inControl, + ControlHandle inContainer) +{ + if ( AGATestForNewControl( inControl ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**inControl).contrlRfCon ; + info->containerControl = inContainer ; + } + return noErr ; +} + +void AGADrawControl( ControlHandle control ) +{ + DrawOneControl( control ) ; + ControlHandle iter = (ControlHandle) ((WindowPeek)(**control).contrlOwner)->controlList ; + while ( iter ) + { + if ( AGATestForNewControl( iter ) ) + { + ExtCDEFInfo* info = (ExtCDEFInfo* ) (**iter).contrlRfCon ; + if ( info->containerControl == control ) + { + AGADrawControl( iter ) ; + } + } + + iter = (**iter).nextControl ; + } +} + + +ControlHandle AGANewControl(WindowPtr owningWindow, + const Rect * bounds, + ConstStr255Param controlTitle, + Boolean initiallyVisible, + SInt16 initialValue, + SInt16 minimumValue, + SInt16 maximumValue, + SInt16 procID, + SInt32 controlReference) +{ + ControlHandle theControl = NULL ; + Rect boundsRect = *bounds ; + SInt16 extCDEFID = kExtCDEFID << 4 + 0 ; + SInt16 oldProcID = extCDEFID ; + switch( procID ) + { + case kControlScrollBarProc : + case kControlScrollBarLiveProc : + oldProcID = scrollBarProc ; + break ; + case kControlListBoxProc : + initialValue = 0 ; + default : + break ; + } + if ( oldProcID == extCDEFID && procID == kControlListBoxProc ) + { + boundsRect.right -= 16 ; + } + theControl = NewControl( owningWindow , &boundsRect , controlTitle , initiallyVisible , + initialValue , minimumValue , maximumValue , oldProcID , controlReference ) ; + if ( oldProcID == extCDEFID ) + { + ControlDefProcPtr theProcPtr = NULL ; + SInt16 theVarCode = 0 ; + switch( procID ) + { + case kControlPushButtonProc : + theProcPtr = AGAButtonDefProc ; + break ; + case kControlCheckBoxProc : + theProcPtr = AGACheckBoxDefProc ; + break ; + case kControlRadioButtonProc : + theProcPtr = AGARadioButtonDefProc ; + break ; + case kControlProgressBarProc : + theProcPtr = AGAProgressBarDefProc ; + break ; + case kControlPlacardProc : + theProcPtr = AGAPlacardDefProc ; + break ; + case kControlStaticTextProc : + theProcPtr = AGAStaticTextDefProc ; + break ; + case kControlListBoxProc : + theProcPtr = AGAListControlDefProc ; + break ; + case kControlEditTextProc : + theProcPtr = AGAEditTextDefProc ; + break ; + case kControlGroupBoxTextTitleProc : + theProcPtr = AGAStaticGroupBoxTextDefProc ; + break ; + case kControlBevelButtonNormalBevelProc : + theProcPtr = AGABevelButtonDefProc ; + break ; + } + + if ( theProcPtr ) + { + NewExtCDEFInfo( theControl , theProcPtr , procID , controlReference ) ; + } + } + return theControl ; +} + +void AGASetThemeWindowBackground (WindowRef inWindow, + ThemeBrush inBrush, + Boolean inUpdate) +{ + GrafPtr port ; + GetPort( &port ) ; + SetPort( inWindow ) ; + if ( inBrush == kThemeBrushDialogBackgroundActive ) + { + gAGABackgroundColor = 2 ; + } + else + { + gAGABackgroundColor = 0 ; + } + RGBBackColor( &gAGAColorArray[gAGABackgroundColor] ) ; + SetPort( port ) ; +} + +