diff -r 10e98eab6f85 -r a359256acfc6 webengine/osswebengine/WebKit/s60/webview/WebFepTextEditor.cpp --- a/webengine/osswebengine/WebKit/s60/webview/WebFepTextEditor.cpp Fri Jul 03 15:54:40 2009 +0100 +++ b/webengine/osswebengine/WebKit/s60/webview/WebFepTextEditor.cpp Thu Aug 27 07:44:59 2009 +0300 @@ -30,6 +30,7 @@ #include "WebFrame.h" #include "Page.h" #include "FocusController.h" +#include "WebFrameView.h" #include "Frame.h" #include "Editor.h" @@ -60,8 +61,8 @@ // ----------------------------------------------------------------------------- // CWebFepTextEditor -// -// +// +// // ----------------------------------------------------------------------------- CWebFepTextEditor::CWebFepTextEditor(WebView* aView) : m_webView(aView), @@ -83,8 +84,8 @@ // ----------------------------------------------------------------------------- // ~CWebFepTextEditor -// -// +// +// // ----------------------------------------------------------------------------- CWebFepTextEditor::~CWebFepTextEditor() { @@ -96,163 +97,164 @@ // ----------------------------------------------------------------------------- // CreateTextFormatMask -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::CreateTextFormatMask() { - if (!m_textFormatMask) { + if (!m_textFormatMask) { Frame* frame = m_webView->page()->focusController()->focusedOrMainFrame(); if (frame && frame->document() && - frame->document()->focusedNode()) { - RenderStyle* s = frame->document()->focusedNode()->renderStyle(); - if (s && - (!s->wapInputFormat().isEmpty() || s->wapInputRequired())){ + frame->document()->focusedNode()) { + RenderStyle* s = frame->document()->focusedNode()->renderStyle(); + if (s && + (!s->wapInputFormat().isEmpty() || s->wapInputRequired())){ m_textFormatMask = new WebTextFormatMask(s->wapInputFormat(), s->wapInputRequired()); } } } -} +} // ----------------------------------------------------------------------------- // UpdateEditingMode -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::UpdateEditingMode() -{ +{ Frame* frame = m_webView->page()->focusController()->focusedOrMainFrame(); if (frame) { - SelectionController* sc = frame->selectionController(); - if (sc && sc->isContentEditable() && sc->isInPasswordField()) { - - // Set the state as if it was the CEikSecretEditor - CAknEdwinState* state = static_cast(State(KNullUid)); - if (state) { - state->SetFlags( EAknEditorFlagNoLRNavigation | + Node *node = frame->document()->focusedNode(); + if (frame && frame->document() && node) { + if (node->hasTagName(HTMLNames::inputTag) + && (static_cast(node)->inputType() == HTMLInputElement::PASSWORD) + && !static_cast(node)->readOnly()) { + // Set the state as if it was the CEikSecretEditor + CAknEdwinState* state = static_cast(State(KNullUid)); + if (state) { + state->SetFlags( EAknEditorFlagNoLRNavigation | EAknEditorFlagLatinInputModesOnly | EAknEditorFlagNoT9 | EAknEditorFlagUseSCTNumericCharmap ); - - state->SetDefaultInputMode(EAknEditorSecretAlphaInputMode); - state->SetCurrentInputMode(EAknEditorSecretAlphaInputMode); - state->SetPermittedCases(EAknEditorLowerCase|EAknEditorUpperCase); - state->SetCurrentCase(EAknEditorLowerCase); - state->SetPermittedInputModes(EAknEditorSecretAlphaInputMode | EAknEditorNumericInputMode); - state->SetDefaultCase(EAknEditorLowerCase); - state->SetSpecialCharacterTableResourceId(R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG_LATIN_ONLY); - state->SetNumericKeymap(EAknEditorPlainNumberModeKeymap); - } - - } - else { - - CreateTextFormatMask(); - - TUint currentCase ( EAknEditorLowerCase ) ; - TUint permittedCase ( EAknEditorAllCaseModes ) ; - TUint inputMode( EAknEditorNullInputMode ); - TUint permittedInputModes( EAknEditorAllInputModes ); - TUint flags( EAknEditorFlagDefault ); - TUint numericKeyMap( EAknEditorStandardNumberModeKeymap ); - - if (GetStateFromFormatMask(currentCase, permittedCase, inputMode, permittedInputModes, flags, numericKeyMap)) { - UpdateFlagsState(flags); - UpdateInputModeState(inputMode, permittedInputModes, numericKeyMap); - UpdateCaseState(currentCase, permittedCase); + state->SetDefaultInputMode(EAknEditorSecretAlphaInputMode); + state->SetCurrentInputMode(EAknEditorSecretAlphaInputMode); + state->SetPermittedCases(EAknEditorLowerCase|EAknEditorUpperCase); + state->SetCurrentCase(EAknEditorLowerCase); + state->SetPermittedInputModes(EAknEditorSecretAlphaInputMode | EAknEditorNumericInputMode); + state->SetDefaultCase(EAknEditorLowerCase); + state->SetSpecialCharacterTableResourceId(R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG_LATIN_ONLY); + state->SetNumericKeymap(EAknEditorPlainNumberModeKeymap); + } } else { - CAknEdwinState* state = static_cast(State(KNullUid)); - if (state) { - state->SetPermittedInputModes(EAknEditorAllInputModes); - state->SetPermittedCases(EAknEditorAllCaseModes);//allow everything - } + CreateTextFormatMask(); + TUint currentCase ( EAknEditorLowerCase ) ; + TUint permittedCase ( EAknEditorAllCaseModes ) ; + TUint inputMode( EAknEditorNullInputMode ); + TUint permittedInputModes( EAknEditorAllInputModes ); + TUint flags( EAknEditorFlagDefault ); + TUint numericKeyMap( EAknEditorStandardNumberModeKeymap ); + + if (GetStateFromFormatMask(currentCase, permittedCase, inputMode, permittedInputModes, flags, numericKeyMap)) { + UpdateFlagsState(flags); + UpdateInputModeState(inputMode, permittedInputModes, numericKeyMap); + UpdateCaseState(currentCase, permittedCase); + } + else { + CAknEdwinState* state = static_cast(State(KNullUid)); + if (state) { + state->SetDefaultCase(EAknEditorLowerCase); + state->SetPermittedInputModes(EAknEditorAllInputModes); + state->SetPermittedCases(EAknEditorAllCaseModes);//allow everything + } + } } } } // End of if (frame) } - + // ----------------------------------------------------------------------------- // CancelEditingMode -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::CancelEditingMode() - { + { delete m_textFormatMask; m_textFormatMask = NULL; - delete m_inlineEditText; - m_inlineEditText = NULL; + delete m_inlineEditText; + m_inlineEditText = NULL; - UpdateFlagsState(EAknEditorFlagDefault); UpdateInputModeState(EAknEditorNullInputMode, EAknEditorAllInputModes,EAknEditorStandardNumberModeKeymap); - UpdateCaseState(EAknEditorLowerCase, EAknEditorAllCaseModes); - + UpdateFlagsState(EAknEditorFlagDefault); + UpdateCaseState(EAknEditorLowerCase, EAknEditorAllCaseModes); + CancelFepInlineEdit(); } - + // ----------------------------------------------------------------------------- // ActivatePenInputRequest -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::ActivatePenInputRequest() -{ - CAknEdwinState* state = static_cast(State(KNullUid)); - if ( state ) { +{ + CAknEdwinState* state = static_cast(State(KNullUid)); + if ( state ) { TRAP_IGNORE( state->ReportAknEdStateEventL(MAknEdStateObserver::EAknActivatePenInputRequest ) ); - } + } } // ----------------------------------------------------------------------------- // DeactivatePenInputRequest -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::DeactivatePenInputRequest() - { + { } // ----------------------------------------------------------------------------- // InputCapabilities -// -// +// +// // ----------------------------------------------------------------------------- -TCoeInputCapabilities CWebFepTextEditor::InputCapabilities() +TCoeInputCapabilities CWebFepTextEditor::InputCapabilities() { Frame* frame = m_webView->page()->focusController()->focusedOrMainFrame(); if (frame) { SelectionController* sc = frame->selectionController(); - if (sc && sc->isContentEditable()) { + if (sc && sc->isContentEditable()) { // Set up the input capabilities, based on the box - TUint caps = TCoeInputCapabilities::ENavigation; - - if ( sc->isInPasswordField() ) { - caps |= TCoeInputCapabilities::ESecretText; + TUint caps = TCoeInputCapabilities::ENavigation; + + if ( sc->isInPasswordField() ) { + caps |= TCoeInputCapabilities::ESecretText; + UpdateFlagsState(EAknEditorFlagNoT9); } else { - - CAknEdwinState* state = static_cast(State(KNullUid)); - if ( state ) { + + CAknEdwinState* state = static_cast(State(KNullUid)); + if ( state ) { if ( state->PermittedInputModes() == EAknEditorNumericInputMode ) { caps |= (TCoeInputCapabilities::EWesternNumericIntegerPositive | - TCoeInputCapabilities::EWesternNumericIntegerNegative)| + TCoeInputCapabilities::EWesternNumericIntegerNegative)| TCoeInputCapabilities::EAllText; - } - else if ( state->PermittedInputModes() == EAknEditorTextInputMode ) { + } + else if ( state->PermittedInputModes() == EAknEditorTextInputMode ) { caps |= TCoeInputCapabilities::EWesternAlphabetic; } - else if ( state->PermittedInputModes() == (EAknEditorTextInputMode | EAknEditorNumericInputMode) ) { + else if ( state->PermittedInputModes() == (EAknEditorTextInputMode | EAknEditorNumericInputMode) ) { caps |= (TCoeInputCapabilities::EWesternNumericIntegerPositive | TCoeInputCapabilities::EWesternNumericIntegerNegative | TCoeInputCapabilities::EWesternAlphabetic); } else { - caps |= TCoeInputCapabilities::EAllText; - } + caps |= TCoeInputCapabilities::EAllText; + } } } @@ -270,7 +272,7 @@ // MObjectProvider callback method MopSupplyObject(). TCoeInputCapabilities inputCaps( caps, this, NULL, TUid::Uid(0x100056de), this ); inputCaps.SetObjectProvider( this ); - + return inputCaps; } } @@ -284,13 +286,13 @@ //////////////////////////////////////////////////////////////////////////////// -// from MCoeFepAwareTextEditor +// from MCoeFepAwareTextEditor // // ----------------------------------------------------------------------------- // StartFepInlineEditL -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::StartFepInlineEditL( const TDesC& aInitialInlineText, @@ -299,28 +301,28 @@ const MFormCustomDraw*, MFepInlineTextFormatRetriever&, MFepPointerEventHandlerDuringInlineEdit& /*aPointerEventHandlerDuringInlineEdit*/) -{ - CCoeEnv::Static()->ForEachFepObserverCall(FepObserverHandleStartOfTransactionL); - ClearInlineText(); - UpdateInlineText(aInitialInlineText); +{ + CCoeEnv::Static()->ForEachFepObserverCall(FepObserverHandleStartOfTransactionL); + ClearInlineText(); + UpdateInlineText(aInitialInlineText); } // ----------------------------------------------------------------------------- // UpdateFepInlineTextL -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::UpdateFepInlineTextL( const TDesC& aNewInlineText, TInt /*aPositionOfInsertionPointInInlineText*/ ) -{ - ClearInlineText(); - UpdateInlineText(aNewInlineText); +{ + ClearInlineText(); + UpdateInlineText(aNewInlineText); } // ----------------------------------------------------------------------------- // SetInlineEditingCursorVisibilityL -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::SetInlineEditingCursorVisibilityL(TBool /*aCursorVisibility*/) { @@ -328,8 +330,8 @@ // ----------------------------------------------------------------------------- // CancelFepInlineEdit -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::CancelFepInlineEdit() { @@ -337,8 +339,8 @@ // ----------------------------------------------------------------------------- // DocumentLengthForFep -// -// +// +// // ----------------------------------------------------------------------------- TInt CWebFepTextEditor::DocumentLengthForFep() const { @@ -358,23 +360,23 @@ } } - return length; + return length; } // ----------------------------------------------------------------------------- // DocumentMaximumLengthForFep -// -// +// +// // ----------------------------------------------------------------------------- TInt CWebFepTextEditor::DocumentMaximumLengthForFep() const -{ - TInt length = KMaxTInt; +{ + TInt length = KMaxTInt; Frame* frame = m_webView->page()->focusController()->focusedOrMainFrame(); if (frame && frame->document() && frame->document()->focusedNode() && - frame->document()->focusedNode()->hasTagName(HTMLNames::inputTag) ) { + frame->document()->focusedNode()->hasTagName(HTMLNames::inputTag) ) { length = static_cast(frame->document()->focusedNode())->maxLength(); } @@ -388,34 +390,40 @@ // ----------------------------------------------------------------------------- // SetCursorSelectionForFepL -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::SetCursorSelectionForFepL(const TCursorSelection& aCursorSelection) -{ +{ // The other part of the rather hackish way to check if we are at the end of the editing field // see WebEditorClient::handleKeypress Frame* frame = m_webView->page()->focusController()->focusedOrMainFrame(); - if ( frame ) { + if ( frame ) { SelectionController* sc = frame->selectionController(); Node* editNode = sc->base().node(); if ( IsTextAreaFocused() ) { + while(editNode && !editNode->isTextNode()){ + editNode = editNode->previousSibling(); + } TInt position( aCursorSelection.iAnchorPos ); TInt offset( 0 ); + TInt extentoffset = 0; if ( editNode ) { editNode = findTextNodeForCurPos( editNode, position ); - if ( aCursorSelection.iAnchorPos > position ) { - offset = aCursorSelection.iAnchorPos - position; - } - Position base( editNode, offset ); - Position extent( editNode, offset ); - sc->moveTo( base, extent, DOWNSTREAM ); + if(aCursorSelection.iAnchorPos >= position) { + offset = aCursorSelection.iAnchorPos - position; + extentoffset = aCursorSelection.iCursorPos - position; + } + extentoffset = extentoffset < 0 ? 0 : extentoffset; + Position base( editNode, offset ); + Position extent(editNode,extentoffset); + sc->moveTo( base, extent, DOWNSTREAM ); } } - else if ( editNode && editNode->isTextNode() ) { + else if ( editNode && editNode->isTextNode() ) { Position base( sc->baseNode(), aCursorSelection.iAnchorPos ); Position extent( sc->baseNode(), aCursorSelection.iCursorPos ); - sc->moveTo( base, extent, DOWNSTREAM ); + sc->moveTo( base, extent, DOWNSTREAM ); } HandleUpdateCursor(); } @@ -423,28 +431,31 @@ // ----------------------------------------------------------------------------- // GetCursorSelectionForFep -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::GetCursorSelectionForFep(TCursorSelection& aCursorSelection) const { aCursorSelection.SetSelection(0,0); - + Frame* frame = m_webView->page()->focusController()->focusedOrMainFrame(); - if ( frame ) { + if ( frame ) { SelectionController* sc = frame->selectionController(); Node* editNode = sc->base().node(); if ( frame && frame->document()->focusedNode() ) { if ( IsTextAreaFocused() ) { + HTMLTextAreaElement* ie = static_cast(frame->document()->focusedNode()); + while(editNode && !editNode->isTextNode()) + editNode = editNode->previousSibling(); TInt len( 0 ); if ( editNode ) { - findPrevSiblingTextLen( editNode, len ); + findPrevSiblingTextLen( editNode, len ); } - aCursorSelection.SetSelection( sc->baseOffset() + len, - sc->extentOffset() + len ); + aCursorSelection.SetSelection( ((sc->baseOffset()+len > ie->value().length()) ? 0 : sc->baseOffset()+len), + ((sc->extentOffset()+len > ie->value().length()) ? 0 : sc->baseOffset()+len)); } else { - aCursorSelection.SetSelection(sc->baseOffset(), sc->extentOffset()); + aCursorSelection.SetSelection(sc->baseOffset(), sc->extentOffset()); } } } @@ -452,19 +463,19 @@ // ----------------------------------------------------------------------------- // GetEditorContentForFep -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::GetEditorContentForFep( TDes& aEditorContent, TInt aDocumentPosition, TInt aLengthToRetrieve ) const -{ +{ aEditorContent = KNullDesC; // KNullDesC has length 0 if (aLengthToRetrieve == 0) { return; } - + Frame* frame = m_webView->page()->focusController()->focusedOrMainFrame(); if (frame && frame->document() && @@ -479,25 +490,25 @@ // Convert the newline to paragraph separator, because the FEP // input editors (vkb, etc) ignore newline String str(ie->value().substring(aDocumentPosition, aLengthToRetrieve)); - str.replace(EKeyLineFeed, CEditableText::EParagraphDelimiter); - aEditorContent = str; + str.replace(EKeyLineFeed, CEditableText::EParagraphDelimiter); + aEditorContent = str; } } } // ----------------------------------------------------------------------------- // GetFormatForFep -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::GetFormatForFep(TCharFormat& /*aFormat*/,TInt /*aDocumentPosition*/) const -{ +{ } // ----------------------------------------------------------------------------- // GetScreenCoordinatesForFepL -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::GetScreenCoordinatesForFepL(TPoint& aLeftSideOfBaseLine, TInt& aHeight, @@ -508,18 +519,18 @@ if (frame && frame->document() && frame->document()->focusedNode()){ - if ( frame->document()->focusedNode()->hasTagName(HTMLNames::inputTag) || + if ( frame->document()->focusedNode()->hasTagName(HTMLNames::inputTag) || frame->document()->focusedNode()->hasTagName(HTMLNames::textareaTag)){ - HTMLGenericFormElement* ie = static_cast(frame->document()->focusedNode()); + HTMLGenericFormElement* ie = static_cast(frame->document()->focusedNode()); SelectionController* sc = frame->selectionController(); int xPos(0); int yPos(0); if ( sc ){ - IntRect rect = sc->caretRect(); - xPos = rect.x(); - yPos = rect.y(); - yPos += m_webView->brCtl()->PositionRelativeToScreen().iY; - Node* editNode = sc->focusNode(); + IntRect rect = sc->caretRect(); + Node* editNode = sc->focusNode(); + TPoint viewPoint = kit(frame)->frameView()->frameCoordsInViewCoords(editNode->getRect().Rect().iBr); + xPos = viewPoint.iX; + yPos = viewPoint.iY; String str; if ( editNode && editNode->isTextNode() ) { @@ -531,14 +542,14 @@ if( position > 0 ){ word = str.left( position ); } - RenderStyle* s = frame->document()->focusedNode()->renderStyle(); + RenderStyle* s = frame->document()->focusedNode()->renderStyle(); PlatformFontCache* cache = StaticObjectsContainer::instance()->fontCache(); CFont* sFont = cache->zoomedFont( s->fontDescription(), cache->fontZoomFactor()); TInt sizePix = sFont->MeasureText( word.des() ); - xPos -= sizePix; - } + xPos -= sizePix; + } } - aLeftSideOfBaseLine.SetXY( xPos,yPos ); + aLeftSideOfBaseLine.SetXY( xPos,yPos ); } } aAscent = 0; @@ -547,23 +558,27 @@ // ----------------------------------------------------------------------------- // DoCommitFepInlineEditL -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::DoCommitFepInlineEditL() -{ - ClearInlineText(); +{ + ClearInlineText(); if (m_inlineEditText && DocumentLengthForFep() < DocumentMaximumLengthForFep()) { Frame* frame = m_webView->page()->focusController()->focusedOrMainFrame(); if (frame){ - frame->editor()->insertTextWithoutSendingTextEvent(String(*m_inlineEditText), false); + if(IsWapMaskedModeInput(frame)) { + HandleMaskedInsertText(frame, (String(*m_inlineEditText))); + } + else { + frame->editor()->insertTextWithoutSendingTextEvent(String(*m_inlineEditText), false); + } } } - //delete the m_inlineEditText since text is commited - delete m_inlineEditText; - m_inlineEditText = NULL; + delete m_inlineEditText; + m_inlineEditText = NULL; HandleUpdateCursor(); UpdateEditingMode(); @@ -571,8 +586,8 @@ // ----------------------------------------------------------------------------- // Extension1 -// -// +// +// // ----------------------------------------------------------------------------- MCoeFepAwareTextEditor_Extension1* CWebFepTextEditor::Extension1(TBool& aSetToTrue) { @@ -582,31 +597,31 @@ // ----------------------------------------------------------------------------- // MCoeFepAwareTextEditor_Reserved_2 -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::MCoeFepAwareTextEditor_Reserved_2() { } - + //////////////////////////////////////////////////////////////////////////////// // from MCoeFepAwareTextEditor_Extension1 // ----------------------------------------------------------------------------- // SetStateTransferingOwnershipL -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::SetStateTransferingOwnershipL(CState* aState, TUid /*aTypeSafetyUid*/) { delete m_state; - m_state = aState; + m_state = aState; } // ----------------------------------------------------------------------------- // State -// -// +// +// // ----------------------------------------------------------------------------- MCoeFepAwareTextEditor_Extension1::CState* CWebFepTextEditor::State(TUid /*aTypeSafetyUid*/) { @@ -620,17 +635,17 @@ // ----------------------------------------------------------------------------- // StartFepInlineEditL -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::StartFepInlineEditL( - TBool& aSetToTrue, - const TCursorSelection& aCursorSelection, - const TDesC& aInitialInlineText, - TInt aPositionOfInsertionPointInInlineText, - TBool aCursorVisibility, - const MFormCustomDraw* aCustomDraw, - MFepInlineTextFormatRetriever& aInlineTextFormatRetriever, + TBool& aSetToTrue, + const TCursorSelection& aCursorSelection, + const TDesC& aInitialInlineText, + TInt aPositionOfInsertionPointInInlineText, + TBool aCursorVisibility, + const MFormCustomDraw* aCustomDraw, + MFepInlineTextFormatRetriever& aInlineTextFormatRetriever, MFepPointerEventHandlerDuringInlineEdit& aPointerEventHandlerDuringInlineEdit) { aSetToTrue=ETrue; @@ -640,8 +655,8 @@ // ----------------------------------------------------------------------------- // SetCursorType -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::SetCursorType(TBool& /*aSetToTrue*/, const TTextCursor& /*aTextCursor*/) { @@ -652,14 +667,14 @@ // ----------------------------------------------------------------------------- // IsValidCharacter -// -// +// +// // ----------------------------------------------------------------------------- TBool CWebFepTextEditor::IsValidCharacter(TInt aChar) { return ETrue; } - + //////////////////////////////////////////////////////////////////////////////// // from MObjectProvider @@ -677,7 +692,7 @@ return aId.Null(); } - + //////////////////////////////////////////////////////////////////////////////// // New public methods @@ -685,35 +700,35 @@ // ----------------------------------------------------------------------------- // UpdateFlagsState -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::UpdateFlagsState(TUint flags) -{ - CAknEdwinState* state = static_cast(State(KNullUid)); - +{ + CAknEdwinState* state = static_cast(State(KNullUid)); + if ( IsTextAreaFocused() ) { // If in a TextArea, allow "enter" key presses to be newline/paragraph - state->SetFlags( flags | EAknEditorFlagUseSCTNumericCharmap + state->SetFlags( flags | EAknEditorFlagUseSCTNumericCharmap | EAknEditorFlagAllowEntersWithScrollDown ); } else { state->SetFlags(flags | EAknEditorFlagUseSCTNumericCharmap); } - + state->ReportAknEdStateEventL(MAknEdStateObserver::EAknEdwinStateFlagsUpdate); } // ----------------------------------------------------------------------------- // UpdateInputModeState -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::UpdateInputModeState(TUint inputMode, TUint permittedInputModes, TUint numericKeyMap) -{ +{ - CAknEdwinState* state = static_cast(State(KNullUid)); - + CAknEdwinState* state = static_cast(State(KNullUid)); + if (permittedInputModes != EAknEditorNumericInputMode) { EVariantFlag variant = AknLayoutUtils::Variant(); if (variant == EApacVariant) { @@ -721,64 +736,62 @@ EAknEditorHalfWidthTextInputMode | EAknEditorFullWidthTextInputMode | EAknEditorKatakanaInputMode | EAknEditorFullWidthKatakanaInputMode | EAknEditorHiraganaKanjiInputMode | EAknEditorHiraganaInputMode; - + } } - - state->SetDefaultInputMode(inputMode); - state->SetCurrentInputMode(inputMode); - state->SetPermittedInputModes(permittedInputModes); + + state->SetDefaultInputMode(inputMode); + state->SetCurrentInputMode(inputMode); + state->SetPermittedInputModes(permittedInputModes); state->SetNumericKeymap(static_cast(numericKeyMap)); - - state->ReportAknEdStateEventL(MAknEdStateObserver::EAknEdwinStateInputModeUpdate); - + state->ReportAknEdStateEventL(MAknEdStateObserver::EAknEdwinStateInputModeUpdate); } // ----------------------------------------------------------------------------- // UpdateCaseState -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::UpdateCaseState(TUint currentCase, TUint permittedCase) -{ - CAknEdwinState* state = static_cast(State(KNullUid)); +{ + CAknEdwinState* state = static_cast(State(KNullUid)); Frame* frame = m_webView->page()->focusController()->focusedOrMainFrame(); if (frame){ if (frame->editor()->canEditRichly()) { - state->SetDefaultCase(EAknEditorTextCase); + state->SetDefaultCase(EAknEditorTextCase); } else { state->SetDefaultCase(currentCase); state->SetCurrentCase(currentCase); - state->SetPermittedCases(permittedCase); - } + state->SetPermittedCases(permittedCase); + } } - - state->ReportAknEdStateEventL(MAknEdStateObserver::EAknEdwinStateCaseModeUpdate); + + state->ReportAknEdStateEventL(MAknEdStateObserver::EAknEdwinStateCaseModeUpdate); } // ----------------------------------------------------------------------------- // HandleUpdateCursor // -// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::HandleUpdateCursor() { // ReportAknEdStateEventL, for events see aknedstsobs.h - // MAknEdStateObserver::EAknCursorPositionChanged - - CAknEdwinState* state = static_cast(State(KNullUid)); - if ( state ) { + // MAknEdStateObserver::EAknCursorPositionChanged + + CAknEdwinState* state = static_cast(State(KNullUid)); + if ( state ) { TRAP_IGNORE( state->ReportAknEdStateEventL( MAknEdStateObserver::EAknCursorPositionChanged ) ); } } // ----------------------------------------------------------------------------- // GetStateFromFormatMask -// -// +// +// // ----------------------------------------------------------------------------- bool CWebFepTextEditor::GetStateFromFormatMask(TUint& currentCase, TUint& permittedCase, @@ -787,31 +800,36 @@ TUint& flags, TUint& numericKeyMap) { - Frame* frame = m_webView->page()->focusController()->focusedOrMainFrame(); + Frame* frame = m_webView->page()->focusController()->focusedOrMainFrame(); if (frame && m_textFormatMask) { - - TInt cursorpos = DocumentLengthForFep(); - TInputFormatMaskType fm = m_textFormatMask->getInputFormatMaskType(frame, cursorpos); + TInt cursorpos = DocumentLengthForFep(); + TInputFormatMaskType fm = m_textFormatMask->getInputFormatMaskType(frame, cursorpos); + if (!cursorpos) { + while(fm == EStatic) { + fm = m_textFormatMask->getInputFormatMaskType(frame, ++cursorpos); + } + } + setSCTAvailability(true); switch( fm ) { case ELeUpSymPuc: //A any upper case letter or symbolic flags = EAknEditorFlagNoT9 | EAknEditorFlagFixedCase; - currentCase = EAknEditorUpperCase; - permittedCase = EAknEditorUpperCase; + currentCase = EAknEditorUpperCase; + permittedCase = EAknEditorUpperCase; inputMode = EAknEditorTextInputMode; permittedInputModes = EAknEditorTextInputMode; break; case ELeLoSymPuc: //a any lower case letter or symbolic flags = EAknEditorFlagNoT9 | EAknEditorFlagFixedCase; currentCase = EAknEditorLowerCase; - permittedCase= EAknEditorLowerCase; + permittedCase= EAknEditorLowerCase; inputMode = EAknEditorTextInputMode; permittedInputModes= EAknEditorTextInputMode; break; case ELeUpNumSymPuc: //X any upper case, number or symbolic flags = EAknEditorFlagNoT9 | EAknEditorFlagFixedCase; currentCase = EAknEditorUpperCase; - permittedCase= EAknEditorUpperCase; + permittedCase= EAknEditorUpperCase; inputMode = EAknEditorTextInputMode; permittedInputModes= EAknEditorTextInputMode; break; @@ -823,13 +841,15 @@ permittedInputModes= EAknEditorTextInputMode | EAknEditorNumericInputMode; break; case EAnyLow: //m any lower character can be changed to upper + flags = EAknEditorFlagNoT9; currentCase = EAknEditorLowerCase; permittedCase= EAknEditorAllCaseModes; inputMode = EAknEditorTextInputMode; permittedInputModes= EAknEditorAllInputModes; - break; + break; case EAnyUpper: //M any upper character can be changed to lower - currentCase = EAknEditorUpperCase; + flags = EAknEditorFlagNoT9; + currentCase = EAknEditorUpperCase; permittedCase= EAknEditorAllCaseModes; inputMode = EAknEditorTextInputMode; permittedInputModes= EAknEditorAllInputModes; @@ -838,36 +858,38 @@ flags = EAknEditorFlagNoT9; currentCase = EAknEditorUpperCase; permittedCase = EAknEditorAllCaseModes; - inputMode = EAknEditorNumericInputMode; - permittedInputModes= EAknEditorAllInputModes; + inputMode = EAknEditorNumericInputMode; + permittedInputModes= EAknEditorAllInputModes; break; case ENumChar: //N any number flags = EAknEditorFlagNoT9; currentCase = EAknEditorUpperCase; permittedCase = EAknEditorAllCaseModes; - inputMode = EAknEditorNumericInputMode; - permittedInputModes= EAknEditorNumericInputMode; + inputMode = EAknEditorNumericInputMode; + permittedInputModes= EAknEditorNumericInputMode; + numericKeyMap = EAknEditorPlainNumberModeKeymap; + setSCTAvailability(false); break; - case EStatic: + case EStatic: return EFalse; break; - case ENoFormat: + case ENoFormat: return EFalse; - break; + break; default: - return EFalse; - } - - return ETrue; + return EFalse; + } + + return ETrue; } - return EFalse; + return EFalse; } // ----------------------------------------------------------------------------- // validateTextFormat -// -// +// +// // ----------------------------------------------------------------------------- bool CWebFepTextEditor::validateTextFormat() { @@ -875,39 +897,39 @@ if (!frame || !frame->document()->focusedNode()) return true; - RenderStyle* s = frame->document()->focusedNode()->renderStyle(); - if (!m_textFormatMask) { + RenderStyle* s = frame->document()->focusedNode()->renderStyle(); + if (!m_textFormatMask) { return true; } - + Node* n = frame->document()->focusedNode(); if (n->hasTagName(HTMLNames::inputTag)) { HTMLInputElement* input = static_cast(n); WebTextFormatMask::ErrorBlock eb; CSSStyleDeclaration* style = input->style(); - ExceptionCode ec = 0; - - String inputColor = style->getPropertyValue(CSS_PROP_COLOR); + ExceptionCode ec = 0; + + String inputColor = style->getPropertyValue(CSS_PROP_COLOR); if ( inputColor.lower() != "red" ) { - m_inputTextColor = inputColor; + m_inputTextColor = inputColor; } - + if (!m_textFormatMask->checkText(input->value(), eb)) { style->setProperty(CSS_PROP_COLOR, "red", false, ec); return false; } - else + else { style->setProperty(CSS_PROP_COLOR, m_inputTextColor, false, ec); CancelEditingMode(); - return true; + return true; } } else if ( n->hasTagName(HTMLNames::textareaTag)) { CancelEditingMode(); } - + return true; } @@ -940,14 +962,14 @@ // ----------------------------------------------------------------------------- // SetAlignment // The EInputEditorAlignXXX flags are only supported in 5.0+ platforms -// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::SetAlignment(CAknExtendedInputCapabilities::TInputCapabilities aAlignment) { if ( !m_ExtendedInputCapabilities ) { return; } - + // Clear the old alignment TUint capabilities = m_ExtendedInputCapabilities->Capabilities(); capabilities &= ~( CAknExtendedInputCapabilities::KAknEditorAlignMask ); @@ -960,42 +982,47 @@ // ----------------------------------------------------------------------------- // UpdateInlineText -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::UpdateInlineText(const TDesC& aText) -{ - delete m_inlineEditText; - m_inlineEditText = NULL; - - if (DocumentLengthForFep() >= DocumentMaximumLengthForFep()) +{ + delete m_inlineEditText; + m_inlineEditText = NULL; + + if (DocumentLengthForFep() >= DocumentMaximumLengthForFep()) return; - m_inlineEditText = aText.Alloc(); - + m_inlineEditText = aText.Alloc(); + Frame* frame = m_webView->page()->focusController()->focusedOrMainFrame(); - + if (!frame) return; - - + + RenderStyle* r = NULL; if ( Node *n = frame->selectionController()->selection().start().node() ) { r = n->renderStyle(); } - + bool textSecurity = r && r->textSecurity() != TSNONE; RefPtr oldStyle; - if (textSecurity) { + if (textSecurity) { oldStyle = frame->typingStyle(); RefPtr style = new CSSMutableStyleDeclaration; style->setProperty(CSS_PROP__WEBKIT_TEXT_SECURITY, CSS_VAL_NONE); frame->computeAndSetTypingStyle(style.get(), EditActionTyping); } - - frame->editor()->insertTextWithoutSendingTextEvent(String(*m_inlineEditText), false); - + + if(!DocumentLengthForFep() && IsWapMaskedModeInput(frame)) { + HandleMaskedInsertText(frame, String(*m_inlineEditText)); + } + else { + frame->editor()->insertTextWithoutSendingTextEvent(String(*m_inlineEditText), false); + } + if (textSecurity) { if (oldStyle) frame->setTypingStyle(oldStyle.get()); @@ -1006,16 +1033,16 @@ // ----------------------------------------------------------------------------- // ClearInlineText -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::ClearInlineText() { TInt oldlen = m_inlineEditText ? m_inlineEditText->Length() : 0; - TKeyEvent keyEvent = { EKeyBackspace, EKeyBackspace, 0, 0 }; + TKeyEvent keyEvent = { EKeyBackspace, EKeyBackspace, 0, 0 }; Frame* frame = m_webView->page()->focusController()->focusedOrMainFrame(); - if (frame) { + if (frame) { while ( oldlen-- ) { frame->editor()->deleteWithDirection(SelectionController::BACKWARD, CharacterGranularity, false, true); @@ -1025,8 +1052,8 @@ // ----------------------------------------------------------------------------- // IsTextAreaFocused -// -// +// +// // ----------------------------------------------------------------------------- bool CWebFepTextEditor::IsTextAreaFocused() const { @@ -1037,85 +1064,85 @@ // ----------------------------------------------------------------------------- // CcpuIsFocused -// -// +// +// // ----------------------------------------------------------------------------- TBool CWebFepTextEditor::CcpuIsFocused() const { return ETrue; } - + // ----------------------------------------------------------------------------- // CcpuCanCut -// -// +// +// // ----------------------------------------------------------------------------- TBool CWebFepTextEditor::CcpuCanCut() const { TCursorSelection selection; - GetCursorSelectionForFep(selection); + GetCursorSelectionForFep(selection); return selection.Length(); } // ----------------------------------------------------------------------------- // CcpuCutL -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::CcpuCutL() { PlaceDataOnClipboardL(); TCursorSelection selection; - GetCursorSelectionForFep(selection); + GetCursorSelectionForFep(selection); } - + // ----------------------------------------------------------------------------- // CcpuCanCopy -// -// +// +// // ----------------------------------------------------------------------------- TBool CWebFepTextEditor::CcpuCanCopy() const { TCursorSelection selection; - GetCursorSelectionForFep(selection); + GetCursorSelectionForFep(selection); return selection.Length(); } - + // ----------------------------------------------------------------------------- // CcpuCopyL -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::CcpuCopyL() { PlaceDataOnClipboardL(); } - + // ----------------------------------------------------------------------------- // CcpuCanPaste -// -// +// +// // ----------------------------------------------------------------------------- TBool CWebFepTextEditor::CcpuCanPaste() const { TRAPD(err, DoCcpuCanPasteL()); return err == KErrNone; } - + // ----------------------------------------------------------------------------- // CcpuPasteL -// -// +// +// // ----------------------------------------------------------------------------- -void CWebFepTextEditor::CcpuPasteL() +void CWebFepTextEditor::CcpuPasteL() { - RetrieveDataFromClipboardL(); + RetrieveDataFromClipboardL(); } - + // ----------------------------------------------------------------------------- // DoCcpuCanPasteL -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::DoCcpuCanPasteL() const { @@ -1125,12 +1152,12 @@ if (streamId==KNullStreamId) User::Leave(KErrNotFound); CleanupStack::PopAndDestroy(); // allowedChars, cb -} - +} + // ----------------------------------------------------------------------------- // PlaceDataOnClipboardL -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::PlaceDataOnClipboardL() { @@ -1143,8 +1170,8 @@ // ----------------------------------------------------------------------------- // CopyToStoreL -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::CopyToStoreL(CStreamStore& aStore,CStreamDictionary& aDict) { @@ -1152,24 +1179,95 @@ return ; TCursorSelection selection; GetCursorSelectionForFep(selection); - + HBufC* buf = HBufC::NewLC(512); TPtr ptr(buf->Des()); - + GetEditorContentForFep(ptr,0,DocumentLengthForFep()); - CPlainText* text = CPlainText::NewL(CPlainText::EFlatStorage); - - text->InsertL(0,*buf); + CPlainText* text = CPlainText::NewL(CPlainText::EFlatStorage); + + text->InsertL(0,*buf); text->CopyToStoreL(aStore, aDict, selection.LowerPos(), selection.Length()); - + delete text; - CleanupStack::PopAndDestroy(); + CleanupStack::PopAndDestroy(); +} + +// ----------------------------------------------------------------------------- +// HandleMaskedInsertText +// +// +// ----------------------------------------------------------------------------- +void CWebFepTextEditor::HandleMaskedInsertText(WebCore::Frame *frame, const String& text) +{ + TInt pos = DocumentLengthForFep(); + if (!pos) { + while(m_textFormatMask->getInputFormatMaskType(frame, pos) == EStatic) { + MaskStatic* ms = static_cast(m_textFormatMask->getMask(pos)); + UChar mask(ms->getStatic()); + frame->editor()->insertTextWithoutSendingTextEvent(String(&mask,1), false); + ++pos; + } + frame->editor()->insertTextWithoutSendingTextEvent(text, false); + } + else { + frame->editor()->insertTextWithoutSendingTextEvent(text, false); + while(m_textFormatMask->getInputFormatMaskType(frame, ++pos) == EStatic) { + TCursorSelection selection; + GetCursorSelectionForFep(selection); + const TInt cursorPos=selection.LowerPos(); + if (cursorPos>=pos) { + MaskStatic* ms = static_cast(m_textFormatMask->getMask(pos)); + UChar mask(ms->getStatic()); + frame->editor()->insertTextWithoutSendingTextEvent(String(&mask,1), false); + } + } + } +} + +// ----------------------------------------------------------------------------- +// HandleMaskedDeleteText +// +// +// ----------------------------------------------------------------------------- +void CWebFepTextEditor::HandleMaskedDeleteText(WebCore::Frame* frame) +{ + TCursorSelection selection; + GetCursorSelectionForFep(selection); + TInt cursorPos=selection.LowerPos(); + + if (cursorPos == DocumentLengthForFep()) { + while (m_textFormatMask->getInputFormatMaskType(frame, --cursorPos) == EStatic) { + frame->editor()->deleteWithDirection(SelectionController::BACKWARD, + CharacterGranularity, false, true); + } + } + if (cursorPos >=0) + frame->editor()->deleteWithDirection(SelectionController::BACKWARD, + CharacterGranularity, false, true); +} + +// ----------------------------------------------------------------------------- +// IsWapMaskedModeInput +// +// +// ----------------------------------------------------------------------------- +bool CWebFepTextEditor::IsWapMaskedModeInput(WebCore::Frame* frame) +{ + bool maskedInput(false); + if (m_textFormatMask && frame->document() && frame->document()->focusedNode()) { + RenderStyle* s = frame->document()->focusedNode()->renderStyle(); + if (s && (!s->wapInputFormat().isEmpty() || s->wapInputRequired())){ + maskedInput = true; + } + } + return maskedInput; } // ----------------------------------------------------------------------------- // RetrieveDataFromClipboardL -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::RetrieveDataFromClipboardL() { @@ -1180,13 +1278,13 @@ User::LeaveIfError(err); TStreamId streamId=cb->StreamDictionary().At(KClipboardUidTypePlainText); PasteFromStoreL(cb->Store(), cb->StreamDictionary()); - CleanupStack::PopAndDestroy(); // cb + CleanupStack::PopAndDestroy(); // cb } - + // ----------------------------------------------------------------------------- // PasteFromStoreL -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::PasteFromStoreL(CStreamStore& aStore,CStreamDictionary& aDict) { @@ -1196,58 +1294,58 @@ TCursorSelection selection; GetCursorSelectionForFep(selection); const TInt cursorPos=selection.LowerPos(); - + HBufC* buf1 = HBufC::NewLC(512); TPtr ptr1(buf1->Des()); - - CPlainText* text = CPlainText::NewL(CPlainText::EFlatStorage); - - GetEditorContentForFep(ptr1,0,DocumentLengthForFep()); - + + CPlainText* text = CPlainText::NewL(CPlainText::EFlatStorage); + + GetEditorContentForFep(ptr1,0,DocumentLengthForFep()); + text->InsertL(0,*buf1); - + TInt charPasted = text->PasteFromStoreL(aStore,aDict,cursorPos); - + HBufC* buf = HBufC::NewLC(512); TPtr ptr(buf->Des()); - text->Extract(ptr,cursorPos,charPasted); - + text->Extract(ptr,cursorPos,charPasted); + //remove Paragraph Delimiter TInt position = ptr.Mid(0).LocateReverse(TChar(CEditableText::EParagraphDelimiter)); while (position != KErrNotFound ){ ptr.Delete( position, 1 ); position = ptr.Left(position).LocateReverse(TChar(CEditableText::EParagraphDelimiter)); - } - + } + Frame* frame = m_webView->page()->mainFrame(); frame = m_webView->page()->focusController()->focusedOrMainFrame(); frame->editor()->insertTextWithoutSendingTextEvent(String(ptr), false); - + delete text; CleanupStack::PopAndDestroy(2); } // ----------------------------------------------------------------------------- // EnableCcpu -// -// +// +// // ----------------------------------------------------------------------------- void CWebFepTextEditor::EnableCcpu(TBool aSupport) { CAknEdwinState* edwinState = static_cast(this->State(KNullUid)); if(aSupport) { - edwinState->SetCcpuState(this); + edwinState->SetCcpuState(this); } else { edwinState->SetCcpuState(NULL); - } + } } // ----------------------------------------------------------------------------- // findPrevSiblingTextLen -// +// // Walk the previous text nodes and add up the len of each text node, so we can // calculate the total length from first text node to current text node cursor // position. @@ -1295,7 +1393,7 @@ WebCore::Text* aText = (WebCore::Text*)aNode; str = aText->data(); len += str.length(); - if ( len >= aPos ) { + if ( len > aPos ) { // We found the text node at aPos, calculate the length of all // previous text nodes retNode = aNode; @@ -1307,3 +1405,23 @@ return retNode; } + +// ----------------------------------------------------------------------------- +// SetSCTAvailability +// +// Set availibility of the special character table. +// ----------------------------------------------------------------------------- +void CWebFepTextEditor::setSCTAvailability(bool aAvailable) +{ + if (m_ExtendedInputCapabilities) { + TUint capabilities = m_ExtendedInputCapabilities->Capabilities(); + if (!aAvailable) { + capabilities |= CAknExtendedInputCapabilities::EDisableSCT; + } + else { + capabilities &= ~(CAknExtendedInputCapabilities::EDisableSCT); + } + m_ExtendedInputCapabilities->SetCapabilities(capabilities); + } +} +