tdf#162286 Add a category to store favorite functions in FW

Change-Id: Iec0d169570ba3d29501a4917d8858a9e9438f608
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171828
Tested-by: Jenkins
Reviewed-by: Heiko Tietze <heiko.tietze@documentfoundation.org>
This commit is contained in:
AhmedHamed
2025-01-09 15:51:09 +01:00
committed by Heiko Tietze
parent 50524481b3
commit dc77629b31
24 changed files with 331 additions and 43 deletions
+2
View File
@@ -15,5 +15,7 @@ inline constexpr OUString BMP_STR_ERROR = u"formula/res/faperror.png"_ustr;
inline constexpr OUString RID_BMP_REFBTN1 = u"formula/res/refinp1.png"_ustr;
inline constexpr OUString RID_BMP_REFBTN2 = u"formula/res/refinp2.png"_ustr;
inline constexpr OUString BMP_FX = u"formula/res/fx.png"_ustr;
inline constexpr OUString BMP_STAR_EMPTY = u"sc/res/icon-set-stars-empty.png"_ustr;
inline constexpr OUString BMP_STAR_FULL = u"sc/res/icon-set-stars-full.png"_ustr;
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
+2
View File
@@ -29,5 +29,7 @@
#define STR_END NC_("STR_END", "~End")
#define RID_STR_SHRINK NC_("RID_STR_SHRINK", "Shrink")
#define RID_STR_EXPAND NC_("RID_STR_EXPAND", "Expand")
#define FAV_ENABLED NC_("FAV_ENABLED", "Add or remove function from favourites")
#define FAV_DISABLED NC_("FAV_DISABLED", "Extention functions can not be added to favourites")
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+52 -12
View File
@@ -45,11 +45,13 @@
#include <com/sun/star/sheet/FormulaMapGroupSpecialOffset.hpp>
#include <com/sun/star/sheet/XFormulaOpCodeMapper.hpp>
#include <com/sun/star/sheet/XFormulaParser.hpp>
#include <bitmaps.hlst>
#include <map>
// For tab page
#define TOKEN_OPEN 0
#define TOKEN_CLOSE 1
namespace formula
{
@@ -117,6 +119,7 @@ public:
DECL_LINK( FormulaHdl, weld::TextView&, void);
DECL_LINK( FormulaCursorHdl, weld::TextView&, void );
DECL_LINK( BtnHdl, weld::Button&, void );
DECL_LINK( FavToggleHdl, weld::Button&, void );
DECL_LINK( DblClkHdl, FuncPage&, void );
DECL_LINK( FuncSelHdl, FuncPage&, void );
DECL_LINK( StructSelHdl, StructPage&, void );
@@ -167,6 +170,8 @@ public:
std::unique_ptr<weld::Label> m_xFtFuncName;
std::unique_ptr<weld::Label> m_xFtFuncDesc;
std::unique_ptr<weld::Button> m_xBtnFavorites;
std::unique_ptr<weld::Label> m_xFtEditName;
std::unique_ptr<weld::Label> m_xFtResult;
@@ -230,6 +235,7 @@ FormulaDlg_Impl::FormulaDlg_Impl(weld::Dialog& rDialog,
, m_xFtHeadLine(rBuilder.weld_label(u"headline"_ustr))
, m_xFtFuncName(rBuilder.weld_label(u"funcname"_ustr))
, m_xFtFuncDesc(rBuilder.weld_label(u"funcdesc"_ustr))
, m_xBtnFavorites(rBuilder.weld_button(u"favorites"_ustr))
, m_xFtEditName(rBuilder.weld_label(u"editname"_ustr))
, m_xFtResult(rBuilder.weld_label(u"label2"_ustr))
, m_xWndResult(rBuilder.weld_entry(u"result"_ustr))
@@ -287,6 +293,9 @@ FormulaDlg_Impl::FormulaDlg_Impl(weld::Dialog& rDialog,
m_aOldHelp = m_rDialog.get_help_id(); // HelpId from resource always for "Page 1"
m_xBtnFavorites->connect_clicked(LINK(this, FormulaDlg_Impl, FavToggleHdl));
m_xBtnFavorites->hide();
m_xFtResult->set_visible( _bSupportResult );
m_xWndResult->set_visible( _bSupportResult );
@@ -863,6 +872,7 @@ void FormulaDlg_Impl::FillControls( bool &rbNext, bool &rbPrev)
const bool bTestFlag = (pOldFuncDesc != m_pFuncDesc);
if (bTestFlag)
{
m_xBtnFavorites->hide();
m_xFtHeadLine->hide();
m_xFtFuncName->hide();
m_xFtFuncDesc->hide();
@@ -965,6 +975,7 @@ void FormulaDlg_Impl::ClearAllParas()
m_xParaWinBox->hide();
m_xBtnForward->set_sensitive(true); //@new
m_xBtnFavorites->show();
m_xFtHeadLine->show();
m_xFtFuncName->show();
m_xFtFuncDesc->show();
@@ -1058,6 +1069,27 @@ IMPL_LINK(FormulaDlg_Impl, BtnHdl, weld::Button&, rBtn, void)
}
}
IMPL_LINK_NOARG(FormulaDlg_Impl, FavToggleHdl, weld::Button&, void)
{
const IFunctionDescription* pDesc = m_xFuncPage->GetFuncDesc();
if (!pDesc)
return;
if (m_xFuncPage->IsFavourite(m_xFuncPage->GetFuncIndex()))
{
m_pHelper->insertOrEraseFavouritesListEntry(pDesc, false);
m_xBtnFavorites->set_from_icon_name(BMP_STAR_EMPTY);
}
else
{
m_pHelper->insertOrEraseFavouritesListEntry(pDesc, true);
m_xBtnFavorites->set_from_icon_name(BMP_STAR_FULL);
}
m_xFuncPage->UpdateFavouritesList();
if (m_xFuncPage->GetCategory() == FAVOURITES_CATEGORY)
m_xFuncPage->UpdateFunctionList(u""_ustr);
}
// Functions for 1. Page
// Handler for Listboxes
@@ -1667,23 +1699,25 @@ IMPL_LINK_NOARG( FormulaDlg_Impl, MatrixHdl, weld::Toggleable&, void)
IMPL_LINK_NOARG( FormulaDlg_Impl, FuncSelHdl, FuncPage&, void)
{
if ( (m_xFuncPage->GetFunctionEntryCount() > 0)
&& (m_xFuncPage->GetFunction() != -1) )
{
const IFunctionDescription* pDesc = m_xFuncPage->GetFuncDesc();
const IFunctionDescription* pDesc = m_xFuncPage->GetFuncDesc();
const sal_uInt16 nFIndex = m_xFuncPage->GetFuncIndex();
m_xBtnFavorites->set_sensitive(true);
if (pDesc)
{
if (pDesc != m_pFuncDesc)
m_xBtnForward->set_sensitive(true); //new
if (pDesc)
{
pDesc->initArgumentInfo(); // full argument info is needed
pDesc->initArgumentInfo(); // full argument info is needed
OUString aSig = pDesc->getSignature();
m_xFtHeadLine->set_label( pDesc->getFunctionName() );
m_xFtFuncName->set_label( aSig );
m_xFtFuncDesc->set_label( pDesc->getDescription() );
OUString aSig = pDesc->getSignature();
m_xFtHeadLine->set_label( pDesc->getFunctionName() );
m_xFtFuncName->set_label( aSig );
m_xFtFuncDesc->set_label( pDesc->getDescription() );
}
if (m_xFuncPage->IsFavourite(nFIndex))
m_xBtnFavorites->set_from_icon_name(BMP_STAR_FULL);
else
m_xBtnFavorites->set_from_icon_name(BMP_STAR_EMPTY);
}
else
{
@@ -1691,6 +1725,12 @@ IMPL_LINK_NOARG( FormulaDlg_Impl, FuncSelHdl, FuncPage&, void)
m_xFtFuncName->set_label( OUString() );
m_xFtFuncDesc->set_label( OUString() );
}
m_xBtnFavorites->set_visible(m_xFtHeadLine->is_visible()
&& m_xFtHeadLine->get_label() != u""_ustr);
m_xBtnFavorites->set_sensitive(nFIndex != 0);
m_xBtnFavorites->set_tooltip_text(nFIndex == 0 ? ForResId(FAV_DISABLED)
: ForResId(FAV_ENABLED));
}
void FormulaDlg_Impl::UpdateParaWin( const Selection& _rSelection, const OUString& _sRefStr)
+53 -9
View File
@@ -40,7 +40,7 @@ IMPL_LINK(FuncPage, KeyInputHdl, const KeyEvent&, rKEvt, bool)
}
// tdf#104487 - remember last used function category - set default to All category
sal_Int32 FuncPage::m_nRememberedFunctionCategory = 1;
sal_Int32 FuncPage::m_nRememberedFunctionCategory = ALL_CATEGORY;
FuncPage::FuncPage(weld::Container* pParent, const IFunctionManager* _pFunctionManager)
: m_xBuilder(Application::CreateBuilder(pParent, u"formula/ui/functionpage.ui"_ustr))
@@ -56,6 +56,7 @@ FuncPage::FuncPage(weld::Container* pParent, const IFunctionManager* _pFunctionM
m_aHelpId = m_xLbFunction->get_help_id();
m_pFunctionManager->fillLastRecentlyUsedFunctions(aLRUList);
m_pFunctionManager->fillFavouriteFunctions(aFavouritesList);
const sal_uInt32 nCategoryCount = m_pFunctionManager->getCount();
for (sal_uInt32 j = 0; j < nCategoryCount; ++j)
@@ -100,6 +101,24 @@ weld::TreeIter* FuncPage::FillCategoriesMap(const OUString& aCategory, bool bFil
return mCategories[aCategory].get();
}
bool FuncPage::IsFavourite(sal_uInt16 nFIndex) const
{
return aFavouritesList.find(nFIndex) != aFavouritesList.end();
}
bool FuncPage::UpdateFavouritesList()
{
sal_uInt16 nFIndex = GetFuncIndex();
if (nFIndex == 0)
return false;
if (IsFavourite(nFIndex))
aFavouritesList.erase(nFIndex);
else
aFavouritesList.insert(nFIndex);
return true;
}
void FuncPage::impl_addFunctions(const IFunctionCategory* _pCategory, bool bFillCategories)
{
weld::TreeIter* pCategoryIter = FillCategoriesMap(_pCategory->getName(), bFillCategories);
@@ -141,17 +160,17 @@ void FuncPage::UpdateFunctionList(const OUString& aStr)
sFuncScores.clear();
const sal_Int32 nSelPos = m_xLbCategory->get_active();
bool bCollapse = nSelPos == 1;
bool bCollapse = nSelPos == ALL_CATEGORY;
bool bFilter = !aStr.isEmpty();
// tdf#104487 - remember last used function category
m_nRememberedFunctionCategory = nSelPos;
if (!bFilter || nSelPos == 0)
if (!bFilter || nSelPos == LRU_CATEGORY || nSelPos == FAVOURITES_CATEGORY)
{
const IFunctionCategory* pCategory
= weld::fromId<const IFunctionCategory*>(m_xLbCategory->get_id(nSelPos));
if (nSelPos > 0)
if (nSelPos >= ALL_CATEGORY)
{
if (pCategory == nullptr)
{
@@ -166,7 +185,7 @@ void FuncPage::UpdateFunctionList(const OUString& aStr)
impl_addFunctions(pCategory, false);
}
}
else // LRU-List
else if (nSelPos == LRU_CATEGORY) // LRU-List
{
for (auto const& elem : aLRUList)
{
@@ -180,6 +199,24 @@ void FuncPage::UpdateFunctionList(const OUString& aStr)
}
}
}
else // Favourites-List
{
for (const auto& elem : aFavouritesList)
{
if (m_pFunctionManager->Get(elem))
{
TFunctionDesc pDesc(m_pFunctionManager->Get(elem));
if (pDesc && !pDesc->isHidden())
{
OUString aFunction(pDesc->getFunctionName());
OUString sId(weld::toId(pDesc));
m_xLbFunction->insert(nullptr, -1, &aFunction, &sId, nullptr, nullptr,
false, m_xScratchIter.get());
}
}
}
}
}
else
{
@@ -249,11 +286,12 @@ void FuncPage::UpdateFunctionList(const OUString& aStr)
IMPL_LINK_NOARG(FuncPage, SelComboBoxHdl, weld::ComboBox&, void)
{
if (m_xLbCategory->get_active() == 0)
if (m_xLbCategory->get_active() == LRU_CATEGORY
|| m_xLbCategory->get_active() == FAVOURITES_CATEGORY)
m_xLbFunctionSearchString->set_text(u""_ustr);
m_xHelpButton->set_sensitive(false);
OUString searchStr = m_xLbFunctionSearchString->get_text();
m_xLbFunction->set_help_id(m_aHelpId);
OUString searchStr = m_xLbFunctionSearchString->get_text();
UpdateFunctionList(searchStr);
}
@@ -290,9 +328,10 @@ IMPL_LINK_NOARG(FuncPage, DblClkHdl, weld::TreeView&, bool)
IMPL_LINK_NOARG(FuncPage, ModifyHdl, weld::Entry&, void)
{
if (m_xLbCategory->get_active() == 0)
if (m_xLbCategory->get_active() == LRU_CATEGORY
|| m_xLbCategory->get_active() == FAVOURITES_CATEGORY)
{
m_xLbCategory->set_active(1);
m_xLbCategory->set_active(ALL_CATEGORY);
m_xHelpButton->set_sensitive(false);
}
OUString searchStr = m_xLbFunctionSearchString->get_text();
@@ -354,6 +393,11 @@ sal_Int32 FuncPage::GetFunctionEntryCount() const { return m_xLbFunction->n_chil
OUString FuncPage::GetSelFunctionName() const { return m_xLbFunction->get_selected_text(); }
sal_uInt16 FuncPage::GetFuncIndex() const
{
return m_pFunctionManager->getFunctionIndex(GetFuncDesc());
}
const IFunctionDescription* FuncPage::GetFuncDesc() const
{
if (GetFunction() == -1)
+8 -2
View File
@@ -23,6 +23,7 @@
#include <vector>
#include <set>
#include <unordered_map>
#include <unordered_set>
namespace formula
{
@@ -51,6 +52,7 @@ private:
const IFunctionManager* m_pFunctionManager;
::std::vector< TFunctionDesc > aLRUList;
::std::unordered_set<sal_uInt16> aFavouritesList;
::std::unordered_map<OUString, std::unique_ptr<weld::TreeIter>> mCategories;
::std::set<std::pair<std::pair<sal_Int32, sal_Int32>, std::pair<OUString, TFunctionDesc>>>
sFuncScores;
@@ -70,8 +72,6 @@ private:
DECL_LINK(SelHelpClickHdl, weld::Button&, void);
DECL_LINK(SimilarityToggleHdl, weld::Toggleable&, void);
void UpdateFunctionList(const OUString&);
public:
FuncPage(weld::Container* pContainer, const IFunctionManager* _pFunctionManager);
@@ -91,6 +91,7 @@ public:
sal_Int32 GetFuncPos(const IFunctionDescription* _pDesc);
const IFunctionDescription* GetFuncDesc() const;
OUString GetSelFunctionName() const;
sal_uInt16 GetFuncIndex() const;
void SetDoubleClickHdl( const Link<FuncPage&,void>& rLink ) { aDoubleClickLink = rLink; }
@@ -98,6 +99,11 @@ public:
bool IsVisible() const { return m_xContainer->get_visible(); }
bool IsFavourite(sal_uInt16) const;
bool UpdateFavouritesList();
void UpdateFunctionList(const OUString&);
void SearchFunction(const OUString&, const OUString&, TFunctionDesc, const bool);
};
+45 -8
View File
@@ -183,7 +183,7 @@
</object>
<packing>
<property name="resize">False</property>
<property name="shrink">True</property>
<property name="shrink">False</property>
</packing>
</child>
<child>
@@ -285,18 +285,55 @@
<property name="vexpand">True</property>
<property name="row-spacing">12</property>
<child>
<object class="GtkLabel" id="headline">
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="hexpand">True</property>
<property name="wrap">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
<property name="vexpand">False</property>
<property name="orientation">horizontal</property>
<property name="spacing">2</property>
<child>
<object class="GtkButton" id="favorites">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="tooltip-text" translatable="yes" context="formuladialog|favorites|tooltip_text">Add or remove function from favourites</property>
<property name="hexpand">False</property>
<property name="vexpand">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="relief">none</property>
<property name="border-width">6</property>
<property name="focus-on-click">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="headline">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="hexpand">True</property>
<property name="wrap">True</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
+1
View File
@@ -93,6 +93,7 @@
<property name="can-focus">False</property>
<items>
<item translatable="yes" context="functionpage|category">Last Used</item>
<item translatable="yes" context="functionpage|category">Favourites</item>
<item translatable="yes" context="functionpage|category">All</item>
</items>
<child internal-child="accessible">
+12
View File
@@ -22,12 +22,18 @@
#include <memory>
#include <vector>
#include <unordered_set>
#include <unordered_map>
#include <com/sun/star/table/CellAddress.hpp>
#include <com/sun/star/uno/Reference.hxx>
#include <rtl/ustring.hxx>
#include <sal/types.h>
#define LRU_CATEGORY 0
#define FAVOURITES_CATEGORY 1
#define ALL_CATEGORY 2
namespace com::sun::star {
namespace sheet { struct FormulaToken; }
namespace sheet { class XFormulaOpCodeMapper; }
@@ -57,13 +63,18 @@ namespace formula
eTableRefOpen,
eTableRefClose
};
virtual const IFunctionDescription* Get(sal_uInt16 nFIndex) const = 0;
virtual sal_uInt32 getCount() const = 0;
virtual const IFunctionCategory* getCategory(sal_uInt32 nPos) const = 0;
virtual sal_uInt16 getFunctionIndex(const IFunctionDescription* _pDesc) const = 0;
virtual void fillLastRecentlyUsedFunctions(::std::vector< const IFunctionDescription*>& _rLastRUFunctions) const = 0;
virtual void fillFavouriteFunctions(::std::unordered_set<sal_uInt16>& rFavouriteFunctions) const = 0;
virtual sal_Unicode getSingleToken(const EToken _eToken) const = 0;
protected:
bool changeFavouriteList;
~IFunctionManager() {}
};
@@ -150,6 +161,7 @@ namespace formula
virtual void dispatch(bool _bOK, bool _bMatrixChecked) = 0;
virtual void doClose(bool _bOk) = 0;
virtual void insertEntryToLRUList(const IFunctionDescription* pDesc) = 0;
virtual void insertOrEraseFavouritesListEntry(const IFunctionDescription* pDesc, bool bInsert) = 0;
virtual void showReference(const OUString& _sFormula) = 0;
protected:
@@ -762,6 +762,13 @@
</constraints>
<value>224 226 222 223 6</value>
</prop>
<prop oor:name="FavouriteFunctions" oor:type="oor:int-list" oor:nillable="false">
<info>
<desc>Specifies the favourite functions.</desc>
<label>Favourite Functions</label>
</info>
<value></value>
</prop>
<prop oor:name="AutoInput" oor:type="xs:boolean" oor:nillable="false">
<!-- UIHints: Tools Cell Contents AutoInput -->
<info>
+3
View File
@@ -126,6 +126,9 @@ void FormulaDialog::doClose(bool _bOk)
void FormulaDialog::insertEntryToLRUList(const IFunctionDescription* /*_pDesc*/)
{
}
void FormulaDialog::insertOrEraseFavouritesListEntry(const IFunctionDescription* /*_pDesc*/, bool)
{
}
void FormulaDialog::showReference(const OUString& /*_sFormula*/)
{
}
+1
View File
@@ -77,6 +77,7 @@ public:
virtual std::unique_ptr<formula::FormulaCompiler> createCompiler( formula::FormulaTokenArray& rArray ) const override;
virtual void doClose(bool _bOk) override;
virtual void insertEntryToLRUList(const formula::IFunctionDescription* pDesc) override;
virtual void insertOrEraseFavouritesListEntry(const formula::IFunctionDescription* pDesc, bool bInsert) override;
virtual void showReference(const OUString& _sFormula) override;
virtual void dispatch(bool _bOK, bool _bMatrixChecked) override;
virtual void setDispatcherLock( bool bLock ) override;
@@ -45,9 +45,12 @@ class FunctionManager : public formula::IFunctionManager
public:
FunctionManager(css::uno::Reference< css::report::meta::XFunctionManager> _xMgr);
virtual ~FunctionManager();
virtual const formula::IFunctionDescription* Get(sal_uInt16 nFIndex) const override;
virtual sal_uInt32 getCount() const override;
virtual const formula::IFunctionCategory* getCategory(sal_uInt32 nPos) const override;
virtual sal_uInt16 getFunctionIndex(const formula::IFunctionDescription* _pDesc) const override;
virtual void fillLastRecentlyUsedFunctions(::std::vector< const formula::IFunctionDescription*>& _rLastRUFunctions) const override;
virtual void fillFavouriteFunctions(::std::unordered_set<sal_uInt16>& rFavouriteFunctions) const override;
virtual sal_Unicode getSingleToken(const EToken _eToken) const override;
std::shared_ptr< FunctionDescription > get(const css::uno::Reference< css::report::meta::XFunctionDescription>& _xFunctionDescription) const;
@@ -59,6 +59,11 @@ sal_Unicode FunctionManager::getSingleToken(const formula::IFunctionManager::ETo
return 0;
}
const formula::IFunctionDescription* FunctionManager::Get(sal_uInt16 /*nFIndex*/) const
{
return nullptr;
}
sal_uInt32 FunctionManager::getCount() const
{
return m_xMgr->getCount();
@@ -75,10 +80,19 @@ const formula::IFunctionCategory* FunctionManager::getCategory(sal_uInt32 _nPos)
return m_aCategoryIndex[_nPos]->second.get();
}
sal_uInt16 FunctionManager::getFunctionIndex(const formula::IFunctionDescription* /*_pDesc*/) const
{
return 0;
}
void FunctionManager::fillLastRecentlyUsedFunctions(::std::vector< const formula::IFunctionDescription*>& /*_rLastRUFunctions*/) const
{
}
void FunctionManager::fillFavouriteFunctions(::std::unordered_set<sal_uInt16>& /*rFavouriteFunctions*/) const
{
}
std::shared_ptr< FunctionDescription > FunctionManager::get(const uno::Reference< report::meta::XFunctionDescription>& _xFunctionDescription) const
{
std::shared_ptr< FunctionDescription > pDesc;
+3
View File
@@ -48,6 +48,8 @@ public:
sal_uInt16* GetLRUFuncList() const { return pLRUList.get(); }
void SetLRUFuncList( const sal_uInt16* pList,
const sal_uInt16 nCount );
std::unordered_set<sal_uInt16> GetFavouritesList() const { return sFavouritesList; }
void SetFavouritesList(const std::unordered_set<sal_uInt16>& rList) { sFavouritesList = rList; }
void SetStatusFunc( sal_uInt32 nNew ) { nStatusFunc = nNew; }
sal_uInt32 GetStatusFunc() const { return nStatusFunc; }
void SetAutoComplete( bool bNew ) { bAutoComplete = bNew; }
@@ -87,6 +89,7 @@ private:
sal_uInt16 nLRUFuncCount;
std::unique_ptr<sal_uInt16[]>
pLRUList;
std::unordered_set<sal_uInt16> sFavouritesList;
SvxZoomType eZoomType;
sal_uInt16 nZoom;
bool bSynchronizeZoom;
+20 -1
View File
@@ -28,6 +28,7 @@
#include <rtl/ustring.hxx>
#include <optional>
#include <map>
#include <unordered_set>
#include <memory>
#define MAX_FUNCCAT 12 /* maximum number of categories for functions */
@@ -336,7 +337,7 @@ public:
@return pointer to function with the index nFIndex, null if no such function was found.
*/
const ScFuncDesc* Get( sal_uInt16 nFIndex ) const;
const formula::IFunctionDescription* Get( sal_uInt16 nFIndex ) const override;
/**
Returns the first function in category nCategory.
@@ -374,6 +375,16 @@ public:
*/
virtual const formula::IFunctionCategory* getCategory(sal_uInt32 nPos) const override;
/**
Returns the index of the function.
@param _pDesc
Pointer to function description
@return The index of the function if not null, 0 otherwise.
*/
virtual sal_uInt16 getFunctionIndex(const formula::IFunctionDescription* _pDesc) const override;
/**
Appends the last recently used functions.
@@ -384,6 +395,14 @@ public:
*/
virtual void fillLastRecentlyUsedFunctions(::std::vector< const formula::IFunctionDescription*>& _rLastRUFunctions) const override;
/**
Appends favourite functions to the given vector.
@param rFavouriteFunctions
a vector of pointer to IFunctionDescription, by reference.
*/
virtual void fillFavouriteFunctions(std::unordered_set<sal_uInt16>& rFavouriteFunctions) const override;
/**
Maps Etoken to character
+1
View File
@@ -173,6 +173,7 @@ public:
SC_DLLPUBLIC void SetInputOptions ( const ScInputOptions& rOpt );
void SetPrintOptions ( const ScPrintOptions& rOpt );
void InsertEntryToLRUList(sal_uInt16 nFIndex);
void InsertOrEraseFavouritesListEntry(sal_uInt16 nFIndex, bool bInsert);
static void GetSpellSettings( LanguageType& rDefLang, LanguageType& rCjkLang, LanguageType& rCtlLang );
static void SetAutoSpellProperty( bool bSet );
+14 -1
View File
@@ -1081,7 +1081,7 @@ ScFunctionMgr::~ScFunctionMgr()
}
const ScFuncDesc* ScFunctionMgr::Get( sal_uInt16 nFIndex ) const
const formula::IFunctionDescription* ScFunctionMgr::Get( sal_uInt16 nFIndex ) const
{
const ScFuncDesc* pDesc;
for (pDesc = First(); pDesc; pDesc = Next())
@@ -1137,6 +1137,12 @@ const formula::IFunctionCategory* ScFunctionMgr::getCategory(sal_uInt32 nCategor
return nullptr;
}
sal_uInt16 ScFunctionMgr::getFunctionIndex(const formula::IFunctionDescription* _pDesc) const
{
const ScFuncDesc* pDesc = dynamic_cast<const ScFuncDesc*>(_pDesc);
return pDesc ? pDesc->nFIndex : 0;
}
void ScFunctionMgr::fillLastRecentlyUsedFunctions(::std::vector< const formula::IFunctionDescription*>& _rLastRUFunctions) const
{
const ScAppOptions& rAppOpt = ScModule::get()->GetAppOptions();
@@ -1153,6 +1159,13 @@ void ScFunctionMgr::fillLastRecentlyUsedFunctions(::std::vector< const formula::
}
}
void ScFunctionMgr::fillFavouriteFunctions(std::unordered_set<sal_uInt16>& rFavouriteFunctions) const
{
const ScAppOptions& rAppOpt = ScModule::get()->GetAppOptions();
rFavouriteFunctions.clear();
rFavouriteFunctions = rAppOpt.GetFavouritesList();
}
OUString ScFunctionMgr::GetCategoryName(sal_uInt32 _nCategoryNumber )
{
if (_nCategoryNumber >= SC_FUNCGROUP_COUNT)
+27 -2
View File
@@ -26,6 +26,7 @@
#include <miscuno.hxx>
#include <vector>
#include <osl/diagnose.h>
#include <comphelper/sequence.hxx>
using namespace utl;
using namespace com::sun::star::uno;
@@ -90,6 +91,7 @@ ScAppOptions& ScAppOptions::operator=( const ScAppOptions& rCpy )
bSynchronizeZoom = rCpy.bSynchronizeZoom;
nZoom = rCpy.nZoom;
SetLRUFuncList( rCpy.pLRUList.get(), rCpy.nLRUFuncCount );
SetFavouritesList(rCpy.sFavouritesList);
nStatusFunc = rCpy.nStatusFunc;
bAutoComplete = rCpy.bAutoComplete;
bDetectiveAuto = rCpy.bDetectiveAuto;
@@ -139,6 +141,11 @@ static void lcl_GetLastFunctions( Any& rDest, const ScAppOptions& rOpt )
rDest <<= Sequence<sal_Int32>(0); // empty
}
static void lcl_GetFavouriteFunctions(Any& rDest, const ScAppOptions& rOpt)
{
rDest <<= comphelper::containerToSequence<sal_Int32>(rOpt.GetFavouritesList());
}
static void lcl_GetSortList( Any& rDest )
{
const ScUserList& rUserList = ScGlobal::GetUserList();
@@ -162,8 +169,9 @@ constexpr OUStringLiteral CFGPATH_LAYOUT = u"Office.Calc/Layout";
constexpr OUStringLiteral CFGPATH_INPUT = u"Office.Calc/Input";
#define SCINPUTOPT_LASTFUNCS 0
#define SCINPUTOPT_AUTOINPUT 1
#define SCINPUTOPT_DET_AUTO 2
#define SCINPUTOPT_FAVOURITEFUNCS 1
#define SCINPUTOPT_AUTOINPUT 2
#define SCINPUTOPT_DET_AUTO 3
constexpr OUStringLiteral CFGPATH_REVISION = u"Office.Calc/Revision/Color";
@@ -225,6 +233,7 @@ Sequence<OUString> ScAppCfg::GetLayoutPropertyNames()
Sequence<OUString> ScAppCfg::GetInputPropertyNames()
{
return {u"LastFunctions"_ustr, // SCINPUTOPT_LASTFUNCS
u"FavouriteFunctions"_ustr, // SCINPUTOPT_FAVOURITEFUNCS
u"AutoInput"_ustr, // SCINPUTOPT_AUTOINPUT
u"DetectiveAuto"_ustr}; // SCINPUTOPT_DET_AUTO
}
@@ -363,6 +372,19 @@ void ScAppCfg::ReadInputCfg()
SetLRUFuncList(pUShorts.data(), nLRUCount);
}
}
if (Sequence<sal_Int32> aSeq; aValues[SCINPUTOPT_FAVOURITEFUNCS] >>= aSeq)
{
sal_Int32 nCount = aSeq.getLength();
if (nCount < SAL_MAX_UINT16)
{
sal_uInt16 nFavouritesCount = nCount;
std::unordered_set<sal_uInt16> sFavouriteFunctions;
for (sal_uInt16 i = 0; i < nFavouritesCount; ++i)
sFavouriteFunctions.insert(aSeq[i]);
SetFavouritesList(sFavouriteFunctions);
}
}
SetAutoComplete(ScUnoHelpFunctions::GetBoolFromAny(aValues[SCINPUTOPT_AUTOINPUT]));
SetDetectiveAuto(ScUnoHelpFunctions::GetBoolFromAny(aValues[SCINPUTOPT_DET_AUTO]));
}
@@ -515,6 +537,9 @@ IMPL_LINK_NOARG(ScAppCfg, InputCommitHdl, ScLinkConfigItem&, void)
case SCINPUTOPT_DET_AUTO:
pValues[nProp] <<= GetDetectiveAuto();
break;
case SCINPUTOPT_FAVOURITEFUNCS:
lcl_GetFavouriteFunctions(pValues[nProp], *this);
break;
}
}
aInputItem.PutProperties(aNames, aValues);
+15
View File
@@ -785,6 +785,21 @@ void ScModule::InsertEntryToLRUList(sal_uInt16 nFIndex)
SetAppOptions(aNewOpts);
}
void ScModule::InsertOrEraseFavouritesListEntry(sal_uInt16 nFIndex, bool bInsert)
{
const ScAppOptions& rAppOpt = GetAppOptions();
std::unordered_set<sal_uInt16> sFavouriteFunctions = rAppOpt.GetFavouritesList();
if (bInsert)
sFavouriteFunctions.insert(nFIndex);
else
sFavouriteFunctions.erase(nFIndex);
ScAppOptions aNewOpts(rAppOpt);
aNewOpts.SetFavouritesList(sFavouriteFunctions);
SetAppOptions(aNewOpts);
}
void ScModule::SetAppOptions( const ScAppOptions& rOpt )
{
if ( !m_pAppCfg )
+34 -8
View File
@@ -64,6 +64,7 @@ ScFunctionWin::ScFunctionWin(weld::Widget* pParent)
, pFuncDesc(nullptr)
{
InitLRUList();
UpdateFavouritesList();
nArgs=0;
m_aListHelpId = xFuncList->get_help_id();
@@ -141,6 +142,14 @@ void ScFunctionWin::InitLRUList()
UpdateFunctionList(u""_ustr);
}
void ScFunctionWin::UpdateFavouritesList()
{
ScFunctionMgr* pFuncMgr = ScGlobal::GetStarCalcFunctionMgr();
pFuncMgr->fillFavouriteFunctions(aFavouritesList);
if (xCatBox->get_active() == 0)
UpdateFunctionList(u""_ustr);
}
/*************************************************************************
#* Member: FillCategoriesMap
@@ -263,16 +272,16 @@ void ScFunctionWin::UpdateFunctionList(const OUString& rSearchString)
{
sal_Int32 nSelPos = xCatBox->get_active();
sal_Int32 nCategory = ( -1 != nSelPos )
? (nSelPos-1) : 0;
? (nSelPos-ALL_CATEGORY) : 0;
xFuncList->clear();
xFuncList->freeze();
mCategories.clear();
sFuncScores.clear();
bool bCollapse = nCategory == 0;
bool bCollapse = nSelPos == ALL_CATEGORY;
bool bFilter = !rSearchString.isEmpty();
if ( nSelPos > 0 )
if (nSelPos >= ALL_CATEGORY)
{
ScFunctionMgr* pFuncMgr = ScGlobal::GetStarCalcFunctionMgr();
@@ -314,7 +323,7 @@ void ScFunctionWin::UpdateFunctionList(const OUString& rSearchString)
xScratchIter.get());
}
}
else // LRU list
else if (nSelPos == LRU_CATEGORY) // LRU list
{
for (const formula::IFunctionDescription* pDesc : aLRUList)
{
@@ -328,6 +337,22 @@ void ScFunctionWin::UpdateFunctionList(const OUString& rSearchString)
}
}
}
else // Favourites List
{
ScFunctionMgr* pFuncMgr = ScGlobal::GetStarCalcFunctionMgr();
for (const auto& elem : aFavouritesList)
{
const formula::IFunctionDescription* pDesc(pFuncMgr->Get(elem));
if (pDesc)
{
OUString aFunction(pDesc->getFunctionName());
OUString aFuncDescId(weld::toId(pDesc));
xFuncList->insert(nullptr, -1, &aFunction, &aFuncDescId, nullptr, nullptr, false,
xScratchIter.get());
}
}
}
xFuncList->thaw();
@@ -487,9 +512,9 @@ void ScFunctionWin::DoEnter(bool bDoubleOrEnter)
IMPL_LINK_NOARG(ScFunctionWin, ModifyHdl, weld::Entry&, void)
{
if (xCatBox->get_active() == 0)
if (xCatBox->get_active() == LRU_CATEGORY || xCatBox->get_active() == FAVOURITES_CATEGORY)
{
xCatBox->set_active(1);
xCatBox->set_active(ALL_CATEGORY);
xHelpButton->set_sensitive(false);
}
OUString searchStr = m_xSearchString->get_text();
@@ -591,10 +616,11 @@ IMPL_LINK(ScFunctionWin, KeyInputHdl, const KeyEvent&, rEvent, bool)
IMPL_LINK_NOARG(ScFunctionWin, SelComboHdl, weld::ComboBox&, void)
{
if (xCatBox->get_active() == 0)
if (xCatBox->get_active() == LRU_CATEGORY || xCatBox->get_active() == FAVOURITES_CATEGORY)
m_xSearchString->set_text(u""_ustr);
xHelpButton->set_sensitive(xCatBox->get_active() != 1);
xHelpButton->set_sensitive(xCatBox->get_active() != ALL_CATEGORY);
OUString searchStr = m_xSearchString->get_text();
UpdateFavouritesList();
UpdateFunctionList(searchStr);
SetDescription();
}
+10
View File
@@ -512,6 +512,16 @@ void ScFormulaDlg::insertEntryToLRUList(const formula::IFunctionDescription*
const ScFuncDesc* pDesc = dynamic_cast<const ScFuncDesc*>(_pDesc);
SaveLRUEntry(pDesc);
}
void ScFormulaDlg::insertOrEraseFavouritesListEntry(const formula::IFunctionDescription* _pDesc, bool bInsert)
{
const ScFuncDesc* pDesc = dynamic_cast<const ScFuncDesc*>(_pDesc);
if (pDesc && pDesc->nFIndex != 0)
{
ScModule::get()->InsertOrEraseFavouritesListEntry(pDesc->nFIndex, bInsert);
}
}
void ScFormulaDlg::showReference(const OUString& _sFormula)
{
ShowReference(_sFormula);
+2
View File
@@ -63,9 +63,11 @@ private:
::std::set<std::pair<std::pair<sal_Int32, sal_Int32>, std::pair<OUString, const ScFuncDesc*>>>
sFuncScores;
::std::vector< const formula::IFunctionDescription*> aLRUList;
::std::unordered_set<sal_uInt16> aFavouritesList;
::std::unordered_map<OUString, std::unique_ptr<weld::TreeIter>> mCategories;
void UpdateLRUList();
void UpdateFavouritesList();
void DoEnter(bool bDouble_or_Enter = false);
void SetDescription();
weld::TreeIter* FillCategoriesMap(const OUString&, bool);
+1
View File
@@ -57,6 +57,7 @@ public:
virtual std::unique_ptr<formula::FormulaCompiler> createCompiler( formula::FormulaTokenArray& rArray ) const override;
virtual void doClose(bool _bOk) override;
virtual void insertEntryToLRUList(const formula::IFunctionDescription* pDesc) override;
virtual void insertOrEraseFavouritesListEntry(const formula::IFunctionDescription* pDesc, bool bInsert) override;
virtual void showReference(const OUString& _sFormula) override;
virtual void dispatch(bool _bOK, bool _bMatrixChecked) override;
virtual void setDispatcherLock( bool bLock ) override;
+1
View File
@@ -67,6 +67,7 @@
<property name="hexpand">True</property>
<items>
<item translatable="yes" context="functionpanel|category">Last Used</item>
<item translatable="yes" context="functionpanel|category">Favourites</item>
<item translatable="yes" context="functionpanel|category">All</item>
<item translatable="yes" context="functionpanel|category">Database</item>
<item translatable="yes" context="functionpanel|category">Date&amp;Time</item>