landmarksui/uicontrols/src/CLmkAppCategorySettingsImpl.cpp
branchRCL_3
changeset 18 870918037e16
parent 0 522cd55cc3d7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/landmarksui/uicontrols/src/CLmkAppCategorySettingsImpl.cpp	Wed Sep 01 12:31:27 2010 +0100
@@ -0,0 +1,447 @@
+/*
+* Copyright (c) 2002 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:    Category settings implementation for LandmarksUi
+*
+*/
+
+
+// INCLUDE FILES
+#include "CLmkAppCategorySettingsImpl.h"
+#include "LmkListProviderFactory.h"
+#include "CLmkLmItemListProvider.h"
+#include "CLmkUiItemBase.h"
+#include "CLmkDbUtils.h"
+#include "CLmkUiUtils.h"
+#include "LmkConsts.h"
+#include "LmkNotes.h"
+#include <lmkui.rsg>
+#include <eiktxlbx.h>
+#include <EPos_CPosLandmarkCategory.h>
+#include <EPos_CPosLmCategoryManager.h>
+#include <EPos_CPosLandmarkCategory.h>
+#include <AknWaitDialog.h>
+#include <EPos_CPosLandmarkDatabase.h>
+#include <EPos_CPosLandmark.h>
+#include <EPos_TPosLmSortPref.h>
+#include <EPos_CPosLmItemIterator.h>
+#include <lmkerrors.h>
+
+
+// CONSTANTS
+/// Unnamed namespace for local definitions
+namespace {
+
+#if defined(_DEBUG)
+
+_LIT( KPanicMsg, "CLmkAppCategorySettingsImpl" );
+
+void Panic( TPanicCode aReason )
+    {
+    User::Panic( KPanicMsg, aReason );
+    }
+#endif
+
+}  // namespace
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CLmkAppCategorySettingsImpl::CLmkAppCategorySettingsImpl
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CLmkAppCategorySettingsImpl::CLmkAppCategorySettingsImpl(
+    CPosLandmarkDatabase& aDb,
+    CLmkSender& aSender,
+    TBool aFindBox )
+    : CLmkAppLmItemSelectorImpl( aDb, aSender, aFindBox )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CLmkAppCategorySettingsImpl::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CLmkAppCategorySettingsImpl::ConstructL()
+    {
+    CLmkAppLmItemSelectorImpl::BaseConstructL();
+    iBuffer = HBufC::NewL( KMaxCategoryNameFieldLen );
+    }
+
+// -----------------------------------------------------------------------------
+// CLmkAppCategorySettingsImpl::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CLmkAppCategorySettingsImpl* CLmkAppCategorySettingsImpl::NewL(
+    CPosLandmarkDatabase& aDb,
+    CLmkSender& aSender,
+    TBool aFindBox )
+    {
+    CLmkAppCategorySettingsImpl* self =
+        new( ELeave ) CLmkAppCategorySettingsImpl( aDb, aSender, aFindBox );
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CLmkAppCategorySettingsImpl::~CLmkAppCategorySettingsImpl
+// -----------------------------------------------------------------------------
+//
+CLmkAppCategorySettingsImpl::~CLmkAppCategorySettingsImpl()
+    {
+    if ( iWaitNote )
+        {
+        TRAPD( err, iWaitNote->ProcessFinishedL() );
+        if (err != KErrNone)
+    		{
+		    delete iWaitNote;
+            iWaitNote = NULL;
+	    	}
+        }
+    delete iBuffer;
+    }
+
+// -----------------------------------------------------------------------------
+// CLmkAppCategorySettingsImpl::SetupListProviderL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppCategorySettingsImpl::SetupListProviderL()
+    {
+    if ( !iListProvider )
+        {
+        iListProvider =
+            LmkListProviderFactory::CreateProviderL( iDb, ECategorySelector,
+                                                  ELmkShowExtendedCategories );
+        iListProvider->AddObserverL( *this );
+        iListProvider->InitializeL();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CLmkAppCategorySettingsImpl::ListProvider
+// -----------------------------------------------------------------------------
+//
+const CLmkListProviderBase& CLmkAppCategorySettingsImpl::ListProvider() const
+    {
+    __ASSERT_DEBUG( iListProvider, Panic( KLmkPanicNullMember ) );
+    return *iListProvider;
+    }
+
+// -----------------------------------------------------------------------------
+// CLmkAppCategorySettingsImpl::ProcessCommandL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppCategorySettingsImpl::ProcessCommandL( TInt aCommandId )
+    {
+    switch ( aCommandId )
+        {
+        case ELmkCmdNewCategory:
+			{
+            NewCategoryCmdL();
+			break;
+			}
+		case ELmkCmdChangeIcon:
+			{
+            ChangeIconCmdL();
+			break;
+			}
+		case ELmkCmdRenameCat:
+			{
+            RenameCategoryCmdL();
+			break;
+			}
+		case ELmkCmdDeleteCat:
+			{
+            DeleteCategoryCmdL();
+			break;
+            }
+        default:
+            {
+            // leave command handling to others
+            break;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CLmkAppCategorySettingsImpl::HandleOperationL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppCategorySettingsImpl::HandleOperationL(
+                                       TOperationTypes aType,
+                                       TReal32 /*aProgress*/,
+                                       TInt aStatus )
+    {
+    if ( aType == EDeleteCategories )
+        {
+        if ( aStatus != KPosLmOperationNotComplete && iWaitNote )
+            {
+            iWaitNote->ProcessFinishedL();
+            iWaitNote = NULL;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CLmkAppCategorySettingsImpl::ChangeIconL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppCategorySettingsImpl::ChangeIconL(
+    TPosLmItemId aId,
+    TInt aIconIndex,
+    TInt aMaskIndex)
+    {
+    TFileName* iconFile = CLmkUiUtils::LmkUiIconFileLC();
+    iDbUtils->ChangeIconL( iDb, aId, ELmkItemTypeCategory,
+                           *iconFile, aIconIndex, aMaskIndex);
+    CleanupStack::PopAndDestroy();//iconFile
+    }
+
+// -----------------------------------------------------------------------------
+// CLmkAppCategorySettingsImpl::ChangeIconsL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppCategorySettingsImpl::ChangeIconsL(
+    RArray<TPosLmItemId>& aIdArray,
+    TInt aIconIndex,
+    TInt aMaskIndex)
+    {
+    TFileName* iconFile = CLmkUiUtils::LmkUiIconFileLC();
+    iDbUtils->ChangeIconsL( aIdArray, ELmkItemTypeCategory,
+                            *iconFile, aIconIndex, aMaskIndex);
+    CleanupStack::PopAndDestroy();//iconFile
+    }
+
+// -----------------------------------------------------------------------------
+// CLmkAppCategorySettingsImpl::NewCategoryCmdL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppCategorySettingsImpl::NewCategoryCmdL()
+    {
+    TPtr catName( iBuffer->Des() );
+    catName.Zero();
+    CPosLandmarkCategory* newCategory = CPosLandmarkCategory::NewLC();
+
+    while( LmkNotes::CategoryNameQueryL( catName, R_LMK_CATEGORY_NAME_QUERY ) )
+        {
+        newCategory->SetCategoryNameL( catName );
+        TRAPD( err, iDbUtils->AddCategoryL( *newCategory, iDb ) );
+        if( err == KErrNone )
+            {
+            iNewListBoxItemAdded = ETrue;      
+            break;
+            }
+        else if ( err == KErrAlreadyExists )
+            {            
+            LmkNotes::InformationNoteL( iEnv,R_LMK_CATEGORY_NAME_EXISTS_NOTE );
+            }
+        else
+            {
+            User::LeaveIfError( err ); // other error cases
+            break; // exit while loop if no error
+            }
+        }    
+    CleanupStack::PopAndDestroy(); // newCategory
+    }
+
+// -----------------------------------------------------------------------------
+// CLmkAppCategorySettingsImpl::RenameCategoryCmdL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppCategorySettingsImpl::RenameCategoryCmdL()
+    {
+    __ASSERT_DEBUG( iListProvider, Panic( KLmkPanicNullMember ) );
+    TInt index = iListBox->CurrentItemIndex();
+    CLmkUiItemBase* item =
+        iListProvider->ItemAtL( index );
+    CleanupStack::PushL( item );
+
+    TPtr catName( iBuffer->Des() );
+    catName.Zero();
+    catName.Append( item->Text() );
+
+    while( LmkNotes::CategoryNameQueryL( catName, R_LMK_CATEGORY_NAME_QUERY ) )
+        {
+        TRAPD( err,
+               iDbUtils->RenameCategoryL( catName, SelectedIdL(), iDb ) );
+        if ( err == KErrAlreadyExists )
+            {
+            LmkNotes::InformationNoteL( iEnv, R_LMK_CATEGORY_NAME_EXISTS_NOTE );
+            }
+        else if ( err == KErrNone)
+        	{
+        	iNewListBoxItemAdded = ETrue;
+        	break;
+        	}
+        else
+            {
+            User::LeaveIfError( err ); // other error cases
+            break; // exit while loop if no error
+            }
+        }
+
+    CleanupStack::PopAndDestroy(); //item
+    }
+
+// -----------------------------------------------------------------------------
+// CLmkAppCategorySettingsImpl::IsGlobalCategory
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CLmkAppCategorySettingsImpl::IsPredefinedCategoryL()
+	{
+
+	TBool isGlobalCategory = EFalse;
+
+	RArray<TPosLmItemId>& markedItemIds = MarkedItemIdsL();
+    TInt markedCount = markedItemIds.Count();
+
+    if (markedCount)
+        {
+        CPosLmCategoryManager* categoryMgr = CPosLmCategoryManager::NewL( iDb );
+        CleanupStack::PushL( categoryMgr );
+
+        for(TInt i =0; i < markedCount; i++)
+        	{
+        	if(!isGlobalCategory)
+        		{
+        		CPosLandmarkCategory* category = categoryMgr->ReadCategoryLC(markedItemIds[i]);
+        		if (category->GlobalCategory() != KPosLmNullGlobalCategory)
+		        	{
+		           	isGlobalCategory = ETrue;
+		        	}
+		        CleanupStack::PopAndDestroy(1); //category
+        		}
+        	}
+        CleanupStack::PopAndDestroy(1); //categoryMgr
+	    }
+    else
+        {
+        TPosLmItemId categoryId = SelectedIdL();
+        CPosLmCategoryManager* categoryMgr = CPosLmCategoryManager::NewL( iDb );
+
+        CleanupStack::PushL( categoryMgr );
+        CPosLandmarkCategory* category = categoryMgr->ReadCategoryLC( categoryId );
+
+        // Check for Global category
+        if (category->GlobalCategory() != KPosLmNullGlobalCategory)
+        	{
+           	isGlobalCategory = ETrue;
+        	}
+
+        CleanupStack::PopAndDestroy( 2 ); //category, categoryMgr
+	    }
+	return isGlobalCategory;
+	}
+// -----------------------------------------------------------------------------
+// CLmkAppCategorySettingsImpl::DeleteCategoryCmdL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppCategorySettingsImpl::DeleteCategoryCmdL()
+    {
+    RArray<TPosLmItemId>& markedItemIds = MarkedItemIdsL();
+    TInt markedCount = markedItemIds.Count();
+
+    if(IsPredefinedCategoryL())
+    	return;
+
+    if ( markedCount )
+        {
+        if ( LmkNotes::CategoryConfirmationQueryL( iEnv, markedCount ) )
+            {
+            StoreIdTobeFocussedAfterDeletion( markedItemIds );
+            iDeletionHelper.StoreListInformation( *iListBox, ETrue );
+            iDbUtils->DeleteCategoriesL( markedItemIds );
+            // wait note
+            iWaitNote = new( ELeave ) CAknWaitDialog( NULL, ETrue );
+            if ( !iWaitNote->ExecuteLD( R_LMK_DELETING_WAIT_NOTE ) )
+                {
+                //making iWaitNote null, since framework destroys waitnote
+        		//dialog on pressing cancel.
+        		iWaitNote = NULL;
+                iDbUtils->CancelLmOperation();
+                }
+            }
+
+        }
+    else
+        {
+        // One item only
+        RArray<TPosLmItemId> categoryIdArray( 1 );
+        CleanupClosePushL( categoryIdArray );
+        User::LeaveIfError( categoryIdArray.Append( SelectedIdL() ) );
+        if ( LmkNotes::CategoryConfirmationQueryL( iEnv, 1 ) )
+            {
+            iDeletionHelper.StoreListInformation( *iListBox, EFalse );
+            iDbUtils->DeleteCategoriesL( categoryIdArray  );
+            }
+        CleanupStack::PopAndDestroy( 1 ); // categoryIdArray
+
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CLmkAppCategorySettingsImpl::HandleEventListReadyL
+// -----------------------------------------------------------------------------
+//
+TBool CLmkAppCategorySettingsImpl::HandleEventListReadyL()
+    {
+    // Possibly user-initiated delete finished --> if yes, update the list:
+    TBool retVal;
+	if( iNewListBoxItemAdded )
+		{
+	    TPosLmItemId lmkItemId = iDbUtils->CategoryIdL(iDb, *iBuffer);
+	    TInt listboxIndex = LmItemListProvider().SelectedIndex(lmkItemId);
+	    if ( listboxIndex == KLmkInValidIndex )
+		    {
+		    retVal = EFalse;
+		    return retVal;
+		    }
+		/* This line is added to hold the current before changing
+		 * the selection with the new one.
+		 */
+		iListBox->HandleItemAdditionL();
+		iListBox->SetCurrentItemIndex( listboxIndex );
+		UpdateMarkIndexAfterAdditionL( listboxIndex );
+		iListBox->DrawDeferred();
+		iNewListBoxItemAdded = EFalse;
+		retVal = ETrue;
+		}
+    else
+    	{
+    	retVal = iDeletionHelper.UpdateListIfDeleteHappenedL();
+    	if( retVal )
+			{
+			//delete has been performed, reset the focus.
+			SetFocusToItemAfterDeletionOfMarkedItems();
+			}
+    	iListBox->DrawDeferred();
+    	}
+    return retVal;
+    }
+// -----------------------------------------------------------------------------
+// CLmkAppCategorySettingsImpl::HandleLmCreated
+// -----------------------------------------------------------------------------
+//
+void CLmkAppCategorySettingsImpl::HandleLmCreated(TPosLmItemId aNewLmkItemId)
+    {
+    iNewLmkItemId = aNewLmkItemId;
+    iNewListBoxItemAdded = ETrue;
+    }
+//  End of File