/*
* 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 "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
* which accompanies this distribution, and is available
* at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  Provides support for cut, copy, paste and
*                undo functionality in editors.
*
*/


#ifndef EIKCCPU_H
#define EIKCCPU_H

#include <coecntrl.h>
#include <eikdef.h>
#include <eikmobs.h>
#include <babitflags.h>
#include <AknControl.h>

class CEikButtonGroupContainer;
class CEikMenuBar;


/**
 * Interface for cut, copy, paste and undo functionality.
 */
class MEikCcpuEditor
	{
public:
    /**
     * Derived classes must provide the implementation for
     * following:
     *
     * Tests whether the editor is focused.
     * 
     * @return If editor is focused, @c ETrue is returned.
     */
	virtual TBool CcpuIsFocused() const = 0;
	
    /**
     * Derived classes must provide the implementation for
     * following:
     *
     * Tests whether the selected text can be cut.
     * 
     * @return @c ETrue if it is possible to cut the selected text.
     */
	virtual TBool CcpuCanCut() const = 0;
	
    /**
     * Derived classes must provide the implementation for
     * following:
     *
     * Cuts selected text.
     */
	virtual void CcpuCutL() = 0;
	
    /**
     * Derived classes must provide the implementation for
     * following:
     *
     * Tests whether the selected text can be copied.
     * 
     * @return @c ETrue if it is possible to copy the selected text.
     */	
	virtual TBool CcpuCanCopy() const = 0;

    /**
     * Derived classes must provide the implementation for
     * following:
     *
     * Copies selected text.
     */	
	virtual void CcpuCopyL() = 0;
	
    /**
     * Derived classes must provide the implementation for
     * following:
     *
     * Tests whether text can be pasted from the clipboard.
     * 
     * @return @c ETrue if it is possible to paste the clipboard text.
     */	
	virtual TBool CcpuCanPaste() const = 0;

    /**
     * Derived classes must provide the implementation for
     * following:
     *
     * Pastes text from the clipboard to the editor.
     */	
	virtual void CcpuPasteL() = 0;
	
	/**
     * Derived classes must provide the implementation for
     * following:
     *
     * Tests is it possible to undo previous operation.
     * 
     * @return @c ETrue if it is possible to undo previous operation.
     */	
	virtual TBool CcpuCanUndo() const = 0;
	
    /**
     * Derived classes must provide the implementation for
     * following:
     *
     * Undoes the most recent text operation when the editor supports this
     * feature and when the undo store is not empty
     */	
	virtual void CcpuUndoL() = 0;
	};

/**
 * Cut, copy, paste and undo support class. Takes care
 * of CBA handling and menu command processing when FEP
 * instructs this control to activate the commands
 * for ccpu operations.
 */
class CAknCcpuSupport : public CAknControl, public MEikMenuObserver
	{
public:
    /**
     * Constructor. ConstructL() must be called after a call
     * to this function.
     *
     * @param aEditor A pointer to the editor implementing the
     * MEikCcpuEditor interface.
     */
	IMPORT_C CAknCcpuSupport(MEikCcpuEditor* aEditor);
	
	/**
	 * Destructor.
	 */
	IMPORT_C ~CAknCcpuSupport();
	
	/**
	 * 2nd phase constructor.
	 *
	 * Adds this control to the control stack.
	 */
	IMPORT_C void ConstructL();

    /**
     * Updates the CBA labels according to selection and
     * clipboard contents.
     */
	IMPORT_C void HandleSelectionChangeL();
	
	/**
	 * Updates the CBA labels according to editor focus
	 * state.
	 */
	IMPORT_C void HandleFocusChangeL();

	// from CCoeControl
    
    /**
     * Responds to key presses.
     * 
     * Overrides CCoeControl::OfferKeyEventL().
     * 
     * @param aKeyEvent The key event.
     * @param aType Not used.
     * @return Indicates whether or not the key event was consumed.
     */	
	IMPORT_C TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);

    /**
     * From @c CCoeControl.
     * 
     * Handles pointer events.
     *
     * @param aPointerEvent The pointer event.
     */
    IMPORT_C void HandlePointerEventL(const TPointerEvent& aPointerEvent);

	// from MEikMenuObserver
	
	/**
	 * From MEikMenuObserver.
	 * 
	 * Dynamically initialises a menu pane.
	 *
	 * @param aResourceId Resource ID of the menu.
	 * @param aMenuPane The in-memory representation of the menu pane.
	 */
	IMPORT_C void DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane);

    /**
     * From MEikCommandObserver.
     *
     * Processes user commands.
     *
     * @param aCommandId ID of the command to respond to.
     */
	IMPORT_C void ProcessCommandL(TInt aCommandId);

private:
	void UpdateCBALabelsL();
	TBool UpdateCBALabelL(TInt aPosition, TInt aCommandId, TInt aTextResId);
	void SetEmphasis(CCoeControl* aMenuControl,TBool aEmphasis);

private:
    /**
    * From CAknControl
    */
    IMPORT_C void* ExtensionInterface( TUid aInterface );
private:
	TBitFlags iFlags;

	// Owned
	CEikButtonGroupContainer* iCba;

	// Not owned
	CEikMenuBar* iMenu;
	MEikCcpuEditor* iEditor;
	};

#endif // EIKCCPU_H
