--- a/browserui/browser/FavouritesSrc/BrowserBookmarksContainer.cpp Mon Mar 30 12:49:49 2009 +0300
+++ b/browserui/browser/FavouritesSrc/BrowserBookmarksContainer.cpp Fri May 08 08:18:43 2009 +0300
@@ -22,9 +22,11 @@
#include <AknViewAppUi.h>
#include <aknsfld.h>
+#include <avkon.mbg>
#include <BrowserNG.rsg>
#include <FavouritesItem.h>
#include <FeatMgr.h>
+#include "BrowserBookmarksView.h"
#include "CommonConstants.h"
#include "BrowserFavouritesView.h"
@@ -41,6 +43,8 @@
#endif // __SERIES60_HELP
#include "Logger.h"
#include "e32event.h"
+#include "BrowserUiSDKCRKeys.h"
+#include <StringLoader.h>
// CONSTANTS
@@ -72,6 +76,8 @@
CBrowserBookmarksContainer::~CBrowserBookmarksContainer()
{
delete iGotoPane;
+ delete iSearchPane;
+ delete iDefaultSearchText;
}
// ---------------------------------------------------------
@@ -85,15 +91,93 @@
iGotoPaneActive = ETrue;
Listbox()->UpdateFilterL();
-
+ if( iSearchPane )
+ {
+ iGotoPane->SetVKBFlag( EFalse );
+ // Check for Search Configuration Changes //
+ if( View().ApiProvider().Preferences().GetIntValue( KBrowserSearchIconId )
+ != iSearchIconId )
+ {
+ ConstructSearchPaneL();
+ }
+
+ iSearchPane->SetFocus( EFalse );
+ // only one editor can be active at a time //
+ iSearchPaneActive = EFalse;
+ // we still need to display search, when showing for first time //
+ iSearchPane->MakeVisible(ETrue);
+ iSearchPane->CancelEditingL();
+ }
+
// redraw
SizeChanged();
- iGotoPane->BeginEditingL();
-
+ // It is important to set the Text and Italic property after SizeChanged, because
+ // iInputFrame->SetRect() event on GoTo/Search Pane calls the scalable version
+ // ( AknLayoutUtils::LayoutEdwinScalable ) which overwrites all the properties for
+ // Char and Para Formats.
+ if( iSearchPane )
+ {
+ iSearchPane->SetTextModeItalicL();
+ HBufC* text = iSearchPane->GetTextL();
+ CleanupStack::PushL( text );
+ if ( !text->Length() )
+ {
+ iSearchPane->SetTextL( *iDefaultSearchText );
+ }
+ CleanupStack::PopAndDestroy( text );
+ }
+
+ iGotoPane->BeginEditingL();
DrawDeferred();
}
}
+
+// ---------------------------------------------------------
+// CBrowserBookmarksContainer::SetSearchActiveL
+// ---------------------------------------------------------
+//
+void CBrowserBookmarksContainer::SetSearchActiveL()
+ {
+ if( ! iSearchPaneActive )
+ {
+ // Check for Search Configuration Changes //
+ if( View().ApiProvider().Preferences().GetIntValue( KBrowserSearchIconId )
+ != iSearchIconId )
+ {
+ ConstructSearchPaneL();
+ }
+
+ iSearchPane->SetVKBFlag( EFalse );
+ iSearchPane->SetFocus( ETrue );
+ iSearchPaneActive = ETrue;
+
+ Listbox()->UpdateFilterL();
+ // only one editor can be active at a time
+ iGotoPaneActive = EFalse;
+ iGotoPane->MakeVisible(ETrue);
+ iGotoPane->SetFocus( EFalse );
+ iGotoPane->CancelEditingL();
+
+ // redraw
+ SizeChanged();
+
+ // Not Focused, so set the current Text Mode to italics.
+ iGotoPane->SetTextModeItalicL();
+ // if gotopane is empty add default text
+ HBufC* text = iGotoPane->GetTextL();
+ CleanupStack::PushL( text );
+ if ( !text->Length() )
+ {
+ iGotoPane->SetTextL( KWWWString );
+ }
+ CleanupStack::PopAndDestroy( text );
+
+ iSearchPane->BeginEditingL();
+ DrawDeferred();
+ }
+
+ }
// ---------------------------------------------------------
@@ -103,8 +187,18 @@
void CBrowserBookmarksContainer::SetGotoInactiveL()
{
- if(iGotoPaneActive)
+ if( iGotoPaneActive || iSearchPaneActive )
{
+
+ if( iSearchPane )
+ {
+ /* In Search Feature we have to move between the editors preserving the
+ * text added, clear the text when cancel is pressed.
+ */
+ iGotoPane->SetTextL( KNullDesC , ETrue );
+ SetSearchInactiveL();
+ }
+ // Deactivate GoTo Pane
iGotoPaneActive = EFalse;
// Deactivate GoTo Pane
@@ -119,13 +213,21 @@
}
}
+void CBrowserBookmarksContainer::SetSearchInactiveL()
+ {
+ iSearchPaneActive = EFalse;
+ iSearchPane->SetTextL( KNullDesC , ETrue);
+ iSearchPane->MakeVisible( EFalse );
+ iSearchPane->CancelEditingL();
+ }
+
// ---------------------------------------------------------
// CBrowserBookmarksContainer::CountComponentControls
// ---------------------------------------------------------
//
TInt CBrowserBookmarksContainer::CountComponentControls() const
{
- return (Listbox() ? 1 : 0) + (iGotoPane ? 1 : 0);
+ return (Listbox() ? 1 : 0) + (iGotoPane ? 1 : 0) + (iSearchPane? 1 : 0) ;
}
// ---------------------------------------------------------
@@ -146,7 +248,10 @@
{
return iGotoPane;
}
-
+ case 2:
+ {
+ return iSearchPane;
+ }
default:
{
return NULL;
@@ -164,16 +269,53 @@
TInt unfilteredNumberOfItems = Listbox()->UnfilteredNumberOfItems();
// if goto pane is active
- if( iGotoPaneActive )
+ if( iGotoPaneActive || iSearchPaneActive )
{
- // Enable / disable line in Goto Pane (hide if listbox is empty).
+ if( iSearchPane )
+ {
+ TAknWindowLineLayout findPane = AknLayout::find_pane();
+
+ // Enable / disable line in Goto Pane (hide if listbox is empty).
iGotoPane->SetLineState( unfilteredNumberOfItems > 0 );
+ TAknWindowLineLayout listLayout = AknLayout::list_gen_pane( 1 );
+
+ TRect listBoxRect = AknLayoutUtils::RectFromCoords( rect,listLayout.il,
+ listLayout.it, listLayout.ir, listLayout.ib, listLayout.iW, listLayout.iH);
+
+ /* Now we need to make room for both Goto and Search Pane.
+ * No layout specification was suitable for this case, so
+ * substracting the height of pane.
+ */
+ listBoxRect.iBr.iY -= findPane.iH;
+
// In Goto Mode, the listbox is laid out leaving space for Goto Pane.
- AknLayoutUtils::LayoutControl( Listbox(), rect, AknLayout::list_gen_pane( 1 ));
+ Listbox()->SetRect( listBoxRect );
+
+
+ // Now Lay out Search Pane as if it was the old Find Pane.
+ AknLayoutUtils::LayoutControl( iSearchPane, rect, findPane );
- // Lay out Goto Pane as if it was the old Find Pane.
- AknLayoutUtils::LayoutControl( iGotoPane, rect, AknLayout::find_pane() );
+ TRect gotoRect = AknLayoutUtils::RectFromCoords( rect,findPane.il, findPane.it,
+ findPane.ir, findPane.ib, findPane.iW, findPane.iH);
+
+ // Calculate the new position for GoToPane.
+ gotoRect.iTl.iY -= ( findPane.iH );
+ gotoRect.iBr.iY -= ( findPane.iH );
+ iGotoPane->SetRect( gotoRect );
+
+ }
+ else
+ {
+ // Enable / disable line in Goto Pane (hide if listbox is empty).
+ iGotoPane->SetLineState( unfilteredNumberOfItems > 0 );
+
+ // In Goto Mode, the listbox is laid out leaving space for Goto Pane.
+ AknLayoutUtils::LayoutControl( Listbox(), rect, AknLayout::list_gen_pane( 1 ));
+
+ // Lay out Goto Pane as if it was the old Find Pane.
+ AknLayoutUtils::LayoutControl( iGotoPane, rect, AknLayout::find_pane() );
+ }
}
else
{
@@ -257,11 +399,11 @@
}
// If the Goto Pane exists and we're not fetching, then decide
// if we should pass keystroke to it
- if(iGotoPane)
+ if(iGotoPane && !CBrowserAppUi::Static()->Fetching())
{
// If the key so far hadn't been consumed or if the pane is already active,
// pass the keystroke on
- if( (result == EKeyWasNotConsumed) || (iGotoPaneActive) )
+ if( (result == EKeyWasNotConsumed) || iGotoPaneActive || iSearchPaneActive )
{
// Goto pane has highest priority; if it's active, arrow keys go there.
// If fetching is in progress, no key events are offered, to prevent it
@@ -269,7 +411,7 @@
// Enter Key now handled through HandleCommand in BrowserBookmarksView like MSK
// This change affects the enter key on the QWERTY keyboard when we run emulator
- if(EStdKeyEnter == aKeyEvent.iScanCode && EEventKeyUp == aType && AknLayoutUtils::MSKEnabled() && iGotoPaneActive )
+ if(EStdKeyEnter == aKeyEvent.iScanCode && EEventKeyUp == aType && AknLayoutUtils::MSKEnabled() && (iGotoPaneActive || iSearchPaneActive ))
{
CEikButtonGroupContainer* myCba = CEikButtonGroupContainer::Current();
if(myCba != NULL)
@@ -280,13 +422,51 @@
}
}
else
- {
- result = iGotoPane->OfferKeyEventL( keyEvent, aType );
+ {
+ if( iSearchPane )
+ {
+ // Process separately for Search Feature //
+ if( iGotoPaneActive )
+ {
+ result = iGotoPane->OfferKeyEventL( keyEvent, aType );
+ }
+ else
+ {
+ result = iSearchPane->OfferKeyEventL( keyEvent, aType );
+ }
+ }
+ else
+ result = iGotoPane->OfferKeyEventL( keyEvent, aType );
}
-
+
+ if( iSearchPane )
+ {
+ if( ( iGotoPaneActive || iSearchPaneActive) && result == EKeyWasNotConsumed )
+ {
+
+ if( aKeyEvent.iCode == EKeyUpArrow )
+ {
+ result = EKeyWasConsumed;
+ if( iSearchPaneActive )
+ {
+ SetGotoActiveL();
+ iGotoPane->SetVKBFlag( ETrue );
+ }
+ }
+ if( aKeyEvent.iCode == EKeyDownArrow )
+ {
+ result = EKeyWasConsumed;
+ if( iGotoPaneActive )
+ {
+ SetSearchActiveL();
+ iSearchPane->SetVKBFlag( ETrue );
+ }
+ }
+ }
+ }
+
// if key is consumed, goto pane was not active, make it active now.
- if(result == EKeyWasConsumed &&
- !iGotoPaneActive)
+ if(result == EKeyWasConsumed && (!iGotoPaneActive && !iSearchPaneActive))
{
SetGotoActiveL();
}
@@ -373,6 +553,20 @@
}
// ---------------------------------------------------------
+// CBrowserBookmarksContainer::IsEditingSearch
+// ---------------------------------------------------------
+//
+TBool CBrowserBookmarksContainer::IsEditingSearch()
+ {
+ TBool editing = EFalse;
+ if( iSearchPane )
+ {
+ editing = iSearchPane->IsEditing();
+ }
+ return editing;
+ }
+
+// ---------------------------------------------------------
// CBrowserBookmarksContainer::TabIndex
// ---------------------------------------------------------
//
@@ -404,7 +598,7 @@
// ---------------------------------------------------------
//
CBrowserBookmarksContainer::CBrowserBookmarksContainer()
-: iGotoPaneActive( EFalse )
+: iGotoPaneActive( EFalse ),iSearchPaneActive(EFalse)
{
}
@@ -423,8 +617,17 @@
// Construct Goto Pane.
//pass view to bookmarks goto pane
- iGotoPane = CBrowserBookmarksGotoPane::NewL( *this, &aView );
+ iGotoPane = CBrowserBookmarksGotoPane::NewL( *this, &aView, KAvkonBitmapFile,
+ EMbmAvkonQgn_indi_find_goto,
+ EMbmAvkonQgn_indi_find_goto_mask);
iGotoPane->SetFocus( EFalse );
+
+ if( View().ApiProvider().Preferences().SearchFeature() )
+ {
+ ConstructSearchPaneL();
+ iSearchPane->SetFocus( EFalse );
+ iDefaultSearchText = StringLoader::LoadL( R_IS_WEB_SEARCH );
+ }
}
// ---------------------------------------------------------
@@ -459,6 +662,10 @@
{
iGotoPane->SetFocus( IsFocused(), aDrawNow );
}
+ else if( IsEditingSearch() )
+ {
+ iSearchPane->SetFocus( IsFocused(), aDrawNow );
+ }
else if ( Listbox() && Listbox()->IsVisible() )
{
Listbox()->SetFocus( IsFocused(), aDrawNow );
@@ -478,10 +685,48 @@
//
// otherwise, if it falls within the listbox's rect
//
- if (iGotoPaneActive && iGotoPane)
- {
- iGotoPane->HandlePointerEventL(aPointerEvent);
- }
+
+ // Now we have two different panes so we have to check explicitly before passing controls
+ // to any panes.
+ if( iGotoPane && ( iGotoPaneActive || iSearchPaneActive) )
+ {
+ if( iSearchPane )//implies presence of search feature.
+ {
+ if( iGotoPane->Rect().Contains( aPointerEvent.iPosition) )
+ {
+ if( iGotoPaneActive )
+ {
+ iGotoPane->HandlePointerEventL(aPointerEvent);
+ }
+ else
+ {
+ SetGotoActiveL();
+ }
+ iGotoPane->SetVKBFlag( ETrue );
+ }
+ else if( iSearchPane->Rect().Contains( aPointerEvent.iPosition) )
+ {
+ if( iSearchPaneActive )
+ {
+ iSearchPane->HandlePointerEventL(aPointerEvent);
+ }
+ else
+ {
+ SetSearchActiveL();
+ }
+ iSearchPane->SetVKBFlag( ETrue );
+ }
+ else
+ {
+ CBrowserAppUi::Static()->ActiveView()->HandleCommandL(EWmlCmdGotoPaneCancel);
+ SetGotoInactiveL();
+ }
+ }
+ else
+ {
+ iGotoPane->HandlePointerEventL(aPointerEvent);
+ }
+ }
else
{
// normally, pass all pointer events down to the listbox
@@ -490,4 +735,92 @@
}
}
+// ----------------------------------------------------------------------------
+// CBrowserBookmarksContainer::ConstructSearchPaneL
+// ----------------------------------------------------------------------------
+//
+
+void CBrowserBookmarksContainer::ConstructSearchPaneL()
+ {
+ TFileName iconFile;
+ MPreferences& preferences = View().ApiProvider().Preferences();
+
+ TInt iconId = preferences.GetIntValue( KBrowserSearchIconId );
+ // Get the Search Icon File Path.
+ preferences.GetStringValueL( KBrowserSearchIconPath, KMaxFileName, iconFile );
+
+ // If Icon File Path Changed or Icon Id Changed, Refresh the Icon for Search Pane.
+ // Comparing Icon File path as well, because it may be possible that two different
+ // Icon files have same icon id.
+ if( iconId != iSearchIconId
+ || iSearchIconFilePath.Compare( iconFile ) != 0 )
+ {
+
+ TInt iconMaskId = preferences.GetIntValue( KBrowserSearchIconMaskId );
+
+ // Save IconId
+ iSearchIconId = iconId;
+ // Save Icon File
+ iSearchIconFilePath = iconFile;
+
+
+ // No Icon file or IconId or IconMaskId set , then it means no search provider is still
+ // selected and set by search application, in that case we use the default icon for Search.
+ if( ! iconFile.Length()
+ || iconId == -1
+ || iconMaskId == -1 )
+ {
+ iconId = EMbmAvkonQgn_indi_find_glass;
+ iconMaskId = EMbmAvkonQgn_indi_find_glass_mask;
+ iconFile = KAvkonBitmapFile;
+ }
+
+ if( iSearchPane )
+ {
+ delete iSearchPane;
+ iSearchPane = NULL;
+ }
+
+
+ // iSearchPane != NULL, implies presence of search feature, hence it can be
+ // used to validate search feature avoiding repetative calls to utils and
+ // avoiding need of separate variable.
+ iSearchPane = CBrowserBookmarksGotoPane::NewL( *this,
+ &(View()),
+ iconFile,
+ iconId,
+ iconMaskId,
+ GOTOPANE_POPUPLIST_DISABLE,
+ ETrue
+ );
+
+ CBrowserBookmarksView* bookmarkView = REINTERPRET_CAST( CBrowserBookmarksView* , &( View() ));
+ // Set Pane observer
+ iSearchPane->SetGPObserver( bookmarkView );
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CBrowserBookmarksContainer::HandleResourceChange
+// ----------------------------------------------------------------------------
+//
+void CBrowserBookmarksContainer::HandleResourceChange(TInt aType)
+ {
+ CBrowserFavouritesContainer::HandleResourceChange( aType);
+ if( aType == KEikDynamicLayoutVariantSwitch)
+ {
+ // If search feature exsist
+ if( iSearchPane )
+ {
+ if( iSearchPaneActive )
+ {
+ iGotoPane->SetTextModeItalicL( );
+ }
+ else
+ {
+ iSearchPane->SetTextModeItalicL( );
+ }
+ }
+ }
+ }
// End of File