diff -r 4baee4f15982 -r 6385c4c93049 browserui/browser/FavouritesSrc/BrowserAdaptiveListPopup.cpp --- a/browserui/browser/FavouritesSrc/BrowserAdaptiveListPopup.cpp Thu Aug 19 09:57:56 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1330 +0,0 @@ -/* -* Copyright (c) 2002-2006 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: -* Implementation of CBrowserPopupList and CBrowserAdaptiveListPopup -* -* -*/ - -// INCLUDE FILES -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "BrowserContentView.h" -#include "BrowserAdaptiveListPopup.h" -#include "BrowserAppUi.h" -#include "CommonConstants.h" -#include "BrowserAppViewBase.h" -#include -#include -#include - -#include "eikon.hrh" - -// CONSTANTS -const TInt KMaxIcons = 2; -const TInt KListLengthToShow = 64;//the length of the string in the list -_LIT( KItemTab, "1\t");//prefix for items -_LIT( KDirTab, "0\t");//prefix for directories -const TInt KArrayGranularity = 10; -_LIT( KProtocolIdentifier,"://" ); -const TUint KSlash('/'); -const TUint KPeriod('.'); -const TInt KListHeight = 36; -const TInt KLandscapeListItems = 5; -const TInt KFontHeight = 150; - -static void TextPos(TPoint *aResultArray, const TAknTextLineLayout -&aLayout, TSize aItemSize) - { - TRect itemRect(TPoint(0,0), aItemSize); - TAknLayoutText textLayout; - textLayout.LayoutText(itemRect, aLayout); - aResultArray[0] = textLayout.TextRect().iTl; - aResultArray[1] = textLayout.TextRect().iTl + -textLayout.TextRect().Size(); - } - -static void GfxPos(TPoint *aResultArray, const TAknWindowLineLayout -&aLayout, TSize aItemSize) - { - TRect itemRect(TPoint(0,0), aItemSize); - TAknLayoutRect layout; - layout.LayoutRect(itemRect, aLayout); - aResultArray[0] = layout.Rect().iTl; - aResultArray[1] = layout.Rect().iTl + layout.Rect().Size(); - } - -TSize ListBoxItemSize(CEikListBox &aListBox, CFormattedCellListBoxItemDrawer *aItemDrawer) - { - TSize size = TSize( aItemDrawer->LafItemSize().iWidth, aListBox.View()->ItemSize().iHeight ); - return size; - } - -// ================= MEMBER FUNCTIONS ======================= - -// --------------------------------------------------------- -// CBrowserPopupList::CBrowserPopupList() -// -// --------------------------------------------------------- -// -CBrowserPopupList::CBrowserPopupList(TParentType aParentType):CAknSingleGraphicPopupMenuStyleListBox() - { - iParentType = aParentType; - } - -// --------------------------------------------------------- -// CBrowserPopupList::~CBrowserPopupList() -// -// --------------------------------------------------------- -// -CBrowserPopupList::~CBrowserPopupList() - { - } - -// --------------------------------------------------------- -// CBrowserPopupList::ConstructL -// -// --------------------------------------------------------- -// -void CBrowserPopupList::ConstructL(const CCoeControl* aParent, TInt aFlags) - { - CAknSingleGraphicPopupMenuStyleListBox::ConstructL( aParent, aFlags); - } - -// --------------------------------------------------------- -// CBrowserPopupList::SetHighLight -// Sets the highlight of the list -// --------------------------------------------------------- -// -void CBrowserPopupList::SetHighLight(TBool aHighLight) - { -#ifdef BRDO_SINGLE_CLICK_ENABLED_FF - iItemDrawer->SetFlags( CListItemDrawer::ESingleClickEnabled ); -#endif - iListBoxFlags = ( aHighLight ? iListBoxFlags &~ CEikListBox::EDisableHighlight : iListBoxFlags | CEikListBox::EDisableHighlight ); - if ( aHighLight ) - { - iItemDrawer->ClearFlags( CListItemDrawer::EDisableHighlight ); - } - else - { - iItemDrawer->SetFlags( CListItemDrawer::EDisableHighlight ); - } - } - -// --------------------------------------------------------- -// CBrowserPopupList::HighLightEnabled() -// Enables the highlight in the list -// --------------------------------------------------------- -// -TBool CBrowserPopupList::HighLightEnabled() - { - return !( iItemDrawer->Flags() & CListItemDrawer::EDisableHighlight ); - } - -// --------------------------------------------------------- -// CBrowserPopupList::SizeChanged() -// sets the inner layout -// --------------------------------------------------------- -// -void CBrowserPopupList::SizeChanged() - { - CAknSingleGraphicPopupMenuStyleListBox::SizeChanged(); - TAknWindowLineLayout windowLineLayout; - TAknWindowLineLayout windowLineLayoutTmp; - TAknWindowLineLayout windowLineLayoutTmp2; - TAknLayoutRect layoutRect; - TPoint area[2] ; - TRgb color; - CEikFormattedCellListBox &aListBox = *this; - CFormattedCellListBoxItemDrawer *itemDrawer = aListBox.ItemDrawer(); - AknListBoxLayouts::SetupStandardListBox(aListBox); - - AknListBoxLayouts::SetupListboxPos( aListBox, AppLayout::list_single_graphic_popup_wml_pane( 0 )); - - GfxPos(area, - AknLayoutScalable_Apps::list_single_graphic_popup_wml_pane_g1(), - ListBoxItemSize(*this, ItemDrawer()) ); - - AknListBoxLayouts::SetupFormGfxCell(aListBox, - itemDrawer, - 0, - AknLayoutScalable_Apps::list_single_graphic_popup_wml_pane_g2(), - area[0], - area[1]); - - //sets the rectangle of the text - TextPos(area, - AknLayoutScalable_Apps::list_single_graphic_popup_wml_pane_t1( ), - ListBoxItemSize(*this, ItemDrawer()) ); - AknListBoxLayouts::SetupFormAntiFlickerTextCell(aListBox, - itemDrawer, - 1, - AknLayoutScalable_Apps::list_single_graphic_popup_wml_pane_t1( ), - area[0], - area[1]); - } - -// --------------------------------------------------------- -// CBrowserPopupList::Draw() -// --------------------------------------------------------- -// -void CBrowserPopupList::Draw(const TRect& /*aRect*/) const - { - TRect windowRect = this->Rect(); - CEikFormattedCellListBox::Draw( windowRect ); - return; - } - - -// ================= CBrowserAdaptiveListPopup ======================= - - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::CBrowserAdaptiveListPopup() -// --------------------------------------------------------- -// -CBrowserAdaptiveListPopup::CBrowserAdaptiveListPopup( CEikEdwin* aGotoPaneEdit, - CCoeControl* aParent, TParentType aParentType, TBool aSearchFeature): - iEditor( aGotoPaneEdit ), iParent( aParent ), - iParentType( aParentType ), iSearchFeature( aSearchFeature ) - { - iTouchSupported = AknLayoutUtils::PenEnabled(); - } - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::ConstructL(const TRect& aRect) -// EPOC two-phased constructor -// --------------------------------------------------------- -void CBrowserAdaptiveListPopup::ConstructL( ) - { - CreateWindowL(); -//-------- list ------ - iList = new(ELeave) CBrowserPopupList( iParentType ); -#ifdef BRDO_SINGLE_CLICK_ENABLED_FF - iList->ConstructL( this , CEikListBox::EDisableItemSpecificMenu ); -#else - iList->ConstructL( this , CEikListBox::ELeftDownInViewRect ); -#endif - iList->SetContainerWindowL( *this ); - if (iTouchSupported) - { - iList->SetListBoxObserver( this ); - } - iList->CreateScrollBarFrameL( ETrue ); - iList->SetMopParent(iParent); - iList->ScrollBarFrame()->SetScrollBarVisibilityL( - CEikScrollBarFrame::EOff, - CEikScrollBarFrame::EAuto); - iList->ScrollBarFrame()->SetTypeOfVScrollBar( CEikScrollBarFrame::EDoubleSpan ); - iList->UpdateScrollBarsL(); - iList->SetBorder(TGulBorder::ESingleBlack); - iList->ItemDrawer()->FormattedCellData()->EnableMarqueeL( ETrue ); -//---------- items storing arrays --------- - iItems = new(ELeave) CDesCArrayFlat(KArrayGranularity); - iItemNames = new(ELeave) CDesCArrayFlat(KArrayGranularity); - iItemNamesToShow = new(ELeave) CDesCArrayFlat(KArrayGranularity); -//---------- model ---------- - CTextListBoxModel* model = iList->Model(); - model->SetItemTextArray( iItemNamesToShow ); - model->SetOwnershipType( ELbmDoesNotOwnItemArray ); -//---------- icons ----------- - SetIconsL(); -//--------- other -------- - iFirstGotoContent = KNullDesC().AllocL(); - iPrevGotoContent = KNullDesC().AllocL(); - iPoppedUp = EFalse; - iDirectoryMode = ETrue; - iOpenCBA=EFalse; - iItemDrawer = iList->ItemDrawer(); - iPrevItem = -2; - iUrlCompletionMode = EFalse; - iRecentUrlStore = CBrowserAppUi::Static()->RecentUrlStore(); - if (!iRecentUrlStore) - { - User::Leave(KErrCouldNotConnect); - } - iListScrollTimer = CPeriodic::NewL(CActive::EPriorityIdle); - } - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::~CBrowserAdaptiveListPopup() -// Destructor -// --------------------------------------------------------- -CBrowserAdaptiveListPopup::~CBrowserAdaptiveListPopup() - { - delete iList; - delete iItems; - delete iItemNames; - delete iItemNamesToShow; - delete iPrevGotoContent; - delete iFirstGotoContent; - if(iListScrollTimer) - { - iListScrollTimer->Cancel(); - delete iListScrollTimer; - } -} - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::SetOrdinalPosition -// --------------------------------------------------------- -// -void CBrowserAdaptiveListPopup::SetOrdinalPosition( TInt aPos ) - { - Window().SetOrdinalPosition( aPos ); - } - -void CBrowserAdaptiveListPopup::HandlePointerEventL(const TPointerEvent& aPointerEvent) - { - if (iList && iTouchSupported) - { - //using ComponentControl(0) instead of iList because need access to a - //protected function - ComponentControl(0)->HandlePointerEventL( aPointerEvent ); - } - } - -void CBrowserAdaptiveListPopup::HandleListBoxEventL(CEikListBox* aListBox,TListBoxEvent aEventType) - { - if (iList && aListBox == iList && iTouchSupported) - { - switch (aEventType) - { - case MEikListBoxObserver::EEventItemDoubleClicked: - { - TKeyEvent keyEvent; - keyEvent.iModifiers = 0; - keyEvent.iRepeats = 0; - keyEvent.iCode = EKeyDevice3; - keyEvent.iScanCode = EStdKeyDevice3; - if ( iParentType == EBookmarksGotoPane ) - { - CCoeEnv::Static()->SimulateKeyEventL( keyEvent, EEventKeyDown ); - } - CCoeEnv::Static()->SimulateKeyEventL( keyEvent, EEventKey ); - if ( iParentType == EBookmarksGotoPane ) - { - CCoeEnv::Static()->SimulateKeyEventL( keyEvent, EEventKeyUp ); - } - } - break; - case MEikListBoxObserver::EEventItemClicked: -#ifdef BRDO_SINGLE_CLICK_ENABLED_FF - case MEikListBoxObserver::EEventItemSingleClicked: -#endif - HandleItemClickedL( aListBox ); - break; - default: - break; - } - } - } - -void CBrowserAdaptiveListPopup::HandleItemClickedL( CEikListBox* aListBox ) - { - //the first time - if ( !iList->HighLightEnabled() ) - { - iList->SetHighLight( ETrue ); - - //save the original content - if ( !iFirstGotoContent ) - { - delete iFirstGotoContent; - iFirstGotoContent = NULL; - } - iFirstGotoContent = iEditor->GetTextInHBufL(); - if ( !iFirstGotoContent ) - { - iFirstGotoContent = KNullDesC().AllocL(); - } - } - TInt index = aListBox->CurrentItemIndex(); - index = iItems->Count() - index - 1; - TPtrC16 item((*iItems)[ index ] ); - TPtrC rightSide; - - //cut the slash from the end if needed - //permanent sollution until AHLE does not - //solve this problem related to ID: TMCN-5TTRXV error - if ( item[item.Length() - 1] != KSlash ) - { - rightSide.Set( item.Left( item.Length() ) ); - } - else - { - rightSide.Set( item.Left( item.Length() - 1 ) ); - } - - //if true then append the suffix(rightSide), to the - //user-typed data - //else just use the recent URLs text(rightSide) only - if ( iUrlCompletionMode ) - { - HBufC* currentCompletion = HBufC::NewLC( - iFirstGotoContent->Des().Length() + rightSide.Length() + 1 ); - TPtr currentCompletionPtr = currentCompletion->Des(); - - currentCompletionPtr.Copy( iFirstGotoContent->Des() ); - currentCompletionPtr.Append( rightSide ); - currentCompletionPtr.ZeroTerminate(); - iEditor->SetTextL( currentCompletion ); - iEditor->SetCursorPosL( currentCompletionPtr.Length(), EFalse ); - CleanupStack::PopAndDestroy( currentCompletion ); - } - else - { - iEditor->SetTextL( &rightSide ); - iEditor->SetCursorPosL( rightSide.Length(), EFalse ); - } - iEditor->HandleTextChangedL(); - - delete iPrevGotoContent; - iPrevGotoContent = NULL; - iPrevGotoContent = item.AllocL(); - iEditor->DrawNow(); - //change the CBA depending on whether the highlight is - //on url or domain - CBrowserAppUi::Static()->UpdateCbaL(); - } - - -//------------------------------------------------------------------ -// CBrowserAdaptiveListPopup::ShowSingleItemPopupListWithGraphicsL(TBool aShowTitle) -// shows "List pane for single item with graphic" -//------------------------------------------------------------------ -void CBrowserAdaptiveListPopup::ShowPopupListL(TBool aRelayout) - { - TAknWindowLineLayout windowLineLayout; - TAknWindowLineLayout windowLineLayoutTmp; - TAknWindowLineLayout windowLineLayoutMain; - TAknWindowLineLayout windowLineLayoutMainTmp; - TAknWindowLineLayout windowLineLayoutLW; - TAknWindowLineLayout windowLineLayoutLWTmp; - TAknWindowLineLayout windowLineLayoutSLW; - TAknWindowLineLayout windowLineLayoutSLWTmp; - TAknLayoutRect layoutRect; - TAknLayoutRect layoutMainRect; - TAknLayoutRect layoutLWRect; - TAknLayoutRect layoutSLWRect; - - //turn of the highlight - iList->SetHighLight( EFalse ); - //clear arrays - iItems->Reset(); - iItemNames->Reset(); - iItemNamesToShow->Reset(); - - TInt offset; - HBufC* newText; - //get create and get the string from the edit field - if ( iEditor->TextLength() > 0 ) - { - newText = iEditor->GetTextInHBufL(); - CleanupStack::PushL( newText ); - //cut the protokolidentifier from the string - offset = newText->Find( KProtocolIdentifier ); - if ( offset == KErrNotFound ) - { - offset = newText->Length(); - } - else - { - offset = newText->Length() - offset - 3; - } - } - else - { - offset = 0; - newText = KNullDesC().AllocLC(); - } - TPtrC trimmedContent( newText->Right( offset ) ); - TBuf buf; - - //find out if the user typed a ".", if so, bring up the url completion list - TInt periodPos = trimmedContent.LocateReverse( TChar(KPeriod) ); - if ((periodPos != KErrNotFound) && ((periodPos + 1) == trimmedContent.Length())) - { - //add the url completion entries to the popup list - iUrlCompletionMode = ETrue; - CreateURLCompletionListL(); - } - else - { - iUrlCompletionMode = EFalse; - //only include recent URLs if not including the url completion items - iRecentUrlStore->GetData( *iItems, *iItemNames, trimmedContent ); - - //sort alphabetically and... - for(TInt i=0; iCount(); i++) - { - for(TInt j=0; jCount()-1; j++) - { - if ((*iItems)[j].CompareF((*iItems)[j+1]) > 0) - { - RBuf tmp; - CleanupClosePushL(tmp); - tmp.Create((*iItems)[j]); - iItems->Delete(j); - iItems->InsertL( j+1, tmp ); - tmp.Close(); - tmp.Create((*iItemNames)[j]); - iItemNames->Delete(j); - iItemNames->InsertL( j+1, tmp ); - CleanupStack::PopAndDestroy( &tmp ); - } - } - } - //and move url with params i.e google.fi/m=q?xyz do the back of list - TInt i = 0; //iterator - TInt j = 0; //counter - while (i < (iItems->Count()-1) && j < iItems->Count()) - { - TUriParser8 parser; - RBuf8 out; - CleanupClosePushL( out ); - out.Create( (*iItems)[i].Length() ); - RBuf in; - CleanupClosePushL( in ); - in.Create( (*iItems)[i] ); - - CnvUtfConverter::ConvertFromUnicodeToUtf8(out, in ); - - if (( parser.Parse( out ) == KErrNone ) && //if parse ok and - ( parser.Extract( EUriPath ).Length() > 0 || //url contains path - parser.Extract( EUriQuery ).Length() > 0 )) //or query item - { - iItems->AppendL( (*iItems)[i] );//move item to back of the list - iItems->Delete( i ); - iItemNames->AppendL( (*iItemNames)[i] ); - iItemNames->Delete( i ); - } - else - { - i++; - } - j++; - - CleanupStack::PopAndDestroy( &in ); - CleanupStack::PopAndDestroy( &out ); - }; - - - } - iDirectoryMode = EFalse; - CleanupStack::PopAndDestroy();//newText - TInt k; - k = iItems->Count(); - iItemNo = k; - TInt length = KListLengthToShow - 2; - if ( k > 0 ) - { - TInt j; - TPtrC textToShow; - TPtrC itemJ; - //changeing the order - for (j=k-1; j>-1; j--) - { - itemJ.Set( (*iItems)[j] ); - textToShow.Set( itemJ.Left( length ) ); - if ( iDirectoryMode ) - { - //directories and items - if ( itemJ[ itemJ.Length() - 1 ] == KSlash ) - { - //item - buf.Format( _L( "%S%S" ), &KItemTab, &textToShow ); - } - else - { - //directory - buf.Format( _L( "%S%S" ), &KDirTab, &textToShow ); - } - } - else - { - //items only - buf.Format( _L( "%S%S" ), &KItemTab, &textToShow ); - } - iItemNamesToShow->AppendL( buf ); - } - //set how many item will be shown - -#ifdef BRDO_TOUCH_ENABLED_FF - TInt appWidth = iEikonEnv->EikAppUi()->ApplicationRect().Width(); - TInt appHeight = iEikonEnv->EikAppUi()->ApplicationRect().Height(); - //For landscape mode only 5 items can be shown on the screen - if(appWidth > appHeight) - iMaxRecentUrlsToShow = KLandscapeListItems; -#endif - TInt itemstoshow; - if ( k > iMaxRecentUrlsToShow) - { - itemstoshow = iMaxRecentUrlsToShow; - } - else - { - itemstoshow = k; - } - //resetting to original value - iMaxRecentUrlsToShow = CBrowserAppUi::Static()->ContentView()->ApiProvider().Preferences().MaxRecentUrls(); - - //set the main rect of the window - // fixing bug RFON-7E2PPV, don't use ApplicationRect() - TRect rect; - AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, rect); - windowLineLayoutMain = AknLayout::main_pane( rect, 0, 2, 1 ); - windowLineLayoutMainTmp = windowLineLayoutMain; - layoutMainRect.LayoutRect( rect, windowLineLayoutMainTmp ); - - - windowLineLayoutLW = AppLayout::popup_wml_address_window( 1, itemstoshow ); - - windowLineLayoutLWTmp = windowLineLayoutLW; - layoutLWRect.LayoutRect( layoutMainRect.Rect(), windowLineLayoutLWTmp ); - windowLineLayoutSLW = AknLayoutScalable_Apps::listscroll_popup_wml_pane(); - windowLineLayoutSLWTmp = windowLineLayoutSLW; - layoutSLWRect.LayoutRect( layoutLWRect.Rect(), windowLineLayoutSLWTmp ); - windowLineLayout = AppLayout::list_wml_pane( itemstoshow - 1 ); - windowLineLayoutTmp = windowLineLayout; - layoutRect.LayoutRect( layoutLWRect.Rect(), windowLineLayoutTmp ); - - TRect rectTemp(layoutSLWRect.Rect()); - // force listbox on top of goto pane - rectTemp.iBr.iY = iParent->PositionRelativeToScreen().iY; - rectTemp.iTl.iX = iParent->PositionRelativeToScreen().iX; - // shrink list box to size of list -#ifdef BRDO_TOUCH_ENABLED_FF - TInt listH = KListHeight; -#else - TInt listH = AppLayout::list_single_graphic_popup_wml_pane( 0 ).iH; -#endif - rectTemp.iTl.iY = rectTemp.iBr.iY - (listH * itemstoshow); - // set bottom right x axis to full width - rectTemp.iBr.iX = rect.iBr.iX; - - // we only want to call SetRect() when we have a relayout, otherwise just - // scroll the list to the correct position. Doing this will reduce the amount - // of flicker seen while typing into the gotopane - if ((rectTemp.Size() != Rect().Size()) || aRelayout) - { - //set the window rect - SetRect( rectTemp ); - } - rectTemp = TRect( 0, 0, Rect().Width(), Rect().Height() ); - if ( rectTemp!=iList->Rect() ) - { - //set the rect of the list - iList->SetRect( rectTemp ); - } - else - { - // this scrolls list to the correct position, probably still does too much work - AknListBoxLayouts::SetupListboxPos( *iList, AppLayout::list_single_graphic_popup_wml_pane( 0 )); - } - //the last item is visible - //ScrollToMakeItemVisible scrolls only after some delay - if(!iListScrollTimer->IsActive()) - { - iListScrollTimer->Start(20, 0, - TCallBack(ListScrollTimerCallBack, this)); - } - -#ifdef BRDO_TOUCH_ENABLED_FF - const CFont* pFont = AknLayoutUtils::FontFromId(EAknLogicalFontPrimaryFont); - TFontSpec fontSpec = pFont->FontSpecInTwips(); - fontSpec.iHeight =KFontHeight; - - CFont* fontNew; - CEikonEnv::Static()->ScreenDevice()->GetNearestFontInTwips( ( CFont*&)fontNew, fontSpec ); - CFormattedCellListBoxData *pLBData = iList->ItemDrawer()->ColumnData(); - iList->SetItemHeightL(KListHeight); - - if(pLBData && pFont) - { - pLBData->SetSubCellFontL(1,fontNew); - } - - CEikonEnv::Static()->ScreenDevice()->ReleaseFont(fontNew); -#endif - - MakeVisible( ETrue ); - iPoppedUp = ETrue; - DrawNow(); - iList->Draw(rectTemp); - } - else - { - MakeVisible( EFalse ); - iPoppedUp = EFalse; - CBrowserAppUi::Static()->UpdateCbaL(); - } - if (!IsActivated()) - { - ActivateL(); - } - iPrevItem = -2; - } - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::CreateURLCompletionListL -// --------------------------------------------------------- -// -void CBrowserAdaptiveListPopup::CreateURLCompletionListL() - { - _LIT(KSeparator, ","); - - if (iUrlSuffixBuf) - { - TPtrC urlSuffix(iUrlSuffixBuf->Des()); - TInt index(urlSuffix.FindF(KSeparator)); - TInt offset = 0; - - while (index != KErrNotFound) - { - // Omit empty string - if (index > 0) - { - iItems->AppendL( urlSuffix.Mid(offset,index) ); - } - - offset += (index + 1); - TPtrC remainder(urlSuffix.Mid(offset)); - index = remainder.FindF(KSeparator); - } - - // Cover the cases where we only have one suffix in the list and/or - // the last suffix in the list does not have a comma - if (offset < urlSuffix.Length()) - { - TPtrC remainderB(urlSuffix.Mid(offset, urlSuffix.Length() - offset)); - iItems->AppendL( remainderB ); - } - } - } - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::HandleControlEventL -// if the content of the edit box changes -// --------------------------------------------------------- -// -void CBrowserAdaptiveListPopup::HandleControlEventL(CCoeControl* aControl,enum MCoeControlObserver::TCoeEvent aEventType) - { - CEikEdwin* edwin = ( CEikEdwin* )aControl; - // the content of the edit box changes - if ( MCoeControlObserver::EEventStateChanged == aEventType ) - { - HBufC* newText = edwin->GetTextInHBufL(); - if (!newText) - { - newText = KNullDesC().AllocL(); - } - CleanupStack::PushL( newText ); - //check whether the last content is different to the one in the editbox - if ( !iPrevGotoContent || iPrevGotoContent->Compare( *newText ) ) - { - ShowPopupListL(); - delete iPrevGotoContent; - iPrevGotoContent = NULL; - iPrevGotoContent = newText; - CleanupStack::Pop( newText );//ownership is taken - } - else - { - if ( !iPrevGotoContent ) - { - CleanupStack::PopAndDestroy( newText ); - } - else - { - ShowPopupListL(); - delete iPrevGotoContent; - iPrevGotoContent = NULL; - iPrevGotoContent = newText; - CleanupStack::Pop( newText );//ownership is taken - } - } - //change the CBA - if ( iOpenCBA ) - { - iOpenCBA = EFalse; - CBrowserAppUi::Static()->UpdateCbaL(); - } - } - } - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::CountComponentControls -// -// --------------------------------------------------------- -// -TInt CBrowserAdaptiveListPopup::CountComponentControls() const - { - if ( iList == NULL ) - { - return 0; - } - return 1; - } - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::ComponentControl -// -// --------------------------------------------------------- -// -CCoeControl* CBrowserAdaptiveListPopup::ComponentControl(TInt aIndex) const - { - if (aIndex==0) - { - return iList; - } - else - { - return NULL; - } - } - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::OfferKeyEventL -// Handles key events -// --------------------------------------------------------- -// -TKeyResponse CBrowserAdaptiveListPopup::OfferKeyEventL -( const TKeyEvent& aKeyEvent, TEventCode aType ) - { - TKeyResponse resp = EKeyWasNotConsumed; - if (( iPoppedUp && - !CBrowserAppUi::Static()->ContentView()->MenuBar()->MenuPane()->IsVisible() && - (CBrowserAppUi::Static()->LastActiveViewId() == KUidBrowserContentViewId) ) || (( iPoppedUp ) && - (CBrowserAppUi::Static()->LastActiveViewId() != KUidBrowserContentViewId))) - { - TInt currIndex = iItems->Count() - iList->CurrentItemIndex() - 1; - - //the joystick is pressed - if ( aKeyEvent.iCode == EKeyOK ) - { - if ( ( iList->HighLightEnabled() ) - && ( iDirectoryMode ) - && ( (*iItems)[ currIndex ][(*iItems)[ currIndex ].Length() - 1] != KSlash ) ) - { - SetDirectoryModeL( EFalse ); - resp = EKeyWasConsumed; - } - else - { - if (iEditor->TextLength()!=0) - { - HidePopupL(); - } - } - } - - //the joystick is pressed up - else if ( aKeyEvent.iCode == EKeyLeftUpArrow // Northwest - || aKeyEvent.iCode == EStdKeyDevice10 // : Extra KeyEvent supports diagonal event simulator wedge - || aKeyEvent.iCode == EKeyUpArrow // North - || aKeyEvent.iCode == EKeyRightUpArrow // Northeast - || aKeyEvent.iCode == EStdKeyDevice11 ) // : Extra KeyEvent supports diagonal event simulator wedge - { - resp = EKeyWasConsumed; - //the first time - if ( !iList->HighLightEnabled() ) - { - iList->SetHighLight( ETrue ); - currIndex = iList->Model()->NumberOfItems()-1; - iList->ScrollToMakeItemVisible( currIndex ); - iList->SetCurrentItemIndex( currIndex ); - DrawNow(); - //save the original content - if ( iFirstGotoContent != NULL ) - { - delete iFirstGotoContent; - iFirstGotoContent = NULL; - } - iFirstGotoContent = iEditor->GetTextInHBufL(); - if (iFirstGotoContent == NULL) - { - iFirstGotoContent = KNullDesC().AllocL(); - } - } - else - { - if( iSearchFeature ) - { - if( iList->CurrentItemIndex() == 0 ) - { - resp = EKeyWasConsumed; - return resp; - } - } - resp=iList->OfferKeyEventL( aKeyEvent, aType ); - } - if ( currIndex > -1 ) - { - //copy the selected item to edit field - TPtrC16 item; - TPtrC rightSide; - TInt newIndex; - newIndex = iItems->Count() - iList->CurrentItemIndex() - 1; - item.Set( (*iItems)[ newIndex ] ); - //cut the slash from the end if needed - //permanent sollution until AHLE does not - //solve this problem related to ID: TMCN-5TTRXV error - - //if URL completion, then we want to append the item to the item in the edit field - if (iUrlCompletionMode) - { - TPtr16 ptr = iFirstGotoContent->Des(); - - HBufC* buf = HBufC::NewLC(ptr.Length() + item.Length() + 1); - - buf->Des().Copy(ptr); - buf->Des().Append(item); - buf->Des().ZeroTerminate(); - - - rightSide.Set(buf->Des()); - - iEditor->SetTextL( &rightSide ); - iEditor->SetCursorPosL( rightSide.Length(), EFalse ); - - CleanupStack::PopAndDestroy(); //buf - } - else - { - if ( (*iItems)[ newIndex ][(*iItems)[ newIndex ].Length() - 1] != KSlash ) - { - rightSide.Set( item.Left( item.Length() ) ); - } - else - { - rightSide.Set( item.Left( item.Length() - 1 ) ); - } - iEditor->SetTextL( &rightSide ); - iEditor->SetCursorPosL( rightSide.Length(), EFalse ); - } - delete iPrevGotoContent; - iPrevGotoContent = NULL; - iPrevGotoContent = item.AllocL(); - iEditor->DrawNow(); - //change the CBA depending on whether the highlight is - //on url or domain - if ( ( (*iItems)[ newIndex ][(*iItems)[ newIndex ].Length() - 1] != KSlash ) && iDirectoryMode ) - { - iOpenCBA = ETrue; - } - else - { - iOpenCBA = EFalse; - } - CBrowserAppUi::Static()->UpdateCbaL(); - } - } - - //the joystisk is pressed down - else if ( aKeyEvent.iCode == EKeyLeftDownArrow // Southwest - || aKeyEvent.iCode == EStdKeyDevice13 // : Extra KeyEvent supports diagonal event simulator wedge - || aKeyEvent.iCode == EKeyDownArrow // South - || aKeyEvent.iCode == EKeyRightDownArrow // Southeast - || aKeyEvent.iCode == EStdKeyDevice12 ) // : Extra KeyEvent supports diagonal event simulator wedge - { - resp = EKeyWasConsumed; - if( iSearchFeature ) - { - if ( iPrevItem <= 0 ) - { - if(! iList->HighLightEnabled() ) - { - resp = EKeyWasNotConsumed; - return resp; - } - } - } - //it was the last item - if ( iPrevItem == 0 ) - { - //write back the original string - iList->SetHighLight( EFalse ); - iEditor->SetTextL( iFirstGotoContent ); - iEditor->HandleTextChangedL(); - iEditor->SetCursorPosL( iFirstGotoContent->Length(), EFalse ); - delete iPrevGotoContent; - iPrevGotoContent = NULL; - iPrevGotoContent = iFirstGotoContent->AllocL(); - iEditor->DrawNow(); - DrawNow(); - //change the CBA - if ( iOpenCBA ) - { - iOpenCBA = EFalse; - CBrowserAppUi::Static()->UpdateCbaL(); - } - return resp; - } - else if ( ( currIndex > -1 ) && iList->HighLightEnabled() ) - { - //write the selected items string to the editor - TPtrC16 item; - TPtrC rightSide; - TInt newIndex; - resp = iList->OfferKeyEventL( aKeyEvent, aType ); - newIndex = iItems->Count() - iList->CurrentItemIndex() - 1; - item.Set( (*iItems)[ newIndex ] ); - //cut the slash from the end if needed - //permanent sollution until AHLE does not - //solve this problem related to ID: TMCN-5TTRXV error - if ( (*iItems)[ newIndex ][(*iItems)[ newIndex ].Length() - 1] != KSlash ) - { - rightSide.Set( item.Left( item.Length() ) ); - } - else - { - rightSide.Set( item.Left( item.Length() - 1 ) ); - } - - //if true then append the suffix (rightSide), to the - //user-typed data - //else just use the recent URLs text(rightSide) only - if ( iUrlCompletionMode ) - { - HBufC* currentCompletion = HBufC::NewLC( - iFirstGotoContent->Des().Length() + rightSide.Length() + 1 ); - TPtr currentCompletionPtr = currentCompletion->Des(); - - currentCompletionPtr.Copy( iFirstGotoContent->Des() ); - currentCompletionPtr.Append( rightSide ); - currentCompletionPtr.ZeroTerminate(); - iEditor->SetTextL( currentCompletion ); - iEditor->SetCursorPosL( currentCompletionPtr.Length(), EFalse ); - CleanupStack::PopAndDestroy( currentCompletion ); - } - else - { - iEditor->SetTextL( &rightSide ); - iEditor->SetCursorPosL( rightSide.Length(), EFalse ); - } - iEditor->HandleTextChangedL(); - - if ( iPrevGotoContent != NULL ) - { - delete iPrevGotoContent; - iPrevGotoContent = NULL; - } - iPrevGotoContent = item.AllocL(); - iEditor->DrawNow(); - //change the CBA depending on whether the highlight is - //on url or domain - if ( ( (*iItems)[ newIndex ][(*iItems)[ newIndex ].Length() - 1] != KSlash ) && iDirectoryMode ) - { - iOpenCBA = ETrue; - } - else - { - iOpenCBA = EFalse; - } - CBrowserAppUi::Static()->UpdateCbaL(); - } - } - - if ( iList->HighLightEnabled() ) - { - iPrevItem = currIndex; - } - } - return resp; - } - - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::HidePopupL -// Hides the popup list -// --------------------------------------------------------- -// -void CBrowserAdaptiveListPopup::HidePopupL() - { - //clear the lists - if ( iPoppedUp ) - { - HBufC* newText = HBufC::NewLC( iEditor->TextLength() ); - TPtr newTextDes = newText->Des(); - iEditor->GetText( newTextDes ); - iEditor->ClearSelectionL(); - iEditor->SetTextL( newText ); - iEditor->SetCursorPosL( iEditor->TextLength(), EFalse ); - CleanupStack::PopAndDestroy( newText ); - iItemNames->Reset(); - iList->Reset(); - if (!IsActivated()) - { - ActivateL(); - } - MakeVisible(EFalse); - DrawNow(); - iPrevItem = -2; - iPoppedUp = EFalse; - // highlight a directory, cancel goto pane - // activate goto pane again -> softkey problem - iOpenCBA = EFalse; - CBrowserAppUi::Static()->UpdateCbaL(); - } - } - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::IsInDirectoryMode -// gives back the directory mode -// --------------------------------------------------------- -// -TBool CBrowserAdaptiveListPopup::IsInDirectoryMode() - { - return iDirectoryMode; - } - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::SetDirectoryMode -// Sets the directory mode -// --------------------------------------------------------- -// -void CBrowserAdaptiveListPopup::SetDirectoryModeL(TBool aDirMode) - { - iDirectoryMode = aDirMode; - if ( aDirMode == EFalse ) - { - //put the slash to the back of the editor fileds string - //it will show the directory mode - TInt length; - length = iEditor->TextLength() + 1; - HBufC* newText = HBufC::NewLC( length ); - TPtr newTextDes = newText->Des(); - iEditor->GetText( newTextDes ); - newTextDes.Append( TChar(KSlash) ); - iEditor->SetTextL( newText ); - iEditor->SetCursorPosL( length, EFalse ); - CleanupStack::PopAndDestroy( newText ); - iEditor->DrawNow(); - ShowPopupListL(); - //change the CBA - if ( iOpenCBA ) - { - iOpenCBA = EFalse; - CBrowserAppUi::Static()->UpdateCbaL(); - } - } - return; - } - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::IsOpenDirToShow -// Show which CBA is about to show -// --------------------------------------------------------- -// -TBool CBrowserAdaptiveListPopup::IsOpenDirToShow() -{ - return iOpenCBA; -} - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::IsPoppedUp -// Show whether the list is popped up or not -// --------------------------------------------------------- -// -TBool CBrowserAdaptiveListPopup::IsPoppedUp() -{ - return iPoppedUp; -} - - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::HandleResourceChange -// If new skin is set the icons will be reloaded -// --------------------------------------------------------- -// -void CBrowserAdaptiveListPopup::HandleResourceChange( TInt aType ) - { - TRAP_IGNORE( HandleResourceChangeL( aType ) ); - } - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::HandleResourceChangeL -// If new skin is set the icons will be reloaded -// --------------------------------------------------------- -// -void CBrowserAdaptiveListPopup::HandleResourceChangeL( TInt aType ) - { - if (( aType == KAknsMessageSkinChange )|| - ( aType == KEikDynamicLayoutVariantSwitch ) ) - { - CArrayPtr* array = - iList->ItemDrawer()->ColumnData()->IconArray(); - - array->ResetAndDestroy(); - delete array; - SetIconsL(); - } - - CCoeControl::HandleResourceChange(aType); - if (aType == KEikDynamicLayoutVariantSwitch) - { - TRect rect; - if (AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, rect)) - { - SetRect(rect); - } - } - - if ( ( aType == KEikDynamicLayoutVariantSwitch ) && ( iPoppedUp ) ) - { - - if ( AknLayoutUtils::PenEnabled() ) - { - SetOrdinalPosition( 0 ); - } - - TInt selectionIndex = -1; - HBufC* originalText = NULL; - TInt popitem( 0 ); - if ( iList->HighLightEnabled() ) - { - selectionIndex = iList->CurrentItemIndex(); - //save the editors content - originalText = iEditor->GetTextInHBufL(); - if (originalText == NULL) - { - originalText = KNullDesC().AllocL(); - } - CleanupStack::PushL( originalText ); - ++popitem; - //write back the first string - iEditor->SetTextL( iFirstGotoContent ); - iEditor->HandleTextChangedL(); - } - ShowPopupListL(ETrue); - if ( selectionIndex > -1) - { - iEditor->SetTextL( originalText ); - iEditor->SetCursorPosL( originalText->Length(), EFalse ); - iEditor->HandleTextChangedL(); - iList->SetHighLight( ETrue ); - iList->ScrollToMakeItemVisible( selectionIndex ); - iList->SetCurrentItemIndex( selectionIndex ); - DrawNow(); - iEditor->DrawNow(); - } - if ( popitem ) - { - CleanupStack::PopAndDestroy( popitem ); // originalText - } - } - } - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::SetIconsL() -// --------------------------------------------------------- -// -void CBrowserAdaptiveListPopup::SetIconsL() -{ - CArrayPtr* icons = - new(ELeave) CAknIconArray( KMaxIcons ); - CleanupStack::PushL(icons); // PUSH Icon - CGulIcon* newIcon; - CFbsBitmap *newIconBmp; - CFbsBitmap *newIconMaskBmp; - - TParse* fp = new(ELeave) TParse(); - CleanupStack::PushL(fp); - TInt err = fp->Set(KBrowserDirAndFile, &KDC_APP_BITMAP_DIR, NULL); - if (err != KErrNone) - { - User::Leave(err); - } - TBuf iconFile= fp->FullName(); - CleanupStack::PopAndDestroy(fp); - - MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance(); - AknsUtils::CreateIconLC( skinInstance, - KAknsIIDQgnPropWmlFolderAdap, - newIconBmp, - newIconMaskBmp, - iconFile, - EMbmBrowserQgn_prop_wml_folder_adap, - EMbmBrowserQgn_prop_wml_folder_adap_mask); - newIcon = CGulIcon::NewL( newIconBmp, newIconMaskBmp); - CleanupStack::Pop(2); - CleanupStack::PushL(newIcon); - icons->AppendL( newIcon ); - CleanupStack::Pop(newIcon); - AknsUtils::CreateIconLC( skinInstance, - KAknsIIDQgnPropWmlBmAdap, - newIconBmp, - newIconMaskBmp, - iconFile, - EMbmBrowserQgn_prop_wml_bm_adap, - EMbmBrowserQgn_prop_wml_bm_adap_mask); - newIcon = CGulIcon::NewL( newIconBmp, newIconMaskBmp); - CleanupStack::Pop(2); - CleanupStack::PushL(newIcon); - icons->AppendL( newIcon ); - CleanupStack::Pop(newIcon); - iList->ItemDrawer()->FormattedCellData()->SetIconArrayL(icons); - CleanupStack::Pop(); // POP Icon -} - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::SetUrlSuffixList() -// --------------------------------------------------------- -// -void CBrowserAdaptiveListPopup::SetUrlSuffixList(HBufC* urlSuffixList) - { - iUrlSuffixBuf = urlSuffixList; - } - -// --------------------------------------------------------- -// CBrowserAdaptiveListPopup::SetMaxRecentUrls() -// --------------------------------------------------------- -// -void CBrowserAdaptiveListPopup::SetMaxRecentUrls (TInt maxRecentUrls) - { - iMaxRecentUrlsToShow = maxRecentUrls; - } - -TInt CBrowserAdaptiveListPopup::ListScrollTimerCallBack(TAny* aAny) - { - CBrowserAdaptiveListPopup* self = static_cast( aAny ); - self->DoListScrolling(); - self->iListScrollTimer->Cancel(); - return KErrNone; - } - -void CBrowserAdaptiveListPopup::DoListScrolling() - { - iList->ScrollToMakeItemVisible( iList->Model()->NumberOfItems()-1 ); - } - -// End of File