summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Francis <dennisfrancis.in@gmail.com>2015-10-17 10:45:53 +0530
committerEike Rathke <erack@redhat.com>2016-03-11 21:45:26 +0000
commit7bc97db5b972f27693161beb9182f8a5850f5551 (patch)
treea8d8fce3ef4eddd7de753ae8db2518f2f41e01ef
parent97c872d015350810fb0180ffdb10de7f039363a4 (diff)
tdf#42629 : Allow multiple status bar functions at a time
Change-Id: Ide9ced5ff4cedebd41a85814f74549648a896f16 Reviewed-on: https://gerrit.libreoffice.org/22060 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Eike Rathke <erack@redhat.com>
-rw-r--r--officecfg/registry/schema/org/openoffice/Office/Calc.xcs6
-rw-r--r--sc/inc/appoptio.hxx6
-rw-r--r--sc/sdi/scalc.sdi2
-rw-r--r--sc/source/core/tool/appoptio.cxx47
-rw-r--r--sc/source/ui/app/scmod.cxx6
-rw-r--r--sc/source/ui/view/tabvwsha.cxx115
-rw-r--r--svx/source/stbctrls/pszctrl.cxx43
7 files changed, 144 insertions, 81 deletions
diff --git a/officecfg/registry/schema/org/openoffice/Office/Calc.xcs b/officecfg/registry/schema/org/openoffice/Office/Calc.xcs
index e2006aa3f144..69b3f5c4174c 100644
--- a/officecfg/registry/schema/org/openoffice/Office/Calc.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/Calc.xcs
@@ -395,6 +395,12 @@
<info>
<desc>Contains other layout settings.</desc>
</info>
+ <prop oor:name="StatusbarMultiFunction" oor:type="xs:int" oor:nillable="false">
+ <info>
+ <desc>Selects a set of functions that are calculated for the selected cells, and which show the results in the status bar.</desc>
+ <label>Statusbar Functions</label>
+ </info>
+ </prop>
<prop oor:name="StatusbarFunction" oor:type="xs:int" oor:nillable="false">
<!-- OldPath: Calc/Layout -->
<!-- OldLocation: Soffice.cfg -->
diff --git a/sc/inc/appoptio.hxx b/sc/inc/appoptio.hxx
index 8c014202af1b..a3fc72406f9e 100644
--- a/sc/inc/appoptio.hxx
+++ b/sc/inc/appoptio.hxx
@@ -49,8 +49,8 @@ public:
sal_uInt16* GetLRUFuncList() const { return pLRUList; }
void SetLRUFuncList( const sal_uInt16* pList,
const sal_uInt16 nCount );
- void SetStatusFunc( sal_uInt16 nNew ) { nStatusFunc = nNew; }
- sal_uInt16 GetStatusFunc() const { return nStatusFunc; }
+ void SetStatusFunc( sal_uInt32 nNew ) { nStatusFunc = nNew; }
+ sal_uInt32 GetStatusFunc() const { return nStatusFunc; }
void SetAutoComplete( bool bNew ) { bAutoComplete = bNew; }
bool GetAutoComplete() const { return bAutoComplete; }
void SetDetectiveAuto( bool bNew ) { bDetectiveAuto = bNew; }
@@ -87,7 +87,7 @@ private:
SvxZoomType eZoomType;
sal_uInt16 nZoom;
bool bSynchronizeZoom;
- sal_uInt16 nStatusFunc;
+ sal_uInt32 nStatusFunc;
bool bAutoComplete;
bool bDetectiveAuto;
sal_uInt32 nTrackContentColor;
diff --git a/sc/sdi/scalc.sdi b/sc/sdi/scalc.sdi
index 853bc79495eb..60a4baca537d 100644
--- a/sc/sdi/scalc.sdi
+++ b/sc/sdi/scalc.sdi
@@ -5205,7 +5205,7 @@ SfxVoidItem StandardTextAttributes SID_TEXT_STANDARD
]
-SfxUInt16Item StatusBarFunc SID_PSZ_FUNCTION
+SfxUInt32Item StatusBarFunc SID_PSZ_FUNCTION
[
AutoUpdate = FALSE,
diff --git a/sc/source/core/tool/appoptio.cxx b/sc/source/core/tool/appoptio.cxx
index 3bdf429dfa67..cbc3c19a3e8c 100644
--- a/sc/source/core/tool/appoptio.cxx
+++ b/sc/source/core/tool/appoptio.cxx
@@ -62,7 +62,7 @@ void ScAppOptions::SetDefaults()
nZoom = 100;
eZoomType = SvxZoomType::PERCENT;
bSynchronizeZoom = true;
- nStatusFunc = SUBTOTAL_FUNC_SUM;
+ nStatusFunc = ( 1 << SUBTOTAL_FUNC_SUM );
bAutoComplete = true;
bDetectiveAuto = true;
@@ -215,7 +215,8 @@ static void lcl_GetSortList( Any& rDest )
#define SCLAYOUTOPT_ZOOMVAL 2
#define SCLAYOUTOPT_ZOOMTYPE 3
#define SCLAYOUTOPT_SYNCZOOM 4
-#define SCLAYOUTOPT_COUNT 5
+#define SCLAYOUTOPT_STATUSBARMULTI 5
+#define SCLAYOUTOPT_COUNT 6
#define CFGPATH_INPUT "Office.Calc/Input"
@@ -254,6 +255,16 @@ static void lcl_GetSortList( Any& rDest )
#define SCCOMPATOPT_KEY_BINDING 0
#define SCCOMPATOPT_COUNT 1
+static sal_uInt32 lcl_ConvertStatusBarFuncSetToSingle( sal_uInt32 nFuncSet )
+{
+ if ( !nFuncSet )
+ return 0;
+ for ( sal_uInt32 nFunc = 1; nFunc < 32; ++nFunc )
+ if ( nFuncSet & ( 1 << nFunc ) )
+ return nFunc;
+ return 0;
+}
+
Sequence<OUString> ScAppCfg::GetLayoutPropertyNames()
{
static const char* aPropNames[] =
@@ -262,7 +273,8 @@ Sequence<OUString> ScAppCfg::GetLayoutPropertyNames()
"Other/StatusbarFunction", // SCLAYOUTOPT_STATUSBAR
"Zoom/Value", // SCLAYOUTOPT_ZOOMVAL
"Zoom/Type", // SCLAYOUTOPT_ZOOMTYPE
- "Zoom/Synchronize" // SCLAYOUTOPT_SYNCZOOM
+ "Zoom/Synchronize", // SCLAYOUTOPT_SYNCZOOM
+ "Other/StatusbarMultiFunction" // SCLAYOUTOPT_STATUSBARMULTI
};
Sequence<OUString> aNames(SCLAYOUTOPT_COUNT);
OUString* pNames = aNames.getArray();
@@ -389,6 +401,8 @@ ScAppCfg::ScAppCfg() :
OSL_ENSURE(aValues.getLength() == aNames.getLength(), "GetProperties failed");
if(aValues.getLength() == aNames.getLength())
{
+ bool bStatusBarFuncSingleFound = false;
+ bool bStatusBarFuncMultiFound = false;
for(int nProp = 0; nProp < aNames.getLength(); nProp++)
{
OSL_ENSURE(pValues[nProp].hasValue(), "property value missing");
@@ -400,7 +414,10 @@ ScAppCfg::ScAppCfg() :
if (pValues[nProp] >>= nIntVal) SetAppMetric( (FieldUnit) nIntVal );
break;
case SCLAYOUTOPT_STATUSBAR:
- if (pValues[nProp] >>= nIntVal) SetStatusFunc( (sal_uInt16) nIntVal );
+ bStatusBarFuncSingleFound = true;
+ break;
+ case SCLAYOUTOPT_STATUSBARMULTI:
+ bStatusBarFuncMultiFound = true;
break;
case SCLAYOUTOPT_ZOOMVAL:
if (pValues[nProp] >>= nIntVal) SetZoom( (sal_uInt16) nIntVal );
@@ -414,6 +431,23 @@ ScAppCfg::ScAppCfg() :
}
}
}
+
+ sal_uInt32 nUIntVal = 0;
+ if ( bStatusBarFuncMultiFound )
+ {
+ if ( pValues[SCLAYOUTOPT_STATUSBARMULTI] >>= nUIntVal )
+ SetStatusFunc( nUIntVal );
+ }
+ else if ( bStatusBarFuncSingleFound )
+ {
+ if ( pValues[SCLAYOUTOPT_STATUSBAR] >>= nUIntVal )
+ {
+ if ( nUIntVal )
+ SetStatusFunc( 1 << nUIntVal );
+ else
+ SetStatusFunc( 0 );
+ }
+ }
}
aLayoutItem.SetCommitLink( LINK( this, ScAppCfg, LayoutCommitHdl ) );
@@ -589,7 +623,7 @@ ScAppCfg::ScAppCfg() :
pValues[nProp] <<= (sal_Int32) GetAppMetric();
break;
case SCLAYOUTOPT_STATUSBAR:
- pValues[nProp] <<= (sal_Int32) GetStatusFunc();
+ pValues[nProp] <<= lcl_ConvertStatusBarFuncSetToSingle( GetStatusFunc() );
break;
case SCLAYOUTOPT_ZOOMVAL:
pValues[nProp] <<= (sal_Int32) GetZoom();
@@ -600,6 +634,9 @@ ScAppCfg::ScAppCfg() :
case SCLAYOUTOPT_SYNCZOOM:
ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetSynchronizeZoom() );
break;
+ case SCLAYOUTOPT_STATUSBARMULTI:
+ pValues[nProp] <<= GetStatusFunc();
+ break;
}
}
aLayoutItem.PutProperties(aNames, aValues);
diff --git a/sc/source/ui/app/scmod.cxx b/sc/source/ui/app/scmod.cxx
index f9afa31e9ddf..c385bbe7c9df 100644
--- a/sc/source/ui/app/scmod.cxx
+++ b/sc/source/ui/app/scmod.cxx
@@ -468,8 +468,8 @@ void ScModule::Execute( SfxRequest& rReq )
if (pReqArgs)
{
auto const & p = pReqArgs->Get(SID_PSZ_FUNCTION);
- OSL_ENSURE(dynamic_cast<const SfxUInt16Item*>(&p) != nullptr,"wrong Parameter");
- const SfxUInt16Item& rItem = static_cast<const SfxUInt16Item&>(p);
+ OSL_ENSURE(dynamic_cast<const SfxUInt32Item*>(&p) != nullptr,"wrong Parameter");
+ const SfxUInt32Item& rItem = static_cast<const SfxUInt32Item&>(p);
ScAppOptions aNewOpts( GetAppOptions() );
aNewOpts.SetStatusFunc( rItem.GetValue() );
@@ -585,7 +585,7 @@ void ScModule::GetState( SfxItemSet& rSet )
rSet.Put( SfxBoolItem( nWhich, GetAppOptions().GetDetectiveAuto() ) );
break;
case SID_PSZ_FUNCTION:
- rSet.Put( SfxUInt16Item( nWhich, GetAppOptions().GetStatusFunc() ) );
+ rSet.Put( SfxUInt32Item( nWhich, GetAppOptions().GetStatusFunc() ) );
break;
case SID_ATTR_METRIC:
rSet.Put( SfxUInt16Item( nWhich, sal::static_int_cast<sal_uInt16>(GetAppOptions().GetAppMetric()) ) );
diff --git a/sc/source/ui/view/tabvwsha.cxx b/sc/source/ui/view/tabvwsha.cxx
index 513c735af81d..dd55e5224924 100644
--- a/sc/source/ui/view/tabvwsha.cxx
+++ b/sc/source/ui/view/tabvwsha.cxx
@@ -66,75 +66,86 @@ bool ScTabViewShell::GetFunction( OUString& rFuncStr, sal_uInt16 nErrCode )
{
OUString aStr;
- ScSubTotalFunc eFunc = (ScSubTotalFunc) SC_MOD()->GetAppOptions().GetStatusFunc();
+ sal_uInt32 nFuncs = SC_MOD()->GetAppOptions().GetStatusFunc();
ScViewData& rViewData = GetViewData();
ScMarkData& rMark = rViewData.GetMarkData();
bool bIgnoreError = (rMark.IsMarked() || rMark.IsMultiMarked());
+ bool bFirst = true;
+ for ( sal_uInt16 nFunc = 0; nFunc < 32; nFunc++ )
+ {
+ if ( !(nFuncs & (1 << nFunc)) )
+ continue;
+ ScSubTotalFunc eFunc = (ScSubTotalFunc)nFunc;
- if (bIgnoreError && (eFunc == SUBTOTAL_FUNC_CNT || eFunc == SUBTOTAL_FUNC_CNT2))
- nErrCode = 0;
+ if (bIgnoreError && (eFunc == SUBTOTAL_FUNC_CNT || eFunc == SUBTOTAL_FUNC_CNT2))
+ nErrCode = 0;
- if (nErrCode)
- {
- rFuncStr = ScGlobal::GetLongErrorString(nErrCode);
- return true;
- }
+ if (nErrCode)
+ {
+ rFuncStr = ScGlobal::GetLongErrorString(nErrCode);
+ return true;
+ }
- sal_uInt16 nGlobStrId = 0;
- switch (eFunc)
- {
- case SUBTOTAL_FUNC_AVE: nGlobStrId = STR_FUN_TEXT_AVG; break;
- case SUBTOTAL_FUNC_CNT: nGlobStrId = STR_FUN_TEXT_COUNT; break;
- case SUBTOTAL_FUNC_CNT2: nGlobStrId = STR_FUN_TEXT_COUNT2; break;
- case SUBTOTAL_FUNC_MAX: nGlobStrId = STR_FUN_TEXT_MAX; break;
- case SUBTOTAL_FUNC_MIN: nGlobStrId = STR_FUN_TEXT_MIN; break;
- case SUBTOTAL_FUNC_SUM: nGlobStrId = STR_FUN_TEXT_SUM; break;
- case SUBTOTAL_FUNC_SELECTION_COUNT: nGlobStrId = STR_FUN_TEXT_SELECTION_COUNT; break;
-
- default:
+ sal_uInt16 nGlobStrId = 0;
+ switch (eFunc)
{
- // added to avoid warnings
+ case SUBTOTAL_FUNC_AVE: nGlobStrId = STR_FUN_TEXT_AVG; break;
+ case SUBTOTAL_FUNC_CNT: nGlobStrId = STR_FUN_TEXT_COUNT; break;
+ case SUBTOTAL_FUNC_CNT2: nGlobStrId = STR_FUN_TEXT_COUNT2; break;
+ case SUBTOTAL_FUNC_MAX: nGlobStrId = STR_FUN_TEXT_MAX; break;
+ case SUBTOTAL_FUNC_MIN: nGlobStrId = STR_FUN_TEXT_MIN; break;
+ case SUBTOTAL_FUNC_SUM: nGlobStrId = STR_FUN_TEXT_SUM; break;
+ case SUBTOTAL_FUNC_SELECTION_COUNT: nGlobStrId = STR_FUN_TEXT_SELECTION_COUNT; break;
+
+ default:
+ {
+ // added to avoid warnings
+ }
}
- }
- if (nGlobStrId)
- {
- ScDocument* pDoc = rViewData.GetDocument();
- SCCOL nPosX = rViewData.GetCurX();
- SCROW nPosY = rViewData.GetCurY();
- SCTAB nTab = rViewData.GetTabNo();
+ if (nGlobStrId)
+ {
+ ScDocument* pDoc = rViewData.GetDocument();
+ SCCOL nPosX = rViewData.GetCurX();
+ SCROW nPosY = rViewData.GetCurY();
+ SCTAB nTab = rViewData.GetTabNo();
- aStr = ScGlobal::GetRscString(nGlobStrId);
- aStr += "=";
+ aStr = ScGlobal::GetRscString(nGlobStrId);
+ aStr += "=";
- ScAddress aCursor( nPosX, nPosY, nTab );
- double nVal;
- if ( pDoc->GetSelectionFunction( eFunc, aCursor, rMark, nVal ) )
- {
- if ( nVal == 0.0 )
- aStr += "0";
- else
+ ScAddress aCursor( nPosX, nPosY, nTab );
+ double nVal;
+ if ( pDoc->GetSelectionFunction( eFunc, aCursor, rMark, nVal ) )
{
- // Number in the standard format, the other on the cursor position
- SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
- sal_uInt32 nNumFmt = 0;
- if ( eFunc != SUBTOTAL_FUNC_CNT && eFunc != SUBTOTAL_FUNC_CNT2 && eFunc != SUBTOTAL_FUNC_SELECTION_COUNT)
+ if ( nVal == 0.0 )
+ aStr += "0";
+ else
{
- // number format from attributes or formula
- pDoc->GetNumberFormat( nPosX, nPosY, nTab, nNumFmt );
- }
+ // Number in the standard format, the other on the cursor position
+ SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
+ sal_uInt32 nNumFmt = 0;
+ if ( eFunc != SUBTOTAL_FUNC_CNT && eFunc != SUBTOTAL_FUNC_CNT2 && eFunc != SUBTOTAL_FUNC_SELECTION_COUNT)
+ {
+ // number format from attributes or formula
+ pDoc->GetNumberFormat( nPosX, nPosY, nTab, nNumFmt );
+ }
- OUString aValStr;
- Color* pDummy;
- pFormatter->GetOutputString( nVal, nNumFmt, aValStr, &pDummy );
- aStr += aValStr;
+ OUString aValStr;
+ Color* pDummy;
+ pFormatter->GetOutputString( nVal, nNumFmt, aValStr, &pDummy );
+ aStr += aValStr;
+ }
+ }
+ if ( bFirst )
+ {
+ rFuncStr += aStr;
+ bFirst = false;
}
+ else
+ rFuncStr += (";" + aStr);
}
-
- rFuncStr = aStr;
- return true;
}
- return false;
+ return !rFuncStr.isEmpty();
}
// Functions that are disabled, depending on the selection
diff --git a/svx/source/stbctrls/pszctrl.cxx b/svx/source/stbctrls/pszctrl.cxx
index 861efa122a1a..e05c21a7af76 100644
--- a/svx/source/stbctrls/pszctrl.cxx
+++ b/svx/source/stbctrls/pszctrl.cxx
@@ -92,29 +92,39 @@ SFX_IMPL_STATUSBAR_CONTROL(SvxPosSizeStatusBarControl, SvxSizeItem);
class FunctionPopup_Impl : public PopupMenu
{
public:
- explicit FunctionPopup_Impl( sal_uInt16 nCheck );
+ explicit FunctionPopup_Impl( sal_uInt32 nCheckEncoded );
- sal_uInt16 GetSelected() const { return nSelected; }
+ sal_uInt32 GetSelected() const { return nSelected; }
private:
- sal_uInt16 nSelected;
+ sal_uInt32 nSelected;
virtual void Select() override;
};
-FunctionPopup_Impl::FunctionPopup_Impl( sal_uInt16 nCheck ) :
+FunctionPopup_Impl::FunctionPopup_Impl( sal_uInt32 nCheckEncoded ) :
PopupMenu( ResId( RID_SVXMNU_PSZ_FUNC, DIALOG_MGR() ) ),
- nSelected( 0 )
+ nSelected( nCheckEncoded )
{
- if (nCheck)
- CheckItem( nCheck );
+ for ( sal_uInt16 nCheck = 1; nCheck < 32; ++nCheck )
+ if ( nCheckEncoded & (1 << nCheck) )
+ CheckItem( nCheck );
}
void FunctionPopup_Impl::Select()
{
- nSelected = GetCurItemId();
+ sal_uInt16 nCurItemId = GetCurItemId();
+ if ( nCurItemId == PSZ_FUNC_NONE )
+ nSelected = ( 1 << PSZ_FUNC_NONE );
+ else
+ {
+ nSelected &= (~( 1 << PSZ_FUNC_NONE )); // Clear the "None" bit
+ nSelected ^= ( 1 << nCurItemId ); // Toggle the bit corresponding to nCurItemId
+ if ( !nSelected )
+ nSelected = ( 1 << PSZ_FUNC_NONE );
+ }
}
struct SvxPosSizeStatusBarControl_Impl
@@ -137,7 +147,7 @@ struct SvxPosSizeStatusBarControl_Impl
bool bSize; // set size ?
bool bTable; // set table index ?
bool bHasMenu; // set StarCalc popup menu ?
- sal_uInt16 nFunction; // the selected StarCalc function
+ sal_uInt32 nFunctionSet; // the selected StarCalc functions encoded in 32 bits
Image aPosImage; // Image to show the position
Image aSizeImage; // Image to show the size
};
@@ -163,7 +173,7 @@ SvxPosSizeStatusBarControl::SvxPosSizeStatusBarControl( sal_uInt16 _nSlotId,
pImp->bSize = false;
pImp->bTable = false;
pImp->bHasMenu = false;
- pImp->nFunction = 0;
+ pImp->nFunctionSet = 0;
pImp->aPosImage = Image( ResId( RID_SVXBMP_POSITION, DIALOG_MGR() ) );
pImp->aSizeImage = Image( ResId( RID_SVXBMP_SIZE, DIALOG_MGR() ) );
@@ -232,8 +242,8 @@ void SvxPosSizeStatusBarControl::StateChanged( sal_uInt16 nSID, SfxItemState eSt
if ( eState == SfxItemState::DEFAULT )
{
pImp->bHasMenu = true;
- if ( pState && dynamic_cast< const SfxUInt16Item* >(pState) != nullptr )
- pImp->nFunction = static_cast<const SfxUInt16Item*>(pState)->GetValue();
+ if ( pState && dynamic_cast< const SfxUInt32Item* >(pState) != nullptr )
+ pImp->nFunctionSet = static_cast<const SfxUInt32Item*>(pState)->GetValue();
}
else
pImp->bHasMenu = false;
@@ -305,20 +315,20 @@ void SvxPosSizeStatusBarControl::Command( const CommandEvent& rCEvt )
{
if ( rCEvt.GetCommand() == CommandEventId::ContextMenu && pImp->bHasMenu )
{
- sal_uInt16 nSelect = pImp->nFunction;
+ sal_uInt32 nSelect = pImp->nFunctionSet;
if (!nSelect)
- nSelect = PSZ_FUNC_NONE;
+ nSelect = ( 1 << PSZ_FUNC_NONE );
FunctionPopup_Impl aMenu( nSelect );
if ( aMenu.Execute( &GetStatusBar(), rCEvt.GetMousePosPixel() ) )
{
nSelect = aMenu.GetSelected();
if (nSelect)
{
- if (nSelect == PSZ_FUNC_NONE)
+ if (nSelect == (1 << PSZ_FUNC_NONE))
nSelect = 0;
css::uno::Any a;
- SfxUInt16Item aItem( SID_PSZ_FUNCTION, nSelect );
+ SfxUInt32Item aItem( SID_PSZ_FUNCTION, nSelect );
css::uno::Sequence< css::beans::PropertyValue > aArgs( 1 );
aArgs[0].Name = "StatusBarFunc";
@@ -408,5 +418,4 @@ void SvxPosSizeStatusBarControl::Paint( const UserDrawEvent& rUsrEvt )
pDev->SetFillColor( aOldFillColor );
}
-
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */