static pascal void ListBoxDrawProc( ControlRef browser , DataBrowserItemID item , DataBrowserPropertyID property , DataBrowserItemState itemState , const Rect *itemRect , SInt16 depth , Boolean isColorDevice ) { CFStringRef cfString; long systemVersion; cfString = CFStringCreateWithFormat( NULL, NULL, CFSTR("Row %d"), item ); ThemeDrawingState themeState ; GetThemeDrawingState( &themeState ) ; if ( itemState == kDataBrowserItemIsSelected ) // In this sample we handle the "selected" state, all others fall through to our "active" state { Gestalt( gestaltSystemVersion, &systemVersion ); if ( (systemVersion >= 0x00001030) && (IsControlActive( browser ) == false) ) // Panther DB starts using kThemeBrushSecondaryHighlightColor for inactive browser hilighting SetThemePen( kThemeBrushSecondaryHighlightColor, 32, true ); else SetThemePen( kThemeBrushPrimaryHighlightColor, 32, true ); PaintRect( itemRect ); // First paint the hilite rect, then the text on top SetThemeDrawingState( themeState , false ) ; } DrawThemeTextBox( cfString, kThemeApplicationFont, kThemeStateActive, true, itemRect, teFlushDefault, NULL ); if ( cfString != NULL ) CFRelease( cfString ); SetThemeDrawingState( themeState , true ) ; }
// -------------------------------------------------------------------------------------- pascal void DrawIconDataBrowserItem86CB(ControlRef browser, DataBrowserItemID item, DataBrowserPropertyID property, DataBrowserItemState itemState, const Rect *theRect, SInt16 gdDepth, Boolean colorDevice) { #pragma unused (theRect) Rect enclosingRect, iconRect, textRect; Boolean active; IconDBItemDataRec *itemData; /* The data browser currently gives us the content part bounds in the theRect parameter but we want the enclosing part bounds to draw in so that we can draw a fill style highlight. */ GetDataBrowserItemPartBounds(browser, item, property, kDataBrowserPropertyEnclosingPart, &enclosingRect); active = IsControlActive(browser); if ((itemState & kDataBrowserItemIsSelected) != 0) { ThemeDrawingState savedState; GetThemeDrawingState(&savedState); SetThemePen(active ? kThemeBrushPrimaryHighlightColor : kThemeBrushSecondaryHighlightColor, gdDepth, colorDevice); PaintRect(&enclosingRect); SetThemeDrawingState(savedState, true); } calculateDrawingBounds(&enclosingRect, &iconRect, &textRect); itemData = (IconDBItemDataRec *)item; PlotIconRef(&iconRect, kAlignNone, active ? kTransformNone : kTransformDisabled, kIconServicesNormalUsageFlag, itemData->icon); DrawThemeTextBox(itemData->name, kThemeViewsFont, active ? kThemeStateActive : kThemeStateInactive, true, &textRect, teCenter, NULL); }
OSStatus ScrollingTextBoxDraw(CGContextRef context, const HIRect * bounds, const ScrollingTextBoxData * myData) { HIRect textBounds = { {kMargin, kMargin}, {bounds->size.width - kMargin - kMargin, myData->height} }; HIRect clipBounds = CGRectInset(*bounds, kMargin + 1.0, kMargin + 1.0); // // If we're building on Panther (or later) then HIThemeDrawTextBox is available, else we use DrawThemeTextBox // #if PANTHER_BUILD // // Furthermore, if we're running on Panther then we can call HIThemeDrawTextBox else we call DrawThemeTextBox // if (GetHIToolboxVersion() >= Panther_HIToolbox_Version) { CGContextClipToRect(context, clipBounds); HIThemeTextInfo textInfo = {0, kThemeStateActive, kScrollingTextBoxFontID, kHIThemeTextHorizontalFlushLeft, kHIThemeTextVerticalFlushTop, kHIThemeTextBoxOptionStronglyVertical, kHIThemeTextTruncationNone, 0, false}; HIThemeDrawTextBox(myData->theText, &textBounds, &textInfo, context, kHIThemeOrientationNormal); } else #endif { Rect QDTextBounds = HI2QDRECT(textBounds); Rect QDClipBounds = HI2QDRECT(clipBounds); RgnHandle saveClip = NewRgn(); GetClip(saveClip); ClipRect(&QDClipBounds); DrawThemeTextBox(myData->theText, kScrollingTextBoxFontID, kThemeStateActive, true, &QDTextBounds, teJustLeft, context); SetClip(saveClip); DisposeRgn(saveClip); } return noErr; }
static pascal void ListBoxDrawProc( ControlRef browser, DataBrowserItemID item, DataBrowserPropertyID property, DataBrowserItemState itemState, const Rect *itemRect, SInt16 depth, Boolean isColorDevice ) { CFStringRef cfString; ThemeDrawingState themeState; long systemVersion; GetThemeDrawingState( &themeState ); cfString = CFStringCreateWithFormat( NULL, NULL, CFSTR("Row %d"), item ); // In this sample we handle the "selected" state; all others fall through to our "active" state if ( itemState == kDataBrowserItemIsSelected ) { ThemeBrush colorBrushID; // TODO: switch over to wxSystemSettingsNative::GetColour() when kThemeBrushSecondaryHighlightColor // is incorporated Panther DB starts using kThemeBrushSecondaryHighlightColor // for inactive browser highlighting if ( !IsControlActive( browser ) ) colorBrushID = kThemeBrushSecondaryHighlightColor; else colorBrushID = kThemeBrushPrimaryHighlightColor; // First paint the hilite rect, then the text on top SetThemePen( colorBrushID, 32, true ); PaintRect( itemRect ); SetThemeDrawingState( themeState, false ); } DrawThemeTextBox( cfString, kThemeApplicationFont, kThemeStateActive, true, itemRect, teFlushDefault, NULL ); SetThemeDrawingState( themeState, true ); if ( cfString != NULL ) CFRelease( cfString ); }
// -------------------------------------------------------------------------------------- static void drawIconListCell(ListHandle theList, const Rect *cellRect, IconListCellDataRec *theCellData, Boolean selected) { GrafPtr savedPort; CGrafPtr listPort; ThemeDrawingState savedState; Boolean active; Rect iconRect, textRect; short savedFont, savedSize; Style savedFace; CFStringRef cellName; GetPort(&savedPort); listPort = GetListPort(theList); SetPort((GrafPtr)listPort); GetThemeDrawingState(&savedState); if (selected) // we don't need to change the background { // color if this Cell isn't highlighted Pattern whitePattern; RGBColor highlightColor; GetQDGlobalsWhite(&whitePattern); // set the background pattern so that BackPat(&whitePattern); // the color is properly set as a solid color LMGetHiliteRGB(&highlightColor); RGBBackColor(&highlightColor); // set the background to the highlight color } EraseRect(cellRect); calculateDrawingBounds(cellRect, &iconRect, &textRect); // get the drawing Rects active = GetListActive(theList); // draw the IconRef using Icon Services PlotIconRef(&iconRect, kAlignNone, active ? kTransformNone : kTransformDisabled, kIconServicesNormalUsageFlag, theCellData->icon); #if TARGET_API_MAC_OS8 // draw TextEdit text in Classic #pragma unused (cellName) savedFont = GetPortTextFont(listPort); // Get/SetThemeDrawingState doesn't save or savedFace = GetPortTextFace(listPort); // restore these savedSize = GetPortTextSize(listPort); UseThemeFont(kThemeViewsFont, smCurrentScript); TETextBox(&theCellData->name[1], theCellData->name[0], &textRect, teCenter); TextFont(savedFont); TextFace(savedFace); TextSize(savedSize); #else // draw Appearance text in Carbon #pragma unused (savedFont, savedSize, savedFace) cellName = CFStringCreateWithPascalString(kCFAllocatorDefault, theCellData->name, GetApplicationTextEncoding()); DrawThemeTextBox(cellName, kThemeViewsFont, active ? kThemeStateActive : kThemeStateInactive, true, &textRect, teCenter, NULL); CFRelease(cellName); #endif SetThemeDrawingState(savedState, true); SetPort(savedPort); } // drawIconListCell
// -------------------------------------------------------------------------------------- pascal void DrawIconDataBrowserItem101CB(ControlRef browser, DataBrowserItemID item, DataBrowserPropertyID property, DataBrowserItemState itemState, const Rect *theRect, SInt16 gdDepth, Boolean colorDevice) { #pragma unused (theRect) Rect enclosingRect, portBounds, iconRect, textRect; GrafPtr port; CGRect enclosingCGRect, iconCGRect, textCGRect; Boolean active; ThemeDrawingState savedState = NULL; CGContextRef context; IconDBItemDataRec *itemData; RGBColor labelColor; /* The data browser currently gives us the content part bounds in the theRect parameter but we want the enclosing part bounds to draw in so that we can draw a fill style highlight. */ GetDataBrowserItemPartBounds(browser, item, property, kDataBrowserPropertyEnclosingPart, &enclosingRect); /* In Mac OS X we're going to use Quartz 2D/Core Graphics for the drawing, so we need to convert the enclosing part bounds to a CGRect */ GetPort(&port); // the data browser sets the port up for us so we just need to get it GetPortBounds(port, &portBounds); enclosingCGRect = CGRectMake(enclosingRect.left, portBounds.bottom - portBounds.top - enclosingRect.bottom, enclosingRect.right - enclosingRect.left, enclosingRect.bottom - enclosingRect.top); active = IsControlActive(browser); if ((itemState & kDataBrowserItemIsSelected) != 0) { CGRect clipRect; RGBColor foregroundColor; GetThemeDrawingState(&savedState); SetThemePen(active ? kThemeBrushPrimaryHighlightColor : kThemeBrushSecondaryHighlightColor, gdDepth, colorDevice); clipRect = getClipCGRect(&portBounds); // call these before beginning the context GetForeColor(&foregroundColor); QDBeginCGContext(port, &context); CGContextClipToRect(context, clipRect); CGContextSaveGState(context); CGContextSetRGBFillColor(context, (float)foregroundColor.red / (float)USHRT_MAX, (float)foregroundColor.green / (float)USHRT_MAX, (float)foregroundColor.blue / (float)USHRT_MAX, 1.0); CGContextFillRect(context, enclosingCGRect); CGContextRestoreGState(context); } else { CGRect clipRect; clipRect = getClipCGRect(&portBounds); // call this before beginning the context QDBeginCGContext(port, &context); CGContextClipToRect(context, clipRect); } calculateCGDrawingBounds(enclosingCGRect, &iconCGRect, &textCGRect); /* DrawThemeTextBox wants the bounding rectangle to be QuickDraw coordinates relative to the current port, not Core Graphics coordinates relative to the passed context. */ calculateDrawingBounds(&enclosingRect, &iconRect, &textRect); itemData = (IconDBItemDataRec *)item; labelColor.red = 0; labelColor.green = 0; labelColor.blue = 0; PlotIconRefInContext(context, &iconCGRect, kAlignNone, active ? kTransformNone : kTransformDisabled, &labelColor, kPlotIconRefNormalFlags, itemData->icon); DrawThemeTextBox(itemData->name, kThemeViewsFont, active ? kThemeStateActive : kThemeStateInactive, true, &textRect, teCenter, context); QDEndCGContext(port, &context); if (savedState != NULL) SetThemeDrawingState(savedState, true); } // DrawIconDataBrowserItem101CB