messagingappbase/msgeditor/mediacontrolsrc/MsgImageControl.cpp
author hgs
Wed, 03 Nov 2010 22:55:44 +0530
changeset 80 8b14b30db193
parent 79 2981cb3aa489
permissions -rw-r--r--
201044_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
79
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2005-2006 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  
hgs
parents:
diff changeset
    15
*       MsgEditor image UI control - a Message Editor Base control.
hgs
parents:
diff changeset
    16
*
hgs
parents:
diff changeset
    17
*/
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
// INCLUDE FILES
hgs
parents:
diff changeset
    22
#include "MsgImageControl.h"
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
#include <DRMCommon.h>
hgs
parents:
diff changeset
    25
#include <AknUtils.h>               // AknsUtils
hgs
parents:
diff changeset
    26
#include <AknsDrawUtils.h>          // AknsDrawUtils
hgs
parents:
diff changeset
    27
#include <aknlayoutscalable_apps.cdl.h>
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
#include <MsgEditorView.h>          // CMsgEditorView
hgs
parents:
diff changeset
    30
#include <MsgEditorCommon.h>
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
#include <IHLImageFactory.h>        // IHLImageFactory
hgs
parents:
diff changeset
    33
#include <IHLViewerFactory.h>       // IHLViewerFactory
hgs
parents:
diff changeset
    34
#include <MIHLFileImage.h>          // MIHLFileImage
hgs
parents:
diff changeset
    35
#include <MIHLBitmap.h>             // MIHLBitmap
hgs
parents:
diff changeset
    36
#include <MIHLImageViewer.h>        // MIHLImageViewer
hgs
parents:
diff changeset
    37
#include <icl/imagecodecdata.h>     // KImageTypeBMPUid
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
#include "MsgFrameControl.h"
hgs
parents:
diff changeset
    40
#include "MsgIconControl.h"
hgs
parents:
diff changeset
    41
#include "MsgBitmapControl.h"
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
#include "MsgMediaControlLogging.h"
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
// ==========================================================
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
// EXTERNAL DATA STRUCTURES
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
// EXTERNAL FUNCTION PROTOTYPES
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
// CONSTANTS
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
// MACROS
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
// LOCAL CONSTANTS AND MACROS
hgs
parents:
diff changeset
    56
const TInt KAnimationStartDelay = 500000; // 0,5s
hgs
parents:
diff changeset
    57
const TInt KAnimationDelayBetweenLoops = 1000000; // 1s
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
// MODULE DATA STRUCTURES
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
// LOCAL FUNCTION PROTOTYPES
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
// ================= MEMBER FUNCTIONS =======================
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
// ---------------------------------------------------------
hgs
parents:
diff changeset
    66
// CMsgImageControl::CMsgImageControl
hgs
parents:
diff changeset
    67
//
hgs
parents:
diff changeset
    68
// Constructor.
hgs
parents:
diff changeset
    69
// ---------------------------------------------------------
hgs
parents:
diff changeset
    70
//
hgs
parents:
diff changeset
    71
CMsgImageControl::CMsgImageControl( MMsgBaseControlObserver& aBaseControlObserver ) : 
hgs
parents:
diff changeset
    72
    CMsgMediaControl( aBaseControlObserver, EMsgComponentIdImage, EMsgImageControl )
hgs
parents:
diff changeset
    73
    {
hgs
parents:
diff changeset
    74
    }
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
// ---------------------------------------------------------
hgs
parents:
diff changeset
    77
// CMsgImageControl::ConstructL
hgs
parents:
diff changeset
    78
// ---------------------------------------------------------
hgs
parents:
diff changeset
    79
//
hgs
parents:
diff changeset
    80
void CMsgImageControl::ConstructL( CMsgEditorView& aParent, MMsgAsyncControlObserver* aObserver )
hgs
parents:
diff changeset
    81
    {
hgs
parents:
diff changeset
    82
    BaseConstructL( aParent, aObserver );    
hgs
parents:
diff changeset
    83
    
hgs
parents:
diff changeset
    84
    iBitmapControl = new( ELeave ) CMsgBitmapControl;
hgs
parents:
diff changeset
    85
    iBitmapControl->SetContainerWindowL( *this );
hgs
parents:
diff changeset
    86
    
hgs
parents:
diff changeset
    87
    CalculateMaxSize();
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
    TRect rect( aParent.Rect() );
hgs
parents:
diff changeset
    90
    if ( rect.Height() == 0 || rect.Width() == 0 )
hgs
parents:
diff changeset
    91
        {
hgs
parents:
diff changeset
    92
        // We have been called before view construction.
hgs
parents:
diff changeset
    93
        // Set rect to screen size.
hgs
parents:
diff changeset
    94
        rect.SetRect( TPoint(), iMaxSize );
hgs
parents:
diff changeset
    95
        }
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
    SetRect( rect );
hgs
parents:
diff changeset
    98
    
hgs
parents:
diff changeset
    99
    iLoopTimer = CPeriodic::NewL( EPriorityNormal );
hgs
parents:
diff changeset
   100
    }
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
// ---------------------------------------------------------
hgs
parents:
diff changeset
   103
// CMsgImageControl::NewL
hgs
parents:
diff changeset
   104
//
hgs
parents:
diff changeset
   105
// Two-phased constructor.
hgs
parents:
diff changeset
   106
// ---------------------------------------------------------
hgs
parents:
diff changeset
   107
//
hgs
parents:
diff changeset
   108
EXPORT_C CMsgImageControl* CMsgImageControl::NewL( CMsgEditorView& aParent,
hgs
parents:
diff changeset
   109
                                                   MMsgAsyncControlObserver* aObserver )
hgs
parents:
diff changeset
   110
    {
hgs
parents:
diff changeset
   111
    CMsgImageControl* self = new( ELeave ) CMsgImageControl( aParent );
hgs
parents:
diff changeset
   112
    
hgs
parents:
diff changeset
   113
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
   114
    self->ConstructL( aParent, aObserver );
hgs
parents:
diff changeset
   115
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
   116
    
hgs
parents:
diff changeset
   117
    return self;
hgs
parents:
diff changeset
   118
    }
hgs
parents:
diff changeset
   119
hgs
parents:
diff changeset
   120
// ---------------------------------------------------------
hgs
parents:
diff changeset
   121
// CMsgImageControl::~CMsgImageControl
hgs
parents:
diff changeset
   122
//
hgs
parents:
diff changeset
   123
// Destructor
hgs
parents:
diff changeset
   124
// ---------------------------------------------------------
hgs
parents:
diff changeset
   125
//
hgs
parents:
diff changeset
   126
CMsgImageControl::~CMsgImageControl()
hgs
parents:
diff changeset
   127
    {
hgs
parents:
diff changeset
   128
    delete iEngine;
hgs
parents:
diff changeset
   129
    delete iDestinationBitmap;
hgs
parents:
diff changeset
   130
    delete iSourceImage;
hgs
parents:
diff changeset
   131
    delete iBitmapControl;
hgs
parents:
diff changeset
   132
    delete iLoopTimer;
hgs
parents:
diff changeset
   133
    }
hgs
parents:
diff changeset
   134
    
hgs
parents:
diff changeset
   135
// ---------------------------------------------------------
hgs
parents:
diff changeset
   136
// CMsgImageControl::LoadL
hgs
parents:
diff changeset
   137
// ---------------------------------------------------------
hgs
parents:
diff changeset
   138
//
hgs
parents:
diff changeset
   139
void CMsgImageControl::LoadL( RFile& aFileHandle )
hgs
parents:
diff changeset
   140
    {
hgs
parents:
diff changeset
   141
    Reset();
hgs
parents:
diff changeset
   142
    
hgs
parents:
diff changeset
   143
    iSourceImage = IHLImageFactory::OpenFileImageL( aFileHandle, 
hgs
parents:
diff changeset
   144
                                                    0,  // image index
hgs
parents:
diff changeset
   145
                                                    MIHLFileImage::EOptionNoDRMConsume );
hgs
parents:
diff changeset
   146
    
hgs
parents:
diff changeset
   147
    SetState( EMsgAsyncControlStateOpening );
hgs
parents:
diff changeset
   148
    
hgs
parents:
diff changeset
   149
    iDestinationBitmap = IHLBitmap::CreateL();
hgs
parents:
diff changeset
   150
            
hgs
parents:
diff changeset
   151
    TSize sourceSize( iSourceImage->Size() );
hgs
parents:
diff changeset
   152
    TSize targetSize = TSize(
hgs
parents:
diff changeset
   153
    Min( sourceSize.iWidth, iMaxSize.iWidth - iFrame->FrameBorderSize().iWidth ),
hgs
parents:
diff changeset
   154
    Min( sourceSize.iHeight, iMaxSize.iHeight - iFrame->FrameBorderSize().iHeight ) );
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
    // Avoiding the usage of MIHLImageViewer::EOptionUseBilinearInterpolation
hgs
parents:
diff changeset
   157
    // because it should be only used for small images because of the memory requirements
hgs
parents:
diff changeset
   158
    // and it is much slower than the regular scaling
hgs
parents:
diff changeset
   159
    //For any type of image, nearest neighbour method(default) will be used to resize it. 
hgs
parents:
diff changeset
   160
    
hgs
parents:
diff changeset
   161
    iEngine = IHLViewerFactory::CreateImageViewerL( targetSize,
hgs
parents:
diff changeset
   162
                                                    *iSourceImage, 
hgs
parents:
diff changeset
   163
                                                    *iDestinationBitmap, 
hgs
parents:
diff changeset
   164
                                                    *this);                        	
hgs
parents:
diff changeset
   165
    }
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
// ---------------------------------------------------------
hgs
parents:
diff changeset
   168
// CMsgImageControl::Cancel
hgs
parents:
diff changeset
   169
// ---------------------------------------------------------
hgs
parents:
diff changeset
   170
//
hgs
parents:
diff changeset
   171
void CMsgImageControl::Cancel()
hgs
parents:
diff changeset
   172
    {
hgs
parents:
diff changeset
   173
    if ( iState == EMsgAsyncControlStateOpening )
hgs
parents:
diff changeset
   174
        {
hgs
parents:
diff changeset
   175
        Reset();
hgs
parents:
diff changeset
   176
        
hgs
parents:
diff changeset
   177
        SetState( EMsgAsyncControlStateIdle );
hgs
parents:
diff changeset
   178
        }
hgs
parents:
diff changeset
   179
    }
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
// ---------------------------------------------------------
hgs
parents:
diff changeset
   182
// CMsgImageControl::PlayL
hgs
parents:
diff changeset
   183
// ---------------------------------------------------------
hgs
parents:
diff changeset
   184
//
hgs
parents:
diff changeset
   185
void CMsgImageControl::PlayL()
hgs
parents:
diff changeset
   186
    {
hgs
parents:
diff changeset
   187
    if ( IsAnimation() &&
hgs
parents:
diff changeset
   188
         iState >= EMsgAsyncControlStateOpening )
hgs
parents:
diff changeset
   189
        {
hgs
parents:
diff changeset
   190
        DoPlay( 0 );
hgs
parents:
diff changeset
   191
        }
hgs
parents:
diff changeset
   192
    }
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
// ---------------------------------------------------------
hgs
parents:
diff changeset
   195
// CMsgImageControl::PauseL
hgs
parents:
diff changeset
   196
// ---------------------------------------------------------
hgs
parents:
diff changeset
   197
//
hgs
parents:
diff changeset
   198
void CMsgImageControl::PauseL()
hgs
parents:
diff changeset
   199
    {
hgs
parents:
diff changeset
   200
    if ( IsAnimation() && 
hgs
parents:
diff changeset
   201
         iState >= EMsgAsyncControlStateReady )
hgs
parents:
diff changeset
   202
        {
hgs
parents:
diff changeset
   203
        DoPause();
hgs
parents:
diff changeset
   204
        }
hgs
parents:
diff changeset
   205
    }
hgs
parents:
diff changeset
   206
     
hgs
parents:
diff changeset
   207
// ---------------------------------------------------------
hgs
parents:
diff changeset
   208
// CMsgImageControl::Stop
hgs
parents:
diff changeset
   209
// ---------------------------------------------------------
hgs
parents:
diff changeset
   210
//
hgs
parents:
diff changeset
   211
void CMsgImageControl::Stop()
hgs
parents:
diff changeset
   212
    {    
hgs
parents:
diff changeset
   213
    if ( IsAnimation() && 
hgs
parents:
diff changeset
   214
         iState >= EMsgAsyncControlStateReady )
hgs
parents:
diff changeset
   215
        {
hgs
parents:
diff changeset
   216
        StopAnimation();
hgs
parents:
diff changeset
   217
    
hgs
parents:
diff changeset
   218
        SetState( EMsgAsyncControlStateStopped );
hgs
parents:
diff changeset
   219
        }
hgs
parents:
diff changeset
   220
    }
hgs
parents:
diff changeset
   221
hgs
parents:
diff changeset
   222
// ---------------------------------------------------------
hgs
parents:
diff changeset
   223
// CMsgImageControl::Close
hgs
parents:
diff changeset
   224
// ---------------------------------------------------------
hgs
parents:
diff changeset
   225
//
hgs
parents:
diff changeset
   226
void CMsgImageControl::Close()
hgs
parents:
diff changeset
   227
    {
hgs
parents:
diff changeset
   228
    Stop();
hgs
parents:
diff changeset
   229
    SetState( EMsgAsyncControlStateIdle );
hgs
parents:
diff changeset
   230
    }
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
// ---------------------------------------------------------
hgs
parents:
diff changeset
   233
// CMsgImageControl::IsAnimation
hgs
parents:
diff changeset
   234
//
hgs
parents:
diff changeset
   235
// Return ETrue if loaded image is animation.
hgs
parents:
diff changeset
   236
// ---------------------------------------------------------
hgs
parents:
diff changeset
   237
//
hgs
parents:
diff changeset
   238
EXPORT_C TBool CMsgImageControl::IsAnimation() const
hgs
parents:
diff changeset
   239
    {
hgs
parents:
diff changeset
   240
    TBool result( EFalse );
hgs
parents:
diff changeset
   241
    
hgs
parents:
diff changeset
   242
    if ( iSourceImage )
hgs
parents:
diff changeset
   243
        {
hgs
parents:
diff changeset
   244
        result = iSourceImage->IsAnimation();
hgs
parents:
diff changeset
   245
        }
hgs
parents:
diff changeset
   246
        
hgs
parents:
diff changeset
   247
    return result;
hgs
parents:
diff changeset
   248
    }
hgs
parents:
diff changeset
   249
hgs
parents:
diff changeset
   250
// ---------------------------------------------------------
hgs
parents:
diff changeset
   251
// CMsgImageControl::SetAnimationLoopCount
hgs
parents:
diff changeset
   252
//
hgs
parents:
diff changeset
   253
// Sets animation loop count (i.e. how many times animation
hgs
parents:
diff changeset
   254
// is played fully through). -1 means that it is looped forever.
hgs
parents:
diff changeset
   255
// ---------------------------------------------------------
hgs
parents:
diff changeset
   256
//
hgs
parents:
diff changeset
   257
EXPORT_C void CMsgImageControl::SetAnimationLoopCount( TInt aCount )
hgs
parents:
diff changeset
   258
    {
hgs
parents:
diff changeset
   259
    iLoopCount = aCount;
hgs
parents:
diff changeset
   260
    }
hgs
parents:
diff changeset
   261
hgs
parents:
diff changeset
   262
// ---------------------------------------------------------
hgs
parents:
diff changeset
   263
// CMsgImageControl::SetImageFileOpenOrClose
hgs
parents:
diff changeset
   264
//
hgs
parents:
diff changeset
   265
// Sets image file open or close.
hgs
parents:
diff changeset
   266
// ---------------------------------------------------------
hgs
parents:
diff changeset
   267
//
hgs
parents:
diff changeset
   268
EXPORT_C void CMsgImageControl::SetImageFileClosed( )
hgs
parents:
diff changeset
   269
    {
hgs
parents:
diff changeset
   270
    if ( iSourceImage )
hgs
parents:
diff changeset
   271
        {
hgs
parents:
diff changeset
   272
        Stop();
hgs
parents:
diff changeset
   273
        
hgs
parents:
diff changeset
   274
        delete iSourceImage;
hgs
parents:
diff changeset
   275
        iSourceImage = NULL;
hgs
parents:
diff changeset
   276
        
hgs
parents:
diff changeset
   277
        delete iEngine;
hgs
parents:
diff changeset
   278
        iEngine = NULL;
hgs
parents:
diff changeset
   279
        
hgs
parents:
diff changeset
   280
        SetState( EMsgAsyncControlStateIdle );
hgs
parents:
diff changeset
   281
        }
hgs
parents:
diff changeset
   282
    }
hgs
parents:
diff changeset
   283
hgs
parents:
diff changeset
   284
// ---------------------------------------------------------
hgs
parents:
diff changeset
   285
// CMsgImageControl::SetAndGetSizeL
hgs
parents:
diff changeset
   286
//
hgs
parents:
diff changeset
   287
// Calculates and sets the size of the control and returns new size as
hgs
parents:
diff changeset
   288
// reference aSize.
hgs
parents:
diff changeset
   289
// ---------------------------------------------------------
hgs
parents:
diff changeset
   290
//
hgs
parents:
diff changeset
   291
void CMsgImageControl::SetAndGetSizeL( TSize& aSize )
hgs
parents:
diff changeset
   292
    {
hgs
parents:
diff changeset
   293
    // Adjust max height if needed
hgs
parents:
diff changeset
   294
    if ( aSize.iHeight > iMaxSize.iHeight )
hgs
parents:
diff changeset
   295
        {
hgs
parents:
diff changeset
   296
        aSize.iHeight = iMaxSize.iHeight;
hgs
parents:
diff changeset
   297
        }
hgs
parents:
diff changeset
   298
hgs
parents:
diff changeset
   299
    // Do not adjust the width. The width of the control must always
hgs
parents:
diff changeset
   300
    // be the same as the width of the client rect.
hgs
parents:
diff changeset
   301
    aSize = CalculateControlSize( aSize );
hgs
parents:
diff changeset
   302
hgs
parents:
diff changeset
   303
    SetSize( aSize );
hgs
parents:
diff changeset
   304
    }
hgs
parents:
diff changeset
   305
hgs
parents:
diff changeset
   306
hgs
parents:
diff changeset
   307
// ---------------------------------------------------------
hgs
parents:
diff changeset
   308
// CMsgImageControl::NotifyViewEvent
hgs
parents:
diff changeset
   309
//
hgs
parents:
diff changeset
   310
// Animation playback is paused if view looses focus and resumed
hgs
parents:
diff changeset
   311
// when focus is again gained. Resuming happens only if animation is
hgs
parents:
diff changeset
   312
// still at pause state and control is on playing state.
hgs
parents:
diff changeset
   313
// ---------------------------------------------------------
hgs
parents:
diff changeset
   314
//
hgs
parents:
diff changeset
   315
void CMsgImageControl::NotifyViewEvent( TMsgViewEvent aEvent, TInt aParam )
hgs
parents:
diff changeset
   316
    {
hgs
parents:
diff changeset
   317
    switch ( aEvent )
hgs
parents:
diff changeset
   318
        {
hgs
parents:
diff changeset
   319
        case EMsgViewEventViewFocusLost:
hgs
parents:
diff changeset
   320
            {
hgs
parents:
diff changeset
   321
            if ( iAnimationState == EAnimationPlaying )
hgs
parents:
diff changeset
   322
                {
hgs
parents:
diff changeset
   323
                PauseAnimation();
hgs
parents:
diff changeset
   324
                }
hgs
parents:
diff changeset
   325
            break;
hgs
parents:
diff changeset
   326
            }
hgs
parents:
diff changeset
   327
        case EMsgViewEventViewFocusGain:
hgs
parents:
diff changeset
   328
            {
hgs
parents:
diff changeset
   329
            if ( iAnimationState == EAnimationPaused &&
hgs
parents:
diff changeset
   330
                 iState == EMsgAsyncControlStatePlaying )
hgs
parents:
diff changeset
   331
                {
hgs
parents:
diff changeset
   332
                StartAnimation( KAnimationStartDelay );
hgs
parents:
diff changeset
   333
                }
hgs
parents:
diff changeset
   334
            break;
hgs
parents:
diff changeset
   335
            }
hgs
parents:
diff changeset
   336
        default:
hgs
parents:
diff changeset
   337
            {
hgs
parents:
diff changeset
   338
            break;
hgs
parents:
diff changeset
   339
            }
hgs
parents:
diff changeset
   340
        }
hgs
parents:
diff changeset
   341
        
hgs
parents:
diff changeset
   342
    CMsgMediaControl::NotifyViewEvent( aEvent, aParam );
hgs
parents:
diff changeset
   343
    }
hgs
parents:
diff changeset
   344
hgs
parents:
diff changeset
   345
// ---------------------------------------------------------
hgs
parents:
diff changeset
   346
// CMsgImageControl::Reset
hgs
parents:
diff changeset
   347
//
hgs
parents:
diff changeset
   348
// Empties the control.
hgs
parents:
diff changeset
   349
// ---------------------------------------------------------
hgs
parents:
diff changeset
   350
//
hgs
parents:
diff changeset
   351
void CMsgImageControl::Reset()
hgs
parents:
diff changeset
   352
    {
hgs
parents:
diff changeset
   353
    delete iEngine;
hgs
parents:
diff changeset
   354
    iEngine = NULL;
hgs
parents:
diff changeset
   355
    
hgs
parents:
diff changeset
   356
    iAnimationState = EAnimationStopped;
hgs
parents:
diff changeset
   357
    
hgs
parents:
diff changeset
   358
    delete iDestinationBitmap;
hgs
parents:
diff changeset
   359
    iDestinationBitmap = NULL;
hgs
parents:
diff changeset
   360
    
hgs
parents:
diff changeset
   361
    iBitmapControl->SetBitmap( NULL );
hgs
parents:
diff changeset
   362
    
hgs
parents:
diff changeset
   363
    delete iSourceImage;
hgs
parents:
diff changeset
   364
    iSourceImage = NULL;
hgs
parents:
diff changeset
   365
    
hgs
parents:
diff changeset
   366
    ResetIconId();
hgs
parents:
diff changeset
   367
    }
hgs
parents:
diff changeset
   368
hgs
parents:
diff changeset
   369
// ---------------------------------------------------------
hgs
parents:
diff changeset
   370
// CMsgImageControl::FocusChanged
hgs
parents:
diff changeset
   371
//
hgs
parents:
diff changeset
   372
// Updates the focus (i.e. set frame control visible/invisible).
hgs
parents:
diff changeset
   373
// Calls base class implementation if icon is visible. Otherwise
hgs
parents:
diff changeset
   374
// performs it's own handling.
hgs
parents:
diff changeset
   375
// Frame control is redraw immediatelly if that 
hgs
parents:
diff changeset
   376
// is requested and frame control state is changed. Otherwise
hgs
parents:
diff changeset
   377
// normal deferred drawing is done. This is activated at 
hgs
parents:
diff changeset
   378
// CCoeControl::MakeVisible if needed.
hgs
parents:
diff changeset
   379
// ---------------------------------------------------------
hgs
parents:
diff changeset
   380
//
hgs
parents:
diff changeset
   381
void CMsgImageControl::FocusChanged( TDrawNow aDrawNow )
hgs
parents:
diff changeset
   382
    {
hgs
parents:
diff changeset
   383
    if ( VisiblePlaceholder() )
hgs
parents:
diff changeset
   384
        {
hgs
parents:
diff changeset
   385
        CMsgMediaControl::FocusChanged( aDrawNow );
hgs
parents:
diff changeset
   386
        }
hgs
parents:
diff changeset
   387
    else 
hgs
parents:
diff changeset
   388
        {
hgs
parents:
diff changeset
   389
        TBool oldVisibility( iFrame->IsVisible() );
hgs
parents:
diff changeset
   390
    
hgs
parents:
diff changeset
   391
        iFrame->MakeVisible( IsFocused() );
hgs
parents:
diff changeset
   392
        
hgs
parents:
diff changeset
   393
        if ( aDrawNow == EDrawNow &&
hgs
parents:
diff changeset
   394
             iFrame->IsVisible() != oldVisibility )
hgs
parents:
diff changeset
   395
            {
hgs
parents:
diff changeset
   396
            DrawNow();
hgs
parents:
diff changeset
   397
            }
hgs
parents:
diff changeset
   398
        }
hgs
parents:
diff changeset
   399
    }
hgs
parents:
diff changeset
   400
hgs
parents:
diff changeset
   401
// ---------------------------------------------------------
hgs
parents:
diff changeset
   402
// CMsgImageControl::SizeChanged
hgs
parents:
diff changeset
   403
//
hgs
parents:
diff changeset
   404
// Called when size is changed.
hgs
parents:
diff changeset
   405
// ---------------------------------------------------------
hgs
parents:
diff changeset
   406
//
hgs
parents:
diff changeset
   407
void CMsgImageControl::SizeChanged()
hgs
parents:
diff changeset
   408
    {
hgs
parents:
diff changeset
   409
    if ( iEngine && 
hgs
parents:
diff changeset
   410
         Size() != iEngine->ViewerSize() )
hgs
parents:
diff changeset
   411
        {
hgs
parents:
diff changeset
   412
        TSize bitmapSize = iEngine->SourceSize() ;
hgs
parents:
diff changeset
   413
        TSize controlSize = iSize;
hgs
parents:
diff changeset
   414
        controlSize.iWidth -= iFrame->FrameBorderSize().iWidth;
hgs
parents:
diff changeset
   415
        controlSize.iHeight -= iFrame->FrameBorderSize().iHeight;
hgs
parents:
diff changeset
   416
        
hgs
parents:
diff changeset
   417
        TReal widthRatio = static_cast<TReal>( controlSize.iWidth ) / 
hgs
parents:
diff changeset
   418
                           static_cast<TReal>( bitmapSize.iWidth );
hgs
parents:
diff changeset
   419
        TReal heightRatio = static_cast<TReal>( controlSize.iHeight ) / 
hgs
parents:
diff changeset
   420
                            static_cast<TReal>( bitmapSize.iHeight );
hgs
parents:
diff changeset
   421
        TReal zoomRatio = ( widthRatio < heightRatio ) ? widthRatio : heightRatio;
hgs
parents:
diff changeset
   422
        
hgs
parents:
diff changeset
   423
        iEngine->SetViewerSize( Size() );
hgs
parents:
diff changeset
   424
        iEngine->SetZoomRatio( zoomRatio );
hgs
parents:
diff changeset
   425
        }
hgs
parents:
diff changeset
   426
    
hgs
parents:
diff changeset
   427
    // Size updated at the ViewerBitmapChanged when image scaling is done.
hgs
parents:
diff changeset
   428
    iBitmapControl->SetPosition( Position() + CalculateImagePosition() );
hgs
parents:
diff changeset
   429
        
hgs
parents:
diff changeset
   430
    if ( iDestinationBitmap && 
hgs
parents:
diff changeset
   431
         iDestinationBitmap->IsCreated() )
hgs
parents:
diff changeset
   432
        {
hgs
parents:
diff changeset
   433
        iFrame->SetImageSize( iDestinationBitmap->Bitmap().SizeInPixels() );
hgs
parents:
diff changeset
   434
        }
hgs
parents:
diff changeset
   435
    
hgs
parents:
diff changeset
   436
    if ( iState == EMsgAsyncControlStatePlaying )
hgs
parents:
diff changeset
   437
        {
hgs
parents:
diff changeset
   438
        // Start animation if needed on playing state.
hgs
parents:
diff changeset
   439
        StartAnimation( 0 );
hgs
parents:
diff changeset
   440
        }
hgs
parents:
diff changeset
   441
        
hgs
parents:
diff changeset
   442
    CMsgMediaControl::SizeChanged();
hgs
parents:
diff changeset
   443
    }
hgs
parents:
diff changeset
   444
hgs
parents:
diff changeset
   445
// ---------------------------------------------------------
hgs
parents:
diff changeset
   446
// CMsgImageControl::Draw
hgs
parents:
diff changeset
   447
//
hgs
parents:
diff changeset
   448
// Draws the basic skin background for given rectangle. 
hgs
parents:
diff changeset
   449
// Image is drawn on CBitmapControl::Draw function.
hgs
parents:
diff changeset
   450
// ---------------------------------------------------------
hgs
parents:
diff changeset
   451
//
hgs
parents:
diff changeset
   452
void CMsgImageControl::Draw( const TRect& aRect ) const
hgs
parents:
diff changeset
   453
    {
hgs
parents:
diff changeset
   454
    CWindowGc& gc = SystemGc();
hgs
parents:
diff changeset
   455
    
hgs
parents:
diff changeset
   456
    if ( !VisiblePlaceholder() )
hgs
parents:
diff changeset
   457
        {
hgs
parents:
diff changeset
   458
        if ( !AknsDrawUtils::BackgroundBetweenRects( AknsUtils::SkinInstance(), 
hgs
parents:
diff changeset
   459
                                                 AknsDrawUtils::ControlContext( this ), 
hgs
parents:
diff changeset
   460
                                                 this, 
hgs
parents:
diff changeset
   461
                                                 gc, 
hgs
parents:
diff changeset
   462
                                                 Rect(),
hgs
parents:
diff changeset
   463
                                                 iBitmapControl->Rect(),
hgs
parents:
diff changeset
   464
                                                 KAknsDrawParamNoClearUnderImage ) )
hgs
parents:
diff changeset
   465
            {
hgs
parents:
diff changeset
   466
            gc.SetBrushColor( AKN_LAF_COLOR( 0 ) );
hgs
parents:
diff changeset
   467
            gc.SetPenStyle( CGraphicsContext::ENullPen );
hgs
parents:
diff changeset
   468
    		gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
hgs
parents:
diff changeset
   469
        	gc.DrawRect( aRect );
hgs
parents:
diff changeset
   470
            }
hgs
parents:
diff changeset
   471
        }
hgs
parents:
diff changeset
   472
    else 
hgs
parents:
diff changeset
   473
        {
hgs
parents:
diff changeset
   474
        // Basic icon drawing from base class when icon is visible.
hgs
parents:
diff changeset
   475
        CMsgMediaControl::Draw( aRect );
hgs
parents:
diff changeset
   476
        }
hgs
parents:
diff changeset
   477
    }
hgs
parents:
diff changeset
   478
hgs
parents:
diff changeset
   479
// ---------------------------------------------------------
hgs
parents:
diff changeset
   480
// CMmsImageControl::MakeVisible
hgs
parents:
diff changeset
   481
//
hgs
parents:
diff changeset
   482
// Sets same visibility to bitmap control as image control has.
hgs
parents:
diff changeset
   483
// ---------------------------------------------------------
hgs
parents:
diff changeset
   484
//
hgs
parents:
diff changeset
   485
void CMsgImageControl::MakeVisible( TBool aVisible )
hgs
parents:
diff changeset
   486
    {
hgs
parents:
diff changeset
   487
    iBitmapControl->MakeVisible( aVisible );
hgs
parents:
diff changeset
   488
    
hgs
parents:
diff changeset
   489
    CMsgMediaControl::MakeVisible( aVisible );
hgs
parents:
diff changeset
   490
    }
hgs
parents:
diff changeset
   491
hgs
parents:
diff changeset
   492
// ---------------------------------------------------------
hgs
parents:
diff changeset
   493
// CMmsImageControl::PositionChanged
hgs
parents:
diff changeset
   494
//
hgs
parents:
diff changeset
   495
// Calculates new position to bitmap control as image control position
hgs
parents:
diff changeset
   496
// has changed.
hgs
parents:
diff changeset
   497
// ---------------------------------------------------------
hgs
parents:
diff changeset
   498
//
hgs
parents:
diff changeset
   499
void CMsgImageControl::PositionChanged()
hgs
parents:
diff changeset
   500
    {
hgs
parents:
diff changeset
   501
    iBitmapControl->SetPosition( Position() + CalculateImagePosition() );
hgs
parents:
diff changeset
   502
    
hgs
parents:
diff changeset
   503
    CMsgMediaControl::PositionChanged();
hgs
parents:
diff changeset
   504
    }
hgs
parents:
diff changeset
   505
hgs
parents:
diff changeset
   506
// ---------------------------------------------------------
hgs
parents:
diff changeset
   507
// CMsgImageControl::HandleResourceChange
hgs
parents:
diff changeset
   508
// ---------------------------------------------------------
hgs
parents:
diff changeset
   509
//
hgs
parents:
diff changeset
   510
void CMsgImageControl::HandleResourceChange( TInt aType )
hgs
parents:
diff changeset
   511
    {
hgs
parents:
diff changeset
   512
    CMsgMediaControl::HandleResourceChange( aType ); 
hgs
parents:
diff changeset
   513
    
hgs
parents:
diff changeset
   514
    if ( aType == KEikDynamicLayoutVariantSwitch )
hgs
parents:
diff changeset
   515
        {
hgs
parents:
diff changeset
   516
        CalculateMaxSize();
hgs
parents:
diff changeset
   517
        
hgs
parents:
diff changeset
   518
        if ( iEngine )
hgs
parents:
diff changeset
   519
            {
hgs
parents:
diff changeset
   520
            TSize sourceSize( iSourceImage->Size() );
hgs
parents:
diff changeset
   521
            TSize targetSize = TSize(
hgs
parents:
diff changeset
   522
                    Min( sourceSize.iWidth, iMaxSize.iWidth - iFrame->FrameBorderSize().iWidth ),
hgs
parents:
diff changeset
   523
                    Min( sourceSize.iHeight, iMaxSize.iHeight - iFrame->FrameBorderSize().iHeight ) );
hgs
parents:
diff changeset
   524
            
hgs
parents:
diff changeset
   525
            iBitmapControl->SetSize( TSize( 0, 0 ) );
hgs
parents:
diff changeset
   526
            SetSize( targetSize );
hgs
parents:
diff changeset
   527
            }
hgs
parents:
diff changeset
   528
        }
hgs
parents:
diff changeset
   529
    }
hgs
parents:
diff changeset
   530
hgs
parents:
diff changeset
   531
// ---------------------------------------------------------
hgs
parents:
diff changeset
   532
// CMmsImageControl::CountComponentControls
hgs
parents:
diff changeset
   533
//
hgs
parents:
diff changeset
   534
// Return count of controls be included in this component.
hgs
parents:
diff changeset
   535
// ---------------------------------------------------------
hgs
parents:
diff changeset
   536
//
hgs
parents:
diff changeset
   537
TInt CMsgImageControl::CountComponentControls() const
hgs
parents:
diff changeset
   538
    {    
hgs
parents:
diff changeset
   539
    return 2;
hgs
parents:
diff changeset
   540
    }
hgs
parents:
diff changeset
   541
hgs
parents:
diff changeset
   542
// ---------------------------------------------------------
hgs
parents:
diff changeset
   543
// CMmsImageControl::ComponentControl
hgs
parents:
diff changeset
   544
//
hgs
parents:
diff changeset
   545
// Return pointer to component in question.
hgs
parents:
diff changeset
   546
// Note! Image and Icon cannot exist at a same time.
hgs
parents:
diff changeset
   547
// ---------------------------------------------------------
hgs
parents:
diff changeset
   548
//
hgs
parents:
diff changeset
   549
CCoeControl* CMsgImageControl::ComponentControl( TInt aIndex ) const
hgs
parents:
diff changeset
   550
    {
hgs
parents:
diff changeset
   551
    CCoeControl* result = NULL;
hgs
parents:
diff changeset
   552
    switch ( aIndex )
hgs
parents:
diff changeset
   553
        {
hgs
parents:
diff changeset
   554
        case 0:
hgs
parents:
diff changeset
   555
            {
hgs
parents:
diff changeset
   556
            result = iFrame;                
hgs
parents:
diff changeset
   557
            break;
hgs
parents:
diff changeset
   558
            }
hgs
parents:
diff changeset
   559
        case 1:
hgs
parents:
diff changeset
   560
            {
hgs
parents:
diff changeset
   561
            CCoeControl* visiblePlaceholder = VisiblePlaceholder();
hgs
parents:
diff changeset
   562
            if ( visiblePlaceholder )
hgs
parents:
diff changeset
   563
                {
hgs
parents:
diff changeset
   564
                result = visiblePlaceholder;
hgs
parents:
diff changeset
   565
                }
hgs
parents:
diff changeset
   566
            else
hgs
parents:
diff changeset
   567
                {
hgs
parents:
diff changeset
   568
                result = iBitmapControl;
hgs
parents:
diff changeset
   569
                }
hgs
parents:
diff changeset
   570
            break;
hgs
parents:
diff changeset
   571
            }
hgs
parents:
diff changeset
   572
        default:
hgs
parents:
diff changeset
   573
            {
hgs
parents:
diff changeset
   574
            break;
hgs
parents:
diff changeset
   575
            }
hgs
parents:
diff changeset
   576
        }
hgs
parents:
diff changeset
   577
        
hgs
parents:
diff changeset
   578
    return result;
hgs
parents:
diff changeset
   579
    }
hgs
parents:
diff changeset
   580
hgs
parents:
diff changeset
   581
// ---------------------------------------------------------
hgs
parents:
diff changeset
   582
// CMsgImageControl::IsOffScreen
hgs
parents:
diff changeset
   583
//
hgs
parents:
diff changeset
   584
// Returns ETrue if image is off screen.
hgs
parents:
diff changeset
   585
// ---------------------------------------------------------
hgs
parents:
diff changeset
   586
//
hgs
parents:
diff changeset
   587
TBool CMsgImageControl::IsOffScreen() const
hgs
parents:
diff changeset
   588
    {
hgs
parents:
diff changeset
   589
    TRect rect( Position() + CalculateImagePosition(),
hgs
parents:
diff changeset
   590
                iDestinationBitmap->Bitmap().SizeInPixels() );
hgs
parents:
diff changeset
   591
    
hgs
parents:
diff changeset
   592
    TBool result( EFalse );
hgs
parents:
diff changeset
   593
    
hgs
parents:
diff changeset
   594
    if ( rect.iTl.iY < 0 || 
hgs
parents:
diff changeset
   595
         rect.iBr.iY >  MsgEditorCommons::MsgMainPane().Height() )
hgs
parents:
diff changeset
   596
        {
hgs
parents:
diff changeset
   597
        result = ETrue;
hgs
parents:
diff changeset
   598
        }
hgs
parents:
diff changeset
   599
        
hgs
parents:
diff changeset
   600
    return result;
hgs
parents:
diff changeset
   601
    }
hgs
parents:
diff changeset
   602
hgs
parents:
diff changeset
   603
hgs
parents:
diff changeset
   604
// ---------------------------------------------------------
hgs
parents:
diff changeset
   605
// CMsgImageControl::ViewerBitmapChangedL
hgs
parents:
diff changeset
   606
//
hgs
parents:
diff changeset
   607
// Handle bitmap change notifications. State is changed accordingly
hgs
parents:
diff changeset
   608
// if this is the first frame. GIF animation is stopped if control
hgs
parents:
diff changeset
   609
// goes off screen and started again when it is fully visible and control
hgs
parents:
diff changeset
   610
// is on playing state. On editor mode animation is looped only once. 
hgs
parents:
diff changeset
   611
// Animation is also stopped if animation loop count is reached.
hgs
parents:
diff changeset
   612
// New animation loop is started after KAnimationDelayBetweenLoops
hgs
parents:
diff changeset
   613
// delay.
hgs
parents:
diff changeset
   614
// ---------------------------------------------------------
hgs
parents:
diff changeset
   615
//
hgs
parents:
diff changeset
   616
void CMsgImageControl::ViewerBitmapChangedL()
hgs
parents:
diff changeset
   617
    {
hgs
parents:
diff changeset
   618
    if ( iState == EMsgAsyncControlStateOpening )   
hgs
parents:
diff changeset
   619
        {
hgs
parents:
diff changeset
   620
        SetState( EMsgAsyncControlStateReady );        
hgs
parents:
diff changeset
   621
        
hgs
parents:
diff changeset
   622
        if ( iAnimationState == EAnimationPlaying )
hgs
parents:
diff changeset
   623
            {
hgs
parents:
diff changeset
   624
            SetState( EMsgAsyncControlStatePlaying );
hgs
parents:
diff changeset
   625
            }
hgs
parents:
diff changeset
   626
        }
hgs
parents:
diff changeset
   627
        
hgs
parents:
diff changeset
   628
    if ( iSourceImage->IsAnimation() )
hgs
parents:
diff changeset
   629
        {
hgs
parents:
diff changeset
   630
        switch ( iAnimationState )
hgs
parents:
diff changeset
   631
            {
hgs
parents:
diff changeset
   632
            case EAnimationPlaying:
hgs
parents:
diff changeset
   633
                {   
hgs
parents:
diff changeset
   634
                if ( IsOffScreen() )
hgs
parents:
diff changeset
   635
                    {
hgs
parents:
diff changeset
   636
                    // Stop the playback if animation is not fully visible
hgs
parents:
diff changeset
   637
                    StopAnimation();
hgs
parents:
diff changeset
   638
                    }
hgs
parents:
diff changeset
   639
                else if ( iEngine->AnimationFrame() == 
hgs
parents:
diff changeset
   640
                          iSourceImage->AnimationFrameCount() - 1 )
hgs
parents:
diff changeset
   641
                    {
hgs
parents:
diff changeset
   642
                    // Last frame of the animation has been loaded.
hgs
parents:
diff changeset
   643
                    iCurrentLoop++;
hgs
parents:
diff changeset
   644
                    
hgs
parents:
diff changeset
   645
                    if ( iCurrentLoop == iLoopCount )
hgs
parents:
diff changeset
   646
                        {
hgs
parents:
diff changeset
   647
                        // Maximum loop count reached. Do not stop yet as first
hgs
parents:
diff changeset
   648
                        // frame is wanted to be displayed. Stopping is done on 
hgs
parents:
diff changeset
   649
                        // EAnimationStopped state.
hgs
parents:
diff changeset
   650
                        iAnimationState = EAnimationStopped;
hgs
parents:
diff changeset
   651
                        }
hgs
parents:
diff changeset
   652
                    else
hgs
parents:
diff changeset
   653
                        {
hgs
parents:
diff changeset
   654
                        iEngine->Stop();
hgs
parents:
diff changeset
   655
                        
hgs
parents:
diff changeset
   656
                        iLoopTimer->Cancel();
hgs
parents:
diff changeset
   657
                        iLoopTimer->Start( KAnimationDelayBetweenLoops,
hgs
parents:
diff changeset
   658
                                           KAnimationDelayBetweenLoops,
hgs
parents:
diff changeset
   659
                                           TCallBack( DoStartLoop, this ) );
hgs
parents:
diff changeset
   660
                        }
hgs
parents:
diff changeset
   661
                    }
hgs
parents:
diff changeset
   662
                break;
hgs
parents:
diff changeset
   663
                }
hgs
parents:
diff changeset
   664
            case EAnimationStopped:
hgs
parents:
diff changeset
   665
                {
hgs
parents:
diff changeset
   666
                if( iState == EMsgAsyncControlStatePlaying &&
hgs
parents:
diff changeset
   667
                    !IsOffScreen() &&
hgs
parents:
diff changeset
   668
                    iCurrentLoop != iLoopCount )
hgs
parents:
diff changeset
   669
                    {
hgs
parents:
diff changeset
   670
                    StartAnimation( 0 );
hgs
parents:
diff changeset
   671
                    }
hgs
parents:
diff changeset
   672
                else
hgs
parents:
diff changeset
   673
                    {
hgs
parents:
diff changeset
   674
                    StopAnimation();
hgs
parents:
diff changeset
   675
                    }
hgs
parents:
diff changeset
   676
                break;
hgs
parents:
diff changeset
   677
                }
hgs
parents:
diff changeset
   678
            case EAnimationNotReady:
hgs
parents:
diff changeset
   679
            default:
hgs
parents:
diff changeset
   680
                {
hgs
parents:
diff changeset
   681
                break;
hgs
parents:
diff changeset
   682
                }
hgs
parents:
diff changeset
   683
            }
hgs
parents:
diff changeset
   684
        }
hgs
parents:
diff changeset
   685
    
hgs
parents:
diff changeset
   686
    iBitmapControl->SetBitmap( iDestinationBitmap );
hgs
parents:
diff changeset
   687
    
hgs
parents:
diff changeset
   688
    TRect imageRect( Position() + CalculateImagePosition(),
hgs
parents:
diff changeset
   689
                     iDestinationBitmap->Bitmap().SizeInPixels() );
hgs
parents:
diff changeset
   690
    iBitmapControl->SetRect( imageRect );
hgs
parents:
diff changeset
   691
    
hgs
parents:
diff changeset
   692
    if( IsVisible() )
hgs
parents:
diff changeset
   693
        {
hgs
parents:
diff changeset
   694
        // Sometimes iDestinationBitmap is not ready when in SizeChanged()
hgs
parents:
diff changeset
   695
        if ( iDestinationBitmap &&  
hgs
parents:
diff changeset
   696
             iDestinationBitmap->IsCreated() )
hgs
parents:
diff changeset
   697
            {
hgs
parents:
diff changeset
   698
            iFrame->SetImageSize( imageRect.Size() );
hgs
parents:
diff changeset
   699
            }  
hgs
parents:
diff changeset
   700
hgs
parents:
diff changeset
   701
        DrawNow();
hgs
parents:
diff changeset
   702
        }
hgs
parents:
diff changeset
   703
    }
hgs
parents:
diff changeset
   704
hgs
parents:
diff changeset
   705
// ---------------------------------------------------------
hgs
parents:
diff changeset
   706
// CMsgImageControl::ViewerError
hgs
parents:
diff changeset
   707
//
hgs
parents:
diff changeset
   708
// Handles engine errors.
hgs
parents:
diff changeset
   709
// ---------------------------------------------------------
hgs
parents:
diff changeset
   710
//
hgs
parents:
diff changeset
   711
void CMsgImageControl::ViewerError( TInt aError )
hgs
parents:
diff changeset
   712
    {
hgs
parents:
diff changeset
   713
    MSGMEDIACONTROLLOGGER_WRITEF_ERROR_STATE( _L("CMsgImageControl::HandleCallback: **aError: %d, CurrentState: %S"),aError, iState);
hgs
parents:
diff changeset
   714
    
hgs
parents:
diff changeset
   715
    iError = aError;
hgs
parents:
diff changeset
   716
            
hgs
parents:
diff changeset
   717
    switch ( aError )
hgs
parents:
diff changeset
   718
        {
hgs
parents:
diff changeset
   719
        case KErrNone:
hgs
parents:
diff changeset
   720
            {
hgs
parents:
diff changeset
   721
            if ( iState == EMsgAsyncControlStateOpening )
hgs
parents:
diff changeset
   722
                {
hgs
parents:
diff changeset
   723
                // image shown in the viewer and image had rights
hgs
parents:
diff changeset
   724
                SetState( EMsgAsyncControlStateReady );
hgs
parents:
diff changeset
   725
                DoPlay( 0 );
hgs
parents:
diff changeset
   726
                }
hgs
parents:
diff changeset
   727
            else if (  iState == EMsgAsyncControlStatePlaying )
hgs
parents:
diff changeset
   728
                {
hgs
parents:
diff changeset
   729
                SetState( EMsgAsyncControlStateReady );
hgs
parents:
diff changeset
   730
                DoPlay( 0 );
hgs
parents:
diff changeset
   731
                }
hgs
parents:
diff changeset
   732
            break;
hgs
parents:
diff changeset
   733
            }
hgs
parents:
diff changeset
   734
        case DRMCommon::EGeneralError:
hgs
parents:
diff changeset
   735
        case DRMCommon::EUnknownMIME:
hgs
parents:
diff changeset
   736
        case DRMCommon::EVersionNotSupported:
hgs
parents:
diff changeset
   737
        case DRMCommon::ESessionError:
hgs
parents:
diff changeset
   738
        case DRMCommon::ENoRights:
hgs
parents:
diff changeset
   739
        case DRMCommon::ERightsDBCorrupted:
hgs
parents:
diff changeset
   740
        case DRMCommon::EUnsupported:
hgs
parents:
diff changeset
   741
        case DRMCommon::ERightsExpired:
hgs
parents:
diff changeset
   742
        case DRMCommon::EInvalidRights:
hgs
parents:
diff changeset
   743
            {
hgs
parents:
diff changeset
   744
            SetState( EMsgAsyncControlStateNoRights );
hgs
parents:
diff changeset
   745
            break;
hgs
parents:
diff changeset
   746
            }
hgs
parents:
diff changeset
   747
        case KErrNoMemory:  // cannot recover
hgs
parents:
diff changeset
   748
        default:
hgs
parents:
diff changeset
   749
            {
hgs
parents:
diff changeset
   750
            SetState( EMsgAsyncControlStateCorrupt );
hgs
parents:
diff changeset
   751
            break;
hgs
parents:
diff changeset
   752
            }
hgs
parents:
diff changeset
   753
        }
hgs
parents:
diff changeset
   754
    }
hgs
parents:
diff changeset
   755
hgs
parents:
diff changeset
   756
// ---------------------------------------------------------
hgs
parents:
diff changeset
   757
// CMsgImageControl::CalculateImagePosition
hgs
parents:
diff changeset
   758
//
hgs
parents:
diff changeset
   759
// Calculates image position so that it is centered to 
hgs
parents:
diff changeset
   760
// control extent.
hgs
parents:
diff changeset
   761
// ---------------------------------------------------------
hgs
parents:
diff changeset
   762
//
hgs
parents:
diff changeset
   763
TPoint CMsgImageControl::CalculateImagePosition() const
hgs
parents:
diff changeset
   764
    {
hgs
parents:
diff changeset
   765
    TPoint result;
hgs
parents:
diff changeset
   766
    
hgs
parents:
diff changeset
   767
    TSize controlSize( Size() );
hgs
parents:
diff changeset
   768
    TSize imageSize;
hgs
parents:
diff changeset
   769
    
hgs
parents:
diff changeset
   770
    if ( iEngine )
hgs
parents:
diff changeset
   771
        {
hgs
parents:
diff changeset
   772
        imageSize = iEngine->SourceSize();
hgs
parents:
diff changeset
   773
        imageSize.iWidth *= iEngine->ZoomRatio();
hgs
parents:
diff changeset
   774
        imageSize.iHeight *= iEngine->ZoomRatio();
hgs
parents:
diff changeset
   775
        }
hgs
parents:
diff changeset
   776
    else
hgs
parents:
diff changeset
   777
        {
hgs
parents:
diff changeset
   778
        // Engine has been unloaded. Use current bitmap control size
hgs
parents:
diff changeset
   779
        // as imageSize.
hgs
parents:
diff changeset
   780
        imageSize = iBitmapControl->Size();
hgs
parents:
diff changeset
   781
        }
hgs
parents:
diff changeset
   782
    
hgs
parents:
diff changeset
   783
    result.iX = ( controlSize.iWidth - imageSize.iWidth ) / 2;
hgs
parents:
diff changeset
   784
    result.iY = ( controlSize.iHeight - imageSize.iHeight ) / 2;
hgs
parents:
diff changeset
   785
    
hgs
parents:
diff changeset
   786
    if ( result.iX < 0 )
hgs
parents:
diff changeset
   787
        {
hgs
parents:
diff changeset
   788
        result.iX = 0;
hgs
parents:
diff changeset
   789
        }
hgs
parents:
diff changeset
   790
    
hgs
parents:
diff changeset
   791
    if ( result.iY < 0 )
hgs
parents:
diff changeset
   792
        {
hgs
parents:
diff changeset
   793
        result.iY = 0;
hgs
parents:
diff changeset
   794
        }
hgs
parents:
diff changeset
   795
        
hgs
parents:
diff changeset
   796
    return result;
hgs
parents:
diff changeset
   797
    }
hgs
parents:
diff changeset
   798
hgs
parents:
diff changeset
   799
// ---------------------------------------------------------
hgs
parents:
diff changeset
   800
// CMsgImageControl::CalculateControlSize
hgs
parents:
diff changeset
   801
//
hgs
parents:
diff changeset
   802
// Calculates the correct size for the image control.
hgs
parents:
diff changeset
   803
// ---------------------------------------------------------
hgs
parents:
diff changeset
   804
//
hgs
parents:
diff changeset
   805
TSize CMsgImageControl::CalculateControlSize( const TSize& aProposedSize ) const
hgs
parents:
diff changeset
   806
    {
hgs
parents:
diff changeset
   807
    TSize result( aProposedSize.iWidth, 0 );
hgs
parents:
diff changeset
   808
    TSize bitmapSize = BitmapSize();
hgs
parents:
diff changeset
   809
    
hgs
parents:
diff changeset
   810
    if ( !bitmapSize.iHeight || !bitmapSize.iWidth )
hgs
parents:
diff changeset
   811
        {
hgs
parents:
diff changeset
   812
        result.iHeight = aProposedSize.iHeight;
hgs
parents:
diff changeset
   813
        return result;
hgs
parents:
diff changeset
   814
        }
hgs
parents:
diff changeset
   815
    else if ( bitmapSize.iHeight < aProposedSize.iHeight )
hgs
parents:
diff changeset
   816
        {
hgs
parents:
diff changeset
   817
        result.iHeight = bitmapSize.iHeight;
hgs
parents:
diff changeset
   818
        }
hgs
parents:
diff changeset
   819
    else
hgs
parents:
diff changeset
   820
        {
hgs
parents:
diff changeset
   821
        result.iHeight = aProposedSize.iHeight;
hgs
parents:
diff changeset
   822
        }
hgs
parents:
diff changeset
   823
hgs
parents:
diff changeset
   824
    TInt scaledHeight( 
hgs
parents:
diff changeset
   825
        ( static_cast<TReal>( bitmapSize.iHeight ) /
hgs
parents:
diff changeset
   826
          static_cast<TReal>( bitmapSize.iWidth ) ) *
hgs
parents:
diff changeset
   827
          aProposedSize.iWidth );
hgs
parents:
diff changeset
   828
    if ( scaledHeight < result.iHeight )
hgs
parents:
diff changeset
   829
        {
hgs
parents:
diff changeset
   830
        result.iHeight = scaledHeight;
hgs
parents:
diff changeset
   831
        }
hgs
parents:
diff changeset
   832
hgs
parents:
diff changeset
   833
    // Height should be multiple of baseline.
hgs
parents:
diff changeset
   834
    // Round up to the next full multiple if needed.
hgs
parents:
diff changeset
   835
    TInt remainder = result.iHeight % iBaseLine;
hgs
parents:
diff changeset
   836
    if ( remainder )
hgs
parents:
diff changeset
   837
        {
hgs
parents:
diff changeset
   838
        result.iHeight += ( iBaseLine - remainder );
hgs
parents:
diff changeset
   839
        }
hgs
parents:
diff changeset
   840
        
hgs
parents:
diff changeset
   841
    if ( result.iHeight > iMaxSize.iHeight )
hgs
parents:
diff changeset
   842
        {
hgs
parents:
diff changeset
   843
        result.iHeight = iMaxSize.iHeight;
hgs
parents:
diff changeset
   844
        }
hgs
parents:
diff changeset
   845
hgs
parents:
diff changeset
   846
    return result;
hgs
parents:
diff changeset
   847
    }
hgs
parents:
diff changeset
   848
hgs
parents:
diff changeset
   849
// ---------------------------------------------------------
hgs
parents:
diff changeset
   850
// CMsgImageControl::BitmapSize
hgs
parents:
diff changeset
   851
// 
hgs
parents:
diff changeset
   852
// Returns correct size for bitmap.
hgs
parents:
diff changeset
   853
// ---------------------------------------------------------
hgs
parents:
diff changeset
   854
//
hgs
parents:
diff changeset
   855
TSize CMsgImageControl::BitmapSize() const
hgs
parents:
diff changeset
   856
    {
hgs
parents:
diff changeset
   857
    TSize bitmapSize( 0, 0 );
hgs
parents:
diff changeset
   858
    if ( !iIconControl->IsVisible() &&
hgs
parents:
diff changeset
   859
         ( iBitmapControl->Size().iWidth == 0 ||
hgs
parents:
diff changeset
   860
           iBitmapControl->Size().iHeight == 0 ) )
hgs
parents:
diff changeset
   861
        {
hgs
parents:
diff changeset
   862
        if ( iEngine )
hgs
parents:
diff changeset
   863
            {
hgs
parents:
diff changeset
   864
            bitmapSize = iEngine->SourceSize() ;
hgs
parents:
diff changeset
   865
            bitmapSize.iWidth += iFrame->FrameBorderSize().iWidth;
hgs
parents:
diff changeset
   866
            bitmapSize.iHeight += iFrame->FrameBorderSize().iHeight;
hgs
parents:
diff changeset
   867
            }
hgs
parents:
diff changeset
   868
        }
hgs
parents:
diff changeset
   869
    else 
hgs
parents:
diff changeset
   870
        {
hgs
parents:
diff changeset
   871
        // Bitmap or icon visible. 
hgs
parents:
diff changeset
   872
        bitmapSize = iFrame->FrameSize();
hgs
parents:
diff changeset
   873
        }
hgs
parents:
diff changeset
   874
hgs
parents:
diff changeset
   875
    return bitmapSize;
hgs
parents:
diff changeset
   876
    }
hgs
parents:
diff changeset
   877
hgs
parents:
diff changeset
   878
// ---------------------------------------------------------
hgs
parents:
diff changeset
   879
// CMsgImageControl::DoPlay
hgs
parents:
diff changeset
   880
//
hgs
parents:
diff changeset
   881
// Starts animation if possible and sets control to correct state.
hgs
parents:
diff changeset
   882
// ---------------------------------------------------------
hgs
parents:
diff changeset
   883
//
hgs
parents:
diff changeset
   884
void CMsgImageControl::DoPlay( TInt aAnimationStartDelay )
hgs
parents:
diff changeset
   885
    {
hgs
parents:
diff changeset
   886
    StartAnimation( aAnimationStartDelay );
hgs
parents:
diff changeset
   887
    
hgs
parents:
diff changeset
   888
    if ( iState != EMsgAsyncControlStateOpening )
hgs
parents:
diff changeset
   889
        {
hgs
parents:
diff changeset
   890
        SetState( EMsgAsyncControlStatePlaying );
hgs
parents:
diff changeset
   891
        }
hgs
parents:
diff changeset
   892
    }
hgs
parents:
diff changeset
   893
hgs
parents:
diff changeset
   894
// ---------------------------------------------------------
hgs
parents:
diff changeset
   895
// CMsgImageControl::DoPause
hgs
parents:
diff changeset
   896
//
hgs
parents:
diff changeset
   897
// Stops animation and sets control to correct state.
hgs
parents:
diff changeset
   898
// ---------------------------------------------------------
hgs
parents:
diff changeset
   899
//
hgs
parents:
diff changeset
   900
void CMsgImageControl::DoPause()
hgs
parents:
diff changeset
   901
    {
hgs
parents:
diff changeset
   902
    StopAnimation();
hgs
parents:
diff changeset
   903
    
hgs
parents:
diff changeset
   904
    SetState( EMsgAsyncControlStatePaused );
hgs
parents:
diff changeset
   905
    }
hgs
parents:
diff changeset
   906
hgs
parents:
diff changeset
   907
// ---------------------------------------------------------
hgs
parents:
diff changeset
   908
// CMsgImageControl::CalculateMaxSize
hgs
parents:
diff changeset
   909
// ---------------------------------------------------------
hgs
parents:
diff changeset
   910
//
hgs
parents:
diff changeset
   911
void CMsgImageControl::CalculateMaxSize()
hgs
parents:
diff changeset
   912
    {
hgs
parents:
diff changeset
   913
    TAknLayoutRect maxSizeLayout;
hgs
parents:
diff changeset
   914
    maxSizeLayout.LayoutRect( MsgEditorCommons::MsgDataPane(),
hgs
parents:
diff changeset
   915
                              AknLayoutScalable_Apps::msg_data_pane_g1().LayoutLine() );
hgs
parents:
diff changeset
   916
    
hgs
parents:
diff changeset
   917
    iMaxSize = maxSizeLayout.Rect().Size();
hgs
parents:
diff changeset
   918
    
hgs
parents:
diff changeset
   919
    // Make sure "iMaxSize" is multiple of "iBaseLine"
hgs
parents:
diff changeset
   920
    iMaxSize.iHeight = iBaseLine * ( iMaxSize.iHeight / iBaseLine );
hgs
parents:
diff changeset
   921
    }
hgs
parents:
diff changeset
   922
hgs
parents:
diff changeset
   923
// ---------------------------------------------------------
hgs
parents:
diff changeset
   924
// CMsgImageControl::HitRegionContains
hgs
parents:
diff changeset
   925
// 
hgs
parents:
diff changeset
   926
// Note! CONE will do final verification if control is really hit so
hgs
parents:
diff changeset
   927
//       not need to do it here.
hgs
parents:
diff changeset
   928
// ---------------------------------------------------------
hgs
parents:
diff changeset
   929
//
hgs
parents:
diff changeset
   930
#ifdef RD_SCALABLE_UI_V2
hgs
parents:
diff changeset
   931
TBool CMsgImageControl::HitRegionContains( const TPoint& aPoint, 
hgs
parents:
diff changeset
   932
                                     const CCoeControl& /*aControl*/ ) const
hgs
parents:
diff changeset
   933
    {
hgs
parents:
diff changeset
   934
    TBool result( EFalse );
hgs
parents:
diff changeset
   935
    
hgs
parents:
diff changeset
   936
    CCoeControl* visiblePlaceholder = VisiblePlaceholder();
hgs
parents:
diff changeset
   937
    
hgs
parents:
diff changeset
   938
    if ( visiblePlaceholder )
hgs
parents:
diff changeset
   939
        {
hgs
parents:
diff changeset
   940
        result = visiblePlaceholder->Rect().Contains( aPoint );
hgs
parents:
diff changeset
   941
        }
hgs
parents:
diff changeset
   942
    else
hgs
parents:
diff changeset
   943
        {
hgs
parents:
diff changeset
   944
        result = iBitmapControl->Rect().Contains( aPoint );
hgs
parents:
diff changeset
   945
        }
hgs
parents:
diff changeset
   946
        
hgs
parents:
diff changeset
   947
    return result;
hgs
parents:
diff changeset
   948
    }
hgs
parents:
diff changeset
   949
#else
hgs
parents:
diff changeset
   950
TBool CMsgImageControl::HitRegionContains( const TPoint& /*aPoint*/, 
hgs
parents:
diff changeset
   951
                                     const CCoeControl& /*aControl*/ ) const
hgs
parents:
diff changeset
   952
    {
hgs
parents:
diff changeset
   953
    return EFalse;
hgs
parents:
diff changeset
   954
    }
hgs
parents:
diff changeset
   955
#endif
hgs
parents:
diff changeset
   956
hgs
parents:
diff changeset
   957
hgs
parents:
diff changeset
   958
// ---------------------------------------------------------
hgs
parents:
diff changeset
   959
// CMsgImageControl::FrameSize
hgs
parents:
diff changeset
   960
//
hgs
parents:
diff changeset
   961
// Returns the framesize
hgs
parents:
diff changeset
   962
// ---------------------------------------------------------
hgs
parents:
diff changeset
   963
//
hgs
parents:
diff changeset
   964
EXPORT_C TSize CMsgImageControl::FrameSize()
hgs
parents:
diff changeset
   965
    {
hgs
parents:
diff changeset
   966
    return iFrame->FrameSize();
hgs
parents:
diff changeset
   967
    }
hgs
parents:
diff changeset
   968
hgs
parents:
diff changeset
   969
// ---------------------------------------------------------
hgs
parents:
diff changeset
   970
// CMsgImageControl::StartAnimation
hgs
parents:
diff changeset
   971
//
hgs
parents:
diff changeset
   972
// Starts animation if possible.
hgs
parents:
diff changeset
   973
// ---------------------------------------------------------
hgs
parents:
diff changeset
   974
//
hgs
parents:
diff changeset
   975
void CMsgImageControl::StartAnimation( TInt aAnimationStartDelay )
hgs
parents:
diff changeset
   976
    {
hgs
parents:
diff changeset
   977
    iLoopTimer->Cancel();
hgs
parents:
diff changeset
   978
    
hgs
parents:
diff changeset
   979
    if ( iEngine && 
hgs
parents:
diff changeset
   980
         IsAnimation() && 
hgs
parents:
diff changeset
   981
         !IsOffScreen() &&
hgs
parents:
diff changeset
   982
         iLoopCount != iCurrentLoop )
hgs
parents:
diff changeset
   983
        {    
hgs
parents:
diff changeset
   984
        iAnimationState = EAnimationPlaying;
hgs
parents:
diff changeset
   985
            
hgs
parents:
diff changeset
   986
        if ( aAnimationStartDelay == 0 )
hgs
parents:
diff changeset
   987
            {
hgs
parents:
diff changeset
   988
            iEngine->Play();
hgs
parents:
diff changeset
   989
            }
hgs
parents:
diff changeset
   990
        else 
hgs
parents:
diff changeset
   991
            {
hgs
parents:
diff changeset
   992
            iLoopTimer->Start( aAnimationStartDelay,
hgs
parents:
diff changeset
   993
                               aAnimationStartDelay,
hgs
parents:
diff changeset
   994
                               TCallBack( DoStartLoop, this ) );
hgs
parents:
diff changeset
   995
            }
hgs
parents:
diff changeset
   996
        }
hgs
parents:
diff changeset
   997
    }
hgs
parents:
diff changeset
   998
hgs
parents:
diff changeset
   999
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1000
// CMsgImageControl::StopAnimation
hgs
parents:
diff changeset
  1001
//
hgs
parents:
diff changeset
  1002
// Stops animation if possible.
hgs
parents:
diff changeset
  1003
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1004
//
hgs
parents:
diff changeset
  1005
void CMsgImageControl::StopAnimation()
hgs
parents:
diff changeset
  1006
    {
hgs
parents:
diff changeset
  1007
    iLoopTimer->Cancel();
hgs
parents:
diff changeset
  1008
    
hgs
parents:
diff changeset
  1009
    if ( iEngine &&  
hgs
parents:
diff changeset
  1010
         IsAnimation() )
hgs
parents:
diff changeset
  1011
        {
hgs
parents:
diff changeset
  1012
        iEngine->Stop();
hgs
parents:
diff changeset
  1013
        iAnimationState = EAnimationStopped;
hgs
parents:
diff changeset
  1014
        }
hgs
parents:
diff changeset
  1015
    }
hgs
parents:
diff changeset
  1016
hgs
parents:
diff changeset
  1017
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1018
// CMsgImageControl::PauseAnimation
hgs
parents:
diff changeset
  1019
//
hgs
parents:
diff changeset
  1020
// Pauses animation if possible.
hgs
parents:
diff changeset
  1021
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1022
//
hgs
parents:
diff changeset
  1023
void CMsgImageControl::PauseAnimation()
hgs
parents:
diff changeset
  1024
    {
hgs
parents:
diff changeset
  1025
    StopAnimation();
hgs
parents:
diff changeset
  1026
    iAnimationState = EAnimationPaused;
hgs
parents:
diff changeset
  1027
    }
hgs
parents:
diff changeset
  1028
hgs
parents:
diff changeset
  1029
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1030
// CMsgImageControl::DoStartLoop
hgs
parents:
diff changeset
  1031
//
hgs
parents:
diff changeset
  1032
// Start new animation loop.
hgs
parents:
diff changeset
  1033
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1034
//
hgs
parents:
diff changeset
  1035
TInt CMsgImageControl::DoStartLoop( TAny* aObject )
hgs
parents:
diff changeset
  1036
    {
hgs
parents:
diff changeset
  1037
    // cast, and call non-static function
hgs
parents:
diff changeset
  1038
    CMsgImageControl* control = static_cast<CMsgImageControl*>( aObject );
hgs
parents:
diff changeset
  1039
    control->StartLoop();
hgs
parents:
diff changeset
  1040
    
hgs
parents:
diff changeset
  1041
    return KErrNone;
hgs
parents:
diff changeset
  1042
    }
hgs
parents:
diff changeset
  1043
hgs
parents:
diff changeset
  1044
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1045
// CMsgImageControl::StartLoop
hgs
parents:
diff changeset
  1046
//
hgs
parents:
diff changeset
  1047
// Start new animation loop.
hgs
parents:
diff changeset
  1048
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1049
//
hgs
parents:
diff changeset
  1050
void CMsgImageControl::StartLoop()
hgs
parents:
diff changeset
  1051
    {
hgs
parents:
diff changeset
  1052
    if ( iAnimationState == EAnimationPlaying )
hgs
parents:
diff changeset
  1053
        {
hgs
parents:
diff changeset
  1054
        StartAnimation( 0 );
hgs
parents:
diff changeset
  1055
        }
hgs
parents:
diff changeset
  1056
    else
hgs
parents:
diff changeset
  1057
        {
hgs
parents:
diff changeset
  1058
        iLoopTimer->Cancel();
hgs
parents:
diff changeset
  1059
        }
hgs
parents:
diff changeset
  1060
    }
hgs
parents:
diff changeset
  1061
hgs
parents:
diff changeset
  1062
//  End of File