summaryrefslogtreecommitdiff
path: root/sd/source/ui/dlg/TemplateScanner.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/dlg/TemplateScanner.cxx')
-rw-r--r--sd/source/ui/dlg/TemplateScanner.cxx39
1 files changed, 38 insertions, 1 deletions
diff --git a/sd/source/ui/dlg/TemplateScanner.cxx b/sd/source/ui/dlg/TemplateScanner.cxx
index d1b75d04a957..b30f8720a7a4 100644
--- a/sd/source/ui/dlg/TemplateScanner.cxx
+++ b/sd/source/ui/dlg/TemplateScanner.cxx
@@ -33,6 +33,7 @@
#include <comphelper/processfactory.hxx>
#include <comphelper/documentconstants.hxx>
+#include <comphelper/string.hxx>
#include <tools/debug.hxx>
#include <osl/mutex.hxx>
@@ -142,6 +143,40 @@ int Classify (const ::rtl::OUString&, const ::rtl::OUString& rsURL)
namespace sd
{
+TemplateEntryCompare::TemplateEntryCompare():
+ mpStringSorter(new comphelper::string::NaturalStringSorter(
+ ::comphelper::getProcessComponentContext(),
+ Application::GetSettings().GetLocale())) {}
+
+bool TemplateEntryCompare::operator()(TemplateEntry* pA, TemplateEntry* pB) const
+{
+ return 0 > mpStringSorter->compare(pA->msTitle, pB->msTitle);
+}
+
+void TemplateDir::EnableSorting(bool bSortingEnabled)
+{
+ mbSortingEnabled = bSortingEnabled;
+ if (mbSortingEnabled)
+ {
+ if (mpEntryCompare.get() == NULL)
+ mpEntryCompare.reset(new TemplateEntryCompare);
+
+ ::std::sort(maEntries.begin(), maEntries.end(), *mpEntryCompare);
+ }
+}
+
+void TemplateDir::InsertEntry(TemplateEntry* pNewEntry)
+{
+ if (mbSortingEnabled)
+ {
+ ::std::vector<TemplateEntry*>::iterator aPlaceToInsert =
+ ::std::upper_bound(maEntries.begin(), maEntries.end(), pNewEntry, *mpEntryCompare);
+ maEntries.insert(aPlaceToInsert, pNewEntry);
+ }
+ else
+ maEntries.push_back(pNewEntry);
+}
+
class TemplateScanner::FolderDescriptorList
: public ::std::multiset<FolderDescriptor,FolderDescriptor::Comparator>
{
@@ -152,6 +187,7 @@ TemplateScanner::TemplateScanner (void)
maFolderContent(),
mpTemplateDirectory(NULL),
maFolderList(),
+ mbEntrySortingEnabled(false),
mpLastAddedEntry(NULL),
mpFolderDescriptors(new FolderDescriptorList()),
mxTemplateRoot(),
@@ -268,7 +304,7 @@ TemplateScanner::State TemplateScanner::ScanEntry (void)
::rtl::OUString sLocalisedTitle = SfxDocumentTemplates::ConvertResourceString(
STR_TEMPLATE_NAME1_DEF, STR_TEMPLATE_NAME1, NUM_TEMPLATE_NAMES, sTitle );
mpLastAddedEntry = new TemplateEntry(sLocalisedTitle, sTargetURL);
- mpTemplateDirectory->maEntries.push_back(mpLastAddedEntry);
+ mpTemplateDirectory->InsertEntry(mpLastAddedEntry);
}
}
@@ -390,6 +426,7 @@ TemplateScanner::State TemplateScanner::ScanFolder (void)
mpTemplateDirectory = new TemplateDir (sTitle, sTargetDir);
if (mpTemplateDirectory != NULL)
{
+ mpTemplateDirectory->EnableSorting(mbEntrySortingEnabled);
// Continue with scanning all entries in the folder.
eNextState = INITIALIZE_ENTRY_SCAN;
}