diff -r 6385c4c93049 -r 8e6fa1719340 browserui/browser/FavouritesSrc/BrowserBookmarksEditDialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserui/browser/FavouritesSrc/BrowserBookmarksEditDialog.cpp Wed Sep 01 12:31:04 2010 +0100 @@ -0,0 +1,523 @@ +/* +* Copyright (c) 2002 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 CBrowserBookmarkEditDialog. +* +* +*/ + + +// INCLUDE FILES + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include // TUriParser + +#include "BrowserBookmarksEditFormApModel.h" +#include "BrowserBookmarksEditDialog.h" +#include "BrowserFavouritesModel.h" +#include "BrowserDialogs.h" +#include "BrowserAppUi.h" +#include "BrowserAppViewBase.h" +#include "commonconstants.h" +#include "Browser.hrh" +#include "BrowserUtil.h" + +#ifdef __SERIES60_HELP +// Context-Sensitve Help File +#include "BrowserApplication.h" +#include +#endif // __SERIES60_HELP + +// CONSTANTS + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CBrowserBookmarkEditDialog::NewL +// --------------------------------------------------------- +// +CBrowserBookmarkEditDialog* CBrowserBookmarkEditDialog::NewL + ( + CFavouritesItem& aItem, + CBrowserFavouritesModel& aModel, + MApiProvider& aApiProvider, + //MCommsModel& aCommsModel, + TInt aUid /* = KFavouritesNullUid */ + ) + { + CBrowserBookmarkEditDialog* form = + new (ELeave) CBrowserBookmarkEditDialog( + aItem, + aModel, + aApiProvider, + aUid + ); + CleanupStack::PushL( form ); + form->ConstructL( /* aApiProvider.CommsModel() */ ); + CleanupStack::Pop(); // form + return form; + } + +// --------------------------------------------------------- +// CBrowserBookmarkEditDialog::~CBrowserBookmarkEditDialog +// --------------------------------------------------------- +// +CBrowserBookmarkEditDialog::~CBrowserBookmarkEditDialog() + { + delete iFormApModel; + delete iNaviDecorator; + } + +// --------------------------------------------------------- +// CBrowserBookmarkEditDialog::ProcessCommandL +// --------------------------------------------------------- +// +void CBrowserBookmarkEditDialog::ProcessCommandL( TInt aCommandId ) + { + switch ( aCommandId ) + { + case EAknCmdExit: + { + // Custom added commands. Forward to view. + // Note that we respond to EAknCmdExit, not CEikCmdExit; it's + // because we don't get it through the AppUi framework (instead, + // we forward it there now). + CBrowserAppUi::Static()->HandleCommandL(EWmlCmdUserExit); + break; + } + +#ifdef __SERIES60_HELP + + case EAknCmdHelp: + { + CBrowserAppUi::Static()->HandleCommandL(EAknCmdHelp); + break; + } + +#endif //__SERIES60_HELP + + default: + { + // Standard form commands. + CAknForm::ProcessCommandL( aCommandId ); + if ( iExitDialog ) + { + TryExitL( EAknSoftkeyBack ); + } + break; + } + } + } + +// --------------------------------------------------------- +// CBrowserBookmarkEditDialog::CBrowserBookmarkEditDialog +// --------------------------------------------------------- +// +CBrowserBookmarkEditDialog::CBrowserBookmarkEditDialog + ( + CFavouritesItem& aItem, + CBrowserFavouritesModel& aModel, + MApiProvider& aApiProvider, + TInt aUid + ) + : iItem( &aItem ), + iModel( &aModel ), + iUid( aUid ), + iExitDialog( EFalse ), + iExitNoteResourceId( 0 ), // By default do not show any note. + iApiProvider( aApiProvider ) + { + } + +// --------------------------------------------------------- +// CBrowserBookmarkEditDialog::ConstructL +// --------------------------------------------------------- +// +void CBrowserBookmarkEditDialog::ConstructL( /*MCommsModel& aCommsModel*/ ) + { + CAknForm::ConstructL(); + iFormApModel = CBrowserBookmarksEditFormApModel::NewL( ApiProvider().CommsModel()/*aCommsModel*/ ); + } + +// ---------------------------------------------------------------------------- +// CBrowserBookmarkEditDialog::OkToExitL +// ---------------------------------------------------------------------------- +// +TBool CBrowserBookmarkEditDialog::OkToExitL( TInt aButtonId ) + { + TBool ret = CAknForm::OkToExitL( aButtonId ); + if ( ret && iExitNoteResourceId ) + { + // Exiting; show appropriate note if applicable. + TBrowserDialogs::InfoNoteL( + R_BROWSER_INFO_NOTE, iExitNoteResourceId ); + } + //pop empty label from navipane + if ( ret ) + iNaviPane->Pop(); + return ret; + } + +// --------------------------------------------------------- +// CBrowserBookmarkEditDialog::SaveFormDataL +// --------------------------------------------------------- +// +TBool CBrowserBookmarkEditDialog::SaveFormDataL() + { + // Of KWmlFavouritesMaxUrlDefine, KWmlFavouritesMaxUsernameDefine, KWmlFavouritesMaxPasswordDefine + // and KWmlFavouritesMaxBookmarkNameDefine the biggest is KWmlFavouritesMaxUrlDefine. + TBuf buf; + + // Get title. + GetEdwinText( buf, EWmlControlEditBmEditTitle ); + iItem->SetNameL( buf.Left(KFavouritesMaxName) ); + + // Get address. + GetEdwinText( buf, EWmlControlEditBmEditAddress ); + HBufC* text = HBufC::NewL(KFavouritesMaxUrlDefine); + + // Do not check return value from Parse(). If the user wants to create a + // badly formed url then let them do so. + TUriParser url; + url.Parse( buf ); + + // Add a default scheme if it is not already present. + if( !url.IsPresent( EUriScheme ) ) + { + _LIT( KBookmarkDefaultScheme, "http://" ); + + text->Des().Copy( KBookmarkDefaultScheme ); + } + // Error prone code. If user enters the whole KFavouritesMaxUrlDefine(1024) amount of + // characters with out the http:// infront, well have a USER:23 here. + // Hack aplied for now and included in FIX: EKDN-7P64KZ + // Needs a proper error raised and a fix. + // + // Check if long enough and append, if not we dont add http:// + // and alert user in SaveItemL() with popup that there must be an url + // NOTICE: THIS NEEDS A PROPER FIX - THIS IS A TEMP WORKAROUND + if( ( buf.Length() + text->Length() ) <= KFavouritesMaxUrlDefine ) + { + text->Des().Append( buf ); + } + else + { + text->Des().Copy( buf ); + } + + + Util::EncodeSpaces(text); + CleanupStack::PushL(text);// push after encode because the pointer may change + iItem->SetUrlL( text->Des() ); + CleanupStack::PopAndDestroy();// text + + // Get username. + GetEdwinText( buf, EWmlControlEditBmEditUsername ); + iItem->SetUserNameL( buf ); + + // Get password. + STATIC_CAST( CEikSecretEditor*, Control( EWmlControlEditBmEditPassword ) ) + ->GetText( buf ); + iItem->SetPasswordL( buf ); + + // Get WAP Access point. + TFavouritesWapAp ap = iFormApModel->CurrentWapAp(); + if ( !ap.IsNull() ) + { + // We set it back only if not NULL. + // AP is NULL if invalid (bookmark was edited, but the ap was not and + // it is left "Invalid". In that case we leave ap as-is. + iItem->SetWapAp( ap ); + } + + return SaveItemL(); + } + +// --------------------------------------------------------- +// CBrowserBookmarkEditDialog::DynInitMenuPaneL +// --------------------------------------------------------- +// +void CBrowserBookmarkEditDialog::DynInitMenuPaneL +( TInt aResourceId, CEikMenuPane* aMenuPane ) + { + CAknForm::DynInitMenuPaneL( aResourceId, aMenuPane ); + if ( aResourceId == R_AVKON_FORM_MENUPANE ) + { + // Disallow user addition / deletion / labeling. + aMenuPane->SetItemDimmed( EAknFormCmdAdd, ETrue ); + aMenuPane->SetItemDimmed( EAknFormCmdDelete, ETrue ); + aMenuPane->SetItemDimmed( EAknFormCmdLabel, ETrue ); + // Add "Exit". + aMenuPane->AddMenuItemsL + ( R_BROWSER_BOOKMARKS_MENU_PANE_EDIT_BOOKMARK ); + } + } + +// --------------------------------------------------------- +// CBrowserBookmarkEditDialog::PreLayoutDynInitL +// --------------------------------------------------------- +// +void CBrowserBookmarkEditDialog::PreLayoutDynInitL() + { + LoadFormDataL(); + CAknForm::PreLayoutDynInitL(); + + CEikStatusPane *sp = ((CAknAppUi*)iEikonEnv->EikAppUi())->StatusPane(); + // Fetch pointer to the default navi pane control + iNaviPane = + (CAknNavigationControlContainer*)sp->ControlL( + TUid::Uid( EEikStatusPaneUidNavi ) ); + iNaviDecorator = iNaviPane->CreateNavigationLabelL( _L("") ); + + // push empty label, to avoid tab group visibility in BookmarkEditor. + iNaviPane->PushL( *iNaviDecorator ); + } + +// --------------------------------------------------------- +// CBrowserBookmarkEditDialog::LoadFormDataL +// --------------------------------------------------------- +// +void CBrowserBookmarkEditDialog::LoadFormDataL() + { + + // Set title. + const TPtrC tptrcName = iItem->Name(); + STATIC_CAST( CEikEdwin*, Control( EWmlControlEditBmEditTitle ) )-> + SetTextL( &(tptrcName) ); + + // Set address. + const TPtrC tptrcUrl = iItem->Url(); + STATIC_CAST( CEikEdwin*, Control( EWmlControlEditBmEditAddress ) )-> + SetTextL( &(tptrcUrl) ); + + // Set username. + const TPtrC tptrcUserName = iItem->UserName(); + STATIC_CAST( CEikEdwin*, Control( EWmlControlEditBmEditUsername ) )-> + SetTextL( &(tptrcUserName) ); + + // Set password. + STATIC_CAST( CEikSecretEditor*,Control( EWmlControlEditBmEditPassword ) )-> + SetText( iItem->Password() ); + + // Set WAP Access Point popup field's query value. + CAknPopupField* wapApSelector = STATIC_CAST + ( CAknPopupField*, Control( EWmlControlEditBmWapApSelector ) ); + wapApSelector->SetQueryValueL( iFormApModel->QueryValue() ); + // Set current WAP Access Point. + iFormApModel->SetCurrentWapApL( iItem->WapAp() ); + } + +// --------------------------------------------------------- +// CBrowserBookmarkEditDialog::SaveItemL +// --------------------------------------------------------- +// +TBool CBrowserBookmarkEditDialog::SaveItemL() + { + TInt res; + CBrowserFavouritesModel::TRenameMode renameMode = + CBrowserFavouritesModel::EDontRename; + + iExitNoteResourceId = 0; // By default, do not show any note. + + if ( !iItem->Name().Length() ) + { + // No title for this item. Make a default name and ensure auto renaming + // to non-conflicting name (without user interaction). + iModel->SetNameToDefaultL( *iItem ); + renameMode = CBrowserFavouritesModel::EAutoRename; + } + + if ( iItem->Url().Length() && iItem->Url() != KHttpString && IsValidUrlHost( iItem->Url() ) ) + { + if ( iUid == KFavouritesNullUid ) + { + // This is a new item. Add it. + res = iModel->AddL( *iItem, /*aDbErrorNote=*/ETrue, renameMode ); + } + else + { + // Editing an existing item. Update now. + res = iModel->UpdateL + ( *iItem, iUid, /*aDbErrorNote=*/ETrue, renameMode ); + } + switch ( res ) + { + case KErrNone: + { + iExitDialog = ETrue; + break; + } + case KErrAlreadyExists: + { + // Name conflicts. Let the user know. + TBrowserDialogs::InfoNoteL + ( + R_BROWSER_INFO_NOTE, + R_BROWSER_BOOKMARKS_NAME_ALREADY_USED + ); + // Set focus to name field and keep editing. + TryChangeFocusToL( EWmlControlEditBmEditTitle ); + // Select all, cursor is at end. + CEikEdwin* nameEditor = STATIC_CAST + ( CEikEdwin*, Control( EWmlControlEditBmEditTitle ) ); + nameEditor->SetSelectionL( nameEditor->TextLength(), 0 ); + nameEditor->DrawDeferred(); + iExitDialog = EFalse; + break; + } + default: + { + iExitDialog = EFalse; + break; + } + } + } + else + { + // No Address. Cannot save this bookmark. + res = TBrowserDialogs::ConfirmQueryYesNoL( + R_BROWSER_BOOKMARKS_TEXT_QUERY_ADDRESS ); + if ( !res /*res == EAknSoftkeyNo*/ ) + { + // User decided not to save the bookmark. Exit now. + iExitNoteResourceId = iModel->StringResourceId + ( *iItem, CBrowserFavouritesModel::ENotSaved ); + iExitDialog = ETrue; + } + else + { + // Set focus to address field and keep editing. + TryChangeFocusToL( EWmlControlEditBmEditAddress ); + CEikEdwin* urlEditor = STATIC_CAST + ( CEikEdwin*, Control( EWmlControlEditBmEditAddress ) ); + // Select none, cursor is at end. + urlEditor->SetSelectionL + ( urlEditor->TextLength(), urlEditor->TextLength() ); + urlEditor->DrawDeferred(); + iExitDialog = EFalse; + } + } + return iExitDialog; + } + +// --------------------------------------------------------- +// CBrowserBookmarkEditDialog::IsValidUrlHost +// --------------------------------------------------------- +// +TBool CBrowserBookmarkEditDialog::IsValidUrlHost( const TDesC& aUrl ) + { + TBool isValid = EFalse; + _LIT(KHttpMark, "://"); + // Get the position of end of protocol definition + TInt position = aUrl.Find( KHttpMark ); + if ( position != KErrNotFound ) + { + TPtrC16 url = aUrl.Right( aUrl.Length() - position - KHttpMark().Length() ); + // Locate the next slash which is the end of host part of url + TInt slashLocation = url.Locate('/'); + // We check the total length of host part of url. + // If over 255 we return EFalse + if ( slashLocation == KErrNotFound ) + { + if ( ( url.Length() + position + KHttpMark().Length() ) <= 255 ) + { + isValid = ETrue; + } + } + else + { + if ( ( position + slashLocation + KHttpMark().Length() ) <= 255 ) + { + isValid = ETrue; + } + } + } + return isValid; + } + +// --------------------------------------------------------- +// CBrowserBookmarkEditDialog::GetEdwinText +// --------------------------------------------------------- +// +void CBrowserBookmarkEditDialog::GetEdwinText +( TDes& aText, TInt aControlId ) + { + STATIC_CAST( CEikEdwin*, Line( aControlId )->iControl )->GetText( aText ); + } + + +// --------------------------------------------------------- +// CBrowserBookmarkEditDialog::HandleResourceChange +// --------------------------------------------------------- +// +void CBrowserBookmarkEditDialog::HandleResourceChange( TInt aType ) + { + TRAP_IGNORE( HandleResourceChangeL( aType ) ); + } + +// --------------------------------------------------------- +// CBrowserBookmarkEditDialog::HandleResourceChangeL +// --------------------------------------------------------- +// +void CBrowserBookmarkEditDialog::HandleResourceChangeL( TInt aType ) + { + CAknForm::HandleResourceChange(aType); + if (aType == KEikDynamicLayoutVariantSwitch) + { + TRect rect; + if (AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, rect)) + { + SetRect(rect); + } + } + } + +#ifdef __SERIES60_HELP +// --------------------------------------------------------- +// CBrowserBookmarkEditDialog::GetHelpContext() +// --------------------------------------------------------- +// +void CBrowserBookmarkEditDialog::GetHelpContext( TCoeHelpContext& aContext ) const + { + aContext.iMajor = KUidBrowserApplication; + if ( iUid == KFavouritesNullUid ) + { + // Add bookmark help + aContext.iContext = KOSS_HLP_BM_ADDBM; + } + else + { + // Edit bookmark help + aContext.iContext = KOSS_HLP_BM_EDIT; + } + } +#endif // __SERIES60_HELP + +// End of File