X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Ftable-view%2Ftable-view-impl.cpp;h=b68398732bf654efdd4049edb3b8b07fe6f908b3;hp=0bace7ee9ec143a033d60aaabf886391ba50aacb;hb=7fd81e346cb38d5b485edad70ef4b5b12ecd34ac;hpb=e65245a8ddc5d1fe018b4f890c6927974955e2a7 diff --git a/dali-toolkit/internal/controls/table-view/table-view-impl.cpp b/dali-toolkit/internal/controls/table-view/table-view-impl.cpp index 0bace7e..b683987 100644 --- a/dali-toolkit/internal/controls/table-view/table-view-impl.cpp +++ b/dali-toolkit/internal/controls/table-view/table-view-impl.cpp @@ -1078,6 +1078,7 @@ void TableView::OnChildRemove( Actor& child ) TableView::TableView( unsigned int initialRows, unsigned int initialColumns ) : Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ), mCellData( initialRows, initialColumns ), + mPreviousFocusedActor(), mLayoutingChild( false ), mRowDirty( true ), // Force recalculation first time mColumnDirty( true ) @@ -1404,12 +1405,49 @@ Actor TableView::GetNextKeyboardFocusableActor(Actor currentFocusedActor, Toolki if(!focusLost) { nextFocusableActor = GetChildAt(Toolkit::TableView::CellPosition(currentRow, currentColumn)); + + // Save the focused actor in the TableView. + mPreviousFocusedActor = nextFocusableActor; } } else { - // The current focused actor is not within table view, so the child in the first cell should be focused. - nextFocusableActor = GetChildAt(Toolkit::TableView::CellPosition(0, 0)); + // The current focused actor is not within this TableView. + + unsigned int numberOfColumns = GetColumns(); + unsigned int numberOfRows = GetRows(); + + // Check whether the previous focused actor is a focus group (i.e. a layout container) + bool wasFocusedOnLayoutContainer = false; + Actor previousFocusedActor = mPreviousFocusedActor.GetHandle(); + if( previousFocusedActor ) + { + Toolkit::Control control = Toolkit::Control::DownCast( previousFocusedActor ); + if( control ) + { + Internal::Control& controlImpl = static_cast(control.GetImplementation()); + wasFocusedOnLayoutContainer = controlImpl.IsKeyboardFocusGroup(); + } + } + + // Check whether the previous focused actor is a layout container and also a child of this TableView + Toolkit::TableView::CellPosition position; + if( wasFocusedOnLayoutContainer && FindChildPosition( previousFocusedActor, position ) ) + { + nextFocusableActor = GetNextKeyboardFocusableActor(previousFocusedActor, direction, loopEnabled); + } + else + { + // Otherwise, move the focus to either the first or the last cell according to the given direction. + if(direction == Toolkit::Control::KeyboardFocus::LEFT || direction == Toolkit::Control::KeyboardFocus::UP) + { + nextFocusableActor = GetChildAt(Toolkit::TableView::CellPosition(numberOfRows - 1, numberOfColumns - 1)); + } + else + { + nextFocusableActor = GetChildAt(Toolkit::TableView::CellPosition(0, 0)); + } + } } }