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; }
// -------------------------------------------------------------------------------------- pascal void DrawIconDataBrowserItem104CB(ControlRef browser, DataBrowserItemID item, DataBrowserPropertyID property, DataBrowserItemState itemState, const Rect *theRect, SInt16 gdDepth, Boolean colorDevice) { #pragma unused (theRect, gdDepth, colorDevice) Rect enclosingRect, portBounds; GrafPtr port; CGRect enclosingCGRect, iconCGRect, textCGRect; Boolean active; CGContextRef context; IconDBItemDataRec *itemData; RGBColor labelColor; HIThemeTextInfo textInfo; /* 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); calculateCGDrawingBounds(enclosingCGRect, &iconCGRect, &textCGRect); active = IsControlActive(browser); if ((itemState & kDataBrowserItemIsSelected) != 0) { CGRect clipRect; clipRect = getClipCGRect(&portBounds); // call this before beginning the context QDBeginCGContext(port, &context); CGContextClipToRect(context, clipRect); CGContextSaveGState(context); HIThemeSetFill(active ? kThemeBrushPrimaryHighlightColor : kThemeBrushSecondaryHighlightColor, NULL, context, kHIThemeOrientationInverted); CGContextFillRect(context, enclosingCGRect); CGContextRestoreGState(context); } else { /* The data browser will redraw items on the edge of its content view. Because HIThemeDrawTextBox does not erase the drawing rectangle before it draws, the text becomes thicker with every draw due to anti-aliasing. As a workaround, this section erases the text rectangle (if the item was selected then the enclosing rectangle was erased above). */ CGRect clipRect; RGBColor backgroundColor; clipRect = getClipCGRect(&portBounds); // call these before beginning the context GetBackColor(&backgroundColor); QDBeginCGContext(port, &context); CGContextClipToRect(context, clipRect); CGContextSaveGState(context); CGContextSetRGBFillColor(context, (float)backgroundColor.red / (float)USHRT_MAX, (float)backgroundColor.green / (float)USHRT_MAX, (float)backgroundColor.blue / (float)USHRT_MAX, 1.0); CGContextFillRect(context, textCGRect); CGContextRestoreGState(context); } itemData = (IconDBItemDataRec *)item; labelColor.red = 0; labelColor.green = 0; labelColor.blue = 0; PlotIconRefInContext(context, &iconCGRect, kAlignNone, active ? kTransformNone : kTransformDisabled, &labelColor, kPlotIconRefNormalFlags, itemData->icon); textInfo.version = kHIThemeTextInfoVersionZero; textInfo.state = active ? kThemeStateActive : kThemeStateInactive; textInfo.fontID = kThemeViewsFont; textInfo.horizontalFlushness = kHIThemeTextHorizontalFlushCenter; textInfo.verticalFlushness = kHIThemeTextVerticalFlushTop; textInfo.options = kHIThemeTextBoxOptionNone; textInfo.truncationPosition = kHIThemeTextTruncationNone; HIThemeDrawTextBox(itemData->name, &textCGRect, &textInfo, context, kHIThemeOrientationInverted); QDEndCGContext(port, &context); } // DrawIconDataBrowserItem104CB