void nsTableCellFrame::DecorateForSelection(nsRenderingContext& aRenderingContext, nsPoint aPt) { NS_ASSERTION(GetStateBits() & NS_FRAME_SELECTED_CONTENT, "Should only be called for selected cells"); PRInt16 displaySelection; nsPresContext* presContext = PresContext(); displaySelection = DisplaySelection(presContext); if (displaySelection) { nsRefPtr<nsFrameSelection> frameSelection = presContext->PresShell()->FrameSelection(); if (frameSelection->GetTableCellSelection()) { nscolor bordercolor; if (displaySelection == nsISelectionController::SELECTION_DISABLED) { bordercolor = NS_RGB(176,176,176);// disabled color } else { bordercolor = LookAndFeel::GetColor(LookAndFeel::eColorID_TextSelectBackground); } nscoord threePx = nsPresContext::CSSPixelsToAppUnits(3); if ((mRect.width > threePx) && (mRect.height > threePx)) { //compare bordercolor to ((nsStyleColor *)myColor)->mBackgroundColor) bordercolor = EnsureDifferentColors(bordercolor, GetStyleBackground()->mBackgroundColor); nsRenderingContext::AutoPushTranslation translate(&aRenderingContext, aPt); nscoord onePixel = nsPresContext::CSSPixelsToAppUnits(1); aRenderingContext.SetColor(bordercolor); aRenderingContext.DrawLine(onePixel, 0, mRect.width, 0); aRenderingContext.DrawLine(0, onePixel, 0, mRect.height); aRenderingContext.DrawLine(onePixel, mRect.height, mRect.width, mRect.height); aRenderingContext.DrawLine(mRect.width, onePixel, mRect.width, mRect.height); //middle aRenderingContext.DrawRect(onePixel, onePixel, mRect.width-onePixel, mRect.height-onePixel); //shading aRenderingContext.DrawLine(2*onePixel, mRect.height-2*onePixel, mRect.width-onePixel, mRect.height- (2*onePixel)); aRenderingContext.DrawLine(mRect.width - (2*onePixel), 2*onePixel, mRect.width - (2*onePixel), mRect.height-onePixel); } } } }
void nsPageFrame::PaintHeaderFooter(nsRenderingContext& aRenderingContext, nsPoint aPt) { nsPresContext* pc = PresContext(); if (!mPD->mPrintSettings) { if (pc->Type() == nsPresContext::eContext_PrintPreview || pc->IsDynamic()) mPD->mPrintSettings = pc->GetPrintSettings(); if (!mPD->mPrintSettings) return; } nsRect rect(aPt, mRect.Size()); aRenderingContext.SetColor(NS_RGB(0,0,0)); // Get the FontMetrics to determine width.height of strings nsRefPtr<nsFontMetrics> fontMet; pc->DeviceContext()->GetMetricsFor(*mPD->mHeadFootFont, nullptr, pc->GetUserFontSet(), *getter_AddRefs(fontMet)); aRenderingContext.SetFont(fontMet); nscoord ascent = 0; nscoord visibleHeight = 0; if (fontMet) { visibleHeight = fontMet->MaxHeight(); ascent = fontMet->MaxAscent(); } // print document headers and footers nsXPIDLString headerLeft, headerCenter, headerRight; mPD->mPrintSettings->GetHeaderStrLeft(getter_Copies(headerLeft)); mPD->mPrintSettings->GetHeaderStrCenter(getter_Copies(headerCenter)); mPD->mPrintSettings->GetHeaderStrRight(getter_Copies(headerRight)); DrawHeaderFooter(aRenderingContext, eHeader, headerLeft, headerCenter, headerRight, rect, ascent, visibleHeight); nsXPIDLString footerLeft, footerCenter, footerRight; mPD->mPrintSettings->GetFooterStrLeft(getter_Copies(footerLeft)); mPD->mPrintSettings->GetFooterStrCenter(getter_Copies(footerCenter)); mPD->mPrintSettings->GetFooterStrRight(getter_Copies(footerRight)); DrawHeaderFooter(aRenderingContext, eFooter, footerLeft, footerCenter, footerRight, rect, ascent, visibleHeight); }
// Draw a header or footer string // @param aRenderingContext - rendering context to draw into // @param aHeaderFooter - indicates whether it is a header or footer // @param aJust - indicates where the string is located within the header/footer // @param aStr - the string to be drawn // @param aRect - the rect of the page // @param aHeight - the height of the font // @param aAscent - the ascent of the font // @param aWidth - available width for the string void nsPageFrame::DrawHeaderFooter(nsRenderingContext& aRenderingContext, nsHeaderFooterEnum aHeaderFooter, int32_t aJust, const nsString& aStr, const nsRect& aRect, nscoord aAscent, nscoord aHeight, nscoord aWidth) { nscoord contentWidth = aWidth - (mPD->mEdgePaperMargin.left + mPD->mEdgePaperMargin.right); if ((aHeaderFooter == eHeader && aHeight < mPD->mReflowMargin.top) || (aHeaderFooter == eFooter && aHeight < mPD->mReflowMargin.bottom)) { nsAutoString str; ProcessSpecialCodes(aStr, str); int32_t indx; int32_t textWidth = 0; const PRUnichar* text = str.get(); int32_t len = (int32_t)str.Length(); if (len == 0) { return; // bail is empty string } // find how much text fits, the "position" is the size of the available area if (nsLayoutUtils::BinarySearchForPosition(&aRenderingContext, text, 0, 0, 0, len, int32_t(contentWidth), indx, textWidth)) { if (indx < len-1 ) { // we can't fit in all the text if (indx > 3) { // But we can fit in at least 4 chars. Show all but 3 of them, then // an ellipsis. // XXXbz for non-plane0 text, this may be cutting things in the // middle of a codepoint! Also, we have no guarantees that the three // dots will fit in the space the three chars we removed took up with // these font metrics! str.Truncate(indx-3); str.AppendLiteral("..."); } else { // We can only fit 3 or fewer chars. Just show nothing str.Truncate(); } } } else { return; // bail if couldn't find the correct length } if (HasRTLChars(str)) { PresContext()->SetBidiEnabled(); } // cacl the x and y positions of the text nscoord x = GetXPosition(aRenderingContext, aRect, aJust, str); nscoord y; if (aHeaderFooter == eHeader) { y = aRect.y + mPD->mExtraMargin.top + mPD->mEdgePaperMargin.top; } else { y = aRect.YMost() - aHeight - mPD->mExtraMargin.bottom - mPD->mEdgePaperMargin.bottom; } // set up new clip and draw the text aRenderingContext.PushState(); aRenderingContext.SetColor(NS_RGB(0,0,0)); aRenderingContext.IntersectClip(aRect); nsLayoutUtils::DrawString(this, &aRenderingContext, str.get(), str.Length(), nsPoint(x, y + aAscent)); aRenderingContext.PopState(); } }