uifw/eikctl/src/EIKPROGI.CPP
changeset 0 2f259fa3e83a
--- /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 <eikprogi.h>
+#include <eikon.hrh>
+#include <eikpanic.h>
+#include <coemain.h>
+#include <barsread.h>
+#include <gulbordr.h>
+#include <eikenv.h>
+
+#include <gulcolor.h>
+#include <avkon.mbg>
+#include <aknconsts.h>
+
+#include <AknsUtils.h>
+#include <AknsDrawUtils.h>
+
+#include <AknUtils.h> // for arabic texts support
+
+#include <AknIconUtils.h>
+
+#include <applayout.cdl.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <aknappui.h>
+#include <bitdev.h>
+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<TCoeColorUse>& 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;
+    }