+#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 ) ;
+}
+
+