diff -r ae942d28ec0e -r 2455ef1f5bbc javauis/lcdui_akn/lcdui/src/CMIDTextBoxDialogControl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/lcdui_akn/lcdui/src/CMIDTextBoxDialogControl.cpp Wed Sep 01 12:33:18 2010 +0100 @@ -0,0 +1,372 @@ +/* +* Copyright (c) 2008-2009 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: Pop-up TextBox dialog control implementation for S60 +* +*/ + +#include +#include "CMIDTextBoxDialogControl.h" + +#include "lcdui.hrh" +#include +#include + +#include + + +CMIDTextBoxDialogControl* CMIDTextBoxDialogControl::NewL( + TInt aConstraints, + const TDesC& aText, + TInt aMaxSize, + MMIDDisplayable* aDisplayable) +{ + CMIDTextBoxDialogControl* self = + new(ELeave) CMIDTextBoxDialogControl(); + + CleanupStack::PushL(self); + self->ConstructL(aConstraints, aText, aMaxSize, aDisplayable); + CleanupStack::Pop(self); + + return self; +} + +CMIDTextBoxDialogControl::~CMIDTextBoxDialogControl() +{ + if (iDialog) + { + delete iDialog; + } + + iTextContent.Close(); + delete iCurrentText; + + // Displayable is notified about content control deletion + if (iDisplayable) + { + iDisplayable->NotifyContentDestroyed(); + } +} + +void CMIDTextBoxDialogControl::ConstructL( + TInt aConstraints, + const TDesC& aText, + TInt aMaxSize, + MMIDDisplayable* aDisplayable) +{ + iDisplayable = static_cast< CMIDDisplayable* >(aDisplayable); + iTextContent.CreateL(KNullDesC, aMaxSize); + + CreateTextBoxQueryDialogL(iDialog, aConstraints, aMaxSize, aText); + SetTextL(aText); + + iDisplayable->SetPopupTextBox(ETrue); + SetRect(iDisplayable->Rect()); + iDisplayable->SetComponentL(*this); + + + SetContainerWindowL(*iDisplayable); + + iCurrentText = GetTextL(); + + if (iCurrentText) + { + iCursorPosition = iCurrentText->Length(); + } + else + { + iCursorPosition = 0; + } +} + +CMIDTextBoxDialogControl::CMIDTextBoxDialogControl() +{ +} + +void CMIDTextBoxDialogControl::CreateTextBoxQueryDialogL( + CMIDTextBoxQueryDialog*& aDialog, + TInt aConstraints, TInt aMaxSize, + const TDesC& aText) +{ + CMIDTextBoxQueryDialog* dialog = CMIDTextBoxQueryDialog::NewLC( + aConstraints, + iTextContent, + aMaxSize, + iDisplayable, + aText); + + dialog->MakeVisible(EFalse); + dialog->SetEditorL(); + aDialog = dialog; + CleanupStack::Pop(dialog); +} + +/** Deletes the existing text box dialog and recreates a new one. This is called by SetConstraints(). +If we fail creating the new text box we make sure the old one is still +there. Makes sure the focus position is preserved. */ +void CMIDTextBoxDialogControl::RecreateTextBoxL(TUint aConstraints) +{ + ASSERT(iDialog); + HandleCurrentL(EFalse); + HBufC* text = iDialog->GetTextL(); + CleanupStack::PushL(text); + + TInt maxSize = iDialog->GetMaxSize(); + iCursorPosition = iDialog->GetCaretPosition(); + + // TextBox's focus state is stored because after recreating + // TextBox the focus information is lost. + TBool hasFocus = IsFocused(); + iTextContent.Close(); + iTextContent.CreateL(KNullDesC, maxSize); + + CMIDTextBoxQueryDialog* dialog = NULL; + CreateTextBoxQueryDialogL(dialog, aConstraints, maxSize, KNullDesC); + delete iDialog; + iDialog = dialog; + + if (text) + { + iDialog->SetTextWithNewConstraintsL(text); + } + + CleanupStack::PopAndDestroy(text); + + delete iCurrentText; + iCurrentText = NULL; + iCurrentText = GetTextL(); + + // Check if the text size has changed and reposition cursor if needed + if (iCursorPosition > iDialog->Size()) + { + iCursorPosition = iDialog->Size(); + } + + // Activate new iTextBox with CoeControl + ActivateL(); + + // If TextBox had focus before recreation, the focus is restored. + if (hasFocus) + { + iDialog->SetFocus(ETrue); + } + + iDialog->SetTitleL(iDisplayable->Title()); + HandleCurrentL(iDisplayable->IsActive()); +} + +void CMIDTextBoxDialogControl::HandleCurrentL(TBool aCurrent) +{ + if (aCurrent) + { + iEikonEnv->EikAppUi()->AddToStackL(iDialog, ECoeStackPriorityMenu); + + // Set dialog cursor to zero and back again after it returns from + // iDialog->ShowL. + + TInt curPosition = iCursorPosition; + iCursorPosition = 0; + iDialog->SetCursorPositionL(iCursorPosition); + + iDialog->ShowL(ETrue); + + iCursorPosition = curPosition; + // Set cursor position back to original value. + iDialog->SetCursorPositionL(iCursorPosition); + } + else + { + delete iCurrentText; + iCurrentText = NULL; + iCurrentText = GetTextL(); + iCursorPosition = iDialog->GetCaretPosition(); + iDialog->ShowL(EFalse); + iEikonEnv->EikAppUi()->RemoveFromStack(iDialog); + } +} + +// +// methods from MMIDTextBox +// + +void CMIDTextBoxDialogControl::DeleteTextL(TInt aOffset, TInt aLength) +{ + if (iDialog) + { + iDialog->DeleteTextL(aOffset, aLength); + iCursorPosition = GetCaretPosition(); + delete iCurrentText; + iCurrentText = NULL; + iCurrentText = GetTextL(); + } +} + +void CMIDTextBoxDialogControl::SetTextL(const TDesC& aText) +{ + if (iDialog) + { + iDialog->SetTextL(aText); + iCursorPosition = GetCaretPosition(); + delete iCurrentText; + iCurrentText = NULL; + iCurrentText = GetTextL(); + } +} + +void CMIDTextBoxDialogControl::InsertTextL( + const TDesC& aText, TInt aPosition) +{ + if (iDialog) + { + iDialog->InsertTextL(aText, aPosition); + iCursorPosition = GetCaretPosition(); + delete iCurrentText; + iCurrentText = NULL; + iCurrentText = GetTextL(); + } +} + +void CMIDTextBoxDialogControl::SetConstraintsL(TUint aConstraints) +{ + RecreateTextBoxL(aConstraints); + delete iCurrentText; + iCurrentText = NULL; + iCurrentText = GetTextL(); +} + +TInt CMIDTextBoxDialogControl::SetMaxSizeL(TInt aSize) +{ + TInt maxSize = iDialog->SetMaxSizeL(aSize); + iCursorPosition = GetCaretPosition(); + delete iCurrentText; + iCurrentText = NULL; + iCurrentText = GetTextL(); + return maxSize; +} + +TInt CMIDTextBoxDialogControl::GetMaxSize() +{ + return iDialog->GetMaxSize(); +} + +TInt CMIDTextBoxDialogControl::Size() +{ + return iDialog->Size(); +} + +TInt CMIDTextBoxDialogControl::GetCaretPosition() +{ + return iDialog->GetCaretPosition(); +} + +HBufC* CMIDTextBoxDialogControl::GetTextL() +{ + return iDialog->GetTextL(); +} + +void CMIDTextBoxDialogControl::SetInitialInputModeL( + const TDesC& aCharacterSubset) +{ + iDialog->SetInitialInputModeL(aCharacterSubset); + delete iCurrentText; + iCurrentText = NULL; + iCurrentText = GetTextL(); +} + +TInt CMIDTextBoxDialogControl::CountComponentControls() const +{ + return 1; // iTextBox +} + +CCoeControl* CMIDTextBoxDialogControl::ComponentControl(TInt aIndex) const +{ + if (aIndex == 0) + { + return iDialog; + } + + return NULL; +} + +TKeyResponse CMIDTextBoxDialogControl::OfferKeyEventL( + const TKeyEvent& aKeyEvent, TEventCode aType) +{ + // If midlet is closed from applications menu or by pressing end key, then + // 'esc' key event is generated. In that case we must close the dialog. + if (aKeyEvent.iCode == EKeyEscape && + aKeyEvent.iModifiers == 0 && + aType == EEventKey) + { + HandleCurrentL(EFalse); + + return EKeyWasConsumed; + } + + return EKeyWasNotConsumed; +} + +void CMIDTextBoxDialogControl::FocusChanged(TDrawNow /*aDrawNow*/) +{ + if (iDialog) + { + if (IsFocused()) + { + iDialog->SetFocus(ETrue); + } + else + { + iDialog->SetFocus(EFalse); + } + } +} + +void CMIDTextBoxDialogControl::ActivateL() +{ + CCoeControl::ActivateL(); + + // Cursor position must be set, because CEikEdwin doesn't leave the cursor + // at its current position when the CEikEdwin is re-activated. + iDialog->SetCursorPositionL(iCursorPosition); + + // needed to be called explicitly to layout controls as ActivateL() will not call it if size has not changed + iDialog->SizeChanged(); +} + +void CMIDTextBoxDialogControl::SetTitleL(const TDesC* aString) +{ + if (aString) + { + iDialog->SetTitleL(aString); + } + else + { + iDialog->SetTitleL(&KNullTitle); + } + + // By recreating the dialog we ensure that the layout is correct. + // Recreation is not needed when dialog is visible. + if (iDialog->Showing()) + { + RecreateTextBoxL(iDialog->Constraints()); + delete iCurrentText; + iCurrentText = NULL; + iCurrentText = GetTextL(); + } +} + +CMIDTextBoxQueryDialog* CMIDTextBoxDialogControl::Dialog() +{ + return iDialog; +} + +// End of file