nsresult nsDOMMenuBar::GetChromeDocument(nsIDOMDocument** _retval) { NS_ENSURE_STATE(mWindow); nsresult rv; nsCOMPtr<nsIWebNavigation> webNav(do_GetInterface(mWindow, &rv)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIDocShellTreeItem> treeItem(do_QueryInterface(webNav, &rv)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIDocShellTreeItem> rootItem; rv = treeItem->GetRootTreeItem(getter_AddRefs(rootItem)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIDOMWindow> chromeWindow(do_GetInterface(rootItem, &rv)); NS_ENSURE_SUCCESS(rv, rv); return chromeWindow->GetDocument(_retval); }
nsresult nsMessengerOSXIntegration::OnAlertFinished(const PRUnichar * aAlertCookie) { nsresult rv = NS_OK; nsCOMPtr<nsIPrefBranch> prefBranch (do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); NS_ENSURE_SUCCESS(rv, rv); PRBool bounceDockIcon = PR_FALSE; prefBranch->GetBoolPref("mail.biff.animate_dock_icon", &bounceDockIcon); // This will call GetAttention(), which will bounce the dock icon. if (!mSuppressBiffIcon) { nsCOMPtr<nsIWindowMediator> mediator (do_GetService(NS_WINDOWMEDIATOR_CONTRACTID)); if (bounceDockIcon && mediator) { nsCOMPtr<nsIDOMWindowInternal> domWindow; mediator->GetMostRecentWindow(NS_LITERAL_STRING("mail:3pane").get(), getter_AddRefs(domWindow)); if (domWindow) { nsCOMPtr<nsIDOMChromeWindow> chromeWindow(do_QueryInterface(domWindow)); chromeWindow->GetAttention(); } } // This will change the dock icon. // If we want to overlay the number of new messages on top of // the icon ... // use OverlayApplicationDockTileImage // -- you'll have to pass it a CGImage, and somehow we have to // create the CGImage with the numbers. tricky PRInt32 totalNewMessages = CountNewMessages(); CGContextRef context = ::BeginCGContextForApplicationDockTile(); // Draw a circle. ::CGContextBeginPath(context); ::CGContextAddArc(context, 95.0, 95.0, 25.0, 0.0, 2 * M_PI, true); ::CGContextClosePath(context); // use #2fc600 for the color. ::CGContextSetRGBFillColor(context, 0.184, 0.776, 0.0, 1); //::CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 0.7); ::CGContextFillPath(context); // Draw the number. nsAutoString total; total.AppendInt(totalNewMessages); // Use a system font (kThemeUtilityWindowTitleFont) ScriptCode sysScript = ::GetScriptManagerVariable(smSysScript); Str255 fontName; SInt16 fontSize; Style fontStyle; ::GetThemeFont(kThemeSmallEmphasizedSystemFont, sysScript, fontName, &fontSize, &fontStyle); FMFontFamily family = ::FMGetFontFamilyFromName(fontName); FMFont fmFont; OSStatus err = ::FMGetFontFromFontFamilyInstance(family, fontStyle, &fmFont, nsnull); if (err != noErr) { NS_WARNING("FMGetFontFromFontFamilyInstance failed"); ::EndCGContextForApplicationDockTile(context); return NS_ERROR_FAILURE; } ATSUStyle style; err = ::ATSUCreateStyle(&style); if (err != noErr) { NS_WARNING("ATSUCreateStyle failed"); ::EndCGContextForApplicationDockTile(context); return NS_ERROR_FAILURE; } Fixed size = Long2Fix(24); RGBColor white = { 0xFFFF, 0xFFFF, 0xFFFF }; ATSUAttributeTag tags[3] = { kATSUFontTag, kATSUSizeTag, kATSUColorTag }; ByteCount valueSizes[3] = { sizeof(ATSUFontID), sizeof(Fixed), sizeof(RGBColor) }; ATSUAttributeValuePtr values[3] = { &fmFont, &size, &white }; err = ::ATSUSetAttributes(style, 3, tags, valueSizes, values); if (err != noErr) { NS_WARNING("ATSUSetAttributes failed"); ::ATSUDisposeStyle(style); ::EndCGContextForApplicationDockTile(context); return NS_ERROR_FAILURE; } UniCharCount runLengths = kATSUToTextEnd; ATSUTextLayout textLayout; err = ::ATSUCreateTextLayoutWithTextPtr(total.get(), kATSUFromTextBeginning, kATSUToTextEnd, total.Length(), 1, &runLengths, &style, &textLayout); if (err != noErr) { NS_WARNING("ATSUCreateTextLayoutWithTextPtr failed"); ::ATSUDisposeStyle(style); ::EndCGContextForApplicationDockTile(context); return NS_ERROR_FAILURE; } ATSUAttributeTag layoutTags[1] = { kATSUCGContextTag }; ByteCount layoutValueSizes[1] = { sizeof(CGContextRef) }; ATSUAttributeValuePtr layoutValues[1] = { &context }; err = ::ATSUSetLayoutControls(textLayout, 1, layoutTags, layoutValueSizes, layoutValues); if (err != noErr) { NS_WARNING("ATSUSetLayoutControls failed"); ::ATSUDisposeStyle(style); ::EndCGContextForApplicationDockTile(context); return NS_ERROR_FAILURE; } Rect boundingBox; err = ::ATSUMeasureTextImage(textLayout, kATSUFromTextBeginning, kATSUToTextEnd, Long2Fix(0), Long2Fix(0), &boundingBox); if (err != noErr) { NS_WARNING("ATSUMeasureTextImage failed"); ::ATSUDisposeStyle(style); ::EndCGContextForApplicationDockTile(context); return NS_ERROR_FAILURE; } // Center text inside circle err = ::ATSUDrawText(textLayout, kATSUFromTextBeginning, kATSUToTextEnd, Long2Fix(90 - (boundingBox.right - boundingBox.left) / 2), Long2Fix(95 - (boundingBox.bottom - boundingBox.top) / 2)); ::ATSUDisposeStyle(style); ::ATSUDisposeTextLayout(textLayout); ::CGContextFlush(context); ::EndCGContextForApplicationDockTile(context); mBiffIconVisible = PR_TRUE; } mSuppressBiffIcon = PR_FALSE; mAlertInProgress = PR_FALSE; return NS_OK; }