summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sc/source/ui/dialogs/searchresults.cxx83
-rw-r--r--sc/source/ui/inc/searchresults.hxx1
-rw-r--r--sc/uiconfig/scalc/ui/searchresults.ui7
3 files changed, 79 insertions, 12 deletions
diff --git a/sc/source/ui/dialogs/searchresults.cxx b/sc/source/ui/dialogs/searchresults.cxx
index c6e747084a6f..1d2e244e29ba 100644
--- a/sc/source/ui/dialogs/searchresults.cxx
+++ b/sc/source/ui/dialogs/searchresults.cxx
@@ -26,6 +26,8 @@ SearchResultsDlg::SearchResultsDlg( SfxBindings* _pBindings, vcl::Window* pParen
ModelessDialog(pParent, "SearchResultsDialog", "modules/scalc/ui/searchresults.ui"),
mpBindings(_pBindings), mpDoc(nullptr)
{
+ get(mpLabel, "skipped");
+
SvSimpleTableContainer *pContainer = get<SvSimpleTableContainer>("results");
Size aControlSize(150, 120);
aControlSize = pContainer->LogicToPixel(aControlSize, MAP_APPFONT);
@@ -47,18 +49,76 @@ SearchResultsDlg::~SearchResultsDlg()
void SearchResultsDlg::dispose()
{
mpList.disposeAndClear();
+ mpLabel.disposeAndClear();
ModelessDialog::dispose();
}
+namespace
+{
+ class ListWrapper {
+ size_t mnCount;
+ const size_t mnMaximum;
+ OUStringBuffer maName;
+ VclPtr<FixedText> mpLabel;
+ VclPtr<SvSimpleTable> mpList;
+ public:
+ ListWrapper(const VclPtr<SvSimpleTable> &pList,
+ const VclPtr<FixedText> &pLabel) :
+ mnCount(0),
+ mnMaximum(1000),
+ mpLabel(pLabel),
+ mpList(pList)
+ {
+ mpList->Clear();
+ mpList->SetUpdateMode(false);
+ }
+ void Insert(const OUString &aTabName,
+ const ScAddress &rPos,
+ formula::FormulaGrammar::AddressConvention eConvention,
+ const OUString &aText)
+ {
+ if (mnCount++ < mnMaximum)
+ {
+ maName.append(aTabName);
+ maName.append("\t");
+ maName.append(rPos.Format(ScRefFlags::ADDR_ABS,
+ nullptr, eConvention));
+ maName.append("\t");
+ maName.append(aText);
+ mpList->InsertEntry(maName.makeStringAndClear());
+ }
+ }
+ void Update()
+ {
+ if (mnCount > mnMaximum)
+ {
+ if (mpLabel)
+ {
+ size_t nSkipped = mnCount - mnMaximum;
+ OUString aSkipped(mpLabel->GetText());
+ mpList->InsertEntry(
+ aSkipped.replaceFirst("$1", OUString::number(nSkipped)));
+ }
+ }
+ mpList->SetUpdateMode(true);
+ }
+ };
+}
+
void SearchResultsDlg::FillResults( ScDocument* pDoc, const ScRangeList &rMatchedRanges, bool bCellNotes )
{
- mpList->Clear();
- mpList->SetUpdateMode(false);
+ ListWrapper aList(mpList, mpLabel);
std::vector<OUString> aTabNames = pDoc->GetAllTableNames();
SCTAB nTabCount = aTabNames.size();
+
+ // tdf#92160 - too many results blow the widget's mind
+ size_t nMatchMax = rMatchedRanges.size();
+ if (nMatchMax > 1000)
+ nMatchMax = 1000;
+
if (bCellNotes)
{
- for (size_t i = 0, n = rMatchedRanges.size(); i < n; ++i)
+ for (size_t i = 0, n = nMatchMax; i < n; ++i)
{
/* TODO: a CellNotes iterator would come handy and migt speed
* things up a little, though we only loop through the
@@ -77,10 +137,9 @@ void SearchResultsDlg::FillResults( ScDocument* pDoc, const ScRangeList &rMatche
{
const ScPostIt* pNote = pDoc->GetNote( aPos);
if (pNote)
- {
- OUString aPosStr = aPos.Format(ScRefFlags::ADDR_ABS, nullptr, pDoc->GetAddressConvention());
- mpList->InsertEntry(aTabNames[aPos.Tab()] + "\t" + aPosStr + "\t" + pNote->GetText());
- }
+ aList.Insert(aTabNames[aPos.Tab()], aPos,
+ pDoc->GetAddressConvention(),
+ pNote->GetText());
}
}
}
@@ -88,7 +147,7 @@ void SearchResultsDlg::FillResults( ScDocument* pDoc, const ScRangeList &rMatche
}
else
{
- for (size_t i = 0, n = rMatchedRanges.size(); i < n; ++i)
+ for (size_t i = 0, n = nMatchMax; i < n; ++i)
{
ScCellIterator aIter(pDoc, *rMatchedRanges[i]);
for (bool bHas = aIter.first(); bHas; bHas = aIter.next())
@@ -98,13 +157,13 @@ void SearchResultsDlg::FillResults( ScDocument* pDoc, const ScRangeList &rMatche
// Out-of-bound sheet index.
continue;
- OUString aPosStr = aPos.Format(ScRefFlags::ADDR_ABS, nullptr, pDoc->GetAddressConvention());
- mpList->InsertEntry(aTabNames[aPos.Tab()] + "\t" + aPosStr + "\t" + pDoc->GetString(aPos));
+ aList.Insert(aTabNames[aPos.Tab()], aPos,
+ pDoc->GetAddressConvention(),
+ pDoc->GetString(aPos));
}
}
}
- mpList->SetUpdateMode(true);
-
+ aList.Update();
mpDoc = pDoc;
}
diff --git a/sc/source/ui/inc/searchresults.hxx b/sc/source/ui/inc/searchresults.hxx
index 776a23f66df1..3c85589a7059 100644
--- a/sc/source/ui/inc/searchresults.hxx
+++ b/sc/source/ui/inc/searchresults.hxx
@@ -23,6 +23,7 @@ namespace sc {
class SearchResultsDlg : public ModelessDialog
{
VclPtr<SvSimpleTable> mpList;
+ VclPtr<FixedText> mpLabel;
SfxBindings* mpBindings;
ScDocument* mpDoc;
diff --git a/sc/uiconfig/scalc/ui/searchresults.ui b/sc/uiconfig/scalc/ui/searchresults.ui
index c39408aa2a31..9ae863770ba7 100644
--- a/sc/uiconfig/scalc/ui/searchresults.ui
+++ b/sc/uiconfig/scalc/ui/searchresults.ui
@@ -53,6 +53,13 @@
<property name="position">1</property>
</packing>
</child>
+ <child>
+ <object class="GtkLabel" id="skipped">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">skipped $1 ...</property>
+ </object>
+ </child>
</object>
</child>
<action-widgets>