diff options
Diffstat (limited to '')
-rw-r--r-- | sfx2/source/control/templatedlglocalview.cxx | 416 |
1 files changed, 416 insertions, 0 deletions
diff --git a/sfx2/source/control/templatedlglocalview.cxx b/sfx2/source/control/templatedlglocalview.cxx new file mode 100644 index 000000000..704468681 --- /dev/null +++ b/sfx2/source/control/templatedlglocalview.cxx @@ -0,0 +1,416 @@ +/* -*- 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/sfxresid.hxx> +#include <templatecontaineritem.hxx> +#include <sfx2/strings.hrc> +#include <vcl/commandevent.hxx> +#include <vcl/svapp.hxx> +#include <vcl/event.hxx> +#include <sfx2/doctempl.hxx> +#include <bitmaps.hlst> + +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)); + mxTreeView->connect_key_press(LINK(this, TemplateDlgLocalView, KeyPressHdl)); +} + +void TemplateDlgLocalView::showAllTemplates() +{ + mnCurRegionId = 0; + + insertItems(maAllTemplates, false, true); + + maOpenRegionHdl.Call(nullptr); +} + +void TemplateDlgLocalView::showRegion(TemplateContainerItem const* pItem) +{ + mnCurRegionId = pItem->mnRegionId + 1; + + insertItems(pItem->maTemplates, true, false); + + maOpenRegionHdl.Call(nullptr); +} + +void TemplateDlgLocalView::showRegion(std::u16string_view rName) +{ + for (auto const& pRegion : maRegions) + { + if (pRegion->maTitle == rName) + { + showRegion(pRegion.get()); + break; + } + } +} + +void TemplateDlgLocalView::reload() +{ + mpDocTemplates->Update(); + OUString sCurRegionName = getRegionItemName(mnCurRegionId); + Populate(); + mnCurRegionId = getRegionId(sCurRegionName); + + // Check if we are currently browsing a region or root folder + if (mnCurRegionId) + { + sal_uInt16 nRegionId = mnCurRegionId - 1; //Is offset by 1 + + for (auto const& pRegion : maRegions) + { + if (pRegion->mnRegionId == nRegionId) + { + showRegion(pRegion.get()); + break; + } + } + } + else + showAllTemplates(); + + //No items should be selected by default + ThumbnailView::deselectItems(); + ListView::unselect_all(); +} + +void TemplateDlgLocalView::createContextMenu(const bool bIsDefault, const bool bIsBuiltIn, + const bool bIsSingleSel, const OUString& rDefaultImg) +{ + mxContextMenu->clear(); + mxContextMenu->append("open", SfxResId(STR_OPEN), BMP_MENU_OPEN); + mxContextMenu->append("edit", SfxResId(STR_EDIT_TEMPLATE), BMP_MENU_EDIT); + + if (!bIsDefault) + mxContextMenu->append("default", SfxResId(STR_DEFAULT_TEMPLATE), rDefaultImg); + else + mxContextMenu->append("default", SfxResId(STR_RESET_DEFAULT), rDefaultImg); + + mxContextMenu->append_separator("separator1"); + mxContextMenu->append("rename", SfxResId(STR_SFX_RENAME), BMP_MENU_RENAME); + mxContextMenu->append("delete", SfxResId(STR_DELETE_TEMPLATE), BMP_MENU_DELETE); + mxContextMenu->append_separator("separator2"); + mxContextMenu->append("move", SfxResId(STR_MOVE), BMP_MENU_MOVE); + mxContextMenu->append("export", SfxResId(STR_EXPORT), BMP_MENU_EXPORT); + + if (!bIsSingleSel) + { + mxContextMenu->set_sensitive("open", false); + mxContextMenu->set_sensitive("edit", false); + mxContextMenu->set_sensitive("default", false); + mxContextMenu->set_sensitive("rename", false); + } + if (bIsBuiltIn) + { + mxContextMenu->set_sensitive("rename", false); + mxContextMenu->set_sensitive("delete", false); + } + if (mViewMode == TemplateViewMode::eThumbnailView) + { + 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(std::string_view 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)); + aTitleEditDlg.set_title(SfxResId(STR_WINDOW_TITLE_RENAME_TEMPLATE)); + OUString sOldTitle = maSelectedItem->getTitle(); + aTitleEditDlg.SetEntryText(sOldTitle); + aTitleEditDlg.HideHelpBtn(); + + auto aCurRegionItems = getFilteredItems([&](const TemplateItemProperties& rItem) { + return rItem.aRegionName == getRegionName(maSelectedItem->mnRegionId); + }); + OUString sTooltip(SfxResId(STR_TOOLTIP_ERROR_RENAME_TEMPLATE)); + sTooltip = sTooltip.replaceFirst("$2", getRegionName(maSelectedItem->mnRegionId)); + aTitleEditDlg.setCheckEntry([&](OUString sNewTitle) { + if (sNewTitle.isEmpty() || sNewTitle == sOldTitle) + return true; + for (const auto& rItem : aCurRegionItems) + { + if (rItem.aName == sNewTitle) + { + aTitleEditDlg.SetTooltip(sTooltip.replaceFirst("$1", sNewTitle)); + return false; + } + } + return true; + }); + 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(); + } + else if (rIdent == "default") + { + maDefaultTemplateHdl.Call(maSelectedItem); + ListView::refreshDefaultColumn(); + } + else if (rIdent == "move") + { + maMoveTemplateHdl.Call(maSelectedItem); + } + else if (rIdent == "export") + { + maExportTemplateHdl.Call(maSelectedItem); + } +} + +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::insertItems(const std::vector<TemplateItemProperties>& rTemplates, + bool isRegionSelected = true, + bool bShowCategoryInTooltip = false) +{ + TemplateLocalView::insertItems(rTemplates, isRegionSelected, bShowCategoryInTooltip); + insertFilteredItems(); +} + +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() const +{ + 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; + Point aPosition(rCEvt.GetMousePosPixel()); + maPosition = aPosition; + updateSelection(); + if (maSelectedItem) + maCreateContextMenuHdl.Call(maSelectedItem); + return true; + } + else + { + if (ListView::get_selected_rows().empty()) + return true; + maPosition = Point(0, 0); + updateSelection(); + if (maSelectedItem) + maCreateContextMenuHdl.Call(maSelectedItem); + return true; + } +} + +IMPL_LINK_NOARG(TemplateDlgLocalView, ListViewChangedHdl, weld::TreeView&, void) +{ + updateSelection(); +} + +bool TemplateDlgLocalView::KeyInput(const KeyEvent& rKEvt) +{ + vcl::KeyCode aKeyCode = rKEvt.GetKeyCode(); + + if (aKeyCode == (KEY_MOD1 | KEY_A)) + { + for (ThumbnailViewItem* pItem : mFilteredItemList) + { + if (!pItem->isSelected()) + { + pItem->setSelection(true); + maItemStateHdl.Call(pItem); + } + } + + if (IsReallyVisible() && IsUpdateMode()) + Invalidate(); + return true; + } + else if (aKeyCode == KEY_DELETE && !mFilteredItemList.empty()) + { + 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 true; + + maDeleteTemplateHdl.Call(maSelectedItem); + reload(); + } + + return ThumbnailView::KeyInput(rKEvt); +} + +IMPL_LINK(TemplateDlgLocalView, KeyPressHdl, const KeyEvent&, rKEvt, bool) +{ + vcl::KeyCode aKeyCode = rKEvt.GetKeyCode(); + + if (aKeyCode == KEY_DELETE && !mFilteredItemList.empty() + && !ListView::get_selected_rows().empty()) + { + std::unique_ptr<weld::MessageDialog> xQueryDlg(Application::CreateMessageDialog( + mxTreeView.get(), VclMessageType::Question, VclButtonsType::YesNo, + SfxResId(STR_QMSG_SEL_TEMPLATE_DELETE))); + if (xQueryDlg->run() != RET_YES) + return true; + + maDeleteTemplateHdl.Call(maSelectedItem); + reload(); + } + return false; +} +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |