diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2015-03-09 15:49:37 +0900 |
---|---|---|
committer | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2015-03-10 14:04:34 +0900 |
commit | 21087baf1c9dae5e7e970f22d351d771210175b0 (patch) | |
tree | bb9e234ceb395ff534c5a1647024726753e16d29 /sc | |
parent | 6a2f0cecd249f672e74c3b08653ff56891c24071 (diff) |
GridWindow: use unique_ptr for filter box and float
Change-Id: Iaf203682e6d3b18d8b25c6ee2755710615fe5f08
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/ui/inc/gridwin.hxx | 4 | ||||
-rw-r--r-- | sc/source/ui/view/gridwin.cxx | 162 |
2 files changed, 85 insertions, 81 deletions
diff --git a/sc/source/ui/inc/gridwin.hxx b/sc/source/ui/inc/gridwin.hxx index 56498ab0dd2e..395c204f2a59 100644 --- a/sc/source/ui/inc/gridwin.hxx +++ b/sc/source/ui/inc/gridwin.hxx @@ -137,8 +137,8 @@ class ScGridWindow : public vcl::Window, public DropTargetHelper, public DragSou ScNoteMarker* pNoteMarker; - ScFilterListBox* pFilterBox; - FloatingWindow* pFilterFloat; + std::unique_ptr<ScFilterListBox> mpFilterBox; + std::unique_ptr<FloatingWindow> mpFilterFloat; boost::scoped_ptr<ScCheckListMenuWindow> mpAutoFilterPopup; boost::scoped_ptr<ScCheckListMenuWindow> mpDPFieldPopup; boost::scoped_ptr<ScDPFieldButton> mpFilterButton; diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx index 4f36aac83572..2e75e69ecf83 100644 --- a/sc/source/ui/view/gridwin.cxx +++ b/sc/source/ui/view/gridwin.cxx @@ -441,8 +441,8 @@ ScGridWindow::ScGridWindow( vcl::Window* pParent, ScViewData* pData, ScSplitPos pViewData( pData ), eWhich( eWhichPos ), pNoteMarker( NULL ), - pFilterBox( NULL ), - pFilterFloat( NULL ), + mpFilterBox(), + mpFilterFloat(), mpAutoFilterPopup(NULL), mpDPFieldPopup(NULL), mpFilterButton(NULL), @@ -523,8 +523,6 @@ ScGridWindow::~ScGridWindow() // #114409# ImpDestroyOverlayObjects(); - delete pFilterBox; - delete pFilterFloat; delete pNoteMarker; } @@ -535,13 +533,12 @@ void ScGridWindow::ClickExtern() // #i81298# don't delete the filter box when called from its select handler // (possible through row header size update) // #i84277# when initializing the filter box, a Basic error can deactivate the view - if ( pFilterBox && ( pFilterBox->IsInSelect() || pFilterBox->IsInInit() ) ) + if (mpFilterBox && (mpFilterBox->IsInSelect() || mpFilterBox->IsInInit())) { break; } - - DELETEZ(pFilterBox); - DELETEZ(pFilterFloat); + mpFilterBox.reset(); + mpFilterFloat.reset(); } while (false); @@ -554,8 +551,8 @@ void ScGridWindow::ClickExtern() IMPL_LINK_NOARG(ScGridWindow, PopupModeEndHdl) { - if (pFilterBox) - pFilterBox->SetCancelled(); // nicht mehr auswaehlen + if (mpFilterBox) + mpFilterBox->SetCancelled(); // nicht mehr auswaehlen GrabFocus(); return 0; } @@ -938,8 +935,8 @@ void ScGridWindow::LaunchDPFieldMenu( SCCOL nCol, SCROW nRow ) void ScGridWindow::DoScenarioMenu( const ScRange& rScenRange ) { - delete pFilterBox; - delete pFilterFloat; + mpFilterBox.reset(); + mpFilterFloat.reset(); SCCOL nCol = rScenRange.aEnd.Col(); // Zelle unterhalb des Buttons SCROW nRow = rScenRange.aStart.Row(); @@ -969,17 +966,19 @@ void ScGridWindow::DoScenarioMenu( const ScRange& rScenRange ) // Die ListBox direkt unter der schwarzen Linie auf dem Zellgitter // (wenn die Linie verdeckt wird, sieht es komisch aus...) - pFilterFloat = new ScFilterFloatingWindow( this, WinBits(WB_BORDER) ); // nicht resizable etc. - pFilterFloat->SetPopupModeEndHdl( LINK( this, ScGridWindow, PopupModeEndHdl ) ); - pFilterBox = new ScFilterListBox( pFilterFloat, this, nCol, nRow, SC_FILTERBOX_SCENARIO ); - if ( bLayoutRTL ) - pFilterBox->EnableMirroring(); + mpFilterFloat.reset(new ScFilterFloatingWindow(this, WinBits(WB_BORDER))); + mpFilterFloat->SetPopupModeEndHdl( LINK( this, ScGridWindow, PopupModeEndHdl ) ); + mpFilterBox.reset(new ScFilterListBox(mpFilterFloat.get(), this, nCol, nRow, SC_FILTERBOX_SCENARIO)); + if (bLayoutRTL) + mpFilterBox->EnableMirroring(); nSizeX += 1; { - vcl::Font aOldFont = GetFont(); SetFont( pFilterBox->GetFont() ); - MapMode aOldMode = GetMapMode(); SetMapMode( MAP_PIXEL ); + vcl::Font aOldFont = GetFont(); + SetFont(mpFilterBox->GetFont()); + MapMode aOldMode = GetMapMode(); + SetMapMode( MAP_PIXEL ); nHeight = GetTextHeight(); nHeight *= SC_FILTERLISTBOX_LINES; @@ -992,9 +991,9 @@ void ScGridWindow::DoScenarioMenu( const ScRange& rScenRange ) // ParentSize Abfrage fehlt Size aSize( nSizeX, nHeight ); - pFilterBox->SetSizePixel( aSize ); - pFilterBox->Show(); // Show muss vor SetUpdateMode kommen !!! - pFilterBox->SetUpdateMode(false); + mpFilterBox->SetSizePixel( aSize ); + mpFilterBox->Show(); // Show muss vor SetUpdateMode kommen !!! + mpFilterBox->SetUpdateMode(false); // SetOutputSizePixel/StartPopupMode erst unten, wenn die Groesse feststeht @@ -1010,10 +1009,10 @@ void ScGridWindow::DoScenarioMenu( const ScRange& rScenRange ) if (pDoc->HasScenarioRange( i, rScenRange )) if (pDoc->GetName( i, aTabName )) { - pFilterBox->InsertEntry( aTabName ); + mpFilterBox->InsertEntry(aTabName); if (pDoc->IsActiveScenario(i)) aCurrent = aTabName; - long nTextWidth = pFilterBox->GetTextWidth( aTabName ); + long nTextWidth = mpFilterBox->GetTextWidth(aTabName); if ( nTextWidth > nMaxText ) nMaxText = nTextWidth; ++nEntryCount; @@ -1029,8 +1028,8 @@ void ScGridWindow::DoScenarioMenu( const ScRange& rScenRange ) { long nDiff = nMaxText - nSizeX; aSize = Size( nMaxText, nHeight ); - pFilterBox->SetSizePixel( aSize ); - pFilterFloat->SetOutputSizePixel( aSize ); + mpFilterBox->SetSizePixel(aSize); + mpFilterFloat->SetOutputSizePixel(aSize); if ( !bLayoutRTL ) { @@ -1042,23 +1041,26 @@ void ScGridWindow::DoScenarioMenu( const ScRange& rScenRange ) } } - pFilterFloat->SetOutputSizePixel( aSize ); - pFilterFloat->StartPopupMode( aCellRect, FLOATWIN_POPUPMODE_DOWN|FLOATWIN_POPUPMODE_GRABFOCUS ); + mpFilterFloat->SetOutputSizePixel( aSize ); + mpFilterFloat->StartPopupMode( aCellRect, FLOATWIN_POPUPMODE_DOWN|FLOATWIN_POPUPMODE_GRABFOCUS ); - pFilterBox->SetUpdateMode(true); - pFilterBox->GrabFocus(); + mpFilterBox->SetUpdateMode(true); + mpFilterBox->GrabFocus(); sal_Int32 nPos = LISTBOX_ENTRY_NOTFOUND; if (!aCurrent.isEmpty()) { - nPos = pFilterBox->GetEntryPos(aCurrent); + nPos = mpFilterBox->GetEntryPos(aCurrent); } - if (LISTBOX_ENTRY_NOTFOUND == nPos && pFilterBox->GetEntryCount() > 0 ) + if (LISTBOX_ENTRY_NOTFOUND == nPos && mpFilterBox->GetEntryCount() > 0 ) + { nPos = 0; + } if (LISTBOX_ENTRY_NOTFOUND != nPos ) - pFilterBox->SelectEntryPos(nPos); - - pFilterBox->EndInit(); + { + mpFilterBox->SelectEntryPos(nPos); + } + mpFilterBox->EndInit(); // Szenario-Auswahl kommt aus MouseButtonDown: // der naechste MouseMove auf die Filterbox ist wie ein ButtonDown @@ -1069,8 +1071,8 @@ void ScGridWindow::DoScenarioMenu( const ScRange& rScenRange ) void ScGridWindow::LaunchDataSelectMenu( SCCOL nCol, SCROW nRow, bool bDataSelect ) { - delete pFilterBox; - delete pFilterFloat; + mpFilterBox.reset(); + mpFilterFloat.reset(); sal_uInt16 i; ScDocument* pDoc = pViewData->GetDocument(); @@ -1090,19 +1092,21 @@ void ScGridWindow::LaunchDataSelectMenu( SCCOL nCol, SCROW nRow, bool bDataSelec aPos.X() -= 1; aPos.Y() += nSizeY - 1; - pFilterFloat = new ScFilterFloatingWindow( this, WinBits(WB_BORDER) ); // nicht resizable etc. - pFilterFloat->SetPopupModeEndHdl( LINK( this, ScGridWindow, PopupModeEndHdl ) ); - pFilterBox = new ScFilterListBox( - pFilterFloat, this, nCol, nRow, bDataSelect ? SC_FILTERBOX_DATASELECT : SC_FILTERBOX_FILTER ); + mpFilterFloat.reset(new ScFilterFloatingWindow(this, WinBits(WB_BORDER))); + mpFilterFloat->SetPopupModeEndHdl(LINK( this, ScGridWindow, PopupModeEndHdl)); + ScFilterBoxMode eFilterMode = bDataSelect ? SC_FILTERBOX_DATASELECT : SC_FILTERBOX_FILTER; + mpFilterBox.reset(new ScFilterListBox(mpFilterFloat.get(), this, nCol, nRow, eFilterMode)); // Fix for bug fdo#44925 if (Application::GetSettings().GetLayoutRTL() != bLayoutRTL) - pFilterBox->EnableMirroring(); + mpFilterBox->EnableMirroring(); nSizeX += 1; { - vcl::Font aOldFont = GetFont(); SetFont( pFilterBox->GetFont() ); - MapMode aOldMode = GetMapMode(); SetMapMode( MAP_PIXEL ); + vcl::Font aOldFont = GetFont(); + SetFont(mpFilterBox->GetFont()); + MapMode aOldMode = GetMapMode(); + SetMapMode(MAP_PIXEL); nHeight = GetTextHeight(); nHeight *= SC_FILTERLISTBOX_LINES; @@ -1126,7 +1130,7 @@ void ScGridWindow::LaunchDataSelectMenu( SCCOL nCol, SCROW nRow, bool bDataSelec { //! wird der Titel ueberhaupt ausgewertet ??? OUString aString = pDoc->GetString(nCol, nRow, nTab); - pFilterBox->SetText( aString ); + mpFilterBox->SetText(aString); long nMaxText = 0; @@ -1136,17 +1140,17 @@ void ScGridWindow::LaunchDataSelectMenu( SCCOL nCol, SCROW nRow, bool bDataSelec for (i=0; i<nDefCount; i++) { OUString aEntry( static_cast<ScResId>(nDefIDs[i]) ); - pFilterBox->InsertEntry( aEntry ); - long nTextWidth = pFilterBox->GetTextWidth( aEntry ); + mpFilterBox->InsertEntry(aEntry); + long nTextWidth = mpFilterBox->GetTextWidth(aEntry); if ( nTextWidth > nMaxText ) nMaxText = nTextWidth; } - pFilterBox->SetSeparatorPos( nDefCount - 1 ); + mpFilterBox->SetSeparatorPos(nDefCount - 1); // get list entries bool bHasDates = false; pDoc->GetFilterEntries( nCol, nRow, nTab, true, aStrings, bHasDates); - pFilterBox->SetListHasDates(bHasDates); + mpFilterBox->SetListHasDates(bHasDates); // check widths of numerical entries (string entries are not included) // so all numbers are completely visible @@ -1155,7 +1159,7 @@ void ScGridWindow::LaunchDataSelectMenu( SCCOL nCol, SCROW nRow, bool bDataSelec { if (!it->IsStrData()) // only numerical entries { - long nTextWidth = pFilterBox->GetTextWidth(it->GetString()); + long nTextWidth = mpFilterBox->GetTextWidth(it->GetString()); if ( nTextWidth > nMaxText ) nMaxText = nTextWidth; } @@ -1185,12 +1189,12 @@ void ScGridWindow::LaunchDataSelectMenu( SCCOL nCol, SCROW nRow, bool bDataSelec if ( aPos.Y() + aSize.Height() > aParentSize.Height() ) aPos.Y() = aParentSize.Height() - aSize.Height(); - pFilterBox->SetSizePixel( aSize ); - pFilterBox->Show(); // Show muss vor SetUpdateMode kommen !!! - pFilterBox->SetUpdateMode(false); + mpFilterBox->SetSizePixel(aSize); + mpFilterBox->Show(); // Show muss vor SetUpdateMode kommen !!! + mpFilterBox->SetUpdateMode(false); - pFilterFloat->SetOutputSizePixel( aSize ); - pFilterFloat->StartPopupMode( aCellRect, FLOATWIN_POPUPMODE_DOWN|FLOATWIN_POPUPMODE_GRABFOCUS); + mpFilterFloat->SetOutputSizePixel(aSize); + mpFilterFloat->StartPopupMode(aCellRect, FLOATWIN_POPUPMODE_DOWN | FLOATWIN_POPUPMODE_GRABFOCUS); // Listbox fuellen bool bWait = aStrings.size() > 100; @@ -1200,12 +1204,12 @@ void ScGridWindow::LaunchDataSelectMenu( SCCOL nCol, SCROW nRow, bool bDataSelec std::vector<ScTypedStrData>::const_iterator it = aStrings.begin(), itEnd = aStrings.end(); for (; it != itEnd; ++it) - pFilterBox->InsertEntry(it->GetString()); + mpFilterBox->InsertEntry(it->GetString()); if (bWait) LeaveWait(); - pFilterBox->SetUpdateMode(true); + mpFilterBox->SetUpdateMode(true); } sal_Int32 nSelPos = LISTBOX_ENTRY_NOTFOUND; @@ -1236,7 +1240,7 @@ void ScGridWindow::LaunchDataSelectMenu( SCCOL nCol, SCROW nRow, bool bDataSelec { if (!aQueryStr.isEmpty()) { - nSelPos = pFilterBox->GetEntryPos(aQueryStr); + nSelPos = mpFilterBox->GetEntryPos(aQueryStr); } } else if ( rEntry.eOp == SC_TOPVAL && aQueryStr == "10" ) @@ -1296,30 +1300,30 @@ void ScGridWindow::LaunchDataSelectMenu( SCCOL nCol, SCROW nRow, bool bDataSelec } // neu (309): irgendwas muss immer selektiert sein: - if ( LISTBOX_ENTRY_NOTFOUND == nSelPos && pFilterBox->GetEntryCount() > 0 && !bDataSelect) + if (LISTBOX_ENTRY_NOTFOUND == nSelPos && mpFilterBox->GetEntryCount() > 0 && !bDataSelect) nSelPos = 0; // keine leere Auswahl-Liste anzeigen: if ( bEmpty ) { - DELETEZ(pFilterBox); // war nix - DELETEZ(pFilterFloat); + mpFilterBox.reset(); + mpFilterFloat.reset(); } else { - pFilterBox->GrabFocus(); + mpFilterBox->GrabFocus(); // Select erst nach GrabFocus, damit das Focus-Rechteck richtig landet if ( LISTBOX_ENTRY_NOTFOUND != nSelPos ) - pFilterBox->SelectEntryPos( nSelPos ); + mpFilterBox->SelectEntryPos(nSelPos); else { if (bDataSelect) - pFilterBox->SetNoSelection(); + mpFilterBox->SetNoSelection(); } - pFilterBox->EndInit(); + mpFilterBox->EndInit(); if (!bDataSelect) { @@ -1334,20 +1338,20 @@ void ScGridWindow::LaunchDataSelectMenu( SCCOL nCol, SCROW nRow, bool bDataSelec void ScGridWindow::FilterSelect( sal_uLong nSel ) { - OUString aString = pFilterBox->GetEntry( static_cast< sal_Int32 >( nSel ) ); + OUString aString = mpFilterBox->GetEntry(static_cast<sal_Int32>(nSel)); - SCCOL nCol = pFilterBox->GetCol(); - SCROW nRow = pFilterBox->GetRow(); - switch ( pFilterBox->GetMode() ) + SCCOL nCol = mpFilterBox->GetCol(); + SCROW nRow = mpFilterBox->GetRow(); + switch (mpFilterBox->GetMode()) { case SC_FILTERBOX_DATASELECT: - ExecDataSelect( nCol, nRow, aString ); + ExecDataSelect(nCol, nRow, aString); break; case SC_FILTERBOX_FILTER: - ExecFilter( nSel, nCol, nRow, aString, pFilterBox->HasDates() ); + ExecFilter(nSel, nCol, nRow, aString, mpFilterBox->HasDates()); break; case SC_FILTERBOX_SCENARIO: - pViewData->GetView()->UseScenario( aString ); + pViewData->GetView()->UseScenario(aString); break; case SC_FILTERBOX_PAGEFIELD: // first entry is "all" @@ -1355,8 +1359,8 @@ void ScGridWindow::FilterSelect( sal_uLong nSel ) break; } - if (pFilterFloat) - pFilterFloat->EndPopupMode(); + if (mpFilterFloat) + mpFilterFloat->EndPopupMode(); GrabFocus(); // unter OS/2 stimmt der Focus sonst nicht } @@ -2485,15 +2489,15 @@ void ScGridWindow::MouseMove( const MouseEvent& rMEvt ) return; } - if (nMouseStatus == SC_GM_FILTER && pFilterBox) + if (nMouseStatus == SC_GM_FILTER && mpFilterBox) { - Point aRelPos = pFilterBox->ScreenToOutputPixel( OutputToScreenPixel( rMEvt.GetPosPixel() ) ); - if ( Rectangle(Point(),pFilterBox->GetOutputSizePixel()).IsInside(aRelPos) ) + Point aRelPos = mpFilterBox->ScreenToOutputPixel( OutputToScreenPixel( rMEvt.GetPosPixel() ) ); + if ( Rectangle(Point(), mpFilterBox->GetOutputSizePixel()).IsInside(aRelPos) ) { nButtonDown = 0; nMouseStatus = SC_GM_NONE; ReleaseMouse(); - pFilterBox->MouseButtonDown( MouseEvent( aRelPos, 1, MouseEventModifiers::SIMPLECLICK, MOUSE_LEFT ) ); + mpFilterBox->MouseButtonDown( MouseEvent( aRelPos, 1, MouseEventModifiers::SIMPLECLICK, MOUSE_LEFT ) ); return; } } @@ -2780,7 +2784,7 @@ void ScGridWindow::Tracking( const TrackingEvent& rTEvt ) void ScGridWindow::StartDrag( sal_Int8 /* nAction */, const Point& rPosPixel ) { - if ( pFilterBox || nPagebreakMouse ) + if (mpFilterBox || nPagebreakMouse) return; HideNoteMarker(); |