[Libreoffice-commits] core.git: include/sfx2 sfx2/Library_sfx.mk sfx2/source sfx2/uiconfig
Vert D (via logerrit)
logerrit at kemper.freedesktop.org
Mon Nov 23 10:29:46 UTC 2020
include/sfx2/listview.hxx | 118 ++++++
include/sfx2/strings.hrc | 5
include/sfx2/templatedlg.hxx | 17
include/sfx2/templatedlglocalview.hxx | 62 +++
sfx2/Library_sfx.mk | 2
sfx2/source/control/listview.cxx | 471 +++++++++++++++++++++++++++
sfx2/source/control/templatedlglocalview.cxx | 294 ++++++++++++++++
sfx2/source/control/templatesearchview.cxx | 182 ++++++++++
sfx2/source/doc/templatedlg.cxx | 114 ++++++
sfx2/source/inc/templatesearchview.hxx | 33 +
sfx2/uiconfig/ui/templatedlg.ui | 316 ++++++++++++++++++
11 files changed, 1591 insertions(+), 23 deletions(-)
New commits:
commit 6b1de6057082bd8720594231839f967bff5372ae
Author: Vert D <devoptmsoi at gmx.com>
AuthorDate: Fri Sep 25 17:58:15 2020 -0500
Commit: Heiko Tietze <heiko.tietze at documentfoundation.org>
CommitDate: Mon Nov 23 11:29:04 2020 +0100
tdf#104154 WIP:Add list view to template manager
*Added Thumbnail View and List View Buttons,
*selection is remembered for the next launch of the template manager.
*List view added to local view and search view.
*Added columns: name, category, application, modified, size and path.
*Added column sorting.
*Search, move, set as default and other existing tasks.
Change-Id: I7615f7e41020916ae518b639dba915a0a9340ff5
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103418
Tested-by: Jenkins
Tested-by: Heiko Tietze <heiko.tietze at documentfoundation.org>
Reviewed-by: Heiko Tietze <heiko.tietze at documentfoundation.org>
diff --git a/include/sfx2/listview.hxx b/include/sfx2/listview.hxx
new file mode 100644
index 000000000000..0c5714caca33
--- /dev/null
+++ b/include/sfx2/listview.hxx
@@ -0,0 +1,118 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include <vcl/weld.hxx>
+
+enum TemplateViewMode
+{
+ eListView,
+ eThumbnailView
+};
+class SfxDocumentTemplates;
+class TemplateContainerItem;
+struct ListViewItem;
+
+class ListView
+{
+public:
+ ListView(std::unique_ptr<weld::TreeView> xTreeView);
+ ~ListView();
+
+ void AppendItem(const OUString& rId, const OUString& rTitle, const OUString& rSubtitle,
+ const OUString& rPath, bool bDefault);
+
+ void AppendRow(const OUString& rImage, const OUString& rTitle, const OUString& rSubtitle,
+ const OUString& rApplication, const OUString& rModify, const OUString& rSize,
+ const OUString& rId);
+
+ void UpdateRow(int nIndex, const OUString& rImage, const OUString& rTitle,
+ const OUString& rSubtitle, const OUString& rApplication, const OUString& rModify,
+ const OUString& rSize, const OUString& rId);
+
+ void ReloadRows();
+
+ bool UpdateRows();
+
+ void sortColumn(const int col);
+
+ void sort();
+
+ void clearListView();
+
+ void ShowListView() { mxTreeView->show(); }
+
+ void HideListView() { mxTreeView->hide(); }
+
+ void unselect_all() { mxTreeView->unselect_all(); }
+
+ void remove(const OUString& rId);
+
+ void rename(const OUString& rId, const OUString& rTitle);
+
+ void refreshDefaultColumn();
+
+protected:
+ sal_uInt16 get_nId(int pos);
+
+ OUString get_selected_id() { return mxTreeView->get_selected_id(); }
+
+ void select_id(const OUString& sId) { mxTreeView->select_id(sId); }
+
+ int get_selected_index() { return mxTreeView->get_selected_index(); }
+
+ std::vector<int> get_selected_rows() { return mxTreeView->get_selected_rows(); }
+
+ bool IsListViewVisible() { return mxTreeView->is_visible(); }
+
+ OUString get_id(int pos) { return mxTreeView->get_id(pos); }
+
+ void set_cursor(int pos) { mxTreeView->set_cursor(pos); }
+
+ int get_cursor_index() { return mxTreeView->get_cursor_index(); }
+
+ sal_uInt16 get_cursor_nId() { return get_nId(mxTreeView->get_cursor_index()); }
+
+ void select(int pos) { mxTreeView->select(pos); }
+
+ int get_index(sal_uInt16 nId) { return mxTreeView->find_id(OUString::number(nId)); }
+
+ DECL_LINK(ColumnClickedHdl, const int, void);
+
+ DECL_LINK(QueryTooltipHdl, const weld::TreeIter&, OUString);
+
+protected:
+ std::unique_ptr<weld::TreeView> mxTreeView;
+ std::vector<std::unique_ptr<ListViewItem>> mListViewItems;
+ Link<weld::TreeView&, void> maSelectionChangedHdl;
+ int mnSortColumn;
+};
+
+struct ListViewItem
+{
+public:
+ OUString maId;
+ OUString maTitle;
+ OUString maSubtitle;
+ OUString maApplication;
+ OUString maPath;
+ bool mbDefault;
+
+ /** Last modify time in seconds since 1/1/1970. */
+ sal_uInt32 mnModify;
+ /** Size in bytes of the file. */
+ sal_uInt64 mnSize;
+
+ OUString maDisplayModify;
+ OUString maDisplaySize;
+ OUString maDisplayPath;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/sfx2/strings.hrc b/include/sfx2/strings.hrc
index cb627807d8c8..9927afe17e93 100644
--- a/include/sfx2/strings.hrc
+++ b/include/sfx2/strings.hrc
@@ -343,6 +343,11 @@
#define STR_CLICKHYPERLINK NC_("STR_CLICKHYPERLINK", "Click to open hyperlink: %{link}")
#define STR_STYLEUSEDBY NC_("STR_STYLEUSEDBY", "(used by: %STYLELIST)")
+
+#define STR_DOCUMENT NC_("STR_DOCUMENT", "Document")
+#define STR_SPREADSHEET NC_("STR_SPREADSHEET", "Spreadsheet")
+#define STR_PRESENTATION NC_("STR_PRESENTATION", "Presentation")
+#define STR_DRAWING NC_("STR_DRAWING", "Drawing")
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/sfx2/templatedlg.hxx b/include/sfx2/templatedlg.hxx
index 76d7d98eced5..e9cf26d2cb8a 100644
--- a/include/sfx2/templatedlg.hxx
+++ b/include/sfx2/templatedlg.hxx
@@ -19,7 +19,7 @@
#include <vcl/timer.hxx>
#include <vcl/weld.hxx>
-#include <sfx2/templatelocalview.hxx>
+#include <sfx2/templatedlglocalview.hxx>
class TemplateSearchView;
class ThumbnailViewItem;
@@ -44,6 +44,8 @@ public:
virtual short run() override;
void setDocumentModel(const css::uno::Reference<css::frame::XModel>& rModel);
+ void setTemplateViewMode(TemplateViewMode eViewMode);
+ TemplateViewMode getTemplateViewMode();
protected:
void getApplicationSpecificSettings();
@@ -83,6 +85,11 @@ protected:
DECL_LINK(ImplUpdateDataHdl, Timer*, void);
DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
+ DECL_LINK(ListViewHdl, weld::Button&, void);
+ DECL_LINK(ThumbnailViewHdl, weld::Button&, void);
+ DECL_LINK(FocusRectLocalHdl, weld::Widget&, tools::Rectangle);
+ DECL_LINK(FocusRectSearchHdl, weld::Widget&, tools::Rectangle);
+
void OnTemplateImportCategory(const OUString& sCategory);
// static void OnTemplateLink ();
void OnTemplateOpen();
@@ -134,10 +141,14 @@ protected:
std::unique_ptr<weld::CheckButton> mxCBXHideDlg;
std::unique_ptr<weld::MenuButton> mxActionBar;
std::unique_ptr<TemplateSearchView> mxSearchView;
- std::unique_ptr<TemplateLocalView> mxLocalView;
+ std::unique_ptr<TemplateDlgLocalView> mxLocalView;
std::unique_ptr<weld::Menu> mxTemplateDefaultMenu;
std::unique_ptr<weld::CustomWeld> mxSearchViewWeld;
std::unique_ptr<weld::CustomWeld> mxLocalViewWeld;
+ std::unique_ptr<weld::ToggleButton> mxListViewButton;
+ std::unique_ptr<weld::ToggleButton> mxThumbnailViewButton;
+ TemplateViewMode mViewMode;
+ bool bMakeSelItemVisible;
};
// class SfxTemplateCategoryDialog -------------------------------------------------------------------
@@ -198,4 +209,4 @@ private:
#endif // INCLUDED_SFX2_INC_TEMPLATEDLG_HXX
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file
diff --git a/include/sfx2/templatedlglocalview.hxx b/include/sfx2/templatedlglocalview.hxx
new file mode 100644
index 000000000000..a8fc57e254c3
--- /dev/null
+++ b/include/sfx2/templatedlglocalview.hxx
@@ -0,0 +1,62 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+#pragma once
+
+#include <sfx2/templatelocalview.hxx>
+#include <sfx2/listview.hxx>
+
+class TemplateDlgLocalView final : public TemplateLocalView, public ListView
+{
+public:
+ TemplateDlgLocalView(std::unique_ptr<weld::ScrolledWindow> xWindow,
+ std::unique_ptr<weld::Menu> xMenu,
+ std::unique_ptr<weld::TreeView> xTreeView);
+
+ void setTemplateViewMode(TemplateViewMode eMode);
+
+ virtual void showAllTemplates() override;
+
+ void showRegion(TemplateContainerItem const* pItem);
+
+ void showRegion(const OUString& rName);
+
+ void createContextMenu(const bool bIsDefault);
+
+ virtual void Show() override;
+
+ virtual void Hide() override;
+
+ bool IsVisible();
+
+ void connect_focus_rect(const Link<weld::Widget&, tools::Rectangle>& rLink)
+ {
+ GetDrawingArea()->connect_focus_rect(rLink);
+ }
+
+ void MakeItemVisible(sal_uInt16 nId) { ThumbnailView::MakeItemVisible(nId); }
+
+private:
+ void ContextMenuSelectHdl(const OString& rIdent);
+
+ void insertFilteredItems();
+
+ void syncCursor();
+
+ void updateSelection();
+
+ DECL_LINK(RowActivatedHdl, weld::TreeView&, bool);
+
+ DECL_LINK(ListViewChangedHdl, weld::TreeView&, void);
+
+ DECL_LINK(PopupMenuHdl, const CommandEvent&, bool);
+
+ TemplateViewMode mViewMode;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/Library_sfx.mk b/sfx2/Library_sfx.mk
index cf3eaed6f81a..b7f69f1d8e5b 100644
--- a/sfx2/Library_sfx.mk
+++ b/sfx2/Library_sfx.mk
@@ -150,6 +150,8 @@ $(eval $(call gb_Library_add_exception_objects,sfx,\
sfx2/source/control/templatelocalview \
sfx2/source/control/templatecontaineritem \
sfx2/source/control/templatesearchview \
+ sfx2/source/control/templatedlglocalview \
+ sfx2/source/control/listview \
sfx2/source/control/thumbnailviewitem \
sfx2/source/control/thumbnailviewacc \
sfx2/source/control/thumbnailview \
diff --git a/sfx2/source/control/listview.cxx b/sfx2/source/control/listview.cxx
new file mode 100644
index 000000000000..93e9678cc6f5
--- /dev/null
+++ b/sfx2/source/control/listview.cxx
@@ -0,0 +1,471 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <vcl/headbar.hxx>
+#include <sfx2/listview.hxx>
+
+#include <sfx2/doctempl.hxx>
+#include <sfx2/sfxresid.hxx>
+#include <tools/urlobj.hxx>
+#include <vcl/svapp.hxx>
+
+#include <vcl/commandevent.hxx>
+#include <vcl/event.hxx>
+
+#include <sfx2/strings.hrc>
+#include <osl/file.hxx>
+#include <osl/time.h>
+#include <comphelper/fileurl.hxx>
+#include <string>
+
+#include <svtools/svtresid.hxx>
+#include <svtools/strings.hrc>
+#include <unotools/localedatawrapper.hxx>
+#include <unotools/collatorwrapper.hxx>
+#include <unotools/syslocale.hxx>
+#include <unotools/intlwrapper.hxx>
+
+#include <sfx2/strings.hrc>
+#include <bitmaps.hlst>
+#include <rtl/math.hxx>
+
+#include <sfx2/templatelocalview.hxx>
+
+#define COLUMN_IMG_ISDEFAULT 0
+#define COLUMN_NAME 1
+#define COLUMN_CATEGORY 2
+#define COLUMN_APPLICATION 3
+#define COLUMN_MODIFIED 4
+#define COLUMN_SIZE 5
+#define NUMBER_OF_COLUMNS 6
+
+static sal_uInt64 getFileSize(const OUString& rURL);
+static sal_uInt32 getFileModifyTime(const OUString& rURL);
+static OUString getDisplayFileSize(const OUString& rURL);
+static OUString getDisplayFileModifyTime(const OUString& rURL);
+static OUString getApplication(const OUString& rURL);
+
+ListView::ListView(std::unique_ptr<weld::TreeView> xTreeView)
+ : mxTreeView(std::move(xTreeView))
+ , mnSortColumn(-2)
+{
+ auto nDigitWidth = mxTreeView->get_approximate_digit_width();
+ std::vector<int> aWidths;
+ aWidths.push_back(static_cast<int>(nDigitWidth * 5)); /* Icon Column */
+ aWidths.push_back(static_cast<int>(nDigitWidth * 24)); /* Name Column */
+ aWidths.push_back(static_cast<int>(nDigitWidth * 22)); /* Category Column */
+ aWidths.push_back(static_cast<int>(nDigitWidth * 15)); /* Application Column */
+ aWidths.push_back(static_cast<int>(nDigitWidth * 18)); /* Modify Column */
+ aWidths.push_back(static_cast<int>(nDigitWidth * 10)); /* Size Column */
+
+ mxTreeView->set_column_fixed_widths(aWidths);
+ mxTreeView->set_selection_mode(SelectionMode::Multiple);
+ mxTreeView->connect_query_tooltip(LINK(this, ListView, QueryTooltipHdl));
+}
+ListView::~ListView() {}
+
+void ListView::AppendItem(const OUString& rId, const OUString& rTitle, const OUString& rSubtitle,
+ const OUString& rPath, bool bDefault)
+{
+ INetURLObject aUrl(rPath, INetProtocol::File);
+ OUString sPath = aUrl.getFSysPath(FSysStyle::Detect);
+
+ std::unique_ptr<ListViewItem> pItem(new ListViewItem);
+ pItem->maId = rId;
+ pItem->maTitle = rTitle;
+ pItem->maSubtitle = rSubtitle;
+ pItem->maApplication = getApplication(rPath);
+ pItem->maPath = rPath;
+ pItem->mbDefault = bDefault;
+ pItem->mnModify = getFileModifyTime(rPath);
+ pItem->mnSize = getFileSize(rPath);
+ pItem->maDisplayModify = getDisplayFileModifyTime(rPath);
+ pItem->maDisplaySize = getDisplayFileSize(rPath);
+ pItem->maDisplayPath = sPath;
+
+ OUString sImage("");
+ if (pItem->mbDefault)
+ sImage = BMP_DEFAULT;
+
+ AppendRow(sImage, pItem->maTitle, pItem->maSubtitle, pItem->maApplication,
+ pItem->maDisplayModify, pItem->maDisplaySize, pItem->maId);
+
+ mListViewItems.push_back(std::move(pItem));
+}
+
+void ListView::AppendRow(const OUString& rImage, const OUString& rTitle, const OUString& rSubtitle,
+ const OUString& rApplication, const OUString& rModify,
+ const OUString& rSize, const OUString& rId)
+{
+ std::unique_ptr<weld::TreeIter> xIter(mxTreeView->make_iterator());
+ mxTreeView->append(xIter.get());
+ mxTreeView->set_image(*xIter, rImage, COLUMN_IMG_ISDEFAULT);
+ mxTreeView->set_text(*xIter, rTitle, COLUMN_NAME);
+ mxTreeView->set_text(*xIter, rSubtitle, COLUMN_CATEGORY);
+ mxTreeView->set_text(*xIter, rApplication, COLUMN_APPLICATION);
+ mxTreeView->set_text(*xIter, rModify, COLUMN_MODIFIED);
+ mxTreeView->set_text(*xIter, rSize, COLUMN_SIZE);
+ mxTreeView->set_id(*xIter, rId);
+}
+
+void ListView::UpdateRow(int nIndex, const OUString& rImage, const OUString& rTitle,
+ const OUString& rSubtitle, const OUString& rApplication,
+ const OUString& rModify, const OUString& rSize, const OUString& rId)
+{
+ mxTreeView->set_image(nIndex, rImage, COLUMN_IMG_ISDEFAULT);
+ mxTreeView->set_text(nIndex, rTitle, COLUMN_NAME);
+ mxTreeView->set_text(nIndex, rSubtitle, COLUMN_CATEGORY);
+ mxTreeView->set_text(nIndex, rApplication, COLUMN_APPLICATION);
+ mxTreeView->set_text(nIndex, rModify, COLUMN_MODIFIED);
+ mxTreeView->set_text(nIndex, rSize, COLUMN_SIZE);
+ mxTreeView->set_id(nIndex, rId);
+}
+
+void ListView::ReloadRows()
+{
+ OUString sCursorId = get_id(get_cursor_index());
+ mxTreeView->clear();
+ for (const auto& pItem : mListViewItems)
+ {
+ OUString sImage("");
+ if (pItem->mbDefault)
+ sImage = BMP_DEFAULT;
+ AppendRow(sImage, pItem->maTitle, pItem->maSubtitle, pItem->maApplication,
+ pItem->maDisplayModify, pItem->maDisplaySize, pItem->maId);
+ }
+ unselect_all();
+ if (!sCursorId.isEmpty())
+ {
+ select_id(sCursorId);
+ set_cursor(get_selected_index());
+ }
+}
+
+bool ListView::UpdateRows()
+{
+ if (static_cast<int>(mListViewItems.size()) != mxTreeView->n_children())
+ return false;
+ OUString sCursorId = get_id(get_cursor_index());
+ int nIndex = 0;
+ for (const auto& pItem : mListViewItems)
+ {
+ OUString sImage("");
+ if (pItem->mbDefault)
+ sImage = BMP_DEFAULT;
+ UpdateRow(nIndex, sImage, pItem->maTitle, pItem->maSubtitle, pItem->maApplication,
+ pItem->maDisplayModify, pItem->maDisplaySize, pItem->maId);
+ ++nIndex;
+ }
+ unselect_all();
+ if (!sCursorId.isEmpty())
+ {
+ select_id(sCursorId);
+ set_cursor(get_selected_index());
+ }
+ return true;
+}
+
+IMPL_LINK(ListView, ColumnClickedHdl, const int, col, void)
+{
+ if (col <= 0 || col > NUMBER_OF_COLUMNS)
+ return;
+
+ if (mnSortColumn >= 0 && mnSortColumn != col)
+ mxTreeView->set_sort_indicator(TriState::TRISTATE_INDET, mnSortColumn);
+
+ mxTreeView->set_sort_indicator((mxTreeView->get_sort_indicator(col) == TriState::TRISTATE_TRUE
+ ? TriState::TRISTATE_FALSE
+ : TriState::TRISTATE_TRUE),
+ col);
+ sortColumn(col);
+}
+
+void ListView::sortColumn(const int col)
+{
+ if (col <= 0 || col > NUMBER_OF_COLUMNS)
+ return;
+
+ bool isAscending = mxTreeView->get_sort_indicator(col) != TriState::TRISTATE_FALSE;
+
+ auto comp = [&](std::unique_ptr<ListViewItem> const& pItemA,
+ std::unique_ptr<ListViewItem> const& pItemB) {
+ sal_Int32 res = 0;
+ IntlWrapper aIntlWrapper(SvtSysLocale().GetUILanguageTag());
+ const CollatorWrapper* pCollatorWrapper = aIntlWrapper.getCollator();
+ switch (col)
+ {
+ case COLUMN_NAME:
+ {
+ OUString sNameA = pItemA->maTitle;
+ OUString sNameB = pItemB->maTitle;
+ res = pCollatorWrapper->compareString(sNameA, sNameB);
+ }
+ break;
+ case COLUMN_CATEGORY:
+ {
+ OUString sCategoryA = pItemA->maSubtitle;
+ OUString sCategoryB = pItemB->maSubtitle;
+ res = pCollatorWrapper->compareString(sCategoryA, sCategoryB);
+ }
+ break;
+ case COLUMN_MODIFIED:
+ {
+ sal_uInt32 nModA, nModB;
+ nModA = pItemA->mnModify;
+ nModB = pItemB->mnModify;
+
+ if (nModA < nModB)
+ res = -1;
+ else if (nModA > nModB)
+ res = 1;
+ }
+ break;
+ case COLUMN_SIZE:
+ {
+ sal_uInt64 nSizeA, nSizeB;
+ nSizeA = pItemA->mnSize;
+ nSizeB = pItemB->mnSize;
+
+ if (nSizeA < nSizeB)
+ res = -1;
+ else if (nSizeA > nSizeB)
+ res = 1;
+ }
+ break;
+ case COLUMN_APPLICATION:
+ {
+ OUString sPathA = pItemA->maApplication;
+ OUString sPathB = pItemB->maApplication;
+ res = pCollatorWrapper->compareString(sPathA, sPathB);
+ }
+ break;
+ }
+ return isAscending ? (res > 0) : (res < 0);
+ };
+ std::stable_sort(mListViewItems.begin(), mListViewItems.end(), comp);
+
+ if (!UpdateRows())
+ ReloadRows();
+ mnSortColumn = col;
+}
+
+void ListView::sort() { sortColumn(mnSortColumn); }
+
+void ListView::refreshDefaultColumn()
+{
+ for (const auto& pItem : mListViewItems)
+ {
+ bool bDefault = TemplateLocalView::IsDefaultTemplate(pItem->maPath);
+ if (pItem->mbDefault != bDefault)
+ {
+ pItem->mbDefault = bDefault;
+ OUString sImage("");
+ if (bDefault)
+ sImage = BMP_DEFAULT;
+ mxTreeView->set_image(mxTreeView->find_id(pItem->maId), sImage, COLUMN_IMG_ISDEFAULT);
+ }
+ }
+}
+
+void ListView::rename(const OUString& rId, const OUString& rTitle)
+{
+ mxTreeView->set_text(mxTreeView->find_id(rId), rTitle, COLUMN_NAME);
+ for (const auto& pItem : mListViewItems)
+ if (pItem->maId == rId)
+ {
+ pItem->maTitle = rTitle;
+ break;
+ }
+}
+
+void ListView::remove(const OUString& rId)
+{
+ mxTreeView->remove_id(rId);
+ for (auto it = mListViewItems.begin(); it != mListViewItems.end(); ++it)
+ if ((*it)->maId == rId)
+ {
+ mListViewItems.erase(it);
+ break;
+ }
+}
+
+void ListView::clearListView()
+{
+ mxTreeView->clear();
+ mListViewItems.clear();
+}
+
+IMPL_LINK(ListView, QueryTooltipHdl, const weld::TreeIter&, rIter, OUString)
+{
+ OUString sId = mxTreeView->get_id(rIter);
+ for (auto& pItem : mListViewItems)
+ {
+ if (pItem->maId == sId)
+ return pItem->maDisplayPath;
+ }
+ return OUString();
+}
+
+sal_uInt16 ListView::get_nId(int pos)
+{
+ return static_cast<sal_uInt16>(mxTreeView->get_id(pos).toInt32());
+}
+
+static sal_uInt32 getFileModifyTime(const OUString& rURL)
+{
+ sal_uInt32 nModify = 0;
+ if (!comphelper::isFileUrl(rURL))
+ return nModify;
+
+ osl::DirectoryItem aItem;
+ if (osl::DirectoryItem::get(rURL, aItem) != osl::DirectoryItem::E_None)
+ return nModify;
+
+ osl::FileStatus aStatus(osl_FileStatus_Mask_ModifyTime);
+ if (aItem.getFileStatus(aStatus) != osl::DirectoryItem::E_None)
+ return nModify;
+
+ TimeValue systemTimeValue = aStatus.getModifyTime();
+
+ nModify = systemTimeValue.Seconds;
+ return nModify;
+}
+static OUString getDisplayFileModifyTime(const OUString& rURL)
+{
+ if (!comphelper::isFileUrl(rURL))
+ return OUString();
+
+ osl::DirectoryItem aItem;
+ if (osl::DirectoryItem::get(rURL, aItem) != osl::DirectoryItem::E_None)
+ return OUString();
+
+ osl::FileStatus aStatus(osl_FileStatus_Mask_ModifyTime);
+ if (aItem.getFileStatus(aStatus) != osl::DirectoryItem::E_None)
+ return OUString();
+
+ TimeValue systemTimeValue = aStatus.getModifyTime();
+ if (systemTimeValue.Seconds == 0)
+ return OUString();
+ TimeValue localTimeValue;
+ oslDateTime dateTime;
+ osl_getLocalTimeFromSystemTime(&systemTimeValue, &localTimeValue);
+ osl_getDateTimeFromTimeValue(&localTimeValue, &dateTime);
+
+ struct tm tm;
+ tm.tm_sec = dateTime.Seconds;
+ tm.tm_min = dateTime.Minutes;
+ tm.tm_hour = dateTime.Hours;
+ tm.tm_mday = dateTime.Day;
+ tm.tm_mon = dateTime.Month - 1;
+ tm.tm_year = dateTime.Year - 1900;
+ char ts[50];
+ for (char& c : ts)
+ c = ' ';
+ strftime(ts, sizeof(ts), "%x %X", &tm);
+ OUString sModifyTime(ts, sizeof(ts), RTL_TEXTENCODING_UTF8);
+ return sModifyTime.trim();
+}
+
+static OUString getDisplayFileSize(const OUString& rURL)
+{
+ if (!comphelper::isFileUrl(rURL))
+ return OUString();
+
+ osl::DirectoryItem aItem;
+ if (osl::DirectoryItem::get(rURL, aItem) != osl::DirectoryItem::E_None)
+ return OUString();
+
+ osl::FileStatus aStatus(osl_FileStatus_Mask_FileSize);
+ if (aItem.getFileStatus(aStatus) != osl::DirectoryItem::E_None)
+ return OUString();
+
+ sal_uInt64 nSize = aStatus.getFileSize();
+ double fSize(static_cast<double>(nSize));
+ sal_uInt32 nDec;
+
+ sal_uInt64 nMega = 1024 * 1024;
+ sal_uInt64 nGiga = nMega * 1024;
+
+ OUString aUnitStr(' ');
+
+ if (nSize < 10000)
+ {
+ aUnitStr += SvtResId(STR_SVT_BYTES);
+ nDec = 0;
+ }
+ else if (nSize < nMega)
+ {
+ fSize /= 1024;
+ aUnitStr += SvtResId(STR_SVT_KB);
+ nDec = 1;
+ }
+ else if (nSize < nGiga)
+ {
+ fSize /= nMega;
+ aUnitStr += SvtResId(STR_SVT_MB);
+ nDec = 2;
+ }
+ else
+ {
+ fSize /= nGiga;
+ aUnitStr += SvtResId(STR_SVT_GB);
+ nDec = 3;
+ }
+
+ OUString aSizeStr(
+ ::rtl::math::doubleToUString(fSize, rtl_math_StringFormat_F, nDec,
+ SvtSysLocale().GetLocaleData().getNumDecimalSep()[0]));
+ aSizeStr += aUnitStr;
+
+ return aSizeStr;
+}
+
+static sal_uInt64 getFileSize(const OUString& rURL)
+{
+ sal_uInt64 nSize = 0;
+ if (!comphelper::isFileUrl(rURL))
+ return nSize;
+
+ osl::DirectoryItem aItem;
+ if (osl::DirectoryItem::get(rURL, aItem) != osl::DirectoryItem::E_None)
+ return nSize;
+
+ osl::FileStatus aStatus(osl_FileStatus_Mask_FileSize);
+ if (aItem.getFileStatus(aStatus) != osl::DirectoryItem::E_None)
+ return nSize;
+
+ nSize = aStatus.getFileSize();
+ return nSize;
+}
+
+static OUString getApplication(const OUString& rURL)
+{
+ INetURLObject aUrl(rURL);
+ OUString aExt = aUrl.getExtension();
+
+ if (aExt == "ott" || aExt == "stw" || aExt == "oth" || aExt == "dot" || aExt == "dotx")
+ {
+ return SfxResId(STR_DOCUMENT);
+ }
+ else if (aExt == "ots" || aExt == "stc" || aExt == "xlt" || aExt == "xltm" || aExt == "xltx")
+ {
+ return SfxResId(STR_SPREADSHEET);
+ }
+ else if (aExt == "otp" || aExt == "sti" || aExt == "pot" || aExt == "potm" || aExt == "potx")
+ {
+ return SfxResId(STR_PRESENTATION);
+ }
+ else if (aExt == "otg" || aExt == "std")
+ {
+ return SfxResId(STR_DRAWING);
+ }
+ return OUString();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/control/templatedlglocalview.cxx b/sfx2/source/control/templatedlglocalview.cxx
new file mode 100644
index 000000000000..84aa6cdca363
--- /dev/null
+++ b/sfx2/source/control/templatedlglocalview.cxx
@@ -0,0 +1,294 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <sfx2/templatedlglocalview.hxx>
+
+#include <comphelper/string.hxx>
+#include <sfx2/inputdlg.hxx>
+#include <templateviewitem.hxx>
+#include <sfx2/doctempl.hxx>
+#include <sfx2/sfxresid.hxx>
+#include <templatecontaineritem.hxx>
+#include <sfx2/strings.hrc>
+#include <vcl/commandevent.hxx>
+#include <vcl/svapp.hxx>
+
+TemplateDlgLocalView::TemplateDlgLocalView(std::unique_ptr<weld::ScrolledWindow> xWindow,
+ std::unique_ptr<weld::Menu> xMenu,
+ std::unique_ptr<weld::TreeView> xTreeView)
+ : TemplateLocalView(std::move(xWindow), std::move(xMenu))
+ , ListView(std::move(xTreeView))
+ , mViewMode(TemplateViewMode::eThumbnailView)
+{
+ mxTreeView->connect_row_activated(LINK(this, TemplateDlgLocalView, RowActivatedHdl));
+ mxTreeView->connect_column_clicked(LINK(this, ListView, ColumnClickedHdl));
+ mxTreeView->connect_changed(LINK(this, TemplateDlgLocalView, ListViewChangedHdl));
+ mxTreeView->connect_popup_menu(LINK(this, TemplateDlgLocalView, PopupMenuHdl));
+}
+
+void TemplateDlgLocalView::showAllTemplates()
+{
+ mnCurRegionId = 0;
+
+ insertItems(maAllTemplates, false, true);
+ insertFilteredItems();
+
+ maOpenRegionHdl.Call(nullptr);
+}
+
+void TemplateDlgLocalView::showRegion(TemplateContainerItem const* pItem)
+{
+ mnCurRegionId = pItem->mnRegionId + 1;
+
+ insertItems(pItem->maTemplates);
+ insertFilteredItems();
+
+ maOpenRegionHdl.Call(nullptr);
+}
+
+void TemplateDlgLocalView::showRegion(const OUString& rName)
+{
+ for (auto const& pRegion : maRegions)
+ {
+ if (pRegion->maTitle == rName)
+ {
+ showRegion(pRegion.get());
+ break;
+ }
+ }
+}
+
+void TemplateDlgLocalView::createContextMenu(const bool bIsDefault)
+{
+ mxContextMenu->clear();
+ mxContextMenu->append("open", SfxResId(STR_OPEN));
+ mxContextMenu->append("edit", SfxResId(STR_EDIT_TEMPLATE));
+
+ if (!bIsDefault)
+ mxContextMenu->append("default", SfxResId(STR_DEFAULT_TEMPLATE));
+ else
+ mxContextMenu->append("default", SfxResId(STR_RESET_DEFAULT));
+
+ mxContextMenu->append_separator("separator");
+ mxContextMenu->append("rename", SfxResId(STR_SFX_RENAME));
+ mxContextMenu->append("delete", SfxResId(STR_DELETE));
+ if (mViewMode == TemplateViewMode::eThumbnailView)
+ {
+ deselectItems();
+ maSelectedItem->setSelection(true);
+ maItemStateHdl.Call(maSelectedItem);
+ ContextMenuSelectHdl(mxContextMenu->popup_at_rect(
+ GetDrawingArea(), tools::Rectangle(maPosition, Size(1, 1))));
+ Invalidate();
+ }
+ else if (mViewMode == TemplateViewMode::eListView)
+ ContextMenuSelectHdl(mxContextMenu->popup_at_rect(
+ mxTreeView.get(), tools::Rectangle(maPosition, Size(1, 1))));
+}
+
+void TemplateDlgLocalView::ContextMenuSelectHdl(const OString& rIdent)
+{
+ if (rIdent == "open")
+ maOpenTemplateHdl.Call(maSelectedItem);
+ else if (rIdent == "edit")
+ maEditTemplateHdl.Call(maSelectedItem);
+ else if (rIdent == "rename")
+ {
+ InputDialog aTitleEditDlg(GetDrawingArea(), SfxResId(STR_RENAME_TEMPLATE));
+ OUString sOldTitle = maSelectedItem->getTitle();
+ aTitleEditDlg.SetEntryText(sOldTitle);
+ aTitleEditDlg.HideHelpBtn();
+
+ if (!aTitleEditDlg.run())
+ return;
+ OUString sNewTitle = comphelper::string::strip(aTitleEditDlg.GetEntryText(), ' ');
+
+ if (!sNewTitle.isEmpty() && sNewTitle != sOldTitle)
+ {
+ maSelectedItem->setTitle(sNewTitle);
+ }
+ ListView::rename(OUString::number(maSelectedItem->mnId), maSelectedItem->maTitle);
+ }
+ else if (rIdent == "delete")
+ {
+ std::unique_ptr<weld::MessageDialog> xQueryDlg(Application::CreateMessageDialog(
+ GetDrawingArea(), VclMessageType::Question, VclButtonsType::YesNo,
+ SfxResId(STR_QMSG_SEL_TEMPLATE_DELETE)));
+ if (xQueryDlg->run() != RET_YES)
+ return;
+
+ maDeleteTemplateHdl.Call(maSelectedItem);
+ reload();
+ ListView::remove(OUString::number(maSelectedItem->mnId));
+ }
+ else if (rIdent == "default")
+ {
+ maDefaultTemplateHdl.Call(maSelectedItem);
+ ListView::refreshDefaultColumn();
+ }
+}
+
+void TemplateDlgLocalView::insertFilteredItems()
+{
+ ListView::clearListView();
+ for (const ThumbnailViewItem* rItem : mFilteredItemList)
+ {
+ const TemplateViewItem* pViewItem = static_cast<const TemplateViewItem*>(rItem);
+ if (!pViewItem)
+ return;
+ bool isDefault = pViewItem->IsDefaultTemplate();
+ OUString sId = OUString::number(pViewItem->mnId);
+ ListView::AppendItem(sId, rItem->maTitle, getRegionName(pViewItem->mnRegionId),
+ pViewItem->getPath(), isDefault);
+ }
+ ListView::sort();
+}
+
+void TemplateDlgLocalView::setTemplateViewMode(TemplateViewMode eMode) { mViewMode = eMode; }
+
+void TemplateDlgLocalView::Show()
+{
+ if (mViewMode == TemplateViewMode::eListView)
+ {
+ ThumbnailView::Hide();
+ ListView::ShowListView();
+ }
+ else
+ {
+ ThumbnailView::Show();
+ ListView::HideListView();
+ }
+ syncCursor();
+}
+void TemplateDlgLocalView::Hide()
+{
+ ThumbnailView::Hide();
+ ListView::HideListView();
+}
+
+bool TemplateDlgLocalView::IsVisible()
+{
+ return ThumbnailView::IsVisible() || ListView::IsListViewVisible();
+}
+
+void TemplateDlgLocalView::syncCursor()
+{
+ if (mViewMode == TemplateViewMode::eListView)
+ {
+ ListView::unselect_all();
+ int nIndex = -1;
+
+ for (auto it = mFilteredItemList.cbegin(); it != mFilteredItemList.cend(); ++it)
+ {
+ if ((*it)->mbSelected)
+ {
+ nIndex = -1;
+ nIndex = ListView::get_index((*it)->mnId);
+ if (nIndex >= 0)
+ {
+ ListView::set_cursor(nIndex);
+ ListView::select(nIndex);
+ break;
+ }
+ }
+ }
+ updateSelection();
+ }
+ else
+ {
+ ThumbnailView::deselectItems();
+ std::vector<int> aSelRows = ListView::get_selected_rows();
+ if (aSelRows.empty())
+ return;
+ sal_uInt16 nCursorId = ListView::get_cursor_nId();
+ ThumbnailView::SelectItem(nCursorId);
+ MakeItemVisible(nCursorId);
+
+ for (auto it = mFilteredItemList.begin(); it != mFilteredItemList.end(); ++it)
+ {
+ if ((*it)->mnId == nCursorId)
+ {
+ mpStartSelRange = it;
+ break;
+ }
+ }
+
+ size_t nPos = GetItemPos(nCursorId);
+ ThumbnailViewItem* pItem = ImplGetItem(nPos);
+ const TemplateViewItem* pViewItem = dynamic_cast<const TemplateViewItem*>(pItem);
+ if (pViewItem)
+ maSelectedItem = dynamic_cast<TemplateViewItem*>(pItem);
+ }
+}
+
+void TemplateDlgLocalView::updateSelection()
+{
+ ThumbnailView::deselectItems();
+ for (auto nIndex : ListView::get_selected_rows())
+ {
+ ThumbnailView::SelectItem(ListView::get_nId(nIndex));
+ }
+
+ sal_uInt16 nCursorId = ListView::get_cursor_nId();
+ size_t nPos = GetItemPos(nCursorId);
+ ThumbnailViewItem* pItem = ImplGetItem(nPos);
+ const TemplateViewItem* pViewItem = dynamic_cast<const TemplateViewItem*>(pItem);
+ if (pViewItem)
+ maSelectedItem = dynamic_cast<TemplateViewItem*>(pItem);
+ return;
+}
+
+IMPL_LINK_NOARG(TemplateDlgLocalView, RowActivatedHdl, weld::TreeView&, bool)
+{
+ maOpenTemplateHdl.Call(maSelectedItem);
+ return true;
+}
+
+IMPL_LINK(TemplateDlgLocalView, PopupMenuHdl, const CommandEvent&, rCEvt, bool)
+{
+ if (rCEvt.GetCommand() != CommandEventId::ContextMenu)
+ return false;
+
+ if (rCEvt.IsMouseEvent())
+ {
+ if (ListView::get_selected_rows().empty())
+ return true;
+ int nIndex = ListView::get_cursor_index();
+ ListView::unselect_all();
+ ListView::select(nIndex);
+ ListView::set_cursor(nIndex);
+ Point aPosition(rCEvt.GetMousePosPixel());
+ maPosition = aPosition;
+ updateSelection();
+ if (maSelectedItem)
+ maCreateContextMenuHdl.Call(maSelectedItem);
+ return true;
+ }
+ else
+ {
+ if (ListView::get_selected_rows().empty())
+ return true;
+ int nIndex = ListView::get_cursor_index();
+ ListView::unselect_all();
+ ListView::select(nIndex);
+ ListView::set_cursor(nIndex);
+ maPosition = Point(0, 0);
+ updateSelection();
+ if (maSelectedItem)
+ maCreateContextMenuHdl.Call(maSelectedItem);
+ return true;
+ }
+}
+
+IMPL_LINK_NOARG(TemplateDlgLocalView, ListViewChangedHdl, weld::TreeView&, void)
+{
+ updateSelection();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/control/templatesearchview.cxx b/sfx2/source/control/templatesearchview.cxx
index d1f36de241f3..e986d6bde41c 100644
--- a/sfx2/source/control/templatesearchview.cxx
+++ b/sfx2/source/control/templatesearchview.cxx
@@ -26,11 +26,18 @@
#define MNI_DELETE "delete"
TemplateSearchView::TemplateSearchView(std::unique_ptr<weld::ScrolledWindow> xWindow,
- std::unique_ptr<weld::Menu> xMenu)
+ std::unique_ptr<weld::Menu> xMenu,
+ std::unique_ptr<weld::TreeView> xTreeView)
: ThumbnailView(std::move(xWindow), std::move(xMenu))
+ , ListView(std::move(xTreeView))
, maSelectedItem(nullptr)
, maPosition(0,0)
+ , mViewMode(TemplateViewMode::eThumbnailView)
{
+ mxTreeView->connect_row_activated(LINK(this, TemplateSearchView, RowActivatedHdl));
+ mxTreeView->connect_column_clicked(LINK(this, ListView, ColumnClickedHdl));
+ mxTreeView->connect_changed(LINK(this, TemplateSearchView, ListViewChangedHdl));
+ mxTreeView->connect_popup_menu(LINK(this, TemplateSearchView, PopupMenuHdl));
}
bool TemplateSearchView::MouseButtonDown( const MouseEvent& rMEvt )
@@ -137,10 +144,15 @@ void TemplateSearchView::createContextMenu(const bool bIsDefault)
mxContextMenu->append_separator("separator");
mxContextMenu->append(MNI_DELETE,SfxResId(STR_DELETE));
- maSelectedItem->setSelection(true);
- maItemStateHdl.Call(maSelectedItem);
- ContextMenuSelectHdl(mxContextMenu->popup_at_rect(GetDrawingArea(), tools::Rectangle(maPosition, Size(1,1))));
- Invalidate();
+ if(mViewMode == TemplateViewMode::eThumbnailView)
+ {
+ maSelectedItem->setSelection(true);
+ maItemStateHdl.Call(maSelectedItem);
+ ContextMenuSelectHdl(mxContextMenu->popup_at_rect(GetDrawingArea(), tools::Rectangle(maPosition, Size(1,1))));
+ Invalidate();
+ }
+ else if(mViewMode == TemplateViewMode::eListView)
+ ContextMenuSelectHdl(mxContextMenu->popup_at_rect(mxTreeView.get(), tools::Rectangle(maPosition, Size(1,1))));
}
void TemplateSearchView::ContextMenuSelectHdl(const OString& rIdent)
@@ -157,12 +169,16 @@ void TemplateSearchView::ContextMenuSelectHdl(const OString& rIdent)
return;
maDeleteTemplateHdl.Call(maSelectedItem);
+ ListView::remove(OUString::number(maSelectedItem->mnId));
RemoveItem(maSelectedItem->mnId);
CalculateItemPositions();
}
else if (rIdent == MNI_DEFAULT_TEMPLATE)
+ {
maDefaultTemplateHdl.Call(maSelectedItem);
+ ListView::refreshDefaultColumn();
+ }
}
void TemplateSearchView::setCreateContextMenuHdl(const Link<ThumbnailViewItem*,void> &rLink)
@@ -217,11 +233,165 @@ void TemplateSearchView::AppendItem(sal_uInt16 nAssocItemId, sal_uInt16 nRegionI
if (TemplateLocalView::IsDefaultTemplate(rPath))
pItem->showDefaultIcon(true);
+ bool isDefault = pItem->IsDefaultTemplate();
+ OUString sId = OUString::number(pItem->mnId);
+ ListView::AppendItem(sId, rTitle, rSubtitle, rPath, isDefault);
ThumbnailView::AppendItem(std::move(pItem));
CalculateItemPositions();
}
+void TemplateSearchView::Clear()
+{
+ ThumbnailView::Clear();
+ ListView::clearListView();
+}
+
+void TemplateSearchView::setTemplateViewMode ( TemplateViewMode eMode )
+{
+ mViewMode = eMode;
+}
+
+void TemplateSearchView::Show()
+{
+ if ( mViewMode == TemplateViewMode::eListView)
+ {
+ ThumbnailView::Hide();
+ ListView::ShowListView();
+ }
+ else
+ {
+ ThumbnailView::Show();
+ ListView::HideListView();
+ }
+ syncCursor();
+}
+
+void TemplateSearchView::Hide()
+{
+ ThumbnailView::Hide();
+ ListView::HideListView();
+}
+
+bool TemplateSearchView::IsVisible()
+{
+ return ThumbnailView::IsVisible() || ListView::IsListViewVisible();
+}
+
+void TemplateSearchView::syncCursor()
+{
+ if ( mViewMode == TemplateViewMode::eListView)
+ {
+ ListView::unselect_all();
+ int nIndex = -1;
+
+ for(auto it = mFilteredItemList.cbegin(); it != mFilteredItemList.cend() ; ++it )
+ {
+ if((*it)->mbSelected)
+ {
+ nIndex = -1;
+ nIndex = ListView::get_index((*it)->mnId);
+ if(nIndex >= 0)
+ {
+ ListView::set_cursor(nIndex);
+ ListView::select(nIndex);
+ break;
+ }
+ }
+ }
+ updateSelection();
+ }
+ else
+ {
+ ThumbnailView::deselectItems();
+ std::vector<int> aSelRows = ListView::get_selected_rows();
+ if(aSelRows.empty())
+ return;
+ sal_uInt16 nCursorId = ListView::get_cursor_nId();
+ ThumbnailView::SelectItem(nCursorId);
+ MakeItemVisible(nCursorId);
+
+ for(auto it = mFilteredItemList.begin(); it != mFilteredItemList.end() ; ++it )
+ {
+ if((*it)->mnId == nCursorId)
+ {
+ mpStartSelRange = it;
+ break;
+ }
+ }
+
+ size_t nPos = GetItemPos(nCursorId);
+ ThumbnailViewItem* pItem = ImplGetItem(nPos);
+ const TemplateViewItem *pViewItem = dynamic_cast<const TemplateViewItem*>(pItem);
+ if(pViewItem)
+ maSelectedItem = dynamic_cast<TemplateViewItem*>(pItem);
+ }
+}
+
+void TemplateSearchView::updateSelection()
+{
+ ThumbnailView::deselectItems();
+ for(auto nIndex : ListView::get_selected_rows())
+ {
+ ThumbnailView::SelectItem(ListView::get_nId(nIndex) );
+ }
+
+ sal_uInt16 nCursorId = ListView::get_cursor_nId();
+ size_t nPos = GetItemPos(nCursorId);
+ ThumbnailViewItem* pItem = ImplGetItem(nPos);
+ const TemplateViewItem *pViewItem = dynamic_cast<const TemplateViewItem*>(pItem);
+ if(pViewItem)
+ maSelectedItem = dynamic_cast<TemplateViewItem*>(pItem);
+ return;
+}
+
+IMPL_LINK_NOARG(TemplateSearchView, RowActivatedHdl, weld::TreeView&, bool)
+{
+ maOpenTemplateHdl.Call(maSelectedItem);
+ return true;
+}
+
+IMPL_LINK(TemplateSearchView, PopupMenuHdl, const CommandEvent&, rCEvt, bool)
+{
+ if (rCEvt.GetCommand() != CommandEventId::ContextMenu)
+ return false;
+
+ if (rCEvt.IsMouseEvent())
+ {
+ if(ListView::get_selected_rows().empty())
+ return true;
+ int nIndex = ListView::get_cursor_index();
+ ListView::unselect_all();
+ ListView::select(nIndex);
+ ListView::set_cursor(nIndex);
+ Point aPosition (rCEvt.GetMousePosPixel());
+ maPosition = aPosition;
+ updateSelection();
+ if(maSelectedItem)
+ maCreateContextMenuHdl.Call(maSelectedItem);
+ return true;
+ }
+ else
+ {
+ if(ListView::get_selected_rows().empty())
+ return true;
+ int nIndex = ListView::get_cursor_index();
+ ListView::unselect_all();
+ ListView::select(nIndex) ;
+ ListView::set_cursor(nIndex) ;
+ maPosition = Point(0,0);
+ updateSelection();
+ if(maSelectedItem)
+ maCreateContextMenuHdl.Call(maSelectedItem);
+ return true;
+ }
+}
+
+IMPL_LINK_NOARG(TemplateSearchView, ListViewChangedHdl, weld::TreeView&, void)
+{
+ updateSelection();
+}
+
BitmapEx TemplateSearchView::getDefaultThumbnail( const OUString& rPath )
{
BitmapEx aImg;
@@ -254,5 +424,3 @@ void TemplateSearchView::RemoveDefaultTemplateIcon(std::u16string_view rPath)
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
-
-
diff --git a/sfx2/source/doc/templatedlg.cxx b/sfx2/source/doc/templatedlg.cxx
index 313bf591862a..29751ac97d87 100644
--- a/sfx2/source/doc/templatedlg.cxx
+++ b/sfx2/source/doc/templatedlg.cxx
@@ -24,7 +24,7 @@
#include <sfx2/filedlghelper.hxx>
#include <sfx2/objsh.hxx>
#include <sfx2/sfxresid.hxx>
-#include <sfx2/templatelocalview.hxx>
+#include <sfx2/templatedlglocalview.hxx>
#include <templatecontaineritem.hxx>
#include <templateviewitem.hxx>
#include <sfx2/thumbnailviewitem.hxx>
@@ -63,6 +63,7 @@
const char TM_SETTING_MANAGER[] = "TemplateManager";
const char TM_SETTING_LASTFOLDER[] = "LastFolder";
const char TM_SETTING_LASTAPPLICATION[] = "LastApplication";
+const char TM_SETTING_VIEWMODE[] = "ViewMode";
#define MNI_ACTION_NEW_FOLDER "new"
#define MNI_ACTION_RENAME_FOLDER "rename"
@@ -167,12 +168,17 @@ SfxTemplateManagerDlg::SfxTemplateManagerDlg(weld::Window *pParent)
, mxCBXHideDlg(m_xBuilder->weld_check_button("hidedialogcb"))
, mxActionBar(m_xBuilder->weld_menu_button("action_menu"))
, mxSearchView(new TemplateSearchView(m_xBuilder->weld_scrolled_window("scrollsearch", true),
- m_xBuilder->weld_menu("contextmenu1")))
- , mxLocalView(new TemplateLocalView(m_xBuilder->weld_scrolled_window("scrolllocal", true),
- m_xBuilder->weld_menu("contextmenu2")))
+ m_xBuilder->weld_menu("contextmenu1"),
+ m_xBuilder->weld_tree_view("treesearch_list")))
+ , mxLocalView(new TemplateDlgLocalView(m_xBuilder->weld_scrolled_window("scrolllocal", true),
+ m_xBuilder->weld_menu("contextmenu2"),
+ m_xBuilder->weld_tree_view("tree_list")))
, mxTemplateDefaultMenu(m_xBuilder->weld_menu("submenu"))
, mxSearchViewWeld(new weld::CustomWeld(*m_xBuilder, "search_view", *mxSearchView))
, mxLocalViewWeld(new weld::CustomWeld(*m_xBuilder, "template_view", *mxLocalView))
+ , mxListViewButton(m_xBuilder->weld_toggle_button("list_view_btn"))
+ , mxThumbnailViewButton(m_xBuilder->weld_toggle_button("thumbnail_view_btn"))
+ , mViewMode(TemplateViewMode::eThumbnailView)
{
// Create popup menus
mxActionBar->insert_item(0, MNI_ACTION_NEW_FOLDER, SfxResId(STR_CATEGORY_NEW), nullptr, nullptr, TRISTATE_INDET);
@@ -216,6 +222,8 @@ SfxTemplateManagerDlg::SfxTemplateManagerDlg(weld::Window *pParent)
mxExportButton->connect_clicked(LINK(this, SfxTemplateManagerDlg, ExportClickHdl));
mxImportButton->connect_clicked(LINK(this, SfxTemplateManagerDlg, ImportClickHdl));
mxMoreTemplatesButton->connect_clicked(LINK(this, SfxTemplateManagerDlg, LinkClickHdl));
+ mxListViewButton->connect_clicked(LINK(this, SfxTemplateManagerDlg, ListViewHdl));
+ mxThumbnailViewButton->connect_clicked(LINK(this, SfxTemplateManagerDlg, ThumbnailViewHdl));
mxSearchFilter->connect_changed(LINK(this, SfxTemplateManagerDlg, SearchUpdateHdl));
mxSearchFilter->connect_focus_in(LINK( this, SfxTemplateManagerDlg, GetFocusHdl ));
@@ -244,6 +252,10 @@ SfxTemplateManagerDlg::SfxTemplateManagerDlg(weld::Window *pParent)
m_aUpdateDataTimer.SetInvokeHandler(LINK(this, SfxTemplateManagerDlg, ImplUpdateDataHdl));
m_aUpdateDataTimer.SetDebugName( "SfxTemplateManagerDlg UpdateDataTimer" );
m_aUpdateDataTimer.SetTimeout(EDIT_UPDATEDATA_TIMEOUT);
+
+ mxLocalView->connect_focus_rect(LINK(this, SfxTemplateManagerDlg, FocusRectLocalHdl));
+ mxSearchView->connect_focus_rect(LINK(this, SfxTemplateManagerDlg, FocusRectSearchHdl));
+ bMakeSelItemVisible = false;
}
SfxTemplateManagerDlg::~SfxTemplateManagerDlg()
@@ -289,6 +301,40 @@ void SfxTemplateManagerDlg::setDocumentModel(const uno::Reference<frame::XModel>
m_xModel = rModel;
}
+void SfxTemplateManagerDlg::setTemplateViewMode(TemplateViewMode eViewMode)
+{
+ mViewMode = eViewMode;
+ mxLocalView->setTemplateViewMode(eViewMode);
+ mxSearchView->setTemplateViewMode(eViewMode);
+ if ( mViewMode == TemplateViewMode::eListView)
+ {
+ mxThumbnailViewButton->set_active(false);
+ mxListViewButton->set_active(true);
+ }
+ else
+ {
+ mxThumbnailViewButton->set_active(true);
+ mxListViewButton->set_active(false);
+ }
+
+ if (! mxSearchFilter->get_text().isEmpty())
+ {
+ mxSearchView->Show();
+ mxLocalView->Hide();
+ }
+ else
+ {
+ mxSearchView->Hide();
+ mxLocalView->Show();
+ }
+}
+
+TemplateViewMode SfxTemplateManagerDlg::getTemplateViewMode()
+{
+ return mViewMode;
+}
+
+
FILTER_APPLICATION SfxTemplateManagerDlg::getCurrentApplicationFilter() const
{
const sal_Int16 nCurAppId = mxCBApp->get_active();
@@ -360,12 +406,14 @@ void SfxTemplateManagerDlg::readSettings ()
{
OUString aLastFolder;
SvtViewOptions aViewSettings( EViewType::Dialog, TM_SETTING_MANAGER );
+ sal_Int16 nViewMode = -1;
if ( aViewSettings.Exists() )
{
sal_uInt16 nTmp = 0;
aViewSettings.GetUserItem(TM_SETTING_LASTFOLDER) >>= aLastFolder;
aViewSettings.GetUserItem(TM_SETTING_LASTAPPLICATION) >>= nTmp;
+ aViewSettings.GetUserItem(TM_SETTING_VIEWMODE) >>= nViewMode;
//open last remembered application only when application model is not set
if(!m_xModel.is())
@@ -406,6 +454,18 @@ void SfxTemplateManagerDlg::readSettings ()
mxLocalView->showRegion(aLastFolder);
mxActionBar->set_item_visible(MNI_ACTION_RENAME_FOLDER, true);
}
+
+ if(nViewMode == static_cast<sal_Int16>(TemplateViewMode::eListView) ||
+ nViewMode == static_cast<sal_Int16>(TemplateViewMode::eThumbnailView))
+ {
+ TemplateViewMode eViewMode = static_cast<TemplateViewMode>(nViewMode);
+ setTemplateViewMode(eViewMode);
+ }
+ else
+ {
+ //Default ViewMode
+ setTemplateViewMode(TemplateViewMode::eThumbnailView);
+ }
}
void SfxTemplateManagerDlg::writeSettings ()
@@ -419,7 +479,8 @@ void SfxTemplateManagerDlg::writeSettings ()
Sequence< NamedValue > aSettings
{
{ TM_SETTING_LASTFOLDER, css::uno::makeAny(aLastFolder) },
- { TM_SETTING_LASTAPPLICATION, css::uno::makeAny(sal_uInt16(mxCBApp->get_active())) }
+ { TM_SETTING_LASTAPPLICATION, css::uno::makeAny(sal_uInt16(mxCBApp->get_active())) },
+ { TM_SETTING_VIEWMODE, css::uno::makeAny(static_cast<sal_Int16>(getTemplateViewMode()))}
};
// write
@@ -498,7 +559,10 @@ void SfxTemplateManagerDlg::DefaultTemplateMenuSelectHdl(const OString& rIdent)
}
SfxObjectFactory::SetStandardTemplate( aServiceName, OUString() );
-
+ if (mxSearchView->IsVisible())
+ mxSearchView->refreshDefaultColumn();
+ else
+ mxLocalView->refreshDefaultColumn();
createDefaultTemplateMenu();
}
@@ -542,6 +606,8 @@ IMPL_LINK_NOARG(SfxTemplateManagerDlg, MoveClickHdl, weld::Button&, void)
}
mxLocalView->reload();
+ if (mxSearchView->IsVisible())
+ SearchUpdate();
}
IMPL_LINK_NOARG(SfxTemplateManagerDlg, ExportClickHdl, weld::Button&, void)
@@ -582,6 +648,8 @@ IMPL_LINK_NOARG(SfxTemplateManagerDlg, ImportClickHdl, weld::Button&, void)
mxLocalView->reload();
mxLocalView->showAllTemplates();
+ if (mxSearchView->IsVisible())
+ SearchUpdate();
mxCBApp->set_active(0);
mxCBFolder->set_active(0);
mxActionBar->set_item_visible(MNI_ACTION_RENAME_FOLDER, false);
@@ -752,6 +820,33 @@ IMPL_LINK_NOARG(SfxTemplateManagerDlg, LoseFocusHdl, weld::Widget&, void)
}
}
+IMPL_LINK_NOARG ( SfxTemplateManagerDlg, ListViewHdl, weld::Button&, void )
+{
+ setTemplateViewMode(TemplateViewMode::eListView);
+}
+
+IMPL_LINK_NOARG ( SfxTemplateManagerDlg, ThumbnailViewHdl, weld::Button&, void )
+{
+ setTemplateViewMode(TemplateViewMode::eThumbnailView);
+ bMakeSelItemVisible = true;
+}
+
+IMPL_LINK_NOARG(SfxTemplateManagerDlg, FocusRectLocalHdl, weld::Widget&, tools::Rectangle)
+{
+ if(bMakeSelItemVisible && !maSelTemplates.empty())
+ mxLocalView->MakeItemVisible((*maSelTemplates.begin())->mnId);
+ bMakeSelItemVisible = false;
+ return tools::Rectangle();
+}
+
+IMPL_LINK_NOARG(SfxTemplateManagerDlg, FocusRectSearchHdl, weld::Widget&, tools::Rectangle)
+{
+ if(bMakeSelItemVisible && !maSelTemplates.empty())
+ mxSearchView->MakeItemVisible((*maSelTemplates.begin())->mnId);
+ bMakeSelItemVisible = false;
+ return tools::Rectangle();
+}
+
void SfxTemplateManagerDlg::SearchUpdate()
{
OUString aKeyword = mxSearchFilter->get_text();
@@ -782,7 +877,7 @@ void SfxTemplateManagerDlg::SearchUpdate()
rItem.aPath,
rItem.aThumbnail);
}
-
+ mxSearchView->sort();
mxSearchView->Invalidate();
}
else
@@ -792,6 +887,8 @@ void SfxTemplateManagerDlg::SearchUpdate()
mxLocalView->Show();
mxLocalView->filterItems(ViewFilter_Application(getCurrentApplicationFilter()));
mxLocalView->reload();
+ if(mxSearchView->IsVisible())
+ SearchUpdate();
OUString sLastFolder = mxCBFolder->get_active_text();
mxLocalView->showRegion(sLastFolder);
mxActionBar->set_item_visible(MNI_ACTION_RENAME_FOLDER, true);
@@ -1376,6 +1473,7 @@ short SfxTemplateSelectionDlg::run()
maIdle.SetPriority(TaskPriority::LOWEST);
maIdle.SetInvokeHandler(LINK(this,SfxTemplateSelectionDlg,TimeOut));
maIdle.Start();
+ setTemplateViewMode(TemplateViewMode::eThumbnailView);
return weld::GenericDialogController::run();
}
@@ -1401,4 +1499,4 @@ IMPL_LINK_NOARG(SfxTemplateSelectionDlg, OkClickHdl, weld::Button&, void)
m_xDialog->response(RET_OK);
}
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file
diff --git a/sfx2/source/inc/templatesearchview.hxx b/sfx2/source/inc/templatesearchview.hxx
index 24becb6146ba..caf9adca3c75 100644
--- a/sfx2/source/inc/templatesearchview.hxx
+++ b/sfx2/source/inc/templatesearchview.hxx
@@ -11,17 +11,19 @@
#define INCLUDED_SFX2_SOURCE_INC_TEMPLATESEARCHVIEW_HXX
#include <sfx2/thumbnailview.hxx>
+#include <sfx2/listview.hxx>
class TemplateViewItem;
class PopupMenu;
class Menu;
-class TemplateSearchView final : public ThumbnailView
+class TemplateSearchView final : public ThumbnailView, public ListView
{
public:
TemplateSearchView(std::unique_ptr<weld::ScrolledWindow> xWindow,
- std::unique_ptr<weld::Menu> xMenu);
+ std::unique_ptr<weld::Menu> xMenu,
+ std::unique_ptr<weld::TreeView> xTreeView);
void setOpenTemplateHdl (const Link<ThumbnailViewItem*, void> &rLink);
@@ -41,6 +43,30 @@ public:
const OUString &rTitle, const OUString &rSubtitle,
const OUString &rPath, const BitmapEx &rImage );
+ void setTemplateViewMode ( TemplateViewMode eMode );
+
+ void Show() override;
+
+ void Hide() override;
+
+ void Clear() override;
+
+ bool IsVisible();
+
+ void syncCursor();
+
+ void updateSelection();
+
+ void connect_focus_rect(const Link<weld::Widget&, tools::Rectangle>& rLink) { GetDrawingArea()->connect_focus_rect(rLink);}
+
+ void MakeItemVisible( sal_uInt16 nId ) { ThumbnailView::MakeItemVisible(nId);}
+
+ DECL_LINK(RowActivatedHdl, weld::TreeView&, bool);
+
+ DECL_LINK(ListViewChangedHdl, weld::TreeView&, void);
+
+ DECL_LINK(PopupMenuHdl, const CommandEvent&, bool);
+
static BitmapEx getDefaultThumbnail( const OUString& rPath );
void RemoveDefaultTemplateIcon(std::u16string_view rPath);
@@ -63,8 +89,9 @@ private:
Link<ThumbnailViewItem*,void> maEditTemplateHdl;
Link<ThumbnailViewItem*,void> maDeleteTemplateHdl;
Link<ThumbnailViewItem*,void> maDefaultTemplateHdl;
+ TemplateViewMode mViewMode;
};
#endif // INCLUDED_SFX2_SOURCE_INC_TEMPLATESEARCHVIEW_HXX
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file
diff --git a/sfx2/uiconfig/ui/templatedlg.ui b/sfx2/uiconfig/ui/templatedlg.ui
index 7e0caa03052d..2a352fb268a3 100644
--- a/sfx2/uiconfig/ui/templatedlg.ui
+++ b/sfx2/uiconfig/ui/templatedlg.ui
@@ -35,6 +35,16 @@
<property name="can-focus">False</property>
<property name="icon-name">sfx2/res/actionaction013.png</property>
</object>
+ <object class="GtkImage" id="image8">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="icon-name">svx/res/galicon.png</property>
+ </object>
+ <object class="GtkImage" id="image9">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="icon-name">svx/res/gallist.png</property>
+ </object>
<object class="GtkMenu" id="menu1">
<property name="visible">True</property>
<property name="can-focus">False</property>
@@ -53,6 +63,24 @@
</object>
</child>
</object>
+ <object class="GtkTreeStore" id="tree_store">
+ <columns>
+ <!-- column-name default_img -->
+ <column type="GdkPixbuf"/>
+ <!-- column-name name -->
+ <column type="gchararray"/>
+ <!-- column-name category -->
+ <column type="gchararray"/>
+ <!-- column-name application -->
+ <column type="gchararray"/>
+ <!-- column-name modified -->
+ <column type="gchararray"/>
+ <!-- column-name size -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
<object class="GtkDialog" id="TemplateDialog">
<property name="width-request">740</property>
<property name="height-request">500</property>
@@ -171,6 +199,50 @@
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">12</property>
+ <child>
+ <object class="GtkBox" id="box7">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <object class="GtkToggleButton" id="thumbnail_view_btn">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">True</property>
+ <property name="tooltip-text" translatable="yes" context="templatedlg|thumbnail_view_btn|tooltip_text">Thumbnail View</property>
+ <property name="image">image8</property>
+ <property name="relief">none</property>
+ <property name="always-show-image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="list_view_btn">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">True</property>
+ <property name="tooltip-text" translatable="yes" context="templatedlg|list_view_btn|tooltip_text">List View</property>
+ <property name="image">image9</property>
+ <property name="relief">none</property>
+ <property name="always-show-image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack-type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
<child>
<object class="GtkBox" id="box6">
<property name="visible">True</property>
@@ -217,7 +289,7 @@
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack-type">end</property>
- <property name="position">0</property>
+ <property name="position">1</property>
</packing>
</child>
<child>
@@ -230,7 +302,7 @@
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack-type">end</property>
- <property name="position">1</property>
+ <property name="position">2</property>
</packing>
</child>
</object>
@@ -326,6 +398,246 @@
<property name="position">1</property>
</packing>
</child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="can-focus">True</property>
+ <property name="no-show-all">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow-type">in</property>
+ <child>
+ <object class="GtkTreeView" id="tree_list">
+ <property name="can-focus">True</property>
+ <property name="no-show-all">True</property>
+ <property name="has-tooltip">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">tree_store</property>
+ <property name="enable-search">False</property>
+ <property name="search-column">0</property>
+ <property name="show-expanders">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection">
+ <property name="mode">multiple</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn">
+ <child>
+ <object class="GtkCellRendererPixbuf" id="cellrenderer1"/>
+ <attributes>
+ <attribute name="pixbuf">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn1">
+ <property name="resizable">True</property>
+ <property name="spacing">6</property>
+ <property name="title" translatable="yes" context="templatedlg|treeviewcolumn1">Name</property>
+ <property name="expand">True</property>
+ <property name="clickable">True</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderer2">
+ <property name="ypad">3</property>
+ </object>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn2">
+ <property name="resizable">True</property>
+ <property name="spacing">6</property>
+ <property name="title" translatable="yes" context="templatedlg|treeviewcolumn2">Category</property>
+ <property name="clickable">True</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderer3">
+ <property name="ypad">3</property>
+ </object>
+ <attributes>
+ <attribute name="text">2</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn3">
+ <property name="resizable">True</property>
+ <property name="title" translatable="yes" context="templatedlg|treeviewcolumn3">Application</property>
+ <property name="clickable">True</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderer4">
+ <property name="ypad">3</property>
+ </object>
+ <attributes>
+ <attribute name="text">3</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn4">
+ <property name="resizable">True</property>
+ <property name="title" translatable="yes" context="templatedlg|treeviewcolumn4">Modified</property>
+ <property name="clickable">True</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderer5">
+ <property name="ypad">3</property>
+ </object>
+ <attributes>
+ <attribute name="text">4</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn5">
+ <property name="resizable">True</property>
+ <property name="title" translatable="yes" context="templatedlg|treeviewcolumn5">Size</property>
+ <property name="clickable">True</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderer6">
+ <property name="ypad">3</property>
+ </object>
+ <attributes>
+ <attribute name="text">5</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="can-focus">True</property>
+ <property name="no-show-all">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow-type">in</property>
+ <child>
+ <object class="GtkTreeView" id="treesearch_list">
+ <property name="can-focus">True</property>
+ <property name="no-show-all">True</property>
+ <property name="has-tooltip">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">tree_store</property>
+ <property name="enable-search">False</property>
+ <property name="search-column">0</property>
+ <property name="show-expanders">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection">
+ <property name="mode">multiple</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn">
+ <child>
+ <object class="GtkCellRendererPixbuf" id="cellrenderer7"/>
+ <attributes>
+ <attribute name="pixbuf">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn6">
+ <property name="resizable">True</property>
+ <property name="spacing">6</property>
+ <property name="title" translatable="yes" context="templatedlg|treeviewcolumn1">Name</property>
+ <property name="expand">True</property>
+ <property name="clickable">True</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderer8">
+ <property name="ypad">3</property>
+ </object>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn7">
+ <property name="resizable">True</property>
+ <property name="spacing">6</property>
+ <property name="title" translatable="yes" context="templatedlg|treeviewcolumn2">Category</property>
+ <property name="clickable">True</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderer9">
+ <property name="ypad">3</property>
+ </object>
+ <attributes>
+ <attribute name="text">2</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn8">
+ <property name="resizable">True</property>
+ <property name="title" translatable="yes" context="templatedlg|treeviewcolumn3">Application</property>
+ <property name="clickable">True</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderer10">
+ <property name="ypad">3</property>
+ </object>
+ <attributes>
+ <attribute name="text">3</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn9">
+ <property name="resizable">True</property>
+ <property name="title" translatable="yes" context="templatedlg|treeviewcolumn4">Modified</property>
+ <property name="clickable">True</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderer11">
+ <property name="ypad">3</property>
+ </object>
+ <attributes>
+ <attribute name="text">4</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn10">
+ <property name="resizable">True</property>
+ <property name="title" translatable="yes" context="templatedlg|treeviewcolumn5">Size</property>
+ <property name="clickable">True</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderer12">
+ <property name="ypad">3</property>
+ </object>
+ <attributes>
+ <attribute name="text">5</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
</object>
</child>
<child type="label">
More information about the Libreoffice-commits
mailing list