diff -r b01126ce0bec -r ba63c83f4716 idlehomescreen/widgetmanager/src/wmmaincontainer.cpp --- a/idlehomescreen/widgetmanager/src/wmmaincontainer.cpp Wed Sep 15 12:00:00 2010 +0300 +++ b/idlehomescreen/widgetmanager/src/wmmaincontainer.cpp Wed Oct 13 14:18:30 2010 +0300 @@ -40,8 +40,6 @@ #include #include #include -#include -#include #include #include #include @@ -65,7 +63,7 @@ #include "wmlistbox.h" #include "wmpersistentwidgetorder.h" #include "wmdetailsdlg.h" -#include "wmstore.h" +#include "wmportalbutton.h" #include "wmwidgetloaderao.h" #include "wmconfiguration.h" #include "wminstaller.h" @@ -77,31 +75,6 @@ const TInt KTextLimit = 40; // Text-limit for find-field const TInt KMinWidgets = 1; // minimum number of widgets to show findpane -// ======== LOCAL FUNCTIONS ======== - -// ---------------------------------------------------------------------------- -// CleanupResetAndDestroy() -// ---------------------------------------------------------------------------- -// -template -static void CleanupResetAndDestroy( TAny* aObj ) - { - if( aObj ) - { - static_cast( aObj )->ResetAndDestroy(); - } - } - -// ---------------------------------------------------------------------------- -// CleanupResetAndDestroyPushL -// ---------------------------------------------------------------------------- -// -template -static void CleanupResetAndDestroyPushL(T& aArray) - { - CleanupStack::PushL( TCleanupItem( &CleanupResetAndDestroy, &aArray ) ); - } - // --------------------------------------------------------- // CWmMainContainer::CWmMainContainer() // --------------------------------------------------------- @@ -113,6 +86,7 @@ iFindbox = NULL; iFindPaneIsVisible = EFalse; iBgContext = NULL; + iFocusMode = ENowhere; iClosingDown = ETrue; } @@ -122,11 +96,6 @@ // CWmMainContainer::~CWmMainContainer() { - if ( iSelectedStore ) - { - delete iSelectedStore; - iSelectedStore = NULL; - } TRAP_IGNORE(DeactivateFindPaneL(EFalse)); if ( iWidgetLoader ) @@ -139,8 +108,11 @@ Components().ResetAndDestroy(); iWidgetsList = NULL; + iPortalButtonOne = NULL; + iPortalButtonTwo = NULL; iFindbox = NULL; delete iBgContext; + delete iConfiguration; } // --------------------------------------------------------- @@ -207,6 +179,9 @@ // background context iBgContext = CAknsBasicBackgroundControlContext::NewL( KAknsIIDQsnBgScreen, ScreenRect() , ETrue); + + // load configuration + iConfiguration = CWmConfiguration::NewL( iWmPlugin.ResourceLoader() ); // set up controls InitializeControlsL( aRect ); @@ -236,21 +211,52 @@ { TRect rect( Rect() ); + // determine layout type + iLandscape = Layout_Meta_Data::IsLandscapeOrientation(); + iMirrored = Layout_Meta_Data::IsMirrored(); + + // layout iPortalButtons + if ( iConfiguration->PortalButtonCount() == 1 ) + { + // one button + TAknWindowLineLayout btnPane = AknLayoutScalable_Apps + ::wgtman_btn_pane( iLandscape ? 1 : 0 ).LayoutLine(); + AknLayoutUtils::LayoutControl( iPortalButtonOne, rect, btnPane ); + } + else + { + // two buttons + TInt variety = (iLandscape ? 3 : 2); + TAknWindowLineLayout oviBtnLayout = AknLayoutScalable_Apps + ::wgtman_btn_pane( variety ).LayoutLine(); + TAknWindowLineLayout operatorBtnLayout = AknLayoutScalable_Apps + ::wgtman_btn_pane_cp_01( variety ).LayoutLine(); + + // button placement + if ( iConfiguration->PortalButtonsMirrored() ) + { + AknLayoutUtils::LayoutControl( iPortalButtonOne, rect, operatorBtnLayout ); + AknLayoutUtils::LayoutControl( iPortalButtonTwo, rect, oviBtnLayout ); + } + else + { + AknLayoutUtils::LayoutControl( iPortalButtonOne, rect, oviBtnLayout ); + AknLayoutUtils::LayoutControl( iPortalButtonTwo, rect, operatorBtnLayout ); + } + } + // layout iWidgetsList + TAknWindowLineLayout listPane = AknLayoutScalable_Apps + ::listscroll_wgtman_pane( iLandscape ? 1 : 0 ).LayoutLine(); if( iFindbox && iFindPaneIsVisible ) { - iWidgetsList->SetRect( rect ); + TAknLayoutRect layoutRect; + layoutRect.LayoutRect( rect, listPane ); + iWidgetsList->SetRect( layoutRect.Rect() ); HandleFindSizeChanged(); } else { - TAknWindowLineLayout listPane; - listPane.il = rect.iTl.iX; - listPane.it = rect.iTl.iY; - listPane.ib = 0; - listPane.iH = rect.Height(); - listPane.iW = rect.Width(); - listPane.ir = ELayoutEmpty; AknLayoutUtils::LayoutControl( iWidgetsList, rect, listPane ); } @@ -281,16 +287,28 @@ { return EKeyWasConsumed; } - + // Handle search keyevent keyResponse = HandleSearchKeyEventL( aKeyEvent, aType ); - + + // Move focus between controls + if ( keyResponse == EKeyWasNotConsumed ) + { + keyResponse = MoveFocusByKeys( aKeyEvent, aType ); + } + // Handle list keyevent if ( keyResponse == EKeyWasNotConsumed ) { keyResponse = HandleListKeyEventL( aKeyEvent, aType ); } + // Handle buttons keyevent + if ( keyResponse == EKeyWasNotConsumed ) + { + keyResponse = HandleButtonKeyEventL( aKeyEvent, aType ); + } + // Update ui if needed if ( keyResponse == EKeyWasConsumed ) { @@ -368,33 +386,429 @@ TKeyResponse keyResponse( EKeyWasNotConsumed ); // pass key event except backpace or delete key event to widgets list if focused - if ( ( aType == EEventKey ) && ( aKeyEvent.iCode == EKeyBackspace - || aKeyEvent.iCode == EKeyDelete ) ) + if ( iWidgetsList->IsFocused() ) { - if( CanDoUninstall() ) + if ( ( aType == EEventKey ) && ( aKeyEvent.iCode == EKeyBackspace + || aKeyEvent.iCode == EKeyDelete ) ) { - UninstallWidgetL(); + if( CanDoUninstall() ) + { + UninstallWidgetL(); + } + else + { + CWmWidgetData* data = iWidgetsList->WidgetData(); + if( data != NULL ) + iWmPlugin.ResourceLoader().InfoPopupL( + R_QTN_WM_UNINST_NOT_ALLOWED, data->Name() ); + } + keyResponse = EKeyWasConsumed; } - else + else { - CWmWidgetData* data = iWidgetsList->WidgetData(); - if( data != NULL ) - iWmPlugin.ResourceLoader().InfoPopupL( - R_QTN_WM_UNINST_NOT_ALLOWED, data->Name() ); + //passing to listbox handler + keyResponse = iWidgetsList->OfferKeyEventL( + aKeyEvent, aType ); } - keyResponse = EKeyWasConsumed; } - else + + return keyResponse; + } + +// --------------------------------------------------------- +// CWmMainContainer::HandleButtonKeyEventL +// --------------------------------------------------------- +// +TKeyResponse CWmMainContainer::HandleButtonKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + TKeyResponse keyResponse( EKeyWasNotConsumed ); + + // pass key event to portal button if focused + if ( iPortalButtonOne->IsFocused() ) { - //passing to listbox handler - keyResponse = iWidgetsList->OfferKeyEventL( - aKeyEvent, aType ); + keyResponse = iPortalButtonOne->OfferKeyEventL( + aKeyEvent, aType ); + } + + // pass key event to the other portal button if exists and focused + if ( iPortalButtonTwo && iPortalButtonTwo->IsFocused() ) + { + keyResponse = iPortalButtonTwo->OfferKeyEventL( + aKeyEvent, aType ); } return keyResponse; } // --------------------------------------------------------- +// CWmMainContainer::MoveFocusByKeys +// --------------------------------------------------------- +// +TKeyResponse CWmMainContainer::MoveFocusByKeys( + const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + TKeyResponse keyResponse( EKeyWasNotConsumed ); + + if ( iWidgetsList->IsFocused() ) + { + // ------------------------------------ + // focus is in the WIDGETS LIST + // ------------------------------------ + if ( !iLandscape && + aKeyEvent.iScanCode == EStdKeyUpArrow && + iWidgetsList->CurrentItemIndex() == 0 ) + { + // widget list top -> up -> ovi button (portrait) + if ( aType == EEventKey ) + SetFocusToPortalButton( OperatorButtonHigherPriority ( 0 ) ); + keyResponse = EKeyWasConsumed; + } + else if ( !iLandscape && + aKeyEvent.iScanCode == EStdKeyDownArrow && + iWidgetsList->CurrentItemIndex() == + iWidgetsList->Model()->NumberOfItems() - 1 ) + { + // widget list bottom -> down -> ovi button (portrait) + if ( aType == EEventKey ) + SetFocusToPortalButton( OperatorButtonHigherPriority ( 0 ) ); + keyResponse = EKeyWasConsumed; + } + else if ( iLandscape && !iMirrored && + aKeyEvent.iScanCode == EStdKeyRightArrow ) + { + // widget list -> right -> ovi button (landscape normal) + if ( aType == EEventKey ) + SetFocusToPortalButton( OperatorButtonHigherPriority ( 0 ) ); + keyResponse = EKeyWasConsumed; + } + else if ( iLandscape && iMirrored && + aKeyEvent.iScanCode == EStdKeyLeftArrow ) + { + // widget list -> left -> ovi button (landscape mirrored) + if ( aType == EEventKey ) + SetFocusToPortalButton( OperatorButtonHigherPriority ( 0 ) ); + keyResponse = EKeyWasConsumed; + } + } + else if ( iPortalButtonOne->IsFocused() ) + { + // ------------------------------------ + // focus is in the FIRST PORTAL BUTTON + // ------------------------------------ + if ( !iLandscape && + aKeyEvent.iScanCode == EStdKeyDownArrow ) + { + // left portal -> down -> widget list top (portrait) + if ( aType == EEventKey ) + SetFocusToWidgetList( 0 ); + keyResponse = EKeyWasConsumed; + } + else if ( !iLandscape && + aKeyEvent.iScanCode == EStdKeyUpArrow ) + { + // left portal -> up -> widget list bottom (portrait) + if ( aType == EEventKey ) + SetFocusToWidgetList( iWidgetsList->Model()->NumberOfItems()-1 ); + keyResponse = EKeyWasConsumed; + } + else if ( !iLandscape && !iMirrored && + aKeyEvent.iScanCode == EStdKeyLeftArrow && + iConfiguration->PortalButtonCount() > 1 && + iConfiguration->PortalButtonsMirrored() ) + { + // right portal -> left -> left portal + // (portrait, operator button higher priority ) + if ( aType == EEventKey ) + SetFocusToPortalButton( 1 ); + keyResponse = EKeyWasConsumed; + } + else if ( !iLandscape && !iMirrored && + aKeyEvent.iScanCode == EStdKeyRightArrow && + iConfiguration->PortalButtonCount() > 1 && + !iConfiguration->PortalButtonsMirrored() ) + { + // left portal -> right -> right portal (portrait normal) + if ( aType == EEventKey ) + SetFocusToPortalButton( 1 ); + keyResponse = EKeyWasConsumed; + } + else if ( !iLandscape && iMirrored && + aKeyEvent.iScanCode == EStdKeyRightArrow && + iConfiguration->PortalButtonCount() > 1 && + iConfiguration->PortalButtonsMirrored() ) + { + // right portal -> left -> left portal (portrait mirrored) + if ( aType == EEventKey ) + SetFocusToPortalButton( 1 ); + keyResponse = EKeyWasConsumed; + } + else if ( !iLandscape && iMirrored && + aKeyEvent.iScanCode == EStdKeyLeftArrow && + iConfiguration->PortalButtonCount() > 1 && + !iConfiguration->PortalButtonsMirrored() ) + { + // right portal -> left -> left portal (portrait mirrored) + if ( aType == EEventKey ) + SetFocusToPortalButton( 1 ); + keyResponse = EKeyWasConsumed; + } + else if ( iLandscape && !iMirrored && + aKeyEvent.iScanCode == EStdKeyLeftArrow ) + { + // upper portal -> left -> widget list (landscape normal) + if ( aType == EEventKey ) + SetFocusToWidgetList(); + keyResponse = EKeyWasConsumed; + } + else if ( iLandscape && iMirrored && + aKeyEvent.iScanCode == EStdKeyRightArrow ) + { + // upper portal -> right -> widget list (landscape mirrored) + if ( aType == EEventKey ) + SetFocusToWidgetList(); + keyResponse = EKeyWasConsumed; + } + else if ( iLandscape && + aKeyEvent.iScanCode == EStdKeyUpArrow && + iConfiguration->PortalButtonCount() > 1 && + iConfiguration->PortalButtonsMirrored() ) + { + // lower portal -> up -> upper portal + // (landscape, operator button higher priority ) + if ( aType == EEventKey ) + SetFocusToPortalButton( 1 ); + keyResponse = EKeyWasConsumed; + } + else if ( iLandscape && + aKeyEvent.iScanCode == EStdKeyDownArrow && + iConfiguration->PortalButtonCount() > 1 && + !iConfiguration->PortalButtonsMirrored() ) + { + // upper portal -> down -> lower portal (landscape) + if ( aType == EEventKey ) + SetFocusToPortalButton( 1 ); + keyResponse = EKeyWasConsumed; + } + } + else if ( iPortalButtonTwo && iPortalButtonTwo->IsFocused() ) + { + // ------------------------------------ + // focus is in the SECOND PORTAL BUTTON + // ------------------------------------ + if ( !iLandscape && + aKeyEvent.iScanCode == EStdKeyDownArrow ) + { + // right portal -> down -> widget list top (portrait) + if ( aType == EEventKey ) + SetFocusToWidgetList( 0 ); + keyResponse = EKeyWasConsumed; + } + else if ( !iLandscape && + aKeyEvent.iScanCode == EStdKeyUpArrow ) + { + // right portal -> up -> widget list bottom (portrait) + if ( aType == EEventKey ) + SetFocusToWidgetList( iWidgetsList->Model()->NumberOfItems()-1 ); + keyResponse = EKeyWasConsumed; + } + else if ( !iLandscape && !iMirrored && + aKeyEvent.iScanCode == EStdKeyRightArrow && + iConfiguration->PortalButtonCount() > 1 && + iConfiguration->PortalButtonsMirrored() ) + { + // left portal -> right -> right portal + // (portrait, operator button higher priority ) + if ( aType == EEventKey ) + SetFocusToPortalButton( 0 ); + keyResponse = EKeyWasConsumed; + } + else if ( !iLandscape && !iMirrored && + aKeyEvent.iScanCode == EStdKeyLeftArrow && + iConfiguration->PortalButtonCount() > 1 && + !iConfiguration->PortalButtonsMirrored() ) + { + // right portal -> left -> left portal (portrait normal) + if ( aType == EEventKey ) + SetFocusToPortalButton( 0 ); + keyResponse = EKeyWasConsumed; + } + else if ( !iLandscape && iMirrored && + aKeyEvent.iScanCode == EStdKeyLeftArrow && + iConfiguration->PortalButtonCount() > 1 && + iConfiguration->PortalButtonsMirrored() ) + { + // left portal -> right -> right portal (portrait mirrored) + if ( aType == EEventKey ) + SetFocusToPortalButton( 0 ); + keyResponse = EKeyWasConsumed; + } + else if ( !iLandscape && iMirrored && + aKeyEvent.iScanCode == EStdKeyRightArrow && + iConfiguration->PortalButtonCount() > 1 && + !iConfiguration->PortalButtonsMirrored() ) + { + // left portal -> right -> right portal (portrait mirrored) + if ( aType == EEventKey ) + SetFocusToPortalButton( 0 ); + keyResponse = EKeyWasConsumed; + } + else if ( iLandscape && !iMirrored && + aKeyEvent.iScanCode == EStdKeyLeftArrow ) + { + // lower portal -> left -> widget list (landscape normal) + if ( aType == EEventKey ) + SetFocusToWidgetList(); + keyResponse = EKeyWasConsumed; + } + else if ( iLandscape && iMirrored && + aKeyEvent.iScanCode == EStdKeyRightArrow ) + { + // lower portal -> right -> widget list (landscape mirrored) + if ( aType == EEventKey ) + SetFocusToWidgetList(); + keyResponse = EKeyWasConsumed; + } + else if ( iLandscape && + aKeyEvent.iScanCode == EStdKeyDownArrow && + iConfiguration->PortalButtonsMirrored() ) + { + // upper portal -> down -> lower portal + // ( landscape operator button higher priority ) + if ( aType == EEventKey ) + SetFocusToPortalButton( 0 ); + keyResponse = EKeyWasConsumed; + } + else if ( iLandscape && + aKeyEvent.iScanCode == EStdKeyUpArrow && + !iConfiguration->PortalButtonsMirrored() ) + { + // lower portal -> up -> upper portal (landscape) + if ( aType == EEventKey ) + SetFocusToPortalButton( 0 ); + keyResponse = EKeyWasConsumed; + } + } + else + { + // ------------------------------------ + // focus is NOWHERE + // ------------------------------------ + if ( aKeyEvent.iScanCode == EStdKeyUpArrow || + aKeyEvent.iScanCode == EStdKeyDownArrow ) + { + // no focus -> key hit -> focus list + if ( aType == EEventKey ) + { + SetFocusToWidgetList(); + keyResponse = EKeyWasNotConsumed; + } + } + } + + return keyResponse; + } + + +// --------------------------------------------------------- +// CWmMainContainer::OperatorButtonHigherPriority +// --------------------------------------------------------- +// +TInt CWmMainContainer::OperatorButtonHigherPriority( TInt aIndex ) + { + TInt ret = aIndex; + if ( iConfiguration->PortalButtonsMirrored() ) + { + if ( aIndex == 0 ) + { + ret = 1; + } + else if ( aIndex == 1 ) + { + ret = 0; + } + } + return ret; + } + +// --------------------------------------------------------- +// CWmMainContainer::SetFocusToPortalButton +// --------------------------------------------------------- +// +void CWmMainContainer::SetFocusToPortalButton( TInt aIndex ) + { + if ( aIndex != 0 && iPortalButtonTwo ) + { + iWidgetsList->SetFocus(EFalse); + iPortalButtonOne->SetFocus(EFalse); + iPortalButtonTwo->SetFocus(ETrue); + } + else + { + iWidgetsList->SetFocus(EFalse); + if ( iPortalButtonTwo ) + iPortalButtonTwo->SetFocus(EFalse); + iPortalButtonOne->SetFocus(ETrue); + } + DrawDeferred(); + UpdateFocusMode(); + } + +// --------------------------------------------------------- +// CWmMainContainer::SetFocusToWidgetList +// --------------------------------------------------------- +// +void CWmMainContainer::SetFocusToWidgetList( TInt aIndex ) + { + iPortalButtonOne->SetFocus(EFalse); + if ( iPortalButtonTwo ) + iPortalButtonTwo->SetFocus(EFalse); + if ( aIndex >= 0 && aIndex < iWidgetsList->Model()->NumberOfItems() ) + { + iWidgetsList->SetCurrentItemIndex( aIndex ); + } + iWidgetsList->SetFocus(ETrue); + DrawDeferred(); + UpdateFocusMode(); + } + +// --------------------------------------------------------- +// CWmMainContainer::UpdateFocusMode +// --------------------------------------------------------- +// +void CWmMainContainer::UpdateFocusMode() + { + if ( iPortalButtonOne->IsFocused() ) + { + // PORTAL BUTTON is focused + iFocusMode = EPortal; + } + else if ( iPortalButtonTwo && iPortalButtonTwo->IsFocused() ) + { + // SECOND PORTAL BUTTON is focused + iFocusMode = EPortal; + } + else if( ( iFindPaneIsVisible ) && + ( iFindbox->IsFocused() || iWidgetsList->IsFocused() ) ) + { + // FIND MODE + iFocusMode = EFind; + } + else if ( iWidgetsList->IsFocused() ) + { + // WIDGETS LIST is focused + iFocusMode = EList; + } + else + { + // NO focus + iFocusMode = ENowhere; + } + } + +// --------------------------------------------------------- // CWmMainContainer::FindChildControlByPoint // --------------------------------------------------------- // @@ -444,6 +858,8 @@ // Set focus to the control that was clicked control->SetFocus( ETrue ); + // update focus mode accordingly + UpdateFocusMode(); // repaint DrawDeferred(); } @@ -487,6 +903,17 @@ // void CWmMainContainer::InitializeControlsL( const TRect& /*aRect*/ ) { + // Create portal buttons + iPortalButtonOne = CWmPortalButton::NewL( this, 0 ); + iPortalButtonOne->SetMopParent( this ); + AddControlL( iPortalButtonOne, EPortalOne ); + if ( iConfiguration->PortalButtonCount() > 1 ) + { + iPortalButtonTwo = CWmPortalButton::NewL( this, 1 ); + iPortalButtonTwo->SetMopParent( this ); + AddControlL( iPortalButtonTwo, EPortalTwo ); + } + // Create widget list box iWidgetsList = CWmListBox::NewL( iWmPlugin, @@ -509,7 +936,8 @@ 0, KTextLimit ); AddControlL( iFindbox, EFindBox ); iFindbox->AddAdaptiveSearchTextObserverL(this); - + + UpdateFocusMode(); StartLoadingWidgetsL(); } @@ -618,13 +1046,21 @@ } // --------------------------------------------------------- +// CWmMainContainer::PortalSelected +// --------------------------------------------------------- +// +TBool CWmMainContainer::PortalSelected() + { + return ( iFocusMode == EPortal ); + } + +// --------------------------------------------------------- // CWmMainContainer::WidgetSelected // --------------------------------------------------------- // TBool CWmMainContainer::WidgetSelected() { - return (( iWidgetsList->IsFocused() || iWidgetsList->IsHighlightEnabled())? - ETrue : EFalse ); + return ( iFocusMode == EList ) || ( iFocusMode == EFind ); } // --------------------------------------------------------- @@ -782,6 +1218,18 @@ if ( iFindbox && !iFindPaneIsVisible && iWidgetsList->Model()->NumberOfItems() > KMinWidgets ) { + // set focus + if ( iWidgetsList->ItemDrawer()->Flags() + & CListItemDrawer::ESingleClickDisabledHighlight ) + { + ResetFocus(); + } + else + { + iWidgetsList->SetFocus( ETrue, EDrawNow ); + } + + // set column filter flag TBitFlags32 bitFlag; bitFlag.ClearAll(); // clear all columns @@ -816,18 +1264,14 @@ } iFindbox->SetFocus( ETrue ); iWidgetsList->SetFindPaneIsVisible( ETrue ); - - if ( AknLayoutUtils::MSKEnabled() ) - { - // set soft key set - CEikButtonGroupContainer* cbaGroup = - CEikButtonGroupContainer::Current(); - TInt cbaResourceId = ( ( iWmPlugin.Configuration().StoreCount() > 0 )? - R_WM_SOFTKEYS_OPTIONS_CANCEL__STORE : - R_AVKON_SOFTKEYS_OPTIONS_CANCEL__SELECT ); - cbaGroup->SetCommandSetL( cbaResourceId ); - cbaGroup->DrawNow(); - } + + // set soft key set + CEikButtonGroupContainer* cbaGroup = + CEikButtonGroupContainer::Current(); + cbaGroup->SetCommandSetL( R_AVKON_SOFTKEYS_OPTIONS_CANCEL__SELECT ); + cbaGroup->DrawNow(); + + UpdateFocusMode(); } } @@ -855,6 +1299,17 @@ m->RemoveFilter(); } + //set focus + if ( iWidgetsList->ItemDrawer()->Flags() + & CListItemDrawer::ESingleClickDisabledHighlight ) + { + ResetFocus(); + } + else + { + iWidgetsList->SetFocus( ETrue, EDrawNow ); + } + iFindbox->MakeVisible( EFalse ); iFindPaneIsVisible = EFalse; iWidgetsList->SetFindPaneIsVisible( EFalse ); @@ -863,9 +1318,8 @@ // set soft key set CEikButtonGroupContainer* cbaGroup = CEikButtonGroupContainer::Current(); - TInt cbaResourceId = ( ( AknLayoutUtils::MSKEnabled() && - iWmPlugin.Configuration().StoreCount() > 0 )? - R_WM_SOFTKEYS_OPTIONS_BACK__STORE : + TInt cbaResourceId = ( AknLayoutUtils::MSKEnabled() ? + R_AVKON_SOFTKEYS_OPTIONS_BACK__SELECT : R_AVKON_SOFTKEYS_OPTIONS_BACK ); cbaGroup->SetCommandSetL( cbaResourceId ); @@ -874,6 +1328,7 @@ LayoutControls(); cbaGroup->DrawNow(); + UpdateFocusMode(); DrawNow(); } } @@ -927,32 +1382,35 @@ } // --------------------------------------------------------------------------- -// CWmMainContainer::HandleStoreCommandL +// CWmMainContainer::OpenPortalL // --------------------------------------------------------------------------- // -void CWmMainContainer::HandleStoreCommandL() +void CWmMainContainer::OpenPortalL() { - delete iSelectedStore; - iSelectedStore = NULL; - - const RPointerArray& storeConfArray = - iWmPlugin.Configuration().StoreConfArray(); - - if ( storeConfArray.Count() == 1 ) - { - iSelectedStore = CWmStore::NewL( *storeConfArray[0], - iWmPlugin.ResourceLoader() ); - - iSelectedStore->ExecuteL(); + if ( !iClosingDown ) + { + // execute whichever of the portal buttons happens to be active + if ( iPortalButtonOne->IsFocused() ) + iPortalButtonOne->ExecuteL(); + else if ( iPortalButtonTwo && iPortalButtonTwo->IsFocused() ) + iPortalButtonTwo->ExecuteL(); + else if ( !iPortalButtonTwo ) + iPortalButtonOne->ExecuteL(); } - else if ( storeConfArray.Count() > 1 ) - { - DisplayAndLaunchStoresL(); - } + } + +// --------------------------------------------------------------------------- +// CWmMainContainer::SelectL +// --------------------------------------------------------------------------- +// +void CWmMainContainer::SelectL() + { + if ( WidgetSelected() ) + AddWidgetToHomeScreenL(); + else if ( PortalSelected() ) + OpenPortalL(); else - { - // do nothing - } + SetFocusToWidgetList(); } // --------------------------------------------------------------------------- @@ -1042,6 +1500,19 @@ { AddWidgetToHomeScreenL(); } + else + { + if ( iWidgetsList->ItemDrawer()->Flags() + & CListItemDrawer::ESingleClickDisabledHighlight ) + { + ResetFocus(); + } + else + { + iWidgetsList->SetFocus( ETrue, EDrawNow ); + UpdateFocusMode(); + } + } } } @@ -1064,6 +1535,15 @@ } // ---------------------------------------------------- +// CWmMainContainer::Configuration +// ---------------------------------------------------- +// +CWmConfiguration& CWmMainContainer::Configuration() + { + return *iConfiguration; + } + +// ---------------------------------------------------- // CWmMainContainer::HandleFindSizeChanged // ---------------------------------------------------- // @@ -1093,6 +1573,44 @@ } // ---------------------------------------------------- +// CWmMainContainer::ProcessForegroundEvent +// ---------------------------------------------------- +// +void CWmMainContainer::ProcessForegroundEvent( TBool aForeground ) + { + if ( iFindbox && iFindPaneIsVisible && + iFindbox->IsFocused() ) + { + // keep focus & do nothing + } + else if ( aForeground ) + { + // set init state when wm comes to foreground. + // remove focus from all controls when activating view. + ResetFocus( EDrawNow ); + } + } + +// ---------------------------------------------------- +// CWmMainContainer::ResetFocus +// ---------------------------------------------------- +// +void CWmMainContainer::ResetFocus( TDrawNow aDrawNow ) + { + CCoeControl* control = NULL; + CCoeControlArray::TCursor cursor = Components().Begin(); + while( ( control = cursor.Control() ) != NULL ) + { + if( control->IsVisible() && control->IsFocused() ) + { + control->SetFocus( EFalse, aDrawNow ); + } + cursor.Next(); + } + UpdateFocusMode(); + } + +// ---------------------------------------------------- // CWmMainContainer::WmListBox // ---------------------------------------------------- // @@ -1112,8 +1630,10 @@ if ( iFindbox && iFindPaneIsVisible && !iFindbox->IsFocused() && IsFocused() ) { - // set focus to find pane if its lost ( ou1cimx1#308019 ) + // reset focus to find pane if its lost ( ou1cimx1#308019 ) + ResetFocus(); iFindbox->SetFocus( ETrue ); + UpdateFocusMode(); } } @@ -1146,113 +1666,5 @@ } } -// ---------------------------------------------------------- -// CWmMainContainer::CleanupIconArray -// ---------------------------------------------------------- -// -void CWmMainContainer::CleanupIconArray( TAny* aIconArray ) - { - CArrayPtrFlat* icons = (CArrayPtrFlat*)aIconArray; - icons->ResetAndDestroy(); - delete icons; - } - -// ---------------------------------------------------- -// CWmMainContainer::DisplayAndLaunchStoresL -// ---------------------------------------------------- -// -void CWmMainContainer::DisplayAndLaunchStoresL() - { - // prepare stores - RPointerArray storesArray; - CleanupResetAndDestroyPushL( storesArray ); - - const RPointerArray& storeConfArray = - iWmPlugin.Configuration().StoreConfArray(); - - for( TInt i = 0; i < storeConfArray.Count(); i++ ) - { - CWmStore* store = CWmStore::NewL( *storeConfArray[i], - iWmPlugin.ResourceLoader() ); - CleanupStack::PushL( store ); - storesArray.AppendL( store ); - CleanupStack::Pop( store ); - } - - CEikFormattedCellListBox* listBox = - new (ELeave) CAknDoubleLargeGraphicPopupMenuStyleListBox(); - CleanupStack::PushL( listBox ); - - CAknPopupList* popupList = CAknPopupList::NewL( - listBox, R_AVKON_SOFTKEYS_SELECT_CANCEL__SELECT, - AknPopupLayouts::EMenuDoubleLargeGraphicWindow ); - - CleanupStack::PushL( popupList ); - - listBox->ConstructL( popupList, EAknListBoxMenuList ); - listBox->CreateScrollBarFrameL(ETrue); - listBox->ScrollBarFrame()->SetScrollBarVisibilityL( - CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto); - - // set title - HBufC* title = StringLoader::LoadLC( R_QTN_WM_STORELIST_TITLE ); - popupList->SetTitleL( *title ); - CleanupStack::PopAndDestroy(); // title - - // format str - _LIT( KFormatStr , "%d\t%S" ); - - // items array - CDesCArray* itemArray = - static_cast( listBox->Model()->ItemTextArray( ) ); - - // create icons array - CArrayPtr* iconarray = new (ELeave) CArrayPtrFlat( 2 ); - CleanupStack::PushL( TCleanupItem( CleanupIconArray, iconarray) ); - - for ( TInt i=0; i < storesArray.Count(); i++ ) - { - // prepare icon - CGulIcon* icon = CGulIcon::NewL( storesArray[i]->StoreIcon(), - storesArray[i]->StoreMask() ); - CleanupStack::PushL( icon ); - icon->SetBitmapsOwnedExternally( ETrue ); - iconarray->AppendL( icon ); - CleanupStack::Pop( icon ); - - // add store to items array - HBufC* buf = HBufC::NewLC( - storesArray[i]->Heading().Length() + - KFormatStr().Length() ); - - TPtr ptr = buf->Des(); - ptr.Format( KFormatStr(), i, &storesArray[i]->Heading() ); - itemArray->AppendL( ptr ); - CleanupStack::PopAndDestroy( buf ); - } - - CleanupStack::Pop(); // iconarray - listBox->ItemDrawer()->ColumnData()->SetIconArrayL( iconarray ); - - TBool result = popupList->ExecuteLD(); - CleanupStack::Pop(); // popupList ( deleted in ExecuteLD) - - TInt selection = listBox->CurrentItemIndex(); - CleanupStack::PopAndDestroy(); // listBox - - if ( result && selection >= 0 && - selection < storesArray.Count() ) - { - iSelectedStore = storesArray[selection]; - if ( iSelectedStore ) - { - storesArray.Remove( selection ); - iSelectedStore->ExecuteL(); - } - } - - CleanupStack::PopAndDestroy(); //storesArray - } - // End of File