Rebased ref, commits from common ancestor: commit b9dc80d02224845727be76ab5655ec8fd8771d98 Author: Jan-Marek Glogowski <glo...@fbihome.de> AuthorDate: Wed Sep 26 17:33:22 2018 +0200 Commit: Jan-Marek Glogowski <glo...@fbihome.de> CommitDate: Thu Sep 27 09:11:25 2018 +0000
Debug infrastructure Change-Id: Idd09c131240c1372a40c36feb07094e28c2a1581 diff --git a/vcl/source/window/dlgctrl.cxx b/vcl/source/window/dlgctrl.cxx index af70f4bbc484..f27e4b44424f 100644 --- a/vcl/source/window/dlgctrl.cxx +++ b/vcl/source/window/dlgctrl.cxx @@ -35,6 +35,13 @@ #include <com/sun/star/i18n/XCharacterClassification.hpp> +// #define ITER_ONLY +#define DUMP_ITER +// #define DUMP_SUBCHILD +#define DUMP_IMPL_FIND_DLGCTRL +#define DUMP_IMPL_DLGCTL +#define DUMP_UPDATE_DEF_BUTTON + using namespace ::com::sun::star; static bool ImplHasIndirectTabParent( vcl::Window* pWindow ) @@ -119,14 +126,23 @@ public: , m_bCurrentWindowMayHaveChildren(true) , m_bIsTabControl(false) { +#ifdef DUMP_ITER + SAL_DEBUG("Iter construct start " << m_pRealParent << " " << pWindow << " " << m_bTestEnabled); +#endif vcl::Window* pRealWindow = m_pRealParent->ImplGetWindow(); if (pRealWindow->GetType() == WindowType::TABCONTROL) m_bIsTabControl = true; ++(*this); +#ifdef DUMP_ITER + SAL_DEBUG("Iter construct end " << m_bIsTabControl); +#endif } WindowIterator& operator++() { +#ifdef DUMP_ITER + SAL_DEBUG("++ In"); +#endif vcl::Window* pWindow = nullptr; vcl::Window* pNextWindow = m_pCurrentWindow; vcl::Window* pParent = nullptr; @@ -138,27 +154,50 @@ public: // check if pNextWindow has children => not in dispose pWindow = firstLogicalChildOfParent(pNextWindow); if (pWindow) + { pWindow = ImplGetCurTabWindow(pNextWindow->ImplGetWindow()); +#ifdef DUMP_ITER + SAL_DEBUG("ImplGetTabWindow " << pNextWindow->ImplGetWindow() << " >> " << pWindow); +#endif + } } else if (m_bCurrentWindowMayHaveChildren) + { pWindow = firstLogicalChildOfParent(pNextWindow); +#ifdef DUMP_ITER + SAL_DEBUG("firstLogicalChildOfParent " << pNextWindow << " => " << pWindow << " (" << (pWindow ? pWindow->ImplGetWindow() : nullptr) << ")"); +#endif + } if (!pWindow) { +#ifdef DUMP_ITER + SAL_DEBUG("!window " << pNextWindow); +#endif while (true) { assert(!pWindow); pParent = getNonLayoutParent(pNextWindow); +#ifdef DUMP_ITER + SAL_DEBUG("getNonLayoutParent " << pNextWindow << " >> " << pParent); +#endif if (pNextWindow == m_pParent || !pParent) break; if (pParent->ImplGetWindow()->GetType() == WindowType::TABCONTROL) { +#ifdef DUMP_ITER + SAL_DEBUG("IsTabcontrol " << pParent << " (" << pParent->ImplGetWindow() << ")"); +#endif pNextWindow = pParent; continue; } pWindow = nextLogicalChildOfParent(pParent, pNextWindow); +#ifdef DUMP_ITER + SAL_DEBUG("nextLogicalChildOfParent " << pParent << " " << pNextWindow << " >> " << pWindow + << " (" << (pWindow ? pWindow->ImplGetWindow() : nullptr) << ")"); +#endif if (!pWindow) { pNextWindow = pParent; @@ -174,6 +213,9 @@ public: } } } +#ifdef DUMP_ITER + SAL_DEBUG("!window end " << pWindow); +#endif if (!pWindow) break; } @@ -188,6 +230,9 @@ public: { m_bIsTabControl = (pRealWindow->GetType() == WindowType::TABCONTROL); m_bCurrentWindowMayHaveChildren = pRealWindow->GetStyle() & (WB_DIALOGCONTROL | WB_CHILDDLGCTRL); +#ifdef DUMP_ITER + SAL_DEBUG("isVisibleInLayout " << pWindow << " " << m_bCurrentWindowMayHaveChildren << " " << m_bIsTabControl); +#endif if (m_bCurrentWindowMayHaveChildren && !m_bIsTabControl) continue; else @@ -200,10 +245,17 @@ public: } pWindow = nextLogicalChildOfParent(pParent, pNextWindow); +#ifdef DUMP_ITER + SAL_DEBUG("nextLogicalChildOfParent " << pParent << " " << pNextWindow << " >> " << pWindow + << " (" << (pWindow ? pWindow->ImplGetWindow() : nullptr) << ")"); +#endif if (pWindow) pNextWindow = pWindow; } +#ifdef DUMP_ITER + SAL_DEBUG("++ >> " << pWindow); +#endif m_pCurrentParent = pParent; m_pCurrentWindow = pWindow; return *this; @@ -265,7 +317,12 @@ static vcl::Window* ImplGetSubChildWindow( vcl::Window* pParent, sal_uInt16 n, s } if ( n == nIndex ) + { +#ifdef DUMP_SUBCHILD + SAL_DEBUG("1. " << nIndex << " " << pFoundWindow); +#endif return pFoundWindow; + } nIndex++; } @@ -279,6 +336,9 @@ static vcl::Window* ImplGetSubChildWindow( vcl::Window* pParent, sal_uInt16 n, s } nIndex--; +#ifdef DUMP_SUBCHILD + SAL_DEBUG("2. " << nIndex << " " << pFoundWindow); +#endif return pFoundWindow; } @@ -445,6 +505,10 @@ vcl::Window* ImplFindDlgCtrlWindow( vcl::Window* pParent, vcl::Window* pWindow, sal_uInt16 nSecondFormStart = 0; sal_uInt16 nFormEnd; +#ifdef DUMP_IMPL_FIND_DLGCTRL + SAL_DEBUG("ImplFindDlgCtrlWindow " << pParent << " " << pWindow); +#endif + // find focus window in the child list vcl::Window* pFirstChildWindow = pSWindow = ImplGetChildWindow( pParent, 0, i, false ); @@ -461,6 +525,9 @@ vcl::Window* ImplFindDlgCtrlWindow( vcl::Window* pParent, vcl::Window* pWindow, // SecondWindow for composite controls like ComboBoxes and arrays if ( pSWindow->ImplIsWindowOrChild( pWindow ) ) { +#ifdef DUMP_IMPL_FIND_DLGCTRL + SAL_DEBUG("SecondWindow"); +#endif pSecondWindow = pSWindow; nSecond_i = i; nSecondFormStart = nFormStart; @@ -471,8 +538,17 @@ vcl::Window* ImplFindDlgCtrlWindow( vcl::Window* pParent, vcl::Window* pWindow, pSWindow = ImplGetNextWindow( pParent, i, i, false ); if ( !i ) pSWindow = nullptr; +#ifdef DUMP_IMPL_FIND_DLGCTRL + else + SAL_DEBUG("1 " << pSWindow << " " << i); +#endif } +#ifdef DUMP_IMPL_FIND_DLGCTRL + if ( pSWindow ) + SAL_DEBUG("2 " << pSWindow << " " << i); +#endif + if ( !pSWindow ) { // Window not found; we cannot handle it @@ -503,6 +579,10 @@ vcl::Window* ImplFindDlgCtrlWindow( vcl::Window* pParent, vcl::Window* pWindow, && pTempWindow->ImplGetWindow()->IsDialogControlStart() ) ) break; +#ifdef DUMP_IMPL_FIND_DLGCTRL + SAL_DEBUG("3 " << pTempWindow << " " << i); +#endif + if ( pTempWindow && pTempWindow == pFirstChildWindow ) { // It is possible to go through the begin of hierarchy once @@ -730,6 +810,10 @@ bool Window::ImplDlgCtrl( const KeyEvent& rKEvt, bool bKeyInput ) vcl::Window* pTempWindow; vcl::Window* pButtonWindow; sal_uInt16 i; +#ifndef ITER_ONLY + sal_uInt16 iButton; + sal_uInt16 iButtonStart; +#endif sal_uInt16 iTemp; sal_uInt16 nIndex; sal_uInt16 nFormStart; @@ -761,15 +845,43 @@ bool Window::ImplDlgCtrl( const KeyEvent& rKEvt, bool bKeyInput ) pButtonWindow = nullptr; +#ifdef DUMP_IMPL_DLGCTL + SAL_DEBUG("Window::ImplDlgCtrl"); +#endif if ( nKeyCode == KEY_RETURN ) { // search first for a DefPushButton WindowIterator aIter(this, pFocusWindow, true); +#ifdef ITER_ONLY for (; *aIter; ++aIter) if ( (aIter->GetStyle() & WB_DEFBUTTON) && aIter->mpWindowImpl->mbPushButton ) break; pButtonWindow = *aIter; +#else + pButtonWindow = ImplGetChildWindow(this, nFormStart, iButton, true); + iButtonStart = iButton; +#ifdef DUMP_IMPL_DLGCTL + SAL_DEBUG("iter start: " << nFormStart << " " << iButton << " " << this << " " << pFocusWindow); + SAL_DEBUG("old: " << pButtonWindow << " new: " << *aIter); +#endif + assert(pButtonWindow == *aIter); + while ( pButtonWindow ) + { + if ( (pButtonWindow->GetStyle() & WB_DEFBUTTON) && + pButtonWindow->mpWindowImpl->mbPushButton ) + break; + + pButtonWindow = ImplGetNextWindow( this, iButton, iButton, true ); + if ( (iButton <= iButtonStart) || (iButton > nFormEnd) ) + pButtonWindow = nullptr; + ++aIter; +#ifdef DUMP_IMPL_DLGCTL + SAL_DEBUG("old: " << pButtonWindow << " new: " << *aIter); +#endif + assert(pButtonWindow == *aIter); + } +#endif // !ITER_ONLY if ( bKeyInput && !pButtonWindow && (nDlgCtrlFlags & DialogControlFlags::Return) ) { @@ -835,10 +947,34 @@ bool Window::ImplDlgCtrl( const KeyEvent& rKEvt, bool bKeyInput ) { // search first for a CancelButton WindowIterator aIter(this, pFocusWindow, true); +#ifdef ITER_ONLY for (; *aIter; ++aIter) if (aIter->GetType() == WindowType::CANCELBUTTON) break; pButtonWindow = *aIter; +#else + pButtonWindow = ImplGetChildWindow(this, nFormStart, iButton, true); + iButtonStart = iButton; +#ifdef DUMP_IMPL_DLGCTL + SAL_DEBUG("iter start: " << nFormStart << " " << iButton << " " << this << " " << pFocusWindow); + SAL_DEBUG("old: " << pButtonWindow << " new: " << *aIter); +#endif + assert(pButtonWindow == *aIter); + while ( pButtonWindow ) + { + if ( pButtonWindow->GetType() == WindowType::CANCELBUTTON ) + break; + + pButtonWindow = ImplGetNextWindow( this, iButton, iButton, true ); + if ( (iButton <= iButtonStart) || (iButton > nFormEnd) ) + pButtonWindow = nullptr; + ++aIter; +#ifdef DUMP_IMPL_DLGCTL + SAL_DEBUG("old: " << pButtonWindow << " new: " << *aIter); +#endif + assert(pButtonWindow == *aIter); + } +#endif // !ITER_ONLY if ( bKeyInput && mpWindowImpl->mpDlgCtrlDownWindow ) { @@ -868,7 +1004,13 @@ bool Window::ImplDlgCtrl( const KeyEvent& rKEvt, bool bKeyInput ) // search group vcl::Window* pFormularFirstWindow = nullptr; vcl::Window* pLastFormularFirstWindow = nullptr; + WindowIterator aIter(this, nullptr, false); pTempWindow = ImplGetChildWindow( this, 0, iTemp, false ); +#ifdef DUMP_IMPL_DLGCTL + SAL_DEBUG("iter start: " << iTemp << " " << i << " " << this); + SAL_DEBUG("old: " << pTempWindow << " new: " << *aIter); +#endif + assert(pTempWindow == *aIter); vcl::Window* pPrevFirstFormularFirstWindow = nullptr; vcl::Window* pFirstFormularFirstWindow = pTempWindow; while ( pTempWindow ) @@ -891,9 +1033,14 @@ bool Window::ImplDlgCtrl( const KeyEvent& rKEvt, bool bKeyInput ) pLastFormularFirstWindow = pTempWindow; } + ++aIter; pTempWindow = ImplGetNextWindow( this, iTemp, iTemp, false ); if ( !iTemp ) pTempWindow = nullptr; +#ifdef DUMP_IMPL_DLGCTL + SAL_DEBUG("old: " << pTempWindow << " new: " << *aIter); +#endif + assert(pTempWindow == *aIter); } if ( bFormular ) @@ -1139,7 +1286,18 @@ static void ImplDlgCtrlUpdateDefButton( vcl::Window* pParent, vcl::Window* pFocu nFormEnd = 0xFFFF; } + WindowIterator aIter(pParent, pFocusWindow, false); +#ifdef ITER_ONLY + pSWindow = *aIter; +#else pSWindow = ImplGetChildWindow( pParent, nFormStart, i, false ); +#endif +#ifdef DUMP_UPDATE_DEF_BUTTON + SAL_DEBUG("ImplDlgCtrlUpdateDefButton"); + SAL_DEBUG("iter start: " << nFormStart << " " << i << " " << pParent << " " << pFocusWindow << " " << pSWindow); + SAL_DEBUG("old: " << pSWindow << " new: " << *aIter); +#endif + assert(pSWindow == *aIter); while ( pSWindow ) { if ( pSWindow->ImplIsPushButton() ) @@ -1153,9 +1311,18 @@ static void ImplDlgCtrlUpdateDefButton( vcl::Window* pParent, vcl::Window* pFocu pNewDefButton = pPushButton; } + ++aIter; +#ifdef ITER_ONLY + pSWindow = *aIter; +#else pSWindow = ImplGetNextWindow( pParent, i, i, false ); if ( !i || (i > nFormEnd) ) pSWindow = nullptr; +#endif +#ifdef DUMP_UPDATE_DEF_BUTTON + SAL_DEBUG("old: " << pSWindow << " new: " << *aIter << " " << i); +#endif + assert(pSWindow == *aIter); } if ( !bGetFocus ) commit e9569427271eade5dedb66db0fccd4521ddbb631 Author: Jan-Marek Glogowski <glo...@fbihome.de> AuthorDate: Wed Sep 26 14:16:09 2018 +0200 Commit: Jan-Marek Glogowski <glo...@fbihome.de> CommitDate: Thu Sep 27 09:08:00 2018 +0000 Initial vcl::Window iterator Change-Id: I414d9eb3539d6a2a8844e24a7ef245fa99935f1b diff --git a/vcl/source/window/dlgctrl.cxx b/vcl/source/window/dlgctrl.cxx index 6efbe1f39eb1..af70f4bbc484 100644 --- a/vcl/source/window/dlgctrl.cxx +++ b/vcl/source/window/dlgctrl.cxx @@ -92,6 +92,141 @@ static vcl::Window* ImplGetCurTabWindow(const vcl::Window* pWindow) return nullptr; } +namespace { + +class WindowIterator + : public std::iterator<std::forward_iterator_tag, vcl::Window*> +{ + const value_type m_pParent, m_pRealParent, m_pWindow; + const bool m_bTestEnabled; + value_type m_pCurrentWindow, m_pCurrentParent; + bool m_bCurrentWindowMayHaveChildren; + bool m_bIsTabControl; + + inline bool IsEnabled(value_type pWindow) + { + return (!m_bTestEnabled || (isEnabledInLayout(pWindow) && pWindow->IsInputEnabled())); + } + +public: + explicit WindowIterator(value_type pParent, value_type pWindow, bool bEnabled) + : m_pParent(pParent) + , m_pRealParent(ImplGetTopParentOfTabHierarchy(pParent)) + , m_pWindow(pWindow) + , m_bTestEnabled(bEnabled) + , m_pCurrentWindow(m_pRealParent) + , m_pCurrentParent(nullptr) + , m_bCurrentWindowMayHaveChildren(true) + , m_bIsTabControl(false) + { + vcl::Window* pRealWindow = m_pRealParent->ImplGetWindow(); + if (pRealWindow->GetType() == WindowType::TABCONTROL) + m_bIsTabControl = true; + ++(*this); + } + + WindowIterator& operator++() + { + vcl::Window* pWindow = nullptr; + vcl::Window* pNextWindow = m_pCurrentWindow; + vcl::Window* pParent = nullptr; + + while (true) + { + if (m_bIsTabControl) + { + // check if pNextWindow has children => not in dispose + pWindow = firstLogicalChildOfParent(pNextWindow); + if (pWindow) + pWindow = ImplGetCurTabWindow(pNextWindow->ImplGetWindow()); + } + else if (m_bCurrentWindowMayHaveChildren) + pWindow = firstLogicalChildOfParent(pNextWindow); + + if (!pWindow) + { + while (true) + { + assert(!pWindow); + pParent = getNonLayoutParent(pNextWindow); + if (pNextWindow == m_pParent || !pParent) + break; + + if (pParent->ImplGetWindow()->GetType() == WindowType::TABCONTROL) + { + pNextWindow = pParent; + continue; + } + + pWindow = nextLogicalChildOfParent(pParent, pNextWindow); + if (!pWindow) + { + pNextWindow = pParent; + } + else + { + if (!ImplHasIndirectTabParent(pWindow) && pWindow->ImplGetWindow()->IsDialogControlStart()) + pWindow = nullptr; + else + { + pNextWindow = pWindow; + break; + } + } + } + if (!pWindow) + break; + } + else if (m_bCurrentWindowMayHaveChildren || m_bIsTabControl) + { + pParent = pNextWindow; + pNextWindow = pWindow; + } + + vcl::Window* pRealWindow = pWindow->ImplGetWindow(); + if (isVisibleInLayout(pRealWindow) && IsEnabled(pWindow)) + { + m_bIsTabControl = (pRealWindow->GetType() == WindowType::TABCONTROL); + m_bCurrentWindowMayHaveChildren = pRealWindow->GetStyle() & (WB_DIALOGCONTROL | WB_CHILDDLGCTRL); + if (m_bCurrentWindowMayHaveChildren && !m_bIsTabControl) + continue; + else + break; + } + else + { + m_bCurrentWindowMayHaveChildren = false; + m_bIsTabControl = false; + } + + pWindow = nextLogicalChildOfParent(pParent, pNextWindow); + if (pWindow) + pNextWindow = pWindow; + } + + m_pCurrentParent = pParent; + m_pCurrentWindow = pWindow; + return *this; + } + WindowIterator operator++(int) + { WindowIterator retval = *this; ++(*this); return retval; } + + bool operator==(WindowIterator other) const { return m_pCurrentWindow == other.m_pCurrentWindow; } + bool operator!=(WindowIterator other) const { return m_pCurrentWindow != other.m_pCurrentWindow; } + value_type operator*() const { return m_pCurrentWindow ? m_pCurrentWindow->ImplGetWindow() : nullptr; } + value_type operator->() const { return this->operator*(); } + WindowIterator begin() + { return WindowIterator(m_pParent, m_pWindow, m_bTestEnabled); } + WindowIterator end() + { + WindowIterator aEnd(m_pParent, m_pWindow, m_bTestEnabled); + aEnd.m_pCurrentWindow = nullptr; + return aEnd; + } +}; + +}; + static vcl::Window* ImplGetSubChildWindow( vcl::Window* pParent, sal_uInt16 n, sal_uInt16& nIndex ) { vcl::Window* pTabPage = nullptr; @@ -595,8 +730,6 @@ bool Window::ImplDlgCtrl( const KeyEvent& rKEvt, bool bKeyInput ) vcl::Window* pTempWindow; vcl::Window* pButtonWindow; sal_uInt16 i; - sal_uInt16 iButton; - sal_uInt16 iButtonStart; sal_uInt16 iTemp; sal_uInt16 nIndex; sal_uInt16 nFormStart; @@ -630,19 +763,13 @@ bool Window::ImplDlgCtrl( const KeyEvent& rKEvt, bool bKeyInput ) if ( nKeyCode == KEY_RETURN ) { - // search first for a DefPushButton/CancelButton - pButtonWindow = ImplGetChildWindow( this, nFormStart, iButton, true ); - iButtonStart = iButton; - while ( pButtonWindow ) - { - if ( (pButtonWindow->GetStyle() & WB_DEFBUTTON) && - pButtonWindow->mpWindowImpl->mbPushButton ) + // search first for a DefPushButton + WindowIterator aIter(this, pFocusWindow, true); + for (; *aIter; ++aIter) + if ( (aIter->GetStyle() & WB_DEFBUTTON) && + aIter->mpWindowImpl->mbPushButton ) break; - - pButtonWindow = ImplGetNextWindow( this, iButton, iButton, true ); - if ( (iButton <= iButtonStart) || (iButton > nFormEnd) ) - pButtonWindow = nullptr; - } + pButtonWindow = *aIter; if ( bKeyInput && !pButtonWindow && (nDlgCtrlFlags & DialogControlFlags::Return) ) { @@ -706,18 +833,12 @@ bool Window::ImplDlgCtrl( const KeyEvent& rKEvt, bool bKeyInput ) } else if ( nKeyCode == KEY_ESCAPE ) { - // search first for a DefPushButton/CancelButton - pButtonWindow = ImplGetChildWindow( this, nFormStart, iButton, true ); - iButtonStart = iButton; - while ( pButtonWindow ) - { - if ( pButtonWindow->GetType() == WindowType::CANCELBUTTON ) + // search first for a CancelButton + WindowIterator aIter(this, pFocusWindow, true); + for (; *aIter; ++aIter) + if (aIter->GetType() == WindowType::CANCELBUTTON) break; - - pButtonWindow = ImplGetNextWindow( this, iButton, iButton, true ); - if ( (iButton <= iButtonStart) || (iButton > nFormEnd) ) - pButtonWindow = nullptr; - } + pButtonWindow = *aIter; if ( bKeyInput && mpWindowImpl->mpDlgCtrlDownWindow ) { commit 5f83d8882f6074b17184ce4945998d421733b4f5 Author: Jan-Marek Glogowski <glo...@fbihome.de> AuthorDate: Wed Sep 26 14:09:59 2018 +0200 Commit: Jan-Marek Glogowski <glo...@fbihome.de> CommitDate: Thu Sep 27 09:08:00 2018 +0000 Don't iter over hidden tab pages Change-Id: Ie8699dae8d08628b66b33e0704237b9e219874bc diff --git a/vcl/source/window/dlgctrl.cxx b/vcl/source/window/dlgctrl.cxx index 4479291b6f24..6efbe1f39eb1 100644 --- a/vcl/source/window/dlgctrl.cxx +++ b/vcl/source/window/dlgctrl.cxx @@ -98,7 +98,14 @@ static vcl::Window* ImplGetSubChildWindow( vcl::Window* pParent, sal_uInt16 n, s vcl::Window* pFoundWindow = nullptr; vcl::Window* pWindow = firstLogicalChildOfParent(pParent); + // pParent is a tab control and has tabs (not in dispose) + if (pWindow && pParent->ImplGetWindow()->GetType() == WindowType::TABCONTROL) + { + pTabPage = ImplGetCurTabWindow(pParent->ImplGetWindow()); + pWindow = lastLogicalChildOfParent(pParent); + } vcl::Window* pNextWindow = pWindow; + while ( pWindow ) { pWindow = pWindow->ImplGetWindow(); commit 241af0f65ccac816ee306692edc848d5cb09e20e Author: Jan-Marek Glogowski <glo...@fbihome.de> AuthorDate: Thu Aug 30 16:19:30 2018 +0200 Commit: Jan-Marek Glogowski <glo...@fbihome.de> CommitDate: Thu Sep 27 09:08:00 2018 +0000 Move TabPage lookup into extra function Probably easier to review the follow up patch. Change-Id: I42e8f78b69b4ed2cb28bf0f36496eb751e8cb433 diff --git a/vcl/source/window/dlgctrl.cxx b/vcl/source/window/dlgctrl.cxx index 76adefb1d2a1..4479291b6f24 100644 --- a/vcl/source/window/dlgctrl.cxx +++ b/vcl/source/window/dlgctrl.cxx @@ -68,6 +68,30 @@ static vcl::Window* ImplGetTopParentOfTabHierarchy( vcl::Window* pParent ) return pResult; } +static vcl::Window* ImplGetCurTabWindow(const vcl::Window* pWindow) +{ + assert(pWindow->GetType() == WindowType::TABCONTROL); + const TabControl* pTabControl = static_cast<const TabControl*>(pWindow); + // Check if the TabPage is a Child of the TabControl and still exists (by + // walking all child windows); because it could be that the TabPage has been + // destroyed already by a Dialog-Dtor, event that the TabControl still exists. + const TabPage* pTempTabPage = pTabControl->GetTabPage(pTabControl->GetCurPageId()); + if (pTempTabPage) + { + vcl::Window* pTempWindow = pTabControl->GetWindow(GetWindowType::FirstChild); + while (pTempWindow) + { + if (pTempWindow->ImplGetWindow() == pTempTabPage) + { + return const_cast<TabPage*>(pTempTabPage); + } + pTempWindow = nextLogicalChildOfParent(pTabControl, pTempWindow); + } + } + + return nullptr; +} + static vcl::Window* ImplGetSubChildWindow( vcl::Window* pParent, sal_uInt16 n, sal_uInt16& nIndex ) { vcl::Window* pTabPage = nullptr; @@ -91,31 +115,10 @@ static vcl::Window* ImplGetSubChildWindow( vcl::Window* pParent, sal_uInt16 n, s else { pFoundWindow = pWindow; - // for a TabControl, remember the current TabPage for later use if ( pWindow->GetType() == WindowType::TABCONTROL ) - { - TabControl* pTabControl = static_cast<TabControl*>(pWindow); - // Check if the TabPage is a Child of the TabControl and still exists (by - // walking all child windows); because it could be that the TabPage has been - // destroyed already by a Dialog-Dtor, event that the TabControl still exists. - TabPage* pTempTabPage = pTabControl->GetTabPage( pTabControl->GetCurPageId() ); - if ( pTempTabPage ) - { - vcl::Window* pTempWindow = pTabControl->GetWindow( GetWindowType::FirstChild ); - while ( pTempWindow ) - { - if ( pTempWindow->ImplGetWindow() == pTempTabPage ) - { - pTabPage = pTempTabPage; - break; - } - pTempWindow = nextLogicalChildOfParent(pTabControl, pTempWindow); - } - } - } - else if ( ( pWindow->GetStyle() & WB_DIALOGCONTROL ) - || ( pWindow->GetStyle() & WB_CHILDDLGCTRL ) ) + pTabPage = ImplGetCurTabWindow(pWindow); + else if (pWindow->GetStyle() & (WB_DIALOGCONTROL | WB_CHILDDLGCTRL)) pFoundWindow = ImplGetSubChildWindow( pWindow, n, nIndex ); } commit 7cee4392f6ca9dafc94b5eb38d1a5b614c02a3b1 Author: Jan-Marek Glogowski <glo...@fbihome.de> AuthorDate: Fri Aug 31 16:43:18 2018 +0200 Commit: Jan-Marek Glogowski <glo...@fbihome.de> CommitDate: Thu Sep 27 09:08:00 2018 +0000 Constify vcl::Window child lookup Change-Id: I11425dc4aa372423fcf469ab1374159ce8b180e2 diff --git a/include/vcl/layout.hxx b/include/vcl/layout.hxx index 50fd57663542..22d494dfa6e2 100644 --- a/include/vcl/layout.hxx +++ b/include/vcl/layout.hxx @@ -767,21 +767,28 @@ public: //i.e. acts like pChild = pChild->GetWindow(GetWindowType::FirstChild); //in a flat hierarchy where dialogs only have one layer //of children -VCL_DLLPUBLIC vcl::Window* firstLogicalChildOfParent(vcl::Window *pTopLevel); +VCL_DLLPUBLIC vcl::Window* firstLogicalChildOfParent(const vcl::Window *pTopLevel); + +//Get last window of a pTopLevel window as +//if any intermediate layout widgets didn't exist +//i.e. acts like pChild = pChild->GetWindow(GetWindowType::LastChild); +//in a flat hierarchy where dialogs only have one layer +//of children +VCL_DLLPUBLIC vcl::Window* lastLogicalChildOfParent(const vcl::Window *pTopLevel); //Get next window after pChild of a pTopLevel window as //if any intermediate layout widgets didn't exist //i.e. acts like pChild = pChild->GetWindow(GetWindowType::Next); //in a flat hierarchy where dialogs only have one layer //of children -VCL_DLLPUBLIC vcl::Window* nextLogicalChildOfParent(vcl::Window *pTopLevel, vcl::Window *pChild); +VCL_DLLPUBLIC vcl::Window* nextLogicalChildOfParent(const vcl::Window *pTopLevel, const vcl::Window *pChild); //Get previous window before pChild of a pTopLevel window as //if any intermediate layout widgets didn't exist //i.e. acts like pChild = pChild->GetWindow(GetWindowType::Prev); //in a flat hierarchy where dialogs only have one layer //of children -VCL_DLLPUBLIC vcl::Window* prevLogicalChildOfParent(vcl::Window *pTopLevel, vcl::Window *pChild); +VCL_DLLPUBLIC vcl::Window* prevLogicalChildOfParent(const vcl::Window *pTopLevel, const vcl::Window *pChild); //Returns true is the Window has a single child which is a container VCL_DLLPUBLIC bool isLayoutEnabled(const vcl::Window *pWindow); diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx index ed3016ad64d2..5d5505836807 100644 --- a/vcl/source/window/dialog.cxx +++ b/vcl/source/window/dialog.cxx @@ -128,9 +128,9 @@ void ImplHideSplash() //Get next window after pChild of a pTopLevel window as //if any intermediate layout widgets didn't exist -vcl::Window * nextLogicalChildOfParent(vcl::Window *pTopLevel, vcl::Window *pChild) +vcl::Window * nextLogicalChildOfParent(const vcl::Window *pTopLevel, const vcl::Window *pChild) { - vcl::Window *pLastChild = pChild; + const vcl::Window *pLastChild = pChild; if (isContainerWindow(*pChild)) pChild = pChild->GetWindow(GetWindowType::FirstChild); @@ -151,12 +151,12 @@ vcl::Window * nextLogicalChildOfParent(vcl::Window *pTopLevel, vcl::Window *pChi if (pChild && isContainerWindow(*pChild)) pChild = nextLogicalChildOfParent(pTopLevel, pChild); - return pChild; + return const_cast<vcl::Window *>(pChild); } -vcl::Window * prevLogicalChildOfParent(vcl::Window *pTopLevel, vcl::Window *pChild) +vcl::Window * prevLogicalChildOfParent(const vcl::Window *pTopLevel, const vcl::Window *pChild) { - vcl::Window *pLastChild = pChild; + const vcl::Window *pLastChild = pChild; if (isContainerWindow(*pChild)) pChild = pChild->GetWindow(GetWindowType::LastChild); @@ -177,17 +177,23 @@ vcl::Window * prevLogicalChildOfParent(vcl::Window *pTopLevel, vcl::Window *pChi if (pChild && isContainerWindow(*pChild)) pChild = prevLogicalChildOfParent(pTopLevel, pChild); - return pChild; + return const_cast<vcl::Window *>(pChild); } -//Get first window of a pTopLevel window as -//if any intermediate layout widgets didn't exist -vcl::Window * firstLogicalChildOfParent(vcl::Window *pTopLevel) +vcl::Window * firstLogicalChildOfParent(const vcl::Window *pTopLevel) { vcl::Window *pChild = pTopLevel->GetWindow(GetWindowType::FirstChild); if (pChild && isContainerWindow(*pChild)) pChild = nextLogicalChildOfParent(pTopLevel, pChild); - return pChild; + return const_cast<vcl::Window *>(pChild); +} + +vcl::Window * lastLogicalChildOfParent(const vcl::Window *pTopLevel) +{ + vcl::Window *pChild = pTopLevel->GetWindow(GetWindowType::LastChild); + if (pChild && isContainerWindow(*pChild)) + pChild = prevLogicalChildOfParent(pTopLevel, pChild); + return const_cast<vcl::Window *>(pChild); } void Accelerator::GenerateAutoMnemonicsOnHierarchy(vcl::Window* pWindow) commit 9a89a75052c7327187cd5788dbaf8891a0a95cac Author: Vasily Melenchuk <vasily.melenc...@cib.de> AuthorDate: Tue Sep 25 11:21:55 2018 +0300 Commit: Thorsten Behrens <thorsten.behr...@cib.de> CommitDate: Thu Sep 27 10:57:10 2018 +0200 sw: new unit test for XAutoTextGroup and rdf::URI Change-Id: I989ff797ddcd4ce77ac9b87fde2a2f8f75dbbc6b Reviewed-on: https://gerrit.libreoffice.org/60961 Tested-by: Jenkins Reviewed-by: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> Reviewed-by: Thorsten Behrens <thorsten.behr...@cib.de> diff --git a/sw/CppunitTest_sw_unoapi.mk b/sw/CppunitTest_sw_unoapi.mk new file mode 100644 index 000000000000..3a7403169ec3 --- /dev/null +++ b/sw/CppunitTest_sw_unoapi.mk @@ -0,0 +1,62 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,sw_unoapi)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sw_unoapi, \ + sw/qa/unit/unoapi \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sw_unoapi, \ + comphelper \ + cppu \ + cppuhelper \ + editeng \ + i18nlangtag \ + sal \ + sfx \ + svl \ + svt \ + sw \ + test \ + tl \ + unotest \ + utl \ + vcl \ +)) + +$(eval $(call gb_CppunitTest_use_externals,sw_unoapi,\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_set_include,sw_unoapi,\ + -I$(SRCDIR)/sw/inc \ + -I$(SRCDIR)/sw/source/core/inc \ + -I$(SRCDIR)/sw/source/uibase/inc \ + -I$(SRCDIR)/sw/qa/extras/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_api,sw_unoapi,\ + udkapi \ + offapi \ + oovbaapi \ +)) + +$(eval $(call gb_CppunitTest_use_ure,sw_unoapi)) +$(eval $(call gb_CppunitTest_use_vcl,sw_unoapi)) + +$(eval $(call gb_CppunitTest_use_rdb,sw_unoapi,services)) + +$(eval $(call gb_CppunitTest_use_configuration,sw_unoapi)) + +# vim: set noet sw=4 ts=4: diff --git a/sw/Module_sw.mk b/sw/Module_sw.mk index e825f09cef9e..92be67b23af9 100644 --- a/sw/Module_sw.mk +++ b/sw/Module_sw.mk @@ -97,6 +97,7 @@ $(eval $(call gb_Module_add_slowcheck_targets,sw,\ CppunitTest_sw_accessible_relation_set \ CppunitTest_sw_apitests \ CppunitTest_sw_unowriter \ + CppunitTest_sw_unoapi \ )) ifneq ($(DISABLE_GUI),TRUE) diff --git a/sw/qa/unit/data/xautotextgroup.odt b/sw/qa/unit/data/xautotextgroup.odt new file mode 100644 index 000000000000..e1cb9e7ea052 Binary files /dev/null and b/sw/qa/unit/data/xautotextgroup.odt differ diff --git a/sw/qa/unit/unoapi.cxx b/sw/qa/unit/unoapi.cxx new file mode 100644 index 000000000000..cc08d5d440c9 --- /dev/null +++ b/sw/qa/unit/unoapi.cxx @@ -0,0 +1,235 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <swmodeltestbase.hxx> + +#include <comphelper/processfactory.hxx> +#include <comphelper/string.hxx> + +#include <com/sun/star/text/AutoTextContainer.hpp> +#include <com/sun/star/text/XAutoTextGroup.hpp> + +#include <com/sun/star/rdf/URI.hpp> +#include <com/sun/star/rdf/URIs.hpp> + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::text; + +class UnoApiTest : public SwModelTestBase +{ +public: + UnoApiTest() + : SwModelTestBase("sw/qa/unit/data/", "writer8") + { + } +}; + +/** + * Macro to declare a new test with preloaded file + * (similar to DECLARE_SW_ROUNDTRIP_TEST) + */ +#define DECLARE_UNOAPI_TEST_FILE(TestName, filename) \ + class TestName : public UnoApiTest \ + { \ + protected: \ + virtual OUString getTestName() override { return OUString(#TestName); } \ + \ + public: \ + CPPUNIT_TEST_SUITE(TestName); \ + CPPUNIT_TEST(loadAndTest); \ + CPPUNIT_TEST_SUITE_END(); \ + void loadAndTest() \ + { \ + load(mpTestDocumentPath, filename); \ + runTest(); \ + } \ + void runTest(); \ + }; \ + CPPUNIT_TEST_SUITE_REGISTRATION(TestName); \ + void TestName::runTest() + +/** + * Macro to declare a new test without loading any files + */ +#define DECLARE_UNOAPI_TEST(TestName) \ + class TestName : public CppUnit::TestFixture \ + { \ + public: \ + CPPUNIT_TEST_SUITE(TestName); \ + CPPUNIT_TEST(runTest); \ + CPPUNIT_TEST_SUITE_END(); \ + void runTest(); \ + }; \ + CPPUNIT_TEST_SUITE_REGISTRATION(TestName); \ + void TestName::runTest() + +static bool ensureAutoTextExistsByTitle(const Reference<XAutoTextGroup>& autoTextGroup, + const OUString& autoTextName) +{ + uno::Sequence<OUString> aTitles(autoTextGroup->getTitles()); + for (const auto& rTitle : aTitles) + { + if (rTitle == autoTextName) + return true; + } + return false; +} + +static bool ensureAutoTextExistsByName(const Reference<XAutoTextGroup>& autoTextGroup, + const OUString& autoTextName) +{ + uno::Sequence<OUString> aTitles(autoTextGroup->getElementNames()); + for (const auto& rTitle : aTitles) + { + if (rTitle == autoTextName) + return true; + } + return false; +} + +DECLARE_UNOAPI_TEST_FILE(testXAutoTextGroup, "xautotextgroup.odt") +{ + Reference<XAutoTextContainer> xAutoTextContainer + = AutoTextContainer::create(comphelper::getProcessComponentContext()); + + uno::Reference<text::XTextRange> xTextRange = getRun(getParagraph(1), 1); + + const OUString sGroupName = "TestGroup*1"; + const OUString sTextName = "TEST"; + const OUString sTextNameNew = "TESTRENAMED"; + const OUString sTextTitle = "Test Auto Text"; + const OUString sTextTitleNew = "Test Auto Text Renamed"; + + // Create new temporary group + Reference<XAutoTextGroup> xAutoTextGroup(xAutoTextContainer->insertNewByName(sGroupName), + uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE("AutoTextGroup was not found!", xAutoTextGroup.is()); + + // Insert new element and ensure it exists + Reference<XAutoTextEntry> xAutoTextEntry + = xAutoTextGroup->insertNewByName(sTextName, sTextTitle, xTextRange); + CPPUNIT_ASSERT_MESSAGE("AutoText was not inserted!", xAutoTextEntry.is()); + CPPUNIT_ASSERT_MESSAGE("Can't find newly created AutoText by title!", + ensureAutoTextExistsByTitle(xAutoTextGroup, sTextTitle)); + CPPUNIT_ASSERT_MESSAGE("Can't find newly created AutoText by name!", + ensureAutoTextExistsByName(xAutoTextGroup, sTextName)); + + // Insert once again the same should throw an exception + CPPUNIT_ASSERT_THROW_MESSAGE("We expect an exception on insertion of same AutoText", + xAutoTextGroup->insertNewByName(sTextName, sTextTitle, xTextRange), + container::ElementExistException); + + // Rename it & ensure everything is ok + xAutoTextGroup->renameByName(sTextName, sTextNameNew, sTextTitleNew); + CPPUNIT_ASSERT_MESSAGE("Can't find renamed AutoText by title!", + ensureAutoTextExistsByTitle(xAutoTextGroup, sTextTitleNew)); + CPPUNIT_ASSERT_MESSAGE("Can't find renamed AutoText by name!", + ensureAutoTextExistsByName(xAutoTextGroup, sTextNameNew)); + // Not found by old names + CPPUNIT_ASSERT_MESSAGE("Found AutoText by old title!", + !ensureAutoTextExistsByTitle(xAutoTextGroup, sTextTitle)); + CPPUNIT_ASSERT_MESSAGE("Found AutoText by old name!", + !ensureAutoTextExistsByName(xAutoTextGroup, sTextName)); + + // Rename not existing should throw an exception + CPPUNIT_ASSERT_THROW_MESSAGE( + "We expect an exception on renaming not-exising AutoText", + xAutoTextGroup->renameByName(sTextName, sTextNameNew, sTextTitleNew), + container::ElementExistException); + + // Remove it and ensure it does not exist + xAutoTextGroup->removeByName(sTextNameNew); + CPPUNIT_ASSERT_MESSAGE("AutoText was not removed!", + !ensureAutoTextExistsByTitle(xAutoTextGroup, sTextTitleNew)); + CPPUNIT_ASSERT_MESSAGE("AutoText was not removed!", + !ensureAutoTextExistsByName(xAutoTextGroup, sTextNameNew)); + + // Remove non-existing element should throw an exception + CPPUNIT_ASSERT_THROW_MESSAGE("We expect an exception on removing not-existing AutoText", + xAutoTextGroup->removeByName(sTextName), + container::NoSuchElementException); + + // Remove our temporary group + xAutoTextContainer->removeByName(sGroupName); +} + +DECLARE_UNOAPI_TEST(testXURI) +{ + Reference<XComponentContext> xContext(::comphelper::getProcessComponentContext()); + + // createKnown() + Reference<rdf::XURI> xURIcreateKnown(rdf::URI::createKnown(xContext, rdf::URIs::ODF_PREFIX), + UNO_SET_THROW); + CPPUNIT_ASSERT(xURIcreateKnown.is()); + CPPUNIT_ASSERT_EQUAL(OUString("http://docs.oasis-open.org/ns/office/1.2/meta/odf#"), + xURIcreateKnown->getNamespace()); + CPPUNIT_ASSERT_EQUAL(OUString("prefix"), xURIcreateKnown->getLocalName()); + CPPUNIT_ASSERT_EQUAL(OUString("http://docs.oasis-open.org/ns/office/1.2/meta/odf#prefix"), + xURIcreateKnown->getStringValue()); + + // createKnown() with invalid constant + CPPUNIT_ASSERT_THROW_MESSAGE("We expect an exception on invalid constant", + rdf::URI::createKnown(xContext, 12345), + lang::IllegalArgumentException); + + // create() + Reference<rdf::XURI> xURIcreate(rdf::URI::create(xContext, "http://example.com/url#somedata"), + UNO_SET_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/url#"), xURIcreate->getNamespace()); + CPPUNIT_ASSERT_EQUAL(OUString("somedata"), xURIcreate->getLocalName()); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/url#somedata"), xURIcreate->getStringValue()); + + // create() without local name splitted with "/" + Reference<rdf::XURI> xURIcreate2(rdf::URI::create(xContext, "http://example.com/url"), + UNO_SET_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/"), xURIcreate2->getNamespace()); + CPPUNIT_ASSERT_EQUAL(OUString("url"), xURIcreate2->getLocalName()); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/url"), xURIcreate2->getStringValue()); + + // create() without prefix + Reference<rdf::XURI> xURIcreate3(rdf::URI::create(xContext, "#somedata"), UNO_SET_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("#"), xURIcreate3->getNamespace()); + CPPUNIT_ASSERT_EQUAL(OUString("somedata"), xURIcreate3->getLocalName()); + CPPUNIT_ASSERT_EQUAL(OUString("#somedata"), xURIcreate3->getStringValue()); + + // create() with invalid URI + CPPUNIT_ASSERT_THROW_MESSAGE("We expect an exception on invalid URI", + rdf::URI::create(xContext, "some junk and not URI"), + lang::IllegalArgumentException); + + // createNS() + Reference<rdf::XURI> xURIcreateNS( + rdf::URI::createNS(xContext, "http://example.com/url#", "somedata"), UNO_SET_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/url#"), xURIcreateNS->getNamespace()); + CPPUNIT_ASSERT_EQUAL(OUString("somedata"), xURIcreateNS->getLocalName()); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/url#somedata"), + xURIcreateNS->getStringValue()); + + // TODO: What's going on here? Is such usecase valid? + Reference<rdf::XURI> xURIcreateNS2( + rdf::URI::createNS(xContext, "http://example.com/url", "somedata"), UNO_SET_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/"), xURIcreateNS2->getNamespace()); + CPPUNIT_ASSERT_EQUAL(OUString("urlsomedata"), xURIcreateNS2->getLocalName()); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/urlsomedata"), + xURIcreateNS2->getStringValue()); + + // createNS() some invalid cases + CPPUNIT_ASSERT_THROW_MESSAGE("We expect an exception on invalid URI", + rdf::URI::createNS(xContext, "bla", "bla"), + lang::IllegalArgumentException); + + CPPUNIT_ASSERT_THROW_MESSAGE("We expect an exception on invalid URI", + rdf::URI::createNS(xContext, OUString(), OUString()), + lang::IllegalArgumentException); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 70fe1a5c9aae1876d3a0f4c6fd3d4f11dc25369f Author: Stephan Bergmann <sberg...@redhat.com> AuthorDate: Thu Sep 27 09:20:31 2018 +0200 Commit: Stephan Bergmann <sberg...@redhat.com> CommitDate: Thu Sep 27 09:21:59 2018 +0200 Fix prev blind fix Change-Id: I58d534e7da346062c631791f9c016850602e40ad Reviewed-on: https://gerrit.libreoffice.org/61024 Reviewed-by: Stephan Bergmann <sberg...@redhat.com> Tested-by: Stephan Bergmann <sberg...@redhat.com> diff --git a/include/unoidl/unoidl.hxx b/include/unoidl/unoidl.hxx index 9450ebf83bf0..98674f6789e6 100644 --- a/include/unoidl/unoidl.hxx +++ b/include/unoidl/unoidl.hxx @@ -505,11 +505,11 @@ public: bool const rest; }; - Constructor(): defaultConstructor(true) + Constructor(): #if defined __clang__ && CLANG_VERSION == 30800 - , annotations() + annotations(), #endif - {} + defaultConstructor(true) {} Constructor( rtl::OUString const & theName, commit a887c42095d5749e896a8e8ee41e9e07f4e65557 Author: Stephan Bergmann <sberg...@redhat.com> AuthorDate: Thu Sep 27 08:47:42 2018 +0200 Commit: Stephan Bergmann <sberg...@redhat.com> CommitDate: Thu Sep 27 08:47:42 2018 +0200 Blind fix for error with old Clang <https://ci.libreoffice.org//job/lo_ubsan/1050/consoleFull#-18477798892a810015-1db5-427c-9ce2-83b5f06a5284>: > In file included from /home/tdf/lode/jenkins/workspace/lo_ubsan/codemaker/source/codemaker/exceptiontree.cxx:28: > /home/tdf/lode/jenkins/workspace/lo_ubsan/include/unoidl/unoidl.hxx:507:9: error: constructor for 'unoidl::SingleInterfaceBasedServiceEntity::Constructor' must explicitly initialize the const member 'annotations' > Constructor(): defaultConstructor(true) {} > ^ > /home/tdf/lode/jenkins/workspace/lo_ubsan/include/unoidl/unoidl.hxx:524:44: note: 'annotations' declared here > std::vector< rtl::OUString > const annotations; ^ 1 error generated. Change-Id: I041a67599b48959bcca136bab646f6943d071bed diff --git a/include/unoidl/unoidl.hxx b/include/unoidl/unoidl.hxx index 711b220f7e0a..9450ebf83bf0 100644 --- a/include/unoidl/unoidl.hxx +++ b/include/unoidl/unoidl.hxx @@ -15,6 +15,7 @@ #include <cassert> #include <vector> +#include <config_clang.h> #include <osl/mutex.hxx> #include <rtl/ref.hxx> #include <rtl/ustring.hxx> @@ -504,7 +505,11 @@ public: bool const rest; }; - Constructor(): defaultConstructor(true) {} + Constructor(): defaultConstructor(true) +#if defined __clang__ && CLANG_VERSION == 30800 + , annotations() +#endif + {} Constructor( rtl::OUString const & theName, commit 1fb688b2e13da39b8099a3f4ba58dc9aeef8d723 Author: Brian Fraser <andthebr...@softfrog.ca> AuthorDate: Wed Sep 26 10:19:11 2018 -0700 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Thu Sep 27 08:38:23 2018 +0200 tdf#118065 Fix slow Impress custom animation sidebar update Timer MainSequence::maTimer dropped from 500ms to 50ms. Reorder declarations of UI elements in CustomAnimationPane.hxx to be more intuitive and reflect order shown in UI. Change-Id: I2857dbbd6a4131c4ca6f9a054132f34056e95338 Reviewed-on: https://gerrit.libreoffice.org/61019 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sd/source/core/CustomAnimationEffect.cxx b/sd/source/core/CustomAnimationEffect.cxx index f10210ca9c72..1b35a3a48a97 100644 --- a/sd/source/core/CustomAnimationEffect.cxx +++ b/sd/source/core/CustomAnimationEffect.cxx @@ -2969,7 +2969,7 @@ void MainSequence::init() mnSequenceType = EffectNodeType::MAIN_SEQUENCE; maTimer.SetInvokeHandler( LINK(this, MainSequence, onTimerHdl) ); - maTimer.SetTimeout(500); + maTimer.SetTimeout(50); mxChangesListener.set( new AnimationChangeListener( this ) ); @@ -3356,7 +3356,7 @@ IMPL_LINK_NOARG(MainSequence, onTimerHdl, Timer *, void) } } -/** starts a timer that recreates the internal structure from the API core after 1 second */ +/** starts a timer that recreates the internal structure from the API core */ void MainSequence::startRecreateTimer() { if( !mbRebuilding && (mbIgnoreChanges == 0) ) @@ -3366,7 +3366,10 @@ void MainSequence::startRecreateTimer() } } -/** starts a timer that rebuilds the API core from the internal structure after 1 second */ +/** + * starts a timer that rebuilds the API core from the internal structure + * This is used to reduce the number of screen redraws due to animation changes. +*/ void MainSequence::startRebuildTimer() { mbTimerMode = true; diff --git a/sd/source/ui/animations/CustomAnimationPane.hxx b/sd/source/ui/animations/CustomAnimationPane.hxx index f1aff2e25cdc..d1e1475b6a92 100644 --- a/sd/source/ui/animations/CustomAnimationPane.hxx +++ b/sd/source/ui/animations/CustomAnimationPane.hxx @@ -136,28 +136,29 @@ private: const CustomAnimationPresets* mpCustomAnimationPresets; - VclPtr<PushButton> mpPBAddEffect; - VclPtr<PushButton> mpPBRemoveEffect; - VclPtr<FixedText> mpFTEffect; - VclPtr<FixedText> mpFTStart; - VclPtr<ListBox> mpLBStart; - VclPtr<FixedText> mpFTProperty; - VclPtr<VclHBox> mpPlaceholderBox; - VclPtr<PropertyControl> mpLBProperty; - VclPtr<PushButton> mpPBPropertyMore; - VclPtr<FixedText> mpFTDuration; + // UI Elements + VclPtr<FixedText> mpFTAnimation; + VclPtr<CustomAnimationList> mpCustomAnimationList; + VclPtr<PushButton> mpPBAddEffect; + VclPtr<PushButton> mpPBRemoveEffect; + VclPtr<PushButton> mpPBMoveUp; + VclPtr<PushButton> mpPBMoveDown; + VclPtr<FixedText> mpFTCategory; + VclPtr<ListBox> mpLBCategory; + VclPtr<FixedText> mpFTEffect; + VclPtr<CategoryListBox> mpLBAnimation; + VclPtr<FixedText> mpFTStart; + VclPtr<ListBox> mpLBStart; + VclPtr<FixedText> mpFTProperty; + VclPtr<PropertyControl> mpLBProperty; + VclPtr<VclHBox> mpPlaceholderBox; + VclPtr<PushButton> mpPBPropertyMore; + VclPtr<FixedText> mpFTDuration; VclPtr<MetricBox> mpCBXDuration; VclPtr<FixedText> mpFTStartDelay; VclPtr<MetricField> mpMFStartDelay; - VclPtr<CustomAnimationList> mpCustomAnimationList; - VclPtr<PushButton> mpPBMoveUp; - VclPtr<PushButton> mpPBMoveDown; - VclPtr<PushButton> mpPBPlay; - VclPtr<CheckBox> mpCBAutoPreview; - VclPtr<FixedText> mpFTCategory; - VclPtr<ListBox> mpLBCategory; - VclPtr<FixedText> mpFTAnimation; - VclPtr<CategoryListBox> mpLBAnimation; + VclPtr<CheckBox> mpCBAutoPreview; + VclPtr<PushButton> mpPBPlay; OUString maStrModify; OUString maStrProperty; commit e14c7fa64eff20bf5fc0a97600a0dd58531e1046 Author: Jim Raykowski <rayk...@gmail.com> AuthorDate: Tue Sep 25 23:30:40 2018 -0800 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Thu Sep 27 08:37:15 2018 +0200 tdf#120122 Fix key input being passed to doc view from floating sidebar ...tab bar Change-Id: Iae327e0de3a129f28315a3fe2961a6ae572e4056 Reviewed-on: https://gerrit.libreoffice.org/61020 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sfx2/source/sidebar/TabBar.cxx b/sfx2/source/sidebar/TabBar.cxx index 9487e8079c7c..7930f98ebb72 100644 --- a/sfx2/source/sidebar/TabBar.cxx +++ b/sfx2/source/sidebar/TabBar.cxx @@ -229,7 +229,11 @@ void TabBar::DataChanged (const DataChangedEvent& rDataChangedEvent) bool TabBar::EventNotify(NotifyEvent& rEvent) { - if(rEvent.GetType() == MouseNotifyEvent::COMMAND) + MouseNotifyEvent nType = rEvent.GetType(); + if (MouseNotifyEvent::KEYINPUT == nType) + return true; + + if(MouseNotifyEvent::COMMAND == nType) { const CommandEvent& rCommandEvent = *rEvent.GetCommandEvent(); if(rCommandEvent.GetCommand() == CommandEventId::Wheel) commit ec2cc68a666b573e226fce94919041538345cd9b Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Wed Sep 26 15:27:01 2018 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Thu Sep 27 08:36:31 2018 +0200 loplugin:useuniqueptr in SwReader::Read Change-Id: Iff7936e440951e65653ef42ce5a2aebd22a03029 Reviewed-on: https://gerrit.libreoffice.org/61004 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sw/source/filter/basflt/shellio.cxx b/sw/source/filter/basflt/shellio.cxx index ccfd9d69c74e..c4bd839976fa 100644 --- a/sw/source/filter/basflt/shellio.cxx +++ b/sw/source/filter/basflt/shellio.cxx @@ -150,12 +150,12 @@ ErrCode SwReader::Read( const Reader& rOptions ) mxDoc->getIDocumentRedlineAccess().SetRedlineFlags_intern( RedlineFlags::Ignore ); - SwPaM* pUndoPam = nullptr; + std::unique_ptr<SwPaM> pUndoPam; if( bDocUndo || pCursor ) { // set Pam to the previous node, so that it is not also moved const SwNodeIndex& rTmp = pPam->GetPoint()->nNode; - pUndoPam = new SwPaM( rTmp, rTmp, 0, -1 ); + pUndoPam.reset(new SwPaM( rTmp, rTmp, 0, -1 )); } // store for now all Fly's @@ -316,7 +316,7 @@ ErrCode SwReader::Read( const Reader& rOptions ) mxDoc->getIDocumentRedlineAccess().SetRedlineFlags_intern( RedlineFlags::Ignore ); } - delete pUndoPam; + pUndoPam.reset(); pPam = pPam->GetNext(); if( pPam == pEnd ) commit 07e5c4381ac405b4379767f9735152b8f0314faa Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Wed Sep 26 14:08:43 2018 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Thu Sep 27 08:36:19 2018 +0200 loplugin:useuniqueptr in SwObjPosOscillationControl Point is a small object, no need to store separately on the heap Change-Id: Id8fb1829b711831860ad1d7709fb4bf71ae8ff09 Reviewed-on: https://gerrit.libreoffice.org/61002 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sw/source/core/layout/anchoreddrawobject.cxx b/sw/source/core/layout/anchoreddrawobject.cxx index 0a4292638342..88f9969a422f 100644 --- a/sw/source/core/layout/anchoreddrawobject.cxx +++ b/sw/source/core/layout/anchoreddrawobject.cxx @@ -137,11 +137,10 @@ class SwObjPosOscillationControl private: const SwAnchoredDrawObject* mpAnchoredDrawObj; - std::vector<Point*> maObjPositions; + std::vector<Point> maObjPositions; public: explicit SwObjPosOscillationControl( const SwAnchoredDrawObject& _rAnchoredDrawObj ); - ~SwObjPosOscillationControl(); bool OscillationDetected(); }; @@ -152,17 +151,6 @@ SwObjPosOscillationControl::SwObjPosOscillationControl( { } -SwObjPosOscillationControl::~SwObjPosOscillationControl() -{ - while ( !maObjPositions.empty() ) - { - Point* pPos = maObjPositions.back(); - delete pPos; - - maObjPositions.pop_back(); - } -} - bool SwObjPosOscillationControl::OscillationDetected() { bool bOscillationDetected = false; @@ -174,22 +162,19 @@ bool SwObjPosOscillationControl::OscillationDetected() } else { - Point* pNewObjPos = new Point( mpAnchoredDrawObj->GetObjRect().Pos() ); - for ( std::vector<Point*>::iterator aObjPosIter = maObjPositions.begin(); - aObjPosIter != maObjPositions.end(); - ++aObjPosIter ) + Point aNewObjPos = mpAnchoredDrawObj->GetObjRect().Pos(); + for ( auto const & pt : maObjPositions ) { - if ( *pNewObjPos == *(*aObjPosIter) ) + if ( aNewObjPos == pt ) { // position already occurred -> oscillation bOscillationDetected = true; - delete pNewObjPos; break; } } if ( !bOscillationDetected ) { - maObjPositions.push_back( pNewObjPos ); + maObjPositions.push_back( aNewObjPos ); } } diff --git a/sw/source/core/layout/flycnt.cxx b/sw/source/core/layout/flycnt.cxx index 5d9f1ba2fce5..0b0de1ed1076 100644 --- a/sw/source/core/layout/flycnt.cxx +++ b/sw/source/core/layout/flycnt.cxx @@ -210,7 +210,7 @@ class SwOszControl static const SwFlyFrame *pStack5; const SwFlyFrame *pFly; - std::vector<Point*> maObjPositions; + std::vector<Point> maObjPositions; public: explicit SwOszControl( const SwFlyFrame *pFrame ); @@ -253,13 +253,7 @@ SwOszControl::~SwOszControl() else if ( SwOszControl::pStack5 == pFly ) SwOszControl::pStack5 = nullptr; // #i3317# - while ( !maObjPositions.empty() ) - { - Point* pPos = maObjPositions.back(); - delete pPos; - - maObjPositions.pop_back(); - } + maObjPositions.clear(); } bool SwOszControl::IsInProgress( const SwFlyFrame *pFly ) @@ -288,22 +282,19 @@ bool SwOszControl::ChkOsz() } else { - Point* pNewObjPos = new Point( pFly->GetObjRect().Pos() ); - for ( std::vector<Point*>::iterator aObjPosIter = maObjPositions.begin(); - aObjPosIter != maObjPositions.end(); - ++aObjPosIter ) + Point aNewObjPos = pFly->GetObjRect().Pos(); + for ( auto const & pt : maObjPositions ) { - if ( *pNewObjPos == *(*aObjPosIter) ) + if ( aNewObjPos == pt ) { // position already occurred -> oscillation bOscillationDetected = true; - delete pNewObjPos; break; } } if ( !bOscillationDetected ) { - maObjPositions.push_back( pNewObjPos ); + maObjPositions.push_back( aNewObjPos ); } } commit 10f2196266dd3bb0fe6c8da0c5967f80815e9492 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Wed Sep 26 13:41:05 2018 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Thu Sep 27 08:34:38 2018 +0200 loplugin:useuniqueptr in ScTable::FillAuto Change-Id: Ia75a0dc9aa567b00517c066a65e4a0d1536fa9bd Reviewed-on: https://gerrit.libreoffice.org/60999 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sc/source/core/data/table4.cxx b/sc/source/core/data/table4.cxx index 61a818000980..a565ab8433a0 100644 --- a/sc/source/core/data/table4.cxx +++ b/sc/source/core/data/table4.cxx @@ -611,7 +611,7 @@ void ScTable::FillAuto( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, const ScPatternAttr* pSrcPattern = nullptr; const ScStyleSheet* pStyleSheet = nullptr; SCCOLROW nAtSrc = nISrcStart; - ScPatternAttr* pNewPattern = nullptr; + std::unique_ptr<ScPatternAttr> pNewPattern; bool bGetPattern = true; rInner = nIStart; while (true) // #i53728# with "for (;;)" old solaris/x86 compiler mis-optimizes @@ -620,7 +620,6 @@ void ScTable::FillAuto( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, { if ( bGetPattern ) { - delete pNewPattern; if (bVertical) // rInner&:=nRow, rOuter&:=nCol pSrcPattern = aCol[nCol].GetPattern(static_cast<SCROW>(nAtSrc)); else // rInner&:=nCol, rOuter&:=nRow @@ -632,13 +631,13 @@ void ScTable::FillAuto( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, if ( rSet.GetItemState(ATTR_MERGE, false) == SfxItemState::SET || rSet.GetItemState(ATTR_MERGE_FLAG, false) == SfxItemState::SET ) { - pNewPattern = new ScPatternAttr( *pSrcPattern ); + pNewPattern.reset( new ScPatternAttr( *pSrcPattern )); SfxItemSet& rNewSet = pNewPattern->GetItemSet(); rNewSet.ClearItem(ATTR_MERGE); rNewSet.ClearItem(ATTR_MERGE_FLAG); } else - pNewPattern = nullptr; + pNewPattern.reset(); } const ScCondFormatItem& rCondFormatItem = pSrcPattern->GetItem(ATTR_CONDITIONAL); @@ -728,7 +727,7 @@ void ScTable::FillAuto( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, if (rInner == nIEnd) break; if (bPositive) ++rInner; else --rInner; } - delete pNewPattern; + pNewPattern.reset(); // Analyse commit 2d34c3c421cf8b43fd6601ca688e882f6d493bfc Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Wed Sep 26 13:15:24 2018 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Thu Sep 27 08:34:26 2018 +0200 loplugin:useuniqueptr in Chart2PositionMap Change-Id: I6db63c66da67fa9133333b4d0cda2b2978140e77 Reviewed-on: https://gerrit.libreoffice.org/60998 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sc/source/ui/unoobj/chart2uno.cxx b/sc/source/ui/unoobj/chart2uno.cxx index 74d79e7d7e04..79ec21b2596d 100644 --- a/sc/source/ui/unoobj/chart2uno.cxx +++ b/sc/source/ui/unoobj/chart2uno.cxx @@ -143,7 +143,7 @@ struct TokenTable { SCROW mnRowCount; SCCOL mnColCount; - vector<FormulaToken*> maTokens; + vector<std::unique_ptr<FormulaToken>> maTokens; // noncopyable TokenTable(const TokenTable&) = delete; @@ -163,12 +163,13 @@ struct TokenTable } void clear() { - std::for_each(maTokens.begin(), maTokens.end(), std::default_delete<FormulaToken>()); + for (auto & rToken : maTokens) + rToken.reset(); } - void push_back( FormulaToken* pToken ) + void push_back( std::unique_ptr<FormulaToken> pToken ) { - maTokens.push_back( pToken ); + maTokens.push_back( std::move(pToken) ); OSL_ENSURE( maTokens.size()<= static_cast<sal_uInt32>( mnColCount*mnRowCount ), "too much tokens" ); } @@ -197,7 +198,7 @@ vector<ScTokenRef> TokenTable::getColRanges(SCCOL nCol) const sal_uInt32 nLast = getIndex(nCol, mnRowCount-1); for (sal_uInt32 i = getIndex(nCol, 0); i <= nLast; ++i) { - FormulaToken* p = maTokens[i]; + FormulaToken* p = maTokens[i].get(); if (!p) continue; @@ -218,7 +219,7 @@ vector<ScTokenRef> TokenTable::getRowRanges(SCROW nRow) const sal_uInt32 nLast = getIndex(mnColCount-1, nRow); for (sal_uInt32 i = getIndex(0, nRow); i <= nLast; i += mnRowCount) { - FormulaToken* p = maTokens[i]; + FormulaToken* p = maTokens[i].get(); if (!p) continue; @@ -234,7 +235,7 @@ vector<ScTokenRef> TokenTable::getAllRanges() const sal_uInt32 nStop = mnColCount*mnRowCount; for (sal_uInt32 i = 0; i < nStop; i++) { - FormulaToken* p = maTokens[i]; + FormulaToken* p = maTokens[i].get(); if (!p) continue; @@ -244,8 +245,8 @@ vector<ScTokenRef> TokenTable::getAllRanges() const return aTokens; } -typedef std::map<SCROW, FormulaToken*> FormulaTokenMap; -typedef std::map<sal_uInt32, FormulaTokenMap*> FormulaTokenMapMap; +typedef std::map<SCROW, std::unique_ptr<FormulaToken>> FormulaTokenMap; +typedef std::map<sal_uInt32, FormulaTokenMap> FormulaTokenMapMap; class Chart2PositionMap { @@ -305,7 +306,7 @@ Chart2PositionMap::Chart2PositionMap(SCCOL nAllColCount, SCROW nAllRowCount, bool bFoundValuesInCol = false; bool bFoundAnythingInCol = false; SCROW nRow = 0; - for (auto it2 = rCol.second->begin(); it2 != rCol.second->end(); ++it2, ++nRow) + for (auto it2 = rCol.second.begin(); it2 != rCol.second.end(); ++it2, ++nRow) { const auto& rCell = *it2; @@ -365,33 +366,33 @@ Chart2PositionMap::Chart2PositionMap(SCCOL nAllColCount, SCROW nAllRowCount, maRowHeaders.init(nHeaderColCount,mnDataRowCount); maData.init(mnDataColCount,mnDataRowCount); - FormulaTokenMapMap::const_iterator it1 = rCols.begin(); + FormulaTokenMapMap::iterator it1 = rCols.begin(); for (SCCOL nCol = 0; nCol < nAllColCount; ++nCol) { if (it1 != rCols.end()) { - FormulaTokenMap* pCol = it1->second; - FormulaTokenMap::const_iterator it2 = pCol->begin(); + FormulaTokenMap& rCol = it1->second; + FormulaTokenMap::iterator it2 = rCol.begin(); for (SCROW nRow = 0; nRow < nAllRowCount; ++nRow) { - FormulaToken* pToken = nullptr; - if (it2 != pCol->end()) + std::unique_ptr<FormulaToken> pToken; + if (it2 != rCol.end()) { - pToken = it2->second; + pToken = std::move(it2->second); ++it2; } if( nCol < nHeaderColCount ) { if( nRow < nHeaderRowCount ) - maLeftUpperCorner.push_back(pToken); + maLeftUpperCorner.push_back(std::move(pToken)); else - maRowHeaders.push_back(pToken); + maRowHeaders.push_back(std::move(pToken)); } else if( nRow < nHeaderRowCount ) - maColHeaders.push_back(pToken); + maColHeaders.push_back(std::move(pToken)); else - maData.push_back(pToken); + maData.push_back(std::move(pToken)); } ++it1; } @@ -718,8 +719,7 @@ void Chart2Positioner::createPositionMap() glueState(); bool bNoGlue = (meGlue == GLUETYPE_NONE); - unique_ptr<FormulaTokenMapMap> pCols(new FormulaTokenMapMap); - FormulaTokenMap* pCol = nullptr; + FormulaTokenMapMap aCols; SCROW nNoGlueRow = 0; for (vector<ScTokenRef>::const_iterator itr = mrRefTokens.begin(), itrEnd = mrRefTokens.end(); itr != itrEnd; ++itr) @@ -751,14 +751,7 @@ void Chart2Positioner::createPositionMap() for (SCCOL nCol = nCol1; nCol <= nCol2; ++nCol, ++nInsCol) { - FormulaTokenMapMap::const_iterator it = pCols->find(nInsCol); - if (it == pCols->end()) - { - pCol = new FormulaTokenMap; - (*pCols)[ nInsCol ] = pCol; - } - else - pCol = it->second; + FormulaTokenMap& rCol = aCols[nInsCol]; auto nInsRow = bNoGlue ? nNoGlueRow : nRow1; for (SCROW nRow = nRow1; nRow <= nRow2; ++nRow, ++nInsRow) @@ -773,12 +766,12 @@ void Chart2Positioner::createPositionMap() aCellData.SetAbsRow(nRow); aCellData.SetAbsTab(nTab); - if (pCol->find(nInsRow) == pCol->end()) + if (rCol.find(nInsRow) == rCol.end()) { if (bExternal) - (*pCol)[ nInsRow ] = new ScExternalSingleRefToken(nFileId, aTabName, aCellData); + rCol[ nInsRow ].reset(new ScExternalSingleRefToken(nFileId, aTabName, aCellData)); else - (*pCol)[ nInsRow ] = new ScSingleRefToken(aCellData); + rCol[ nInsRow ].reset(new ScSingleRefToken(aCellData)); } } } @@ -789,30 +782,30 @@ void Chart2Positioner::createPositionMap() bool bFillRowHeader = mbRowHeaders; bool bFillColumnHeader = mbColHeaders; - SCSIZE nAllColCount = static_cast<SCSIZE>(pCols->size()); + SCSIZE nAllColCount = static_cast<SCSIZE>(aCols.size()); SCSIZE nAllRowCount = 0; - if (!pCols->empty()) + if (!aCols.empty()) { - pCol = pCols->begin()->second; + FormulaTokenMap& rCol = aCols.begin()->second; if (mbDummyUpperLeft) - if (pCol->find(0) == pCol->end()) - (*pCol)[ 0 ] = nullptr; // dummy for labeling - nAllRowCount = static_cast<SCSIZE>(pCol->size()); + if (rCol.find(0) == rCol.end()) + rCol[ 0 ] = nullptr; // dummy for labeling + nAllRowCount = static_cast<SCSIZE>(rCol.size()); } if( nAllColCount!=0 && nAllRowCount!=0 ) { if (bNoGlue) { - FormulaTokenMap* pFirstCol = pCols->begin()->second; - for (FormulaTokenMap::const_iterator it1 = pFirstCol->begin(); it1 != pFirstCol->end(); ++it1) + FormulaTokenMap& rFirstCol = aCols.begin()->second; + for (FormulaTokenMap::iterator it1 = rFirstCol.begin(); it1 != rFirstCol.end(); ++it1) { SCROW nKey = it1->first; - for (FormulaTokenMapMap::const_iterator it2 = pCols->begin(); it2 != pCols->end(); ++it2) + for (FormulaTokenMapMap::iterator it2 = aCols.begin(); it2 != aCols.end(); ++it2) { - pCol = it2->second; - if (pCol->find(nKey) == pCol->end()) - (*pCol)[ nKey ] = nullptr; + FormulaTokenMap& rCol = it2->second; + if (rCol.find(nKey) == rCol.end()) + rCol[ nKey ] = nullptr; } } } @@ -820,14 +813,7 @@ void Chart2Positioner::createPositionMap() mpPositionMap.reset( new Chart2PositionMap( static_cast<SCCOL>(nAllColCount), static_cast<SCROW>(nAllRowCount), - bFillRowHeader, bFillColumnHeader, *pCols, mpDoc)); - - // Destroy all column instances. - for (FormulaTokenMapMap::const_iterator it = pCols->begin(); it != pCols->end(); ++it) - { - pCol = it->second; - delete pCol; - } + bFillRowHeader, bFillColumnHeader, aCols, mpDoc)); } /** commit d1c74bda372044154b05c1a0863808ae838b1c42 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Wed Sep 26 12:55:27 2018 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Thu Sep 27 08:31:49 2018 +0200 loplugin:useuniqueptr in ScAddInAsyncs Change-Id: I18086623378a6ffd9272b2255ea8060d301b6c43 Reviewed-on: https://gerrit.libreoffice.org/60997 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sc/source/core/data/global.cxx b/sc/source/core/data/global.cxx index 8cb867ace6bb..43bcb6c3cdb9 100644 --- a/sc/source/core/data/global.cxx +++ b/sc/source/core/data/global.cxx @@ -543,10 +543,6 @@ void ScGlobal::InitTextHeight(const SfxItemPool* pPool) void ScGlobal::Clear() { // Destroy asyncs _before_ ExitExternalFunc! - for( ScAddInAsyncs::iterator it = theAddInAsyncTbl.begin(); it != theAddInAsyncTbl.end(); ++it ) - { - delete *it; - } theAddInAsyncTbl.clear(); ExitExternalFunc(); ClearAutoFormat(); diff --git a/sc/source/core/inc/adiasync.hxx b/sc/source/core/inc/adiasync.hxx index 50e3924479a1..bc0a22ee3315 100644 --- a/sc/source/core/inc/adiasync.hxx +++ b/sc/source/core/inc/adiasync.hxx @@ -69,9 +69,9 @@ public: struct CompareScAddInAsync { - bool operator()( ScAddInAsync* const& lhs, ScAddInAsync* const& rhs ) const { return (*lhs)<(*rhs); } + bool operator()( std::unique_ptr<ScAddInAsync> const& lhs, std::unique_ptr<ScAddInAsync> const& rhs ) const { return (*lhs)<(*rhs); } }; -using ScAddInAsyncs = std::set<ScAddInAsync*, CompareScAddInAsync>; +using ScAddInAsyncs = std::set<std::unique_ptr<ScAddInAsync>, CompareScAddInAsync>; extern ScAddInAsyncs theAddInAsyncTbl; // in adiasync.cxx diff --git a/sc/source/core/tool/adiasync.cxx b/sc/source/core/tool/adiasync.cxx index e7070603c8c2..9a0770b7addb 100644 --- a/sc/source/core/tool/adiasync.cxx +++ b/sc/source/core/tool/adiasync.cxx @@ -50,7 +50,7 @@ ScAddInAsync::ScAddInAsync(sal_uLong nHandleP, LegacyFuncData* pFuncData, ScDocu { pDocs.reset(new ScAddInDocs); pDocs->insert( pDoc ); - theAddInAsyncTbl.insert( this ); + theAddInAsyncTbl.emplace( this ); } ScAddInAsync::~ScAddInAsync() @@ -65,26 +65,29 @@ ScAddInAsync::~ScAddInAsync() ScAddInAsync* ScAddInAsync::Get( sal_uLong nHandleP ) { ScAddInAsync* pRet = nullptr; - ScAddInAsyncs::iterator it = std::find_if( + auto it = std::find_if( theAddInAsyncTbl.begin(), theAddInAsyncTbl.end(), - [nHandleP](ScAddInAsync const * el) + [nHandleP](std::unique_ptr<ScAddInAsync> const & el) { return el->nHandle == nHandleP; }); if ( it != theAddInAsyncTbl.end() ) - pRet = *it; + pRet = it->get(); return pRet; } void ScAddInAsync::CallBack( sal_uLong nHandleP, void* pData ) { - ScAddInAsync* p; - if ( (p = Get( nHandleP )) == nullptr ) + auto asyncIt = std::find_if( + theAddInAsyncTbl.begin(), theAddInAsyncTbl.end(), + [nHandleP](std::unique_ptr<ScAddInAsync> const & el) + { return el->nHandle == nHandleP; }); + if ( asyncIt == theAddInAsyncTbl.end() ) return; + ScAddInAsync* p = asyncIt->get(); if ( !p->HasListeners() ) { // not in dTor because of theAddInAsyncTbl.DeleteAndDestroy in ScGlobal::Clear - theAddInAsyncTbl.erase( p ); - delete p; + theAddInAsyncTbl.erase( asyncIt ); return ; } switch ( p->meType ) @@ -122,7 +125,7 @@ void ScAddInAsync::RemoveDocument( ScDocument* pDocumentP ) { for( ScAddInAsyncs::reverse_iterator iter1 = theAddInAsyncTbl.rbegin(); iter1 != theAddInAsyncTbl.rend(); ++iter1 ) { // backwards because of pointer-movement in array - ScAddInAsync* pAsync = *iter1; + ScAddInAsync* pAsync = iter1->get(); ScAddInDocs* p = pAsync->pDocs.get(); ScAddInDocs::iterator iter2 = p->find( pDocumentP ); if( iter2 != p->end() ) @@ -131,7 +134,6 @@ void ScAddInAsync::RemoveDocument( ScDocument* pDocumentP ) if ( p->empty() ) { // this AddIn is not used anymore theAddInAsyncTbl.erase( --(iter1.base()) ); - delete pAsync; } } } commit 175834ce6a3ba707a6d34aa8de7351574381f481 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Wed Sep 26 13:52:39 2018 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Thu Sep 27 08:30:01 2018 +0200 loplugin:constfields in toolkit Change-Id: I26254acc84b1bfe71e4addbde51cb6a9ed52c981 Reviewed-on: https://gerrit.libreoffice.org/60990 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/include/toolkit/controls/eventcontainer.hxx b/include/toolkit/controls/eventcontainer.hxx index 65d0418bdc27..cc1d20493e4c 100644 --- a/include/toolkit/controls/eventcontainer.hxx +++ b/include/toolkit/controls/eventcontainer.hxx @@ -38,7 +38,7 @@ class ScriptEventContainer : public ::cppu::WeakImplHelper< { std::unordered_map< OUString, css::uno::Any> mHashMap; - css::uno::Type mType; + css::uno::Type const mType; ContainerListenerMultiplexer maContainerListeners; diff --git a/toolkit/inc/helper/msgbox.hxx b/toolkit/inc/helper/msgbox.hxx index 0fc7631d93de..f353b2ff9d57 100644 --- a/toolkit/inc/helper/msgbox.hxx +++ b/toolkit/inc/helper/msgbox.hxx @@ -50,7 +50,7 @@ class MessBox : public ButtonDialog VclPtr<FixedImage> mpFixedImage; Image maImage; bool mbHelpBtn; - MessBoxStyle mnMessBoxStyle; + MessBoxStyle const mnMessBoxStyle; protected: OUString maMessText; diff --git a/toolkit/source/awt/asynccallback.cxx b/toolkit/source/awt/asynccallback.cxx index e9cc75f5f462..c37b20930a71 100644 --- a/toolkit/source/awt/asynccallback.cxx +++ b/toolkit/source/awt/asynccallback.cxx @@ -57,7 +57,7 @@ private: xCallback( rCallback ), aData( rAny ) {} css::uno::Reference< css::awt::XCallback > xCallback; - css::uno::Any aData; + css::uno::Any const aData; }; DECL_STATIC_LINK( AsyncCallback, Notify_Impl, void*, void ); diff --git a/toolkit/source/awt/stylesettings.cxx b/toolkit/source/awt/stylesettings.cxx index 556fa8040371..22cce1247cc6 100644 --- a/toolkit/source/awt/stylesettings.cxx +++ b/toolkit/source/awt/stylesettings.cxx @@ -87,7 +87,7 @@ namespace toolkit } private: - SolarMutexGuard m_aGuard; + SolarMutexGuard const m_aGuard; }; diff --git a/toolkit/source/awt/vclxtoolkit.cxx b/toolkit/source/awt/vclxtoolkit.cxx index 5e7c9e823c39..737bdc529554 100644 --- a/toolkit/source/awt/vclxtoolkit.cxx +++ b/toolkit/source/awt/vclxtoolkit.cxx @@ -415,7 +415,7 @@ public: delete this; } - sal_Int32 m_nPauseMilliseconds; + sal_Int32 const m_nPauseMilliseconds; }; class VCLXToolkitMutexHelper @@ -439,8 +439,8 @@ class VCLXToolkit : public VCLXToolkitMutexHelper, ::comphelper::OInterfaceContainerHelper2 m_aTopWindowListeners; ::comphelper::OInterfaceContainerHelper2 m_aKeyHandlers; ::comphelper::OInterfaceContainerHelper2 m_aFocusListeners; - ::Link<VclSimpleEvent&,void> m_aEventListenerLink; - ::Link<VclWindowEvent&,bool> m_aKeyListenerLink; + ::Link<VclSimpleEvent&,void> const m_aEventListenerLink; + ::Link<VclWindowEvent&,bool> const m_aKeyListenerLink; bool m_bEventListener; bool m_bKeyListener; @@ -801,9 +801,9 @@ WindowType ImplGetComponentType( const OUString& rServiceName ) struct MessageBoxTypeInfo { - css::awt::MessageBoxType eType; + css::awt::MessageBoxType const eType; const sal_Char *pName; - sal_Int32 nLen; + sal_Int32 const nLen; }; static const MessageBoxTypeInfo aMessageBoxTypeInfo[] = diff --git a/toolkit/source/awt/vclxwindow.cxx b/toolkit/source/awt/vclxwindow.cxx index 9edf3ed9086c..eb3df832c972 100644 --- a/toolkit/source/awt/vclxwindow.cxx +++ b/toolkit/source/awt/vclxwindow.cxx @@ -118,7 +118,7 @@ public: bool mbDisposing : 1; bool mbDesignMode : 1; bool mbSynthesizingVCLEvent : 1; - bool mbWithDefaultProps : 1; + bool const mbWithDefaultProps : 1; sal_uLong mnListenerLockLevel; sal_Int16 mnWritingMode; diff --git a/toolkit/source/controls/geometrycontrolmodel.cxx b/toolkit/source/controls/geometrycontrolmodel.cxx index d8f9045668fc..5fe1a2194d84 100644 --- a/toolkit/source/controls/geometrycontrolmodel.cxx +++ b/toolkit/source/controls/geometrycontrolmodel.cxx @@ -585,7 +585,7 @@ struct Int32Equal { - sal_Int32 m_nCompare; + sal_Int32 const m_nCompare; explicit Int32Equal( sal_Int32 _nCompare ) : m_nCompare( _nCompare ) { } bool operator()( sal_Int32 _nLHS ) diff --git a/toolkit/source/controls/unocontrol.cxx b/toolkit/source/controls/unocontrol.cxx index 011aa72e08df..9432f67b78ec 100644 --- a/toolkit/source/controls/unocontrol.cxx +++ b/toolkit/source/controls/unocontrol.cxx @@ -60,7 +60,7 @@ using ::com::sun::star::accessibility::XAccessible; struct LanguageDependentProp { const char* pPropName; - sal_Int32 nPropNameLength; + sal_Int32 const nPropNameLength; }; static const LanguageDependentProp aLanguageDependentProp[] = diff --git a/toolkit/source/controls/unocontrolcontainer.cxx b/toolkit/source/controls/unocontrolcontainer.cxx index b704b0dd01cb..7311a184ed48 100644 --- a/toolkit/source/controls/unocontrolcontainer.cxx +++ b/toolkit/source/controls/unocontrolcontainer.cxx @@ -48,7 +48,7 @@ using namespace ::com::sun::star; struct UnoControlHolder { uno::Reference< awt::XControl > mxControl; - OUString msName; + OUString const msName; public: UnoControlHolder( const OUString& rName, const uno::Reference< awt::XControl > & rControl ) diff --git a/toolkit/source/helper/vclunohelper.cxx b/toolkit/source/helper/vclunohelper.cxx index 904e520fd0ea..d7dfe76e162e 100644 --- a/toolkit/source/helper/vclunohelper.cxx +++ b/toolkit/source/helper/vclunohelper.cxx @@ -360,9 +360,9 @@ namespace { static struct _unit_table { - FieldUnit eFieldUnit; - sal_Int16 nMeasurementUnit; - sal_Int16 nFieldToMeasureFactor; + FieldUnit const eFieldUnit; + sal_Int16 const nMeasurementUnit; + sal_Int16 const nFieldToMeasureFactor; } aUnits[] = { { FUNIT_NONE, -1 , -1}, { FUNIT_MM, MeasureUnit::MM, 1 }, // must precede MM_10TH commit 833c4965fc0941ea997852e3d99dcd7688e58c14 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Wed Sep 26 13:40:27 2018 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Thu Sep 27 08:29:49 2018 +0200 loplugin:constfields in tools Change-Id: I83499cfb49f7abdbf0629c60167d09a1352571ee Reviewed-on: https://gerrit.libreoffice.org/60987 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/include/tools/multisel.hxx b/include/tools/multisel.hxx index 3e06a3dce239..feb96abd2760 100644 --- a/include/tools/multisel.hxx +++ b/include/tools/multisel.hxx @@ -77,16 +77,16 @@ class SAL_WARN_UNUSED TOOLS_DLLPUBLIC StringRangeEnumerator { struct Range { - sal_Int32 nFirst; - sal_Int32 nLast; + sal_Int32 const nFirst; + sal_Int32 const nLast; Range( sal_Int32 i_nFirst, sal_Int32 i_nLast ) : nFirst( i_nFirst ), nLast( i_nLast ) {} }; std::vector< StringRangeEnumerator::Range > maSequence; sal_Int32 mnCount; - sal_Int32 mnMin; - sal_Int32 mnMax; - sal_Int32 mnOffset; + sal_Int32 const mnMin; + sal_Int32 const mnMax; + sal_Int32 const mnOffset; bool mbValidInput; bool setRange( const OUString& i_rNewRange ); diff --git a/include/tools/stream.hxx b/include/tools/stream.hxx index ce6db9ac4217..86a29f8093ff 100644 --- a/include/tools/stream.hxx +++ b/include/tools/stream.hxx @@ -100,7 +100,7 @@ enum SvLockBytesStatFlag { SVSTATFLAG_DEFAULT }; class TOOLS_DLLPUBLIC SvLockBytes: public virtual SvRefBase { SvStream * m_pStream; - bool m_bOwner; + bool const m_bOwner; bool m_bSync; protected: diff --git a/include/tools/vcompat.hxx b/include/tools/vcompat.hxx index 85e3b1d44240..ba4692f663e2 100644 --- a/include/tools/vcompat.hxx +++ b/include/tools/vcompat.hxx @@ -38,7 +38,7 @@ class TOOLS_DLLPUBLIC VersionCompat SvStream* mpRWStm; sal_uInt32 mnCompatPos; sal_uInt32 mnTotalSize; - StreamMode mnStmMode; + StreamMode const mnStmMode; sal_uInt16 mnVersion; VersionCompat( const VersionCompat& ) = delete; diff --git a/include/tools/zcodec.hxx b/include/tools/zcodec.hxx index 57af7c50c2a1..9f26d263adba 100644 --- a/include/tools/zcodec.hxx +++ b/include/tools/zcodec.hxx @@ -40,11 +40,11 @@ class SAL_WARN_UNUSED TOOLS_DLLPUBLIC ZCodec bool mbStatus; bool mbFinish; sal_uInt8* mpInBuf; - size_t mnInBufSize; + size_t const mnInBufSize; size_t mnInToRead; SvStream* mpOStm; sal_uInt8* mpOutBuf; - size_t mnOutBufSize; + size_t const mnOutBufSize; sal_uInt32 mnCRC; int mnCompressLevel; diff --git a/tools/source/fsys/urlobj.cxx b/tools/source/fsys/urlobj.cxx index f024fec558bf..6a53e29d9d03 100644 --- a/tools/source/fsys/urlobj.cxx +++ b/tools/source/fsys/urlobj.cxx @@ -290,14 +290,14 @@ struct INetURLObject::SchemeInfo { sal_Char const * m_pScheme; sal_Char const * m_pPrefix; - bool m_bAuthority; - bool m_bUser; - bool m_bAuth; - bool m_bPassword; - bool m_bHost; - bool m_bPort; - bool m_bHierarchical; - bool m_bQuery; + bool const m_bAuthority; + bool const m_bUser; + bool const m_bAuth; + bool const m_bPassword; + bool const m_bHost; + bool const m_bPort; + bool const m_bHierarchical; + bool const m_bQuery; }; struct INetURLObject::PrefixInfo @@ -306,8 +306,8 @@ struct INetURLObject::PrefixInfo sal_Char const * m_pPrefix; sal_Char const * m_pTranslatedPrefix; - INetProtocol m_eScheme; - Kind m_eKind; + INetProtocol const m_eScheme; + Kind const m_eKind; }; // static diff --git a/tools/source/inet/inetmime.cxx b/tools/source/inet/inetmime.cxx index 1f8cb5196d3e..d2f2f4baec6a 100644 --- a/tools/source/inet/inetmime.cxx +++ b/tools/source/inet/inetmime.cxx @@ -309,12 +309,12 @@ void appendISO88591(OUStringBuffer & rText, sal_Char const * pBegin, struct Parameter { - OString m_aAttribute; - OString m_aCharset; - OString m_aLanguage; - OString m_aValue; - sal_uInt32 m_nSection; - bool m_bExtended; + OString const m_aAttribute; + OString const m_aCharset; + OString const m_aLanguage; + OString const m_aValue; + sal_uInt32 const m_nSection; + bool const m_bExtended; bool operator<(const Parameter& rhs) const // is used by std::list<Parameter>::sort { @@ -800,7 +800,7 @@ bool equalIgnoreCase(const sal_Char * pBegin1, struct EncodingEntry { sal_Char const * m_aName; - rtl_TextEncoding m_eEncoding; + rtl_TextEncoding const m_eEncoding; }; // The source for the following table is <ftp://ftp.iana.org/in-notes/iana/ diff --git a/tools/source/reversemap/bestreversemap.cxx b/tools/source/reversemap/bestreversemap.cxx index 63fbd2b1cb90..90679654cbbe 100644 --- a/tools/source/reversemap/bestreversemap.cxx +++ b/tools/source/reversemap/bestreversemap.cxx @@ -15,7 +15,7 @@ struct Encoder { - rtl_UnicodeToTextConverter m_aConverter; + rtl_UnicodeToTextConverter const m_aConverter; bool m_bCapable; const char *m_pEncoding; Encoder(rtl_TextEncoding nEncoding, const char *pEncoding) diff --git a/tools/source/xml/XmlWriter.cxx b/tools/source/xml/XmlWriter.cxx index 8895e92064db..58c4a26f2cb5 100644 --- a/tools/source/xml/XmlWriter.cxx +++ b/tools/source/xml/XmlWriter.cxx @@ -39,7 +39,7 @@ struct XmlWriterImpl { } - SvStream* mpStream; + SvStream* const mpStream; xmlTextWriterPtr mpWriter; }; commit 64035391ebe8810520a214a3ae0aeb4c1b039819 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Wed Sep 26 10:47:52 2018 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Thu Sep 27 08:29:41 2018 +0200 loplugin:constfields in ucbhelper Change-Id: Ic9d59b352dcb771191de963c0f6e90c74647c8b8 Reviewed-on: https://gerrit.libreoffice.org/60983 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/UnoControls/source/inc/OConnectionPointHelper.hxx b/UnoControls/source/inc/OConnectionPointHelper.hxx index cf87833b29ca..51143fc4c681 100644 --- a/UnoControls/source/inc/OConnectionPointHelper.hxx +++ b/UnoControls/source/inc/OConnectionPointHelper.hxx @@ -100,7 +100,7 @@ private: css::uno::WeakReference< css::lang::XConnectionPointContainer > m_oContainerWeakReference; // Reference to container-class!. Don't use Reference<...> // It is a ring-reference => and must be a wekreference! OConnectionPointContainerHelper* m_pContainerImplementation; - css::uno::Type m_aInterfaceType; + css::uno::Type const m_aInterfaceType; css::uno::Reference< css::uno::XInterface > m_xLock; }; diff --git a/include/ucbhelper/interactionrequest.hxx b/include/ucbhelper/interactionrequest.hxx index 4ee4e93715f8..74df7f1f6c87 100644 --- a/include/ucbhelper/interactionrequest.hxx +++ b/include/ucbhelper/interactionrequest.hxx @@ -307,22 +307,22 @@ class UCBHELPER_DLLPUBLIC InteractionSupplyAuthentication : public css::lang::XTypeProvider, public css::ucb::XInteractionSupplyAuthentication2 { - css::uno::Sequence< css::ucb::RememberAuthentication > + css::uno::Sequence< css::ucb::RememberAuthentication > const m_aRememberPasswordModes; - css::uno::Sequence< css::ucb::RememberAuthentication > + css::uno::Sequence< css::ucb::RememberAuthentication > const m_aRememberAccountModes; OUString m_aRealm; OUString m_aUserName; OUString m_aPassword; OUString m_aAccount; css::ucb::RememberAuthentication m_eRememberPasswordMode; - css::ucb::RememberAuthentication m_eDefaultRememberPasswordMode; - css::ucb::RememberAuthentication m_eDefaultRememberAccountMode; - bool m_bCanSetRealm : 1; - bool m_bCanSetUserName : 1; - bool m_bCanSetPassword : 1; - bool m_bCanSetAccount : 1; - bool m_bCanUseSystemCredentials : 1; + css::ucb::RememberAuthentication const m_eDefaultRememberPasswordMode; + css::ucb::RememberAuthentication const m_eDefaultRememberAccountMode; + bool const m_bCanSetRealm : 1; + bool const m_bCanSetUserName : 1; + bool const m_bCanSetPassword : 1; + bool const m_bCanSetAccount : 1; + bool const m_bCanUseSystemCredentials : 1; bool m_bUseSystemCredentials : 1; public: diff --git a/include/ucbhelper/resultsethelper.hxx b/include/ucbhelper/resultsethelper.hxx index 7c9452b8407b..15c74b4235c1 100644 --- a/include/ucbhelper/resultsethelper.hxx +++ b/include/ucbhelper/resultsethelper.hxx @@ -62,7 +62,7 @@ class UCBHELPER_DLLPUBLIC ResultSetImplHelper : protected: osl::Mutex m_aMutex; - css::ucb::OpenCommandArgument2 m_aCommand; + css::ucb::OpenCommandArgument2 const m_aCommand; css::uno::Reference< css::uno::XComponentContext > m_xContext; // Resultset #1 css::uno::Reference< css::sdbc::XResultSet > m_xResultSet1; diff --git a/include/ucbhelper/resultsetmetadata.hxx b/include/ucbhelper/resultsetmetadata.hxx index 2e410a88a83a..3a11d8f99468 100644 --- a/include/ucbhelper/resultsetmetadata.hxx +++ b/include/ucbhelper/resultsetmetadata.hxx @@ -52,9 +52,6 @@ struct ResultSetColumnData /** @see ResultSetMetaData::isCaseSensitive */ bool isCaseSensitive; - /** @see ResultSetMetaData::getColumnDisplaySize */ - sal_Int32 columnDisplaySize; - inline ResultSetColumnData(); }; @@ -62,8 +59,7 @@ struct ResultSetColumnData // may heavily depend on the behaviour of the default constructor. ResultSetColumnData::ResultSetColumnData() -: isCaseSensitive( true ), - columnDisplaySize( 16 ) +: isCaseSensitive( true ) { } diff --git a/ucbhelper/source/client/proxydecider.cxx b/ucbhelper/source/client/proxydecider.cxx index 0f5bd69553b7..31e26055ffcf 100644 --- a/ucbhelper/source/client/proxydecider.cxx +++ b/ucbhelper/source/client/proxydecider.cxx @@ -66,7 +66,7 @@ namespace proxydecider_impl class WildCard { private: - OString m_aWildString; + OString const m_aWildString; public: explicit WildCard( const OUString& rWildCard ) @@ -80,18 +80,13 @@ public: typedef std::pair< WildCard, WildCard > NoProxyListEntry; - class HostnameCache { typedef std::pair< OUString, OUString > HostListEntry; std::deque< HostListEntry > m_aHostList; - sal_uInt32 m_nCapacity; public: - explicit HostnameCache() - : m_nCapacity( 256 ) {} - bool get( const OUString & rKey, OUString & rValue ) const { for (auto const& host : m_aHostList) @@ -107,8 +102,10 @@ public: void put( const OUString & rKey, const OUString & rValue ) { - if ( m_aHostList.size() == m_nCapacity ) - m_aHostList.resize( m_nCapacity / 2 ); + static constexpr sal_uInt32 nCapacity = 256; + + if ( m_aHostList.size() == nCapacity ) + m_aHostList.resize( nCapacity / 2 ); m_aHostList.push_front( HostListEntry( rKey, rValue ) ); } diff --git a/ucbhelper/source/provider/resultset.cxx b/ucbhelper/source/provider/resultset.cxx index c482332909c4..4ed85d478550 100644 --- a/ucbhelper/source/provider/resultset.cxx +++ b/ucbhelper/source/provider/resultset.cxx @@ -42,8 +42,8 @@ namespace ucbhelper_impl struct PropertyInfo { const char* pName; - sal_Int32 nHandle; - sal_Int16 nAttributes; + sal_Int32 const nHandle; + sal_Int16 const nAttributes; const uno::Type& (*pGetCppuType)(); }; @@ -143,7 +143,7 @@ struct ResultSet_Impl uno::Reference< css::ucb::XCommandEnvironment > m_xEnv; uno::Reference< beans::XPropertySetInfo > m_xPropSetInfo; uno::Reference< sdbc::XResultSetMetaData > m_xMetaData; - uno::Sequence< beans::Property > m_aProperties; + uno::Sequence< beans::Property > const m_aProperties; rtl::Reference< ResultSetDataSupplier > m_xDataSupplier; osl::Mutex m_aMutex; std::unique_ptr<cppu::OInterfaceContainerHelper> m_pDisposeEventListeners; diff --git a/ucbhelper/source/provider/resultsetmetadata.cxx b/ucbhelper/source/provider/resultsetmetadata.cxx index 4f99af2cae39..3666fa802f9b 100644 --- a/ucbhelper/source/provider/resultsetmetadata.cxx +++ b/ucbhelper/source/provider/resultsetmetadata.cxx @@ -198,16 +198,12 @@ sal_Bool SAL_CALL ResultSetMetaData::isSigned( sal_Int32 /*column*/ ) // virtual -sal_Int32 SAL_CALL ResultSetMetaData::getColumnDisplaySize( sal_Int32 column ) +sal_Int32 SAL_CALL ResultSetMetaData::getColumnDisplaySize( sal_Int32 /*column*/ ) { /* Gets the normal maximum width in characters for column. */ - - if ( ( column < 1 ) || ( column > m_aProps.getLength() ) ) - return 16; - - return m_pImpl->m_aColumnData[ column - 1 ].columnDisplaySize; + return 16; } commit 850c575d67162a97c1b7acd4fb75c32d0884e7b9 Author: Justin Luth <justin_l...@sil.org> AuthorDate: Wed Sep 26 17:46:33 2018 +0300 Commit: Justin Luth <justin_l...@sil.org> CommitDate: Thu Sep 27 06:37:14 2018 +0200 editeng ConvertBorderWidthToWord ensure minimum width If the border in LO has a width, then make sure that the converted width is non-zero. The specific fix intended is for the "Horizontal Line" paragraph style (double, width =1) to export to .doc format and retain the bottom border. Change-Id: I65392b2312360d51c290030ceb415155e6139302 Reviewed-on: https://gerrit.libreoffice.org/61006 Tested-by: Jenkins Reviewed-by: Justin Luth <justin_l...@sil.org> diff --git a/editeng/source/items/borderline.cxx b/editeng/source/items/borderline.cxx index 5c9042f307fe..33cd0ca6de31 100644 --- a/editeng/source/items/borderline.cxx +++ b/editeng/source/items/borderline.cxx @@ -250,6 +250,9 @@ ConvertBorderWidthFromWord(SvxBorderLineStyle const eStyle, double const i_fWidt double ConvertBorderWidthToWord(SvxBorderLineStyle const eStyle, double const fWidth) { + if ( !fWidth ) + return 0; + switch (eStyle) { // Single lines @@ -264,31 +267,31 @@ ConvertBorderWidthToWord(SvxBorderLineStyle const eStyle, double const fWidth) // Double lines case SvxBorderLineStyle::DOUBLE: case SvxBorderLineStyle::DOUBLE_THIN: - return fWidth / 3.0; + return std::max(1.0, fWidth / 3.0); case SvxBorderLineStyle::THINTHICK_MEDIUMGAP: case SvxBorderLineStyle::THICKTHIN_MEDIUMGAP: case SvxBorderLineStyle::EMBOSSED: case SvxBorderLineStyle::ENGRAVED: - return fWidth / 2.0; + return std::max(1.0, fWidth / 2.0); case SvxBorderLineStyle::THINTHICK_SMALLGAP: - return fWidth - THINTHICK_SMALLGAP_line2 - THINTHICK_SMALLGAP_gap; + return std::max(1.0, fWidth - THINTHICK_SMALLGAP_line2 - THINTHICK_SMALLGAP_gap); case SvxBorderLineStyle::THINTHICK_LARGEGAP: - return fWidth - THINTHICK_LARGEGAP_line1 - THINTHICK_LARGEGAP_line2; ... etc. - the rest is truncated _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits