#define DALI_TOOLKIT_TEXT_CONTROLLER_IMPL_H
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
// INTERNAL INCLUDES
#include <dali-toolkit/internal/text/input-style.h>
-#include <dali-toolkit/internal/text/layouts/layout-engine.h>
-#include <dali-toolkit/internal/text/logical-model-impl.h>
-#include <dali-toolkit/internal/text/text-scroller-data.h>
#include <dali-toolkit/internal/text/text-controller.h>
+#include <dali-toolkit/internal/text/text-model.h>
#include <dali-toolkit/internal/text/text-view.h>
-#include <dali-toolkit/internal/text/visual-model-impl.h>
+#include <dali-toolkit/public-api/styling/style-manager.h>
+#include <dali-toolkit/devel-api/styling/style-manager-devel.h>
namespace Dali
{
//Forward declarations
struct CursorInfo;
+struct FontDefaults;
struct Event
{
int mInt;
unsigned int mUint;
float mFloat;
+ bool mBool;
};
Event( Type eventType )
TEXT_PANNING
};
- EventData( DecoratorPtr decorator );
+ EventData( DecoratorPtr decorator, InputMethodContext& inputMethodContext );
~EventData();
}
DecoratorPtr mDecorator; ///< Pointer to the decorator.
- ImfManager mImfManager; ///< The Input Method Framework Manager.
+ InputMethodContext mInputMethodContext; ///< The Input Method Framework Manager.
+ FontDefaults* mPlaceholderFont; ///< The placeholder default font.
std::string mPlaceholderTextActive; ///< The text to display when the TextField is empty with key-input focus.
std::string mPlaceholderTextInactive; ///< The text to display when the TextField is empty and inactive.
Vector4 mPlaceholderTextColor; ///< The in/active placeholder text color.
float mCursorHookPositionX; ///< Used to move the cursor with the keys or when scrolling the text vertically with the handles.
+ Controller::NoTextTap::Action mDoubleTapAction; ///< Action to be done when there is a double tap on top of 'no text'
+ Controller::NoTextTap::Action mLongPressAction; ///< Action to be done when there is a long press on top of 'no text'
+
bool mIsShowingPlaceholderText : 1; ///< True if the place-holder text is being displayed.
bool mPreEditFlag : 1; ///< True if the model contains text in pre-edit state.
bool mDecoratorUpdated : 1; ///< True if the decorator was updated during event processing.
bool mUpdateLeftSelectionPosition : 1; ///< True if the visual position of the left selection handle must be recalculated.
bool mUpdateRightSelectionPosition : 1; ///< True if the visual position of the right selection handle must be recalculated.
bool mIsLeftHandleSelected : 1; ///< Whether is the left handle the one which is selected.
+ bool mIsRightHandleSelected : 1; ///< Whether is the right handle the one which is selected.
bool mUpdateHighlightBox : 1; ///< True if the text selection high light box must be updated.
bool mScrollAfterUpdatePosition : 1; ///< Whether to scroll after the cursor position is updated.
bool mScrollAfterDelete : 1; ///< Whether to scroll after delete characters.
bool mAllTextSelected : 1; ///< True if the selection handles are selecting all the text.
bool mUpdateInputStyle : 1; ///< Whether to update the input style after moving the cursor.
+ bool mPasswordInput : 1; ///< True if password input is enabled.
+ bool mCheckScrollAmount : 1; ///< Whether to check scrolled amount after updating the position
+ bool mIsPlaceholderPixelSize : 1; ///< True if the placeholder font size is set as pixel size.
+ bool mIsPlaceholderElideEnabled : 1; ///< True if the placeholder text's elide is enabled.
+ bool mPlaceholderEllipsisFlag : 1; ///< True if the text controller sets the placeholder ellipsis.
+ bool mShiftSelectionFlag : 1; ///< True if the text selection using Shift key is enabled.
};
struct ModifyEvent
EditableControlInterface* editableControlInterface )
: mControlInterface( controlInterface ),
mEditableControlInterface( editableControlInterface ),
- mLogicalModel(),
- mVisualModel(),
+ mModel(),
mFontDefaults( NULL ),
mUnderlineDefaults( NULL ),
mShadowDefaults( NULL ),
mEmbossDefaults( NULL ),
mOutlineDefaults( NULL ),
mEventData( NULL ),
- mAutoScrollData( NULL ),
mFontClient(),
mClipboard(),
mView(),
mMetrics(),
- mLayoutEngine(),
mModifyEvents(),
mTextColor( Color::BLACK ),
- mScrollPosition(),
mTextUpdateInfo(),
mOperationsPending( NO_OPERATION ),
mMaximumNumberOfCharacters( 50u ),
+ mHiddenInput( NULL ),
mRecalculateNaturalSize( true ),
mMarkupProcessorEnabled( false ),
mClipboardHideEnabled( true ),
- mIsAutoScrollEnabled( false )
+ mIsAutoScrollEnabled( false ),
+ mUpdateTextDirection( true ),
+ mIsTextDirectionRTL( false ),
+ mUnderlineSetByString( false ),
+ mShadowSetByString( false ),
+ mOutlineSetByString( false ),
+ mFontStyleSetByString( false ),
+ mShouldClearFocusOnEscape( true ),
+ mLayoutDirection( LayoutDirection::LEFT_TO_RIGHT )
{
- mLogicalModel = LogicalModel::New();
- mVisualModel = VisualModel::New();
+ mModel = Model::New();
mFontClient = TextAbstraction::FontClient::Get();
mClipboard = Clipboard::Get();
- mView.SetVisualModel( mVisualModel );
+ mView.SetVisualModel( mModel->mVisualModel );
// Use this to access FontClient i.e. to get down-scaled Emoji metrics.
mMetrics = Metrics::New( mFontClient );
mLayoutEngine.SetMetrics( mMetrics );
// Set the text properties to default
- mVisualModel->SetUnderlineEnabled( false );
- mVisualModel->SetUnderlineHeight( 0.0f );
+ mModel->mVisualModel->SetUnderlineEnabled( false );
+ mModel->mVisualModel->SetUnderlineHeight( 0.0f );
+
+ Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get();
+ if( styleManager )
+ {
+ bool temp;
+ Property::Map config = Toolkit::DevelStyleManager::GetConfigurations( styleManager );
+ if( config["clearFocusOnEscape"].Get( temp ) )
+ {
+ mShouldClearFocusOnEscape = temp;
+ }
+ }
}
~Impl()
{
+ delete mHiddenInput;
+
delete mFontDefaults;
delete mUnderlineDefaults;
delete mShadowDefaults;
delete mEmbossDefaults;
delete mOutlineDefaults;
delete mEventData;
- delete mAutoScrollData;
}
// Text Controller Implementation.
bool IsShowingRealText() const
{
return ( !IsShowingPlaceholderText() &&
- 0u != mLogicalModel->mText.Count() );
+ 0u != mModel->mLogicalModel->mText.Count() );
}
/**
mEventData->mIsShowingPlaceholderText = false;
// Remove mPlaceholderTextColor
- mVisualModel->SetTextColor( mTextColor );
+ mModel->mVisualModel->SetTextColor( mTextColor );
}
}
}
}
- void ResetImfManager()
+ void ResetInputMethodContext()
{
if( mEventData )
{
// Reset incase we are in a pre-edit state.
- if( mEventData->mImfManager )
+ if( mEventData->mInputMethodContext )
{
- mEventData->mImfManager.Reset(); // Will trigger a message ( commit, get surrounding )
+ mEventData->mInputMethodContext.Reset(); // Will trigger a message ( commit, get surrounding )
}
ClearPreEditFlag();
}
/**
- * @brief Helper to notify IMF manager with surrounding text & cursor changes.
+ * @brief Helper to notify InputMethodContext with surrounding text & cursor changes.
*/
- void NotifyImfManager();
+ void NotifyInputMethodContext();
/**
- * @brief Helper to notify IMF manager with multi line status.
+ * @brief Helper to notify InputMethodContext with multi line status.
*/
- void NotifyImfMultiLineStatus();
+ void NotifyInputMethodContextMultiLineStatus();
/**
* @brief Retrieve the current cursor position.
void RequestGetTextFromClipboard();
void RepositionSelectionHandles();
- void RepositionSelectionHandles( float visualX, float visualY );
+ void RepositionSelectionHandles( float visualX, float visualY, Controller::NoTextTap::Action action );
void SetPopupButtons();
*/
void ScrollTextToMatchCursor( const CursorInfo& cursorInfo );
+public:
+
+ /**
+ * @brief Gets implementation from the controller handle.
+ * @param controller The text controller
+ * @return The implementation of the Controller
+ */
+ static Impl& GetImplementation( Text::Controller& controller )
+ {
+ return *controller.mImpl;
+ }
+
private:
// Declared private and left undefined to avoid copies.
Impl( const Impl& );
ControlInterface* mControlInterface; ///< Reference to the text controller.
EditableControlInterface* mEditableControlInterface; ///< Reference to the editable text controller.
- LogicalModelPtr mLogicalModel; ///< Pointer to the logical model.
- VisualModelPtr mVisualModel; ///< Pointer to the visual model.
+ ModelPtr mModel; ///< Pointer to the text's model.
FontDefaults* mFontDefaults; ///< Avoid allocating this when the user does not specify a font.
UnderlineDefaults* mUnderlineDefaults; ///< Avoid allocating this when the user does not specify underline parameters.
ShadowDefaults* mShadowDefaults; ///< Avoid allocating this when the user does not specify shadow parameters.
EmbossDefaults* mEmbossDefaults; ///< Avoid allocating this when the user does not specify emboss parameters.
OutlineDefaults* mOutlineDefaults; ///< Avoid allocating this when the user does not specify outline parameters.
EventData* mEventData; ///< Avoid allocating everything for text input until EnableTextInput().
- ScrollerData* mAutoScrollData; ///< Avoid allocating this when the user does not specify the auto text scrolling feature.
TextAbstraction::FontClient mFontClient; ///< Handle to the font client.
Clipboard mClipboard; ///< Handle to the system clipboard
View mView; ///< The view interface to the rendering back-end.
MetricsPtr mMetrics; ///< A wrapper around FontClient used to get metrics & potentially down-scaled Emoji metrics.
- LayoutEngine mLayoutEngine; ///< The layout engine.
+ Layout::Engine mLayoutEngine; ///< The layout engine.
Vector<ModifyEvent> mModifyEvents; ///< Temporary stores the text set until the next relayout.
Vector4 mTextColor; ///< The regular text color
- /**
- * 0,0 means that the top-left corner of the layout matches the top-left corner of the UI control.
- * Typically this will have a negative value with scrolling occurs.
- */
- Vector2 mScrollPosition; ///< The text is offset by this position when scrolling.
TextUpdateInfo mTextUpdateInfo; ///< Info of the characters updated.
OperationsMask mOperationsPending; ///< Operations pending to be done to layout the text.
Length mMaximumNumberOfCharacters; ///< Maximum number of characters that can be inserted.
+ HiddenText* mHiddenInput; ///< Avoid allocating this when the user does not specify hidden input mode.
bool mRecalculateNaturalSize:1; ///< Whether the natural size needs to be recalculated.
bool mMarkupProcessorEnabled:1; ///< Whether the mark-up procesor is enabled.
- bool mClipboardHideEnabled:1; ///< Whether the ClipboardHide function work or not.
+ bool mClipboardHideEnabled:1; ///< Whether the ClipboardHide function work or not
bool mIsAutoScrollEnabled:1; ///< Whether auto text scrolling is enabled.
+ bool mUpdateTextDirection:1; ///< Whether the text direction needs to be updated.
+ CharacterDirection mIsTextDirectionRTL:1; ///< Whether the text direction is right to left or not
+
+ bool mUnderlineSetByString:1; ///< Set when underline is set by string (legacy) instead of map
+ bool mShadowSetByString:1; ///< Set when shadow is set by string (legacy) instead of map
+ bool mOutlineSetByString:1; ///< Set when outline is set by string (legacy) instead of map
+ bool mFontStyleSetByString:1; ///< Set when font style is set by string (legacy) instead of map
+ bool mShouldClearFocusOnEscape:1; ///< Whether text control should clear key input focus
+ LayoutDirection::Type mLayoutDirection; ///< Current system language direction
};
} // namespace Text