browserui/browser/FavouritesSrc/BrowserBookmarksEditDialog.cpp
changeset 0 84ad3b177aa3
child 24 868cceedabd3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserui/browser/FavouritesSrc/BrowserBookmarksEditDialog.cpp	Mon Mar 30 12:49:49 2009 +0300
@@ -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 <BrowserNG.rsg>
+#include <eikmenup.h>
+#include <eikseced.h>
+#include <eikenv.h>
+#include <avkon.hrh>
+#include <AknQueryDialog.h>
+#include <eikcapc.h>
+#include <AknPopupField.h>
+#include <AknQueryValueText.h>
+#include <AknKeys.h>
+#include <FavouritesItem.h>
+#include <aknnavi.h>
+#include <aknnavide.h>
+
+#include <aknconsts.h>
+#include <akneditstateindicator.h>
+#include <AknsListBoxBackgroundControlContext.h>
+#include <Uri16.h> // 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 <csxhelp/browser.hlp.hrh>
+#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<KFavouritesMaxUrlDefine> 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