Files
libreoffice/sfx2/source/doc/templatedlg.cxx
Akshay Deep ca040d16d0 New Template Manager
1. Save Mode removed from Template Manager
2. Context Menu for TemplateViewItems (Handled from LocalView for Local Repos)
3. 'showAllTemplates()' replacing 'showRootRegion()'
4. Filter Combobox for templates (Remembers filters also)
5. Search Filter (Synchronized with Filter ComboBoxes)
6. Removed Tabs from Template Manager
7. Removed Buttons from TemplateAbstractView
8. Unused GtkToolButtons removed
9. PushButtons in UI
10. Modal dialog for Import and Move (Works from "All Categories" now too)
11. ContextMenu for TemplateSearchView
12. Delete Categories(Folder) in Settings Menu
13. Save As Template Dialog

Change-Id: I88f6568c35271c17dbd7e6877d50119a8cfe4d60
Reviewed-on: https://gerrit.libreoffice.org/24545
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>
2016-05-20 13:54:17 +00:00

1554 lines
48 KiB
C++

/* -*- 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/templatedlg.hxx>
#include <sfx2/inputdlg.hxx>
#include "templatesearchview.hxx"
#include "templatesearchviewitem.hxx"
#include <comphelper/processfactory.hxx>
#include <comphelper/string.hxx>
#include <comphelper/storagehelper.hxx>
#include <officecfg/Office/Common.hxx>
#include <sfx2/app.hxx>
#include <sfx2/docfac.hxx>
#include <sfx2/fcontnr.hxx>
#include <sfx2/filedlghelper.hxx>
#include <sfx2/sfxresid.hxx>
#include <sfx2/templatelocalview.hxx>
#include <sfx2/templatecontaineritem.hxx>
#include <sfx2/templateremoteview.hxx>
#include <sfx2/templaterepository.hxx>
#include <sfx2/templateviewitem.hxx>
#include <sfx2/thumbnailviewitem.hxx>
#include <sot/storage.hxx>
#include <svtools/imagemgr.hxx>
#include <svtools/langhelp.hxx>
#include <svtools/miscopt.hxx>
#include <svtools/PlaceEditDialog.hxx>
#include <tools/urlobj.hxx>
#include <unotools/moduleoptions.hxx>
#include <unotools/pathoptions.hxx>
#include <unotools/viewoptions.hxx>
#include <vcl/edit.hxx>
#include <vcl/layout.hxx>
#include <vcl/toolbox.hxx>
#include <com/sun/star/beans/PropertyValue.hpp>
#include <com/sun/star/configuration/theDefaultProvider.hpp>
#include <com/sun/star/document/MacroExecMode.hpp>
#include <com/sun/star/document/UpdateDocMode.hpp>
#include <com/sun/star/embed/XStorage.hpp>
#include <com/sun/star/embed/ElementModes.hpp>
#include <com/sun/star/frame/Desktop.hpp>
#include <com/sun/star/frame/XComponentLoader.hpp>
#include <com/sun/star/frame/XStorable.hpp>
#include <com/sun/star/lang/XComponent.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
#include <com/sun/star/ui/dialogs/FolderPicker.hpp>
#include <com/sun/star/system/SystemShellExecute.hpp>
#include <com/sun/star/system/SystemShellExecuteFlags.hpp>
#include <com/sun/star/task/InteractionHandler.hpp>
#include "doc.hrc"
const char TM_SETTING_MANAGER[] = "TemplateManager";
const char TM_SETTING_LASTFOLDER[] = "LastFolder";
const char TM_SETTING_LASTAPPLICATION[] = "LastApplication";
const char SERVICENAME_CFGREADACCESS[] = "com.sun.star.configuration.ConfigurationAccess";
const char VIEWBAR_REPOSITORY[] = "repository";
const char ACTIONBAR_ACTION[] = "action_menu";
#define MNI_ACTION_NEW_FOLDER 1
#define MNI_ACTION_DELETE_FOLDER 2
#define MNI_ACTION_REFRESH 3
#define MNI_ACTION_DEFAULT 3
#define MNI_REPOSITORY_LOCAL 1
#define MNI_REPOSITORY_NEW 2
#define MNI_REPOSITORY_BASE 3
#define MNI_WRITER 1
#define MNI_CALC 2
#define MNI_IMPRESS 3
#define MNI_DRAW 4
using namespace ::com::sun::star;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::embed;
using namespace ::com::sun::star::frame;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::ui::dialogs;
using namespace ::com::sun::star::document;
static bool lcl_getServiceName (const OUString &rFileURL, OUString &rName );
static std::vector<OUString> lcl_getAllFactoryURLs ();
class SearchView_Keyword
{
public:
SearchView_Keyword (const OUString &rKeyword, FILTER_APPLICATION App)
: maKeyword(rKeyword), meApp(App)
{}
bool operator() (const TemplateItemProperties &rItem)
{
bool bRet = true;
INetURLObject aUrl(rItem.aPath);
OUString aExt = aUrl.getExtension();
if (meApp == FILTER_APPLICATION::WRITER)
{
bRet = aExt == "ott" || aExt == "stw" || aExt == "oth" || aExt == "dot" || aExt == "dotx";
}
else if (meApp == FILTER_APPLICATION::CALC)
{
bRet = aExt == "ots" || aExt == "stc" || aExt == "xlt" || aExt == "xltm" || aExt == "xltx";
}
else if (meApp == FILTER_APPLICATION::IMPRESS)
{
bRet = aExt == "otp" || aExt == "sti" || aExt == "pot" || aExt == "potm" || aExt == "potx";
}
else if (meApp == FILTER_APPLICATION::DRAW)
{
bRet = aExt == "otg" || aExt == "std";
}
return bRet && rItem.aName.matchIgnoreAsciiCase(maKeyword);
}
private:
OUString maKeyword;
FILTER_APPLICATION meApp;
};
/***
*
* Order items in ascending order (useful for the selection sets and move/copy operations since the associated ids
* change when processed by the SfxDocumentTemplates class so we want to process to ones with higher id first)
*
***/
static bool cmpSelectionItems (const ThumbnailViewItem *pItem1, const ThumbnailViewItem *pItem2)
{
return pItem1->mnId > pItem2->mnId;
}
SfxTemplateManagerDlg::SfxTemplateManagerDlg(vcl::Window *parent)
: ModalDialog(parent, "TemplateDialog", "sfx/ui/templatedlg.ui"),
maSelTemplates(cmpSelectionItems),
mxDesktop( Desktop::create(comphelper::getProcessComponentContext()) ),
mbIsSynced(false),
maRepositories()
{
get(mpSearchFilter, "search_filter");
get(mpCBApp, "filter_application");
get(mpCBFolder, "filter_folder");
get(mpViewBar, "action_view");
get(mpActionBar, "action_action");
get(mpLocalView, "template_view");
get(mpSearchView, "search_view");
get(mpRemoteView, "remote_view");
get(mpOKButton, "ok");
get(mpMoveButton, "move_btn");
get(mpExportButton, "export_btn");
get(mpImportButton, "import_btn");
get(mpLinkButton, "online_link");
// Create popup menus
mpActionMenu = new PopupMenu;
mpActionMenu->InsertItem(MNI_ACTION_NEW_FOLDER,
SfxResId(STR_CATEGORY_NEW).toString(),
Image(SfxResId(IMG_ACTION_REFRESH)));
mpActionMenu->InsertItem(MNI_ACTION_DELETE_FOLDER,
SfxResId(STR_CATEGORY_DELETE).toString());
mpActionMenu->InsertSeparator();
mpActionMenu->InsertItem(MNI_ACTION_REFRESH,
SfxResId(STR_ACTION_REFRESH).toString(),
Image(SfxResId(IMG_ACTION_REFRESH)));
mpActionMenu->InsertItem(MNI_ACTION_DEFAULT,SfxResId(STR_ACTION_DEFAULT).toString());
mpActionMenu->SetSelectHdl(LINK(this,SfxTemplateManagerDlg,MenuSelectHdl));
mpRepositoryMenu = new PopupMenu;
mpRepositoryMenu->SetSelectHdl(LINK(this,SfxTemplateManagerDlg,RepositoryMenuSelectHdl));
mpTemplateDefaultMenu = new PopupMenu;
mpTemplateDefaultMenu->SetSelectHdl(LINK(this,SfxTemplateManagerDlg,DefaultTemplateMenuSelectHdl));
mpActionMenu->SetPopupMenu(MNI_ACTION_DEFAULT,mpTemplateDefaultMenu);
// Set toolbox styles
mpViewBar->SetButtonType(ButtonType::SYMBOLTEXT);
// Set toolbox button bits
mpViewBar->SetItemBits(mpViewBar->GetItemId(VIEWBAR_REPOSITORY), ToolBoxItemBits::DROPDOWNONLY);
mpActionBar->SetItemBits(mpActionBar->GetItemId(ACTIONBAR_ACTION), ToolBoxItemBits::DROPDOWNONLY);
// Set toolbox handlers
mpViewBar->SetDropdownClickHdl(LINK(this,SfxTemplateManagerDlg,TBXDropdownHdl));
mpActionBar->SetDropdownClickHdl(LINK(this,SfxTemplateManagerDlg,TBXDropdownHdl));
mpLocalView->SetStyle(mpLocalView->GetStyle() | WB_VSCROLL);
mpLocalView->setItemMaxTextLength(TEMPLATE_ITEM_MAX_TEXT_LENGTH);
mpLocalView->setItemDimensions(TEMPLATE_ITEM_MAX_WIDTH,TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
TEMPLATE_ITEM_MAX_HEIGHT-TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
TEMPLATE_ITEM_PADDING);
mpLocalView->setItemStateHdl(LINK(this,SfxTemplateManagerDlg,TVItemStateHdl));
mpLocalView->setRightClickHdl(LINK(this,SfxTemplateManagerDlg, RightClickHdl));
mpLocalView->setOpenRegionHdl(LINK(this,SfxTemplateManagerDlg, OpenRegionHdl));
mpLocalView->setOpenTemplateHdl(LINK(this,SfxTemplateManagerDlg, OpenTemplateHdl));
mpLocalView->setEditTemplateHdl(LINK(this,SfxTemplateManagerDlg, EditTemplateHdl));
mpLocalView->setDeleteTemplateHdl(LINK(this,SfxTemplateManagerDlg, DeleteTemplateHdl));
mpLocalView->setDefaultTemplateHdl(LINK(this,SfxTemplateManagerDlg, DefaultTemplateHdl));
// Set online view position and dimensions
mpRemoteView->setItemMaxTextLength(TEMPLATE_ITEM_MAX_TEXT_LENGTH);
mpRemoteView->setItemDimensions(TEMPLATE_ITEM_MAX_WIDTH,TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
TEMPLATE_ITEM_MAX_HEIGHT-TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
TEMPLATE_ITEM_PADDING);
mpRemoteView->setItemStateHdl(LINK(this,SfxTemplateManagerDlg,TVItemStateHdl));
mpRemoteView->setOpenRegionHdl(LINK(this,SfxTemplateManagerDlg,OpenRegionHdl));
mpRemoteView->setOpenTemplateHdl(LINK(this,SfxTemplateManagerDlg,OpenTemplateHdl));
mpSearchView->setItemMaxTextLength(TEMPLATE_ITEM_MAX_TEXT_LENGTH);
mpSearchView->setItemDimensions(TEMPLATE_ITEM_MAX_WIDTH,TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
TEMPLATE_ITEM_MAX_HEIGHT_SUB-TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
TEMPLATE_ITEM_PADDING);
mpSearchView->setItemStateHdl(LINK(this,SfxTemplateManagerDlg,TVItemStateHdl));
mpSearchView->setRightClickHdl(LINK(this,SfxTemplateManagerDlg, RightClickHdl));
mpSearchView->setOpenTemplateHdl(LINK(this,SfxTemplateManagerDlg,OpenTemplateHdl));
mpSearchView->setEditTemplateHdl(LINK(this,SfxTemplateManagerDlg, EditTemplateHdl));
mpSearchView->setDeleteTemplateHdl(LINK(this,SfxTemplateManagerDlg, DeleteTemplateHdl));
mpSearchView->setDefaultTemplateHdl(LINK(this,SfxTemplateManagerDlg, DefaultTemplateHdl));
mpOKButton->SetClickHdl(LINK(this, SfxTemplateManagerDlg, OkClickHdl));
mpMoveButton->SetClickHdl(LINK(this, SfxTemplateManagerDlg, MoveClickHdl));
mpExportButton->SetClickHdl(LINK(this, SfxTemplateManagerDlg, ExportClickHdl));
mpImportButton->SetClickHdl(LINK(this, SfxTemplateManagerDlg, ImportClickHdl));
mpLinkButton->SetClickHdl(LINK(this, SfxTemplateManagerDlg, LinkClickHdl));
mpSearchFilter->SetUpdateDataHdl(LINK(this, SfxTemplateManagerDlg, SearchUpdateHdl));
mpSearchFilter->EnableUpdateData();
SvtMiscOptions aMiscOptions;
if ( !aMiscOptions.IsExperimentalMode() )
{
sal_uInt16 nPos = mpViewBar->GetItemPos(mpViewBar->GetItemId(VIEWBAR_REPOSITORY));
mpViewBar->RemoveItem(nPos);
}
mpViewBar->Show();
mpActionBar->Show();
switchMainView(true);
loadRepositories();
createRepositoryMenu();
createDefaultTemplateMenu();
mpLocalView->Populate();
mpCurView->filterItems(ViewFilter_Application(FILTER_APPLICATION::NONE));
mpCBApp->SelectEntryPos(0);
fillFolderComboBox();
mpExportButton->Disable();
mpMoveButton->Disable();
mpOKButton->SetText(SfxResId(STR_OPEN).toString());
mpCBApp->SetSelectHdl(LINK(this, SfxTemplateManagerDlg, SelectApplicationHdl));
mpCBFolder->SetSelectHdl(LINK(this, SfxTemplateManagerDlg, SelectRegionHdl));
readSettings();
mpLocalView->Show();
}
SfxTemplateManagerDlg::~SfxTemplateManagerDlg()
{
disposeOnce();
}
void SfxTemplateManagerDlg::dispose()
{
writeSettings();
// Synchronize the config before deleting it
syncRepositories();
for (TemplateRepository* p : maRepositories)
delete p;
// Ignore view events since we are cleaning the object
mpLocalView->setItemStateHdl(Link<const ThumbnailViewItem*,void>());
mpLocalView->setOpenRegionHdl(Link<void*,void>());
mpLocalView->setOpenTemplateHdl(Link<ThumbnailViewItem*, void>());
mpRemoteView->setItemStateHdl(Link<const ThumbnailViewItem*,void>());
mpRemoteView->setOpenRegionHdl(Link<void*,void>());
mpRemoteView->setOpenTemplateHdl(Link<ThumbnailViewItem*,void>());
mpSearchView->setItemStateHdl(Link<const ThumbnailViewItem*,void>());
mpSearchView->setOpenTemplateHdl(Link<ThumbnailViewItem*, void>());
mpOKButton.clear();
mpMoveButton.clear();
mpExportButton.clear();
mpImportButton.clear();
mpLinkButton.clear();
mpSearchFilter.clear();
mpCBApp.clear();
mpCBFolder.clear();
mpViewBar.clear();
mpActionBar.clear();
mpSearchView.clear();
mpCurView.clear();
mpLocalView.clear();
mpRemoteView.clear();
ModalDialog::dispose();
}
void SfxTemplateManagerDlg::setDocumentModel(const uno::Reference<frame::XModel> &rModel)
{
m_xModel = rModel;
}
FILTER_APPLICATION SfxTemplateManagerDlg::getCurrentApplicationFilter()
{
const sal_Int16 nCurAppId = mpCBApp->GetSelectEntryPos();
if (nCurAppId == MNI_WRITER)
return FILTER_APPLICATION::WRITER;
else if (nCurAppId == MNI_IMPRESS)
return FILTER_APPLICATION::IMPRESS;
else if (nCurAppId == MNI_CALC)
return FILTER_APPLICATION::CALC;
else if (nCurAppId == MNI_DRAW)
return FILTER_APPLICATION::DRAW;
return FILTER_APPLICATION::NONE;
}
void SfxTemplateManagerDlg::fillFolderComboBox()
{
std::vector<OUString> aFolderNames = mpLocalView->getFolderNames();
if (!aFolderNames.empty())
{
for (size_t i = 0, n = aFolderNames.size(); i < n; ++i)
mpCBFolder->InsertEntry(aFolderNames[i], i+1);
}
mpCBFolder->SelectEntryPos(0);
}
void SfxTemplateManagerDlg::readSettings ()
{
OUString aLastFolder;
SvtViewOptions aViewSettings( E_DIALOG, TM_SETTING_MANAGER );
if ( aViewSettings.Exists() )
{
sal_uInt16 nTmp = 0;
aViewSettings.GetUserItem(TM_SETTING_LASTFOLDER) >>= aLastFolder;
aViewSettings.GetUserItem(TM_SETTING_LASTAPPLICATION) >>= nTmp;
switch (nTmp)
{
case MNI_WRITER:
mpCBApp->SelectEntryPos(MNI_WRITER);
break;
case MNI_CALC:
mpCBApp->SelectEntryPos(MNI_CALC);
break;
case MNI_IMPRESS:
mpCBApp->SelectEntryPos(MNI_IMPRESS);
break;
case MNI_DRAW:
mpCBApp->SelectEntryPos(MNI_DRAW);
break;
default:
mpCBApp->SelectEntryPos(0);
}
}
mpCurView->filterItems(ViewFilter_Application(getCurrentApplicationFilter()));
if (aLastFolder.isEmpty())
{
//show all categories
mpCBFolder->SelectEntryPos(0);
mpLocalView->showAllTemplates();
}
else
{
mpCBFolder->SelectEntry(aLastFolder);
mpLocalView->showRegion(aLastFolder);
}
}
void SfxTemplateManagerDlg::writeSettings ()
{
OUString aLastFolder;
if (mpCurView == mpLocalView && mpLocalView->getCurRegionId())
aLastFolder = mpLocalView->getRegionName(mpLocalView->getCurRegionId()-1);
// last folder
Sequence< NamedValue > aSettings
{
{ TM_SETTING_LASTFOLDER, css::uno::makeAny(aLastFolder) },
{ TM_SETTING_LASTAPPLICATION, css::uno::makeAny(sal_uInt16(mpCBApp->GetSelectEntryPos())) }
};
// write
SvtViewOptions aViewSettings(E_DIALOG, TM_SETTING_MANAGER);
aViewSettings.SetUserData(aSettings);
}
IMPL_LINK_NOARG_TYPED(SfxTemplateManagerDlg, SelectApplicationHdl, ListBox&, void)
{
if(mpCurView == mpLocalView && mpCurView->IsVisible())
{
mpCurView->filterItems(ViewFilter_Application(getCurrentApplicationFilter()));
mpCurView->showAllTemplates();
mpCBFolder->SelectEntryPos(0);
}
if(mpSearchView->IsVisible())
SearchUpdateHdl(*mpSearchFilter);
}
IMPL_LINK_NOARG_TYPED(SfxTemplateManagerDlg, SelectRegionHdl, ListBox&, void)
{
if(mpCurView == mpLocalView)
{
const OUString sSelectedRegion = mpCBFolder->GetSelectEntry();
if(mpCBFolder->GetSelectEntryPos() == 0)
mpLocalView->showAllTemplates();
else
mpLocalView->showRegion(sSelectedRegion);
}
if(mpSearchView->IsVisible())
SearchUpdateHdl(*mpSearchFilter);
}
IMPL_LINK_TYPED(SfxTemplateManagerDlg, TBXDropdownHdl, ToolBox*, pBox, void)
{
const sal_uInt16 nCurItemId = pBox->GetCurItemId();
if (pBox == mpActionBar && nCurItemId == mpActionBar->GetItemId(ACTIONBAR_ACTION))
{
pBox->SetItemDown( nCurItemId, true );
mpActionMenu->Execute(pBox, pBox->GetItemRect(nCurItemId), PopupMenuFlags::ExecuteDown);
pBox->SetItemDown( nCurItemId, false );
pBox->EndSelection();
pBox->Invalidate();
}
else if (pBox == mpViewBar && nCurItemId == mpViewBar->GetItemId(VIEWBAR_REPOSITORY))
{
pBox->SetItemDown( nCurItemId, true );
mpRepositoryMenu->Execute(pBox, pBox->GetItemRect(nCurItemId), PopupMenuFlags::ExecuteDown);
pBox->SetItemDown( nCurItemId, false );
pBox->EndSelection();
pBox->Invalidate();
}
}
IMPL_LINK_TYPED(SfxTemplateManagerDlg, TVItemStateHdl, const ThumbnailViewItem*, pItem, void)
{
const TemplateViewItem *pViewItem = dynamic_cast<const TemplateViewItem*>(pItem);
if (pViewItem)
OnTemplateState(pItem);
}
IMPL_LINK_TYPED(SfxTemplateManagerDlg, MenuSelectHdl, Menu*, pMenu, bool)
{
sal_uInt16 nMenuId = pMenu->GetCurItemId();
switch(nMenuId)
{
case MNI_ACTION_NEW_FOLDER:
OnCategoryNew();
break;
case MNI_ACTION_DELETE_FOLDER:
OnCategoryDelete();
break;
case MNI_ACTION_REFRESH:
mpCurView->reload();
break;
default:
break;
}
return false;
}
IMPL_LINK_TYPED(SfxTemplateManagerDlg, RepositoryMenuSelectHdl, Menu*, pMenu, bool)
{
sal_uInt16 nMenuId = pMenu->GetCurItemId();
if (nMenuId == MNI_REPOSITORY_LOCAL)
{
switchMainView(true);
}
else if (nMenuId == MNI_REPOSITORY_NEW)
{
ScopedVclPtrInstance< PlaceEditDialog > dlg(this);
if (dlg->Execute())
{
std::shared_ptr<Place> xPlace = dlg->GetPlace();
if (insertRepository(xPlace->GetName(), xPlace->GetUrl()))
{
// update repository list menu.
createRepositoryMenu();
}
else
{
OUString aMsg(SfxResId(STR_MSG_ERROR_REPOSITORY_NAME).toString());
aMsg = aMsg.replaceFirst("$1", xPlace->GetName());
ScopedVclPtrInstance<MessageDialog>(this, aMsg)->Execute();
}
}
}
else
{
sal_uInt16 nRepoId = nMenuId - MNI_REPOSITORY_BASE;
TemplateRepository *pRepository = nullptr;
for (TemplateRepository* p : maRepositories)
{
if (p->mnId == nRepoId)
{
pRepository = p;
break;
}
}
if (mpRemoteView->loadRepository(pRepository))
switchMainView(false);
}
return false;
}
IMPL_LINK_TYPED(SfxTemplateManagerDlg, DefaultTemplateMenuSelectHdl, Menu*, pMenu, bool)
{
sal_uInt16 nId = pMenu->GetCurItemId();
OUString aServiceName = SfxObjectShell::GetServiceNameFromFactory( mpTemplateDefaultMenu->GetItemCommand(nId));
SfxObjectFactory::SetStandardTemplate( aServiceName, OUString() );
createDefaultTemplateMenu();
return false;
}
IMPL_LINK_NOARG_TYPED(SfxTemplateManagerDlg, OkClickHdl, Button*, void)
{
OnTemplateOpen();
EndDialog(RET_OK);
}
IMPL_LINK_NOARG_TYPED(SfxTemplateManagerDlg, MoveClickHdl, Button*, void)
{
// modal dialog to select templates category
ScopedVclPtrInstance<SfxTemplateCategoryDialog> aDlg;
aDlg->SetCategoryLBEntries(mpLocalView->getFolderNames());
size_t nItemId = 0;
if(aDlg->Execute() == RET_OK)
{
OUString sCategory = aDlg->GetSelectedCategory();
bool bIsNewCategory = aDlg->IsNewCategoryCreated();
if(bIsNewCategory)
{
if (!sCategory.isEmpty())
nItemId = mpLocalView->createRegion(sCategory);
}
else
{
nItemId = mpLocalView->getRegionId(sCategory);
}
}
if(nItemId)
{
if (mpSearchView->IsVisible())
{
// Check if we are searching the local or remote templates
if (mpCurView == mpLocalView)
localSearchMoveTo(nItemId);
}
else
{
// Check if we are displaying the local or remote templates
if (mpCurView == mpLocalView)
localMoveTo(nItemId);
else
remoteMoveTo(nItemId);
}
}
mpLocalView->reload();
}
IMPL_LINK_NOARG_TYPED(SfxTemplateManagerDlg, ExportClickHdl, Button*, void)
{
OnTemplateExport();
}
IMPL_LINK_NOARG_TYPED(SfxTemplateManagerDlg, ImportClickHdl, Button*, void)
{
//Modal Dialog to select Category
ScopedVclPtrInstance<SfxTemplateCategoryDialog> aDlg;
aDlg->SetCategoryLBEntries(mpLocalView->getFolderNames());
if(aDlg->Execute() == RET_OK)
{
OUString sCategory = aDlg->GetSelectedCategory();
bool bIsNewCategory = aDlg->IsNewCategoryCreated();
if(bIsNewCategory)
{
if(mpCurView->createRegion(sCategory))
{
mpCBFolder->InsertEntry(sCategory);
OnTemplateImportCategory(sCategory);
}
else
{
OUString aMsg( SfxResId(STR_CREATE_ERROR).toString() );
ScopedVclPtrInstance<MessageDialog>::Create(this, aMsg.replaceFirst("$1", sCategory))->Execute();
return;
}
}
else
OnTemplateImportCategory(sCategory);
}
mpLocalView->reload();
mpLocalView->showAllTemplates();
mpCBApp->SelectEntryPos(0);
mpCBFolder->SelectEntryPos(0);
}
IMPL_LINK_NOARG_TYPED(SfxTemplateManagerDlg, LinkClickHdl, Button*, void)
{
OnTemplateLink();
}
IMPL_LINK_NOARG_TYPED(SfxTemplateManagerDlg, OpenRegionHdl, void*, void)
{
maSelTemplates.clear();
mpOKButton->Disable();
mpViewBar->Show();
mpActionBar->Show();
}
IMPL_LINK_TYPED(SfxTemplateManagerDlg, RightClickHdl, ThumbnailViewItem*, pItem, void)
{
const TemplateViewItem *pViewItem = dynamic_cast<TemplateViewItem*>(pItem);
if (pViewItem)
{
if(mpCurView == mpLocalView)
{
if(mpSearchView->IsVisible())
mpSearchView->createContextMenu();
else
mpLocalView->createContextMenu();
}
}
}
IMPL_LINK_TYPED(SfxTemplateManagerDlg, OpenTemplateHdl, ThumbnailViewItem*, pItem, void)
{
uno::Sequence< PropertyValue > aArgs(4);
aArgs[0].Name = "AsTemplate";
aArgs[0].Value <<= true;
aArgs[1].Name = "MacroExecutionMode";
aArgs[1].Value <<= MacroExecMode::USE_CONFIG;
aArgs[2].Name = "UpdateDocMode";
aArgs[2].Value <<= UpdateDocMode::ACCORDING_TO_CONFIG;
aArgs[3].Name = "InteractionHandler";
aArgs[3].Value <<= task::InteractionHandler::createWithParent( ::comphelper::getProcessComponentContext(), nullptr );
TemplateViewItem *pTemplateItem = static_cast<TemplateViewItem*>(pItem);
try
{
mxDesktop->loadComponentFromURL(pTemplateItem->getPath(),"_default", 0, aArgs );
}
catch( const uno::Exception& )
{
}
Close();
}
IMPL_LINK_TYPED(SfxTemplateManagerDlg, EditTemplateHdl, ThumbnailViewItem*, pItem, void)
{
uno::Sequence< PropertyValue > aArgs(3);
aArgs[0].Name = "AsTemplate";
aArgs[0].Value <<= false;
aArgs[1].Name = "MacroExecutionMode";
aArgs[1].Value <<= MacroExecMode::USE_CONFIG;
aArgs[2].Name = "UpdateDocMode";
aArgs[2].Value <<= UpdateDocMode::ACCORDING_TO_CONFIG;
uno::Reference< XStorable > xStorable;
TemplateViewItem *pViewItem = static_cast<TemplateViewItem*>(pItem);
try
{
xStorable.set( mxDesktop->loadComponentFromURL(pViewItem->getPath(),"_default", 0, aArgs ),
uno::UNO_QUERY );
}
catch( const uno::Exception& )
{
}
Close();
}
IMPL_LINK_TYPED(SfxTemplateManagerDlg, DeleteTemplateHdl, ThumbnailViewItem*, pItem, void)
{
ScopedVclPtrInstance< MessageDialog > aQueryDlg(this, SfxResId(STR_QMSG_SEL_TEMPLATE_DELETE), VCL_MESSAGE_QUESTION, VCL_BUTTONS_YES_NO);
if ( aQueryDlg->Execute() != RET_YES )
return;
OUString aDeletedTemplate;
if(mpSearchView->IsVisible())
{
TemplateSearchViewItem *pSrchItem = static_cast<TemplateSearchViewItem*>(pItem);
if (!mpLocalView->removeTemplate((pSrchItem)->mnAssocId, pSrchItem->mnRegionId))
{
aDeletedTemplate = (pSrchItem)->maTitle;
}
}
else
{
TemplateViewItem *pViewItem = static_cast<TemplateViewItem*>(pItem);
sal_uInt16 nRegionItemId = mpLocalView->getRegionId(pViewItem->mnRegionId);
if (!mpLocalView->removeTemplate((pViewItem)->mnId,nRegionItemId))
{
aDeletedTemplate = (pItem)->maTitle;
}
}
if (!aDeletedTemplate.isEmpty())
{
OUString aMsg( SfxResId(STR_MSG_ERROR_DELETE_TEMPLATE).toString() );
ScopedVclPtrInstance<MessageDialog>::Create(this, aMsg.replaceFirst("$1",aDeletedTemplate))->Execute();
}
mpLocalView->reload();
if(mpSearchView->IsVisible())
SearchUpdateHdl(*mpSearchFilter);
}
IMPL_LINK_TYPED(SfxTemplateManagerDlg, DefaultTemplateHdl, ThumbnailViewItem*, pItem, void)
{
TemplateViewItem *pViewItem = static_cast<TemplateViewItem*>(pItem);
OUString aServiceName;
if (lcl_getServiceName(pViewItem->getPath(),aServiceName))
{
SfxObjectFactory::SetStandardTemplate(aServiceName,pViewItem->getPath());
createDefaultTemplateMenu();
}
}
IMPL_LINK_NOARG_TYPED(SfxTemplateManagerDlg, SearchUpdateHdl, Edit&, void)
{
OUString aKeyword = mpSearchFilter->GetText();
if (!aKeyword.isEmpty())
{
mpSearchView->Clear();
// if the search view is hidden, hide the folder view and display search one
if (!mpSearchView->IsVisible())
{
mpCurView->deselectItems();
mpSearchView->Show();
mpCurView->Hide();
}
std::vector<TemplateItemProperties> aItems =
mpLocalView->getFilteredItems(SearchView_Keyword(aKeyword, getCurrentApplicationFilter()));
for (TemplateItemProperties& rItem : aItems)
{
OUString aFolderName;
aFolderName = mpLocalView->getRegionName(rItem.nRegionId);
mpSearchView->AppendItem(rItem.nId,mpLocalView->getRegionId(rItem.nRegionId),
rItem.nDocId,
rItem.aName,
aFolderName,
rItem.aPath,
rItem.aThumbnail);
}
mpSearchView->Invalidate();
}
else
{
mpSearchView->deselectItems();
mpSearchView->Hide();
mpCurView->Show();
mpCurView->filterItems(ViewFilter_Application(getCurrentApplicationFilter()));
if(mpCurView == mpLocalView)
{
OUString sLastFolder = mpCBFolder->GetSelectEntry();
mpLocalView->showRegion(sLastFolder);
}
}
}
void SfxTemplateManagerDlg::OnTemplateState (const ThumbnailViewItem *pItem)
{
bool bInSelection = maSelTemplates.find(pItem) != maSelTemplates.end();
if (pItem->isSelected())
{
if (maSelTemplates.empty())
{
mpOKButton->Enable();
}
else if (maSelTemplates.size() != 1 || !bInSelection)
{
mpOKButton->Disable();
}
if (!bInSelection)
maSelTemplates.insert(pItem);
}
else
{
if (bInSelection)
{
maSelTemplates.erase(pItem);
if (maSelTemplates.empty())
{
mpOKButton->Disable();
}
else if (maSelTemplates.size() == 1)
{
mpOKButton->Enable();
}
}
}
if(maSelTemplates.empty())
{
mpMoveButton->Disable();
mpExportButton->Disable();
}
else
{
mpMoveButton->Enable();
mpExportButton->Enable();
}
}
void SfxTemplateManagerDlg::OnTemplateImportCategory(OUString sCategory)
{
sal_Int16 nDialogType =
css::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE;
sfx2::FileDialogHelper aFileDlg(nDialogType, FileDialogFlags::MultiSelection);
// add "All" filter
aFileDlg.AddFilter( SfxResId(STR_SFX_FILTERNAME_ALL).toString(),
FILEDIALOG_FILTER_ALL );
// add template filter
OUString sFilterExt;
OUString sFilterName( SfxResId( STR_TEMPLATE_FILTER ).toString() );
// add filters of modules which are installed
SvtModuleOptions aModuleOpt;
if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::EModule::WRITER ) )
sFilterExt += "*.ott;*.stw;*.oth";
if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::EModule::CALC ) )
{
if ( !sFilterExt.isEmpty() )
sFilterExt += ";";
sFilterExt += "*.ots;*.stc";
}
if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::EModule::IMPRESS ) )
{
if ( !sFilterExt.isEmpty() )
sFilterExt += ";";
sFilterExt += "*.otp;*.sti";
}
if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::EModule::DRAW ) )
{
if ( !sFilterExt.isEmpty() )
sFilterExt += ";";
sFilterExt += "*.otg;*.std";
}
if ( !sFilterExt.isEmpty() )
sFilterExt += ";";
sFilterExt += "*.vor";
sFilterName += " (";
sFilterName += sFilterExt;
sFilterName += ")";
aFileDlg.AddFilter( sFilterName, sFilterExt );
aFileDlg.SetCurrentFilter( sFilterName );
ErrCode nCode = aFileDlg.Execute();
if ( nCode == ERRCODE_NONE )
{
css::uno::Sequence<OUString> aFiles = aFileDlg.GetSelectedFiles();
if (aFiles.hasElements())
{
//Import to the selected regions
TemplateContainerItem* pContItem = const_cast<TemplateContainerItem*>(static_cast<const TemplateContainerItem*>(mpLocalView->getRegion(sCategory)));
if(pContItem)
{
OUString aTemplateList;
for (size_t i = 0, n = aFiles.getLength(); i < n; ++i)
{
if(!mpLocalView->copyFrom(pContItem,aFiles[i]))
{
if (aTemplateList.isEmpty())
aTemplateList = aFiles[i];
else
aTemplateList = aTemplateList + "\n" + aFiles[i];
}
}
if (!aTemplateList.isEmpty())
{
OUString aMsg(SfxResId(STR_MSG_ERROR_IMPORT).toString());
aMsg = aMsg.replaceFirst("$1",pContItem->maTitle);
ScopedVclPtrInstance<MessageDialog>::Create(this, aMsg.replaceFirst("$2",aTemplateList))->Execute();
}
}
}
}
}
void SfxTemplateManagerDlg::OnTemplateExport()
{
uno::Reference<XComponentContext> xContext(comphelper::getProcessComponentContext());
uno::Reference<XFolderPicker2> xFolderPicker = FolderPicker::create(xContext);
xFolderPicker->setDisplayDirectory(SvtPathOptions().GetWorkPath());
sal_Int16 nResult = xFolderPicker->execute();
if( nResult == ExecutableDialogResults::OK )
{
OUString aTemplateList;
INetURLObject aPathObj(xFolderPicker->getDirectory());
aPathObj.setFinalSlash();
if (mpSearchView->IsVisible())
{
sal_uInt16 i = 1;
std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter = maSelTemplates.begin();
for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end(); ++pIter, ++i)
{
const TemplateSearchViewItem *pItem = static_cast<const TemplateSearchViewItem*>(*pIter);
INetURLObject aItemPath(pItem->getPath());
if ( 1 == i )
aPathObj.Append(aItemPath.getName());
else
aPathObj.setName(aItemPath.getName());
OUString aPath = aPathObj.GetMainURL( INetURLObject::NO_DECODE );
if (!mpLocalView->exportTo(pItem->mnAssocId,pItem->mnRegionId,aPath))
{
if (aTemplateList.isEmpty())
aTemplateList = pItem->maTitle;
else
aTemplateList = aTemplateList + "\n" + pItem->maTitle;
}
}
mpSearchView->deselectItems();
}
else
{
// export templates from the current view
sal_uInt16 i = 1;
std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter = maSelTemplates.begin();
for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end(); ++pIter, ++i)
{
const TemplateViewItem *pItem = static_cast<const TemplateViewItem*>(*pIter);
INetURLObject aItemPath(pItem->getPath());
if ( 1 == i )
aPathObj.Append(aItemPath.getName());
else
aPathObj.setName(aItemPath.getName());
OUString aPath = aPathObj.GetMainURL( INetURLObject::NO_DECODE );
if (!mpLocalView->exportTo(pItem->mnId,
mpLocalView->getRegionId(pItem->mnRegionId), //pItem->mnRegionId does not store actual region Id
aPath))
{
if (aTemplateList.isEmpty())
aTemplateList = pItem->maTitle;
else
aTemplateList = aTemplateList + "\n" + pItem->maTitle;
}
}
mpLocalView->deselectItems();
}
if (!aTemplateList.isEmpty())
{
OUString aText( SfxResId(STR_MSG_ERROR_EXPORT).toString() );
ScopedVclPtrInstance<MessageDialog>::Create(this, aText.replaceFirst("$1",aTemplateList))->Execute();
}
}
}
void SfxTemplateManagerDlg::OnTemplateLink ()
{
OUString sNode("TemplateRepositoryURL");
OUString sNodePath("/org.openoffice.Office.Common/Help/StartCenter");
try
{
Reference<lang::XMultiServiceFactory> xConfig = configuration::theDefaultProvider::get( comphelper::getProcessComponentContext() );
Sequence<Any> args(1);
PropertyValue val(
"nodepath",
0,
Any(sNodePath),
PropertyState_DIRECT_VALUE);
args.getArray()[0] <<= val;
Reference<container::XNameAccess> xNameAccess(xConfig->createInstanceWithArguments(SERVICENAME_CFGREADACCESS,args), UNO_QUERY);
if( xNameAccess.is() )
{
OUString sURL;
//throws css::container::NoSuchElementException, css::lang::WrappedTargetException
Any value( xNameAccess->getByName(sNode) );
sURL = value.get<OUString> ();
localizeWebserviceURI(sURL);
Reference< css::system::XSystemShellExecute > xSystemShellExecute(
css::system::SystemShellExecute::create(comphelper::getProcessComponentContext()));
xSystemShellExecute->execute( sURL, OUString(), css::system::SystemShellExecuteFlags::URIS_ONLY);
}
}
catch (const Exception&)
{
}
}
void SfxTemplateManagerDlg::OnTemplateOpen ()
{
ThumbnailViewItem *pItem = const_cast<ThumbnailViewItem*>(*maSelTemplates.begin());
OpenTemplateHdl(pItem);
}
void SfxTemplateManagerDlg::OnCategoryNew()
{
ScopedVclPtrInstance< InputDialog > dlg(SfxResId(STR_INPUT_NEW).toString(),this);
int ret = dlg->Execute();
if (ret)
{
OUString aName = dlg->GetEntryText();
if(mpCurView->createRegion(aName))
mpCBFolder->InsertEntry(aName);
else
{
OUString aMsg( SfxResId(STR_CREATE_ERROR).toString() );
ScopedVclPtrInstance<MessageDialog>::Create(this, aMsg.replaceFirst("$1", aName))->Execute();
}
}
}
void SfxTemplateManagerDlg::OnCategoryDelete()
{
ScopedVclPtrInstance< SfxTemplateCategoryDialog > aDlg;
aDlg->SetCategoryLBEntries(mpLocalView->getFolderNames());
aDlg->HideNewCategoryOption();
aDlg->SetText(SfxResId(STR_CATEGORY_DELETE).toString());
aDlg->SetSelectLabelText(SfxResId(STR_CATEGORY_SELECT).toString());
if(aDlg->Execute() == RET_OK)
{
OUString sCategory = aDlg->GetSelectedCategory();
aDlg->Close();
ScopedVclPtrInstance< MessageDialog > popupDlg(this, SfxResId(STR_QMSG_SEL_FOLDER_DELETE),
VCL_MESSAGE_QUESTION, VCL_BUTTONS_YES_NO);
if ( popupDlg->Execute() != RET_YES )
return;
sal_Int16 nItemId = mpLocalView->getRegionId(sCategory);
if (!mpLocalView->removeRegion(nItemId))
{
OUString sMsg( SfxResId(STR_MSG_ERROR_DELETE_FOLDER).toString() );
ScopedVclPtrInstance<MessageDialog>::Create(this, sMsg.replaceFirst("$1",sCategory))->Execute();
}
else
{
mpCBFolder->RemoveEntry(sCategory);
}
}
mpLocalView->reload();
mpLocalView->showAllTemplates();
mpCBApp->SelectEntryPos(0);
mpCBFolder->SelectEntryPos(0);
}
void SfxTemplateManagerDlg::OnRepositoryDelete()
{
if(deleteRepository(mpRemoteView->getCurRegionId()))
{
// switch to local view
switchMainView(true);
createRepositoryMenu();
}
}
void SfxTemplateManagerDlg::createRepositoryMenu()
{
mpRepositoryMenu->Clear();
mpRepositoryMenu->InsertItem(MNI_REPOSITORY_LOCAL,SfxResId(STR_REPOSITORY_LOCAL).toString());
const std::vector<TemplateRepository*> &rRepos = getRepositories();
for (const TemplateRepository* pRepo : rRepos)
mpRepositoryMenu->InsertItem(MNI_REPOSITORY_BASE+pRepo->mnId, pRepo->maTitle);
mpRepositoryMenu->InsertSeparator();
mpRepositoryMenu->InsertItem(MNI_REPOSITORY_NEW,SfxResId(STR_REPOSITORY_NEW).toString());
}
void SfxTemplateManagerDlg::createDefaultTemplateMenu ()
{
std::vector<OUString> aList = lcl_getAllFactoryURLs();
if (!aList.empty())
{
mpTemplateDefaultMenu->Clear();
sal_uInt16 nItemId = MNI_ACTION_DEFAULT + 1;
for( std::vector<OUString>::const_iterator i = aList.begin(); i != aList.end(); ++i )
{
INetURLObject aObj(*i);
OUString aTitle = SvFileInformationManager::GetDescription(aObj);
mpTemplateDefaultMenu->InsertItem(nItemId, aTitle, SvFileInformationManager::GetImage(aObj));
mpTemplateDefaultMenu->SetItemCommand(nItemId++, *i);
}
mpActionMenu->ShowItem(MNI_ACTION_DEFAULT);
}
else
mpActionMenu->HideItem(MNI_ACTION_DEFAULT);
}
void SfxTemplateManagerDlg::switchMainView(bool bDisplayLocal)
{
if (bDisplayLocal)
{
mpCurView = mpLocalView.get();
mpRemoteView->Hide();
mpLocalView->Show();
}
else
{
mpCurView = mpRemoteView.get();
mpLocalView->Hide();
mpRemoteView->Show();
}
}
void SfxTemplateManagerDlg::localMoveTo(sal_uInt16 nItemId)
{
if (nItemId)
{
// Move templates to desired folder if for some reason move fails
// try copying them.
if (!mpLocalView->moveTemplates(maSelTemplates,nItemId))
{
OUString aTemplateList;
std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end(); ++pIter)
{
if (aTemplateList.isEmpty())
aTemplateList = (*pIter)->maTitle;
else
aTemplateList = aTemplateList + "\n" + (*pIter)->maTitle;
}
OUString aDst = mpLocalView->getRegionItemName(nItemId);
OUString aMsg(SfxResId(STR_MSG_ERROR_LOCAL_MOVE).toString());
aMsg = aMsg.replaceFirst("$1",aDst);
ScopedVclPtrInstance<MessageDialog>::Create(this, aMsg.replaceFirst( "$2",aTemplateList))->Execute();
}
}
}
void SfxTemplateManagerDlg::remoteMoveTo(const sal_uInt16 nItemId)
{
if (nItemId)
{
OUString aTemplateList;
std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator aIter;
for (aIter = maSelTemplates.begin(); aIter != maSelTemplates.end(); ++aIter)
{
const TemplateSearchViewItem *pItem =
static_cast<const TemplateSearchViewItem*>(*aIter);
if(!mpLocalView->copyFrom(nItemId,pItem->maPreview1,pItem->getPath()))
{
if (aTemplateList.isEmpty())
aTemplateList = pItem->maTitle;
else
aTemplateList = aTemplateList + "\n" + pItem->maTitle;
}
}
mpLocalView->Invalidate(InvalidateFlags::NoErase);
if (!aTemplateList.isEmpty())
{
OUString aMsg(SfxResId(STR_MSG_ERROR_REMOTE_MOVE).toString());
aMsg = aMsg.replaceFirst("$1",mpRemoteView->getCurRegionName());
aMsg = aMsg.replaceFirst("$2",mpLocalView->getRegionItemName(nItemId));
ScopedVclPtrInstance<MessageDialog>::Create(this, aMsg.replaceFirst("$1",aTemplateList))->Execute();
}
}
}
void SfxTemplateManagerDlg::localSearchMoveTo(sal_uInt16 nItemId)
{
if (nItemId)
{
OUString aTemplateList;
// Move templates to desired folder if for some reason move fails
// try copying them.
std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator aIter;
std::set<const ThumbnailViewItem*,selection_cmp_fn> aSelTemplates = maSelTemplates; //Copy to avoid invalidating an iterator
for (aIter = aSelTemplates.begin(); aIter != aSelTemplates.end(); ++aIter)
{
const TemplateSearchViewItem *pItem =
static_cast<const TemplateSearchViewItem*>(*aIter);
if(!mpLocalView->moveTemplate(pItem,pItem->mnRegionId,nItemId))
{
if (aTemplateList.isEmpty())
aTemplateList = (*aIter)->maTitle;
else
aTemplateList = aTemplateList + "\n" + (*aIter)->maTitle;
}
}
if (!aTemplateList.isEmpty())
{
OUString aDst = mpLocalView->getRegionItemName(nItemId);
OUString aMsg(SfxResId(STR_MSG_ERROR_LOCAL_MOVE).toString());
aMsg = aMsg.replaceFirst("$1",aDst);
ScopedVclPtrInstance<MessageDialog>::Create(this, aMsg.replaceFirst( "$2",aTemplateList))->Execute();
}
}
// Deselect all items and update search results
mpSearchView->deselectItems();
SearchUpdateHdl(*mpSearchFilter);
}
void SfxTemplateManagerDlg::loadRepositories()
{
uno::Reference< uno::XComponentContext > xContext(comphelper::getProcessComponentContext());
// Load from user settings
css::uno::Sequence<OUString> aUrls =
officecfg::Office::Common::Misc::TemplateRepositoryUrls::get(xContext);
css::uno::Sequence<OUString> aNames =
officecfg::Office::Common::Misc::TemplateRepositoryNames::get(xContext);
for (sal_Int32 i = 0; i < aUrls.getLength() && i < aNames.getLength(); ++i)
{
TemplateRepository *pItem = new TemplateRepository();
pItem->mnId = i+1;
pItem->maTitle = aNames[i];
pItem->setURL(aUrls[i]);
maRepositories.push_back(pItem);
}
}
bool SfxTemplateManagerDlg::insertRepository(const OUString &rName, const OUString &rURL)
{
for (TemplateRepository* pRepo : maRepositories)
{
if (pRepo->maTitle == rName)
return false;
}
TemplateRepository *pItem = new TemplateRepository();
pItem->mnId = maRepositories.size()+1;
pItem->maTitle = rName;
pItem->setURL(rURL);
maRepositories.push_back(pItem);
mbIsSynced = false;
return true;
}
bool SfxTemplateManagerDlg::deleteRepository(const sal_uInt16 nRepositoryId)
{
bool bRet = false;
for (size_t i = 0, n = maRepositories.size(); i < n; ++i)
{
if (maRepositories[i]->mnId == nRepositoryId)
{
delete maRepositories[i];
maRepositories.erase(maRepositories.begin() + i);
mbIsSynced = false;
bRet = true;
break;
}
}
return bRet;
}
void SfxTemplateManagerDlg::syncRepositories() const
{
if (!mbIsSynced)
{
uno::Reference < uno::XComponentContext > pContext(comphelper::getProcessComponentContext());
std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create(pContext));
size_t nSize = maRepositories.size();
uno::Sequence<OUString> aUrls(nSize);
uno::Sequence<OUString> aNames(nSize);
for(size_t i = 0; i < nSize; ++i)
{
aUrls[i] = maRepositories[i]->getURL();
aNames[i] = maRepositories[i]->maTitle;
}
officecfg::Office::Common::Misc::TemplateRepositoryUrls::set(aUrls, batch);
officecfg::Office::Common::Misc::TemplateRepositoryNames::set(aNames, batch);
batch->commit();
}
}
static bool lcl_getServiceName ( const OUString &rFileURL, OUString &rName )
{
bool bRet = false;
if ( !rFileURL.isEmpty() )
{
try
{
uno::Reference< embed::XStorage > xStorage =
comphelper::OStorageHelper::GetStorageFromURL( rFileURL, embed::ElementModes::READ );
SotClipboardFormatId nFormat = SotStorage::GetFormatID( xStorage );
std::shared_ptr<const SfxFilter> pFilter = SfxGetpApp()->GetFilterMatcher().GetFilter4ClipBoardId( nFormat );
if ( pFilter )
{
rName = pFilter->GetServiceName();
bRet = true;
}
}
catch( uno::Exception& )
{}
}
return bRet;
}
static std::vector<OUString> lcl_getAllFactoryURLs ()
{
SvtModuleOptions aModOpt;
std::vector<OUString> aList;
const css::uno::Sequence<OUString> &aServiceNames = aModOpt.GetAllServiceNames();
for( sal_Int32 i=0, nCount = aServiceNames.getLength(); i < nCount; ++i )
{
if ( ! SfxObjectFactory::GetStandardTemplate( aServiceNames[i] ).isEmpty() )
{
SvtModuleOptions::EFactory eFac = SvtModuleOptions::EFactory::WRITER;
SvtModuleOptions::ClassifyFactoryByName( aServiceNames[i], eFac );
aList.push_back(aModOpt.GetFactoryEmptyDocumentURL(eFac));
}
}
return aList;
}
// Class SfxTemplateCategoryDialog --------------------------------------------------
SfxTemplateCategoryDialog::SfxTemplateCategoryDialog( vcl::Window* pParent):
ModalDialog(pParent, "TemplatesCategoryDialog", "sfx/ui/templatecategorydlg.ui"),
msSelectedCategory(OUString()),
mbIsNewCategory(false)
{
get(mpLBCategory, "categorylb");
get(mpNewCategoryEdit, "category_entry");
get(mpOKButton, "ok");
get(mpSelectLabel, "select_label");
get(mpCreateLabel, "create_label");
mpNewCategoryEdit->SetModifyHdl(LINK(this, SfxTemplateCategoryDialog, NewCategoryEditHdl));
mpLBCategory->SetSelectHdl(LINK(this, SfxTemplateCategoryDialog, SelectCategoryHdl));
mpOKButton->Disable();
}
SfxTemplateCategoryDialog::~SfxTemplateCategoryDialog()
{
disposeOnce();
}
void SfxTemplateCategoryDialog::dispose()
{
mpLBCategory.clear();
mpNewCategoryEdit.clear();
mpOKButton.clear();
ModalDialog::dispose();
}
IMPL_LINK_NOARG_TYPED(SfxTemplateCategoryDialog, NewCategoryEditHdl, Edit&, void)
{
OUString sParam = comphelper::string::strip(mpNewCategoryEdit->GetText(), ' ');
mpLBCategory->Enable(sParam.isEmpty());
if(!sParam.isEmpty())
{
msSelectedCategory = sParam;
mbIsNewCategory = true;
mpOKButton->Enable();
}
else
{
SelectCategoryHdl(*mpLBCategory);
mbIsNewCategory = false;
}
}
IMPL_LINK_NOARG_TYPED(SfxTemplateCategoryDialog, SelectCategoryHdl, ListBox&, void)
{
if(mpLBCategory->GetSelectEntryPos() == 0)
{
msSelectedCategory = OUString();
mpOKButton->Disable();
}
else
{
msSelectedCategory = mpLBCategory->GetSelectEntry();
mpOKButton->Enable();
}
mbIsNewCategory = false;
}
void SfxTemplateCategoryDialog::SetCategoryLBEntries(std::vector<OUString> aFolderNames)
{
mpLBCategory->InsertEntry(OUString("None"), 0);
if (!aFolderNames.empty())
{
for (size_t i = 0, n = aFolderNames.size(); i < n; ++i)
mpLBCategory->InsertEntry(aFolderNames[i], i+1);
}
mpLBCategory->SelectEntryPos(0);
}
void SfxTemplateCategoryDialog::HideNewCategoryOption()
{
mpCreateLabel->Hide();
mpNewCategoryEdit->Hide();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */