systemswuis/touchscreencalib/src/TouchScreenCalibView.cpp
changeset 0 254040eb3b7d
child 32 3fec62e6e7fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/systemswuis/touchscreencalib/src/TouchScreenCalibView.cpp	Thu Dec 17 08:46:07 2009 +0200
@@ -0,0 +1,569 @@
+/*
+* Copyright (c) 2006 - 2007 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:  
+*     This class is the container class of the CTouchScreenCalibView.
+*     Is used to show tap target animation.
+*
+*/
+
+
+// SYSTEM INCLUDES
+#include <aknappui.h>
+#include <aknnotewrappers.h>
+#include <barsread.h>
+#include <AknBitmapAnimation.h>
+#include <ConeResLoader.h>
+#include <AknBidiTextUtils.h>
+#include <TouchScreenCalib_anim.rsg>
+#include <TouchScreenCalib.rsg>
+#include <touchscreencalib.mbg>
+
+// USER INCLUDES
+#include "TouchScreenCalibView.h"
+#include "TouchScreenCalibDefines.h"
+#include "TouchScreenCalibAppUi.h"
+
+// CONSTANTS
+_LIT( KTargetAnimationResource, "z:TouchScreenCalib_anim.rsc" );
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------------------------
+// CTouchScreenCalibView::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+void CTouchScreenCalibView::ConstructL()
+    {
+    TRACES("CTouchScreenCalibView::ConstructL()");
+
+    CreateWindowL();
+
+    iAnimImageRect.iAnimImageRect1 = iTouchScreenCalibAppUi->GetAnimImageRect(1);
+    iAnimImageRect.iAnimImageRect2 = iTouchScreenCalibAppUi->GetAnimImageRect(2);
+    iAnimImageRect.iAnimImageRect3 = iTouchScreenCalibAppUi->GetAnimImageRect(3);
+    iAnimImageRect.iAnimImageRect4 = iTouchScreenCalibAppUi->GetAnimImageRect(4);
+
+    // Parse filename of bitmaps
+    _LIT( KDirAndFile, "z:TouchScreenCalib.mif" );
+    TParse* fp1 = new(ELeave) TParse(); 
+    fp1->Set(KDirAndFile, &KDC_APP_BITMAP_DIR, NULL);
+    TFileName fileName( fp1->FullName() );
+    TRACES1("CTouchScreenCalibImage::CreateIconL(): Image: %S", &(fp1->FullName()) );
+    delete fp1;
+
+    AknIconUtils::CreateIconL( iBitmap, 
+                               iBitmapMask, 
+                               fileName, 
+                               EMbmTouchscreencalibQgn_graf_screencalib,
+                               EMbmTouchscreencalibQgn_graf_screencalib_mask);
+
+    iAvkonAppUi->StatusPane()->MakeVisible(EFalse);
+
+    TRACES("CTouchScreenCalibView::ConstructL(): Animation loading started");
+    iAnim = CAknBitmapAnimation::NewL();
+    iAnim->SetContainerWindowL( *this );
+    iAnim->SetScaleModeForAnimationFrames(EAspectRatioPreservedAndUnusedSpaceRemoved);
+    TResourceReader rr;
+    RConeResourceLoader loader( *iCoeEnv );
+
+    TParse* fp = new(ELeave) TParse(); 
+    fp->Set(KTargetAnimationResource, &KDC_APP_RESOURCE_DIR, NULL);
+    TRACES1("CTouchScreenCalibView::ConstructL(): Animated target resource path: %S", &fp->FullName());
+    TFileName name( fp->FullName() );
+    delete fp;
+    TInt fileError = loader.Open( name );
+    if ( fileError == KErrNone )
+        {
+        CleanupClosePushL( loader );
+        iCoeEnv->CreateResourceReaderLC(rr, R_SHUTDOWN_ANIM);
+        TRAPD(err, iAnim->ConstructFromResourceL( rr ));
+        if( err == KErrNone )
+            {
+            TResourceReader timeReader;
+            iCoeEnv->CreateResourceReaderLC(timeReader, R_ANIM_DURATION);
+            CleanupStack::PopAndDestroy(); // pop timeReader
+            iAnim->SetPosition(TPoint(0,0));
+            iAnim->SetSize(TSize(0,0));
+            TRACES("CTouchScreenCalibView::ConstructL(): animation succesfully loaded");
+            }
+        else
+            {
+            TRACES("CTouchScreenCalibView::ConstructL(): animation loading failed");
+            }
+        CleanupStack::PopAndDestroy(); //pop rr
+        TRACES("CTouchScreenCalibView::ConstructL(): animation loading ended");
+        CleanupStack::PopAndDestroy(); //pop loader
+        }
+    else
+        {
+        TRACES("CTouchScreenCalibView::ConstructL(): resource file loading failed");
+        }
+
+    SetRect(iAvkonAppUi->ApplicationRect());
+    ActivateL();
+
+    iFont = AknLayoutUtils::FontFromId(EAknLogicalFontSecondaryFont);
+    iText = new( ELeave ) CArrayPtrFlat<HBufC>( 20 );
+
+    TApaTask self(iCoeEnv->WsSession());
+    self.SetWgId(iCoeEnv->RootWin().Identifier());
+    self.BringToForeground(); 
+
+    if (iTouchScreenCalibAppUi->FirstBoot())
+        {
+        Window().SetOrdinalPosition( 0, ECoeWinPriorityAlwaysAtFront + 10000 );
+        }
+    else
+        {
+        Window().SetOrdinalPosition( 0, ECoeWinPriorityHigh + 1 );
+        }
+    iTouchFeedback = MTouchFeedback::Instance();
+
+    TRACES("CTouchScreenCalibView::ConstructL(): ConstructL ended");
+    }
+
+// -----------------------------------------------------------------------------
+// CTouchScreenCalibView::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CTouchScreenCalibView* CTouchScreenCalibView::NewL( CTouchScreenCalibAppUi* aTouchScreenCalibAppUi )
+    {
+    TRACES("CTouchScreenCalibView::NewL()");
+    CTouchScreenCalibView* self = new (ELeave) CTouchScreenCalibView( aTouchScreenCalibAppUi );
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// ---------------------------------------------------------
+// CTouchScreenCalibView::CTouchScreenCalibView()
+// ---------------------------------------------------------
+CTouchScreenCalibView::CTouchScreenCalibView( CTouchScreenCalibAppUi* aTouchScreenCalibAppUi ) :
+    iTouchScreenCalibAppUi( aTouchScreenCalibAppUi ),
+    iAnimationShowing( EFalse ),
+    iAnimationCancelled ( EFalse ),
+    iText( NULL ),
+    iCalibrationCompleted( EFalse )
+    {
+    TRACES("CTouchScreenCalibView::CTouchScreenCalibView()");
+    TRACES("CTouchScreenCalibView::CTouchScreenCalibView(): End");
+    }
+
+// ---------------------------------------------------------------------------
+// CTouchScreenCalibView::UpdateL( TAknLayoutText aTextLayout  )
+// ---------------------------------------------------------------------------
+void CTouchScreenCalibView::UpdateL( TAknLayoutText aTextLayout )
+    {
+    TRACES("CTouchScreenCalibView::UpdateL()");
+
+    TRect rect = iTouchScreenCalibAppUi->GetAnimImageRect();
+
+    SetTextL(aTextLayout);
+    EndAnimation();
+    DrawDeferred();
+
+    TPoint pos = TPoint(rect.iTl.iX, rect.iTl.iY);
+    TSize size = TSize(rect.iBr.iX-rect.iTl.iX, rect.iBr.iY-rect.iTl.iY);
+    iAnim->SetPosition(pos);
+    iAnim->SetSize(size);
+
+    TRAPD(err, iAnim->StartAnimationL());      
+    if ( err != KErrNone )
+        {
+        TRACES("CTouchScreenCalibView::UpdateL(): Starting animation failed");
+        }
+    
+    TRACES("CTouchScreenCalibView::UpdateL(): End");
+    }
+
+// ---------------------------------------------------------------------------
+// CTouchScreenCalibView::DrawEndingBackground()
+// ---------------------------------------------------------------------------
+void CTouchScreenCalibView::DrawEndingBackground()
+    {
+    TRACES("CTouchScreenCalibView::DrawEndingBackground()");
+    iCalibrationCompleted = ETrue;
+    SetRect( iAvkonAppUi->ApplicationRect() );
+    EndAnimation();
+    DrawNow();
+    TRACES("CTouchScreenCalibView::DrawEndingBackground(): End");
+    }
+
+// ---------------------------------------------------------------------------
+// CTouchScreenCalibView::EndTargetAnimation()
+// ---------------------------------------------------------------------------
+void CTouchScreenCalibView::EndTargetAnimation()
+    {
+    TRACES("CTouchScreenCalibView::EndTargetAnimation()");
+    EndAnimation();
+    DrawNow();
+    TRACES("CTouchScreenCalibView::EndTargetAnimation(): End");
+    }
+
+// ---------------------------------------------------------------------------
+// CTouchScreenCalibView::~CTouchScreenCalibView()
+// ---------------------------------------------------------------------------
+CTouchScreenCalibView::~CTouchScreenCalibView()
+    {
+    TRACES("CTouchScreenCalibView::~CTouchScreenCalibView() begin");
+
+    if( iAnim )
+        {
+        if( iAnimationShowing )
+            {
+            iAnim->CancelAnimation();
+            TRACES("CTouchScreenCalibView::~CTouchScreenCalibView() animation cancelled");
+            }
+        }
+    delete iAnim;
+    TRACES("CTouchScreenCalibView::~CTouchScreenCalibView() iAnim deleted");
+
+    if ( iText )
+        {
+        iText->ResetAndDestroy();
+        delete iText;
+        iText = NULL;
+        }
+
+    delete iBitmap;
+    delete iBitmapMask;
+
+    TRACES("CTouchScreenCalibView::~CTouchScreenCalibView() end");
+    }
+
+// ---------------------------------------------------------------------------
+// CTouchScreenCalibView::ComponentControl(TInt aIndex)
+// ---------------------------------------------------------------------------
+CCoeControl* CTouchScreenCalibView::ComponentControl(TInt aIndex) const
+    {
+    switch ( aIndex )
+        {
+        case 0:
+            {
+            return iAnim;
+            }
+        default:
+            {
+            return NULL;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CTouchScreenCalibView::CountComponentControls()
+// ---------------------------------------------------------------------------
+TInt CTouchScreenCalibView::CountComponentControls() const
+    {
+    return iAnim ? 1 : 0; // return nbr of controls inside this container
+    }
+
+// ---------------------------------------------------------------------------
+// CTouchScreenCalibView::Draw(const TRect& aRect) const
+// ---------------------------------------------------------------------------
+void CTouchScreenCalibView::Draw(const TRect& ) const
+    {
+    TRACES("CTouchScreenCalibView::Draw()");
+    DrawBackground();
+    if (!iCalibrationCompleted)
+        {
+        DrawText();
+        ShowImage(iAnimImageRect.iAnimImageRect1);
+        ShowImage(iAnimImageRect.iAnimImageRect2);
+        ShowImage(iAnimImageRect.iAnimImageRect3);
+        ShowImage(iAnimImageRect.iAnimImageRect4);
+        }
+    TRACES("CTouchScreenCalibView::Draw(): End");
+    }
+
+// ---------------------------------------------------------------------------
+// CTouchScreenCalibView::SizeChanged()
+// ---------------------------------------------------------------------------
+void CTouchScreenCalibView::SizeChanged()
+    {
+    if( iAnim )
+        {
+        iAnim->SetRect(Rect());
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CTouchScreenCalibView::EndAnimation()
+// ---------------------------------------------------------------------------
+void CTouchScreenCalibView::EndAnimation() 
+    {
+    TRACES("CTouchScreenCalibView::EndAnimation()");
+    iAnim->CancelAnimation();
+    TRACES("CTouchScreenCalibView::EndAnimation(): End");
+    }
+
+// ---------------------------------------------------------------------------
+// CTouchScreenCalibView::HandleControlEventL(...)
+// ---------------------------------------------------------------------------
+void CTouchScreenCalibView::HandleControlEventL(
+        CCoeControl* ,
+        TCoeEvent )
+    {
+    //pure virtual from MCoeControlObserver
+    TRACES("CTouchScreenCalibView::HandleControlEventL()");
+    }
+
+// ---------------------------------------------------------------------------
+// CTouchScreenCalibView::OfferKeyEventL(...)
+// ---------------------------------------------------------------------------
+TKeyResponse CTouchScreenCalibView::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType)
+    {
+    TRACES("CTouchScreenCalibView::OfferKeyEventL()");
+    iTouchScreenCalibAppUi->HandleKeyL( aKeyEvent, aType );
+    TRACES("CTouchScreenCalibView::OfferKeyEventL(): End: return EKeyWasConsumed");
+    return EKeyWasConsumed;
+    }
+
+// ----------------------------------------------------
+// CTouchScreenCalibView::HandleKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+// ----------------------------------------------------
+TKeyResponse CTouchScreenCalibView::HandleKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+    TRACES("CTouchScreenCalibView::HandleKeyEventL()");
+    iTouchScreenCalibAppUi->HandleKeyL( aKeyEvent, aType );
+    TRACES("CTouchScreenCalibView::HandleKeyEventL(): End: return EKeyWasConsumed");
+    return EKeyWasConsumed;
+    }
+
+// ----------------------------------------------------
+// CTouchScreenCalibView::HandlePointerEventL(const TPointerEvent& aPointerEvent)
+// ----------------------------------------------------
+void CTouchScreenCalibView::HandlePointerEventL(const TPointerEvent& aPointerEvent)
+    {
+    TRACES("CTouchScreenCalibView::HandlePointerEventL()");
+    if (aPointerEvent.iType == TPointerEvent::EButton1Up)
+        {
+        TRACES("CTouchScreenCalibView::HandlePointerEventL(): EButton1Up");
+        TRACES1("CTouchScreenCalibView::HandlePointerEventL(): X = %d",aPointerEvent.iPosition.iX);
+        TRACES1("CTouchScreenCalibView::HandlePointerEventL(): Y = %d",aPointerEvent.iPosition.iY);
+
+        TPoint pos;
+
+        pos.iX = aPointerEvent.iPosition.iX;
+        pos.iY = aPointerEvent.iPosition.iY;
+        if (Validate(pos))
+            {
+            iTouchFeedback->InstantFeedback( ETouchFeedbackBasic );
+            iTouchScreenCalibAppUi->HandlePointerL( pos );
+            }
+        }
+    TRACES("CTouchScreenCalibView::HandlePointerEventL(): End --------------- Waiting for next event -------------");
+    }
+
+// ----------------------------------------------------
+// CTouchScreenCalibView::Validate(TPoint aPos)
+// ----------------------------------------------------
+TBool CTouchScreenCalibView::Validate(TPoint aPos)
+    {
+    TRACES("CTouchScreenCalibView::Validate()");
+    TInt retval( EFalse );
+
+    if ((aPos.iX > iTouchScreenCalibAppUi->GetAnimImageRect().iTl.iX) && 
+        (aPos.iX < iTouchScreenCalibAppUi->GetAnimImageRect().iBr.iX) &&
+        (aPos.iY > iTouchScreenCalibAppUi->GetAnimImageRect().iTl.iY) &&
+        (aPos.iY < iTouchScreenCalibAppUi->GetAnimImageRect().iBr.iY))
+        {
+        retval = ETrue;
+        }
+    TRACES1("CTouchScreenCalibView::Validate(): End: Return %d",retval);
+    return retval;
+    }
+
+// ---------------------------------------------------------------------------
+// CTouchScreenCalibView::DrawBackground() const
+// ---------------------------------------------------------------------------
+void CTouchScreenCalibView::DrawBackground() const
+    {
+    TRACES("CTouchScreenCalibView::DrawBackground()");
+    CWindowGc& gc = SystemGc();
+    TRect rect = iAvkonAppUi->ApplicationRect();
+    gc.SetPenStyle(CGraphicsContext::ENullPen);
+    gc.SetBrushColor(KRgbWhite);
+    gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+    gc.DrawRect(rect);
+    ControlEnv()->WsSession().Flush(); // force draw of the context
+    TRACES("CTouchScreenCalibView::DrawBackground(): End");
+    }
+
+// ---------------------------------------------------------------------------
+// CTouchScreenCalibView::DrawText()
+// ---------------------------------------------------------------------------
+void CTouchScreenCalibView::DrawText() const
+    {
+    TRACES("CTouchScreenCalibView::DrawText()");
+
+    CWindowGc& gc = SystemGc();
+
+    gc.SetPenStyle(CGraphicsContext::ENullPen);
+
+    gc.UseFont( iFont );
+
+    gc.SetBrushStyle(CGraphicsContext::ENullBrush);
+
+    TPoint position( 0, 0 );
+    TPoint topLeft;
+    position = iTextTopLeft;
+
+    for ( TInt index = 0 ;
+          index < iText->Count();
+          index++, position.iY += iTextBaselineOffset )
+        {
+        HBufC* text = (*iText)[ index ];
+        if ( text )
+            {
+            topLeft = TPoint( position.iX, position.iY - iTextBaselineOffset );
+            gc.SetPenColor(iTextColor);
+            TRACES2("CTouchScreenCalibView::DrawText(): TopLeft: %d, %d", topLeft.iX, topLeft.iY);
+            gc.DrawText( *text,
+                         TRect( topLeft, iTextSize ),
+                         iTextBaselineOffset,
+                         iTextAlignment );
+            }
+        }
+    ControlEnv()->WsSession().Flush(); // force draw of the context
+    gc.DiscardFont();
+    TRACES("CTouchScreenCalibView::DrawText(): End");
+    }
+
+// -----------------------------------------------------------------------------
+// CTouchScreenCalibView::SetTextL(TAknLayoutText aTextLayout)
+// -----------------------------------------------------------------------------
+void CTouchScreenCalibView::SetTextL(TAknLayoutText aTextLayout)
+    {
+    TRACES("CTouchScreenCalibView::SetTextL()");
+
+    TInt textLineWidth;
+
+    TRACES2("CTouchScreenCalibView::SetTextL(): Text rect top: X:%d Y:%d",aTextLayout.TextRect().iTl.iX, aTextLayout.TextRect().iTl.iY);
+    TRACES2("CTouchScreenCalibView::SetTextL(): Text rect:bot: X:%d Y:%d",aTextLayout.TextRect().iBr.iX, aTextLayout.TextRect().iBr.iY);
+
+    textLineWidth = aTextLayout.TextRect().Width();
+
+    iTextTopLeft = TPoint(aTextLayout.TextRect().iTl.iX, aTextLayout.TextRect().iTl.iY);
+
+    iTextBaselineOffset = iFont->HeightInPixels() * 4 / 3;
+
+    iTextSize = TSize(textLineWidth, iTextBaselineOffset + iFont->DescentInPixels());
+            
+    iTextColor = aTextLayout.Color();
+
+    iTextAlignment = CGraphicsContext::ECenter;
+
+    HBufC* mainText1 = StringLoader::LoadLC(R_QTN_TOUCH_SCREEN_CALI_INSTR_GEN, 
+                                            iTouchScreenCalibAppUi->GetCalibrationStep());
+
+    HBufC* mainText2;
+    if (iTouchScreenCalibAppUi->FirstBoot())
+        {
+        mainText2 = CEikonEnv::Static()->AllocReadResourceLC(R_QTN_TOUCH_SCREEN_CALI_INSTR_RES );
+        }
+    else
+        {
+        mainText2 = CEikonEnv::Static()->AllocReadResourceLC(R_QTN_TOUCH_SCREEN_CALI_INSTR_CAN );
+        }
+
+    TBuf<256> text;
+    text.Copy( mainText1->Des() );
+    _LIT(KLineChange, "\n");
+    text.Append(KLineChange);
+    text.Append(mainText2->Des());
+
+    TRACES1("CTouchScreenCalibView::SetTextL(): text: %S",&text);
+
+    CArrayFix<TPtrC>* wrappedArray =
+        new( ELeave ) CArrayFixFlat<TPtrC>( 10 );
+    CleanupStack::PushL( wrappedArray );
+
+    HBufC* dataToDestroy =
+        AknBidiTextUtils::ConvertToVisualAndWrapToArrayL(
+            text, textLineWidth, *iFont, *wrappedArray
+        );
+
+    TInt numLines( wrappedArray->Count() );
+    TRACES1("CTouchScreenCalibView::SetTextL(): Number of lines: %d",numLines );
+
+    if ( iText )
+        {
+        iText->ResetAndDestroy();
+        delete iText;
+        iText = NULL;
+        }
+    iText = new( ELeave ) CArrayPtrFlat<HBufC>( 20 );
+
+    for ( TInt i = 0 ; i < numLines ; i++ )
+        {
+        HBufC* line = (*wrappedArray)[i].AllocLC();
+        TInt lineLength = line->Length();
+        TRACES1("CTouchScreenCalibView::SetTextL(): lineLength: %d",lineLength);        
+        if(!lineLength)
+            {
+            iText->AppendL( NULL );
+            CleanupStack::PopAndDestroy(line);  // line
+            }
+        else
+            {
+            iText->AppendL( line );
+            CleanupStack::Pop(line);  // line
+            }
+        }
+    iText->AppendL( NULL );
+
+    // If the last char was newline, add one extra, since
+    // wrapping automatically removes it.
+    if ( text[ text.Length() - 1 ] == '\n' )
+        {
+        iText->AppendL( NULL );
+        }
+
+    CleanupStack::PopAndDestroy(wrappedArray); // wrappedArray
+    delete dataToDestroy;
+
+    CleanupStack::PopAndDestroy(2); //mainText1, mainText2
+    TRACES("CTouchScreenCalibView::SetTextL(); End");
+    }
+
+// -----------------------------------------------------------------------------
+// CTouchScreenCalibView::ShowImage(TRect aRect)
+// -----------------------------------------------------------------------------
+void CTouchScreenCalibView::ShowImage(TRect aRect) const
+    {
+    TRACES("CTouchScreenCalibView::ShowImage()");
+    CWindowGc& gc = SystemGc();    
+    AknIconUtils::SetSize( iBitmap, aRect.Size(), EAspectRatioPreservedAndUnusedSpaceRemoved );
+    gc.SetPenStyle(CGraphicsContext::ENullPen);
+    gc.SetBrushColor(KRgbRed);
+    gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+    gc.DrawRect(aRect);
+    gc.BitBlt( TPoint(aRect.iTl.iX, aRect.iTl.iY), iBitmap ); // CWindowGc member function
+    ControlEnv()->WsSession().Flush(); // force draw of the context
+    TRACES("CTouchScreenCalibView::ShowImage(): End");
+    }
+
+// -----------------------------------------------------------------------------
+// CTouchScreenCalibView::SetWinPriority()
+// -----------------------------------------------------------------------------
+void CTouchScreenCalibView::SetWinPriority(TInt aPriority)
+    {
+    TRACES("CTouchScreenCalibView::SetWinPriority()");
+    Window().SetOrdinalPosition( 0, aPriority );
+    TRACES("CTouchScreenCalibView::SetWinPriority(): End");
+    }
+
+//  End of File