--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/memspyui/ui/avkon/src/MemSpyViewHeapTrackingSettings.cpp Wed Sep 15 12:13:45 2010 +0300
@@ -0,0 +1,470 @@
+/*
+* Copyright (c) 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 "MemSpyViewHeapTrackingSettings.h"
+
+// System includes
+#include <hal.h>
+#ifdef __EPOC32__
+#include <e32rom.h>
+#endif
+#include <AknQueryDialog.h>
+
+// Engine includes
+#include <memspy/engine/memspyengine.h>
+#include <memspy/engine/memspyengineobjectprocess.h>
+#include <memspy/engine/memspyengineobjectthread.h>
+#include <memspy/engine/memspyengineobjectcontainer.h>
+#include <memspy/engine/memspyengineobjectthreadinfoobjects.h>
+#include <memspy/engine/memspyengineobjectthreadinfocontainer.h>
+#include <memspy/engine/memspyenginehelpersysmemtracker.h>
+#include <memspy/engine/memspyenginehelpersysmemtrackerconfig.h>
+#include <memspyui.rsg>
+#include <memspysession.h>
+
+// User includes
+#include "MemSpyUiUtils.h"
+#include "MemSpySettings.h"
+#include "MemSpyViewHeapTracking.h"
+#include "MemSpyContainerObserver.h"
+
+/*
+CMemSpyViewHeapTrackingSettings::CMemSpyViewHeapTrackingSettings( CMemSpyEngine& aEngine, MMemSpyViewObserver& aObserver )
+: CMemSpyViewBase( aEngine, aObserver )
+ {
+ }
+*/
+CMemSpyViewHeapTrackingSettings::CMemSpyViewHeapTrackingSettings( RMemSpySession& aSession, MMemSpyViewObserver& aObserver )
+: CMemSpyViewBase( aSession, aObserver )
+ {
+ }
+
+
+CMemSpyViewHeapTrackingSettings::~CMemSpyViewHeapTrackingSettings()
+ {
+ }
+
+
+void CMemSpyViewHeapTrackingSettings::ConstructL( const TRect& aRect, CCoeControl& aContainer, TAny* aSelectionRune )
+ {
+ _LIT( KTitle, "Settings" );
+ SetTitleL( KTitle );
+ //
+ CMemSpyViewBase::ConstructL( aRect, aContainer, aSelectionRune );
+ }
+
+
+void CMemSpyViewHeapTrackingSettings::RefreshL()
+ {
+ SetListBoxModelL();
+ CMemSpyViewBase::SizeChanged();
+ CMemSpyViewBase::RefreshL();
+ }
+
+
+TMemSpyViewType CMemSpyViewHeapTrackingSettings::ViewType() const
+ {
+ return EMemSpyViewTypeHeapTrackingSettings;
+ }
+
+
+CMemSpyViewBase* CMemSpyViewHeapTrackingSettings::PrepareParentViewL()
+ {
+ CMemSpyViewHeapTracking* parent = new(ELeave) CMemSpyViewHeapTracking( iMemSpySession, iObserver );
+ CleanupStack::PushL( parent );
+ parent->ConstructL( Rect(), *Parent(), (TAny*) ViewType() );
+ CleanupStack::Pop( parent );
+ return parent;
+ }
+
+
+CMemSpyViewBase* CMemSpyViewHeapTrackingSettings::PrepareChildViewL()
+ {
+ const TInt index = iListBox->CurrentItemIndex();
+
+ // Get current config
+ TMemSpyEngineHelperSysMemTrackerConfig config;
+ GetSwmtConfig( config );
+
+ // This view abuses the child view callback to toggle field values and/or
+ // display settings dialogs.
+ if ( index == 0 )
+ {
+ TInt period = config.iTimerPeriod.Int() / 1000000;
+ CAknNumberQueryDialog* dialog = new(ELeave) CAknNumberQueryDialog( period );
+ if ( dialog->ExecuteLD( R_MEMSPY_HEAP_TRACKER_TIMER_PERIOD ) )
+ {
+ config.iTimerPeriod = period * 1000000;
+ }
+ }
+ else if ( index == 1 )
+ {
+ TInt categories( config.iEnabledCategories );
+ CSWMTCategorySelectionCheckBoxSettingItem* settingItem = new (ELeave) CSWMTCategorySelectionCheckBoxSettingItem( 0, categories );
+ CleanupStack::PushL( settingItem );
+ settingItem->ConstructL( EFalse,
+ 0,
+ _L("SWMT Categories"),
+ NULL,
+ R_MEMSPYUI_SWMT_CATEGORIES_SETTING_PAGE,
+ EAknCtPopupSettingList,
+ NULL,
+ NULL );
+
+ CMemSpySWMTCategorySelectionCheckBoxSettingPage* dlg = new(ELeave) CMemSpySWMTCategorySelectionCheckBoxSettingPage( R_MEMSPYUI_SWMT_CATEGORIES_SETTING_PAGE, settingItem->ItemArray() );
+ dlg->SetSettingPageObserver( settingItem );
+ if ( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) )
+ {
+ config.iEnabledCategories = categories;
+ }
+ CleanupStack::PopAndDestroy( settingItem );
+ }
+ else if ( index == 2 )
+ {
+ config.iDumpData = !config.iDumpData;
+ }
+ else if ( index == 3 )
+ {
+ TName nameFilter;
+ nameFilter.Copy( config.iThreadNameFilter );
+ CMemSpyAllowEmptyDataDialog* dialog = new (ELeave) CMemSpyAllowEmptyDataDialog( nameFilter );
+ if ( dialog->ExecuteLD( R_MEMSPY_HEAP_TRACKER_NAME_FILTER ) )
+ {
+ config.iThreadNameFilter = nameFilter;
+ }
+ }
+
+ // Push changes to SWMT
+ SetSwmtConfig( config );
+ Settings().StoreSettingsL();
+
+ RefreshL();
+ return NULL;
+ }
+
+
+void CMemSpyViewHeapTrackingSettings::SetListBoxModelL()
+ {
+ CDesCArrayFlat* model = new(ELeave) CDesCArrayFlat(5);
+ CleanupStack::PushL( model );
+
+ TBuf<KMaxFullName + 1> item;
+
+ // Get current config
+ TMemSpyEngineHelperSysMemTrackerConfig config;
+ GetSwmtConfig( config );
+
+ // 1st item
+ _LIT( KItem1Format, "\tTracking timer period\t\t%d (sec)" );
+ item.Format( KItem1Format, config.iTimerPeriod.Int() / 1000000 );
+ model->AppendL( item );
+
+ // 2nd item
+ _LIT( KItem3Format, "\tCategories\t\t%d selected" );
+
+ TInt count(0);
+ for( TInt bit = TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryWindowGroups; bit > 0; bit = bit >> 1 )
+ {
+ if ( bit & config.iEnabledCategories )
+ {
+ count++;
+ }
+ }
+
+ item.Format( KItem3Format, count );
+ model->AppendL( item );
+
+ // following items are related only to User Heap category,
+ // so hide them if User Heap is not selected
+ if ( config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryUserHeap )
+ {
+ // 3th item
+ _LIT( KItem2Format, "\tDump data" );
+ PrepareItemBufL( item, KItem2Format, config.iDumpData, config.iEnabledCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryUserHeap && config.iThreadNameFilter.Length() > 0 );
+ model->AppendL( item );
+
+ // 4th item
+ if ( config.iDumpData )
+ {
+ _LIT( KItem4Format, "\tHeap data thread filter\t\t%S" );
+ if ( config.iThreadNameFilter.Length() > 0 )
+ {
+ item.Format( KItem4Format, &config.iThreadNameFilter );
+ }
+ else
+ {
+ item.Format( KItem4Format, &_L("No filtering") );
+ }
+ model->AppendL( item );
+ }
+ }
+
+ // Set up list box
+ CAknSettingStyleListBox* listbox = static_cast< CAknSettingStyleListBox* >( iListBox );
+ listbox->Model()->SetItemTextArray( model );
+ listbox->Model()->SetOwnershipType( ELbmOwnsItemArray );
+ CleanupStack::Pop( model );
+ }
+
+
+void CMemSpyViewHeapTrackingSettings::PrepareItemBufL( TDes& aBuf, const TDesC& aCaption, TBool aStatus, TBool aHeapCategorySelected )
+ {
+ aBuf.Copy( aCaption );
+ //
+ if ( aStatus )
+ {
+ if ( aHeapCategorySelected )
+ {
+ _LIT( KItemEnabled, "\t\tCustom" );
+ aBuf.Append( KItemEnabled );
+ }
+ else
+ {
+ _LIT( KItemEnabled, "\t\tAll user heaps" );
+ aBuf.Append( KItemEnabled );
+ }
+ }
+ else
+ {
+ _LIT( KItemDisabled, "\t\tDisabled" );
+ aBuf.Append( KItemDisabled );
+ }
+ }
+
+void CMemSpyViewHeapTrackingSettings::GetSwmtConfig( TMemSpyEngineHelperSysMemTrackerConfig& aConfig )
+ {
+ TMemSpyEngineHelperSysMemTrackerConfig::TMemSpyEngineSysMemTrackerMode mode;
+ iMemSpySession.GetSwmtMode( mode );
+ aConfig.iMode = mode;
+
+ TInt categories = 0;
+ iMemSpySession.GetSwmtCategoriesL( categories );
+ aConfig.iEnabledCategories = categories;
+
+ TInt timerPeriod = 0;
+ iMemSpySession.GetSwmtTimerIntervalL( timerPeriod );
+ aConfig.iTimerPeriod = timerPeriod;
+
+ TBool dumpData = EFalse;
+ iMemSpySession.GetSwmtHeapDumpsEnabledL( dumpData );
+ aConfig.iDumpData = dumpData;
+
+ TName threadNameFilter;
+ iMemSpySession.GetSwmtFilter( threadNameFilter );
+ aConfig.iThreadNameFilter = threadNameFilter;
+ }
+
+void CMemSpyViewHeapTrackingSettings::SetSwmtConfig( TMemSpyEngineHelperSysMemTrackerConfig& aConfig )
+ {
+ iMemSpySession.SetSwmtMode( aConfig.iMode );
+ iMemSpySession.SetSwmtCategoriesL( aConfig.iEnabledCategories );
+ iMemSpySession.SetSwmtTimerIntervalL( aConfig.iTimerPeriod.Int() );
+ iMemSpySession.SetSwmtHeapDumpsEnabledL( aConfig.iDumpData );
+ iMemSpySession.SetSwmtFilter( aConfig.iThreadNameFilter );
+ }
+
+
+
+
+
+
+
+
+
+
+// --------------------------------------------------------------------------------------------
+
+CSWMTCategorySelectionCheckBoxSettingItem::CSWMTCategorySelectionCheckBoxSettingItem( TInt aIdentifier, TInt& aCategories ):
+ CAknSettingItem(aIdentifier), iExtCategories( aCategories )
+ {
+ }
+
+
+CSWMTCategorySelectionCheckBoxSettingItem::~CSWMTCategorySelectionCheckBoxSettingItem()
+ {
+ delete iSettingText;
+ if( iItemArray )
+ {
+ iItemArray->ResetAndDestroy();
+ delete iItemArray;
+ }
+ }
+
+
+CSelectionItemList* CSWMTCategorySelectionCheckBoxSettingItem::ItemArray() const
+ {
+ return iItemArray;
+ }
+
+
+void CSWMTCategorySelectionCheckBoxSettingItem::AddNewItemToArrayL(const TDesC& aLabel)
+ {
+ TBuf<64> buf;
+ buf.Copy( aLabel );
+ CSelectableItem* item = new (ELeave) CSelectableItem( buf, EFalse );
+ CleanupStack::PushL( item );
+ item->ConstructL();
+ iItemArray->AppendL( item ); // Ownership is transferred
+ CleanupStack::Pop(); // item
+ }
+
+
+void CSWMTCategorySelectionCheckBoxSettingItem::CompleteConstructionL()
+ {
+ SetEmptyItemTextL(_L("Nothing selected"));
+ iItemArray = new(ELeave) CSelectionItemList(16);
+ AddNewItemToArrayL( _L("User Heap") ); // 0
+ AddNewItemToArrayL( _L("Kernel Heap") ); // 1
+ AddNewItemToArrayL( _L("User Stacks") ); // 2
+ AddNewItemToArrayL( _L("Global Data") ); // 3
+ AddNewItemToArrayL( _L("Disk Usage") ); // 4
+ AddNewItemToArrayL( _L("Open Files") ); // 5
+ AddNewItemToArrayL( _L("RAM-loaded Code") ); // 6
+ AddNewItemToArrayL( _L("System Memory") ); // 7
+ AddNewItemToArrayL( _L("Local Chunks") ); // 8
+ AddNewItemToArrayL( _L("Global Chunks") ); // 9
+ AddNewItemToArrayL( _L("RAM Drive") ); // 10
+ AddNewItemToArrayL( _L("FileServer Cache") );// 11
+ AddNewItemToArrayL( _L("Kernel Handles") ); // 12
+ AddNewItemToArrayL( _L("Bitmap Handles") ); // 13
+ AddNewItemToArrayL( _L("Window Groups") ); // 14
+ }
+
+
+void CSWMTCategorySelectionCheckBoxSettingItem::StoreL()
+ {
+ iExtCategories = 0;
+ if ( iItemArray->At( 11 )->SelectionStatus() )
+ iExtCategories |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryFileServerCache;
+ if ( iItemArray->At( 13 )->SelectionStatus() )
+ iExtCategories |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryBitmapHandles;
+ if ( iItemArray->At( 0 )->SelectionStatus() )
+ iExtCategories |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryUserHeap;
+ if ( iItemArray->At( 1 )->SelectionStatus() )
+ iExtCategories |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryKernelHeap;
+ if ( iItemArray->At( 8 )->SelectionStatus() )
+ iExtCategories |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryLocalChunks;
+ if ( iItemArray->At( 9 )->SelectionStatus() )
+ iExtCategories |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryGlobalChunks;
+ if ( iItemArray->At( 10 )->SelectionStatus() )
+ iExtCategories |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryRAMDrive;
+ if ( iItemArray->At( 2 )->SelectionStatus() )
+ iExtCategories |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryUserStacks;
+ if ( iItemArray->At( 3 )->SelectionStatus() )
+ iExtCategories |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryGlobalData;
+ if ( iItemArray->At( 6 )->SelectionStatus() )
+ iExtCategories |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryRAMLoadedCode;
+ if ( iItemArray->At( 12 )->SelectionStatus() )
+ iExtCategories |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryKernelHandles;
+ if ( iItemArray->At( 5 )->SelectionStatus() )
+ iExtCategories |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryOpenFiles;
+ if ( iItemArray->At( 4 )->SelectionStatus() )
+ iExtCategories |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryDiskusage;
+ if ( iItemArray->At( 7 )->SelectionStatus() )
+ iExtCategories |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategorySystemMemory;
+ if ( iItemArray->At( 14 )->SelectionStatus() )
+ iExtCategories |= TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryWindowGroups;
+ }
+
+
+void CSWMTCategorySelectionCheckBoxSettingItem::LoadL()
+ {
+ iItemArray->At( 11 )->SetSelectionStatus( iExtCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryFileServerCache );
+ iItemArray->At( 13 )->SetSelectionStatus( iExtCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryBitmapHandles );
+ iItemArray->At( 0 )->SetSelectionStatus( iExtCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryUserHeap );
+ iItemArray->At( 1 )->SetSelectionStatus( iExtCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryKernelHeap );
+ iItemArray->At( 8 )->SetSelectionStatus( iExtCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryLocalChunks );
+ iItemArray->At( 9 )->SetSelectionStatus( iExtCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryGlobalChunks );
+ iItemArray->At( 10 )->SetSelectionStatus( iExtCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryRAMDrive );
+ iItemArray->At( 2 )->SetSelectionStatus( iExtCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryUserStacks );
+ iItemArray->At( 3 )->SetSelectionStatus( iExtCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryGlobalData );
+ iItemArray->At( 6 )->SetSelectionStatus( iExtCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryRAMLoadedCode );
+ iItemArray->At( 12 )->SetSelectionStatus( iExtCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryKernelHandles );
+ iItemArray->At( 5 )->SetSelectionStatus( iExtCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryOpenFiles );
+ iItemArray->At( 4 )->SetSelectionStatus( iExtCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryDiskusage );
+ iItemArray->At( 7 )->SetSelectionStatus( iExtCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategorySystemMemory );
+ iItemArray->At( 14 )->SetSelectionStatus( iExtCategories & TMemSpyEngineHelperSysMemTrackerConfig::EMemSpyEngineSysMemTrackerCategoryWindowGroups );
+ }
+
+
+void CSWMTCategorySelectionCheckBoxSettingItem::HandleSettingPageEventL( CAknSettingPage* aSettingPage, TAknSettingPageEvent aEventType )
+ {
+ switch( aEventType )
+ {
+ case EEventSettingOked:
+ {
+ // If settings oked, save new values
+ StoreL();
+ break;
+ }
+ case EEventSettingCancelled:
+ {
+ // If setting is cancelled, load old values
+ LoadL();
+ break;
+ }
+ case EEventSettingChanged:
+ {
+ // If setting has changed, update CBA visibility
+ static_cast<CMemSpySWMTCategorySelectionCheckBoxSettingPage*>( aSettingPage )->UpdateCba();
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ CAknSettingItem::HandleSettingPageEventL( aSettingPage, aEventType );
+ }
+
+
+CMemSpySWMTCategorySelectionCheckBoxSettingPage::CMemSpySWMTCategorySelectionCheckBoxSettingPage(TInt aResourceID, CSelectionItemList* aItemArray )
+ : CAknCheckBoxSettingPage( aResourceID, aItemArray )
+ {
+ }
+
+
+void CMemSpySWMTCategorySelectionCheckBoxSettingPage::UpdateCba()
+ {
+ // Cache the pointer to button group container
+ CEikButtonGroupContainer* cba = Cba();
+ // Left softkey should be visible if there are items selected,
+ // i.e. the selection index array has items.
+ TBool visible( ListBoxControl()->View()->SelectionIndexes()->Count() > 0 );
+ // Resolve left softkey command id
+ TInt leftId( cba->ButtonGroup()->CommandId( 0 ) );
+ // Check if left softkey visibility has changed
+ if( visible != cba->IsCommandVisible( leftId ) )
+ {
+ // Left softkey visibility has changed, update it
+ cba->MakeCommandVisible( leftId, visible );
+ }
+ }
+
+
+
+
+CMemSpyAllowEmptyDataDialog::CMemSpyAllowEmptyDataDialog( TDes& aText, const TTone& aTone )
+ : CAknTextQueryDialog( aText, aTone )
+ {
+ }
+
+
+void CMemSpyAllowEmptyDataDialog::UpdateLeftSoftKeyL()
+ {
+ MakeLeftSoftkeyVisible( ETrue );
+ }