--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/memspyui/source/MemSpyViewBase.cpp Wed Sep 01 12:30:35 2010 +0100
@@ -0,0 +1,413 @@
+/*
+* 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 "MemSpyViewBase.h"
+
+// System includes
+#include <eikrted.h> // for example label control
+#include <txtrich.h>
+#include <apgtask.h>
+#include <akntitle.h>
+#include <akncontext.h>
+#include <aknnavi.h>
+#include <eiklbx.h>
+#include <eiklbm.h>
+#include <avkon.hrh>
+
+// Engine includes
+#include <memspy/engine/memspyengine.h>
+#include <memspy/engine/memspyengineutils.h>
+#include <memspy/engine/memspyengineoutputsink.h>
+
+// User includes
+#include "MemSpyAppUi.h"
+#include "MemSpyDocument.h"
+#include "MemSpyContainer.h"
+#include "MemSpyContainerObserver.h"
+
+
+
+
+CMemSpyViewBase::CMemSpyViewBase( CMemSpyEngine& aEngine, MMemSpyViewObserver& aObserver )
+: iEngine( aEngine ), iObserver( aObserver )
+ {
+ }
+
+
+CMemSpyViewBase::~CMemSpyViewBase()
+ {
+ delete iListBox;
+ }
+
+
+void CMemSpyViewBase::ConstructL( const TRect& aRect, CCoeControl& aContainer, TAny* /*aSelectionRune*/ )
+ {
+ iSettings = &static_cast< CMemSpyAppUi* >( iEikonEnv->EikAppUi() )->MemSpyDocument().Settings();
+ //
+ User::LeaveIfError( SetParent( &aContainer ) );
+ SetContainerWindowL( aContainer );
+
+ SetComponentsToInheritVisibility( ETrue );
+
+ iListBox = ConstructListBoxL();
+ if ( iListBox )
+ {
+ iListBox->SetFocus( ETrue );
+ }
+
+ SetRect( aRect );
+ ActivateL();
+ }
+
+
+void CMemSpyViewBase::SetTitleL( const TDesC& aText )
+ {
+ CEikStatusPane* statusPane = static_cast<CAknAppUi*> ( iEikonEnv->EikAppUi() )->StatusPane();
+ CAknTitlePane* title = static_cast<CAknTitlePane*> ( statusPane->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+ title->SetTextL( aText );
+ }
+
+
+TPtrC CMemSpyViewBase::TitleL() const
+ {
+ TPtrC ret( KNullDesC );
+ //
+ CEikStatusPane* statusPane = static_cast<CAknAppUi*> ( iEikonEnv->EikAppUi() )->StatusPane();
+ CAknTitlePane* title = static_cast<CAknTitlePane*> ( statusPane->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+ if ( title->Text() )
+ {
+ ret.Set( *title->Text() );
+ }
+ //
+ return ret;
+ }
+
+
+CMemSpyViewBase* CMemSpyViewBase::PrepareParentViewL()
+ {
+ return NULL;
+ }
+
+
+CMemSpyViewBase* CMemSpyViewBase::PrepareChildViewL()
+ {
+ return NULL;
+ }
+
+
+void CMemSpyViewBase::RefreshL()
+ {
+ if ( iListBox )
+ {
+ iListBox->UpdateScrollBarsL();
+ }
+
+ DrawDeferred();
+ }
+
+
+TBool CMemSpyViewBase::HandleCommandL( TInt aCommand )
+ {
+ TBool handled = ETrue;
+ //
+ switch( aCommand )
+ {
+ case EMemSpyCmdViewOutputToSink:
+ OnCmdViewOutputToSinkL();
+ break;
+ default:
+ handled = EFalse;
+ break;
+ }
+ //
+ return handled;
+ }
+
+
+void CMemSpyViewBase::DynInitMenuPaneL( TInt /*aResourceId*/, CEikMenuPane* /*aMenuPane*/ )
+ {
+ }
+
+
+TUint CMemSpyViewBase::MenuCascadeResourceId() const
+ {
+ return 0;
+ }
+
+
+TInt CMemSpyViewBase::MenuCascadeCommandId() const
+ {
+ return 0;
+ }
+
+
+void CMemSpyViewBase::OnCmdViewOutputToSinkL()
+ {
+ if ( iListBox )
+ {
+ // Prepare sink
+ CMemSpyEngineOutputSink& sink = iEngine.Sink();
+ HBufC* name = MemSpyEngineUtils::CleanupTextLC( TitleL() );
+ sink.OutputSectionHeadingL( *name, TChar('-') );
+ CleanupStack::PopAndDestroy( name );
+ sink.OutputPrefixSetLC( _L(" ") ); // Slight insertion
+
+ // Get text from underlying listbox model...
+ MTextListBoxModel* model = static_cast< MTextListBoxModel* >( iListBox->Model() );
+ const TInt count = model->NumberOfItems();
+
+ // First pass to get max lengths
+ TInt maxLengthCaption = 0;
+ TInt maxLengthValue = 0;
+
+ for( TInt j=0; j<count; j++ )
+ {
+ const TPtrC pItem( model->ItemText( j ) );
+ const TInt length = pItem.Length();
+
+ // Check if its split or not?
+ const TInt splitPos = pItem.FindF( _L("\t\t") );
+ if ( splitPos > 0 )
+ {
+ maxLengthCaption = Max( maxLengthCaption, splitPos );
+ maxLengthValue = Max( maxLengthValue, length - splitPos + 1 );
+ }
+ else
+ {
+ maxLengthCaption = Max( maxLengthCaption, length );
+ }
+ }
+
+ // Second pass - real this time - to print the values
+ HBufC* line = HBufC::NewLC( ( maxLengthCaption + maxLengthValue ) + 20 );
+ TPtr pLine( line->Des() );
+ //
+ for( TInt i=0; i<count; i++ )
+ {
+ const TPtrC pItem( model->ItemText( i ) );
+ const TInt length = pItem.Length();
+ //
+ TPtrC pCaption( KNullDesC );
+ TPtrC pValue( KNullDesC );
+ //
+ const TInt splitPos = pItem.FindF( _L("\t\t") );
+ if ( splitPos > 0 )
+ {
+ pCaption.Set( pItem.Left( splitPos ) );
+ pValue.Set( pItem.Mid( splitPos + 1 ) );
+ }
+ else
+ {
+ pCaption.Set( pItem );
+ }
+
+ // Remove initial tabs in caption
+ HBufC* caption = MemSpyEngineUtils::CleanupTextLC( pCaption );
+
+ // Create value item & replace any further tabs
+ HBufC* value = MemSpyEngineUtils::CleanupTextLC( pValue );
+
+ // Now format the final line, with padding.
+ pLine.Justify( *caption, maxLengthCaption + 3, ELeft, TChar(' ') );
+ pLine.Append( *value );
+ CleanupStack::PopAndDestroy( 2, caption );
+
+ // Sink output
+ sink.OutputLineL( pLine );
+ }
+
+ // Remove prefix & tidy up
+ CleanupStack::PopAndDestroy( line );
+ sink.OutputBlankLineL();
+ CleanupStack::PopAndDestroy(); // clear prefix
+ }
+ }
+
+
+CEikListBox* CMemSpyViewBase::ConstructListBoxL()
+ {
+ delete iListBox;
+ iListBox = NULL;
+ CAknSettingStyleListBox* listbox = new(ELeave) CAknSettingStyleListBox();
+ iListBox = listbox;
+ //
+ listbox->ConstructL( this, EAknListBoxSelectionList | EAknListBoxLoopScrolling );
+ listbox->SetContainerWindowL( *this );
+ listbox->CreateScrollBarFrameL( ETrue );
+ SetListBoxModelL();
+ listbox->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+ listbox->SetListBoxObserver( this );
+ listbox->SetObserver( this );
+ listbox->SetComponentsToInheritVisibility( ETrue );
+ //
+ return listbox;
+ }
+
+
+void CMemSpyViewBase::HandleListBoxItemActionedL( TInt /*aIndex*/ )
+ {
+ ReportEventL( MMemSpyViewObserver::EEventItemActioned );
+ }
+
+
+void CMemSpyViewBase::HandleListBoxItemSelectedL( TInt /*aIndex*/ )
+ {
+ ReportEventL( MMemSpyViewObserver::EEventItemSelected );
+ }
+
+
+void CMemSpyViewBase::ReportEventL( MMemSpyViewObserver::TViewEventType aEvent, TAny* aContext )
+ {
+ iObserver.HandleMemSpyViewEventL( aEvent, ViewType(), *this, aContext );
+ }
+
+
+void CMemSpyViewBase::SetListBoxCurrentItemIndexL( TInt aIndex )
+ {
+ if ( iListBox )
+ {
+ iListBox->SetCurrentItemIndex( aIndex );
+ HandleListBoxItemSelectedL( aIndex );
+ }
+ }
+
+
+CMemSpyContainer& CMemSpyViewBase::Container()
+ {
+ CMemSpyAppUi* appUi = static_cast< CMemSpyAppUi* >( iEikonEnv->EikAppUi() );
+ return appUi->Container();
+ }
+
+
+CMemSpySettings& CMemSpyViewBase::Settings()
+ {
+ return *iSettings;
+ }
+
+
+const CMemSpySettings& CMemSpyViewBase::Settings() const
+ {
+ return *iSettings;
+ }
+
+
+void CMemSpyViewBase::Draw( const TRect& aRect ) const
+ {
+ CWindowGc& gc = SystemGc();
+ //
+ gc.SetPenStyle( CGraphicsContext::ENullPen );
+ gc.SetBrushColor( KRgbWhite );
+ gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+ gc.DrawRect( aRect );
+ }
+
+
+void CMemSpyViewBase::SizeChanged()
+ {
+ if ( iListBox )
+ {
+ iListBox->SetRect( Rect() );
+ }
+ }
+
+
+void CMemSpyViewBase::FocusChanged(TDrawNow /*aDrawNow*/)
+ {
+ if ( iListBox )
+ {
+ iListBox->SetFocus( IsFocused() );
+ }
+ }
+
+
+TInt CMemSpyViewBase::CountComponentControls() const
+ {
+ TInt count = 0;
+ if ( iListBox )
+ {
+ ++count;
+ }
+ //
+ return count;
+ }
+
+
+CCoeControl* CMemSpyViewBase::ComponentControl(TInt aIndex) const
+ {
+ switch ( aIndex )
+ {
+ case 0:
+ return iListBox;
+ default:
+ return NULL;
+ }
+ }
+
+
+TKeyResponse CMemSpyViewBase::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType )
+ {
+ TKeyResponse resp = EKeyWasNotConsumed;
+ if ( iListBox )
+ {
+ resp = iListBox->OfferKeyEventL( aKeyEvent, aType );
+ }
+ //
+ if ( resp == EKeyWasNotConsumed && aType == EEventKeyDown && aKeyEvent.iCode == EKeyBackspace )
+ {
+ // When backspace is pushed, go to the parent view
+ CMemSpyAppUi* appUi = static_cast< CMemSpyAppUi* >( iEikonEnv->EikAppUi() );
+ appUi->Container().NavigateToParentViewL();
+ resp = EKeyWasConsumed;
+ }
+ //
+ return resp;
+ }
+
+
+void CMemSpyViewBase::HandleControlEventL( CCoeControl* aControl,TCoeEvent aEventType )
+ {
+ if ( aControl == iListBox )
+ {
+ if ( aEventType == MCoeControlObserver::EEventStateChanged )
+ {
+ const TInt index = iListBox->CurrentItemIndex();
+ HandleListBoxItemSelectedL( index );
+ }
+ }
+ }
+
+
+void CMemSpyViewBase::HandleListBoxEventL( CEikListBox* /*aListBox*/, TListBoxEvent aEventType )
+ {
+ const TInt index = iListBox->CurrentItemIndex();
+ //
+ switch (aEventType)
+ {
+ case EEventItemActioned:
+ case EEventEnterKeyPressed:
+ case EEventItemDoubleClicked:
+ HandleListBoxItemActionedL( index );
+ break;
+
+ default:
+ break;
+ }
+ }
+
+
+
+