From 4c329456e1b70cfccfee905222d40f32ebcf562c Mon Sep 17 00:00:00 2001 From: Tomaž Vajngerl Date: Thu, 7 May 2015 12:11:49 +0900 Subject: refactor ProgressBar to use RenderContext Change-Id: Idf33332a207736f70809820853dee5ce1e0a3cb1 --- include/vcl/status.hxx | 10 ++-- vcl/source/control/prgsbar.cxx | 32 ++++++----- vcl/source/window/status.cxx | 118 ++++++++++++++++++++--------------------- 3 files changed, 79 insertions(+), 81 deletions(-) diff --git a/include/vcl/status.hxx b/include/vcl/status.hxx index 3520b0ec8b22..270ef4eac89f 100644 --- a/include/vcl/status.hxx +++ b/include/vcl/status.hxx @@ -31,12 +31,10 @@ typedef ::std::vector< ImplStatusItem* > ImplStatusItemList; // - Progress-Ausgabe - - -void VCL_DLLPUBLIC DrawProgress( vcl::Window* pWindow, const Point& rPos, - long nOffset, long nPrgsWidth, long nPrgsHeight, - sal_uInt16 nPercent1, sal_uInt16 nPercent2, sal_uInt16 nPercentCount, - const Rectangle& rFramePosSize - ); +void VCL_DLLPUBLIC DrawProgress(vcl::Window* pWindow, vcl::RenderContext& rRenderContext, const Point& rPos, + long nOffset, long nPrgsWidth, long nPrgsHeight, + sal_uInt16 nPercent1, sal_uInt16 nPercent2, sal_uInt16 nPercentCount, + const Rectangle& rFramePosSize); // - StatusBarItemBits - diff --git a/vcl/source/control/prgsbar.cxx b/vcl/source/control/prgsbar.cxx index b4807544250d..b9e8cb932a12 100644 --- a/vcl/source/control/prgsbar.cxx +++ b/vcl/source/control/prgsbar.cxx @@ -117,33 +117,37 @@ void ProgressBar::ImplInitSettings( bool bFont, } } -void ProgressBar::ImplDrawProgress(vcl::RenderContext& /*rRenderContext*/, sal_uInt16 nOldPerc, sal_uInt16 nNewPerc) +void ProgressBar::ImplDrawProgress(vcl::RenderContext& rRenderContext, sal_uInt16 nOldPerc, sal_uInt16 nNewPerc) { - if ( mbCalcNew ) + if (mbCalcNew) { mbCalcNew = false; - Size aSize = GetOutputSizePixel(); - mnPrgsHeight = aSize.Height()-(PROGRESSBAR_WIN_OFFSET*2); - mnPrgsWidth = (mnPrgsHeight*2)/3; + Size aSize = rRenderContext.GetOutputSizePixel(); + mnPrgsHeight = aSize.Height() - (PROGRESSBAR_WIN_OFFSET * 2); + mnPrgsWidth = (mnPrgsHeight * 2) / 3; maPos.Y() = PROGRESSBAR_WIN_OFFSET; - long nMaxWidth = (aSize.Width()-(PROGRESSBAR_WIN_OFFSET*2)+PROGRESSBAR_OFFSET); + long nMaxWidth = (aSize.Width() - (PROGRESSBAR_WIN_OFFSET * 2) + PROGRESSBAR_OFFSET); sal_uInt16 nMaxCount = (sal_uInt16)(nMaxWidth / (mnPrgsWidth+PROGRESSBAR_OFFSET)); - if ( nMaxCount <= 1 ) + if (nMaxCount <= 1) + { nMaxCount = 1; + } else { - while ( ((10000/(10000/nMaxCount))*(mnPrgsWidth+PROGRESSBAR_OFFSET)) > nMaxWidth ) + while (((10000 / (10000 / nMaxCount)) * (mnPrgsWidth + PROGRESSBAR_OFFSET)) > nMaxWidth) + { nMaxCount--; + } } - mnPercentCount = 10000/nMaxCount; - nMaxWidth = ((10000/(10000/nMaxCount))*(mnPrgsWidth+PROGRESSBAR_OFFSET))-PROGRESSBAR_OFFSET; - maPos.X() = (aSize.Width()-nMaxWidth)/2; + mnPercentCount = 10000 / nMaxCount; + nMaxWidth = ((10000 / (10000 / nMaxCount)) * (mnPrgsWidth + PROGRESSBAR_OFFSET)) - PROGRESSBAR_OFFSET; + maPos.X() = (aSize.Width() - nMaxWidth) / 2; } - ::DrawProgress( this, maPos, PROGRESSBAR_OFFSET, mnPrgsWidth, mnPrgsHeight, - nOldPerc*100, nNewPerc*100, mnPercentCount, - Rectangle( Point(), GetSizePixel() ) ); + ::DrawProgress(this, rRenderContext, maPos, PROGRESSBAR_OFFSET, mnPrgsWidth, mnPrgsHeight, + nOldPerc * 100, nNewPerc * 100, mnPercentCount, + Rectangle(Point(), GetSizePixel())); } void ProgressBar::Paint(vcl::RenderContext& rRenderContext, const Rectangle& /*rRect*/) diff --git a/vcl/source/window/status.cxx b/vcl/source/window/status.cxx index 7b7efafe310b..61456149b07b 100644 --- a/vcl/source/window/status.cxx +++ b/vcl/source/window/status.cxx @@ -468,147 +468,143 @@ void StatusBar::ImplDrawItem(vcl::RenderContext& /*rRenderContext*/, bool bOffSc CallEventListeners( VCLEVENT_STATUSBAR_DRAWITEM, reinterpret_cast(pItem->mnId) ); } -void DrawProgress( vcl::Window* pWindow, const Point& rPos, - long nOffset, long nPrgsWidth, long nPrgsHeight, - sal_uInt16 nPercent1, sal_uInt16 nPercent2, sal_uInt16 nPercentCount, - const Rectangle& rFramePosSize - ) +void DrawProgress(vcl::Window* pWindow, vcl::RenderContext& rRenderContext, const Point& rPos, + long nOffset, long nPrgsWidth, long nPrgsHeight, + sal_uInt16 nPercent1, sal_uInt16 nPercent2, sal_uInt16 nPercentCount, + const Rectangle& rFramePosSize) { - if( pWindow->IsNativeControlSupported( CTRL_PROGRESS, PART_ENTIRE_CONTROL ) ) + if (rRenderContext.IsNativeControlSupported(CTRL_PROGRESS, PART_ENTIRE_CONTROL)) { bool bNeedErase = ImplGetSVData()->maNWFData.mbProgressNeedsErase; long nFullWidth = (nPrgsWidth + nOffset) * (10000 / nPercentCount); long nPerc = (nPercent2 > 10000) ? 10000 : nPercent2; - ImplControlValue aValue( nFullWidth * (long)nPerc / 10000 ); - Rectangle aDrawRect( rPos, Size( nFullWidth, nPrgsHeight ) ); - Rectangle aControlRegion( aDrawRect ); - if( bNeedErase ) + ImplControlValue aValue(nFullWidth * long(nPerc) / 10000); + Rectangle aDrawRect(rPos, Size(nFullWidth, nPrgsHeight)); + Rectangle aControlRegion(aDrawRect); + + if(bNeedErase) { vcl::Window* pEraseWindow = pWindow; - while( pEraseWindow->IsPaintTransparent() && - ! pEraseWindow->ImplGetWindowImpl()->mbFrame ) + while (pEraseWindow->IsPaintTransparent() && !pEraseWindow->ImplGetWindowImpl()->mbFrame) { pEraseWindow = pEraseWindow->ImplGetWindowImpl()->mpParent; } - if( pEraseWindow == pWindow ) + + if (pEraseWindow == pWindow) + { // restore background of pWindow - pEraseWindow->Erase( rFramePosSize ); + rRenderContext.Erase(rFramePosSize); + } else { // restore transparent background - Point aTL( pWindow->OutputToAbsoluteScreenPixel( rFramePosSize.TopLeft() ) ); - aTL = pEraseWindow->AbsoluteScreenToOutputPixel( aTL ); - Rectangle aRect( aTL, rFramePosSize.GetSize() ); - pEraseWindow->Invalidate( aRect, INVALIDATE_NOCHILDREN | - INVALIDATE_NOCLIPCHILDREN | - INVALIDATE_TRANSPARENT ); + Point aTL(pWindow->OutputToAbsoluteScreenPixel(rFramePosSize.TopLeft())); + aTL = pEraseWindow->AbsoluteScreenToOutputPixel(aTL); + Rectangle aRect(aTL, rFramePosSize.GetSize()); + pEraseWindow->Invalidate(aRect, INVALIDATE_NOCHILDREN | + INVALIDATE_NOCLIPCHILDREN | + INVALIDATE_TRANSPARENT); pEraseWindow->Update(); } - pWindow->Push( PushFlags::CLIPREGION ); - pWindow->IntersectClipRegion( rFramePosSize ); + rRenderContext.Push(PushFlags::CLIPREGION); + rRenderContext.IntersectClipRegion(rFramePosSize); } - bool bNativeOK = pWindow->DrawNativeControl( CTRL_PROGRESS, PART_ENTIRE_CONTROL, aControlRegion, - ControlState::ENABLED, aValue, OUString() ); - if( bNeedErase ) - pWindow->Pop(); - if( bNativeOK ) - { - pWindow->Flush(); + + bool bNativeOK = rRenderContext.DrawNativeControl(CTRL_PROGRESS, PART_ENTIRE_CONTROL, aControlRegion, + ControlState::ENABLED, aValue, OUString()); + if (bNeedErase) + rRenderContext.Pop(); + if (bNativeOK) return; - } } // precompute values sal_uInt16 nPerc1 = nPercent1 / nPercentCount; sal_uInt16 nPerc2 = nPercent2 / nPercentCount; - if ( nPerc1 > nPerc2 ) + if (nPerc1 > nPerc2) { // support progress that can also decrease // compute rectangle - long nDX = nPrgsWidth + nOffset; - long nLeft = rPos.X()+((nPerc1-1)*nDX); - Rectangle aRect( nLeft, rPos.Y(), nLeft+nPrgsWidth, rPos.Y()+nPrgsHeight ); + long nDX = nPrgsWidth + nOffset; + long nLeft = rPos.X() + ((nPerc1 - 1) * nDX); + Rectangle aRect(nLeft, rPos.Y(), nLeft + nPrgsWidth, rPos.Y() + nPrgsHeight); do { - pWindow->Erase( aRect ); + rRenderContext.Erase(aRect); aRect.Left() -= nDX; aRect.Right() -= nDX; nPerc1--; } - while ( nPerc1 > nPerc2 ); - - pWindow->Flush(); + while (nPerc1 > nPerc2); } - else if ( nPerc1 < nPerc2 ) + else if (nPerc1 < nPerc2) { // draw Percent rectangle // if Percent2 greater than 100%, adapt values - if ( nPercent2 > 10000 ) + if (nPercent2 > 10000) { nPerc2 = 10000 / nPercentCount; - if ( nPerc1 >= nPerc2 ) - nPerc1 = nPerc2-1; + if (nPerc1 >= nPerc2) + nPerc1 = nPerc2 - 1; } // compute rectangle - long nDX = nPrgsWidth + nOffset; - long nLeft = rPos.X()+(nPerc1*nDX); - Rectangle aRect( nLeft, rPos.Y(), nLeft+nPrgsWidth, rPos.Y()+nPrgsHeight ); + long nDX = nPrgsWidth + nOffset; + long nLeft = rPos.X() + (nPerc1 * nDX); + Rectangle aRect(nLeft, rPos.Y(), nLeft + nPrgsWidth, rPos.Y() + nPrgsHeight); do { - pWindow->DrawRect( aRect ); + rRenderContext.DrawRect(aRect); aRect.Left() += nDX; aRect.Right() += nDX; nPerc1++; } - while ( nPerc1 < nPerc2 ); + while (nPerc1 < nPerc2); // if greater than 100%, set rectangle to blink - if ( nPercent2 > 10000 ) + if (nPercent2 > 10000) { // define on/off status - if ( ((nPercent2 / nPercentCount) & 0x01) == (nPercentCount & 0x01) ) + if (((nPercent2 / nPercentCount) & 0x01) == (nPercentCount & 0x01)) { aRect.Left() -= nDX; aRect.Right() -= nDX; - pWindow->Erase( aRect ); + rRenderContext.Erase(aRect); } } - - pWindow->Flush(); } } void StatusBar::ImplDrawProgress(vcl::RenderContext& rRenderContext, bool bPaint, sal_uInt16 nPercent1, sal_uInt16 nPercent2) { - bool bNative = IsNativeControlSupported( CTRL_PROGRESS, PART_ENTIRE_CONTROL ); + bool bNative = rRenderContext.IsNativeControlSupported(CTRL_PROGRESS, PART_ENTIRE_CONTROL); // bPaint: draw text also, else only update progress if (bPaint) { - DrawText( maPrgsTxtPos, maPrgsTxt ); - if( ! bNative ) + rRenderContext.DrawText(maPrgsTxtPos, maPrgsTxt); + if (!bNative) { DecorationView aDecoView(&rRenderContext); - aDecoView.DrawFrame( maPrgsFrameRect, FRAME_DRAW_IN ); + aDecoView.DrawFrame(maPrgsFrameRect, FRAME_DRAW_IN); } } - Point aPos( maPrgsFrameRect.Left()+STATUSBAR_PRGS_OFFSET, - maPrgsFrameRect.Top()+STATUSBAR_PRGS_OFFSET ); + Point aPos(maPrgsFrameRect.Left() + STATUSBAR_PRGS_OFFSET, + maPrgsFrameRect.Top() + STATUSBAR_PRGS_OFFSET); long nPrgsHeight = mnPrgsSize; - if( bNative ) + if (bNative) { aPos = maPrgsFrameRect.TopLeft(); nPrgsHeight = maPrgsFrameRect.GetHeight(); } - DrawProgress( this, aPos, mnPrgsSize / 2, mnPrgsSize, nPrgsHeight, - nPercent1 * 100, nPercent2 * 100, mnPercentCount, maPrgsFrameRect ); + DrawProgress(this, rRenderContext, aPos, mnPrgsSize / 2, mnPrgsSize, nPrgsHeight, + nPercent1 * 100, nPercent2 * 100, mnPercentCount, maPrgsFrameRect); } void StatusBar::ImplCalcProgressRect() -- cgit