Here are revised patches as per Eike's comments. They fix fdo#40701, which is a crasher, a regression and a "most annoying 3.4 bug".
*0001-fdo-40701-* fixes the root cause of the bug, which caused void DbGridControl::EnableHandle(sal_Bool bEnable) { RemoveColumn(0); m_bHandle = bEnable; InsertHandleColumn(); } to misfunction: RemoveColumn(0) silently did not remove the column, so the call to InsertHandleColumn() added a second Handle Column, which confused the code in other places. There are two versions of it: * The one suggested by Eike * The one preferred by me Either one will fix fdo#40701, but I consider mine more robust, and it corresponds to what I did in master. See previous message(s) in this thread for details on that. 0002-FmXGridPeer-getByIndex-Error-checking-of-pGrid-GetMo.patch fixes the reason the bug was a crasher instead of just "broken feature, nothing happens when "Find Record" button is clicked". Although patch 0001 removes the known way of triggering the crash, I'd find it still find it relevant to apply the "don't crash" protection in 0002. -- Lionel
>From 22ad763cb67766c1f97b0d843dc5fe054022f70d Mon Sep 17 00:00:00 2001 From: Lionel Elie Mamane <lio...@mamane.lu> Date: Mon, 12 Sep 2011 00:00:33 +0200 Subject: [PATCH] fdo#40701: DbGridControl::RemoveColumn even if no corresponding Model column That case crops up when nId==0 i.e. the Handle column --- svx/source/fmcomp/gridctrl.cxx | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/svx/source/fmcomp/gridctrl.cxx b/svx/source/fmcomp/gridctrl.cxx index bb666bc..eaf6a31 100644 --- a/svx/source/fmcomp/gridctrl.cxx +++ b/svx/source/fmcomp/gridctrl.cxx @@ -1722,12 +1722,12 @@ sal_uInt16 DbGridControl::AppendColumn(const XubString& rName, sal_uInt16 nWidth //------------------------------------------------------------------------------ void DbGridControl::RemoveColumn(sal_uInt16 nId) { + DbGridControl_Base::RemoveColumn(nId); + sal_uInt16 nIndex = GetModelColumnPos(nId); if (nIndex == GRID_COLUMN_NOT_FOUND) return; - DbGridControl_Base::RemoveColumn(nId); - delete m_aColumns[ nIndex ]; DbGridColumns::iterator it = m_aColumns.begin(); ::std::advance( it, nIndex ); -- 1.7.2.5
>From 6b8724640fdd5a08f028978d04532f5e9059cb6e Mon Sep 17 00:00:00 2001 From: Lionel Elie Mamane <lio...@mamane.lu> Date: Mon, 12 Sep 2011 00:00:33 +0200 Subject: [PATCH 1/2] fdo#40701: DbGridControl::RemoveColumn on handle column The handle column (nId == 0) is not a Model column (not in m_aColumns), but it should still be deleted from base class (from the view columns). --- svx/source/fmcomp/gridctrl.cxx | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/svx/source/fmcomp/gridctrl.cxx b/svx/source/fmcomp/gridctrl.cxx index bb666bc..c425029 100644 --- a/svx/source/fmcomp/gridctrl.cxx +++ b/svx/source/fmcomp/gridctrl.cxx @@ -1723,11 +1723,13 @@ sal_uInt16 DbGridControl::AppendColumn(const XubString& rName, sal_uInt16 nWidth void DbGridControl::RemoveColumn(sal_uInt16 nId) { sal_uInt16 nIndex = GetModelColumnPos(nId); + + if (nIndex != GRID_COLUMN_NOT_FOUND || nId == 0) + DbGridControl_Base::RemoveColumn(nId); + if (nIndex == GRID_COLUMN_NOT_FOUND) return; - DbGridControl_Base::RemoveColumn(nId); - delete m_aColumns[ nIndex ]; DbGridColumns::iterator it = m_aColumns.begin(); ::std::advance( it, nIndex ); -- 1.7.2.5
>From 43de7ca913a071a231cf6ca34ef3a609de498808 Mon Sep 17 00:00:00 2001 From: Lionel Elie Mamane <lio...@mamane.lu> Date: Sun, 11 Sep 2011 23:40:09 +0200 Subject: [PATCH 2/2] FmXGridPeer::getByIndex: Error checking of pGrid->GetModelColumnPos(nId) call Fixes crash of fdo#40701, but not broken feature --- svx/source/fmcomp/fmgridif.cxx | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/svx/source/fmcomp/fmgridif.cxx b/svx/source/fmcomp/fmgridif.cxx index 3080d77..a4146a9 100644 --- a/svx/source/fmcomp/fmgridif.cxx +++ b/svx/source/fmcomp/fmgridif.cxx @@ -2442,6 +2442,9 @@ Any FmXGridPeer::getByIndex(sal_Int32 _nIndex) throw( IndexOutOfBoundsException, // get the list position sal_uInt16 nPos = pGrid->GetModelColumnPos(nId); + if ( nPos == GRID_COLUMN_NOT_FOUND ) + return aElement; + DbGridColumn* pCol = pGrid->GetColumns().at( nPos ); Reference< ::com::sun::star::awt::XControl > xControl(pCol->GetCell()); aElement <<= xControl; -- 1.7.2.5
_______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice