tdf#56696 - Sort recent document list according to current LibO module
Change-Id: I246dc9538e011b8981bea04963995559d2b43cc6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146456
Tested-by: Jenkins
Reviewed-by: Andreas Heinisch <andreas.heinisch@yahoo.de>
diff --git a/framework/source/uielement/recentfilesmenucontroller.cxx b/framework/source/uielement/recentfilesmenucontroller.cxx
index fe7de1c..ef95d30 100644
--- a/framework/source/uielement/recentfilesmenucontroller.cxx
+++ b/framework/source/uielement/recentfilesmenucontroller.cxx
@@ -20,6 +20,8 @@
#include <strings.hrc>
#include <classes/fwkresid.hxx>
#include <comphelper/mimeconfighelper.hxx>
#include <comphelper/processfactory.hxx>
#include <comphelper/propertyvalue.hxx>
#include <cppuhelper/supportsservice.hxx>
#include <osl/mutex.hxx>
@@ -34,6 +36,8 @@
#include <vcl/svapp.hxx>
#include <o3tl/string_view.hxx>
#include <officecfg/Office/Common.hxx>
using namespace css;
using namespace com::sun::star::uno;
using namespace com::sun::star::lang;
@@ -42,6 +46,7 @@ using namespace com::sun::star::beans;
using namespace com::sun::star::util;
#define MAX_MENU_ITEMS 99
#define MAX_MENU_ITEMS_PER_MODULE 5
namespace {
@@ -154,12 +159,50 @@ void RecentFilesMenuController::fillPopupMenu( Reference< css::awt::XPopupMenu >
int nPickListMenuItems = std::min<sal_Int32>( aHistoryList.size(), MAX_MENU_ITEMS );
m_aRecentFilesItems.clear();
// tdf#56696 - retrieve expert configuration option if the recent document
// list should show only files that can be handled by the current module
const bool bShowCurrentModuleOnly
= officecfg::Office::Common::History::ShowCurrentModuleOnly::get();
size_t nItemPosModule = 0;
if (( nPickListMenuItems > 0 ) && !m_bDisabled )
{
for ( int i = 0; i < nPickListMenuItems; i++ )
size_t nItemPos = 0;
if (m_aModuleName != "com.sun.star.frame.StartModule")
{
const SvtHistoryOptions::HistoryItem& rPickListEntry = aHistoryList[i];
m_aRecentFilesItems.emplace_back(rPickListEntry.sURL, rPickListEntry.isReadOnly);
::comphelper::MimeConfigurationHelper aConfigHelper(
comphelper::getProcessComponentContext());
// Show the first MAX_MENU_ITEMS_PER_MODULE items of the current module
// on top of the recent document list.
for (int i = 0; i < nPickListMenuItems; i++)
{
const SvtHistoryOptions::HistoryItem& rPickListEntry = aHistoryList[i];
const std::pair<OUString, bool> aPickListEntry(rPickListEntry.sURL,
rPickListEntry.isReadOnly);
if ((nItemPosModule < MAX_MENU_ITEMS_PER_MODULE || bShowCurrentModuleOnly)
&& aConfigHelper.GetDocServiceNameFromFilter(rPickListEntry.sFilter)
== m_aModuleName)
{
m_aRecentFilesItems.insert(m_aRecentFilesItems.begin() + nItemPosModule,
aPickListEntry);
nItemPos++;
nItemPosModule++;
}
else if (!bShowCurrentModuleOnly)
{
m_aRecentFilesItems.insert(m_aRecentFilesItems.begin() + nItemPos,
aPickListEntry);
nItemPos++;
}
}
}
else
{
for (int i = 0; i < nPickListMenuItems; i++)
{
const SvtHistoryOptions::HistoryItem& rPickListEntry = aHistoryList[i];
m_aRecentFilesItems.emplace_back(rPickListEntry.sURL, rPickListEntry.isReadOnly);
}
}
}
@@ -220,6 +263,10 @@ void RecentFilesMenuController::fillPopupMenu( Reference< css::awt::XPopupMenu >
rPopupMenu->setTipHelpText(sal_uInt16(i + 1), aTipHelpText);
rPopupMenu->setCommand(sal_uInt16(i + 1), aURLString);
// Show a separator after the MAX_MENU_ITEMS_PER_MODULE recent document items
if (nItemPosModule > 0 && i == nItemPosModule - 1)
rPopupMenu->insertSeparator(-1);
}
rPopupMenu->insertSeparator(-1);
diff --git a/officecfg/registry/schema/org/openoffice/Office/Common.xcs b/officecfg/registry/schema/org/openoffice/Office/Common.xcs
index f333657..ced635fa 100644
--- a/officecfg/registry/schema/org/openoffice/Office/Common.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/Common.xcs
@@ -2233,6 +2233,13 @@
</info>
<value>true</value>
</prop>
<prop oor:name="ShowCurrentModuleOnly" oor:type="xs:boolean" oor:nillable="false">
<info>
<desc>The entry specifies if the recent document list should show only
files that can be handled by the current module.</desc>
</info>
<value>false</value>
</prop>
<set oor:name="HelpBookmarks" oor:node-type="HistoryType">
<info>
<desc>Contains the most recently opened help documents.</desc>