#include <dali/public-api/actors/image-actor.h>
#include <dali/public-api/actors/layer.h>
#include <dali/public-api/common/constants.h>
-#include <dali/public-api/common/stage.h>
#include <dali/public-api/events/tap-gesture.h>
#include <dali/public-api/events/tap-gesture-detector.h>
#include <dali/public-api/events/pan-gesture.h>
#include <dali/public-api/images/resource-image.h>
#include <dali/public-api/math/vector2.h>
#include <dali/public-api/math/vector4.h>
+//#include <dali/public-api/images/nine-patch-image.h>
#include <dali/public-api/signals/connection-tracker.h>
// INTERNAL INCLUDES
#include <dali-toolkit/public-api/controls/control.h>
#include <dali-toolkit/public-api/controls/control-impl.h>
+#include <dali-toolkit/public-api/controls/buttons/push-button.h>
+#include <dali-toolkit/public-api/controls/default-controls/solid-color-actor.h>
+#include <dali-toolkit/public-api/controls/text-controls/text-label.h>
+#include <dali-toolkit/public-api/controls/text-controls/text-selection-popup.h>
#ifdef DEBUG_ENABLED
#define DECORATOR_DEBUG
const char* DEFAULT_SELECTION_HANDLE_TWO( DALI_IMAGE_DIR "text-input-selection-handle-right.png" );
//const char* DEFAULT_SELECTION_HANDLE_ONE_PRESSED( DALI_IMAGE_DIR "text-input-selection-handle-left-press.png" );
//const char* DEFAULT_SELECTION_HANDLE_TWO_PRESSED( DALI_IMAGE_DIR "text-input-selection-handle-right-press.png" );
-const char* DEFAULT_CURSOR_IMAGE( DALI_IMAGE_DIR "decorator-cursor.png");
const Dali::Vector3 DEFAULT_GRAB_HANDLE_RELATIVE_SIZE( 1.5f, 2.0f, 1.0f );
const Dali::Vector3 DEFAULT_SELECTION_HANDLE_RELATIVE_SIZE( 1.5f, 1.5f, 1.0f );
};
Impl( Dali::Toolkit::Internal::Control& parent, Observer& observer )
- : mParent(parent),
+ : mTextControlParent(parent),
mObserver(observer),
mActiveCursor(ACTIVE_CURSOR_NONE),
mActiveGrabHandle(false),
mActiveSelection( false ),
+ mActiveCopyPastePopup( false ),
mCursorBlinkInterval( CURSOR_BLINK_INTERVAL ),
mCursorBlinkDuration( 0.0f ),
mCursorBlinkStatus( true ),
* Relayout of the decorations owned by the decorator.
* @param[in] size The Size of the UI control the decorater is adding it's decorations to.
*/
- void Relayout( const Vector2& size )
+ void Relayout( const Vector2& size, const Vector2& scrollPosition )
{
- SetCursors();
+ // TODO - Remove this if nothing is active
+ CreateActiveLayer();
+
+ // Show or hide the cursors
+ CreateCursors();
+ if( mPrimaryCursor )
+ {
+ mPrimaryCursor.SetPosition( mCursor[PRIMARY_CURSOR].x + scrollPosition.x,
+ mCursor[PRIMARY_CURSOR].y + scrollPosition.y );
+ mPrimaryCursor.SetSize( 1.0f, mCursor[PRIMARY_CURSOR].height );
+ }
+ if( mSecondaryCursor )
+ {
+ mSecondaryCursor.SetPosition( mCursor[SECONDARY_CURSOR].x + scrollPosition.x,
+ mCursor[SECONDARY_CURSOR].y + scrollPosition.y );
+ mSecondaryCursor.SetSize( 1.0f, mCursor[SECONDARY_CURSOR].height );
+ }
// Show or hide the grab handle
if( mActiveGrabHandle )
{
SetupTouchEvents();
- CreateActiveLayer();
CreateGrabHandle();
- mGrabHandle.SetPosition( mCursor[PRIMARY_CURSOR].x, mCursor[PRIMARY_CURSOR].y + mCursor[PRIMARY_CURSOR].height );
+ mGrabHandle.SetPosition( mCursor[PRIMARY_CURSOR].x + scrollPosition.x,
+ mCursor[PRIMARY_CURSOR].y + scrollPosition.y + mCursor[PRIMARY_CURSOR].height );
}
else if( mGrabHandle )
{
{
SetupTouchEvents();
- CreateActiveLayer();
CreateSelectionHandles();
SelectionHandleImpl& primary = mSelectionHandle[ PRIMARY_SELECTION_HANDLE ];
- primary.actor.SetPosition( primary.x, primary.y + primary.cursorHeight );
+ primary.actor.SetPosition( primary.x + scrollPosition.x,
+ primary.y + scrollPosition.y + primary.cursorHeight );
SelectionHandleImpl& secondary = mSelectionHandle[ SECONDARY_SELECTION_HANDLE ];
- secondary.actor.SetPosition( secondary.x, secondary.y + secondary.cursorHeight );
+ secondary.actor.SetPosition( secondary.x + scrollPosition.x,
+ secondary.y + scrollPosition.y + secondary.cursorHeight );
//CreateHighlight(); TODO
}
UnparentAndReset( mSelectionHandle[ PRIMARY_SELECTION_HANDLE ].actor );
UnparentAndReset( mSelectionHandle[ SECONDARY_SELECTION_HANDLE ].actor );
}
+
+ if ( mActiveCopyPastePopup )
+ {
+ if ( !mCopyPastePopup )
+ {
+ mCopyPastePopup = TextSelectionPopup::New();
+ mActiveLayer.Add ( mCopyPastePopup );
+ }
+ mCopyPastePopup.SetPosition( Vector3( 200.0f, -100.0f, 0.0f ) ); //todo grabhandle or selection handle positions to be used
+ }
+ else
+ {
+ if ( mCopyPastePopup )
+ {
+ UnparentAndReset( mCopyPastePopup );
+ }
+ }
}
- /**
- * Creates a cursor
- */
void CreateCursor( ImageActor& cursor )
{
- if ( !mCursorImage )
- {
- mCursorImage = ResourceImage::New( DEFAULT_CURSOR_IMAGE );
- }
- cursor = ImageActor::New( mCursorImage );
+ cursor = CreateSolidColorActor( Color::WHITE );
+ cursor.SetParentOrigin( ParentOrigin::TOP_LEFT );
cursor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
}
- /**
- * Add / Remove cursor(s) from parent
- */
- void SetCursors()
+ // Add or Remove cursor(s) from parent
+ void CreateCursors()
{
- Actor parent = mParent.Self();
- /* Create Primary and or Secondary Cursor(s) if active and add to parent */
- if ( mActiveCursor == ACTIVE_CURSOR_PRIMARY )
+ if( mActiveCursor == ACTIVE_CURSOR_NONE )
{
- if ( !mPrimaryCursor )
- {
- CreateCursor( mPrimaryCursor );
-#ifdef DECORATOR_DEBUG
- mPrimaryCursor.SetName( "PrimaryCursorActor" );
-#endif
- parent.Add( mPrimaryCursor);
- }
-
- mPrimaryCursor.SetPosition( mCursor[PRIMARY_CURSOR].x, mCursor[PRIMARY_CURSOR].y );
+ UnparentAndReset( mPrimaryCursor );
+ UnparentAndReset( mSecondaryCursor );
}
- else if ( mActiveCursor == ACTIVE_CURSOR_BOTH )
+ else
{
- if ( !mSecondaryCursor )
+ /* Create Primary and or Secondary Cursor(s) if active and add to parent */
+ if ( mActiveCursor == ACTIVE_CURSOR_PRIMARY ||
+ mActiveCursor == ACTIVE_CURSOR_BOTH )
{
- CreateCursor( mSecondaryCursor );
+ if ( !mPrimaryCursor )
+ {
+ CreateCursor( mPrimaryCursor );
#ifdef DECORATOR_DEBUG
- mSecondaryCursor.SetName( "SecondaryCursorActor" );
+ mPrimaryCursor.SetName( "PrimaryCursorActor" );
#endif
- parent.Add( mSecondaryCursor);
- }
- }
- else
- {
- /* ACTIVE_CURSOR_NONE so unparent cursors*/
- if ( mPrimaryCursor )
- {
- UnparentAndReset( mPrimaryCursor );
+ mActiveLayer.Add( mPrimaryCursor);
+ }
}
- if ( mSecondaryCursor )
+ if ( mActiveCursor == ACTIVE_CURSOR_BOTH )
{
- UnparentAndReset( mSecondaryCursor );
+ if ( !mSecondaryCursor )
+ {
+ CreateCursor( mSecondaryCursor );
+#ifdef DECORATOR_DEBUG
+ mSecondaryCursor.SetName( "SecondaryCursorActor" );
+#endif
+ mActiveLayer.Add( mSecondaryCursor);
+ }
}
}
}
bool OnCursorBlinkTimerTick()
{
// Cursor blinking
- if ( ACTIVE_CURSOR_PRIMARY )
+ if ( mPrimaryCursor )
{
mPrimaryCursor.SetVisible( mCursorBlinkStatus );
}
- else if ( ACTIVE_CURSOR_BOTH )
+ if ( mSecondaryCursor )
{
- mPrimaryCursor.SetVisible( mCursorBlinkStatus );
mSecondaryCursor.SetVisible( mCursorBlinkStatus );
}
{
if( !mActiveLayer )
{
- Actor parent = mParent.Self();
+ Actor parent = mTextControlParent.Self();
mActiveLayer = Layer::New();
#ifdef DECORATOR_DEBUG
return false;
}
- Internal::Control& mParent;
+
+ Internal::Control& mTextControlParent;
Observer& mObserver;
Layer mActiveLayer; // Layer for active handles and alike that ensures they are above all else.
unsigned int mActiveCursor;
bool mActiveGrabHandle;
bool mActiveSelection;
+ bool mActiveCopyPastePopup;
CursorImpl mCursor[CURSOR_COUNT];
SelectionHandleImpl mSelectionHandle[SELECTION_HANDLE_COUNT];
+ TextSelectionPopup mCopyPastePopup;
+
Image mCursorImage;
Image mGrabHandleImage;
return mImpl->mBoundingBox;
}
-void Decorator::Relayout( const Vector2& size )
+void Decorator::Relayout( const Vector2& size, const Vector2& scrollPosition )
{
- mImpl->Relayout( size );
+ mImpl->Relayout( size, scrollPosition );
}
/** Cursor **/
height = mImpl->mCursor[cursor].height;
}
-void Decorator::SetCursorImage( Dali::Image image )
-{
- mImpl->mCursorImage = image;
-}
-
-Dali::Image Decorator::GetCursorImage() const
-{
- return mImpl->mCursorImage;
-}
-
void Decorator::SetColor( Cursor cursor, const Dali::Vector4& color )
{
mImpl->mCursor[cursor].color = color;
return mImpl->mSelectionHandle[handle].releasedImage;
}
+void Decorator::SetPopupActive( bool active )
+{
+ mImpl->mActiveCopyPastePopup = active;
+}
+
+bool Decorator::IsPopupActive() const
+{
+ return mImpl->mActiveCopyPastePopup ;
+}
+
Decorator::~Decorator()
{
delete mImpl;