vcl/inc/vcl/layout.hxx | 1 + vcl/source/window/builder.cxx | 4 +++- vcl/source/window/dialog.cxx | 29 +++++++++++++++++++++++++++++ vcl/source/window/dlgctrl.cxx | 10 ++++------ vcl/source/window/layout.cxx | 6 +++--- 5 files changed, 40 insertions(+), 10 deletions(-)
New commits: commit df9ba567c4c0e506848c6face127ab6a5f930aac Author: Caolán McNamara <caol...@redhat.com> Date: Fri May 18 15:54:19 2012 +0100 add prevLogicalChildOfParent diff --git a/vcl/inc/vcl/layout.hxx b/vcl/inc/vcl/layout.hxx index c2ed2ed..c146087 100644 --- a/vcl/inc/vcl/layout.hxx +++ b/vcl/inc/vcl/layout.hxx @@ -414,6 +414,7 @@ Window* getLegacyNonLayoutParent(Window *pParent); //in a flat hierarchy where dialogs only have one layer //of children Window* nextLogicalChildOfParent(Window *pTopLevel, Window *pChild); +Window* prevLogicalChildOfParent(Window *pTopLevel, Window *pChild); #endif diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx index d484213..4ffa8ba 100644 --- a/vcl/source/window/dialog.cxx +++ b/vcl/source/window/dialog.cxx @@ -137,6 +137,35 @@ Window * nextLogicalChildOfParent(Window *pTopLevel, Window *pChild) pChild = pParent->GetWindow(WINDOW_NEXT); } + if (dynamic_cast<VclContainer*>(pChild)) + pChild = nextLogicalChildOfParent(pTopLevel, pChild); + + return pChild; +} + +Window * prevLogicalChildOfParent(Window *pTopLevel, Window *pChild) +{ + Window *pLastChild = pChild; + + if (dynamic_cast<VclContainer*>(pChild)) + pChild = pChild->GetWindow(WINDOW_LASTCHILD); + else + pChild = pChild->GetWindow(WINDOW_PREV); + + while (!pChild) + { + Window *pParent = pLastChild->GetParent(); + if (!pParent) + return NULL; + if (pParent == pTopLevel) + return NULL; + pLastChild = pParent; + pChild = pParent->GetWindow(WINDOW_PREV); + } + + if (dynamic_cast<VclContainer*>(pChild)) + pChild = prevLogicalChildOfParent(pTopLevel, pChild); + return pChild; } diff --git a/vcl/source/window/dlgctrl.cxx b/vcl/source/window/dlgctrl.cxx index f7fd592..f7941ff 100644 --- a/vcl/source/window/dlgctrl.cxx +++ b/vcl/source/window/dlgctrl.cxx @@ -804,7 +804,7 @@ sal_Bool Window::ImplDlgCtrl( const KeyEvent& rKEvt, sal_Bool bKeyInput ) WinBits nStyle = pSWindow->GetStyle(); if ( !(nStyle & WB_GROUP) ) { - pWindow = pWindow->GetWindow( WINDOW_PREV ); + pWindow = prevLogicalChildOfParent(this, pWindow); while ( pWindow ) { pWindow = pWindow->ImplGetWindow(); @@ -821,20 +821,18 @@ sal_Bool Window::ImplDlgCtrl( const KeyEvent& rKEvt, sal_Bool bKeyInput ) if ( nStyle & WB_GROUP ) break; - pWindow = pWindow->GetWindow( WINDOW_PREV ); + pWindow = prevLogicalChildOfParent(this, pWindow); } } } else if ( (nKeyCode == KEY_RIGHT) || (nKeyCode == KEY_DOWN) ) { - Window* pWindow; - WinBits nStyle; - pWindow = nextLogicalChildOfParent(this, pSWindow); + Window* pWindow = nextLogicalChildOfParent(this, pSWindow); while ( pWindow ) { pWindow = pWindow->ImplGetWindow(); - nStyle = pWindow->GetStyle(); + WinBits nStyle = pWindow->GetStyle(); if ( nStyle & WB_GROUP ) break; commit 018d94881c90bc69bed4c8408fa78dc63e5dec4f Author: Caolán McNamara <caol...@redhat.com> Date: Fri May 18 15:54:03 2012 +0100 don't reorder children without position properties diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index 380bebc..32829ee 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -263,7 +263,9 @@ void VclBuilder::handleChild(Window *pParent, xmlreader::XmlReader &reader) for (size_t i = 0; i < aChilds.size(); ++i) { - sal_uInt16 nPosition = aChilds[i]->getWidgetProperty<sal_uInt16>(sPosition); + sal_uInt16 nPosition = aChilds[i]->getWidgetProperty<sal_uInt16>(sPosition, 0xFFFF); + if (nPosition == 0xFFFF) + continue; aChilds[i]->reorderWithinParent(nPosition); } } diff --git a/vcl/source/window/layout.cxx b/vcl/source/window/layout.cxx index ef31201..a482770 100644 --- a/vcl/source/window/layout.cxx +++ b/vcl/source/window/layout.cxx @@ -529,7 +529,7 @@ const Window *VclBin::get_child() const { const WindowImpl* pWindowImpl = ImplGetWindowImpl(); - return pWindowImpl->mpLastChild; + return pWindowImpl->mpFirstChild; } Window *VclBin::get_child() @@ -546,7 +546,7 @@ Size VclFrame::calculateRequisition() const WindowImpl* pWindowImpl = ImplGetWindowImpl(); const Window *pChild = get_child(); - const Window *pLabel = pChild != pWindowImpl->mpFirstChild ? pWindowImpl->mpFirstChild : NULL; + const Window *pLabel = pChild != pWindowImpl->mpLastChild ? pWindowImpl->mpLastChild : NULL; if (pChild && pChild->IsVisible()) aRet = pChild->GetOptimalSize(WINDOWSIZE_PREFERRED); @@ -578,7 +578,7 @@ void VclFrame::setAllocation(const Size &rAllocation) //The label widget is the last (of two) children Window *pChild = get_child(); - Window *pLabel = pChild != pWindowImpl->mpFirstChild ? pWindowImpl->mpFirstChild : NULL; + Window *pLabel = pChild != pWindowImpl->mpLastChild ? pWindowImpl->mpLastChild : NULL; if (pLabel && pLabel->IsVisible()) {
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits