diff -r 000000000000 -r 2f259fa3e83a uifw/eikctl/src/EIKPROGI.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/eikctl/src/EIKPROGI.CPP Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,477 @@ +/* +* Copyright (c) 1997-1999 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include // for arabic texts support + +#include + +#include +#include +#include +#include +using namespace AppLayout; + +const TInt KDefaultSpaceBetweenBlocks=1; + +class CEikProgressInfoExtension : public CBase + { +public: + CEikProgressInfoExtension(); + ~CEikProgressInfoExtension(); + + void DeleteBitmaps(); + + CFbsBitmap* iFrameLeft; + CFbsBitmap* iFrameCenter; + CFbsBitmap* iFrameRight; + + CFbsBitmap* iFrameLeftMask; + CFbsBitmap* iFrameCenterMask; + CFbsBitmap* iFrameRightMask; + + CFbsBitmap* iOldBackgroundBitmapMask; + }; + +CEikProgressInfoExtension::CEikProgressInfoExtension() + { + } +CEikProgressInfoExtension::~CEikProgressInfoExtension() + { + } + +void CEikProgressInfoExtension::DeleteBitmaps() + { + delete iFrameLeft; + iFrameLeft = NULL; + delete iFrameCenter; + iFrameCenter = NULL; + delete iFrameRight; + iFrameRight = NULL; + delete iFrameLeftMask; + iFrameLeftMask = NULL; + delete iFrameCenterMask; + iFrameCenterMask = NULL; + delete iFrameRightMask; + iFrameRightMask = NULL; + delete iOldBackgroundBitmapMask; + iOldBackgroundBitmapMask = NULL; + } + +EXPORT_C CEikProgressInfo::~CEikProgressInfo() + { + DeleteBitmaps(); + delete iExtension; + AknsUtils::DeregisterControlPosition(this); + } + +EXPORT_C CEikProgressInfo::CEikProgressInfo() + { + __DECLARE_NAME(_S("CEikProgressInfo")); + } + +EXPORT_C CEikProgressInfo::CEikProgressInfo(const SInfo& aProgInfo) + { + __DECLARE_NAME(_S("CEikProgressInfo")); + iInfo=aProgInfo; + Construct(); + } + +void CEikProgressInfo::Construct() + { + SetNonFocusing(); + iBorder=TGulBorder(TGulBorder::ENone); + + iLayout.iFillColor= iEikonEnv->ControlColor(EColorControlHighlightBackground, *this); //KEikProgressInfoDefaultFillColor; + iLayout.iEmptyColor=iEikonEnv->ControlColor(EColorControlBackground, *this); //KEikProgressInfoDefaultEmptyColor; + iLayout.iFillTextColor=iEikonEnv->ControlColor(EColorControlHighlightText, *this); //KEikProgressInfoDefaultFillTextColor; + iLayout.iEmptyTextColor=iEikonEnv->ControlColor(EColorControlText, *this); //KEikProgressInfoDefaultEmptyTextColor; + + iLayout.iGapBetweenBlocks=KDefaultSpaceBetweenBlocks; + if (iInfo.iHeight) + iHeightWasSupplied=ETrue; + } + +// AKNLAF start +EXPORT_C void CEikProgressInfo::ConstructL() + { +// /* TODO: Commented out temporarily. Do we need this? + +// TAknLayoutRect voiceRecordRect, prNoteRect, addInfoRect; +// voiceRecordRect.LayoutRect(Rect(), Voice_Recorder_elements_Line_4()); +// prNoteRect.LayoutRect(Rect(), AKN_LAYOUT_WINDOW_Wait_or_progress_note_pop_up_window_elements_Line_2); +// addInfoRect.LayoutRect(Rect(), AKN_LAYOUT_WINDOW_Note_with_additional_information_popup_window_elements_Line_2( 1 )); +// TInt voiceRecordWidth = voiceRecordRect.Rect().Width(); +// TInt prNoteWidth = prNoteRect.Rect().Width(); +// TInt addInfoWidth = addInfoRect.Rect().Width(); +// __ASSERT_ALWAYS( iInfo.iWidth==voiceRecordWidth/*Voice_Recorder_elements_Line_4().iW*/ +// || iInfo.iWidth==prNoteWidth/*AKN_LAYOUT_WINDOW_Wait_or_progress_note_pop_up_window_elements_Line_2.iW*/ +// || iInfo.iWidth==addInfoWidth/*AKN_LAYOUT_WINDOW_Note_with_additional_information_popup_window_elements_Line_2( 1 ).iW*/, +// Panic(EEikPanicOutOfRange) ); +// */ + iExtension = new (ELeave) CEikProgressInfoExtension; + LoadBitmapsL(); + } +// AKNLAF end + +EXPORT_C void CEikProgressInfo::ConstructFromResourceL(TResourceReader &aReader) + { + iInfo.iTextType=(TEikProgressTextType)aReader.ReadInt16(); + iInfo.iSplitsInBlock=aReader.ReadInt16(); + iInfo.iFinalValue=aReader.ReadInt32(); + iInfo.iWidth=aReader.ReadInt32(); + iInfo.iHeight=aReader.ReadInt32(); + Construct(); + ConstructL(); + } + +EXPORT_C void CEikProgressInfo::SetLayout(const SLayout& aLayout) + { + iLayout=aLayout; + } + +EXPORT_C void CEikProgressInfo::SetBorder(const TGulBorder& aBorder) + { + iBorder=aBorder; + } + +void CEikProgressInfo::CheckSizeCalculated() + { + if (!iLayout.iFont) + iLayout.iFont=iCoeEnv->NormalFont(); + if (iSize.iWidth) + return; + if (!iHeightWasSupplied) + iInfo.iHeight=iLayout.iFont->HeightInPixels()+1; + const TSize margins=iBorder.SizeDelta(); + iSize.SetSize(iInfo.iWidth+margins.iWidth,iInfo.iHeight+margins.iHeight); + } + +EXPORT_C void CEikProgressInfo::SetFinalValue(TInt aFinalValue) + { + iInfo.iFinalValue=aFinalValue? aFinalValue : 1; + } + +EXPORT_C void CEikProgressInfo::SizeChanged() + { + const TSize margins=iBorder.SizeDelta(); + iInfo.iWidth=iSize.iWidth-margins.iWidth; + iInfo.iHeight=iSize.iHeight-margins.iHeight; + + SetBitmapSizes(); + + AknsUtils::RegisterControlPosition(this); + } + +EXPORT_C TSize CEikProgressInfo::MinimumSize() + { + if (!iLayout.iFont) + iLayout.iFont=iCoeEnv->NormalFont(); + if (!iHeightWasSupplied) + iInfo.iHeight=iLayout.iFont->HeightInPixels()+1; + const TSize margins=iBorder.SizeDelta(); + return TSize(iInfo.iWidth+margins.iWidth,iInfo.iHeight+margins.iHeight); + } + +EXPORT_C void CEikProgressInfo::ActivateL() + { + CheckSizeCalculated(); + CCoeControl::ActivateL(); + SetBitmapSizes(); + } + +// AKNLAF start +EXPORT_C void CEikProgressInfo::Draw(const TRect& /*aRect*/) const + { + CWindowGc& gc = SystemGc(); + DrawProgressBarForeground(gc); + DrawProgressBarBackground(gc); + } + +void CEikProgressInfo::DrawPartial() const + { + ActivateGc(); + DrawProgressBarForeground(SystemGc()); + DeactivateGc(); + } + +TInt CEikProgressInfo::FilledWidth() const + { + const TInt64 infoWidth = iInfo.iWidth; + const TInt64 currentValue = iCurrentValue; + const TInt64 width = infoWidth * currentValue / iInfo.iFinalValue; + return I64LOW(width); + } + +void CEikProgressInfo::DrawProgressBarForeground(CWindowGc& aGc) const + { + if (!iBitmap) + { + return; + } + + TRect visibleRect = TRect( 0, 0, FilledWidth(), iInfo.iHeight ); + + if (iBitmapMask) + { + aGc.BitBltMasked(TPoint(iPosition.iX, iPosition.iY), iBitmap, visibleRect, iBitmapMask, EFalse); + } + else + { + aGc.BitBlt(TPoint(iPosition.iX, iPosition.iY), iBitmap, visibleRect); + } + } + +void CEikProgressInfo::DrawProgressBarBackground(CWindowGc& aGc) const + { + if (!iExtension) + { + return; + } + + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + + TRect backgroundFrameRect = TRect( 0, 0, iInfo.iWidth, iInfo.iHeight ); + + TInt filledWidth = FilledWidth(); + TRect backRedrawRect(TPoint(iPosition.iX + filledWidth, iPosition.iY), TSize(backgroundFrameRect.Width() - filledWidth, backgroundFrameRect.Height())); + MAknsControlContext* cc = AknsDrawUtils::ControlContext( this ); + AknsDrawUtils::Background( skin, cc, this, aGc, backRedrawRect ); + + aGc.BitBltMasked( TPoint( iPosition.iX, iPosition.iY ), + iExtension->iFrameLeft, + TRect( iExtension->iFrameLeft->SizeInPixels() ), + iExtension->iFrameLeftMask, + EFalse); + + aGc.BitBltMasked( TPoint( iPosition.iX + iExtension->iFrameLeft->SizeInPixels().iWidth, + iPosition.iY), iExtension->iFrameCenter, + TRect( iExtension->iFrameCenter->SizeInPixels() ), + iExtension->iFrameCenterMask, EFalse); + + aGc.BitBltMasked( TPoint( iPosition.iX + iExtension->iFrameLeft->SizeInPixels().iWidth + + iExtension->iFrameCenter->SizeInPixels().iWidth, + iPosition.iY), iExtension->iFrameRight, + TRect( iExtension->iFrameRight->SizeInPixels() ), + iExtension->iFrameRightMask, EFalse); + } +// AKNLAF end + + +EXPORT_C const TDesC* CEikProgressInfo::EvaluateText(TDes& aTextBuf) const + { + if (!iInfo.iTextType) + return(NULL); + _LIT(KTextPercent,"%3d%%"); + _LIT(KOver,"%c"); + if (iInfo.iTextType==EEikProgressTextPercentage) + aTextBuf.Format(KTextPercent,iCurrentValue*100/iInfo.iFinalValue); + else + aTextBuf.Format(KOver,iCurrentValue,iInfo.iFinalValue); + // Support for arabic indic digits: + AknTextUtils::DisplayTextLanguageSpecificNumberConversion(aTextBuf); + return(&aTextBuf); // subclassers may wish to use their own buffer + } + +EXPORT_C void CEikProgressInfo::SetAndDraw(TInt aValue) + { + if (aValue < 0) + aValue = 0; + else if (aValue > iInfo.iFinalValue) + { + //aValue = iInfo.iFinalValue; + //no need for redrawing + return; + } + + if(iCurrentValue != aValue) + { + TInt oldWidth = FilledWidth(); + iCurrentValue = aValue; + if( FilledWidth() != oldWidth ) + { + DrawNow(); + } + } + } + +EXPORT_C void CEikProgressInfo::IncrementAndDraw(TInt aInc) + { + SetAndDraw(iCurrentValue+aInc); + } + +/** + * Gets the list of logical colors employed in the drawing of the control, + * paired with an explanation of how they are used. Appends the list to aColorUseList. + * + * @since ER5U + */ +EXPORT_C void CEikProgressInfo::GetColorUseListL(CArrayFix& aColorUseList) const + { + CEikBorderedControl::GetColorUseListL(aColorUseList); + + TInt commonAttributes = TCoeColorUse::EContents|TCoeColorUse::ENormal|TCoeColorUse::ENeutral; + TCoeColorUse colorUse; + + colorUse.SetLogicalColor(EColorControlText); + colorUse.SetUse(TCoeColorUse::EFore|TCoeColorUse::EActive|commonAttributes); + aColorUseList.AppendL(colorUse); + + colorUse.SetLogicalColor(EColorControlHighlightText); + colorUse.SetUse(TCoeColorUse::EFore|TCoeColorUse::EHighlights|commonAttributes); + aColorUseList.AppendL(colorUse); + + colorUse.SetLogicalColor(EColorControlBackground); + colorUse.SetUse(TCoeColorUse::EBack|TCoeColorUse::EActive|commonAttributes); + aColorUseList.AppendL(colorUse); + + colorUse.SetLogicalColor(EColorControlHighlightBackground); + colorUse.SetUse(TCoeColorUse::EBack|TCoeColorUse::EHighlights|commonAttributes); + aColorUseList.AppendL(colorUse); + } + +/** + * Handles a change to the control's resources of type aType + * which are shared across the environment, e.g. colors or fonts. + * + * @since ER5U + */ +EXPORT_C void CEikProgressInfo::HandleResourceChange(TInt aType) + { + if (aType == KAknsMessageSkinChange) + { + //load the new skin graphics + DeleteBitmaps(); + TRAP_IGNORE(LoadBitmapsL()); + SetBitmapSizes(); + } + + CEikBorderedControl::HandleResourceChange(aType); + } + +// from CCoeControl +/** + * Writes the internal state of the control and its components to aStream. + * Does nothing in release mode. + * Designed to be overidden and base called by subclasses. + * + * @internal + * @since App-Framework_6.1 + */ +#ifndef _DEBUG +EXPORT_C void CEikProgressInfo::WriteInternalStateL(RWriteStream&) const + {} +#else +EXPORT_C void CEikProgressInfo::WriteInternalStateL(RWriteStream& aWriteStream) const + { + CEikBorderedControl::WriteInternalStateL(aWriteStream); + } +#endif + +EXPORT_C void CEikProgressInfo::HandlePointerEventL(const TPointerEvent& aPointerEvent) + { + CEikBorderedControl::HandlePointerEventL(aPointerEvent); + } + +EXPORT_C void* CEikProgressInfo::ExtensionInterface( TUid /*aInterface*/ ) + { + return NULL; + } + +EXPORT_C void CEikProgressInfo::Reserved_2() + { + } + +void CEikProgressInfo::LoadBitmapsL() + { + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + + AknsUtils::CreateIconL( skin, KAknsIIDQgnGrafBarProgress, + iBitmap, iBitmapMask, KAvkonBitmapFile, + EMbmAvkonQgn_graf_bar_progress, + EMbmAvkonQgn_graf_bar_progress_mask ); + + // Preserve icon data to improve performance, because the icon is subsequently + // scaled to different sizes. No need to call DestroyIconData in this case. + // It is done automatically, when iBitmap is deleted. + AknIconUtils::PreserveIconData( iBitmap ); + + if ( iExtension ) + { + // Load the three frame icons and assign a proper size to them. + AknsUtils::CreateIconL( skin, KAknsIIDQgnGrafBarFrameSideL, + iExtension->iFrameLeft, iExtension->iFrameLeftMask, KAvkonBitmapFile, + EMbmAvkonQgn_graf_bar_frame_side_l, + EMbmAvkonQgn_graf_bar_frame_side_l_mask ); + + AknsUtils::CreateIconL( skin, KAknsIIDQgnGrafBarFrameCenter, + iExtension->iFrameCenter, iExtension->iFrameCenterMask, KAvkonBitmapFile, + EMbmAvkonQgn_graf_bar_frame_center, + EMbmAvkonQgn_graf_bar_frame_center_mask ); + + AknsUtils::CreateIconL( skin, KAknsIIDQgnGrafBarFrameSideR, + iExtension->iFrameRight, iExtension->iFrameRightMask, KAvkonBitmapFile, + EMbmAvkonQgn_graf_bar_frame_side_r, + EMbmAvkonQgn_graf_bar_frame_side_r_mask ); + } + } + +void CEikProgressInfo::SetBitmapSizes() + { + TRect barRect ( TSize ( iInfo.iWidth, iInfo.iHeight ) ); + AknIconUtils::SetSize( iBitmap, barRect.Size(), EAspectRatioNotPreserved ); + + if ( iExtension ) + { + TAknLayoutRect frameLayout; + frameLayout.LayoutRect( barRect, AknLayoutScalable_Avkon::wait_border_pane_g1() ); + AknIconUtils::SetSize( iExtension->iFrameLeft, frameLayout.Rect().Size(), EAspectRatioNotPreserved ); + frameLayout.LayoutRect( barRect, AknLayoutScalable_Avkon::wait_border_pane_g2() ); + AknIconUtils::SetSize( iExtension->iFrameCenter, frameLayout.Rect().Size(), EAspectRatioNotPreserved ); + frameLayout.LayoutRect( barRect, AknLayoutScalable_Avkon::wait_border_pane_g3() ); + AknIconUtils::SetSize( iExtension->iFrameRight, frameLayout.Rect().Size(), EAspectRatioNotPreserved ); + } + } + +void CEikProgressInfo::DeleteBitmaps() + { + //delete iBackgroundBitmapMask; // AKNLAF + //iBackgroundBitmapMask = NULL; + if (iExtension) + iExtension->DeleteBitmaps(); + delete iBackgroundBitmap; // AKNLAF + iBackgroundBitmap = NULL; + delete iBitmap; // AKNLAF + iBitmap = NULL; + delete iBitmapMask; + iBitmapMask = NULL; + }