uifw/AvKon/src/AknSmileyModel.cpp
changeset 0 2f259fa3e83a
child 9 aabf2c525e0f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/AknSmileyModel.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,384 @@
+/*
+* Copyright (c) 2002-2009 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 <barsread.h>
+#include <AknUtils.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+
+#include <centralrepository.h>
+#include <AvkonInternalCRKeys.h>
+
+#include <smiley.rsg>
+#include <smiley.mbg>
+
+#include "AknSmileyModel.h"
+#include "AknSmileyImage.h"
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+// TSmileyIconInfo
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+TSmileyIconInfo::TSmileyIconInfo()
+    {
+    Reset();
+    }
+
+TSmileyIconInfo::TSmileyIconInfo(const TSmileyIconInfo& aInfo) : 
+iName(aInfo.iName), 
+iId(aInfo.iId), 
+iSkinItemID(aInfo.iSkinItemID), 
+iDefaultThumbnailID(aInfo.iDefaultThumbnailID), 
+iDefaultAnimationID(aInfo.iDefaultAnimationID)
+    {
+    }
+
+void TSmileyIconInfo::Reset()
+    {
+    iName.Zero();
+    iId = 0;
+    iSkinItemID.Set(0, 0);
+    iDefaultThumbnailID = 0;
+    iDefaultAnimationID = 0;
+    }
+
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+// CSmileyIcon
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+CSmileyIcon* CSmileyIcon::NewL(const TSmileyIconInfo& aInfo, MSmileyIconObserver* aObserver)
+    {
+    CSmileyIcon* self = new (ELeave) CSmileyIcon(aInfo, aObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(); // self;
+    return self;
+    }
+
+void CSmileyIcon::ConstructL()
+    {
+    iThumbnailImage = CSmileyImage::NewL(iInfo.iSkinItemID, iInfo.iDefaultThumbnailID, FALSE, this);
+    
+    if(iInfo.iSkinItemID.iMinor==0 && iInfo.iDefaultAnimationID>0)
+        {
+        iAnimationImage = CSmileyImage::NewL(iInfo.iSkinItemID, iInfo.iDefaultAnimationID, TRUE, this);
+        }
+    }
+
+CSmileyIcon::CSmileyIcon(const TSmileyIconInfo& aInfo, MSmileyIconObserver* aObserver) : 
+iInfo(aInfo), iSmileyIconObserver(aObserver)
+    {
+    }
+
+CSmileyIcon::~CSmileyIcon()
+    {
+    delete iThumbnailImage;
+    delete iAnimationImage;
+    }
+
+TBool CSmileyIcon::ReadyToDraw() const
+    {
+    TBool thumbnailCanDraw = iThumbnailImage->ReadyToDraw();
+    TBool animationCanDraw = iAnimationImage ? iAnimationImage->ReadyToDraw() : FALSE;
+    
+    return (thumbnailCanDraw || animationCanDraw);
+    }
+
+const CFbsBitmap* CSmileyIcon::Image() const
+    {
+    if(ShouldShowAnimation())
+        {
+        return iAnimationImage->Image();
+        }
+    else
+        {
+        return iThumbnailImage->Image();
+        }
+    }
+
+const CFbsBitmap* CSmileyIcon::Mask() const
+    {
+    if(ShouldShowAnimation())
+        {
+        return iAnimationImage->Mask();
+        }
+    else
+        {
+        return iThumbnailImage->Mask();
+        }
+    }
+
+void CSmileyIcon::LoadThumbnailL()
+    {
+    iThumbnailImage->LoadL();
+    }
+
+TBool CSmileyIcon::ThumbnailReady() const
+    {
+    return iThumbnailImage->ReadyToDraw();
+    }
+
+void CSmileyIcon::PlayAnimationL(TInt aRepeat, TInt aDelay)
+    {
+    if(iAnimationImage)
+        {
+        iAnimationImage->LoadL(aRepeat, aDelay);
+        }
+    }
+
+void CSmileyIcon::StopAnimation()
+    {
+    if(iAnimationImage)
+        {
+        iAnimationImage->Release();
+        }
+    }
+
+void CSmileyIcon::SetSize(const TSize& aSize)
+    {
+    iThumbnailImage->SetSize(aSize);
+    
+    if(iAnimationImage)
+        {
+        iAnimationImage->SetSize(aSize);
+        }
+    }
+
+const TSize& CSmileyIcon::Size() const
+    {
+    return iThumbnailImage->Size();
+    }
+
+void CSmileyIcon::BitmapChanged(CSmileyImage* aSmileyImage, CFbsBitmap* /*aBitmap*/)
+    {
+    if(aSmileyImage == iThumbnailImage)
+        {
+        if(iSmileyIconObserver) iSmileyIconObserver->ThumbnailLoaded(this);
+        }
+    else
+        {
+        if(iSmileyIconObserver) iSmileyIconObserver->AnimationChanged(this);
+        }
+    }
+
+TBool CSmileyIcon::ShouldShowAnimation() const
+    {
+    return (iAnimationImage && iAnimationImage->ReadyToDraw());
+    }
+
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+// CSmileyTnumbnailAsynLoader
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+CSmileyTnumbnailAsynLoader::CSmileyTnumbnailAsynLoader()
+    {
+    
+    }
+
+CSmileyTnumbnailAsynLoader::~CSmileyTnumbnailAsynLoader()
+    {
+    iTaskArray.Close();
+    }
+
+void CSmileyTnumbnailAsynLoader::AddTaskL(CSmileyIcon* aSmileyIcon)
+    {
+    if(aSmileyIcon)
+        {
+        iTaskArray.Append(aSmileyIcon);
+        if(!iIsLoading)
+            {
+            DoNextTaskL();
+            }
+        }
+    }
+
+void CSmileyTnumbnailAsynLoader::DiscardAll()
+    {
+    iTaskArray.Reset();
+    }
+
+TInt CSmileyTnumbnailAsynLoader::TaskCount() const
+    {
+    return iTaskArray.Count();
+    }
+
+void CSmileyTnumbnailAsynLoader::DoNextTaskL()
+    {
+    TInt count = TaskCount();
+    if(count > 0)
+        {
+        CSmileyIcon* icon = iTaskArray[0];
+        iTaskArray.Remove(0);
+        
+        if(icon->ThumbnailReady())
+            {
+            DoNextTaskL();
+            }
+        else
+            {
+            icon->LoadThumbnailL();
+            iIsLoading = TRUE;
+            }
+        }
+    else
+        {
+        iIsLoading = FALSE;
+        }
+    }
+
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+// CSmileyModel
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+CSmileyModel::CSmileyModel(MSmileyIconObserver* aObserver) : iSmileyIconObserver(aObserver)
+    {
+    }
+
+CSmileyModel::~CSmileyModel()
+    {
+    ReleaseResource();
+    
+    iSmileyIconArray.Close();
+    }
+
+void CSmileyModel::LoadResourceL()
+    {
+    if(Count() > 0) return;
+    
+    // append sct & smiley switch icon
+        {
+        TSmileyIconInfo info;
+        info.iSkinItemID = KAknsIIDQgnIndiSwitchSmiley2;
+        info.iDefaultThumbnailID = EMbmSmileyQgn_indi_switch_smiley2;
+        iSmileyIconArray.Append(CSmileyIcon::NewL(info, this));
+        
+        info.iSkinItemID = KAknsIIDQgnIndiSwitchSct2;
+        info.iDefaultThumbnailID = EMbmSmileyQgn_indi_switch_sct2;
+        iSmileyIconArray.Append(CSmileyIcon::NewL(info, this));
+        }
+
+    // append image resourece
+    TResourceReader reader;
+    TFileName smileyRscName;
+    SmileyUtils::GetCustomizableResPath(smileyRscName, KSmileyRsc);
+    TInt offset = CCoeEnv::Static()->AddResourceFileL(smileyRscName);
+    CCoeEnv::Static()->CreateResourceReaderLC(reader, R_SMILEY_ICONS_INFO);
+
+    TInt count(reader.ReadInt16());
+    for(TInt id(1); id<=count; id++)
+        {
+        TSmileyIconInfo info;
+        
+        info.iId = id; // id
+        
+        TBool isAnimation = (reader.ReadInt16() == 1);
+        TInt16 code = reader.ReadInt16();
+        TInt bmpId1 = reader.ReadInt32();
+        TInt maskId1 = reader.ReadInt32();
+        TInt bmpId2 = reader.ReadInt32();
+        TInt maskId2 = reader.ReadInt32();
+        
+        if(bmpId2 > 0)
+            {
+            info.iDefaultThumbnailID = bmpId2;
+            info.iDefaultAnimationID = bmpId1;
+            }
+        else
+            {
+            info.iDefaultThumbnailID = bmpId1;
+            info.iDefaultAnimationID = 0;
+            }
+
+        TBuf<64> smileyName = reader.ReadTPtrC(); // strings
+        TInt pos = smileyName.Find(_L(" "));
+        if(pos > 0) smileyName.SetLength(pos);
+        info.iName = smileyName;
+
+        iSmileyIconArray.Append(CSmileyIcon::NewL(info, this));
+        }
+    
+    CCoeEnv::Static()->DeleteResourceFile(offset);
+    CleanupStack::PopAndDestroy(); // reader
+
+    }
+
+void CSmileyModel::ReleaseResource()
+    {
+    // reset array
+    for(TInt i(0); i<Count(); i++)
+        {
+        delete iSmileyIconArray[i];
+        iSmileyIconArray[i] = NULL;
+        }
+    iSmileyIconArray.Reset();
+    
+    // reset task loader
+    iSmileyThumbnailLoader.DiscardAll();
+    }
+
+void CSmileyModel::LoadThumbnailAsyn(TInt aIndex)
+    {
+    TRAP_IGNORE(iSmileyThumbnailLoader.AddTaskL((*this)[aIndex]));
+    }
+
+void CSmileyModel::SetSize(const TSize& aSize)
+    {
+    for(TInt i(0); i<Count(); i++)
+        {
+        iSmileyIconArray[i]->SetSize(aSize);
+        }
+    }
+
+CSmileyIcon* CSmileyModel::operator[](TInt aIndex) const
+    {
+    if(aIndex>=0 && aIndex<Count())
+        {
+        return iSmileyIconArray[aIndex];
+        }
+    else
+        {
+        return NULL;
+        }
+    }
+
+TInt CSmileyModel::Count() const
+    {
+    return iSmileyIconArray.Count();
+    }
+
+void CSmileyModel::ThumbnailLoaded(CSmileyIcon* aSmileyIcon)
+    {
+    TRAP_IGNORE(iSmileyThumbnailLoader.DoNextTaskL());
+
+    if(iSmileyIconObserver) iSmileyIconObserver->ThumbnailLoaded(aSmileyIcon);
+    }
+
+void CSmileyModel::AnimationChanged(CSmileyIcon* aSmileyIcon)
+    {
+    if(iSmileyIconObserver) iSmileyIconObserver->AnimationChanged(aSmileyIcon);
+    }
+
+
+// end of file
+