notepad/notepad1/LibSrc/NpdExternalTextEditorDialog.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:32:31 +0100
branchRCL_3
changeset 30 bd7edf625bdd
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 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 "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 Notepad Editor mode.
*
*/


// INCLUDE FILES
#include "NpdLib.hrh"
#include "NpdExternalTextEditorDialog.h"
#include "NpdApi.h"
#include "NpdLib.h"
#include "NpdUtil.h"
#include "NpdEdwin.h"

#include <NpdLib.rsg>

#include <aknappui.h>
#include <avkon.hrh>
#include <eikmenup.h>
#include <txtetext.h>
#include <AknForm.h>
#include <aknnotedialog.h>
#include <eikapp.h>
#include <aknnotewrappers.h>
#include <sendui.h>
#include <SenduiMtmUids.h>
#include <Sendnorm.rsg>
#include <barsread.h>
#include <featmgr.h>
#include <hlplch.h>
#include <finditemmenu.h>
#include <CommonContentPolicy.h>

#include <finditemengine.h>
#include <finditemmenu.h>
#include <finditemdialog.h>
#include <FindItemmenu.rsg>
#include <finditem.hrh>

#include <csxhelp/nmake.hlp.hrh>
#include "NpdLibPanic.h"
#include "NpdEdwinLines.h"


// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CNotepadExternalTextDialog::NewL
// constructor.
// -----------------------------------------------------------------------------
//
EXPORT_C CNotepadExternalTextDialog* CNotepadExternalTextDialog::NewL(
    HBufC** aText, 
    TInt& aReturnStatus,
    const TDesC& aInitialText,
    const TDesC& aTitle, 
    const TDesC& aConfirmText,
    CEikDialog** aSelfPtr
    )
    {
    CNotepadExternalTextDialog* self = new(ELeave) CNotepadExternalTextDialog();
    self->iSelfPtr = aSelfPtr;
    CleanupStack::PushL(self);

    TResourceReader rr;
    self->iCoeEnv->CreateResourceReaderLC(rr, R_NOTEPAD_TEXT_EDITOR);
    self->ConstructL( rr, aText, aReturnStatus, aInitialText, aTitle , aConfirmText);
    CleanupStack::PopAndDestroy(); // rr
    CleanupStack::Pop(); // rr
    return self;
    }

// -----------------------------------------------------------------------------
// CNotepadExternalTextDialog::ConstructL
// constructor.
// -----------------------------------------------------------------------------
//
void CNotepadExternalTextDialog::ConstructL(
    TResourceReader &rr, 
    HBufC** aText, 
    TInt& aReturnStatus,
    const TDesC& aInitialText,
    const TDesC& aTitle, 
    const TDesC& aConfirmText
    )
    {
    if ( aTitle.Length() != 0 )
        {
        CNotepadDialogBase::SetTitleL(&aTitle);
        }
    iContent.Set( aInitialText );
    iContentPointer = aText;

    if (aConfirmText.Length() != 0) 
        {
        iDeleteConfirmation.Set( aConfirmText );
        }

    iOKKeyPressed = ETrue;
    CNotepadDialogBase::ConstructL(rr);
    iReturnValue = &aReturnStatus;
	iFindItemMenu = CFindItemMenu::NewL(ENotepadCmdFind);
    }

// -----------------------------------------------------------------------------
// CNotepadExternalTextDialog::~CNotepadExternalTextDialog
// Destructor
// -----------------------------------------------------------------------------
//
EXPORT_C CNotepadExternalTextDialog::~CNotepadExternalTextDialog()
    {
		delete iFindItemMenu;
    }

// -----------------------------------------------------------------------------
// CNotepadExternalTextDialog::OkToExitL
// -----------------------------------------------------------------------------
//
TBool CNotepadExternalTextDialog::OkToExitL( TInt aButtonId )
    {
    TBool isOk(ETrue);
	//MSK
    if(aButtonId == EAknSoftkeyContextOptions )
    	{
    	iOKKeyPressed = ETrue;
    	DisplayMenuL();
		return EFalse;
    	}
    else if(aButtonId == EAknSoftkeyOptions )
    	{
    	iOKKeyPressed = EFalse;
    	}
    else
    	{
    	}		
    isOk = CAknDialog::OkToExitL(aButtonId);

    TInt size = iEditor->Text()->DocumentLength();

    if(size == 0)
        {
        *iReturnValue = CNotepadApi::ENpdDataErased;
        }
    else if(size != 0 && (*iReturnValue) != CNotepadApi::ENpdDataDeleted )
        {
        *iContentPointer = HBufC::NewL(size);
	    TPtr desptr = (*iContentPointer)->Des();
        iEditor->Text()->Extract(desptr,0,size);
        if(NotepadUtil::IsEmpty(**iContentPointer))
            {
            *iReturnValue = CNotepadApi::ENpdDataErased;
            }
        else
        	{
        	*iReturnValue = CNotepadApi::ENpdDataEdited;
        	}               
        }

    return isOk;
    }

// ---------------------------------------------------------
// CNotepadExternalTextDialog::HandleResourceChange
// from CCoeControl
// ---------------------------------------------------------
//
void CNotepadExternalTextDialog::HandleResourceChange(TInt aType)
    {
    if (aType == KEikDynamicLayoutVariantSwitch)
        {
		TRect mainPane;
   		AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,mainPane);
		SetRect(mainPane);
		}
    }

// ---------------------------------------------------------
// CNotepadExternalTextDialog::SizeChanged
// from CCoeControl
// ---------------------------------------------------------
//
void CNotepadExternalTextDialog::SizeChanged()
    {
    CNotepadDialogBase::SizeChanged();
    if (iEditor && IsActivated())
        {
        TRAP_IGNORE(iEditor->DoEditorLayoutL());
        }
    }

// -----------------------------------------------------------------------------
// CNotepadExternalTextDialog::PostLayoutDynInitL
// -----------------------------------------------------------------------------
//
void CNotepadExternalTextDialog::PostLayoutDynInitL()
    {

    iEditor = STATIC_CAST(CNotepadEdwin*, Control(ENotepadIdEdwin));
    iEditor->ConstructBaseL();
    __ASSERT_DEBUG( iEditor, Panic(ENotepadLibraryPanicNoEdwin) );
    iEditor->CreatePreAllocatedScrollBarFrameL()->SetScrollBarVisibilityL(
        CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);

    iEditor->Text()->Reset();
    iEditor->SetTextL(&iContent);
    iEditor->HandleTextChangedL();

    CEikAppUi* container = iAvkonAppUi->ContainerAppUi();
    //cannot find UIDs in SenduiMtmUids.h
    TUid appuid = KNullUid;
    if ( container )
        {
        appuid = container->Application()->AppDllUid();
        }

    TRect rect(iEikonEnv->EikAppUi()->ClientRect());
    iEditor->SetRect(rect);
    }

// -----------------------------------------------------------------------------
// CNotepadExternalTextDialog::ActivateL
// -----------------------------------------------------------------------------
//
void CNotepadExternalTextDialog::ActivateL()
    {
    __ASSERT_DEBUG( iEditor, Panic(ENotepadLibraryPanicNoEdwin) );
    iEditor->InitNotepadEditorL(this, STATIC_CAST(CNotepadEdwinLines*, Control(ENotepadIdEdwinLines)));
    iEditor->SetFocus(ETrue, ENoDrawNow);
    CNotepadDialogBase::ActivateL();
    }

// -----------------------------------------------------------------------------
// CNotepadExternalTextDialog::OfferKeyEventL
// from CoeControl
// -----------------------------------------------------------------------------
//
TKeyResponse CNotepadExternalTextDialog::OfferKeyEventL(
    const TKeyEvent& aKeyEvent, 
    TEventCode aType )
    {
    TKeyResponse keyResponse(EKeyWasConsumed);

    if ( !MenuShowing() && aType == EEventKey &&
        !( aKeyEvent.iModifiers & (EAllStdModifiers|EModifierSpecial) ) &&
        ( aKeyEvent.iCode  == EKeyOK ) )
        {
        iOKKeyPressed = ETrue;
        DisplayMenuL();
        }
    else if( aKeyEvent.iCode == EKeyPhoneEnd )
        {
        TInt size = iEditor->Text()->DocumentLength();
        if(size == 0)
        	{
            *iReturnValue = CNotepadApi::ENpdDataErased;
        	}
        else if(size != 0 && (*iReturnValue) != CNotepadApi::ENpdDataDeleted )
	        {
	        *iContentPointer = HBufC::NewL(size);
	        TPtr desptr = (*iContentPointer)->Des();
	        iEditor->Text()->Extract(desptr,0,size);
	        if(NotepadUtil::IsEmpty(**iContentPointer))
	            {
	            *iReturnValue = CNotepadApi::ENpdDataErased;
	            }
	            else
	        	{
	        	*iReturnValue = CNotepadApi::ENpdDataEdited;
	        	}               
	        }
        }
    else
    	{
    	keyResponse =  CAknDialog::OfferKeyEventL(aKeyEvent, aType);
    	}
    return keyResponse;
    }

// -----------------------------------------------------------------------------
// CNotepadExternalTextDialog::GetHelpContext
// -----------------------------------------------------------------------------
//
void CNotepadExternalTextDialog::GetHelpContext(TCoeHelpContext& aContext) const
    {
    aContext.iMajor = KUidNotepad;
    aContext.iContext = KNMAKE_HLP_MEMO_EDITOR_APPS;//KNMAKE_HLP_MEMO_EDITOR;
    }

// -----------------------------------------------------------------------------
// CNotepadExternalTextDialog::ProcessCommandL
// from MEikCommandObserver
// -----------------------------------------------------------------------------
//
void CNotepadExternalTextDialog::ProcessCommandL(TInt aCommandId)
    {
    HideMenu();
	if ( iFindItemMenu && iFindItemMenu->CommandIsValidL( aCommandId ) )
        {
           TInt ret = DoSearchL( iFindItemMenu->SearchCase(aCommandId) );
		   if ( ret == EAknSoftkeyExit )
		       {
               aCommandId = ret;
		       }
		   else
               {
               return;
               }
        }

    switch (aCommandId)
        {
        case ENotepadCmdDelete:
            {
            TBool deleted;
            if(iDeleteConfirmation.Length() != 0)
                {
                deleted = CNotepadDialogBase::ExecuteConfirmationQueryL( &iDeleteConfirmation );
                }
            else
                {
                deleted =CNotepadDialogBase::ExecuteConfirmationQueryL( R_NOTEPAD_QUERY_DELETE_MEMO );
                }
            if(deleted)
                {
                *iReturnValue = CNotepadApi::ENpdDataDeleted;
                TryExitL(0);
                }
            break;
            }
        default:
            CNotepadDialogBase::ProcessCommandL(aCommandId);
            break;
        }
    }

// -----------------------------------------------------------------------------
// CNotepadExternalTextDialog::DynInitMenuPaneL
// from MEikMenuObserver
// -----------------------------------------------------------------------------
//
void CNotepadExternalTextDialog::DynInitMenuPaneL(
    TInt aResourceId,
    CEikMenuPane* aMenuPane )
    {
    switch ( aResourceId )
        {
        case R_NOTEPAD_TEXT_EDITOR_MENU:
            if ( !(NotepadUtil::IsEmpty( iEditor->Text()->Read(0, iEditor->Text()->DocumentLength()) ) ) )
                {
            	if ( !(iOKKeyPressed) )
					{
					iFindItemMenu->DisplayFindItemMenuItemL(
								*aMenuPane, ENotepadCmdDelete);
					}
                }
            if ( iOKKeyPressed )
                {
                aMenuPane->SetItemDimmed(EAknCmdHelp,ETrue);
                aMenuPane->SetItemDimmed(EAknCmdExit, ETrue);
                iOKKeyPressed = ETrue;
                }
            else
            	{
            	iOKKeyPressed = ETrue;
            	}    
			if(!FeatureManager::FeatureSupported(KFeatureIdHelp))
				{
				aMenuPane->SetItemDimmed(EAknCmdHelp, ETrue);
				}
            
            break;
		case R_FINDITEMMENU_MENU :
            {
            iFindItemMenu->DisplayFindItemCascadeMenuL(*aMenuPane);
            break;
            }
        default:
            break;
        }
    }


// -----------------------------------------------------------------------------
// CNotepadExternalTextDialog::DynInitMenuBarL
// from MEikMenuObserver
// -----------------------------------------------------------------------------
//
void CNotepadExternalTextDialog::DynInitMenuBarL(TInt aResourceId, CEikMenuBar* aMenuBar)
	{
	__ASSERT_DEBUG( aResourceId > 0,Panic(ENotepadLibraryPanicNoMenuResource) );
	__ASSERT_DEBUG( aMenuBar, Panic(ENotepadLibraryPanicNoMenuResource) );
	
    CEikMenuBar::TMenuType menuType = (iOKKeyPressed) ? CEikMenuBar::EMenuOptionsNoTaskSwapper :
    													CEikMenuBar::EMenuOptions ;
	aMenuBar->SetMenuType(menuType);
	
	}

// -----------------------------------------------------------------------------
// CNotepadExternalTextDialog::DoSearchL
// -----------------------------------------------------------------------------
//
TInt CNotepadExternalTextDialog::DoSearchL(CFindItemEngine::TFindItemSearchCase aCase)
    {
    CFindItemDialog* dialog = CFindItemDialog::NewL( iEditor->Text()->Read(0), aCase );
    dialog->EnableSingleClick( ETrue );
    dialog->SetCallSubMenuVisibility( EFalse ); // Click-To-Call
    TInt ret = dialog->ExecuteLD();
    TBuf<128> test = _L("FI returned: ");
    test.AppendNum(ret);
    iEikonEnv->InfoMsg(test);
    return ret;
	}
	
// End of File