textinput/peninputvkbcn/ctrlinc/peninputvkbcompositionfield.h
changeset 0 eb1f2e154e89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputvkbcn/ctrlinc/peninputvkbcompositionfield.h	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,745 @@
+/*
+* Copyright (c) 2002-2005 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:  CAknFepVkbCompositionField
+*
+*/
+
+
+#ifndef C_CAKNFEPVKBCOMPOSITIONFIELD_H
+#define C_CAKNFEPVKBCOMPOSITIONFIELD_H
+
+#include <peninputlayouteditareabase.h>
+
+class MAknFepVkbDataProvider;
+class CAknFepVkbPinyinAnalyser;
+
+// property of Cpi engine, Private protocol since hard to modify ptiengine.h
+const TInt KCpiMaxInputPhraseLen = 6;
+/**
+ *  Composition Element Type.
+ *
+ *  @lib peninputvkbcn.lib
+ *  @since S60 v3.2 
+ */
+enum TCompositionElementType
+    {
+    EElementTypeCompositionChar = 0x0001, //normal char
+    EElementTypeAutoSeparator = 0x0002,   //auto separator
+    EElementTypeManualSeparator = 0x0004,  //manual separator
+    EElementTypeSeparator = EElementTypeAutoSeparator | EElementTypeManualSeparator,
+    EElementTypeTonemark = 0x0008,        //tomark
+    EElementTypeAuxilian = EElementTypeSeparator | EElementTypeTonemark,
+    EElementTypeConvertedChar = 0x0010    //converted char from engine
+    };
+        
+class CAknFepVkbCompositionField;
+
+/**
+ *  CCompositionElement.
+ *
+ *  @lib peninputvkbcn.lib
+ *  @since S60 v3.2 
+ */
+class CCompositionElement: public CBase
+    {
+public:
+
+    /**
+     * Symbian constructor.
+     *
+     * @since S60 v3.2
+     * @param aKey Input key
+     * @return Pointer to created CCompositionElement object
+     */
+    static CCompositionElement* NewLC(const TDesC& aKey);    
+
+    /**
+     * destructor
+     *
+     * @since S60 v3.2
+     * @return None
+     */
+    virtual ~CCompositionElement();
+    
+    /**
+     * Get the length of original input
+     *
+     * @since S60 v3.2
+     * @return The length of original input
+     */
+    virtual TInt OriginalCount() const;
+    
+    /**
+     * Undo convert
+     *
+     * @since S60 v3.2
+     * @param aField The owner of unconverted components
+     * @param aStartPos The insert position
+     * @return Inserted elements count
+     */
+    virtual TInt UndoConvertL(CAknFepVkbCompositionField* aField, TInt aStartPos);
+
+    /**
+     * Get the key
+     *
+     * @since S60 v3.2
+     * @return The key
+     */
+    inline const TDesC* Key() const;
+
+    /**
+     * Compare function
+     *
+     * @since S60 v3.2
+     * @return ETrue if the key value is equal to aKeyValue,
+     *         EFalse otherwise
+     */
+    inline TBool operator == (TUint aKeyValue) const;
+    
+    /**
+     * Determine the type of element
+     *
+     * @since S60 v3.2
+     * @param aType The type of element to judge
+     * @return ETrue if it is, otherwise EFalse
+     */
+    inline TBool IsTypeOf(TCompositionElementType aType) const;
+
+    /**
+     * Is this element is a separator?
+     *
+     * @since S60 v3.2
+     * @return ETrue if element is a separator; otherwise EFalse
+     */
+    inline TBool IsSeparator() const;
+    
+    /**
+     * Is this element is an atuo separator?
+     *
+     * @since S60 v3.2
+     * @return ETrue if element is an auto separator; otherwise EFalse
+     */
+    inline TBool IsAutoSeparator() const;
+    
+    /**
+     * Is this element is a manul separator?
+     *
+     * @since S60 v3.2
+     * @return ETrue if element is a manul separator; otherwise EFalse
+     */
+    inline TBool IsManualSeparator() const;
+    
+
+    /**
+     * Is this element is a tone mark?
+     *
+     * @since S60 v3.2
+     * @return ETrue if element is a tone mark; otherwise EFalse
+     */
+    inline TBool IsTonemark() const;
+    
+    /**
+     * Is this element is a auxilian(separator or tone mark)
+     *
+     * @since S60 v3.2
+     * @return ETrue if element is a manul separator; otherwise EFalse
+     */
+    inline TBool IsAuxilian() const;
+    
+    /**
+     * Is this element is visible?
+     *
+     * @since S60 v3.2
+     * @return ETrue if element is visible; otherwise EFalse
+     */
+    inline TBool IsVisible();
+    
+    /**
+     * Show/hide the element
+     *
+     * @since S60 v3.2
+     * @param aHide Hide flag,
+     * @return None
+     */
+    inline void Hide(TBool aHide);
+    
+    /**
+     * Get the CCompositionElement pointer of original input
+     *
+     * @since S60 v3.2
+     * @return The length of original input
+     */
+    virtual const CCompositionElement* OriginalContent( TInt aIndex ) const;
+    
+    
+protected:
+
+    /**
+     * C++ constructor
+     *
+     * @since S60 v3.2
+     * @return None
+     */            
+    CCompositionElement(TInt aKeyType);
+    
+    /**
+     * 2nd constructor
+     *
+     * @since S60 v3.2
+     * @param aKey Input key
+     * @return None
+     */            
+    void BaseConstructL(const TDesC& aKey);
+    
+private:  //data
+
+    /**
+     * The key type
+     */
+    const TInt iKeyType;
+    /**
+     * The key (Own)
+     * The iKey->Length() must be > 0 
+     */
+    HBufC* iKey;
+   
+    TBool iHide; 
+    };
+    
+/**
+ *  CCompositionConvertedElement.
+ *
+ *  @lib peninputvkbcn.lib
+ *  @since S60 v3.2 
+ */
+class CCompositionConvertedElement: public CCompositionElement
+    {
+public:
+
+    /**
+     * Symbian constructor.
+     *
+     * @since S60 v3.2
+     * @param aKey Input key
+     * @return Pointer to created CCompositionElement object
+     */
+    static CCompositionConvertedElement* NewLC(const TDesC& aKey);    
+
+    /**
+     * destructor
+     *
+     * @since S60 v3.2
+     * @return None
+     */
+    virtual ~CCompositionConvertedElement();
+
+    /**
+     * Append a element to this converted element
+     *
+     * @since S60 v3.2
+     * @param aElement The element to append
+     * @return None
+     */
+    void AppendOriginal(const CCompositionElement* aElement);
+
+// from CCompositionElement
+    
+    /**
+     * From CCompositionElement
+     * Undo convert
+     *
+     * @since S60 v3.2
+     * @param aField The owner of unconverted components
+     * @param aStartPos The insert position
+     * @return Inserted elements count
+     */
+    TInt UndoConvertL(CAknFepVkbCompositionField* aField, TInt aStartPos);
+    
+    /**
+     * From CCompositionElement
+     * Get the length of original input
+     *
+     * @since S60 v3.2
+     * @return The length of original input
+     */
+    TInt OriginalCount() const;
+    
+    /**
+     * From CCompositionElement
+     * Get the CCompositionElement pointer of original input
+     *
+     * @since S60 v3.2
+     * @return The length of original input
+     */
+    virtual const CCompositionElement* OriginalContent( TInt aIndex ) const;
+
+private:
+    
+    /**
+     * C++ constructor
+     *
+     * @since S60 v3.2
+     * @return None
+     */            
+    CCompositionConvertedElement();
+    
+    /**
+     * 2nd constructor
+     *
+     * @since S60 v3.2
+     * @param aKey Input key
+     * @return None
+     */            
+    void ConstructL(const TDesC& aKey);
+
+private:  //data
+    
+    /**
+     * Original elements before converted
+     */
+    RPointerArray<CCompositionElement> iOriginalElements;
+    
+    };
+    
+/**
+ *  CAknFepVkbCompositionField.
+ *
+ *  @lib peninputvkbcn.lib
+ *  @since S60 v3.2 
+ */
+class CAknFepVkbCompositionField: public CFepLayoutEditAreaBase
+    {
+
+public:
+    
+    friend class CCompositionConvertedElement;
+    
+    /**
+     * Symbian constructor.
+     *
+     * @since S60 v3.2
+     * @param aMaxLength Length limitation, 0 means no limitation
+     * @param aRect  The control rect
+     * @param aUiLayout The layout
+     * @param aControlId The control id.
+     * @return Pointer to created CAknFepVkbCompositionField object
+     */
+    static CAknFepVkbCompositionField* NewL(TInt aMaxLength,
+                                            TRect aRect,
+                                            CFepUiLayout* aUiLayout,
+                                            TInt aControlId,
+                                            MAknFepVkbDataProvider* aDataProvider);    
+
+    /**
+     * destructor
+     *
+     * @since S60 v3.2
+     * @return None
+     */
+    virtual ~CAknFepVkbCompositionField();
+
+    /**
+     * HandleControlEvent
+     *
+     * @since S60 v3.2
+     * @param aEventType The event type
+     * @param aCtrl  The sender
+     * @param aEventData The event data.
+     * @return None
+     */
+    void HandleControlEvent(TInt aEventType, CFepUiBaseCtrl* aCtrl, const TDesC& aEventData);
+    
+    /**
+     * Get the length of current string in composition field
+     *
+     * @since S60 v3.2
+     * @return The length of current string in composition field
+     */
+    TInt Length() const ;  
+    
+    /**
+     * Set warning color
+     *
+     * @since S60 v3.2
+     * @param aColor The color.
+     * @return None
+     */
+    void SetWarningColor(const TRgb& aColor);
+        
+    /**
+     * Set normal color
+     *
+     * @since S60 v3.2
+     * @param aColor The color.
+     * @return None
+     */
+    void SetNormalColor(const TRgb& aColor); 
+    
+    /**
+     * Is there need to create new word
+     *
+     * @since S60 v3.2
+     * @return ETrue if there is need to create new word, otherwise EFalse
+     */
+    TBool NeedCreateWord();
+    
+     /**
+     * Return the spell for new created words.
+     *
+     * @since S60 v3.2
+     * @return The buffer for the gernated spell.
+     */ 
+    TPtrC GetCreatedWordSpell();
+    
+     /**
+     * Return whether the inputted spell is invalid
+     *
+     * @since S60 v3.2
+     * @return Return whether the inputted spell is invalid.
+     */ 
+    TBool IsValidSpell();
+
+	void ConstructFromResourceL();
+	
+	void SizeChanged(TRect aRect);	
+private:
+
+    /**
+     * C++ constructor
+     *
+     * @since S60 v3.2
+     * @param aMaxLength Length limitation, 0 means no limitation
+     * @param aRect  The control rect
+     * @param aUiLayout The layout
+     * @param aControlId The control id.
+     * @return None
+     */            
+    CAknFepVkbCompositionField(TInt aMaxLength,
+                              TRect aRect,
+                              CFepUiLayout* aUiLayout,
+                              TInt aControlId,
+                              MAknFepVkbDataProvider* aDataProvider);
+
+    /**
+     * Second phase constructor
+     *
+     * @since S60 v3.2
+     * @return None
+     */
+    void ConstructL();
+
+    /**
+     * Insert a key
+     *
+     * @since S60 v3.2
+     * @param aKey The key to insert.
+     * @return None
+     */
+    void HandleInsertL(const TDesC& aKey);
+
+    /**
+     * Generate first segment to analysis
+     *
+     * @since S60 v3.2
+     * @return None
+     */
+    void GetFirstSegmentL();
+
+    /**
+     * Insert an element
+     *
+     * @since S60 v3.2
+     * @param aElement The element to insert.
+     * @return None
+     */
+    void InsertElementL(const CCompositionElement* aElement);
+
+    /**
+     * clear text
+     *
+     * @since S60 v3.2
+     * @return None
+     */
+    void ClearTextL();
+    
+    /**
+     * Handle back key
+     *
+     * @since S60 v3.2
+     * @return None
+     */
+    void HandleBackL();
+    
+    /**
+     * Submit all text
+     *
+     * @since S60 v3.2
+     * @return None
+     */
+    void HandleFlushL();
+
+    /**
+     * Handle Analysis Response
+     *
+     * @since S60 v3.2
+     * @param aCompText Analysis result text.
+     * @return None
+     */
+    void HandleAnalysisResponseL(const TDesC& aCompText);
+
+    /**
+     * Handle converted result
+     *
+     * @since S60 v3.2
+     * @param aConvertedText Converted result text.
+     * @return None
+     */
+    void HandleConvertedResultL(const TDesC& aConvertedText);
+
+    /**
+     * Elements operation: remove
+     *
+     * @since S60 v3.2
+     * @param aStartPos Start position.
+     * @param aLength Length.
+     * @return None
+     */
+    void Remove(TInt aStartPos, TInt aLength, TBool aDestroy = ETrue);
+    /**
+     * Elements operation: insert
+     *
+     * @since S60 v3.2
+     * @param aPos Insert position.
+     * @param aElement The element.
+     * @return None
+     */
+    void InsertL(TInt aPos, const CCompositionElement* aElement);
+    
+    /**
+     * Elements operation: clear
+     *
+     * @since S60 v3.2
+     * @return None
+     */
+    void Clear();
+    
+    /**
+     * Submit the keys in elements and the cursor to editbase
+     *
+     * @since S60 v3.2
+     * @param aPos Insert position.
+     * @return None
+     */
+    void UpdateTextL();
+
+    /**
+     * Determine whether elment is allowed to insert
+     *
+     * @since S60 v3.2
+     * @param aElement Element to insert
+     * @return ETrue for allowed otherwise EFalse;
+     */
+    TBool IsAllowedInsert(const CCompositionElement* aElement);
+
+    /**
+     * Send Analysis Request
+     *
+     * @since S60 v3.2
+     * @param aRequest The request
+     * @return None;
+     */
+    void SendAnalysisRequestL();
+    
+    /**
+     * To test whether the all input keys are converted
+     * to chinese characters
+     *
+     * @since S60 v3.2
+     * @return ETrue if finished, EFalse otherwise.
+     */
+    TBool IsFinishComposition();
+    
+    /**
+     * To test whether current pos element should be replaced by input one
+     *
+     * @since S60 v3.2
+     * @param aElement The input element
+     * @param aPos The pos of element to test
+     * @return ETrue if current element should be replaced, EFalse otherwise.
+     */
+    TBool IsReplacePosition(const CCompositionElement* aElement, TInt aPos);
+    
+    /**
+     * To test whether the one before current pos element should be replaced 
+     * by input one
+     *
+     * @since S60 v3.2
+     * @param aElement The input element
+     * @return ETrue if current element should be replaced, EFalse otherwise.
+     */
+    TBool IsReplaceFront(const CCompositionElement* aElement);
+    
+    /**
+     * To test whether current pos element should be replaced by input one
+     *
+     * @since S60 v3.2
+     * @param aElement The input element
+     * @return ETrue if current element should be replaced, EFalse otherwise.
+     */
+    TBool IsReplaceBack(const CCompositionElement* aElement);
+    
+    /**
+     * Redo the format after deletion.
+     *
+     * @since S60 v3.2
+     * @return None.
+     */
+    void ReFomatAfterDelete();
+    
+    /**
+     * Get display cursor positon by internal cursor position
+     *
+     * @since S60 v3.2
+     * @param aInternalPos The internal position
+     * @return The display cursor position.
+     */
+    TInt InternalPosToDisplayPos(TInt aInternalPos);
+    
+    /**
+     * Get internal cursor positon by display cursor position
+     *
+     * @since S60 v3.2
+     * @param aInternalPos The internal position
+     * @return The display cursor position.
+     */
+    TInt DisplayPosToInternaPos(TInt aDisplayPos);
+    
+    /**
+     * Remove the selected text
+     *
+     * @since S60 v3.2
+     * @return None
+     */
+    void RemoveSelection();
+    
+// from CFepLayoutEditAreaBase
+
+    /**
+     * From CFepLayoutEditAreaBase
+     * Adjust the cursor when pointer down or move
+     *
+     * @since S60 v3.2
+     * @return None
+     */
+    void AdjustSelectedCompositionText(TInt& aPositionOfInsertionPointInBuffer);
+
+    /**
+     * From CFepLayoutEditAreaBase
+     * Update editbase content when scrolling
+     *
+     * @since S60 v3.2
+     * @param aCursorPos The cursor position
+     * @param aAnchorPos The anchor position
+     * @return None.     
+     */                  
+    void UpdateContent(const TCursorSelection& aCursorSel);
+    
+private:  //data
+
+    /**
+     * Length limitation
+     */
+    TInt iMaxLength;
+    
+    /**
+     * segment to analysis (Own)
+     */
+    HBufC* iFirstSegment;
+    
+    /**
+     * first segment start position in buffer 
+     */
+    TInt iFirstSegmentOffset;
+
+    /**
+     * first segment length in buffer 
+     * iFirstSegmentLength may not equal to iFirstSegment.Length
+     * Because all automatical separators are removed in iFirstSegment
+     */
+    TInt iFirstSegmentLength;
+    
+    /**
+     * Warning color 
+     */
+    TRgb iWarningColor;
+    
+    /**
+     * Normal color 
+     */
+    TRgb iNormalColor;
+    
+    /**
+     * Elements
+     */
+    RPointerArray<CCompositionElement> iElements;
+    
+    /**
+     * Current cursor position of 
+     * internal data
+     */
+    TInt iCurrentPos;
+    /**
+     * composition text start with manul separator
+     */
+    //TInt iSavedCursorPos;
+    
+    /**
+     * Flag of is there need to create new word
+     */
+    TBool iNeedCreateWord;
+    
+    /**
+     * The count of converted element
+     */
+    TInt iConvertedElement;
+    
+    /**
+     * The count of converted element
+     */
+    TBuf<KCpiMaxInputPhraseLen * 8 + 1> iCreateWordSpellBuffer;
+    
+    /**
+     * The analyser handle for spell decomposition
+     */
+    CAknFepVkbPinyinAnalyser* iPinyinAnalyser;
+    CAknFepVkbPinyinAnalyser* iZhuyinAnalyser;
+    
+    /**
+     * The data provider
+     * Not own
+     */
+    MAknFepVkbDataProvider* iDataProvider;
+    
+    /**
+     * Specify wether the spell is valid.
+     */
+    TInt iIsValidSpells;
+
+    };
+
+#include "peninputvkbcompositionfield.inl"    
+
+#endif //C_CAKNFEPVKBCOMPOSITIONFIELD_H
+
+//  End Of File