browserui/browser/FavouritesSrc/BrowserBookmarksEditDialog.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:31:04 +0100
branchRCL_3
changeset 48 8e6fa1719340
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201032 Kit: 201035

/*
* 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