Merge "Notify the IMF when backspace/cut empties the TextField" into devel/master
authorAdeel Kazmi <adeel.kazmi@samsung.com>
Fri, 4 Sep 2015 13:03:04 +0000 (06:03 -0700)
committerGerrit Code Review <gerrit@review.vlan103.tizen.org>
Fri, 4 Sep 2015 13:03:04 +0000 (06:03 -0700)
36 files changed:
build/tizen/dali-toolkit/Makefile.am
build/tizen/docs/dali.doxy.in
dali-toolkit/internal/controls/text-controls/text-field-impl.cpp
dali-toolkit/internal/text/decorator/text-decorator.cpp
dali-toolkit/internal/text/decorator/text-decorator.h
dali-toolkit/internal/text/text-controller-impl.cpp
dali-toolkit/public-api/accessibility-manager/accessibility-manager.h
dali-toolkit/public-api/controls/alignment/alignment.h
dali-toolkit/public-api/controls/buttons/button.h
dali-toolkit/public-api/controls/buttons/check-box-button.h
dali-toolkit/public-api/controls/buttons/push-button.h
dali-toolkit/public-api/controls/buttons/radio-button.h
dali-toolkit/public-api/controls/control-depth-index-ranges.h
dali-toolkit/public-api/controls/control-impl.h
dali-toolkit/public-api/controls/control.h
dali-toolkit/public-api/controls/default-controls/solid-color-actor.h
dali-toolkit/public-api/controls/gaussian-blur-view/gaussian-blur-view.h
dali-toolkit/public-api/controls/image-view/image-view.h
dali-toolkit/public-api/controls/scroll-bar/scroll-bar.h
dali-toolkit/public-api/controls/scrollable/item-view/default-item-layout.h
dali-toolkit/public-api/controls/scrollable/item-view/item-factory.h
dali-toolkit/public-api/controls/scrollable/item-view/item-layout.h
dali-toolkit/public-api/controls/scrollable/item-view/item-view-declarations.h
dali-toolkit/public-api/controls/scrollable/item-view/item-view.h
dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-constraints.h
dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-effect.h
dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-page-path-effect.h
dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.h
dali-toolkit/public-api/controls/scrollable/scrollable.h
dali-toolkit/public-api/controls/table-view/table-view.h
dali-toolkit/public-api/controls/text-controls/text-field.h
dali-toolkit/public-api/controls/text-controls/text-label.h
dali-toolkit/public-api/enums.h
dali-toolkit/public-api/focus-manager/keyboard-focus-manager.h
doc/dali-toolkit-doc.h [new file with mode: 0644]
doc/file.list [new file with mode: 0644]

index b5ba49a..bd24d22 100644 (file)
@@ -38,6 +38,9 @@ daliimage_DATA = ${dali_toolkit_image_files}
 dalisounddir = ${dataReadOnlyDir}/toolkit/sounds/
 dalisound_DATA = ${dali_toolkit_sound_files}
 
+package_doxy_dir = ../../../doc
+include ../../../doc/file.list
+
 # The library
 lib_LTLIBRARIES = libdali-toolkit.la
 
@@ -155,3 +158,6 @@ publicapitextcontrols_HEADERS =        $(public_api_text_controls_header_files)
 publicapifocusmanager_HEADERS =        $(public_api_focus_manager_header_files)
 publicapirenderingbackend_HEADERS =    $(public_api_rendering_backend_header_files)
 
+# package doxygen file (contains doxygen grouping information)
+packagedoxydir = $(topleveldir)/doc
+packagedoxy_HEADERS = $(package_doxy_files)
index 438d79d..3fa2e57 100644 (file)
@@ -758,9 +758,12 @@ WARN_LOGFILE           =
 # Note: If this tag is empty the current directory is searched.
 
 INPUT                  = @DOXYGEN_DOCS_DIR@/content \
+                         @prefix@/include/dali/doc/dali-core-doc.h \
+                         @prefix@/include/dali/doc/dali-adaptor-doc.h \
+                         ../../../../dali-toolkit/doc/dali-toolkit-doc.h \
+                         @prefix@/include/dali \
                          ../../../../dali-toolkit/dali-toolkit/public-api \
-                         ../../../automated-tests/README.md \
-                         @prefix@/include/dali
+                         ../../../automated-tests/README.md
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
index 5e69586..9c3d4c8 100644 (file)
@@ -464,7 +464,7 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr
       {
         const Image image = Scripting::NewImage( value );
 
-        if( impl.mDecorator )
+        if( impl.mDecorator && image )
         {
           impl.mDecorator->SetHandleImage( LEFT_SELECTION_HANDLE, HANDLE_IMAGE_RELEASED, image );
           impl.RequestTextRelayout();
@@ -475,7 +475,7 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr
       {
         const Image image = Scripting::NewImage( value );
 
-        if( impl.mDecorator )
+        if( impl.mDecorator && image )
         {
           impl.mDecorator->SetHandleImage( RIGHT_SELECTION_HANDLE, HANDLE_IMAGE_RELEASED, image );
           impl.RequestTextRelayout();
@@ -486,7 +486,7 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr
       {
         const Image image = Scripting::NewImage( value );
 
-        if( impl.mDecorator )
+        if( impl.mDecorator && image )
         {
           impl.mDecorator->SetHandleImage( LEFT_SELECTION_HANDLE, HANDLE_IMAGE_PRESSED, image );
           impl.RequestTextRelayout();
@@ -497,7 +497,7 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr
       {
         const Image image = Scripting::NewImage( value );
 
-        if( impl.mDecorator )
+        if( impl.mDecorator && image )
         {
           impl.mDecorator->SetHandleImage( RIGHT_SELECTION_HANDLE, HANDLE_IMAGE_PRESSED, image );
           impl.RequestTextRelayout();
@@ -507,7 +507,8 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr
       case Toolkit::TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_LEFT:
       {
         const Image image = Scripting::NewImage( value );
-        if( impl.mDecorator )
+
+        if( impl.mDecorator && image )
         {
           impl.mDecorator->SetHandleImage( LEFT_SELECTION_HANDLE_MARKER, HANDLE_IMAGE_RELEASED, image );
           impl.RequestTextRelayout();
@@ -517,7 +518,8 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr
       case Toolkit::TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_RIGHT:
       {
         const Image image = Scripting::NewImage( value );
-        if( impl.mDecorator )
+
+        if( impl.mDecorator && image )
         {
           impl.mDecorator->SetHandleImage( RIGHT_SELECTION_HANDLE_MARKER, HANDLE_IMAGE_RELEASED, image );
           impl.RequestTextRelayout();
@@ -827,7 +829,9 @@ Property::Value TextField::GetProperty( BaseObject* object, Property::Index inde
       {
         if( impl.mDecorator )
         {
-          value = impl.mDecorator->GetBoundingBox();
+          Rect<int> boundingBox;
+          impl.mDecorator->GetBoundingBox( boundingBox );
+          value = boundingBox;
         }
         break;
       }
@@ -895,7 +899,10 @@ void TextField::OnInitialize()
   self.TouchedSignal().Connect( this, &TextField::OnTouched );
 
   // Set BoundingBox to stage size if not already set.
-  if ( mDecorator->GetBoundingBox().IsEmpty() )
+  Rect<int> boundingBox;
+  mDecorator->GetBoundingBox( boundingBox );
+
+  if( boundingBox.IsEmpty() )
   {
     Vector2 stageSize = Dali::Stage::GetCurrent().GetSize();
     mDecorator->SetBoundingBox( Rect<int>( 0.0f, 0.0f, stageSize.width, stageSize.height ) );
index 69ecac3..441d179 100644 (file)
@@ -159,6 +159,16 @@ void LocalToWorldCoordinatesBoundingBox( const Dali::Rect<int>& boundingRectangl
                                originY + boundingRectangle.height );
 }
 
+void WorldToLocalCoordinatesBoundingBox( const Dali::Vector4& boundingBox, Dali::Rect<int>& boundingRectangle )
+{
+  // Convert to local coordinates and store as a Dali::Rect.
+  Dali::Vector2 stageSize = Dali::Stage::GetCurrent().GetSize();
+
+  boundingRectangle.x = boundingBox.x + 0.5f * stageSize.width;
+  boundingRectangle.y = boundingBox.y + 0.5f * stageSize.height;
+  boundingRectangle.width = boundingBox.z - boundingBox.x;
+  boundingRectangle.height = boundingBox.w - boundingBox.y;
+}
 
 } // end of namespace
 
@@ -202,13 +212,15 @@ struct Decorator::Impl : public ConnectionTracker
   {
     HandleImpl()
     : position(),
+      size(),
       lineHeight( 0.0f ),
       grabDisplacementX( 0.f ),
       grabDisplacementY( 0.f ),
       active( false ),
       visible( false ),
       pressed( false ),
-      flipped( false )
+      horizontallyFlipped( false ),
+      verticallyFlipped( false )
     {
     }
 
@@ -217,13 +229,15 @@ struct Decorator::Impl : public ConnectionTracker
     ImageActor markerActor;
 
     Vector2 position;
-    float lineHeight; ///< Not the handle height
-    float grabDisplacementX;
-    float grabDisplacementY;
-    bool active  : 1;
-    bool visible : 1;
-    bool pressed : 1;
-    bool flipped : 1;
+    Size    size;
+    float   lineHeight;              ///< Not the handle height
+    float   grabDisplacementX;
+    float   grabDisplacementY;
+    bool    active  : 1;
+    bool    visible : 1;
+    bool    pressed : 1;
+    bool    horizontallyFlipped : 1; ///< Whether the handle has been horizontally flipped.
+    bool    verticallyFlipped   : 1; ///< Whether the handle has been vertically flipped.
   };
 
   struct PopupImpl
@@ -245,7 +259,7 @@ struct Decorator::Impl : public ConnectionTracker
     mEnabledPopupButtons( TextSelectionPopup::NONE ),
     mTextSelectionPopupCallbackInterface( callbackInterface ),
     mHandleColor( HANDLE_COLOR ),
-    mBoundingBox( Rect<int>() ),
+    mBoundingBox(),
     mHighlightColor( LIGHT_BLUE ),
     mHighlightPosition( Vector2::ZERO ),
     mActiveCursor( ACTIVE_CURSOR_NONE ),
@@ -263,12 +277,19 @@ struct Decorator::Impl : public ConnectionTracker
     mDelayCursorBlink( false ),
     mPrimaryCursorVisible( false ),
     mSecondaryCursorVisible( false ),
-    mSwapSelectionHandles( false ),
+    mFlipSelectionHandlesOnCross( false ),
+    mFlipLeftSelectionHandleDirection( false ),
+    mFlipRightSelectionHandleDirection( false ),
+    mHandlePanning( false ),
+    mHandleCurrentCrossed( false ),
+    mHandlePreviousCrossed( false ),
     mNotifyEndOfScroll( false )
   {
     mQuadVertexFormat[ "aPosition" ] = Property::VECTOR2;
     mQuadIndexFormat[ "indices" ] = Property::INTEGER;
     mHighlightMaterial = Material::New( Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ) );
+
+    SetupTouchEvents();
   }
 
   /**
@@ -289,7 +310,7 @@ struct Decorator::Impl : public ConnectionTracker
       mPrimaryCursorVisible = ( cursor.position.x <= size.width ) && ( cursor.position.x >= 0.f );
       if( mPrimaryCursorVisible )
       {
-        Vector2 position = cursor.position;
+        const Vector2& position = cursor.position;
 
         mPrimaryCursor.SetPosition( position.x,
                                     position.y );
@@ -314,18 +335,19 @@ struct Decorator::Impl : public ConnectionTracker
     HandleImpl& grabHandle = mHandle[GRAB_HANDLE];
     if( grabHandle.active )
     {
-      Vector2 position = grabHandle.position;
+      const Vector2& position = grabHandle.position;
 
       const bool isVisible = ( position.x <= size.width ) && ( position.x >= 0.f );
 
       if( isVisible )
       {
-        SetupTouchEvents();
-
         CreateGrabHandle();
 
-        grabHandle.actor.SetPosition( position.x - floor( 0.5f * mCursorWidth ),
-                                      position.y + grabHandle.lineHeight ); // TODO : Fix for multiline.
+        // Sets the grab handle position and calculate if it needs to be vertically flipped if it exceeds the boundary box.
+        SetGrabHandlePosition();
+
+        // Sets the grab handle image according if it's pressed, flipped, etc.
+        SetHandleImage( GRAB_HANDLE );
       }
       grabHandle.actor.SetVisible( isVisible );
     }
@@ -339,30 +361,32 @@ struct Decorator::Impl : public ConnectionTracker
     HandleImpl& secondary = mHandle[ RIGHT_SELECTION_HANDLE ];
     if( primary.active || secondary.active )
     {
-      Vector2 primaryPosition = primary.position;
-      Vector2 secondaryPosition = secondary.position;
+      const Vector2& primaryPosition = primary.position;
+      const Vector2& secondaryPosition = secondary.position;
 
       const bool isPrimaryVisible = ( primaryPosition.x <= size.width ) && ( primaryPosition.x >= 0.f );
       const bool isSecondaryVisible = ( secondaryPosition.x <= size.width ) && ( secondaryPosition.x >= 0.f );
 
       if( isPrimaryVisible || isSecondaryVisible )
       {
-        SetupTouchEvents();
-
         CreateSelectionHandles();
 
         if( isPrimaryVisible )
         {
-          primary.actor.SetPosition( primaryPosition.x,
-                                     primaryPosition.y + primary.lineHeight ); // TODO : Fix for multiline.
+          SetSelectionHandlePosition( LEFT_SELECTION_HANDLE );
+
+          // Sets the primary handle image according if it's pressed, flipped, etc.
+          SetHandleImage( LEFT_SELECTION_HANDLE );
 
           SetSelectionHandleMarkerSize( primary );
         }
 
         if( isSecondaryVisible )
         {
-          secondary.actor.SetPosition( secondaryPosition.x,
-                                       secondaryPosition.y + secondary.lineHeight ); // TODO : Fix for multiline.
+          SetSelectionHandlePosition( RIGHT_SELECTION_HANDLE );
+
+          // Sets the secondary handle image according if it's pressed, flipped, etc.
+          SetHandleImage( RIGHT_SELECTION_HANDLE );
 
           SetSelectionHandleMarkerSize( secondary );
         }
@@ -560,17 +584,11 @@ struct Decorator::Impl : public ConnectionTracker
 
   void SetupTouchEvents()
   {
-    if ( !mTapDetector )
-    {
-      mTapDetector = TapGestureDetector::New();
-      mTapDetector.DetectedSignal().Connect( this, &Decorator::Impl::OnTap );
-    }
+    mTapDetector = TapGestureDetector::New();
+    mTapDetector.DetectedSignal().Connect( this, &Decorator::Impl::OnTap );
 
-    if ( !mPanGestureDetector )
-    {
-      mPanGestureDetector = PanGestureDetector::New();
-      mPanGestureDetector.DetectedSignal().Connect( this, &Decorator::Impl::OnPan );
-    }
+    mPanGestureDetector = PanGestureDetector::New();
+    mPanGestureDetector.DetectedSignal().Connect( this, &Decorator::Impl::OnPan );
   }
 
   void CreateActiveLayer()
@@ -597,7 +615,6 @@ struct Decorator::Impl : public ConnectionTracker
   {
     if ( handle.markerActor )
     {
-      handle.markerActor.SetResizePolicy ( ResizePolicy::FIXED, Dimension::HEIGHT );
       handle.markerActor.SetSize( 0, handle.lineHeight );
     }
   }
@@ -609,7 +626,7 @@ struct Decorator::Impl : public ConnectionTracker
     {
       if( !mHandleImages[GRAB_HANDLE][HANDLE_IMAGE_RELEASED] )
       {
-        mHandleImages[GRAB_HANDLE][HANDLE_IMAGE_RELEASED] = ResourceImage::New( DEFAULT_GRAB_HANDLE_IMAGE_RELEASED );
+        SetHandleImage( GRAB_HANDLE, HANDLE_IMAGE_RELEASED, ResourceImage::New( DEFAULT_GRAB_HANDLE_IMAGE_RELEASED ) );
       }
 
       grabHandle.actor = ImageActor::New( mHandleImages[GRAB_HANDLE][HANDLE_IMAGE_RELEASED] );
@@ -654,12 +671,14 @@ struct Decorator::Impl : public ConnectionTracker
 
   void CreateHandleMarker( HandleImpl& handle, Image& image, HandleType handleType )
   {
-    if ( image)
+    if ( image )
     {
       handle.markerActor = ImageActor::New( image );
       handle.markerActor.SetColor( mHandleColor );
       handle.actor.Add( handle.markerActor );
 
+      handle.markerActor.SetResizePolicy ( ResizePolicy::FIXED, Dimension::HEIGHT );
+
       if ( LEFT_SELECTION_HANDLE == handleType )
       {
         handle.markerActor.SetAnchorPoint( AnchorPoint::BOTTOM_RIGHT );
@@ -684,7 +703,6 @@ struct Decorator::Impl : public ConnectionTracker
 #endif
       primary.actor.SetAnchorPoint( AnchorPoint::TOP_RIGHT ); // Change to BOTTOM_RIGHT if Look'n'Feel requires handle above text.
       primary.actor.SetSortModifier( DECORATION_DEPTH_INDEX );
-      primary.flipped = false;
       primary.actor.SetColor( mHandleColor );
 
       primary.grabArea = Actor::New(); // Area that Grab handle responds to, larger than actual handle so easier to move
@@ -719,7 +737,6 @@ struct Decorator::Impl : public ConnectionTracker
 #endif
       secondary.actor.SetAnchorPoint( AnchorPoint::TOP_LEFT ); // Change to BOTTOM_LEFT if Look'n'Feel requires handle above text.
       secondary.actor.SetSortModifier( DECORATION_DEPTH_INDEX );
-      secondary.flipped = false;
       secondary.actor.SetColor( mHandleColor );
 
       secondary.grabArea = Actor::New(); // Area that Grab handle responds to, larger than actual handle so easier to move
@@ -746,6 +763,141 @@ struct Decorator::Impl : public ConnectionTracker
     }
   }
 
+  void CalculateHandleWorldCoordinates( HandleImpl& handle, Vector2& position )
+  {
+    // Get the world position of the active layer
+    const Vector3 parentWorldPosition = mActiveLayer.GetCurrentWorldPosition();
+
+    // Get the size of the UI control.
+    Vector2 targetSize;
+    mController.GetTargetSize( targetSize );
+
+    // The grab handle position in world coords.
+    position.x = parentWorldPosition.x - 0.5f * targetSize.width + handle.position.x;
+    position.y = parentWorldPosition.y - 0.5f * targetSize.height + handle.position.y + handle.lineHeight;
+  }
+
+  void SetGrabHandlePosition()
+  {
+    // Reference to the grab handle.
+    HandleImpl& grabHandle = mHandle[GRAB_HANDLE];
+
+    // The grab handle position in world coords.
+    Vector2 grabHandleWorldPosition;
+    CalculateHandleWorldCoordinates( grabHandle, grabHandleWorldPosition );
+
+    // Check if the grab handle exceeds the boundaries of the decoration box.
+    // At the moment only the height is checked for the grab handle.
+    grabHandle.verticallyFlipped = ( grabHandleWorldPosition.y + grabHandle.size.height > mBoundingBox.w );
+
+    // The grab handle 'y' position in local coords.
+    // If the grab handle exceeds the bottom of the decoration box,
+    // set the 'y' position to the top of the line.
+    // The SetGrabHandleImage() method will change the orientation.
+    const float yLocalPosition = grabHandle.verticallyFlipped ? grabHandle.position.y : grabHandle.position.y + grabHandle.lineHeight;
+
+    grabHandle.actor.SetPosition( grabHandle.position.x - floor( 0.5f * mCursorWidth ),
+                                  yLocalPosition ); // TODO : Fix for multiline.
+  }
+
+  void SetSelectionHandlePosition( HandleType type )
+  {
+    const bool isPrimaryHandle = LEFT_SELECTION_HANDLE == type;
+
+    // Reference to the selection handle.
+    HandleImpl& handle = mHandle[type];
+
+    // Get the world coordinates of the handle position.
+    Vector2 handleWorldPosition;
+    CalculateHandleWorldCoordinates( handle, handleWorldPosition );
+
+    // Whether to flip the handle.
+    bool flipHandle = isPrimaryHandle ? mFlipLeftSelectionHandleDirection : mFlipRightSelectionHandleDirection;
+
+    // Whether to flip the handles if they are crossed.
+    bool crossFlip = false;
+    if( mFlipSelectionHandlesOnCross || !mHandlePanning )
+    {
+      crossFlip = mHandleCurrentCrossed;
+    }
+
+    // Does not flip if both conditions are true (double flip)
+    flipHandle = flipHandle != ( crossFlip || mHandlePreviousCrossed );
+
+    // Check if the selection handle exceeds the boundaries of the decoration box.
+    const bool exceedsLeftEdge = ( isPrimaryHandle ? !flipHandle : flipHandle ) && ( handleWorldPosition.x - handle.size.width < mBoundingBox.x );
+
+    const bool exceedsRightEdge = ( isPrimaryHandle ? flipHandle : !flipHandle ) && ( handleWorldPosition.x + handle.size.width > mBoundingBox.z );
+
+    // Does not flip if both conditions are true (double flip)
+    flipHandle = flipHandle != ( exceedsLeftEdge || exceedsRightEdge );
+
+    if( flipHandle )
+    {
+      if( !handle.horizontallyFlipped )
+      {
+        // Change the anchor point to flip the image.
+        handle.actor.SetAnchorPoint( isPrimaryHandle ? AnchorPoint::TOP_LEFT : AnchorPoint::TOP_RIGHT );
+
+        handle.horizontallyFlipped = true;
+      }
+    }
+    else
+    {
+      if( handle.horizontallyFlipped )
+      {
+        // Reset the anchor point.
+        handle.actor.SetAnchorPoint( isPrimaryHandle ? AnchorPoint::TOP_RIGHT : AnchorPoint::TOP_LEFT );
+
+        handle.horizontallyFlipped = false;
+      }
+    }
+
+    // Whether to flip the handle vertically.
+    handle.verticallyFlipped = ( handleWorldPosition.y + handle.size.height > mBoundingBox.w );
+
+    // The primary selection handle 'y' position in local coords.
+    // If the handle exceeds the bottom of the decoration box,
+    // set the 'y' position to the top of the line.
+    // The SetHandleImage() method will change the orientation.
+    const float yLocalPosition = handle.verticallyFlipped ? handle.position.y : handle.position.y + handle.lineHeight;
+
+    handle.actor.SetPosition( handle.position.x,
+                              yLocalPosition ); // TODO : Fix for multiline.
+  }
+
+  void SetHandleImage( HandleType type )
+  {
+    HandleImpl& handle = mHandle[type];
+
+    HandleType markerType = HANDLE_TYPE_COUNT;
+    // If the selection handle is flipped it chooses the image of the other selection handle. Does nothing for the grab handle.
+    if( LEFT_SELECTION_HANDLE == type )
+    {
+      type = handle.horizontallyFlipped ? RIGHT_SELECTION_HANDLE : LEFT_SELECTION_HANDLE;
+      markerType = handle.horizontallyFlipped ? RIGHT_SELECTION_HANDLE_MARKER : LEFT_SELECTION_HANDLE_MARKER;
+    }
+    else if( RIGHT_SELECTION_HANDLE == type )
+    {
+      type = handle.horizontallyFlipped ? LEFT_SELECTION_HANDLE : RIGHT_SELECTION_HANDLE;
+      markerType = handle.horizontallyFlipped ? LEFT_SELECTION_HANDLE_MARKER : RIGHT_SELECTION_HANDLE_MARKER;
+    }
+
+    // Chooses between the released or pressed image. It checks whether the pressed image exists.
+    const HandleImageType imageType = ( handle.pressed ? ( mHandleImages[type][HANDLE_IMAGE_PRESSED] ? HANDLE_IMAGE_PRESSED : HANDLE_IMAGE_RELEASED ) : HANDLE_IMAGE_RELEASED );
+
+    handle.actor.SetImage( mHandleImages[type][imageType] );
+
+    if( HANDLE_TYPE_COUNT != markerType )
+    {
+      const HandleImageType markerImageType = ( handle.pressed ? ( mHandleImages[markerType][HANDLE_IMAGE_PRESSED] ? HANDLE_IMAGE_PRESSED : HANDLE_IMAGE_RELEASED ) : HANDLE_IMAGE_RELEASED );
+      handle.markerActor.SetImage( mHandleImages[markerType][markerImageType] );
+    }
+
+    // Whether to flip the handle vertically.
+    handle.actor.SetOrientation( handle.verticallyFlipped ? ANGLE_180 : ANGLE_0, Vector3::XAXIS );
+  }
+
   void CreateHighlight()
   {
     if( !mHighlightActor )
@@ -905,6 +1057,8 @@ struct Decorator::Impl : public ConnectionTracker
         StopScrollTimer();
         mController.DecorationEvent( type, HANDLE_PRESSED, x, y );
       }
+
+      mHandlePanning = true;
     }
     else if( Gesture::Finished  == gesture.state ||
              Gesture::Cancelled == gesture.state )
@@ -922,22 +1076,10 @@ struct Decorator::Impl : public ConnectionTracker
         mController.DecorationEvent( type, HANDLE_RELEASED, x, y );
       }
 
-      if( GRAB_HANDLE == type )
-      {
-        handle.actor.SetImage( mHandleImages[type][HANDLE_IMAGE_RELEASED] );
-      }
-      else
-      {
-        HandleType selectionHandleType = type;
-
-        if( mSwapSelectionHandles != handle.flipped )
-        {
-          selectionHandleType = ( LEFT_SELECTION_HANDLE == type ) ? RIGHT_SELECTION_HANDLE : LEFT_SELECTION_HANDLE;
-        }
-
-        handle.actor.SetImage( mHandleImages[selectionHandleType][HANDLE_IMAGE_RELEASED] );
-      }
+      handle.actor.SetImage( mHandleImages[type][HANDLE_IMAGE_RELEASED] );
       handle.pressed = false;
+
+      mHandlePanning = false;
     }
   }
 
@@ -972,22 +1114,14 @@ struct Decorator::Impl : public ConnectionTracker
       if( TouchPoint::Down == point.state )
       {
         mHandle[GRAB_HANDLE].pressed = true;
-        Image imagePressed = mHandleImages[GRAB_HANDLE][HANDLE_IMAGE_PRESSED];
-        if( imagePressed )
-        {
-          mHandle[GRAB_HANDLE].actor.SetImage( imagePressed );
-        }
       }
       else if( ( TouchPoint::Up == point.state ) ||
                ( TouchPoint::Interrupted == point.state ) )
       {
         mHandle[GRAB_HANDLE].pressed = false;
-        Image imageReleased = mHandleImages[GRAB_HANDLE][HANDLE_IMAGE_RELEASED];
-        if( imageReleased )
-        {
-          mHandle[GRAB_HANDLE].actor.SetImage( imageReleased );
-        }
       }
+
+      SetHandleImage( GRAB_HANDLE );
     }
 
     // Consume to avoid pop-ups accidentally closing, when handle is outside of pop-up area
@@ -1002,26 +1136,19 @@ struct Decorator::Impl : public ConnectionTracker
     {
       const TouchPoint& point = event.GetPoint(0);
 
-      const bool flip = mSwapSelectionHandles != mHandle[LEFT_SELECTION_HANDLE].flipped;
       if( TouchPoint::Down == point.state )
       {
         mHandle[LEFT_SELECTION_HANDLE].pressed = true;
-        Image imagePressed = mHandleImages[flip ? RIGHT_SELECTION_HANDLE : LEFT_SELECTION_HANDLE][HANDLE_IMAGE_PRESSED];
-        if( imagePressed )
-        {
-          mHandle[LEFT_SELECTION_HANDLE].actor.SetImage( imagePressed );
-        }
       }
       else if( ( TouchPoint::Up == point.state ) ||
                ( TouchPoint::Interrupted == point.state ) )
       {
         mHandle[LEFT_SELECTION_HANDLE].pressed = false;
-        Image imageReleased = mHandleImages[flip ? RIGHT_SELECTION_HANDLE : LEFT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED];
-        if( imageReleased )
-        {
-          mHandle[LEFT_SELECTION_HANDLE].actor.SetImage( imageReleased );
-        }
+        mHandlePreviousCrossed = mHandleCurrentCrossed;
+        mHandlePanning = false;
       }
+
+      SetHandleImage( LEFT_SELECTION_HANDLE );
     }
 
     // Consume to avoid pop-ups accidentally closing, when handle is outside of pop-up area
@@ -1036,26 +1163,19 @@ struct Decorator::Impl : public ConnectionTracker
     {
       const TouchPoint& point = event.GetPoint(0);
 
-      const bool flip = mSwapSelectionHandles != mHandle[RIGHT_SELECTION_HANDLE].flipped;
       if( TouchPoint::Down == point.state )
       {
-        Image imagePressed = mHandleImages[flip ? LEFT_SELECTION_HANDLE : RIGHT_SELECTION_HANDLE][HANDLE_IMAGE_PRESSED];
         mHandle[RIGHT_SELECTION_HANDLE].pressed = true;
-        if( imagePressed )
-        {
-          mHandle[RIGHT_SELECTION_HANDLE].actor.SetImage( imagePressed );
-        }
       }
       else if( ( TouchPoint::Up == point.state ) ||
                ( TouchPoint::Interrupted == point.state ) )
       {
-        Image imageReleased = mHandleImages[flip ? LEFT_SELECTION_HANDLE : RIGHT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED];
         mHandle[RIGHT_SELECTION_HANDLE].pressed = false;
-        if( imageReleased )
-        {
-          mHandle[RIGHT_SELECTION_HANDLE].actor.SetImage( imageReleased );
-        }
+        mHandlePreviousCrossed = mHandleCurrentCrossed;
+        mHandlePanning = false;
       }
+
+      SetHandleImage( RIGHT_SELECTION_HANDLE );
     }
 
     // Consume to avoid pop-ups accidentally closing, when handle is outside of pop-up area
@@ -1108,19 +1228,16 @@ struct Decorator::Impl : public ConnectionTracker
 
     // Exceeding vertical boundary
 
-    Vector4 worldCoordinatesBoundingBox;
-    LocalToWorldCoordinatesBoundingBox( mBoundingBox, worldCoordinatesBoundingBox );
-
     float popupHeight = mCopyPastePopup.actor.GetRelayoutSize( Dimension::HEIGHT);
 
     PropertyNotification verticalExceedNotification = mCopyPastePopup.actor.AddPropertyNotification( Actor::Property::WORLD_POSITION_Y,
-                                                      OutsideCondition( worldCoordinatesBoundingBox.y + popupHeight * 0.5f,
-                                                                        worldCoordinatesBoundingBox.w - popupHeight * 0.5f ) );
+                                                      OutsideCondition( mBoundingBox.y + popupHeight * 0.5f,
+                                                                        mBoundingBox.w - popupHeight * 0.5f ) );
 
     verticalExceedNotification.NotifySignal().Connect( this, &Decorator::Impl::PopUpLeavesVerticalBoundary );
   }
 
-  void GetConstrainedPopupPosition( Vector3& requiredPopupPosition, Vector3& popupSize, Vector3 anchorPoint, Actor& parent, Rect<int>& boundingBox )
+  void GetConstrainedPopupPosition( Vector3& requiredPopupPosition, Vector3& popupSize, Vector3 anchorPoint, Actor& parent, const Vector4& boundingRectangleWorld )
   {
     DALI_ASSERT_DEBUG ( "Popup parent not on stage" && parent.OnStage() )
 
@@ -1130,10 +1247,6 @@ struct Decorator::Impl : public ConnectionTracker
     Vector3 popupWorldPosition = parentWorldPositionLeftAnchor + requiredPopupPosition;  // Parent World position plus popup local position gives World Position
     Vector3 popupDistanceFromAnchorPoint = popupSize*anchorPoint;
 
-    // Bounding rectangle is supplied as screen coordinates, bounding will be done in world coordinates.
-    Vector4 boundingRectangleWorld;
-    LocalToWorldCoordinatesBoundingBox( boundingBox, boundingRectangleWorld );
-
     // Calculate distance to move popup (in local space) so fits within the boundary
     float xOffSetToKeepWithinBounds = 0.0f;
     if( popupWorldPosition.x - popupDistanceFromAnchorPoint.x < boundingRectangleWorld.x )
@@ -1156,41 +1269,14 @@ struct Decorator::Impl : public ConnectionTracker
     // Prevent pixel mis-alignment by rounding down.
     requiredPopupPosition.x = static_cast<int>( requiredPopupPosition.x );
     requiredPopupPosition.y = static_cast<int>( requiredPopupPosition.y );
-
   }
 
-  void FlipSelectionHandleImages()
+  void SetHandleImage( HandleType handleType, HandleImageType handleImageType, Dali::Image image )
   {
-    SetupTouchEvents();
-
-    CreateSelectionHandles();
-
-    HandleImpl& leftHandle = mHandle[LEFT_SELECTION_HANDLE];
-    HandleImpl& rightHandle = mHandle[RIGHT_SELECTION_HANDLE];
-
-    // If handle pressed and pressed image exists then use pressed image else stick with released image
-    const HandleImageType leftImageType = ( leftHandle.pressed && mHandleImages[LEFT_SELECTION_HANDLE][HANDLE_IMAGE_PRESSED] ) ? HANDLE_IMAGE_PRESSED : HANDLE_IMAGE_RELEASED;
-    const HandleImageType rightImageType = ( rightHandle.pressed && mHandleImages[RIGHT_SELECTION_HANDLE][HANDLE_IMAGE_PRESSED] ) ? HANDLE_IMAGE_PRESSED : HANDLE_IMAGE_RELEASED;
+    HandleImpl& handle = mHandle[handleType];
+    handle.size = Size( image.GetWidth(), image.GetHeight() );
 
-    const bool leftFlipped = mSwapSelectionHandles != leftHandle.flipped;
-    const bool rightFlipped = mSwapSelectionHandles != rightHandle.flipped;
-
-    leftHandle.actor.SetImage( leftFlipped ? mHandleImages[RIGHT_SELECTION_HANDLE][leftImageType] : mHandleImages[LEFT_SELECTION_HANDLE][leftImageType] );
-
-    leftHandle.actor.SetAnchorPoint( leftFlipped ? AnchorPoint::TOP_LEFT : AnchorPoint::TOP_RIGHT );
-
-    rightHandle.actor.SetImage( rightFlipped ? mHandleImages[LEFT_SELECTION_HANDLE][rightImageType] : mHandleImages[RIGHT_SELECTION_HANDLE][rightImageType] );
-
-    rightHandle.actor.SetAnchorPoint( rightFlipped ? AnchorPoint::TOP_RIGHT : AnchorPoint::TOP_LEFT );
-
-    if ( leftHandle.markerActor )
-    {
-      leftHandle.markerActor.SetImage( leftFlipped ? mHandleImages[RIGHT_SELECTION_HANDLE_MARKER][leftImageType] : mHandleImages[LEFT_SELECTION_HANDLE_MARKER][leftImageType] );
-    }
-    if ( rightHandle.markerActor )
-    {
-      rightHandle.markerActor.SetImage( rightFlipped ? mHandleImages[LEFT_SELECTION_HANDLE_MARKER][rightImageType] : mHandleImages[RIGHT_SELECTION_HANDLE_MARKER][rightImageType] );
-    }
+    mHandleImages[handleType][handleImageType] = image;
   }
 
   void SetScrollThreshold( float threshold )
@@ -1303,7 +1389,7 @@ struct Decorator::Impl : public ConnectionTracker
   Geometry            mQuadGeometry;
   QuadContainer       mHighlightQuadList;         ///< Sub-selections that combine to create the complete selection highlight
 
-  Rect<int>           mBoundingBox;
+  Vector4             mBoundingBox;               ///< The bounding box in world coords.
   Vector4             mHighlightColor;            ///< Color of the highlight
   Vector2             mHighlightPosition;         ///< The position of the highlight actor.
 
@@ -1318,13 +1404,18 @@ struct Decorator::Impl : public ConnectionTracker
   float               mScrollDistance;          ///< Distance the text scrolls during a scroll interval.
   int                 mTextDepth;               ///< The depth used to render the text.
 
-  bool                mActiveCopyPastePopup   : 1;
-  bool                mCursorBlinkStatus      : 1; ///< Flag to switch between blink on and blink off.
-  bool                mDelayCursorBlink       : 1; ///< Used to avoid cursor blinking when entering text.
-  bool                mPrimaryCursorVisible   : 1; ///< Whether the primary cursor is visible.
-  bool                mSecondaryCursorVisible : 1; ///< Whether the secondary cursor is visible.
-  bool                mSwapSelectionHandles   : 1; ///< Whether to swap the selection handle images.
-  bool                mNotifyEndOfScroll      : 1; ///< Whether to notify the end of the scroll.
+  bool                mActiveCopyPastePopup              : 1;
+  bool                mCursorBlinkStatus                 : 1; ///< Flag to switch between blink on and blink off.
+  bool                mDelayCursorBlink                  : 1; ///< Used to avoid cursor blinking when entering text.
+  bool                mPrimaryCursorVisible              : 1; ///< Whether the primary cursor is visible.
+  bool                mSecondaryCursorVisible            : 1; ///< Whether the secondary cursor is visible.
+  bool                mFlipSelectionHandlesOnCross       : 1; ///< Whether to flip the selection handles as soon as they cross.
+  bool                mFlipLeftSelectionHandleDirection  : 1; ///< Whether to flip the left selection handle image because of the character's direction.
+  bool                mFlipRightSelectionHandleDirection : 1; ///< Whether to flip the right selection handle image because of the character's direction.
+  bool                mHandlePanning                     : 1; ///< Whether any of the handles is moving.
+  bool                mHandleCurrentCrossed              : 1; ///< Whether the handles are crossed.
+  bool                mHandlePreviousCrossed             : 1; ///< Whether the handles where crossed at the last handle touch up.
+  bool                mNotifyEndOfScroll                 : 1; ///< Whether to notify the end of the scroll.
 };
 
 DecoratorPtr Decorator::New( ControllerInterface& controller,
@@ -1336,12 +1427,12 @@ DecoratorPtr Decorator::New( ControllerInterface& controller,
 
 void Decorator::SetBoundingBox( const Rect<int>& boundingBox )
 {
-  mImpl->mBoundingBox = boundingBox;
+  LocalToWorldCoordinatesBoundingBox( boundingBox, mImpl->mBoundingBox );
 }
 
-const Rect<int>& Decorator::GetBoundingBox() const
+void Decorator::GetBoundingBox( Rect<int>& boundingBox ) const
 {
-  return mImpl->mBoundingBox;
+  WorldToLocalCoordinatesBoundingBox( mImpl->mBoundingBox, boundingBox );
 }
 
 void Decorator::Relayout( const Vector2& size )
@@ -1465,6 +1556,11 @@ void Decorator::SetHandleActive( HandleType handleType, bool active )
 
   if( !active )
   {
+    if( ( LEFT_SELECTION_HANDLE == handleType ) || ( RIGHT_SELECTION_HANDLE == handleType ) )
+    {
+      mImpl->mHandlePreviousCrossed = false;
+    }
+
     // TODO: this is a work-around.
     // The problem is the handle actor does not receive the touch event with the Interrupt
     // state when the power button is pressed and the application goes to background.
@@ -1476,6 +1572,7 @@ void Decorator::SetHandleActive( HandleType handleType, bool active )
        imageActor.SetImage( imageReleased );
     }
   }
+
 }
 
 bool Decorator::IsHandleActive( HandleType handleType ) const
@@ -1485,7 +1582,7 @@ bool Decorator::IsHandleActive( HandleType handleType ) const
 
 void Decorator::SetHandleImage( HandleType handleType, HandleImageType handleImageType, Dali::Image image )
 {
-  mImpl->mHandleImages[handleType][handleImageType] = image;
+  mImpl->SetHandleImage( handleType, handleImageType, image );
 }
 
 Dali::Image Decorator::GetHandleImage( HandleType handleType, HandleImageType handleImageType ) const
@@ -1530,11 +1627,16 @@ const Vector2& Decorator::GetPosition( HandleType handleType ) const
   return mImpl->mHandle[handleType].position;
 }
 
-void Decorator::SwapSelectionHandlesEnabled( bool enable )
+void Decorator::FlipSelectionHandlesOnCrossEnabled( bool enable )
 {
-  mImpl->mSwapSelectionHandles = enable;
+  mImpl->mFlipSelectionHandlesOnCross = enable;
+}
 
-  mImpl->FlipSelectionHandleImages();
+void Decorator::SetSelectionHandleFlipState( bool indicesSwapped, bool left, bool right )
+{
+  mImpl->mHandleCurrentCrossed = indicesSwapped;
+  mImpl->mFlipLeftSelectionHandleDirection = left;
+  mImpl->mFlipRightSelectionHandleDirection = right;
 }
 
 void Decorator::AddHighlight( float x1, float y1, float x2, float y2 )
index 1587703..4e36fa7 100644 (file)
@@ -179,9 +179,9 @@ public:
    * @brief Retrieve the bounding box origin and dimensions.
    *
    * default is set once control is added to stage, before this the return vector will be Vector4:ZERO
-   * @return Rect<int> the bounding box origin, width and height
+   * @param[out] boundingBox The bounding box origin, width and height.
    */
-  const Rect<int>& GetBoundingBox() const;
+  void GetBoundingBox( Rect<int>& boundingBox ) const;
 
   /**
    * @brief The decorator waits until a relayout before creating actors etc.
@@ -397,12 +397,25 @@ public:
   const Vector2& GetPosition( HandleType handleType ) const;
 
   /**
-   * @brief Swaps the selection handle's images.
+   * @brief Whether to flip the selection handles as soon as they are crossed.
    *
-   * This method is called by the text controller to swap the handles
-   * when the start index is bigger than the end one.
+   * By default they flip when the handle is released.
+   *
+   * @param[in] enable If @e true the selection handles will flip as soon as they are crossed.
+   */
+  void FlipSelectionHandlesOnCrossEnabled( bool enable );
+
+  /**
+   * @brief Sets info to calculate the handle flip state.
+   *
+   * Sets the character's direction where the handles are pointing.
+   * It resets the decorator internal flip state when there is a new selection.
+   *
+   * @param[in] indicesSwapped Whether the selection handle indices are swapped (start > end).
+   * @param[in] left The direction of the character pointed by the primary selection handle.
+   * @param[in] right The direction of the character pointed by the secondary selection handle.
    */
-  void SwapSelectionHandlesEnabled( bool enable );
+  void SetSelectionHandleFlipState( bool indicesSwapped, bool left, bool right );
 
   /**
    * @brief Adds a quad to the existing selection highlights.
index 5ae3d7f..cff37b1 100644 (file)
@@ -874,9 +874,11 @@ void Controller::Impl::RetrieveSelection( std::string& selectedText, bool delete
     return;
   }
 
+  const bool handlesCrossed = mEventData->mLeftSelectionPosition > mEventData->mRightSelectionPosition;
+
   //Get start and end position of selection
-  uint32_t startOfSelectedText = mEventData->mLeftSelectionPosition;
-  uint32_t lengthOfSelectedText =  mEventData->mRightSelectionPosition - startOfSelectedText;
+  uint32_t startOfSelectedText = handlesCrossed ? mEventData->mRightSelectionPosition : mEventData->mLeftSelectionPosition;
+  uint32_t lengthOfSelectedText =  ( handlesCrossed ? mEventData->mLeftSelectionPosition : mEventData->mRightSelectionPosition ) - startOfSelectedText;
 
   // Validate the start and end selection points
   if(  ( startOfSelectedText + lengthOfSelectedText ) <=  mLogicalModel->mText.Count() )
@@ -895,7 +897,7 @@ void Controller::Impl::RetrieveSelection( std::string& selectedText, bool delete
       Vector<Character>::Iterator last  = first + lengthOfSelectedText;
       currentText.Erase( first, last );
     }
-    mEventData->mPrimaryCursorPosition = mEventData->mLeftSelectionPosition;
+    mEventData->mPrimaryCursorPosition = handlesCrossed ? mEventData->mRightSelectionPosition : mEventData->mLeftSelectionPosition;
     mEventData->mScrollAfterDelete = true;
     mEventData->mDecoratorUpdated = true;
   }
@@ -968,8 +970,16 @@ void Controller::Impl::RepositionSelectionHandles( CharacterIndex selectionStart
   const LineRun& firstLine = *lines.Begin();
   const float height = firstLine.ascender + -firstLine.descender;
 
+  const bool isLastCharacter = selectionEnd >= mLogicalModel->mText.Count();
+  const bool startDirection = ( ( NULL == modelCharacterDirectionsBuffer ) ? false : *( modelCharacterDirectionsBuffer + selectionStart ) );
+  const bool endDirection = ( ( NULL == modelCharacterDirectionsBuffer ) ? false : *( modelCharacterDirectionsBuffer + ( selectionEnd - ( isLastCharacter ? 1u : 0u ) ) ) );
+
   // Swap the indices if the start is greater than the end.
-  const bool indicesSwapped = ( selectionStart > selectionEnd );
+  const bool indicesSwapped = selectionStart > selectionEnd;
+
+  // Tell the decorator to flip the selection handles if needed.
+  mEventData->mDecorator->SetSelectionHandleFlipState( indicesSwapped, startDirection, endDirection );
+
   if( indicesSwapped )
   {
     std::swap( selectionStart, selectionEnd );
@@ -989,9 +999,6 @@ void Controller::Impl::RepositionSelectionHandles( CharacterIndex selectionStart
   const Length numberOfCharactersEnd = *( charactersPerGlyphBuffer + glyphEnd );
   bool splitEndGlyph = ( glyphStart != glyphEnd ) && ( numberOfCharactersEnd > 1u ) && HasLigatureMustBreak( mLogicalModel->GetScript( selectionEndMinusOne ) );
 
-  // Tell the decorator to swap the selection handles if needed.
-  mEventData->mDecorator->SwapSelectionHandlesEnabled( firstLine.direction != indicesSwapped );
-
   const Vector2 offset = mEventData->mScrollPosition + mAlignmentOffset;
 
   // Traverse the glyphs.
@@ -1076,7 +1083,7 @@ void Controller::Impl::RepositionSelectionHandles( CharacterIndex selectionStart
   mEventData->mDecorator->SetPosition( RIGHT_SELECTION_HANDLE, secondaryPosition.x, secondaryPosition.y, secondaryCursorInfo.lineHeight );
 
   // Cursor to be positioned at end of selection so if selection interrupted and edit mode restarted the cursor will be at end of selection
-  mEventData->mPrimaryCursorPosition = (indicesSwapped)?mEventData->mLeftSelectionPosition:mEventData->mRightSelectionPosition;
+  mEventData->mPrimaryCursorPosition = ( indicesSwapped ) ? mEventData->mLeftSelectionPosition : mEventData->mRightSelectionPosition;
 
   // Set the flag to update the decorator.
   mEventData->mDecoratorUpdated = true;
index 9f807ac..08ce8ce 100644 (file)
@@ -32,6 +32,10 @@ namespace Internal DALI_INTERNAL
 {
 class AccessibilityManager;
 }
+/**
+ * @addtogroup dali-toolkit-accessibility-manager
+ * @{
+ */
 
 /**
  * @brief Manages registration of actors in a accessibility focus chain and changing the
@@ -750,6 +754,9 @@ public:
 
 }; // class AccessibilityManager
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index 1f34eb5..5a9d56c 100644 (file)
@@ -31,6 +31,10 @@ namespace Internal DALI_INTERNAL
 {
 class Alignment;
 }
+/**
+ * @addtogroup dali-toolkit-controls-alignment
+ * @{
+ */
 
 /**
  * @brief Alignment is a container which provides an easy way to align other actors inside its boundary.
@@ -229,6 +233,9 @@ public: // Not intended for application developers
   explicit DALI_INTERNAL Alignment( Dali::Internal::CustomActor* internal );
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index 9c0eba0..f5c2701 100644 (file)
@@ -31,6 +31,10 @@ namespace Internal DALI_INTERNAL
 {
 class Button;
 }
+/**
+ * @addtogroup dali-toolkit-controls-buttons
+ * @{
+ */
 
 /**
  * @brief Button is a base class for different kind of buttons.
@@ -420,6 +424,9 @@ public: // Not intended for application developers
   DALI_INTERNAL Button( Dali::Internal::CustomActor* internal );
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index 5798ef3..357c3e1 100644 (file)
@@ -33,6 +33,10 @@ namespace Internal DALI_INTERNAL
 {
 class CheckBoxButton;
 }
+/**
+ * @addtogroup dali-toolkit-controls-buttons
+ * @{
+ */
 
 /**
  * CheckBoxButton provides a check box button which user can check or uncheck.
@@ -106,6 +110,9 @@ public: // Not intended for application developers
   DALI_INTERNAL CheckBoxButton( Dali::Internal::CustomActor* internal );
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index 0e53a9c..8ebbf58 100644 (file)
@@ -35,6 +35,10 @@ namespace Internal DALI_INTERNAL
 
 class PushButton;
 }
+/**
+ * @addtogroup dali-toolkit-controls-buttons
+ * @{
+ */
 
 /**
  * @brief A PushButton changes its appearance when is pressed and returns to its original when is released.
@@ -193,6 +197,9 @@ public: // Not intended for application developers
   DALI_INTERNAL PushButton( Dali::Internal::CustomActor* internal );
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index 20ec386..7c04b42 100644 (file)
@@ -35,6 +35,10 @@ namespace Internal DALI_INTERNAL
 
 class RadioButton;
 }
+/**
+ * @addtogroup dali-toolkit-controls-buttons
+ * @{
+ */
 
 /**
  * @brief A RadioButton provides a radio button which two states \e selected or \e unselected.
@@ -124,6 +128,9 @@ class DALI_IMPORT_API RadioButton: public Button
   DALI_INTERNAL RadioButton( Dali::Internal::CustomActor* internal );
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index 1a55cf2..ff5732c 100644 (file)
@@ -23,6 +23,11 @@ namespace Dali
 {
 namespace Toolkit
 {
+/**
+ * @addtogroup dali-toolkit-controls
+ * @{
+ */
+
 enum ControlDepthIndexRanges
 {
     BACKGROUND_DEPTH_INDEX    = static_cast<int>( -Dali::Layer::TREE_DEPTH_MULTIPLIER * 0.1f ),
@@ -30,6 +35,9 @@ enum ControlDepthIndexRanges
     DECORATION_DEPTH_INDEX    = static_cast<int>( Dali::Layer::TREE_DEPTH_MULTIPLIER * 0.1f )
 };
 
+/**
+ * @}
+ */
 }
 
 }
index 1ce94b7..b8ae6bb 100644 (file)
@@ -35,11 +35,15 @@ namespace Dali
 
 namespace Toolkit
 {
+/**
+ * @addtogroup dali-toolkit-controls
+ * @{
+ */
+
 class StyleManager;
 
 namespace Internal
 {
-
 /**
  * @brief This is the internal base class for all controls.
  *
@@ -629,6 +633,9 @@ DALI_IMPORT_API const Internal::Control& GetImplementation( const Dali::Toolkit:
 
 } // namespace Internal
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index 1e4d74d..35587f9 100644 (file)
@@ -40,6 +40,10 @@ namespace Internal
 {
 class Control;
 }
+/**
+ * @addtogroup dali-toolkit-controls
+ * @{
+ */
 
 /**
  * @brief Control is the base class for all controls.
@@ -403,6 +407,9 @@ public: // Templates for Deriving Classes
 
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index 23b00e2..6c88108 100644 (file)
@@ -27,7 +27,6 @@ namespace Dali
 
 namespace Toolkit
 {
-
 /**
  * @brief Creates a Dali::ImageActor with a solid color, optionally it creates a border.
  *
@@ -40,7 +39,6 @@ namespace Toolkit
  * @return a handle to the new ImageActor
  */
 DALI_IMPORT_API ImageActor CreateSolidColorActor( const Vector4& color, bool border = false, const Vector4& borderColor = Color::WHITE, const unsigned int borderSize = 1 );
-
 } // namespace Toolkit
 
 } // namespace Dali
index e6a32b8..a2c5ea6 100644 (file)
@@ -49,6 +49,10 @@ class GaussianBlurView;
 class BloomView;
 
 } // namespace Internal
+/**
+ * @addtogroup dali-toolkit-controls-gaussian-blur-view
+ * @{
+ */
 
 /**
  *
@@ -274,6 +278,9 @@ public:
 
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index 821a981..fe6d7b1 100644 (file)
@@ -31,6 +31,10 @@ namespace Internal DALI_INTERNAL
 {
 class ImageView;
 }
+/**
+ * @addtogroup dali-toolkit-controls-image-view
+ * @{
+ */
 
 /**
  *
@@ -157,6 +161,9 @@ public: // Not intended for application developers
 
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index 5da66a5..3f1ad10 100755 (executable)
@@ -33,6 +33,10 @@ namespace Internal DALI_INTERNAL
 
 class ScrollBar;
 }
+/**
+ * @addtogroup dali-toolkit-controls-scroll-bar
+ * @{
+ */
 
 /**
  * ScrollBar is a UI component that can be linked to the scrollable objects
@@ -323,11 +327,11 @@ public: // Not intended for application developers
   explicit DALI_INTERNAL ScrollBar( Dali::Internal::CustomActor* internal );
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
 
-/**
- * @}
- */
 #endif // __DALI_TOOLKIT_SCROLL_BAR_H__
index 6f4eb00..8299d84 100644 (file)
@@ -26,6 +26,10 @@ namespace Dali
 
 namespace Toolkit
 {
+/**
+ * @addtogroup dali-toolkit-controls-item-view
+ * @{
+ */
 
 namespace DefaultItemLayout
 {
@@ -49,6 +53,9 @@ DALI_IMPORT_API ItemLayoutPtr New( Type type );
 
 } // namespace DefaultItemLayout
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index d018716..84ef7b7 100644 (file)
@@ -26,6 +26,10 @@ namespace Dali
 
 namespace Toolkit
 {
+/**
+ * @addtogroup dali-toolkit-controls-item-view
+ * @{
+ */
 
 /**
  * @brief ItemFactory is for providing actors to ItemView.
@@ -77,6 +81,9 @@ public:
   }
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index 39370ac..9302e8a 100644 (file)
@@ -30,6 +30,10 @@ namespace Dali
 
 namespace Toolkit
 {
+/**
+ * @addtogroup dali-toolkit-controls-item-view
+ * @{
+ */
 
 class ItemLayout;
 
@@ -364,6 +368,9 @@ protected:
   Impl* mImpl;
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index 7772d45..7388bfa 100644 (file)
@@ -28,6 +28,10 @@ namespace Dali
 
 namespace Toolkit
 {
+/**
+ * @addtogroup dali-toolkit-controls-item-view
+ * @{
+ */
 
 typedef unsigned int ItemId; ///< Unique identity for each item in the view.
 
@@ -44,6 +48,9 @@ typedef ItemContainer::const_iterator ConstItemIter;
 class ItemView;
 class ItemLayout;
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index cb0859d..2790194 100644 (file)
@@ -34,6 +34,10 @@ namespace Internal DALI_INTERNAL
 {
 class ItemView;
 }
+/**
+ * @addtogroup dali-toolkit-controls-item-view
+ * @{
+ */
 
 class ItemFactory;
 class ItemLayout;
@@ -462,6 +466,9 @@ public: // Not intended for application developers
   explicit DALI_INTERNAL ItemView( Dali::Internal::CustomActor* internal );
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index 40a1f45..15a29d6 100644 (file)
@@ -31,6 +31,10 @@ class PropertyInput;
 
 namespace Toolkit
 {
+/**
+ * @addtogroup dali-toolkit-controls-scroll-view
+ * @{
+ */
 
 // Constraints ////////////////////////////////////////////////////////////////////////////////////
 
@@ -52,6 +56,9 @@ DALI_IMPORT_API void MoveActorConstraint( Vector3& current, const PropertyInputC
  */
 DALI_IMPORT_API void WrapActorConstraint( Vector3& position, const PropertyInputContainer& inputs );
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index 1295861..4af0442 100644 (file)
@@ -37,6 +37,10 @@ namespace Internal DALI_INTERNAL
 class ScrollViewEffect;
 class ScrollViewWobbleEffect;
 }
+/**
+ * @addtogroup dali-toolkit-controls-scroll-view
+ * @{
+ */
 
 class ScrollView;
 class ScrollViewEffect;
@@ -73,6 +77,9 @@ public: // Not intended for application developers
 
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index de7c649..af59f83 100644 (file)
@@ -34,6 +34,10 @@ namespace Internal DALI_INTERNAL
 {
 class ScrollViewPagePathEffect;
 }
+/**
+ * @addtogroup dali-toolkit-controls-scroll-view
+ * @{
+ */
 
 /**
  * ScrollView Page Path Effect.
@@ -103,6 +107,9 @@ protected:
 
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index fb9d5cb..508b3d2 100644 (file)
@@ -34,6 +34,10 @@ namespace Internal DALI_INTERNAL
 {
 class ScrollView;
 }
+/**
+ * @addtogroup dali-toolkit-controls-scroll-view
+ * @{
+ */
 
 /**
  * @brief How axes/rotation or scale are clamped
@@ -1136,6 +1140,9 @@ public: // Not intended for application developers
   explicit DALI_INTERNAL ScrollView( Dali::Internal::CustomActor* internal );
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index b262212..d43a29a 100644 (file)
@@ -31,6 +31,10 @@ namespace Internal DALI_INTERNAL
 {
 class Scrollable;
 }
+/**
+ * @addtogroup dali-toolkit-controls-scrollable
+ * @{
+ */
 
 /**
  * @brief Base class for derived Scrollables that contains actors that can be scrolled manually
@@ -229,6 +233,9 @@ public: // Not intended for application developers
   explicit DALI_INTERNAL Scrollable( Dali::Internal::CustomActor* internal );
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index c3f0545..eb03b9e 100644 (file)
@@ -35,6 +35,10 @@ namespace Internal DALI_INTERNAL
 {
 class TableView;
 }
+/**
+ * @addtogroup dali-toolkit-controls-table-view
+ * @{
+ */
 
 /**
  * @brief TableView is a layout container for aligning child actors in a grid like layout.
@@ -441,6 +445,9 @@ public: // Not intended for application developers
   explicit DALI_INTERNAL TableView( Dali::Internal::CustomActor* internal );
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index 5406361..7b9d11b 100644 (file)
@@ -31,6 +31,10 @@ namespace Internal DALI_INTERNAL
 {
 class TextField;
 }
+/**
+ * @addtogroup dali-toolkit-controls-text-controls
+ * @{
+ */
 
 /**
  * @brief A control which provides a single-line editable text field.
@@ -201,6 +205,9 @@ public: // Not intended for application developers
   explicit DALI_INTERNAL TextField( Dali::Internal::CustomActor* internal );
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index f882e55..7669b05 100644 (file)
@@ -31,6 +31,10 @@ namespace Internal DALI_INTERNAL
 {
 class TextLabel;
 }
+/**
+ * @addtogroup dali-toolkit-controls-text-controls
+ * @{
+ */
 
 /**
  * @brief A control which renders a short text string.
@@ -144,6 +148,9 @@ public: // Not intended for application developers
   explicit DALI_INTERNAL TextLabel( Dali::Internal::CustomActor* internal );
 };
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index 5582ba3..ff678a9 100644 (file)
 
 namespace Dali
 {
-
 /**
  * @brief DALi Toolkit namespace.
  */
 namespace Toolkit
 {
+/**
+ * @addtogroup dali-toolkit-controls
+ * @{
+ */
 
 /**
  * @brief Control Orientation namespace.
@@ -65,6 +68,9 @@ DALI_IMPORT_API bool IsVertical(ControlOrientation::Type orientation);
  */
 DALI_IMPORT_API bool IsHorizontal(ControlOrientation::Type orientation);
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index 3383a47..3b6b33f 100644 (file)
@@ -31,6 +31,10 @@ namespace Internal DALI_INTERNAL
 {
 class KeyboardFocusManager;
 }
+/**
+ * @addtogroup dali-toolkit-focus-manager
+ * @{
+ */
 
 /**
  * @brief Provides the functionality of handling keyboard navigation
@@ -273,6 +277,9 @@ public: // Signals
 
 }; // class KeyboardFocusManager
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
diff --git a/doc/dali-toolkit-doc.h b/doc/dali-toolkit-doc.h
new file mode 100644 (file)
index 0000000..2cb0f1a
--- /dev/null
@@ -0,0 +1,75 @@
+#ifndef __DALI_TOOLKIT_DOC_H__
+#define __DALI_TOOLKIT_DOC_H__
+
+/**
+ * @defgroup dali DALi
+ * @ingroup CAPI_UI_FRAMEWORK
+ *
+ * @brief DALi is a cross-platform 3D UI Toolkit for embedded systems.
+ *
+ * @section dali-overview Overview
+ * DALi's 3D user interface engine enables you to create rich and high-performance
+ * UI applications. DALi is based on OpenGL ES 2.0, but provides a clean
+ * cross-platform C++ framework.
+ * This means that you can use high-level DALi APIs instead of accessing
+ * low-level OpenGL APIs directly.
+ * <ul>
+ * <li>DALi Core: This module provides scene graph-based rendering, animation, and event handling.</li>
+ * <li>DALi Adaptor: This module is a platform adaptation layer.</li>
+ * <li>DALi Toolkit: This module provides UI components and various effects on top of the dali-core.</li>
+ * </ul>
+ *
+ * @defgroup dali-toolkit DALi Toolkit
+ * @ingroup dali
+ *
+ * @brief This module provides UI components and various effects on top of the dali-core.
+ *
+ * @{
+ *   @defgroup dali-toolkit-accessibility-manager Accessibility Manager
+ *   @brief AccessibilityManager manages a accessibility focus chain.
+
+ *   @defgroup dali-toolkit-controls Controls
+ *   @brief Controls are interactive components for layouting the user interface.
+
+ *   @{
+ *     @defgroup dali-toolkit-controls-alignment Alignment
+ *     @brief Alignment is a container which provides an easy way to align other actors inside its boundary.
+
+ *     @defgroup dali-toolkit-controls-buttons Buttons
+ *     @brief Button is a small object on UI that you can press.
+
+ *     @defgroup dali-toolkit-controls-gaussian-blur-view Gaussian Blur View
+ *     @brief GaussianBlurView provides a render process that blurs an image.
+
+ *     @defgroup dali-toolkit-controls-image-view Image View
+ *     @brief ImageView is a control displying an image.
+
+ *     @defgroup dali-toolkit-controls-scroll-bar Scroll Bar
+ *     @brief ScrollBar control.
+
+ *     @defgroup dali-toolkit-controls-scrollable Scrollable
+ *     @brief Scrollable container controls.
+
+ *     @{
+ *       @defgroup dali-toolkit-controls-item-view Item View
+ *       @brief ItemView class is a scrollable container that can contain many items.
+
+ *       @defgroup dali-toolkit-controls-scroll-view Scroll View
+ *       @brief ScrollView class provides scrollable view which contains actors and can be scrolled automatically or manually by panning. 
+
+ *     @}
+ *     @defgroup dali-toolkit-controls-table-view Table View
+ *     @brief TableView class is a layout container for aligning child actors in a grid like layout.
+
+ *     @defgroup dali-toolkit-controls-text-controls Text Controls
+ *     @brief Controls for displaying text or text input.
+
+ *   @}
+ *   @defgroup dali-toolkit-focus-manager Focus Manager
+ *   @brief Classes for handling keyboard navigation and maintaining the two dimensional keyboard focus chain.
+
+ * @}
+ */
+
+
+#endif  /* __DALI_TOOLKIT_DOC_H__ */
diff --git a/doc/file.list b/doc/file.list
new file mode 100644 (file)
index 0000000..f9681c1
--- /dev/null
@@ -0,0 +1,3 @@
+package_doxy_files = \
+  $(package_doxy_dir)/dali-toolkit-doc.h
+