summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2015-04-10 15:06:53 +0200
committerDavid Tardon <dtardon@redhat.com>2015-04-10 14:03:56 +0000
commita030c381b25fb933ddb4d476ff3803c6645eb89d (patch)
tree2b5c6f57060647471e0fd772482f7036c3e58537
parentResolves: tdf#87548 don't create a new list for each multiselection portion (diff)
downloadcore-a030c381b25fb933ddb4d476ff3803c6645eb89d.tar.gz
core-a030c381b25fb933ddb4d476ff3803c6645eb89d.zip
rhbz#1197614: Fix calculation of m_bHasActive when removing active element
Assume m_vEntries.size() == 2; assume first element (nPos == 0) is m_bActive, gets removed, so m_nActive would have stayed at 0 and m_bHasActive at true; then assume second element (again nPos == 0, due to the removed element) is m_bNew, so nPos <= m_nActive is true and m_nActive gets updated to 1 (and m_bHasActive remains true); then selectEntry(nNewPos) (nNewPos == 0) would have tried to reset m_vEntries[1]->m_bActive but now m_vEntries.size() == 1. Change-Id: I31d3bbe97ca99f880aa99bdea015f7c0457f8331 (cherry picked from commit 97d4c1a8100c63091401736c93d6bbbb371d5b37) Reviewed-on: https://gerrit.libreoffice.org/15231 Tested-by: David Tardon <dtardon@redhat.com> Reviewed-by: David Tardon <dtardon@redhat.com>
-rw-r--r--desktop/source/deployment/gui/dp_gui_extlistbox.cxx21
1 files changed, 14 insertions, 7 deletions
diff --git a/desktop/source/deployment/gui/dp_gui_extlistbox.cxx b/desktop/source/deployment/gui/dp_gui_extlistbox.cxx
index ab5e0494289f..3b50aaff978d 100644
--- a/desktop/source/deployment/gui/dp_gui_extlistbox.cxx
+++ b/desktop/source/deployment/gui/dp_gui_extlistbox.cxx
@@ -1041,7 +1041,6 @@ long ExtensionBox_Impl::addEntry( const uno::Reference< deployment::XPackage > &
//access to m_nActive must be guarded
if ( !m_bInCheckMode && m_bHasActive && ( m_nActive >= nPos ) )
m_nActive += 1;
-
guard.clear();
if ( IsReallyVisible() )
@@ -1178,6 +1177,7 @@ void ExtensionBox_Impl::prepareChecking()
void ExtensionBox_Impl::checkEntries()
{
long nNewPos = -1;
+ long nChangedActivePos = -1;
long nPos = 0;
bool bNeedsUpdate = false;
@@ -1201,15 +1201,19 @@ void ExtensionBox_Impl::checkEntries()
}
else
{ // remove entry from list
+ if (nPos < nNewPos) {
+ --nNewPos;
+ }
+ if (nPos < nChangedActivePos) {
+ --nChangedActivePos;
+ }
if ( nPos < m_nActive )
m_nActive -= 1;
- else if ( ( nPos == m_nActive ) && ( nPos == (long) m_vEntries.size() - 1 ) )
+ else if ( nPos == m_nActive )
{
- m_nActive -= 1;
- if (m_nActive == -1)
- {
- m_bHasActive = false;
- }
+ nChangedActivePos = nPos;
+ m_nActive = -1;
+ m_bHasActive = false;
}
m_vRemovedEntries.push_back( *iIndex );
m_vEntries.erase( iIndex );
@@ -1225,6 +1229,9 @@ void ExtensionBox_Impl::checkEntries()
if ( nNewPos != - 1)
selectEntry( nNewPos );
+ else if (nChangedActivePos != -1) {
+ selectEntry(nChangedActivePos);
+ }
if ( bNeedsUpdate )
{