--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/idlefw/plugins/shortcutplugin/src/caiscutsettingsmodel.cpp Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,603 @@
+/*
+* Copyright (c) 2005-2006 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: Shrortcut settings plug-in model.
+*
+*/
+
+
+#include <centralrepository.h>
+#include <eikenv.h>
+#include <menu2internalcrkeys.h>
+
+#include "caiscutsettings.h"
+#include "caiscutsettingsmodel.h"
+#include "caiscutsettingscontainer.h"
+#include "caiscutsettingsitem.h"
+#include "aiscutpluginprivatecrkeys.h"
+#include "aiscutdefs.h"
+#include "aiscutappuidparser.h"
+#include "aiscutrepositorywatcher.h"
+
+#include "debug.h"
+
+LOCAL_C TInt CompareKey(const TUint32& aLeft, const TUint32& aRight)
+{
+ TBool softkey1 = (0 != ((aLeft & 0xFFFF) >= EAiScutSoftKeyLeft));
+ TBool softkey2 = (0 != ((aRight & 0xFFFF) >= EAiScutSoftKeyLeft));
+ TUint32 left = aLeft & (KScutBitMaskThemeDefault & KScutBitMaskLocked);
+ TUint32 right = aRight & (KScutBitMaskThemeDefault & KScutBitMaskLocked);
+
+ // Softkey shortcuts are always sorted to be smallest.
+ if (!(softkey1 && softkey2))
+ {
+ if (softkey1)
+ {
+ return -1;
+ }
+ else if (softkey2)
+ {
+ return 1;
+ }
+ }
+
+ if (left < right)
+ {
+ return -1;
+ }
+ else if (left > right)
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CAiScutSettingsModel* CAiScutSettingsModel::NewL(CAiScutSettings& aPlugin,
+ CCoeEnv* aEnv)
+{
+ CAiScutSettingsModel* self = new (ELeave) CAiScutSettingsModel(aPlugin, aEnv);
+
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+
+ return self;
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CAiScutSettingsModel::CAiScutSettingsModel(CAiScutSettings& aPlugin, CCoeEnv* aEnv)
+ : iPlugin(aPlugin), iEnv(aEnv)
+{
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CAiScutSettingsModel::~CAiScutSettingsModel()
+{
+ ActivateObservers(EFalse);
+
+ delete iSettingsNotifier;
+ delete iRepository;
+
+ delete iHiddenAppsNotifier;
+ delete iHiddenAppsRepository;
+
+ iHiddenApps.Close();
+
+ delete iAppList;
+ delete iBkmList;
+
+ iSettings.ResetAndDestroy();
+ iKeys.Reset();
+ delete iFavItemList;
+ iBookmarkDb.Close();
+ iBookmarkSess.Close();
+ iApaSession.Close();
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsModel::ConstructL()
+{
+ User::LeaveIfError(iApaSession.Connect());
+ User::LeaveIfError(iBookmarkSess.Connect());
+ User::LeaveIfError(iBookmarkDb.Open(iBookmarkSess, KBrowserBookmarks));
+
+ iRepository = CRepository::NewL(KCRUidShortcutItems);
+
+ iHiddenAppsRepository = CRepository::NewL(KCRUidMenu);
+
+ // Create cenrep key observer for monitoring settings changes
+ // when theme is changed.
+ iSettingsNotifier = CAiScutRepositoryWatcher::NewL(
+ KCRUidShortcutItems,
+ TCallBack(HandleShortcutsChanged, this),
+ iRepository);
+
+ iSettingsNotifier->StartListeningL();
+
+ iHiddenAppsNotifier = CAiScutRepositoryWatcher::NewL(
+ KCRUidMenu,
+ KMenuHideApplication,
+ CCenRepNotifyHandler::EStringKey,
+ TCallBack(HandleHiddenAppsChanged, this),
+ iHiddenAppsRepository);
+
+ iHiddenAppsNotifier->StartListeningL();
+
+ GetHiddenAppsL();
+
+ iAppList = CAiScutSettingsAppList::NewL(iEnv, *this);
+ iAppList->StartL();
+
+ iBkmList = CAiScutSettingsBkmList::NewL(iEnv, this, *this);
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsModel::SetSettingsKeys(RArray<TUint32>& aKeys)
+ {
+ iKeys.Reset();
+
+ for( TInt i = 0; i < aKeys.Count(); i++ )
+ {
+ TUint32 value( aKeys[i] );
+
+ iKeys.Append( value );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsModel::UpdateSettingsL()
+{
+ if( !iPlugin.Activated() )
+ {
+ return;
+ }
+
+ iSettings.ResetAndDestroy();
+
+ TInt keyCount( iKeys.Count() );
+
+ if( keyCount > 0 )
+ {
+ for( TInt i = 0; i < keyCount; i++ )
+ {
+ CAiScutSettingsItem* setting = CAiScutSettingsItem::NewLC(
+ *this, i, iKeys[i] );
+
+ setting->ReadL( iRepository );
+
+ User::LeaveIfError( iSettings.Append( setting ) );
+ CleanupStack::Pop( setting );
+ }
+
+ return;
+ }
+
+ RArray<TUint32> defaultKeys;
+ CleanupClosePushL(defaultKeys);
+
+ // Find the default keys and user defined keys.
+ iRepository->FindL(
+ KScutCenRepKeyThemeDefault, KScutCenRepKeyMask, defaultKeys);
+
+ TInt i;
+ TUint32 defaultKey;
+ TUint32 userKey;
+ TInt count;
+ TInt lockedKeys = 0;
+ TInt visibleKeys = 0;
+
+ TLinearOrder<TUint32> order(CompareKey);
+ defaultKeys.Sort(order);
+
+ count = defaultKeys.Count();
+ for (i = 0; i < count; ++i)
+ {
+ defaultKey = defaultKeys[i];
+ userKey = defaultKey & KScutBitMaskThemeDefault;
+ // We show only actual shortcuts
+ if ( (! ( defaultKey & KScutFlagBitIconOverride )) &&
+ (! ( defaultKey & KScutFlagBitToolbarShortcut )))
+ {
+ __PRINT( __DBG_FORMAT( "XAI: %d. key = 0x%x"), i+1,
+ (defaultKey & (KScutBitMaskThemeDefault & KScutBitMaskLocked)));
+
+ if (!(userKey & KScutFlagBitOptionallyVisible))
+ {
+ visibleKeys++;
+ }
+
+ TBool locked = (0 != (userKey & KScutFlagBitLocked));
+
+ if (locked)
+ {
+ lockedKeys++;
+ }
+ else
+ {
+ CAiScutSettingsItem* setting = CAiScutSettingsItem::NewLC(
+ *this, visibleKeys-1, defaultKey);
+
+ setting->ReadL(iRepository);
+
+ User::LeaveIfError(iSettings.Append(setting));
+ CleanupStack::Pop(setting);
+ }
+ }
+
+ }
+
+ __PRINT( __DBG_FORMAT("XAI: %d keys, %d locked"), count, lockedKeys);
+
+ CleanupStack::PopAndDestroy(&defaultKeys);
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsModel::UpdateSettingsContainerL()
+{
+ if (iContainer)
+ {
+ if (iContainer->IsChangeDialogShowing())
+ {
+ iContainer->CloseChangeDialog();
+ }
+ }
+
+ UpdateSettingsL();
+
+ if (iContainer)
+ {
+ iContainer->ResetCurrentListL(0);
+ }
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsModel::GetHiddenAppsL()
+{
+ HBufC* buffer = HBufC::NewLC(
+ NCentralRepositoryConstants::KMaxUnicodeStringLength);
+ TPtr bufferPtr = buffer->Des();
+
+ iHiddenAppsRepository->Get(KMenuHideApplication, bufferPtr);
+
+ __PRINT( __DBG_FORMAT("XAI: CAiScutSettingsModel::GetHiddenAppsL '%S' "), buffer);
+
+ iHiddenApps.Reset();
+ TAiScutAppUidParser uidParser(bufferPtr, iHiddenApps);
+ uidParser.ParseL();
+
+ CleanupStack::PopAndDestroy(buffer);
+}
+
+// ---------------------------------------------------------------------------
+// From MDesCArray
+// Returns the number of descriptor elements in a descriptor array.
+// ---------------------------------------------------------------------------
+//
+TInt CAiScutSettingsModel::MdcaCount() const
+{
+ return iSettings.Count();
+}
+
+// ---------------------------------------------------------------------------
+// From MDesCArray
+// Indexes into a descriptor array.
+// ---------------------------------------------------------------------------
+//
+TPtrC CAiScutSettingsModel::MdcaPoint(TInt aIndex) const
+{
+ if (aIndex < 0 || aIndex >= iSettings.Count())
+ {
+ TPtrC ret(KNullDesC);
+ return ret;
+ }
+
+ return iSettings[aIndex]->ListBoxLine();
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TInt CAiScutSettingsModel::HandleShortcutsChanged(TAny* aPtr)
+{
+ __PRINTS( "XAI: CAiScutSettingsModel::HandleShortcutsChanged");
+
+ if (aPtr)
+ {
+ CAiScutSettingsModel* self = static_cast<CAiScutSettingsModel*>(aPtr);
+ TRAP_IGNORE(self->UpdateSettingsContainerL());
+ }
+
+ return KErrNone;
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TInt CAiScutSettingsModel::HandleHiddenAppsChanged(TAny* aPtr)
+{
+ __PRINTS("XAI: CAiScutSettingsModel::HandleHiddenAppsChanged");
+
+ if (aPtr)
+ {
+ CAiScutSettingsModel* self = static_cast<CAiScutSettingsModel*>(aPtr);
+
+ TRAP_IGNORE(
+ self->iAppList->StartL();
+ self->GetHiddenAppsL();
+ self->UpdateSettingsContainerL() ) // TRAP_IGNORE
+ }
+
+ return KErrNone;
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CAiScutSettingsModel::IsHidden(const TUid& aAppUid) const
+{
+ if (iHiddenApps.Find(aAppUid) == KErrNotFound)
+ {
+ return EFalse;
+ }
+
+ __PRINT( __DBG_FORMAT( "XAI: CAiScutSettingsModel::IsHidden (0x%x) ETrue"), aAppUid);
+
+ return ETrue;
+}
+
+// ---------------------------------------------------------------------------
+// From MAiScutListObserver
+// Callback for application list events.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsModel::HandleScutListEventL(TScutListEvent aEvent,
+ TBool /*aAdded*/)
+{
+ switch (aEvent)
+ {
+ case MAiScutListObserver::EAppListReady:
+ if (iContainer)
+ {
+ iContainer->HideWaitNoteDialog();
+ }
+ break;
+
+ case MAiScutListObserver::EAppListUpdated:
+ case MAiScutListObserver::EBkmListUpdated:
+ UpdateSettingsContainerL();
+ break;
+
+ default:
+ break;
+ }
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsModel::ActivateObservers(TBool aActivate)
+{
+ TRAP_IGNORE(
+ if (iAppList)
+ {
+ iAppList->SetObservingL(aActivate);
+ }
+ if (iBkmList)
+ {
+ iBkmList->SetObservingL(aActivate);
+ }
+ )
+}
+
+// ---------------------------------------------------------------------------
+// Returns a setting item for the given index.
+// ---------------------------------------------------------------------------
+//
+CAiScutSettingsItem* CAiScutSettingsModel::Item(TInt aIndex) const
+{
+ if (aIndex >= 0 && aIndex < iSettings.Count())
+ {
+ return iSettings[aIndex];
+ }
+
+ return NULL;
+}
+
+// ---------------------------------------------------------------------------
+// Utility function to retrieve a bookmark caption from an uid.
+// ---------------------------------------------------------------------------
+//
+TInt CAiScutSettingsModel::GetBkmCaptionL(const TUid aUid, TDes& aCaption)
+{
+ CFavouritesItem* favItem = CFavouritesItem::NewLC();
+ TInt err = iBookmarkDb.Get(aUid.iUid, *favItem);
+ if (err == KErrNone)
+ {
+ aCaption.Copy(favItem->Name());
+ }
+
+ CleanupStack::PopAndDestroy(favItem);
+
+ return err;
+}
+
+// ---------------------------------------------------------------------------
+// Utility function to retrieve an appliation caption from an uid.
+// ---------------------------------------------------------------------------
+//
+TInt CAiScutSettingsModel::GetAppCaption(const TUid aUid, TDes& aCaption)
+{
+ TInt err = KErrNone;
+ TApaAppInfo appInfo;
+
+ err = iApaSession.GetAppInfo(appInfo, aUid);
+ if (err == KErrNone)
+ {
+ aCaption.Copy(appInfo.iCaption);
+ }
+
+ return err;
+}
+
+// ---------------------------------------------------------------------------
+// Returns a pointer to the coe environment.
+// ---------------------------------------------------------------------------
+//
+CCoeEnv* CAiScutSettingsModel::Env()
+{
+ return iEnv;
+}
+
+// ---------------------------------------------------------------------------
+// Handles saving a setting item to central repository.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsModel::SaveItemL(CAiScutSettingsItem& aItem)
+{
+ // Stop monitoring own settings changes.
+ iSettingsNotifier->StopListening();
+
+ TInt err = aItem.Save(iRepository);
+
+ __PRINT( __DBG_FORMAT( "XAI: CAiScutSettingsModel::SaveItemL key = 0x%x, err = %d"),
+ aItem.Key(), err);
+ UpdateSettingsL();
+ iSettingsNotifier->StartListeningL();
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsModel::SetContainer(CAiScutSettingsContainer* aContainer)
+{
+ iContainer = aContainer;
+}
+
+// -----------------------------------------------------------------------------
+// Using the Favorites dB, get the bookmarked pages
+// -----------------------------------------------------------------------------
+//
+void CAiScutSettingsModel::ReadBookmarksL()
+{
+ // Get bookmarks
+ delete iFavItemList;
+ iFavItemList = NULL;
+
+ iFavItemList = new (ELeave) CFavouritesItemList();
+ TInt err = iBookmarkDb.GetAll(
+ *iFavItemList, KFavouritesNullUid, CFavouritesItem::EItem);
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TInt CAiScutSettingsModel::BookmarkCount() const
+{
+ if (iFavItemList)
+ {
+ return iFavItemList->Count();
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CFavouritesItem* CAiScutSettingsModel::GetBookmark(TInt aIndex)
+{
+ if (aIndex >= 0 && aIndex < iFavItemList->Count())
+ {
+
+ if (iFavItemList)
+ {
+ return iFavItemList->At(aIndex);
+ }
+ else
+ {
+ return NULL;
+ }
+ }
+ else
+ {
+ return NULL;
+ }
+}
+
+// ---------------------------------------------------------------------------
+// Returns reference to the bookmark database owned by the engine.
+// ---------------------------------------------------------------------------
+//
+RFavouritesDb& CAiScutSettingsModel::FavouritesDb()
+{
+ return iBookmarkDb;
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CAiScutSettingsAppList* CAiScutSettingsModel::AppList()
+{
+ return iAppList;
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CAiScutSettingsBkmList* CAiScutSettingsModel::BkmList()
+{
+ return iBkmList;
+}
+
+// End of File.