diff options
author | Gagandeep Singh <deepgagan231197@gmail.com> | 2019-04-01 16:50:18 +0530 |
---|---|---|
committer | Dennis Francis <dennis.francis@collabora.com> | 2019-04-21 19:31:07 +0200 |
commit | 0ec98930888ee9f29032d12185baefc71da8489f (patch) | |
tree | 76784dade02a3dc41f52751694711074c0547879 | |
parent | de2bf2c2457a4113e0929f59a88f166d824f25ca (diff) |
bug tdf#120697
add drop down containing formulas in autosum button in calc
Change-Id: I1da8116ba2f6073bec153979282161fbaa286427
Reviewed-on: https://gerrit.libreoffice.org/70058
Tested-by: Jenkins
Reviewed-by: Dennis Francis <dennis.francis@collabora.com>
-rw-r--r-- | sc/UIConfig_scalc.mk | 1 | ||||
-rw-r--r-- | sc/inc/strings.hrc | 2 | ||||
-rw-r--r-- | sc/source/ui/app/inputwin.cxx | 122 | ||||
-rw-r--r-- | sc/source/ui/inc/inputwin.hxx | 4 | ||||
-rw-r--r-- | sc/source/ui/inc/tabvwsh.hxx | 3 | ||||
-rw-r--r-- | sc/source/ui/inc/viewfunc.hxx | 8 | ||||
-rw-r--r-- | sc/source/ui/view/cellsh1.cxx | 2 | ||||
-rw-r--r-- | sc/source/ui/view/tabvwshc.cxx | 10 | ||||
-rw-r--r-- | sc/source/ui/view/viewfun2.cxx | 87 | ||||
-rw-r--r-- | sc/uiconfig/scalc/ui/autosum.ui | 49 |
10 files changed, 213 insertions, 75 deletions
diff --git a/sc/UIConfig_scalc.mk b/sc/UIConfig_scalc.mk index a80f9d2ea791..a091655403b4 100644 --- a/sc/UIConfig_scalc.mk +++ b/sc/UIConfig_scalc.mk @@ -88,6 +88,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/scalc,\ sc/uiconfig/scalc/ui/allheaderfooterdialog \ sc/uiconfig/scalc/ui/analysisofvariancedialog \ sc/uiconfig/scalc/ui/autoformattable \ + sc/uiconfig/scalc/ui/autosum \ sc/uiconfig/scalc/ui/cellprotectionpage \ sc/uiconfig/scalc/ui/changesourcedialog \ sc/uiconfig/scalc/ui/chardialog \ diff --git a/sc/inc/strings.hrc b/sc/inc/strings.hrc index 39873fcf46a1..dcceddab3190 100644 --- a/sc/inc/strings.hrc +++ b/sc/inc/strings.hrc @@ -177,7 +177,7 @@ #define SCSTR_QHELP_BTNCALC NC_("SCSTR_QHELP_BTNCALC", "Function Wizard") #define SCSTR_QHELP_BTNOK NC_("SCSTR_QHELP_BTNOK", "Accept") #define SCSTR_QHELP_BTNCANCEL NC_("SCSTR_QHELP_BTNCANCEL", "Cancel") -#define SCSTR_QHELP_BTNSUM NC_("SCSTR_QHELP_BTNSUM", "Sum") +#define SCSTR_QHELP_BTNSUM NC_("SCSTR_QHELP_BTNSUM", "Autosum") #define SCSTR_QHELP_BTNEQUAL NC_("SCSTR_QHELP_BTNEQUAL", "Formula") #define SCSTR_QHELP_EXPAND_FORMULA NC_("SCSTR_QHELP_EXPAND_FORMULA", "Expand Formula Bar") #define SCSTR_QHELP_COLLAPSE_FORMULA NC_("SCSTR_QHELP_COLLAPSE_FORMULA", "Collapse Formula Bar") diff --git a/sc/source/ui/app/inputwin.cxx b/sc/source/ui/app/inputwin.cxx index e38febfda9f6..a54332c9a4af 100644 --- a/sc/source/ui/app/inputwin.cxx +++ b/sc/source/ui/app/inputwin.cxx @@ -62,6 +62,7 @@ #include <rangeutl.hxx> #include <docfunc.hxx> #include <funcdesc.hxx> +#include <formula/opcode.hxx> #include <editeng/fontitem.hxx> #include <AccessibleEditObject.hxx> #include <AccessibleText.hxx> @@ -183,12 +184,13 @@ ScInputWindow::ScInputWindow( vcl::Window* pParent, const SfxBindings* pBind ) : InsertWindow (1, aWndPos.get(), ToolBoxItemBits::NONE, 0); InsertSeparator (1); InsertItem (SID_INPUT_FUNCTION, Image(StockImage::Yes, RID_BMP_INPUT_FUNCTION), ToolBoxItemBits::NONE, 2); - InsertItem (SID_INPUT_SUM, Image(StockImage::Yes, RID_BMP_INPUT_SUM), ToolBoxItemBits::NONE, 3); + InsertItem (SID_INPUT_SUM, Image(StockImage::Yes, RID_BMP_INPUT_SUM), ToolBoxItemBits::DROPDOWNONLY, 3); InsertItem (SID_INPUT_EQUAL, Image(StockImage::Yes, RID_BMP_INPUT_EQUAL), ToolBoxItemBits::NONE, 4); InsertItem (SID_INPUT_CANCEL, Image(StockImage::Yes, RID_BMP_INPUT_CANCEL), ToolBoxItemBits::NONE, 5); InsertItem (SID_INPUT_OK, Image(StockImage::Yes, RID_BMP_INPUT_OK), ToolBoxItemBits::NONE, 6); InsertSeparator (7); InsertWindow (7, &aTextWindow, ToolBoxItemBits::NONE, 8); + SetDropdownClickHdl( LINK( this, ScInputWindow, DropdownClickHdl )); aWndPos ->SetQuickHelpText(ScResId(SCSTR_QHELP_POSWND)); aWndPos ->SetHelpId (HID_INSWIN_POS); @@ -329,45 +331,6 @@ void ScInputWindow::Select() aTextWindow.Invalidate(); // Or else the Selection remains break; - case SID_INPUT_SUM: - { - ScTabViewShell* pViewSh = dynamic_cast<ScTabViewShell*>( SfxViewShell::Current() ); - if ( pViewSh ) - { - bool bSubTotal = false; - bool bRangeFinder = false; - const OUString aFormula = pViewSh->DoAutoSum(bRangeFinder, bSubTotal); - if (!aFormula.isEmpty()) - { - SetFuncString( aFormula ); - if (bRangeFinder && pScMod->IsEditMode()) - { - ScInputHandler* pHdl = pScMod->GetInputHdl( pViewSh ); - if ( pHdl ) - { - pHdl->InitRangeFinder( aFormula ); - - //! SetSelection at the InputHandler? - //! Set bSelIsRef? - const sal_Int32 nOpen = aFormula.indexOf('('); - const sal_Int32 nLen = aFormula.getLength(); - if ( nOpen != -1 && nLen > nOpen ) - { - ESelection aSel( 0, nOpen + (bSubTotal ? 3 : 1), 0, nLen-1 ); - EditView* pTableView = pHdl->GetTableView(); - if ( pTableView ) - pTableView->SetSelection( aSel ); - EditView* pTopView = pHdl->GetTopView(); - if ( pTopView ) - pTopView->SetSelection( aSel ); - } - } - } - } - } - } - break; - case SID_INPUT_EQUAL: { aTextWindow.StartEditEngine(); @@ -902,6 +865,85 @@ void ScInputBarGroup::DecrementVerticalSize() } } +IMPL_LINK( ScInputWindow, MenuHdl, Menu *, pMenu, bool ) +{ + OString aCommand = pMenu->GetCurItemIdent(); + if (!aCommand.isEmpty()) + { + ScModule* pScMod = SC_MOD(); + ScTabViewShell* pViewSh = dynamic_cast<ScTabViewShell*>( SfxViewShell::Current() ); + if ( pViewSh ) + { + bool bSubTotal = false; + bool bRangeFinder = false; + OpCode eCode = ocSum; + if ( aCommand == "sum" ) + { + eCode = ocSum; + } + else if ( aCommand == "average" ) + { + eCode = ocAverage; + } + else if ( aCommand == "max" ) + { + eCode = ocMax; + } + else if ( aCommand == "min" ) + { + eCode = ocMin; + } + else if ( aCommand == "count" ) + { + eCode = ocCount; + } + + const OUString aFormula = pViewSh->DoAutoSum(bRangeFinder, bSubTotal, eCode); + if ( !aFormula.isEmpty() ) + { + SetFuncString( aFormula ); + const sal_Int32 aOpen = aFormula.indexOf('('); + const sal_Int32 aLen = aFormula.getLength(); + if (bRangeFinder && pScMod->IsEditMode()) + { + ScInputHandler* pHdl = pScMod->GetInputHdl( pViewSh ); + if ( pHdl ) + { + pHdl->InitRangeFinder( aFormula ); + + //! SetSelection at the InputHandler? + //! Set bSelIsRef? + if ( aOpen != -1 && aLen > aOpen ) + { + ESelection aSel( 0, aOpen + (bSubTotal ? 3 : 1), 0, aLen-1 ); + EditView* pTableView = pHdl->GetTableView(); + if ( pTableView ) + pTableView->SetSelection( aSel ); + EditView* pTopView = pHdl->GetTopView(); + if ( pTopView ) + pTopView->SetSelection( aSel ); + } + } + } + } + } + } + return false; +} + +IMPL_LINK_NOARG(ScInputWindow, DropdownClickHdl, ToolBox *, void) +{ + sal_uInt16 nCurID = GetCurItemId(); + EndSelection(); + if (nCurID == SID_INPUT_SUM) + { + VclBuilder aBuilder(nullptr, VclBuilderContainer::getUIRootDir(), "modules/scalc/ui/autosum.ui", ""); + VclPtr<PopupMenu> aPopMenu(aBuilder.get_menu("menu")); + aPopMenu->SetSelectHdl(LINK(this, ScInputWindow, MenuHdl)); + aPopMenu->Execute(this, GetItemRect(SID_INPUT_SUM), PopupMenuFlags::NoMouseUpClose); + } +} + IMPL_LINK_NOARG(ScInputBarGroup, ClickHdl, Button*, void) { vcl::Window* w = GetParent(); diff --git a/sc/source/ui/inc/inputwin.hxx b/sc/source/ui/inc/inputwin.hxx index 01b9390d4d55..8f13b2caa5ac 100644 --- a/sc/source/ui/inc/inputwin.hxx +++ b/sc/source/ui/inc/inputwin.hxx @@ -30,6 +30,7 @@ #include <vcl/scrbar.hxx> #include <vcl/window.hxx> #include <vcl/transfer.hxx> +#include <vcl/menu.hxx> class EditView; class ScAccessibleEditLineTextData; @@ -263,6 +264,9 @@ public: virtual void MouseButtonDown( const MouseEvent& rMEvt ) override; virtual void MouseMove( const MouseEvent& rMEvt ) override; + DECL_LINK( MenuHdl, Menu *, bool ); + DECL_LINK( DropdownClickHdl, ToolBox*, void ); + private: bool IsPointerAtResizePos(); diff --git a/sc/source/ui/inc/tabvwsh.hxx b/sc/source/ui/inc/tabvwsh.hxx index 266d816a78af..a572751e8192 100644 --- a/sc/source/ui/inc/tabvwsh.hxx +++ b/sc/source/ui/inc/tabvwsh.hxx @@ -21,6 +21,7 @@ #define INCLUDED_SC_SOURCE_UI_INC_TABVWSH_HXX #include <formula/errorcodes.hxx> +#include <formula/opcode.hxx> #include <svx/fmshell.hxx> #include <sfx2/viewsh.hxx> #include <editeng/svxenum.hxx> @@ -375,7 +376,7 @@ public: bool IsActive() const { return bIsActive; } OUString GetFormula(const ScAddress& rAddress); bool UseSubTotal(ScRangeList* pRangeList); - const OUString DoAutoSum(bool& rRangeFinder, bool& rSubTotal); + const OUString DoAutoSum(bool& rRangeFinder, bool& rSubTotal, const OpCode eCode); // ugly hack to call Define Names from Manage Names void SwitchBetweenRefDialogs(SfxModelessDialogController* pDialog); diff --git a/sc/source/ui/inc/viewfunc.hxx b/sc/source/ui/inc/viewfunc.hxx index 3d2627e3b15a..7719cddf6a5c 100644 --- a/sc/source/ui/inc/viewfunc.hxx +++ b/sc/source/ui/inc/viewfunc.hxx @@ -76,10 +76,10 @@ public: SvtScriptType GetSelectionScriptType(); - bool GetAutoSumArea(ScRangeList& rRangeList); - void EnterAutoSum(const ScRangeList& rRangeList, bool bSubTotal, const ScAddress& rAddr); - bool AutoSum( const ScRange& rRange, bool bSubTotal, bool bSetCursor, bool bContinue ); - OUString GetAutoSumFormula( const ScRangeList& rRangeList, bool bSubTotal, const ScAddress& rAddr ); + bool GetAutoSumArea( ScRangeList& rRangeList ); + void EnterAutoSum( const ScRangeList& rRangeList, bool bSubTotal, const ScAddress& rAddr, const OpCode eCode ); + bool AutoSum( const ScRange& rRange, bool bSubTotal, bool bSetCursor, bool bContinue, const OpCode eCode ); + OUString GetAutoSumFormula( const ScRangeList& rRangeList, bool bSubTotal, const ScAddress& rAddr, const OpCode eCode ); void EnterData( SCCOL nCol, SCROW nRow, SCTAB nTab, const OUString& rString, const EditTextObject* pData = nullptr ); diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx index fdeadf51d9ab..4f672a4c2aa9 100644 --- a/sc/source/ui/view/cellsh1.cxx +++ b/sc/source/ui/view/cellsh1.cxx @@ -2647,7 +2647,7 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq ) { bool bSubTotal = false; bool bRangeFinder = false; - const OUString aFormula = pTabViewShell->DoAutoSum( bRangeFinder, bSubTotal ); + const OUString aFormula = pTabViewShell->DoAutoSum( bRangeFinder, bSubTotal , ocSum ); if ( !aFormula.isEmpty() ) { const sal_Int32 nPar = aFormula.indexOf( '(' ); diff --git a/sc/source/ui/view/tabvwshc.cxx b/sc/source/ui/view/tabvwshc.cxx index 43b4289a67b5..5aecdbd97733 100644 --- a/sc/source/ui/view/tabvwshc.cxx +++ b/sc/source/ui/view/tabvwshc.cxx @@ -657,7 +657,7 @@ bool ScTabViewShell::UseSubTotal(ScRangeList* pRangeList) return bSubTotal; } -const OUString ScTabViewShell::DoAutoSum(bool& rRangeFinder, bool& rSubTotal) +const OUString ScTabViewShell::DoAutoSum(bool& rRangeFinder, bool& rSubTotal, const OpCode eCode) { OUString aFormula; const ScMarkData& rMark = GetViewData().GetMarkData(); @@ -692,7 +692,7 @@ const OUString ScTabViewShell::DoAutoSum(bool& rRangeFinder, bool& rSubTotal) ScAddress aAddr = aRangeList.back().aEnd; aAddr.IncRow(); const bool bSubTotal( UseSubTotal( &aRangeList ) ); - EnterAutoSum( aRangeList, bSubTotal, aAddr ); + EnterAutoSum( aRangeList, bSubTotal, aAddr, eCode ); } } else @@ -703,14 +703,14 @@ const OUString ScTabViewShell::DoAutoSum(bool& rRangeFinder, bool& rSubTotal) const ScRange & rRange = aMarkRangeList[i]; const bool bSetCursor = ( i == nCount - 1 ); const bool bContinue = ( i != 0 ); - if ( !AutoSum( rRange, bSubTotal, bSetCursor, bContinue ) ) + if ( !AutoSum( rRange, bSubTotal, bSetCursor, bContinue, eCode ) ) { MarkRange( rRange, false ); SetCursor( rRange.aEnd.Col(), rRange.aEnd.Row() ); const ScRangeList aRangeList; ScAddress aAddr = rRange.aEnd; aAddr.IncRow(); - aFormula = GetAutoSumFormula( aRangeList, bSubTotal, aAddr ); + aFormula = GetAutoSumFormula( aRangeList, bSubTotal, aAddr , eCode); break; } } @@ -722,7 +722,7 @@ const OUString ScTabViewShell::DoAutoSum(bool& rRangeFinder, bool& rSubTotal) rRangeFinder = GetAutoSumArea( aRangeList ); rSubTotal = UseSubTotal( &aRangeList ); ScAddress aAddr = GetViewData().GetCurPos(); - aFormula = GetAutoSumFormula( aRangeList, rSubTotal, aAddr ); + aFormula = GetAutoSumFormula( aRangeList, rSubTotal, aAddr , eCode); } return aFormula; } diff --git a/sc/source/ui/view/viewfun2.cxx b/sc/source/ui/view/viewfun2.cxx index 623fe1b68b6b..96b57048f6b2 100644 --- a/sc/source/ui/view/viewfun2.cxx +++ b/sc/source/ui/view/viewfun2.cxx @@ -2,7 +2,7 @@ /* * This file is part of the LibreOffice project. * - * This Source Code Form is subject to the terms of the Mozilla Public + * This Source eCode 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/. * @@ -226,7 +226,11 @@ enum ScAutoSum { ScAutoSumNone = 0, ScAutoSumData, - ScAutoSumSum + ScAutoSumSum, + ScAutoSumAverage, + ScAutoSumMax, + ScAutoSumMin, + ScAutoSumCount }; static ScAutoSum lcl_IsAutoSumData( ScDocument* pDoc, SCCOL nCol, SCROW nRow, @@ -237,12 +241,28 @@ static ScAutoSum lcl_IsAutoSumData( ScDocument* pDoc, SCCOL nCol, SCROW nRow, { if (aCell.meType == CELLTYPE_FORMULA) { + ScAutoSum val = ScAutoSumNone; ScTokenArray* pCode = aCell.mpFormula->GetCode(); - if ( pCode && pCode->GetOuterFuncOpCode() == ocSum ) + if ( pCode ) { + switch( pCode->GetOuterFuncOpCode() ) + { + case ocSum : val = ScAutoSumSum; + break; + case ocAverage : val = ScAutoSumAverage; + break; + case ocMax : val = ScAutoSumMax; + break; + case ocMin : val = ScAutoSumMin; + break; + case ocCount : val = ScAutoSumCount; + break; + default : + break; + } if ( pCode->GetAdjacentExtendOfOuterFuncRefs( nExtend, ScAddress( nCol, nRow, nTab ), eDir ) ) - return ScAutoSumSum; + return val; } } return ScAutoSumData; @@ -293,7 +313,7 @@ static bool lcl_FindNextSumEntryInColumn( ScDocument* pDoc, SCCOL nCol, SCROW& n { --nRow; } - return eSkip == ScAutoSumSum && nRow < nTmp; + return eSkip >= ScAutoSumSum && nRow < nTmp; } static bool lcl_FindNextSumEntryInRow( ScDocument* pDoc, SCCOL& nCol, SCROW nRow, @@ -306,7 +326,7 @@ static bool lcl_FindNextSumEntryInRow( ScDocument* pDoc, SCCOL& nCol, SCROW nRow { --nCol; } - return eSkip == ScAutoSumSum && nCol < nTmp; + return eSkip >= ScAutoSumSum && nCol < nTmp; } static ScAutoSum lcl_GetAutoSumForColumnRange( ScDocument* pDoc, ScRangeList& rRangeList, const ScRange& rRange ) @@ -325,7 +345,7 @@ static ScAutoSum lcl_GetAutoSumForColumnRange( ScDocument* pDoc, ScRangeList& rR SCCOLROW nExtend = 0; ScAutoSum eSum = lcl_IsAutoSumData( pDoc, nCol, nEndRow, nTab, DIR_TOP, nExtend /*out*/ ); - if ( eSum == ScAutoSumSum ) + if ( eSum >= ScAutoSumSum ) { bool bContinue = false; do @@ -342,7 +362,7 @@ static ScAutoSum lcl_GetAutoSumForColumnRange( ScDocument* pDoc, ScRangeList& rR else { while ( nStartRow > aStart.Row() && - (eSum = lcl_IsAutoSumData( pDoc, nCol, nStartRow-1, nTab, DIR_TOP, nExtend /*out*/ )) != ScAutoSumSum ) + (eSum = lcl_IsAutoSumData( pDoc, nCol, nStartRow-1, nTab, DIR_TOP, nExtend /*out*/ )) < ScAutoSumSum ) { --nStartRow; } @@ -370,7 +390,7 @@ static ScAutoSum lcl_GetAutoSumForRowRange( ScDocument* pDoc, ScRangeList& rRang SCCOLROW nExtend = 0; ScAutoSum eSum = lcl_IsAutoSumData( pDoc, nEndCol, nRow, nTab, DIR_LEFT, nExtend /*out*/ ); - if ( eSum == ScAutoSumSum ) + if ( eSum >= ScAutoSumSum ) { bool bContinue = false; do @@ -387,7 +407,7 @@ static ScAutoSum lcl_GetAutoSumForRowRange( ScDocument* pDoc, ScRangeList& rRang else { while ( nStartCol > aStart.Col() && - (eSum = lcl_IsAutoSumData( pDoc, nStartCol-1, nRow, nTab, DIR_LEFT, nExtend /*out*/ )) != ScAutoSumSum ) + (eSum = lcl_IsAutoSumData( pDoc, nStartCol-1, nRow, nTab, DIR_LEFT, nExtend /*out*/ )) < ScAutoSumSum ) { --nStartCol; } @@ -399,6 +419,27 @@ static ScAutoSum lcl_GetAutoSumForRowRange( ScDocument* pDoc, ScRangeList& rRang return eSum; } +static sal_Int8 GetSubTotal( const OpCode eCode ) +{ + sal_Int8 val; + switch ( eCode ) + { + case ocSum : val = 9; + break; + case ocAverage : val = 1; + break; + case ocMax : val = 4; + break; + case ocMin : val = 5; + break; + case ocCount : val = 2; + break; + default : val = 9; + } + + return val; +} + bool ScViewFunc::GetAutoSumArea( ScRangeList& rRangeList ) { ScDocument* pDoc = GetViewData().GetDocument(); @@ -445,7 +486,7 @@ bool ScViewFunc::GetAutoSumArea( ScRangeList& rRangeList ) if ( bRow ) { nStartRow = nSeekRow; // nSeekRow might be adjusted via reference - if ( eSum == ScAutoSumSum ) + if ( eSum >= ScAutoSumSum && eSum <= ScAutoSumCount ) nEndRow = nStartRow; // only sum sums else nEndRow = nRow - 1; // maybe extend data area at bottom @@ -453,7 +494,7 @@ bool ScViewFunc::GetAutoSumArea( ScRangeList& rRangeList ) else { nStartCol = nSeekCol; // nSeekCol might be adjusted via reference - if ( eSum == ScAutoSumSum ) + if ( eSum >= ScAutoSumSum ) nEndCol = nStartCol; // only sum sums else nEndCol = nCol - 1; // maybe extend data area to the right @@ -478,7 +519,7 @@ bool ScViewFunc::GetAutoSumArea( ScRangeList& rRangeList ) } rRangeList.push_back( ScRange( nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab ) ); - if ( eSum == ScAutoSumSum ) + if ( eSum >= ScAutoSumSum ) { if ( bRow ) { @@ -505,13 +546,13 @@ bool ScViewFunc::GetAutoSumArea( ScRangeList& rRangeList ) return false; } -void ScViewFunc::EnterAutoSum(const ScRangeList& rRangeList, bool bSubTotal, const ScAddress& rAddr) +void ScViewFunc::EnterAutoSum(const ScRangeList& rRangeList, bool bSubTotal, const ScAddress& rAddr, const OpCode eCode) { - OUString aFormula = GetAutoSumFormula( rRangeList, bSubTotal, rAddr ); + OUString aFormula = GetAutoSumFormula( rRangeList, bSubTotal, rAddr , eCode); EnterBlock( aFormula, nullptr ); } -bool ScViewFunc::AutoSum( const ScRange& rRange, bool bSubTotal, bool bSetCursor, bool bContinue ) +bool ScViewFunc::AutoSum( const ScRange& rRange, bool bSubTotal, bool bSetCursor, bool bContinue , const OpCode eCode) { ScDocument* pDoc = GetViewData().GetDocument(); const SCTAB nTab = rRange.aStart.Tab(); @@ -667,7 +708,7 @@ bool ScViewFunc::AutoSum( const ScRange& rRange, bool bSubTotal, bool bSetCursor if (++nRowSums == 1) nRowSumsStartCol = aRangeList[0].aStart.Col(); const OUString aFormula = GetAutoSumFormula( - aRangeList, bSubTotal, ScAddress(nCol, nInsRow, nTab)); + aRangeList, bSubTotal, ScAddress(nCol, nInsRow, nTab), eCode); EnterData( nCol, nInsRow, nTab, aFormula ); } } @@ -703,7 +744,7 @@ bool ScViewFunc::AutoSum( const ScRange& rRange, bool bSubTotal, bool bSetCursor { if (++nColSums == 1) nColSumsStartRow = aRangeList[0].aStart.Row(); - const OUString aFormula = GetAutoSumFormula( aRangeList, bSubTotal, ScAddress(nInsCol, nRow, nTab) ); + const OUString aFormula = GetAutoSumFormula( aRangeList, bSubTotal, ScAddress(nInsCol, nRow, nTab), eCode ); EnterData( nInsCol, nRow, nTab, aFormula ); } } @@ -715,10 +756,10 @@ bool ScViewFunc::AutoSum( const ScRange& rRange, bool bSubTotal, bool bSetCursor // there is only one, or the data range if more than one. Otherwise use the // original selection. All extended by end column/row where the sum is put. const ScRange aMarkRange( - (eSum == ScAutoSumSum ? + (eSum >= ScAutoSumSum ? (nRowSums == 1 ? nRowSumsStartCol : nStartCol) : rRange.aStart.Col()), - (eSum == ScAutoSumSum ? + (eSum >= ScAutoSumSum ? (nColSums == 1 ? nColSumsStartRow : nStartRow) : rRange.aStart.Row()), nTab, nMarkEndCol, nMarkEndRow, nTab ); @@ -731,18 +772,18 @@ bool ScViewFunc::AutoSum( const ScRange& rRange, bool bSubTotal, bool bSetCursor return true; } -OUString ScViewFunc::GetAutoSumFormula( const ScRangeList& rRangeList, bool bSubTotal, const ScAddress& rAddr ) +OUString ScViewFunc::GetAutoSumFormula( const ScRangeList& rRangeList, bool bSubTotal, const ScAddress& rAddr , const OpCode eCode) { ScViewData& rViewData = GetViewData(); ScDocument* pDoc = rViewData.GetDocument(); std::unique_ptr<ScTokenArray> pArray(new ScTokenArray); - pArray->AddOpCode(bSubTotal ? ocSubTotal : ocSum); + pArray->AddOpCode(bSubTotal ? ocSubTotal : eCode); pArray->AddOpCode(ocOpen); if (bSubTotal) { - pArray->AddDouble(9); + pArray->AddDouble( GetSubTotal( eCode ) ); pArray->AddOpCode(ocSep); } diff --git a/sc/uiconfig/scalc/ui/autosum.ui b/sc/uiconfig/scalc/ui/autosum.ui new file mode 100644 index 000000000000..a9cbdbe61aec --- /dev/null +++ b/sc/uiconfig/scalc/ui/autosum.ui @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.20.0 --> +<interface domain="sc"> + <requires lib="gtk+" version="3.18"/> + <object class="GtkMenu" id="menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="sum"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="autosum|sum">Sum</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="average"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="autosum|average">Average</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="min"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="autosum|min">Min</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="max"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="autosum|max">Max</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="count"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="autosum|count">Count</property> + <property name="use_underline">True</property> + </object> + </child> + </object> +</interface> |