idlehomescreen/examples/mcsexample/src/MCSExampleAppView.cpp
branchRCL_3
changeset 35 3321d3e205b6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/examples/mcsexample/src/MCSExampleAppView.cpp	Tue Sep 14 20:58:58 2010 +0300
@@ -0,0 +1,462 @@
+/*
+* Copyright (c) 2010 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 FILES
+#include <coemain.h>
+#include <mcsmenuitem.h>
+#include <mcsmenuiconutility.h>
+#include <mcsdef.h>
+#include <akniconarray.h>
+#include <eikclbd.h>
+#include <eikedwin.h>
+
+#include <aknsconstants.h>
+#include <aknsconstants.hrh>
+
+#include <MCSExample_0xEB753B18.rsg>
+#include "MCSExampleAppView.h"
+#include "mcspluginwatcher.h"
+#include "MCSExample.hrh"
+
+_LIT( KMenuData, "matrixmenudata" );
+
+CMyForm::CMyForm( TMyData& aData ) : iData( aData )
+    {
+    }
+
+CMyForm::~CMyForm()
+    {
+    }
+        
+void CMyForm::PreLayoutDynInitL()
+    {
+    CAknForm::PreLayoutDynInitL();
+    LoadFormDataL();
+    }
+
+void CMyForm::LoadFormDataL()
+    {
+    CEikEdwin* textEd1 =
+        (CEikEdwin*)Control( EMyFirstLine );
+    textEd1->SetTextL( &iData.majorID );
+    
+    CEikEdwin* textEd2 =
+        (CEikEdwin*)Control( EMySecondLine );
+    textEd2->SetTextL( &iData.minorID );
+    
+    CEikEdwin* textEd3 =
+        (CEikEdwin*)Control( EMyThirdLine );
+    textEd3->SetTextL( &iData.iconFile );
+    
+    CEikEdwin* textEd4 =
+        (CEikEdwin*)Control( EMyFourthLine );
+    textEd4->SetTextL( &iData.iconID );
+    
+    CEikEdwin* textEd5 =
+        (CEikEdwin*)Control( EMyFifthLine );
+    textEd5->SetTextL( &iData.maskID );
+    
+    CEikEdwin* textEd6 =
+        (CEikEdwin*)Control( EMySixthLine );
+    textEd6->SetTextL( &iData.statusIcon );
+    }
+
+TBool CMyForm::SaveFormDataL()
+    {
+    CEikEdwin* textEd1 =
+        (CEikEdwin*)Control( EMyFirstLine );
+    textEd1->GetText( iData.majorID );
+    
+    CEikEdwin* textEd2 =
+        (CEikEdwin*)Control( EMySecondLine );
+    textEd2->GetText( iData.minorID );
+    
+    CEikEdwin* textEd3 =
+        (CEikEdwin*)Control( EMyThirdLine );
+    textEd3->GetText( iData.iconFile );
+    
+    CEikEdwin* textEd4 =
+        (CEikEdwin*)Control( EMyFourthLine );
+    textEd4->GetText( iData.iconID );
+    
+    CEikEdwin* textEd5 =
+        (CEikEdwin*)Control( EMyFifthLine );
+    textEd5->GetText( iData.maskID );
+    
+    CEikEdwin* textEd6 =
+        (CEikEdwin*)Control( EMySixthLine );
+    textEd6->GetText( iData.statusIcon );
+    return ETrue;
+    }
+
+void CMyForm::DoNotSaveFormDataL()
+    {
+    LoadFormDataL();
+    }
+
+TBool CMyForm::OkToExitL( TInt aButtonId )
+    {
+    if ( aButtonId  == EAknSoftkeyOk)
+        {
+        SaveFormDataL();
+        iData.updated = ETrue;
+        }
+    else if( aButtonId == EAknSoftkeyCancel )
+        {
+        iData.updated = EFalse;
+        }
+    return ETrue;
+    }
+
+CGulIcon* ConvertToGulIconLC( CAknIcon* aIcon )
+    {
+    CGulIcon* icon = CGulIcon::NewL( aIcon->Bitmap(), aIcon->Mask() );
+    CleanupStack::PushL( icon );
+    // Detach bitmap and mask
+    aIcon->SetBitmap( NULL );
+    aIcon->SetMask( NULL );
+    return icon;
+    }
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppView::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CMCSExampleAppView* CMCSExampleAppView::NewL(const TRect& aRect)
+    {
+    CMCSExampleAppView* self = CMCSExampleAppView::NewLC(aRect);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppView::NewLC()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CMCSExampleAppView* CMCSExampleAppView::NewLC(const TRect& aRect)
+    {
+    CMCSExampleAppView* self = new (ELeave) CMCSExampleAppView;
+    CleanupStack::PushL(self);
+    self->ConstructL(aRect);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppView::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppView::ConstructL(const TRect& aRect)
+    {
+    // Create a window for this application view
+    CreateWindowL();
+
+    // Set the windows size
+    SetRect(aRect);
+
+    // Activate the window, which makes it ready to be drawn
+    ActivateL();
+    
+    iMCSMenu.OpenL( KMenuData );
+    iWatcher = CMCSExampleWatcher::NewL();
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppView::CMCSExampleAppView()
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CMCSExampleAppView::CMCSExampleAppView()
+    {
+    // No implementation required
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppView::~CMCSExampleAppView()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CMCSExampleAppView::~CMCSExampleAppView()
+    {
+    iMCSMenu.Close();
+    delete iListBox;
+    iItemArray.Close();
+    delete iWatcher;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppView::ListAllItemsL()
+    {
+    
+
+    CArrayPtr<CGulIcon>* icons =new( ELeave ) CAknIconArray(1);
+    CleanupStack::PushL(icons);
+   
+    iListBox->Model()->SetItemTextArray(GetArrayL(icons));
+    iListBox->Model()->SetOwnershipType(ELbmOwnsItemArray);
+    //
+    // Inform the listbox of item additions. 
+    // This should be done if you want your items displayed correctly
+    iListBox ->HandleItemAdditionL();
+ 
+    CleanupStack::Pop(icons);
+    CArrayPtr<CGulIcon>* oldArray = iListBox->ItemDrawer()->ColumnData()->IconArray();
+    delete oldArray;
+    iListBox->ItemDrawer()->ColumnData()->SetIconArray(icons);
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppView::MakeListBoxL()
+    {
+    TInt MySetIndex(0);
+ 
+    if(iListBox)
+    {
+        MySetIndex = iListBox->CurrentItemIndex();
+    }
+ 
+    delete iListBox;
+    iListBox = NULL;
+ 
+    iListBox = new( ELeave ) CAknSingleLargeStyleListBox();
+    iListBox->ConstructL(this,EAknListBoxSelectionList);
+    iListBox->SetListBoxObserver( this );
+    
+    iListBox->CreateScrollBarFrameL( ETrue );
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+        CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
+ 
+    iListBox->SetRect(Rect());
+ 
+    iListBox->View()->SetListEmptyTextL(_L("No data"));
+ 
+    iListBox->ActivateL();
+ 
+    TInt ItemsCount = iListBox->Model()->ItemTextArray()->MdcaCount();
+ 
+    if(ItemsCount > MySetIndex && MySetIndex >= 0)
+        iListBox->SetCurrentItemIndex(MySetIndex);
+    else if(ItemsCount > 0)
+        iListBox->SetCurrentItemIndex(0);
+ 
+    UpdateScrollBar(iListBox);
+    iListBox->DrawNow();
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+CDesCArray* CMCSExampleAppView::GetArrayL(CArrayPtr<CGulIcon>* aIcons)
+{   
+    TBuf<256> listString;
+    CDesCArrayFlat* myArray = new(ELeave)CDesCArrayFlat(1);
+    CleanupStack::PushL(myArray);
+ 
+    const TInt rootId = iMCSMenu. RootFolderL();
+    iItemArray.Reset();
+    //CleanupClosePushL( itemArray );
+    // Get all the items from MCS
+    iMCSMenu.GetItemsL( iItemArray, rootId, NULL, ETrue );
+
+    for( TInt i = 0; i < iItemArray.Count(); i++ )
+        {
+        // Open the actual item
+        CMenuItem* menuItem = CMenuItem::OpenL( iMCSMenu, iItemArray[i] );
+        CleanupStack::PushL( menuItem );
+        
+        // Get the name of the item
+        TBool attrExists( EFalse );
+        TPtrC attr = menuItem->GetAttributeL(_L("short_name" ), attrExists );
+
+        //Create listbox string
+        listString.Delete(0, 256);
+        listString.AppendNum( i );
+        listString.Append( _L("\t"));
+        listString.Append( attr );
+        myArray->AppendL( listString );
+        
+        //Fetch the item icon from MCS
+        CAknIcon* icon = MenuIconUtility::GetItemIconL( *menuItem );
+        CleanupStack::PushL( icon );
+        if ( icon )
+            {
+            CGulIcon* gIcon = ConvertToGulIconLC( icon );
+            aIcons->AppendL( gIcon );
+            CleanupStack::Pop( gIcon );
+            }
+        CleanupStack::PopAndDestroy( icon );
+        CleanupStack::PopAndDestroy( menuItem );
+        } 
+    CleanupStack::Pop(myArray);
+    return myArray;
+}
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppView::UpdateScrollBar(CEikListBox* aListBox)
+    {
+    if (aListBox)
+        {   
+        TInt pos(aListBox->View()->CurrentItemIndex());
+        if (aListBox->ScrollBarFrame())
+            {
+            aListBox->ScrollBarFrame()->MoveVertThumbTo(pos);
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppView::Draw()
+// Draws the display.
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppView::Draw(const TRect& /*aRect*/) const
+    {
+    // Get the standard graphics context
+    CWindowGc& gc = SystemGc();
+
+    // Gets the control's extent
+    TRect drawRect(Rect());
+
+    // Clears the screen
+    gc.Clear(drawRect);
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppView::SizeChanged()
+// Called by framework when the view size is changed.
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppView::SizeChanged()
+    {
+    TRAP_IGNORE( MakeListBoxL() );
+    DrawNow();
+    }
+
+// -----------------------------------------------------------------------------
+// CMCSExampleAppView::HandlePointerEventL()
+// Called by framework to handle pointer touch events.
+// Note: although this method is compatible with earlier SDKs, 
+// it will not be called in SDKs without Touch support.
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppView::HandlePointerEventL(
+        const TPointerEvent& aPointerEvent)
+    {
+
+    // Call base class HandlePointerEventL()
+    CCoeControl::HandlePointerEventL(aPointerEvent);
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppView::HandleListBoxEventL( CEikListBox* /*aListBox*/, TListBoxEvent aEventType )
+    {
+    if( iListBox && aEventType == EEventItemSingleClicked )
+        {
+        TInt index = iListBox->CurrentItemIndex();
+        if( index < iItemArray.Count())
+            {
+            ShowFormL( index );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CMCSExampleAppView::ShowFormL( TInt aItemIndex)
+    {
+    CMenuItem* menuItem = CMenuItem::OpenL( iMCSMenu, iItemArray[aItemIndex] );
+    CleanupStack::PushL( menuItem );
+    TBool attrExists( EFalse );
+    TPtrC attr = menuItem->GetAttributeL(_L("short_name" ), attrExists );
+    // Initialize  form data.
+    TBool exists( EFalse );;
+    TMyData myData;
+    myData.majorID = menuItem->GetAttributeL( KMenuAttrIconSkinMajorId, exists );
+    myData.minorID = menuItem->GetAttributeL( KMenuAttrIconSkinMinorId, exists );
+    myData.iconFile = menuItem->GetAttributeL( KMenuAttrIconFile, exists );
+    myData.iconID = menuItem->GetAttributeL( KMenuAttrIconId, exists );
+    myData.maskID = menuItem->GetAttributeL( KMenuAttrMaskId, exists );
+    // e.g. skin(0x101F86E3 0x1ee2)
+    myData.statusIcon = menuItem->GetAttributeL( _L("presenceicon"), exists );
+    myData.updated = EFalse;
+
+    // Launch the dialog to view/edit data
+    CAknForm* dlg = new ( ELeave ) CMyForm( myData );
+    CleanupStack::PushL( dlg );
+    dlg->ConstructL( 0 ); // default menu items only
+    CleanupStack::Pop( dlg );
+    dlg->ExecuteLD( R_ICON_QUERY_DIALOG );
+    // myData now contains the edited values.
+
+    if( myData.updated )
+        {
+        // Changes the main icon, if all values are empty then application icon is used.
+        // Piority 0
+        menuItem->SetAttributeL(KMenuAttrIconSkinMajorId, myData.majorID );
+        menuItem->SetAttributeL(KMenuAttrIconSkinMinorId, myData.minorID );
+        // Pririty 1
+        menuItem->SetAttributeL(KMenuAttrIconFile, myData.iconFile );
+        menuItem->SetAttributeL(KMenuAttrIconId, myData.iconID );
+        menuItem->SetAttributeL(KMenuAttrMaskId, myData.maskID );
+        //Changes the presence icon
+        menuItem->SetAttributeL( _L("presenceicon"), myData.statusIcon );
+                
+        CMenuOperation* operation = menuItem->SaveL( iWatcher->iStatus );
+        // Deletes the operation after its completion
+        iWatcher->Watch( operation, this );
+        }
+    CleanupStack::PopAndDestroy( menuItem );
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+CCoeControl* CMCSExampleAppView::ComponentControl( TInt /*aIndex*/) const
+{
+    return iListBox;
+}
+ 
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TInt CMCSExampleAppView::CountComponentControls() const
+{   
+    if(iListBox)
+        return 1;
+    else
+        return 0;
+}
+// End of File