LCOV - code coverage report
Current view: top level - sfx2/source/doc - templatedlg.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1 876 0.1 %
Date: 2015-06-13 12:38:46 Functions: 2 70 2.9 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  */
       9             : 
      10             : #include <sfx2/templatedlg.hxx>
      11             : 
      12             : #include "inputdlg.hxx"
      13             : #include "templatesearchview.hxx"
      14             : #include "templatesearchviewitem.hxx"
      15             : 
      16             : #include <comphelper/processfactory.hxx>
      17             : #include <comphelper/storagehelper.hxx>
      18             : #include <officecfg/Office/Common.hxx>
      19             : #include <sfx2/app.hxx>
      20             : #include <sfx2/docfac.hxx>
      21             : #include <sfx2/fcontnr.hxx>
      22             : #include <sfx2/filedlghelper.hxx>
      23             : #include <sfx2/sfxresid.hxx>
      24             : #include <sfx2/templateinfodlg.hxx>
      25             : #include <sfx2/templatelocalview.hxx>
      26             : #include <sfx2/templatecontaineritem.hxx>
      27             : #include <sfx2/templateremoteview.hxx>
      28             : #include <sfx2/templaterepository.hxx>
      29             : #include <sfx2/templateviewitem.hxx>
      30             : #include <sfx2/thumbnailviewitem.hxx>
      31             : #include <sot/storage.hxx>
      32             : #include <svtools/imagemgr.hxx>
      33             : #include <svtools/langhelp.hxx>
      34             : #include <svtools/miscopt.hxx>
      35             : #include <svtools/PlaceEditDialog.hxx>
      36             : #include <tools/urlobj.hxx>
      37             : #include <unotools/moduleoptions.hxx>
      38             : #include <unotools/pathoptions.hxx>
      39             : #include <unotools/viewoptions.hxx>
      40             : #include <vcl/edit.hxx>
      41             : #include <vcl/layout.hxx>
      42             : #include <vcl/toolbox.hxx>
      43             : 
      44             : #include <com/sun/star/beans/PropertyValue.hpp>
      45             : #include <com/sun/star/configuration/theDefaultProvider.hpp>
      46             : #include <com/sun/star/document/MacroExecMode.hpp>
      47             : #include <com/sun/star/document/UpdateDocMode.hpp>
      48             : #include <com/sun/star/embed/XStorage.hpp>
      49             : #include <com/sun/star/embed/ElementModes.hpp>
      50             : #include <com/sun/star/frame/Desktop.hpp>
      51             : #include <com/sun/star/frame/XComponentLoader.hpp>
      52             : #include <com/sun/star/frame/XStorable.hpp>
      53             : #include <com/sun/star/lang/XComponent.hpp>
      54             : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
      55             : #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
      56             : #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
      57             : #include <com/sun/star/ui/dialogs/FolderPicker.hpp>
      58             : #include <com/sun/star/system/SystemShellExecute.hpp>
      59             : #include <com/sun/star/system/SystemShellExecuteFlags.hpp>
      60             : #include <com/sun/star/task/InteractionHandler.hpp>
      61             : 
      62             : #include "doc.hrc"
      63             : 
      64             : const char TM_SETTING_MANAGER[] = "TemplateManager";
      65             : const char TM_SETTING_LASTFOLDER[] = "LastFolder";
      66             : const char TM_SETTING_FILTER[] = "SelectedFilter";
      67             : 
      68             : const char SERVICENAME_CFGREADACCESS[] = "com.sun.star.configuration.ConfigurationAccess";
      69             : 
      70             : const char VIEWBAR_REPOSITORY[] = "repository";
      71             : const char VIEWBAR_IMPORT[] = "import";
      72             : const char VIEWBAR_DELETE[] = "delete";
      73             : const char VIEWBAR_SAVE[] = "save";
      74             : const char VIEWBAR_NEW_FOLDER[] = "new_folder";
      75             : const char TEMPLATEBAR_SAVE[] = "template_save";
      76             : const char TEMPLATEBAR_OPEN[] = "open";
      77             : const char TEMPLATEBAR_EDIT[] = "edit";
      78             : const char TEMPLATEBAR_PROPERTIES[] = "properties";
      79             : const char TEMPLATEBAR_DEFAULT[] = "default";
      80             : const char TEMPLATEBAR_MOVE[] = "move";
      81             : const char TEMPLATEBAR_EXPORT[] = "export";
      82             : const char TEMPLATEBAR_DELETE[] = "template_delete";
      83             : const char ACTIONBAR_SEARCH[] = "search";
      84             : const char ACTIONBAR_ACTION[] = "action_menu";
      85             : const char ACTIONBAR_TEMPLATE[] = "template_link";
      86             : const char FILTER_DOCS[] = "filter_docs";
      87             : const char FILTER_SHEETS[] = "filter_sheets";
      88             : const char FILTER_PRESENTATIONS[] = "filter_presentations";
      89             : const char FILTER_DRAWINGS[] = "filter_draws";
      90             : 
      91             : #define MNI_ACTION_SORT_NAME 1
      92             : #define MNI_ACTION_REFRESH   2
      93             : #define MNI_ACTION_DEFAULT   3
      94             : #define MNI_MOVE_NEW         1
      95             : #define MNI_MOVE_FOLDER_BASE 2
      96             : #define MNI_REPOSITORY_LOCAL 1
      97             : #define MNI_REPOSITORY_NEW   2
      98             : #define MNI_REPOSITORY_BASE  3
      99             : 
     100             : using namespace ::com::sun::star;
     101             : using namespace ::com::sun::star::beans;
     102             : using namespace ::com::sun::star::embed;
     103             : using namespace ::com::sun::star::frame;
     104             : using namespace ::com::sun::star::lang;
     105             : using namespace ::com::sun::star::uno;
     106             : using namespace ::com::sun::star::ui::dialogs;
     107             : using namespace ::com::sun::star::document;
     108             : 
     109             : static bool lcl_getServiceName (const OUString &rFileURL, OUString &rName );
     110             : 
     111             : static std::vector<OUString> lcl_getAllFactoryURLs ();
     112             : 
     113             : // Sort by name in ascending order
     114             : class SortView_Name
     115             : {
     116             : public:
     117             : 
     118           0 :     bool operator() (const ThumbnailViewItem *pItem1, const ThumbnailViewItem *pItem2)
     119             :     {
     120           0 :         return (pItem1->maTitle.compareTo(pItem2->maTitle) < 0);
     121             :     }
     122             : };
     123             : 
     124           0 : class SearchView_Keyword
     125             : {
     126             : public:
     127             : 
     128           0 :     SearchView_Keyword (const OUString &rKeyword, FILTER_APPLICATION App)
     129           0 :         : maKeyword(rKeyword), meApp(App)
     130           0 :     {}
     131             : 
     132           0 :     bool operator() (const TemplateItemProperties &rItem)
     133             :     {
     134           0 :         bool bRet = true;
     135             : 
     136           0 :         INetURLObject aUrl(rItem.aPath);
     137           0 :         OUString aExt = aUrl.getExtension();
     138             : 
     139           0 :         if (meApp == FILTER_APPLICATION::WRITER)
     140             :         {
     141           0 :             bRet = aExt == "ott" || aExt == "stw" || aExt == "oth" || aExt == "dot" || aExt == "dotx";
     142             :         }
     143           0 :         else if (meApp == FILTER_APPLICATION::CALC)
     144             :         {
     145           0 :             bRet = aExt == "ots" || aExt == "stc" || aExt == "xlt" || aExt == "xltm" || aExt == "xltx";
     146             :         }
     147           0 :         else if (meApp == FILTER_APPLICATION::IMPRESS)
     148             :         {
     149           0 :             bRet = aExt == "otp" || aExt == "sti" || aExt == "pot" || aExt == "potm" || aExt == "potx";
     150             :         }
     151           0 :         else if (meApp == FILTER_APPLICATION::DRAW)
     152             :         {
     153           0 :             bRet = aExt == "otg" || aExt == "std";
     154             :         }
     155             : 
     156           0 :         return bRet && rItem.aName.matchIgnoreAsciiCase(maKeyword);
     157             :     }
     158             : 
     159             : private:
     160             : 
     161             :     OUString maKeyword;
     162             :     FILTER_APPLICATION meApp;
     163             : };
     164             : 
     165             : /***
     166             :  *
     167             :  * Order items in ascending order (useful for the selection sets and move/copy operations since the associated ids
     168             :  * change when processed by the SfxDocumentTemplates class so we want to process to ones with higher id first)
     169             :  *
     170             :  ***/
     171             : 
     172           0 : static bool cmpSelectionItems (const ThumbnailViewItem *pItem1, const ThumbnailViewItem *pItem2)
     173             : {
     174           0 :     return pItem1->mnId > pItem2->mnId;
     175             : }
     176             : 
     177           0 : SfxTemplateManagerDlg::SfxTemplateManagerDlg(vcl::Window *parent)
     178             :     : ModalDialog(parent, "TemplateDialog", "sfx/ui/templatedlg.ui"),
     179             :       maSelTemplates(cmpSelectionItems),
     180             :       maSelFolders(cmpSelectionItems),
     181             :       mbIsSaveMode(false),
     182             :       mxDesktop( Desktop::create(comphelper::getProcessComponentContext()) ),
     183             :       mbIsSynced(false),
     184           0 :       maRepositories()
     185             : {
     186           0 :     get(mpTabControl, "tab_control");
     187           0 :     get(mpSearchEdit, "search_edit");
     188           0 :     get(mpViewBar, "action_view");
     189           0 :     get(mpActionBar, "action_action");
     190           0 :     get(mpTemplateBar, "action_templates");
     191           0 :     get(mpLocalView, "template_view");
     192           0 :     get(mpSearchView, "search_view");
     193           0 :     get(mpRemoteView, "remote_view");
     194             : 
     195           0 :     TabPage *pTabPage = mpTabControl->GetTabPage(mpTabControl->GetPageId("filter_docs"));
     196           0 :     pTabPage->Show();
     197           0 :     mpTabControl->SetTabPage(mpTabControl->GetPageId("filter_sheets"), pTabPage);
     198           0 :     pTabPage->Show();
     199           0 :     mpTabControl->SetTabPage(mpTabControl->GetPageId("filter_presentations"), pTabPage);
     200           0 :     pTabPage->Show();
     201           0 :     mpTabControl->SetTabPage(mpTabControl->GetPageId("filter_draws"), pTabPage);
     202           0 :     pTabPage->Show();
     203             : 
     204             :     // Create popup menus
     205           0 :     mpActionMenu = new PopupMenu;
     206             :     mpActionMenu->InsertItem(MNI_ACTION_SORT_NAME,
     207             :         SfxResId(STR_ACTION_SORT_NAME).toString(),
     208           0 :         Image(SfxResId(IMG_ACTION_SORT)));
     209             :     mpActionMenu->InsertItem(MNI_ACTION_REFRESH,
     210             :         SfxResId(STR_ACTION_REFRESH).toString(),
     211           0 :         Image(SfxResId(IMG_ACTION_REFRESH)));
     212           0 :     mpActionMenu->InsertItem(MNI_ACTION_DEFAULT,SfxResId(STR_ACTION_DEFAULT).toString());
     213           0 :     mpActionMenu->SetSelectHdl(LINK(this,SfxTemplateManagerDlg,MenuSelectHdl));
     214             : 
     215           0 :     mpRepositoryMenu = new PopupMenu;
     216           0 :     mpRepositoryMenu->SetSelectHdl(LINK(this,SfxTemplateManagerDlg,RepositoryMenuSelectHdl));
     217             : 
     218           0 :     mpTemplateDefaultMenu = new PopupMenu;
     219           0 :     mpTemplateDefaultMenu->SetSelectHdl(LINK(this,SfxTemplateManagerDlg,DefaultTemplateMenuSelectHdl));
     220           0 :     mpActionMenu->SetPopupMenu(MNI_ACTION_DEFAULT,mpTemplateDefaultMenu);
     221             : 
     222             :     // Set toolbox styles
     223           0 :     mpViewBar->SetButtonType(ButtonType::SYMBOLTEXT);
     224           0 :     mpTemplateBar->SetButtonType(ButtonType::SYMBOLTEXT);
     225             : 
     226             :     // Set toolbox button bits
     227           0 :     mpViewBar->SetItemBits(mpViewBar->GetItemId(VIEWBAR_REPOSITORY), ToolBoxItemBits::DROPDOWNONLY);
     228           0 :     mpActionBar->SetItemBits(mpActionBar->GetItemId(ACTIONBAR_ACTION), ToolBoxItemBits::DROPDOWNONLY);
     229           0 :     mpTemplateBar->SetItemBits(mpTemplateBar->GetItemId(TEMPLATEBAR_MOVE), ToolBoxItemBits::DROPDOWNONLY);
     230             : 
     231             :     // Set toolbox handlers
     232           0 :     mpViewBar->SetSelectHdl(LINK(this,SfxTemplateManagerDlg,TBXViewHdl));
     233           0 :     mpViewBar->SetDropdownClickHdl(LINK(this,SfxTemplateManagerDlg,TBXDropdownHdl));
     234           0 :     mpActionBar->SetSelectHdl(LINK(this,SfxTemplateManagerDlg,TBXActionHdl));
     235           0 :     mpActionBar->SetDropdownClickHdl(LINK(this,SfxTemplateManagerDlg,TBXDropdownHdl));
     236           0 :     mpTemplateBar->SetSelectHdl(LINK(this,SfxTemplateManagerDlg,TBXTemplateHdl));
     237           0 :     mpTemplateBar->SetDropdownClickHdl(LINK(this,SfxTemplateManagerDlg,TBXDropdownHdl));
     238           0 :     mpSearchEdit->SetUpdateDataHdl(LINK(this,SfxTemplateManagerDlg,SearchUpdateHdl));
     239           0 :     mpSearchEdit->EnableUpdateData();
     240             : 
     241           0 :     mpLocalView->SetStyle(mpLocalView->GetStyle() | WB_VSCROLL);
     242           0 :     mpLocalView->setItemMaxTextLength(TEMPLATE_ITEM_MAX_TEXT_LENGTH);
     243             : 
     244           0 :     mpLocalView->setItemDimensions(TEMPLATE_ITEM_MAX_WIDTH,TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
     245             :                               TEMPLATE_ITEM_MAX_HEIGHT-TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
     246           0 :                               TEMPLATE_ITEM_PADDING);
     247             : 
     248           0 :     mpLocalView->setItemStateHdl(LINK(this,SfxTemplateManagerDlg,TVItemStateHdl));
     249           0 :     mpLocalView->setOpenRegionHdl(LINK(this,SfxTemplateManagerDlg,OpenRegionHdl));
     250           0 :     mpLocalView->setOpenTemplateHdl(LINK(this,SfxTemplateManagerDlg,OpenTemplateHdl));
     251             : 
     252             :     // Set online view position and dimensions
     253           0 :     mpRemoteView->setItemMaxTextLength(TEMPLATE_ITEM_MAX_TEXT_LENGTH);
     254             : 
     255           0 :     mpRemoteView->setItemDimensions(TEMPLATE_ITEM_MAX_WIDTH,TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
     256             :                                     TEMPLATE_ITEM_MAX_HEIGHT-TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
     257           0 :                                     TEMPLATE_ITEM_PADDING);
     258             : 
     259           0 :     mpRemoteView->setItemStateHdl(LINK(this,SfxTemplateManagerDlg,TVItemStateHdl));
     260           0 :     mpRemoteView->setOpenRegionHdl(LINK(this,SfxTemplateManagerDlg,OpenRegionHdl));
     261           0 :     mpRemoteView->setOpenTemplateHdl(LINK(this,SfxTemplateManagerDlg,OpenTemplateHdl));
     262             : 
     263           0 :     mpSearchView->setItemMaxTextLength(TEMPLATE_ITEM_MAX_TEXT_LENGTH);
     264             : 
     265           0 :     mpSearchView->setItemDimensions(TEMPLATE_ITEM_MAX_WIDTH,TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
     266             :                                     TEMPLATE_ITEM_MAX_HEIGHT_SUB-TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
     267           0 :                                     TEMPLATE_ITEM_PADDING);
     268             : 
     269           0 :     mpSearchView->setItemStateHdl(LINK(this,SfxTemplateManagerDlg,TVItemStateHdl));
     270           0 :     mpSearchView->setOpenTemplateHdl(LINK(this,SfxTemplateManagerDlg,OpenTemplateHdl));
     271             : 
     272           0 :     mpTabControl->SetActivatePageHdl(LINK(this, SfxTemplateManagerDlg, ActivatePageHdl));
     273             : 
     274           0 :     SvtMiscOptions aMiscOptions;
     275           0 :     if ( !aMiscOptions.IsExperimentalMode() )
     276             :     {
     277           0 :         sal_uInt16 nPos = mpViewBar->GetItemPos(mpViewBar->GetItemId(VIEWBAR_REPOSITORY));
     278           0 :         mpViewBar->RemoveItem(nPos);
     279             :     }
     280             : 
     281           0 :     mpViewBar->Show();
     282           0 :     mpActionBar->Show();
     283             : 
     284           0 :     switchMainView(true);
     285             : 
     286           0 :     loadRepositories();
     287             : 
     288           0 :     createRepositoryMenu();
     289           0 :     createDefaultTemplateMenu();
     290             : 
     291           0 :     mpLocalView->Populate();
     292           0 :     mpCurView->filterItems(ViewFilter_Application(FILTER_APPLICATION::WRITER));
     293             : 
     294           0 :     readSettings();
     295             : 
     296           0 :     mpLocalView->Show();
     297           0 : }
     298             : 
     299           0 : SfxTemplateManagerDlg::~SfxTemplateManagerDlg()
     300             : {
     301           0 :     disposeOnce();
     302           0 : }
     303             : 
     304           0 : void SfxTemplateManagerDlg::dispose()
     305             : {
     306           0 :     writeSettings();
     307             : 
     308             :     // Synchronize the config before deleting it
     309           0 :     syncRepositories();
     310           0 :     for (size_t i = 0, n = maRepositories.size(); i < n; ++i)
     311           0 :         delete maRepositories[i];
     312             : 
     313             :     // Ignore view events since we are cleaning the object
     314           0 :     mpLocalView->setItemStateHdl(Link<>());
     315           0 :     mpLocalView->setOpenRegionHdl(Link<>());
     316           0 :     mpLocalView->setOpenTemplateHdl(Link<>());
     317             : 
     318           0 :     mpRemoteView->setItemStateHdl(Link<>());
     319           0 :     mpRemoteView->setOpenRegionHdl(Link<>());
     320           0 :     mpRemoteView->setOpenTemplateHdl(Link<>());
     321             : 
     322           0 :     mpSearchView->setItemStateHdl(Link<>());
     323           0 :     mpSearchView->setOpenTemplateHdl(Link<>());
     324             : 
     325           0 :     mpTabControl.clear();
     326           0 :     mpSearchEdit.clear();
     327           0 :     mpViewBar.clear();
     328           0 :     mpActionBar.clear();
     329           0 :     mpTemplateBar.clear();
     330           0 :     mpSearchView.clear();
     331           0 :     mpCurView.clear();
     332           0 :     mpLocalView.clear();
     333           0 :     mpRemoteView.clear();
     334           0 :     ModalDialog::dispose();
     335           0 : }
     336             : 
     337           0 : void SfxTemplateManagerDlg::setSaveMode()
     338             : {
     339           0 :     mbIsSaveMode = true;
     340             : 
     341             :     // FIXME We used to call just mpTabControl->Clear() here; but that worked
     342             :     // only with .src dialogs, as the tab pages could have existed even
     343             :     // without TabControl containing them.  This is not possible with .ui
     344             :     // definitions any more (and rightly so!), so leave just one tab here for
     345             :     // now, until we do a bigger Template manager rework.
     346           0 :     while (mpTabControl->GetPageCount() > 1)
     347           0 :         mpTabControl->RemovePage(mpTabControl->GetPageId(1));
     348             : 
     349           0 :     mpCurView->filterItems(ViewFilter_Application(FILTER_APPLICATION::NONE));
     350             : 
     351           0 :     mpViewBar->ShowItem(VIEWBAR_SAVE);
     352           0 :     mpViewBar->HideItem(VIEWBAR_IMPORT);
     353           0 :     mpViewBar->HideItem(VIEWBAR_REPOSITORY);
     354             : 
     355           0 :     mpTemplateBar->ShowItem(TEMPLATEBAR_SAVE);
     356           0 :     mpTemplateBar->ShowItem(TEMPLATEBAR_PROPERTIES);
     357           0 :     mpTemplateBar->ShowItem(TEMPLATEBAR_DEFAULT);
     358           0 :     mpTemplateBar->HideItem(TEMPLATEBAR_OPEN);
     359           0 :     mpTemplateBar->HideItem(TEMPLATEBAR_EDIT);
     360           0 :     mpTemplateBar->HideItem(TEMPLATEBAR_MOVE);
     361           0 :     mpTemplateBar->HideItem(TEMPLATEBAR_EXPORT);
     362           0 :     mpTemplateBar->HideItem(TEMPLATEBAR_DELETE);
     363           0 : }
     364             : 
     365           0 : void SfxTemplateManagerDlg::setDocumentModel(const uno::Reference<frame::XModel> &rModel)
     366             : {
     367           0 :     m_xModel = rModel;
     368           0 : }
     369             : 
     370           0 : FILTER_APPLICATION SfxTemplateManagerDlg::getCurrentFilter()
     371             : {
     372           0 :     const sal_uInt16 nCurPageId = mpTabControl->GetCurPageId();
     373             : 
     374           0 :     if (nCurPageId == mpTabControl->GetPageId(FILTER_DOCS))
     375           0 :         return FILTER_APPLICATION::WRITER;
     376           0 :     else if (nCurPageId == mpTabControl->GetPageId(FILTER_PRESENTATIONS))
     377           0 :         return FILTER_APPLICATION::IMPRESS;
     378           0 :     else if (nCurPageId == mpTabControl->GetPageId(FILTER_SHEETS))
     379           0 :         return FILTER_APPLICATION::CALC;
     380           0 :     else if (nCurPageId == mpTabControl->GetPageId(FILTER_DRAWINGS))
     381           0 :         return FILTER_APPLICATION::DRAW;
     382             : 
     383           0 :     return FILTER_APPLICATION::NONE;
     384             : }
     385             : 
     386           0 : IMPL_LINK_NOARG(SfxTemplateManagerDlg,ActivatePageHdl)
     387             : {
     388           0 :     mpCurView->filterItems(ViewFilter_Application(getCurrentFilter()));
     389           0 :     mpCurView->showRootRegion(); // fdo#60586 show the root region of the applied filter
     390             : 
     391           0 :     if (mpSearchView->IsVisible())
     392           0 :         SearchUpdateHdl(NULL);
     393             : 
     394           0 :     return 0;
     395             : }
     396             : 
     397           0 : void SfxTemplateManagerDlg::readSettings ()
     398             : {
     399           0 :     OUString aLastFolder;
     400           0 :     sal_uInt16 nPageId = 0;
     401           0 :     SvtViewOptions aViewSettings( E_DIALOG, TM_SETTING_MANAGER );
     402             : 
     403           0 :     if ( aViewSettings.Exists() )
     404             :     {
     405           0 :         sal_uInt16 nTmp = 0;
     406           0 :         aViewSettings.GetUserItem(TM_SETTING_LASTFOLDER) >>= aLastFolder;
     407           0 :         aViewSettings.GetUserItem(TM_SETTING_FILTER) >>= nTmp;
     408           0 :         FILTER_APPLICATION nFilter = static_cast<FILTER_APPLICATION>(nTmp);
     409           0 :         switch (nFilter)
     410             :         {
     411             :             case FILTER_APPLICATION::WRITER:
     412           0 :                 nPageId = mpTabControl->GetPageId(FILTER_DOCS);
     413           0 :                 break;
     414             :             case FILTER_APPLICATION::IMPRESS:
     415           0 :                 nPageId = mpTabControl->GetPageId(FILTER_PRESENTATIONS);
     416           0 :                 break;
     417             :             case FILTER_APPLICATION::CALC:
     418           0 :                 nPageId = mpTabControl->GetPageId(FILTER_SHEETS);
     419           0 :                 break;
     420             :             case FILTER_APPLICATION::DRAW:
     421           0 :                 nPageId = mpTabControl->GetPageId(FILTER_DRAWINGS);
     422           0 :                 break;
     423           0 :             default: break;
     424             :         }
     425             :     }
     426             : 
     427           0 :     if (!aLastFolder.getLength())
     428           0 :         mpLocalView->showRootRegion();
     429             :     else
     430           0 :         mpLocalView->showRegion(aLastFolder);
     431             : 
     432           0 :     mpTabControl->SelectTabPage(nPageId);
     433           0 : }
     434             : 
     435           0 : void SfxTemplateManagerDlg::writeSettings ()
     436             : {
     437           0 :     Sequence< NamedValue > aSettings(2);
     438             : 
     439           0 :     OUString aLastFolder;
     440             : 
     441           0 :     if (mpCurView == mpLocalView && mpLocalView->getCurRegionId())
     442           0 :         aLastFolder = mpLocalView->getRegionName(mpLocalView->getCurRegionId()-1);
     443             : 
     444             :     // last folder
     445           0 :     aSettings[0].Name = TM_SETTING_LASTFOLDER;
     446           0 :     aSettings[0].Value  <<= aLastFolder;
     447             : 
     448           0 :     aSettings[1].Name = TM_SETTING_FILTER;
     449           0 :     aSettings[1].Value <<= sal_uInt16(getCurrentFilter());
     450             : 
     451             :     // write
     452           0 :     SvtViewOptions aViewSettings(E_DIALOG, TM_SETTING_MANAGER);
     453           0 :     aViewSettings.SetUserData(aSettings);
     454           0 : }
     455             : 
     456           0 : IMPL_LINK_NOARG_TYPED(SfxTemplateManagerDlg,TBXViewHdl, ToolBox *, void)
     457             : {
     458           0 :     const sal_uInt16 nCurItemId = mpViewBar->GetCurItemId();
     459             : 
     460           0 :     if (nCurItemId == mpViewBar->GetItemId(VIEWBAR_IMPORT))
     461           0 :         OnTemplateImport();
     462           0 :     else if (nCurItemId == mpViewBar->GetItemId(VIEWBAR_DELETE))
     463             :     {
     464           0 :         if (mpCurView == mpLocalView)
     465           0 :             OnFolderDelete();
     466             :         else
     467           0 :             OnRepositoryDelete();
     468             :     }
     469           0 :     else if (nCurItemId == mpViewBar->GetItemId(VIEWBAR_NEW_FOLDER))
     470           0 :         OnFolderNew();
     471           0 :     else if (nCurItemId == mpViewBar->GetItemId(VIEWBAR_SAVE))
     472           0 :         OnTemplateSaveAs();
     473           0 : }
     474             : 
     475           0 : IMPL_LINK_NOARG_TYPED(SfxTemplateManagerDlg, TBXActionHdl, ToolBox *, void)
     476             : {
     477           0 :     const sal_uInt16 nCurItemId = mpActionBar->GetCurItemId();
     478             : 
     479           0 :     if (nCurItemId == mpActionBar->GetItemId(ACTIONBAR_SEARCH))
     480           0 :         OnTemplateSearch();
     481           0 :     else if (nCurItemId == mpActionBar->GetItemId(ACTIONBAR_TEMPLATE))
     482           0 :         OnTemplateLink();
     483           0 : }
     484             : 
     485           0 : IMPL_LINK_NOARG_TYPED(SfxTemplateManagerDlg, TBXTemplateHdl, ToolBox *, void)
     486             : {
     487           0 :     const sal_uInt16 nCurItemId = mpTemplateBar->GetCurItemId();
     488             : 
     489           0 :     if (nCurItemId == mpTemplateBar->GetItemId(TEMPLATEBAR_OPEN))
     490           0 :         OnTemplateOpen();
     491           0 :     else if (nCurItemId == mpTemplateBar->GetItemId(TEMPLATEBAR_EDIT))
     492           0 :         OnTemplateEdit();
     493           0 :     else if (nCurItemId == mpTemplateBar->GetItemId(TEMPLATEBAR_PROPERTIES))
     494           0 :         OnTemplateProperties();
     495           0 :     else if (nCurItemId == mpTemplateBar->GetItemId(TEMPLATEBAR_DELETE))
     496           0 :         OnTemplateDelete();
     497           0 :     else if (nCurItemId == mpTemplateBar->GetItemId(TEMPLATEBAR_DEFAULT))
     498           0 :         OnTemplateAsDefault();
     499           0 :     else if (nCurItemId == mpTemplateBar->GetItemId(TEMPLATEBAR_EXPORT))
     500           0 :         OnTemplateExport();
     501           0 : }
     502             : 
     503           0 : IMPL_LINK_TYPED(SfxTemplateManagerDlg, TBXDropdownHdl, ToolBox*, pBox, void)
     504             : {
     505           0 :     const sal_uInt16 nCurItemId = pBox->GetCurItemId();
     506             : 
     507           0 :     if (pBox == mpActionBar && nCurItemId == mpActionBar->GetItemId(ACTIONBAR_ACTION))
     508             :     {
     509           0 :         pBox->SetItemDown( nCurItemId, true );
     510             : 
     511           0 :         mpActionMenu->Execute(pBox, pBox->GetItemRect(nCurItemId), PopupMenuFlags::ExecuteDown);
     512             : 
     513           0 :         pBox->SetItemDown( nCurItemId, false );
     514           0 :         pBox->EndSelection();
     515           0 :         pBox->Invalidate();
     516             :     }
     517           0 :     else if (pBox == mpTemplateBar && nCurItemId == mpTemplateBar->GetItemId(TEMPLATEBAR_MOVE))
     518             :     {
     519           0 :         pBox->SetItemDown( nCurItemId, true );
     520             : 
     521           0 :         std::vector<OUString> aNames = mpLocalView->getFolderNames();
     522             : 
     523           0 :         PopupMenu *pMoveMenu = new PopupMenu;
     524           0 :         pMoveMenu->SetSelectHdl(LINK(this,SfxTemplateManagerDlg,MoveMenuSelectHdl));
     525             : 
     526           0 :         if (!aNames.empty())
     527             :         {
     528           0 :             for (size_t i = 0, n = aNames.size(); i < n; ++i)
     529           0 :                 pMoveMenu->InsertItem(MNI_MOVE_FOLDER_BASE+i,aNames[i]);
     530             :         }
     531             : 
     532           0 :         pMoveMenu->InsertSeparator();
     533             : 
     534           0 :         pMoveMenu->InsertItem(MNI_MOVE_NEW, SfxResId(STR_MOVE_NEW));
     535             : 
     536           0 :         pMoveMenu->Execute(pBox, pBox->GetItemRect(nCurItemId), PopupMenuFlags::ExecuteDown);
     537             : 
     538           0 :         delete pMoveMenu;
     539             : 
     540           0 :         pBox->SetItemDown( nCurItemId, false );
     541           0 :         pBox->EndSelection();
     542           0 :         pBox->Invalidate();
     543             :     }
     544           0 :     else if (pBox == mpViewBar && nCurItemId == mpViewBar->GetItemId(VIEWBAR_REPOSITORY))
     545             :     {
     546           0 :         pBox->SetItemDown( nCurItemId, true );
     547             : 
     548           0 :         mpRepositoryMenu->Execute(pBox, pBox->GetItemRect(nCurItemId), PopupMenuFlags::ExecuteDown);
     549             : 
     550           0 :         pBox->SetItemDown( nCurItemId, false );
     551           0 :         pBox->EndSelection();
     552           0 :         pBox->Invalidate();
     553             :     }
     554           0 : }
     555             : 
     556           0 : IMPL_LINK(SfxTemplateManagerDlg, TVItemStateHdl, const ThumbnailViewItem*, pItem)
     557             : {
     558           0 :     const TemplateContainerItem *pCntItem = dynamic_cast<const TemplateContainerItem*>(pItem);
     559             : 
     560           0 :     if (pCntItem)
     561           0 :         OnRegionState(pItem);
     562             :     else
     563           0 :         OnTemplateState(pItem);
     564             : 
     565           0 :     return 0;
     566             : }
     567             : 
     568           0 : IMPL_LINK(SfxTemplateManagerDlg, MenuSelectHdl, Menu*, pMenu)
     569             : {
     570           0 :     sal_uInt16 nMenuId = pMenu->GetCurItemId();
     571             : 
     572           0 :     switch(nMenuId)
     573             :     {
     574             :     case MNI_ACTION_SORT_NAME:
     575           0 :         mpLocalView->sortItems(SortView_Name());
     576           0 :         break;
     577             :     case MNI_ACTION_REFRESH:
     578           0 :         mpCurView->reload();
     579           0 :         break;
     580             :     default:
     581           0 :         break;
     582             :     }
     583             : 
     584           0 :     return 0;
     585             : }
     586             : 
     587           0 : IMPL_LINK(SfxTemplateManagerDlg, MoveMenuSelectHdl, Menu*, pMenu)
     588             : {
     589           0 :     sal_uInt16 nMenuId = pMenu->GetCurItemId();
     590             : 
     591           0 :     if (mpSearchView->IsVisible())
     592             :     {
     593             :         // Check if we are searching the local or remote templates
     594           0 :         if (mpCurView == mpLocalView)
     595           0 :             localSearchMoveTo(nMenuId);
     596             :     }
     597             :     else
     598             :     {
     599             :         // Check if we are displaying the local or remote templates
     600           0 :         if (mpCurView == mpLocalView)
     601           0 :             localMoveTo(nMenuId);
     602             :         else
     603           0 :             remoteMoveTo(nMenuId);
     604             :     }
     605             : 
     606           0 :     return 0;
     607             : }
     608             : 
     609           0 : IMPL_LINK(SfxTemplateManagerDlg, RepositoryMenuSelectHdl, Menu*, pMenu)
     610             : {
     611           0 :     sal_uInt16 nMenuId = pMenu->GetCurItemId();
     612             : 
     613           0 :     if (nMenuId == MNI_REPOSITORY_LOCAL)
     614             :     {
     615           0 :         switchMainView(true);
     616             :     }
     617           0 :     else if (nMenuId == MNI_REPOSITORY_NEW)
     618             :     {
     619           0 :         ScopedVclPtrInstance< PlaceEditDialog > dlg(this);
     620             : 
     621           0 :         if (dlg->Execute())
     622             :         {
     623           0 :             std::shared_ptr<Place> xPlace = dlg->GetPlace();
     624             : 
     625           0 :             if (insertRepository(xPlace->GetName(), xPlace->GetUrl()))
     626             :             {
     627             :                 // update repository list menu.
     628           0 :                 createRepositoryMenu();
     629             :             }
     630             :             else
     631             :             {
     632           0 :                 OUString aMsg(SfxResId(STR_MSG_ERROR_REPOSITORY_NAME).toString());
     633           0 :                 aMsg = aMsg.replaceFirst("$1", xPlace->GetName());
     634           0 :                 ScopedVclPtrInstance<MessageDialog>(this, aMsg)->Execute();
     635           0 :             }
     636           0 :         }
     637             :     }
     638             :     else
     639             :     {
     640           0 :         sal_uInt16 nRepoId = nMenuId - MNI_REPOSITORY_BASE;
     641             : 
     642           0 :         TemplateRepository *pRepository = NULL;
     643             : 
     644           0 :         for (size_t i = 0, n = maRepositories.size(); i < n; ++i)
     645             :         {
     646           0 :             if (maRepositories[i]->mnId == nRepoId)
     647             :             {
     648           0 :                 pRepository = maRepositories[i];
     649           0 :                 break;
     650             :             }
     651             :         }
     652             : 
     653           0 :         if (mpRemoteView->loadRepository(pRepository,false))
     654           0 :             switchMainView(false);
     655             :     }
     656             : 
     657           0 :     return 0;
     658             : }
     659             : 
     660           0 : IMPL_LINK(SfxTemplateManagerDlg, DefaultTemplateMenuSelectHdl, Menu*, pMenu)
     661             : {
     662           0 :     sal_uInt16 nId = pMenu->GetCurItemId();
     663             : 
     664           0 :     OUString aServiceName = SfxObjectShell::GetServiceNameFromFactory( mpTemplateDefaultMenu->GetItemCommand(nId));
     665           0 :     SfxObjectFactory::SetStandardTemplate( aServiceName, OUString() );
     666             : 
     667           0 :     createDefaultTemplateMenu();
     668             : 
     669           0 :     return 0;
     670             : }
     671             : 
     672           0 : IMPL_LINK_NOARG(SfxTemplateManagerDlg, OpenRegionHdl)
     673             : {
     674           0 :     maSelFolders.clear();
     675           0 :     maSelTemplates.clear();
     676             : 
     677           0 :     mpViewBar->ShowItem(VIEWBAR_NEW_FOLDER, mpCurView->isNestedRegionAllowed());
     678             : 
     679           0 :     if (!mbIsSaveMode)
     680           0 :         mpViewBar->ShowItem(VIEWBAR_IMPORT, mpCurView->isImportAllowed());
     681             : 
     682           0 :     mpTemplateBar->Hide();
     683           0 :     mpViewBar->Show();
     684           0 :     mpActionBar->Show();
     685             : 
     686           0 :     return 0;
     687             : }
     688             : 
     689           0 : IMPL_LINK(SfxTemplateManagerDlg, OpenTemplateHdl, ThumbnailViewItem*, pItem)
     690             : {
     691           0 :     if (!mbIsSaveMode)
     692             :     {
     693           0 :         uno::Sequence< PropertyValue > aArgs(4);
     694           0 :         aArgs[0].Name = "AsTemplate";
     695           0 :         aArgs[0].Value <<= sal_True;
     696           0 :         aArgs[1].Name = "MacroExecutionMode";
     697           0 :         aArgs[1].Value <<= MacroExecMode::USE_CONFIG;
     698           0 :         aArgs[2].Name = "UpdateDocMode";
     699           0 :         aArgs[2].Value <<= UpdateDocMode::ACCORDING_TO_CONFIG;
     700           0 :         aArgs[3].Name = "InteractionHandler";
     701           0 :         aArgs[3].Value <<= task::InteractionHandler::createWithParent( ::comphelper::getProcessComponentContext(), 0 );
     702             : 
     703           0 :         TemplateViewItem *pTemplateItem = static_cast<TemplateViewItem*>(pItem);
     704             : 
     705             :         try
     706             :         {
     707           0 :             mxDesktop->loadComponentFromURL(pTemplateItem->getPath(),"_default", 0, aArgs );
     708             :         }
     709           0 :         catch( const uno::Exception& )
     710             :         {
     711             :         }
     712             : 
     713           0 :         Close();
     714             :     }
     715             : 
     716           0 :     return 0;
     717             : }
     718             : 
     719           0 : IMPL_LINK_NOARG(SfxTemplateManagerDlg, SearchUpdateHdl)
     720             : {
     721           0 :     OUString aKeyword = mpSearchEdit->GetText();
     722             : 
     723           0 :     if (!aKeyword.isEmpty())
     724             :     {
     725           0 :         mpSearchView->Clear();
     726             : 
     727             :         // if the search view is hidden, hide the folder view and display search one
     728           0 :         if (!mpSearchView->IsVisible())
     729             :         {
     730           0 :             mpCurView->deselectItems();
     731           0 :             mpSearchView->Show();
     732           0 :             mpCurView->Hide();
     733             :         }
     734             : 
     735           0 :         bool bDisplayFolder = !mpCurView->isNonRootRegionVisible();
     736             : 
     737             :         std::vector<TemplateItemProperties> aItems =
     738           0 :                 mpLocalView->getFilteredItems(SearchView_Keyword(aKeyword, getCurrentFilter()));
     739             : 
     740           0 :         for (size_t i = 0; i < aItems.size(); ++i)
     741             :         {
     742           0 :             TemplateItemProperties *pItem = &aItems[i];
     743             : 
     744           0 :             OUString aFolderName;
     745             : 
     746           0 :             if (bDisplayFolder)
     747           0 :                 aFolderName = mpLocalView->getRegionName(pItem->nRegionId);
     748             : 
     749           0 :             mpSearchView->AppendItem(pItem->nId,mpLocalView->getRegionId(pItem->nRegionId),
     750             :                                      pItem->nDocId,
     751             :                                      pItem->aName,
     752             :                                      aFolderName,
     753             :                                      pItem->aPath,
     754           0 :                                      pItem->aThumbnail);
     755           0 :         }
     756             : 
     757           0 :         mpSearchView->Invalidate();
     758             :     }
     759             :     else
     760             :     {
     761           0 :         mpSearchView->deselectItems();
     762           0 :         mpSearchView->Hide();
     763           0 :         mpCurView->Show();
     764             :     }
     765             : 
     766           0 :     return 0;
     767             : }
     768             : 
     769           0 : void SfxTemplateManagerDlg::OnRegionState (const ThumbnailViewItem *pItem)
     770             : {
     771           0 :     if (pItem->isSelected())
     772             :     {
     773           0 :         if (maSelFolders.empty() && !mbIsSaveMode)
     774             :         {
     775           0 :             mpViewBar->ShowItem(VIEWBAR_IMPORT);
     776           0 :             mpViewBar->ShowItem(VIEWBAR_DELETE);
     777           0 :             mpViewBar->HideItem(VIEWBAR_NEW_FOLDER);
     778             :         }
     779             : 
     780           0 :         maSelFolders.insert(pItem);
     781             :     }
     782             :     else
     783             :     {
     784           0 :         maSelFolders.erase(pItem);
     785             : 
     786           0 :         if (maSelFolders.empty() && !mbIsSaveMode)
     787             :         {
     788           0 :             mpViewBar->HideItem(VIEWBAR_IMPORT);
     789           0 :             mpViewBar->HideItem(VIEWBAR_DELETE);
     790           0 :             mpViewBar->ShowItem(VIEWBAR_NEW_FOLDER);
     791             :         }
     792             :     }
     793           0 : }
     794             : 
     795           0 : void SfxTemplateManagerDlg::OnTemplateState (const ThumbnailViewItem *pItem)
     796             : {
     797           0 :     bool bInSelection = maSelTemplates.find(pItem) != maSelTemplates.end();
     798             : 
     799           0 :     if (pItem->isSelected())
     800             :     {
     801           0 :         if (maSelTemplates.empty())
     802             :         {
     803           0 :             mpViewBar->Show(false);
     804           0 :             mpTemplateBar->Show();
     805             :         }
     806           0 :         else if (maSelTemplates.size() != 1 || !bInSelection)
     807             :         {
     808           0 :             if (!mbIsSaveMode)
     809             :             {
     810           0 :                 mpTemplateBar->HideItem(TEMPLATEBAR_OPEN);
     811           0 :                 mpTemplateBar->HideItem(TEMPLATEBAR_EDIT);
     812           0 :                 mpTemplateBar->HideItem(TEMPLATEBAR_PROPERTIES);
     813           0 :                 mpTemplateBar->HideItem(TEMPLATEBAR_DEFAULT);
     814             :             }
     815             :             else
     816             :             {
     817           0 :                 mpTemplateBar->HideItem(TEMPLATEBAR_SAVE);
     818           0 :                 mpTemplateBar->HideItem(TEMPLATEBAR_PROPERTIES);
     819           0 :                 mpTemplateBar->HideItem(TEMPLATEBAR_DEFAULT);
     820             :             }
     821             :         }
     822             : 
     823           0 :         if (!bInSelection)
     824           0 :             maSelTemplates.insert(pItem);
     825             :     }
     826             :     else
     827             :     {
     828           0 :         if (bInSelection)
     829             :         {
     830           0 :             maSelTemplates.erase(pItem);
     831             : 
     832           0 :             if (maSelTemplates.empty())
     833             :             {
     834           0 :                 mpTemplateBar->Show(false);
     835           0 :                 mpViewBar->Show();
     836             :             }
     837           0 :             else if (maSelTemplates.size() == 1)
     838             :             {
     839           0 :                 if (!mbIsSaveMode)
     840             :                 {
     841           0 :                     mpTemplateBar->ShowItem(TEMPLATEBAR_OPEN);
     842           0 :                     mpTemplateBar->ShowItem(TEMPLATEBAR_EDIT);
     843           0 :                     mpTemplateBar->ShowItem(TEMPLATEBAR_PROPERTIES);
     844           0 :                     mpTemplateBar->ShowItem(TEMPLATEBAR_DEFAULT);
     845             :                 }
     846             :                 else
     847             :                 {
     848           0 :                     mpTemplateBar->ShowItem(TEMPLATEBAR_SAVE);
     849           0 :                     mpTemplateBar->ShowItem(TEMPLATEBAR_PROPERTIES);
     850           0 :                     mpTemplateBar->ShowItem(TEMPLATEBAR_DEFAULT);
     851             :                 }
     852             :             }
     853             :         }
     854             :     }
     855           0 : }
     856             : 
     857           0 : void SfxTemplateManagerDlg::OnTemplateImport ()
     858             : {
     859             :     sal_Int16 nDialogType =
     860           0 :         com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE;
     861             : 
     862           0 :     sfx2::FileDialogHelper aFileDlg(nDialogType, SFXWB_MULTISELECTION);
     863             : 
     864             :     // add "All" filter
     865             :     aFileDlg.AddFilter( SfxResId(STR_SFX_FILTERNAME_ALL).toString(),
     866           0 :                         OUString(FILEDIALOG_FILTER_ALL) );
     867             : 
     868             :     // add template filter
     869           0 :     OUString sFilterExt;
     870           0 :     OUString sFilterName( SfxResId( STR_TEMPLATE_FILTER ).toString() );
     871             : 
     872             :     // add filters of modules which are installed
     873           0 :     SvtModuleOptions aModuleOpt;
     874           0 :     if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::EModule::WRITER ) )
     875           0 :         sFilterExt += "*.ott;*.stw;*.oth";
     876             : 
     877           0 :     if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::EModule::CALC ) )
     878             :     {
     879           0 :         if ( !sFilterExt.isEmpty() )
     880           0 :             sFilterExt += ";";
     881             : 
     882           0 :         sFilterExt += "*.ots;*.stc";
     883             :     }
     884             : 
     885           0 :     if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::EModule::IMPRESS ) )
     886             :     {
     887           0 :         if ( !sFilterExt.isEmpty() )
     888           0 :             sFilterExt += ";";
     889             : 
     890           0 :         sFilterExt += "*.otp;*.sti";
     891             :     }
     892             : 
     893           0 :     if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::EModule::DRAW ) )
     894             :     {
     895           0 :         if ( !sFilterExt.isEmpty() )
     896           0 :             sFilterExt += ";";
     897             : 
     898           0 :         sFilterExt += "*.otg;*.std";
     899             :     }
     900             : 
     901           0 :     if ( !sFilterExt.isEmpty() )
     902           0 :         sFilterExt += ";";
     903             : 
     904           0 :     sFilterExt += "*.vor";
     905             : 
     906           0 :     sFilterName += " (";
     907           0 :     sFilterName += sFilterExt;
     908           0 :     sFilterName += ")";
     909             : 
     910           0 :     aFileDlg.AddFilter( sFilterName, sFilterExt );
     911           0 :     aFileDlg.SetCurrentFilter( sFilterName );
     912             : 
     913           0 :     ErrCode nCode = aFileDlg.Execute();
     914             : 
     915           0 :     if ( nCode == ERRCODE_NONE )
     916             :     {
     917           0 :         com::sun::star::uno::Sequence<OUString> aFiles = aFileDlg.GetSelectedFiles();
     918             : 
     919           0 :         if (aFiles.hasElements())
     920             :         {
     921           0 :             if (!maSelFolders.empty())
     922             :             {
     923             :                 //Import to the selected regions
     924           0 :                 std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
     925           0 :                 for (pIter = maSelFolders.begin(); pIter != maSelFolders.end(); ++pIter)
     926             :                 {
     927           0 :                     OUString aTemplateList;
     928           0 :                     TemplateContainerItem *pFolder = const_cast<TemplateContainerItem*>(static_cast<const TemplateContainerItem*>(*pIter));
     929             : 
     930           0 :                     for (size_t i = 0, n = aFiles.getLength(); i < n; ++i)
     931             :                     {
     932           0 :                         if(!mpLocalView->copyFrom(pFolder,aFiles[i]))
     933             :                         {
     934           0 :                             if (aTemplateList.isEmpty())
     935           0 :                                 aTemplateList = aFiles[i];
     936             :                             else
     937           0 :                                 aTemplateList = aTemplateList + "\n" + aFiles[i];
     938             :                         }
     939             :                     }
     940             : 
     941           0 :                     if (!aTemplateList.isEmpty())
     942             :                     {
     943           0 :                         OUString aMsg(SfxResId(STR_MSG_ERROR_IMPORT).toString());
     944           0 :                         aMsg = aMsg.replaceFirst("$1",pFolder->maTitle);
     945           0 :                         ScopedVclPtrInstance<MessageDialog>::Create(this, aMsg.replaceFirst("$2",aTemplateList))->Execute();
     946             :                     }
     947           0 :                 }
     948             :             }
     949             :             else
     950             :             {
     951             :                 //Import to current region
     952           0 :                 OUString aTemplateList;
     953           0 :                 for (size_t i = 0, n = aFiles.getLength(); i < n; ++i)
     954             :                 {
     955           0 :                     if(!mpLocalView->copyFrom(aFiles[i]))
     956             :                     {
     957           0 :                         if (aTemplateList.isEmpty())
     958           0 :                             aTemplateList = aFiles[i];
     959             :                         else
     960           0 :                             aTemplateList = aTemplateList + "\n" + aFiles[i];
     961             :                     }
     962             :                 }
     963             : 
     964           0 :                 if (!aTemplateList.isEmpty())
     965             :                 {
     966           0 :                     OUString aMsg(SfxResId(STR_MSG_ERROR_IMPORT).toString());
     967           0 :                     aMsg = aMsg.replaceFirst("$1",mpLocalView->getCurRegionName());
     968           0 :                     ScopedVclPtrInstance<MessageDialog>::Create(this, aMsg.replaceFirst("$2",aTemplateList))->Execute();
     969           0 :                 }
     970             :             }
     971             : 
     972           0 :             mpLocalView->Invalidate(InvalidateFlags::NoErase);
     973           0 :         }
     974           0 :     }
     975           0 : }
     976             : 
     977           0 : void SfxTemplateManagerDlg::OnTemplateExport()
     978             : {
     979           0 :     uno::Reference<XComponentContext> xContext(comphelper::getProcessComponentContext());
     980           0 :     uno::Reference<XFolderPicker2> xFolderPicker = FolderPicker::create(xContext);
     981             : 
     982           0 :     xFolderPicker->setDisplayDirectory(SvtPathOptions().GetWorkPath());
     983             : 
     984           0 :     sal_Int16 nResult = xFolderPicker->execute();
     985             : 
     986           0 :     if( nResult == ExecutableDialogResults::OK )
     987             :     {
     988           0 :         OUString aTemplateList;
     989           0 :         INetURLObject aPathObj(xFolderPicker->getDirectory());
     990           0 :         aPathObj.setFinalSlash();
     991             : 
     992           0 :         if (mpSearchView->IsVisible())
     993             :         {
     994           0 :             sal_uInt16 i = 1;
     995             : 
     996           0 :             std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter = maSelTemplates.begin();
     997           0 :             for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end(); ++pIter, ++i)
     998             :             {
     999           0 :                 const TemplateSearchViewItem *pItem = static_cast<const TemplateSearchViewItem*>(*pIter);
    1000             : 
    1001           0 :                 INetURLObject aItemPath(pItem->getPath());
    1002             : 
    1003           0 :                 if ( 1 == i )
    1004           0 :                     aPathObj.Append(aItemPath.getName());
    1005             :                 else
    1006           0 :                     aPathObj.setName(aItemPath.getName());
    1007             : 
    1008           0 :                 OUString aPath = aPathObj.GetMainURL( INetURLObject::NO_DECODE );
    1009             : 
    1010           0 :                 if (!mpLocalView->exportTo(pItem->mnAssocId,pItem->mnRegionId,aPath))
    1011             :                 {
    1012           0 :                     if (aTemplateList.isEmpty())
    1013           0 :                         aTemplateList = pItem->maTitle;
    1014             :                     else
    1015           0 :                         aTemplateList = aTemplateList + "\n" + pItem->maTitle;
    1016             :                 }
    1017           0 :             }
    1018             : 
    1019           0 :             mpSearchView->deselectItems();
    1020             :         }
    1021             :         else
    1022             :         {
    1023             :             // export templates from the current view
    1024             : 
    1025           0 :             sal_uInt16 i = 1;
    1026           0 :             sal_uInt16 nRegionItemId = mpLocalView->getCurRegionItemId();
    1027             : 
    1028           0 :             std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter = maSelTemplates.begin();
    1029           0 :             for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end(); ++pIter, ++i)
    1030             :             {
    1031           0 :                 const TemplateViewItem *pItem = static_cast<const TemplateViewItem*>(*pIter);
    1032             : 
    1033           0 :                 INetURLObject aItemPath(pItem->getPath());
    1034             : 
    1035           0 :                 if ( 1 == i )
    1036           0 :                     aPathObj.Append(aItemPath.getName());
    1037             :                 else
    1038           0 :                     aPathObj.setName(aItemPath.getName());
    1039             : 
    1040           0 :                 OUString aPath = aPathObj.GetMainURL( INetURLObject::NO_DECODE );
    1041             : 
    1042           0 :                 if (!mpLocalView->exportTo(pItem->mnId,nRegionItemId,aPath))
    1043             :                 {
    1044           0 :                     if (aTemplateList.isEmpty())
    1045           0 :                         aTemplateList = pItem->maTitle;
    1046             :                     else
    1047           0 :                         aTemplateList = aTemplateList + "\n" + pItem->maTitle;
    1048             :                 }
    1049           0 :             }
    1050             : 
    1051           0 :             mpLocalView->deselectItems();
    1052             :         }
    1053             : 
    1054           0 :         if (!aTemplateList.isEmpty())
    1055             :         {
    1056           0 :             OUString aText( SfxResId(STR_MSG_ERROR_EXPORT).toString() );
    1057           0 :             ScopedVclPtrInstance<MessageDialog>::Create(this, aText.replaceFirst("$1",aTemplateList))->Execute();
    1058           0 :         }
    1059           0 :     }
    1060           0 : }
    1061             : 
    1062           0 : void SfxTemplateManagerDlg::OnTemplateSearch ()
    1063             : {
    1064           0 :     bool bVisible = mpSearchEdit->IsVisible();
    1065             : 
    1066           0 :     mpActionBar->SetItemState(mpActionBar->GetItemId(ACTIONBAR_SEARCH),
    1067           0 :             bVisible? TRISTATE_FALSE: TRISTATE_TRUE);
    1068             : 
    1069             :     // fdo#74782 We are switching views. No matter to which state,
    1070             :     // deselect and hide our current SearchView items.
    1071           0 :     mpSearchView->deselectItems();
    1072           0 :     mpSearchView->Hide();
    1073             : 
    1074             :     // Hide search view
    1075           0 :     if (bVisible)
    1076             :     {
    1077           0 :         mpCurView->Show();
    1078             :     }
    1079             : 
    1080           0 :     mpSearchEdit->Show(!bVisible);
    1081           0 :     mpSearchEdit->SetText(OUString());
    1082           0 :     if (!bVisible)
    1083           0 :         mpSearchEdit->GrabFocus();
    1084           0 : }
    1085             : 
    1086           0 : void SfxTemplateManagerDlg::OnTemplateLink ()
    1087             : {
    1088           0 :     OUString sNode("TemplateRepositoryURL");
    1089           0 :     OUString sNodePath("/org.openoffice.Office.Common/Help/StartCenter");
    1090             :     try
    1091             :     {
    1092           0 :         Reference<lang::XMultiServiceFactory> xConfig = configuration::theDefaultProvider::get( comphelper::getProcessComponentContext() );
    1093           0 :         Sequence<Any> args(1);
    1094             :         PropertyValue val(
    1095             :             "nodepath",
    1096             :             0,
    1097             :             Any(sNodePath),
    1098           0 :             PropertyState_DIRECT_VALUE);
    1099           0 :         args.getArray()[0] <<= val;
    1100           0 :         Reference<container::XNameAccess> xNameAccess(xConfig->createInstanceWithArguments(SERVICENAME_CFGREADACCESS,args), UNO_QUERY);
    1101           0 :         if( xNameAccess.is() )
    1102             :         {
    1103           0 :             OUString sURL;
    1104             :             //throws css::container::NoSuchElementException, css::lang::WrappedTargetException
    1105           0 :             Any value( xNameAccess->getByName(sNode) );
    1106           0 :             sURL = value.get<OUString> ();
    1107           0 :             localizeWebserviceURI(sURL);
    1108             : 
    1109             :             Reference< com::sun::star::system::XSystemShellExecute > xSystemShellExecute(
    1110           0 :                 com::sun::star::system::SystemShellExecute::create(comphelper::getProcessComponentContext()));
    1111             :             //throws css::lang::IllegalArgumentException, css::system::SystemShellExecuteException
    1112           0 :             xSystemShellExecute->execute( sURL, OUString(), com::sun::star::system::SystemShellExecuteFlags::URIS_ONLY);
    1113           0 :         }
    1114             :     }
    1115           0 :     catch (const Exception&)
    1116             :     {
    1117           0 :     }
    1118           0 : }
    1119             : 
    1120           0 : void SfxTemplateManagerDlg::OnTemplateOpen ()
    1121             : {
    1122           0 :     ThumbnailViewItem *pItem = const_cast<ThumbnailViewItem*>(*maSelTemplates.begin());
    1123             : 
    1124           0 :     OpenTemplateHdl(pItem);
    1125           0 : }
    1126             : 
    1127           0 : void SfxTemplateManagerDlg::OnTemplateEdit ()
    1128             : {
    1129           0 :     uno::Sequence< PropertyValue > aArgs(3);
    1130           0 :     aArgs[0].Name = "AsTemplate";
    1131           0 :     aArgs[0].Value <<= sal_False;
    1132           0 :     aArgs[1].Name = "MacroExecutionMode";
    1133           0 :     aArgs[1].Value <<= MacroExecMode::USE_CONFIG;
    1134           0 :     aArgs[2].Name = "UpdateDocMode";
    1135           0 :     aArgs[2].Value <<= UpdateDocMode::ACCORDING_TO_CONFIG;
    1136             : 
    1137           0 :     uno::Reference< XStorable > xStorable;
    1138             :     std::set<const ThumbnailViewItem*,selection_cmp_fn> aSelTemplates(
    1139           0 :             maSelTemplates); // Avoids invalid iterators from LoseFocus
    1140           0 :     std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
    1141           0 :     for (pIter = aSelTemplates.begin(); pIter != aSelTemplates.end(); ++pIter)
    1142             :     {
    1143           0 :         const TemplateViewItem *pItem = static_cast<const TemplateViewItem*>(*pIter);
    1144             : 
    1145             :         try
    1146             :         {
    1147           0 :             xStorable = uno::Reference< XStorable >(
    1148           0 :                         mxDesktop->loadComponentFromURL(pItem->getPath(),"_default", 0, aArgs ),
    1149           0 :                         uno::UNO_QUERY );
    1150             :         }
    1151           0 :         catch( const uno::Exception& )
    1152             :         {
    1153             :         }
    1154             :     }
    1155             : 
    1156           0 :     Close();
    1157           0 : }
    1158             : 
    1159           0 : void SfxTemplateManagerDlg::OnTemplateProperties ()
    1160             : {
    1161           0 :     const TemplateViewItem *pItem = static_cast<const TemplateViewItem*>(*maSelTemplates.begin());
    1162             : 
    1163           0 :     ScopedVclPtrInstance< SfxTemplateInfoDlg > aDlg;
    1164           0 :     aDlg->loadDocument(pItem->getPath());
    1165           0 :     aDlg->Execute();
    1166           0 : }
    1167             : 
    1168           0 : void SfxTemplateManagerDlg::OnTemplateDelete ()
    1169             : {
    1170           0 :     ScopedVclPtrInstance< MessageDialog > aQueryDlg(this, SfxResId(STR_QMSG_SEL_TEMPLATE_DELETE), VCL_MESSAGE_QUESTION, VCL_BUTTONS_YES_NO);
    1171             : 
    1172           0 :     if ( aQueryDlg->Execute() != RET_YES )
    1173           0 :         return;
    1174             : 
    1175           0 :     OUString aTemplateList;
    1176             : 
    1177           0 :     if (mpSearchView->IsVisible())
    1178             :     {
    1179           0 :         std::set<const ThumbnailViewItem*,selection_cmp_fn> aSelTemplates = maSelTemplates; //Avoids invalid iterators
    1180             : 
    1181           0 :         std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
    1182           0 :         for (pIter = aSelTemplates.begin(); pIter != aSelTemplates.end(); ++pIter)
    1183             :         {
    1184             :             const TemplateSearchViewItem *pItem =
    1185           0 :                     static_cast<const TemplateSearchViewItem*>(*pIter);
    1186             : 
    1187           0 :             if (!mpLocalView->removeTemplate(pItem->mnAssocId,pItem->mnRegionId))
    1188             :             {
    1189           0 :                 if (aTemplateList.isEmpty())
    1190           0 :                     aTemplateList = pItem->maTitle;
    1191             :                 else
    1192           0 :                     aTemplateList = aTemplateList + "\n" + pItem->maTitle;
    1193             :             }
    1194             :             else
    1195           0 :                 mpSearchView->RemoveItem(pItem->mnId);
    1196           0 :         }
    1197             :     }
    1198             :     else
    1199             :     {
    1200           0 :         sal_uInt16 nRegionItemId = mpLocalView->getCurRegionItemId();
    1201           0 :         std::set<const ThumbnailViewItem*,selection_cmp_fn> aSelTemplates = maSelTemplates;  //Avoid invalid iterators
    1202             : 
    1203           0 :         std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
    1204           0 :         for (pIter = aSelTemplates.begin(); pIter != aSelTemplates.end(); ++pIter)
    1205             :         {
    1206           0 :             if (!mpLocalView->removeTemplate((*pIter)->mnId,nRegionItemId))
    1207             :             {
    1208           0 :                 if (aTemplateList.isEmpty())
    1209           0 :                     aTemplateList = (*pIter)->maTitle;
    1210             :                 else
    1211           0 :                     aTemplateList = aTemplateList + "\n" + (*pIter)->maTitle;
    1212             :             }
    1213           0 :         }
    1214             :     }
    1215             : 
    1216           0 :     if (!aTemplateList.isEmpty())
    1217             :     {
    1218           0 :         OUString aMsg( SfxResId(STR_MSG_ERROR_DELETE_TEMPLATE).toString() );
    1219           0 :         ScopedVclPtrInstance<MessageDialog>::Create(this, aMsg.replaceFirst("$1",aTemplateList))->Execute();
    1220           0 :     }
    1221             : }
    1222             : 
    1223           0 : void SfxTemplateManagerDlg::OnTemplateAsDefault ()
    1224             : {
    1225           0 :     if (!maSelTemplates.empty())
    1226             :     {
    1227           0 :         const TemplateViewItem *pItem = static_cast<const TemplateViewItem*>(*(maSelTemplates.begin()));
    1228             : 
    1229           0 :         OUString aServiceName;
    1230           0 :         if (lcl_getServiceName(pItem->getPath(),aServiceName))
    1231             :         {
    1232           0 :             SfxObjectFactory::SetStandardTemplate(aServiceName,pItem->getPath());
    1233             : 
    1234           0 :             createDefaultTemplateMenu();
    1235           0 :         }
    1236             :     }
    1237           0 : }
    1238             : 
    1239           0 : void SfxTemplateManagerDlg::OnFolderNew()
    1240             : {
    1241           0 :     ScopedVclPtrInstance< InputDialog > dlg(SfxResId(STR_INPUT_NEW).toString(),this);
    1242             : 
    1243           0 :     int ret = dlg->Execute();
    1244             : 
    1245           0 :     if (ret)
    1246             :     {
    1247           0 :         OUString aName = dlg->getEntryText();
    1248             : 
    1249           0 :         mpCurView->createRegion(aName);
    1250           0 :     }
    1251           0 : }
    1252             : 
    1253           0 : void SfxTemplateManagerDlg::OnFolderDelete()
    1254             : {
    1255           0 :     ScopedVclPtrInstance< MessageDialog > aQueryDlg(this, SfxResId(STR_QMSG_SEL_FOLDER_DELETE), VCL_MESSAGE_QUESTION, VCL_BUTTONS_YES_NO);
    1256             : 
    1257           0 :     if ( aQueryDlg->Execute() != RET_YES )
    1258           0 :         return;
    1259             : 
    1260           0 :     OUString aFolderList;
    1261             : 
    1262           0 :     std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
    1263           0 :     std::set<const ThumbnailViewItem*,selection_cmp_fn> aSelFolders = maSelFolders; //Copy to avoid invalidating an iterator
    1264             : 
    1265           0 :     for (pIter = aSelFolders.begin(); pIter != aSelFolders.end(); ++pIter)
    1266             :     {
    1267           0 :         if (!mpLocalView->removeRegion((*pIter)->mnId))
    1268             :         {
    1269           0 :             if (aFolderList.isEmpty())
    1270           0 :                 aFolderList = (*pIter)->maTitle;
    1271             :             else
    1272           0 :                 aFolderList = aFolderList + "\n" + (*pIter)->maTitle;
    1273             : 
    1274           0 :             ++pIter;
    1275           0 :             if (pIter == aSelFolders.end())
    1276           0 :                 break;
    1277             :         }
    1278             :     }
    1279             : 
    1280           0 :     if (!aFolderList.isEmpty())
    1281             :     {
    1282           0 :         OUString aMsg( SfxResId(STR_MSG_ERROR_DELETE_FOLDER).toString() );
    1283           0 :         ScopedVclPtrInstance<MessageDialog>::Create(this, aMsg.replaceFirst("$1",aFolderList))->Execute();
    1284           0 :     }
    1285             : }
    1286             : 
    1287           0 : void SfxTemplateManagerDlg::OnRepositoryDelete()
    1288             : {
    1289           0 :     if(deleteRepository(mpRemoteView->getCurRegionId()))
    1290             :     {
    1291             :         // switch to local view
    1292           0 :         switchMainView(true);
    1293             : 
    1294           0 :         createRepositoryMenu();
    1295             :     }
    1296           0 : }
    1297             : 
    1298           0 : void SfxTemplateManagerDlg::OnTemplateSaveAs()
    1299             : {
    1300             :     assert(m_xModel.is());
    1301             : 
    1302           0 :     if (!mpLocalView->isNonRootRegionVisible() && maSelFolders.empty())
    1303             :     {
    1304           0 :         ScopedVclPtrInstance<MessageDialog>::Create(this, SfxResId(STR_MSG_ERROR_SELECT_FOLDER))->Execute();
    1305           0 :         return;
    1306             :     }
    1307             : 
    1308           0 :     ScopedVclPtrInstance< InputDialog > aDlg(SfxResId(STR_INPUT_TEMPLATE_NEW).toString(),this);
    1309             : 
    1310           0 :     if (aDlg->Execute())
    1311             :     {
    1312           0 :         OUString aName = aDlg->getEntryText();
    1313             : 
    1314           0 :         if (!aName.isEmpty())
    1315             :         {
    1316           0 :             OUString aFolderList;
    1317           0 :             OUString aQMsg(SfxResId(STR_QMSG_TEMPLATE_OVERWRITE).toString());
    1318           0 :             ScopedVclPtrInstance< MessageDialog > aQueryDlg(this, OUString(), VCL_MESSAGE_QUESTION, VCL_BUTTONS_YES_NO);
    1319             : 
    1320           0 :             if (mpLocalView->isNonRootRegionVisible())
    1321             :             {
    1322           0 :                 sal_uInt16 nRegionItemId = mpLocalView->getRegionId(mpLocalView->getCurRegionId()-1);
    1323             : 
    1324           0 :                 if (!mpLocalView->isTemplateNameUnique(nRegionItemId,aName))
    1325             :                 {
    1326           0 :                     aQMsg = aQMsg.replaceFirst("$1",aName);
    1327           0 :                     aQueryDlg->set_primary_text(aQMsg.replaceFirst("$2",mpLocalView->getCurRegionName()));
    1328             : 
    1329           0 :                     if (aQueryDlg->Execute() == RET_NO)
    1330           0 :                         return;
    1331             :                 }
    1332             : 
    1333           0 :                 if (!mpLocalView->saveTemplateAs(nRegionItemId,m_xModel,aName))
    1334           0 :                     aFolderList = mpLocalView->getCurRegionName();
    1335             :             }
    1336             :             else
    1337             :             {
    1338           0 :                 std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
    1339           0 :                 for (pIter = maSelFolders.begin(); pIter != maSelFolders.end(); ++pIter)
    1340             :                 {
    1341           0 :                     TemplateContainerItem *pItem = const_cast<TemplateContainerItem*>(static_cast<const TemplateContainerItem*>(*pIter));
    1342             : 
    1343           0 :                     if (!mpLocalView->isTemplateNameUnique(pItem->mnId,aName))
    1344             :                     {
    1345           0 :                         OUString aDQMsg = aQMsg.replaceFirst("$1",aName);
    1346           0 :                         aQueryDlg->set_primary_text(aDQMsg.replaceFirst("$2",pItem->maTitle));
    1347             : 
    1348           0 :                         if (aQueryDlg->Execute() == RET_NO)
    1349           0 :                             continue;
    1350             :                     }
    1351             : 
    1352           0 :                     if (!mpLocalView->saveTemplateAs(pItem,m_xModel,aName))
    1353             :                     {
    1354           0 :                         if (aFolderList.isEmpty())
    1355           0 :                             aFolderList = (*pIter)->maTitle;
    1356             :                         else
    1357           0 :                             aFolderList = aFolderList + "\n" + (*pIter)->maTitle;
    1358             :                     }
    1359             :                 }
    1360             :             }
    1361             : 
    1362           0 :             if (!aFolderList.isEmpty())
    1363             :             {
    1364             :             }
    1365             : 
    1366             :             // After save file, just close the dialog
    1367           0 :             Close();
    1368           0 :         }
    1369           0 :     }
    1370             : }
    1371             : 
    1372           0 : void SfxTemplateManagerDlg::createRepositoryMenu()
    1373             : {
    1374           0 :     mpRepositoryMenu->Clear();
    1375             : 
    1376           0 :     mpRepositoryMenu->InsertItem(MNI_REPOSITORY_LOCAL,SfxResId(STR_REPOSITORY_LOCAL).toString());
    1377             : 
    1378           0 :     const std::vector<TemplateRepository*> &rRepos = getRepositories();
    1379             : 
    1380           0 :     for (size_t i = 0, n = rRepos.size(); i < n; ++i)
    1381           0 :         mpRepositoryMenu->InsertItem(MNI_REPOSITORY_BASE+rRepos[i]->mnId,rRepos[i]->maTitle);
    1382             : 
    1383           0 :     mpRepositoryMenu->InsertSeparator();
    1384           0 :     mpRepositoryMenu->InsertItem(MNI_REPOSITORY_NEW,SfxResId(STR_REPOSITORY_NEW).toString());
    1385           0 : }
    1386             : 
    1387           0 : void SfxTemplateManagerDlg::createDefaultTemplateMenu ()
    1388             : {
    1389           0 :     std::vector<OUString> aList = lcl_getAllFactoryURLs();
    1390             : 
    1391           0 :     if (!aList.empty())
    1392             :     {
    1393           0 :         mpTemplateDefaultMenu->Clear();
    1394             : 
    1395           0 :         sal_uInt16 nItemId = MNI_ACTION_DEFAULT + 1;
    1396           0 :         for( std::vector<OUString>::const_iterator i = aList.begin(); i != aList.end(); ++i )
    1397             :         {
    1398           0 :             INetURLObject aObj(*i);
    1399           0 :             OUString aTitle = SvFileInformationManager::GetDescription(aObj);
    1400           0 :             mpTemplateDefaultMenu->InsertItem(nItemId, aTitle, SvFileInformationManager::GetImage(aObj, false));
    1401           0 :             mpTemplateDefaultMenu->SetItemCommand(nItemId++, *i);
    1402           0 :         }
    1403             : 
    1404           0 :         mpActionMenu->ShowItem(MNI_ACTION_DEFAULT);
    1405             :     }
    1406             :     else
    1407           0 :         mpActionMenu->HideItem(MNI_ACTION_DEFAULT);
    1408           0 : }
    1409             : 
    1410           0 : void SfxTemplateManagerDlg::switchMainView(bool bDisplayLocal)
    1411             : {
    1412           0 :     if (bDisplayLocal)
    1413             :     {
    1414           0 :         mpCurView = mpLocalView.get();
    1415             : 
    1416           0 :         mpViewBar->HideItem(VIEWBAR_DELETE);
    1417             : 
    1418             :         // Enable deleting and exporting items from the filesystem
    1419           0 :         mpTemplateBar->ShowItem(TEMPLATEBAR_EXPORT);
    1420           0 :         mpTemplateBar->ShowItem(TEMPLATEBAR_DELETE);
    1421             : 
    1422           0 :         mpRemoteView->Hide();
    1423           0 :         mpLocalView->Show();
    1424             :     }
    1425             :     else
    1426             :     {
    1427           0 :         mpCurView = mpRemoteView.get();
    1428             : 
    1429           0 :         mpViewBar->ShowItem(VIEWBAR_DELETE);
    1430             : 
    1431             :         // Disable deleting and exporting items from remote repositories
    1432           0 :         mpTemplateBar->HideItem(TEMPLATEBAR_EXPORT);
    1433           0 :         mpTemplateBar->HideItem(TEMPLATEBAR_DELETE);
    1434             : 
    1435           0 :         mpLocalView->Hide();
    1436           0 :         mpRemoteView->Show();
    1437             :     }
    1438           0 : }
    1439             : 
    1440           0 : void SfxTemplateManagerDlg::localMoveTo(sal_uInt16 nMenuId)
    1441             : {
    1442           0 :     sal_uInt16 nItemId = 0;
    1443             : 
    1444           0 :     if (nMenuId == MNI_MOVE_NEW)
    1445             :     {
    1446           0 :         ScopedVclPtrInstance< InputDialog > dlg(SfxResId(STR_INPUT_NEW).toString(),this);
    1447             : 
    1448           0 :         int ret = dlg->Execute();
    1449             : 
    1450           0 :         if (ret)
    1451             :         {
    1452           0 :             OUString aName = dlg->getEntryText();
    1453             : 
    1454           0 :             if (!aName.isEmpty())
    1455           0 :                 nItemId = mpLocalView->createRegion(aName);
    1456           0 :         }
    1457             :     }
    1458             :     else
    1459             :     {
    1460           0 :         nItemId = mpLocalView->getRegionId(nMenuId-MNI_MOVE_FOLDER_BASE);
    1461             :     }
    1462             : 
    1463           0 :     if (nItemId)
    1464             :     {
    1465             :         // Move templates to desired folder if for some reason move fails
    1466             :         // try copying them.
    1467           0 :         if (!mpLocalView->moveTemplates(maSelTemplates,nItemId))
    1468             :         {
    1469           0 :             OUString aTemplateList;
    1470             : 
    1471           0 :             std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
    1472           0 :             for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end(); ++pIter)
    1473             :             {
    1474           0 :                 if (aTemplateList.isEmpty())
    1475           0 :                     aTemplateList = (*pIter)->maTitle;
    1476             :                 else
    1477           0 :                     aTemplateList = aTemplateList + "\n" + (*pIter)->maTitle;
    1478             :             }
    1479             : 
    1480           0 :             OUString aDst = mpLocalView->getRegionItemName(nItemId);
    1481           0 :             OUString aMsg(SfxResId(STR_MSG_ERROR_LOCAL_MOVE).toString());
    1482           0 :             aMsg = aMsg.replaceFirst("$1",aDst);
    1483           0 :             ScopedVclPtrInstance<MessageDialog>::Create(this, aMsg.replaceFirst( "$2",aTemplateList))->Execute();
    1484             :         }
    1485             :     }
    1486           0 : }
    1487             : 
    1488           0 : void SfxTemplateManagerDlg::remoteMoveTo(const sal_uInt16 nMenuId)
    1489             : {
    1490           0 :     sal_uInt16 nItemId = 0;
    1491             : 
    1492           0 :     if (nMenuId == MNI_MOVE_NEW)
    1493             :     {
    1494           0 :         ScopedVclPtrInstance< InputDialog > dlg(SfxResId(STR_INPUT_NEW).toString(),this);
    1495             : 
    1496           0 :         int ret = dlg->Execute();
    1497             : 
    1498           0 :         if (ret)
    1499             :         {
    1500           0 :             OUString aName = dlg->getEntryText();
    1501             : 
    1502           0 :             if (!aName.isEmpty())
    1503           0 :                 nItemId = mpLocalView->createRegion(aName);
    1504           0 :         }
    1505             :     }
    1506             :     else
    1507             :     {
    1508           0 :         nItemId = mpLocalView->getRegionId(nMenuId-MNI_MOVE_FOLDER_BASE);
    1509             :     }
    1510             : 
    1511           0 :     if (nItemId)
    1512             :     {
    1513           0 :         OUString aTemplateList;
    1514             : 
    1515           0 :         std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator aIter;
    1516           0 :         for (aIter = maSelTemplates.begin(); aIter != maSelTemplates.end(); ++aIter)
    1517             :         {
    1518             :             const TemplateSearchViewItem *pItem =
    1519           0 :                     static_cast<const TemplateSearchViewItem*>(*aIter);
    1520             : 
    1521           0 :             if(!mpLocalView->copyFrom(nItemId,pItem->maPreview1,pItem->getPath()))
    1522             :             {
    1523           0 :                 if (aTemplateList.isEmpty())
    1524           0 :                     aTemplateList = pItem->maTitle;
    1525             :                 else
    1526           0 :                     aTemplateList = aTemplateList + "\n" + pItem->maTitle;
    1527             :             }
    1528             :         }
    1529             : 
    1530           0 :         mpLocalView->Invalidate(InvalidateFlags::NoErase);
    1531             : 
    1532           0 :         if (!aTemplateList.isEmpty())
    1533             :         {
    1534           0 :             OUString aMsg(SfxResId(STR_MSG_ERROR_REMOTE_MOVE).toString());
    1535           0 :             aMsg = aMsg.replaceFirst("$1",mpRemoteView->getCurRegionName());
    1536           0 :             aMsg = aMsg.replaceFirst("$2",mpLocalView->getRegionItemName(nItemId));
    1537           0 :             ScopedVclPtrInstance<MessageDialog>::Create(this, aMsg.replaceFirst("$1",aTemplateList))->Execute();
    1538           0 :         }
    1539             :     }
    1540           0 : }
    1541             : 
    1542           0 : void SfxTemplateManagerDlg::localSearchMoveTo(sal_uInt16 nMenuId)
    1543             : {
    1544           0 :     sal_uInt16 nItemId = 0;
    1545             : 
    1546           0 :     if (nMenuId == MNI_MOVE_NEW)
    1547             :     {
    1548           0 :         ScopedVclPtrInstance< InputDialog > dlg(SfxResId(STR_INPUT_NEW).toString(),this);
    1549             : 
    1550           0 :         int ret = dlg->Execute();
    1551             : 
    1552           0 :         if (ret)
    1553             :         {
    1554           0 :             OUString aName = dlg->getEntryText();
    1555             : 
    1556           0 :             if (!aName.isEmpty())
    1557           0 :                 nItemId = mpLocalView->createRegion(aName);
    1558           0 :         }
    1559             :     }
    1560             :     else
    1561             :     {
    1562           0 :         nItemId = mpLocalView->getRegionId(nMenuId-MNI_MOVE_FOLDER_BASE);
    1563             :     }
    1564             : 
    1565           0 :     if (nItemId)
    1566             :     {
    1567           0 :         OUString aTemplateList;
    1568             : 
    1569             :         // Move templates to desired folder if for some reason move fails
    1570             :         // try copying them.
    1571           0 :         std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator aIter;
    1572           0 :         std::set<const ThumbnailViewItem*,selection_cmp_fn> aSelTemplates = maSelTemplates; //Copy to avoid invalidating an iterator
    1573             : 
    1574           0 :         for (aIter = aSelTemplates.begin(); aIter != aSelTemplates.end(); ++aIter)
    1575             :         {
    1576             :             const TemplateSearchViewItem *pItem =
    1577           0 :                     static_cast<const TemplateSearchViewItem*>(*aIter);
    1578             : 
    1579           0 :             if(!mpLocalView->moveTemplate(pItem,pItem->mnRegionId,nItemId))
    1580             :             {
    1581           0 :                 if (aTemplateList.isEmpty())
    1582           0 :                     aTemplateList = (*aIter)->maTitle;
    1583             :                 else
    1584           0 :                     aTemplateList = aTemplateList + "\n" + (*aIter)->maTitle;
    1585             :             }
    1586             :         }
    1587             : 
    1588           0 :         if (!aTemplateList.isEmpty())
    1589             :         {
    1590           0 :             OUString aDst = mpLocalView->getRegionItemName(nItemId);
    1591           0 :             OUString aMsg(SfxResId(STR_MSG_ERROR_LOCAL_MOVE).toString());
    1592           0 :             aMsg = aMsg.replaceFirst("$1",aDst);
    1593           0 :             ScopedVclPtrInstance<MessageDialog>::Create(this, aMsg.replaceFirst( "$2",aTemplateList))->Execute();
    1594           0 :         }
    1595             :     }
    1596             : 
    1597             :     // Deselect all items and update search results
    1598           0 :     mpSearchView->deselectItems();
    1599             : 
    1600           0 :     SearchUpdateHdl(mpSearchEdit);
    1601           0 : }
    1602             : 
    1603           0 : void SfxTemplateManagerDlg::loadRepositories()
    1604             : {
    1605           0 :     uno::Reference < uno::XComponentContext > m_context(comphelper::getProcessComponentContext());
    1606             : 
    1607             :     // Load from user settings
    1608             :     com::sun::star::uno::Sequence<OUString>  aUrls =
    1609           0 :             officecfg::Office::Common::Misc::TemplateRepositoryUrls::get(m_context);
    1610             : 
    1611             :     com::sun::star::uno::Sequence<OUString> aNames =
    1612           0 :             officecfg::Office::Common::Misc::TemplateRepositoryNames::get(m_context);
    1613             : 
    1614           0 :     for (sal_Int32 i = 0; i < aUrls.getLength() && i < aNames.getLength(); ++i)
    1615             :     {
    1616           0 :         TemplateRepository *pItem = new TemplateRepository();
    1617             : 
    1618           0 :         pItem->mnId = i+1;
    1619           0 :         pItem->maTitle = aNames[i];
    1620           0 :         pItem->setURL(aUrls[i]);
    1621             : 
    1622           0 :         maRepositories.push_back(pItem);
    1623           0 :     }
    1624           0 : }
    1625             : 
    1626           0 : bool SfxTemplateManagerDlg::insertRepository(const OUString &rName, const OUString &rURL)
    1627             : {
    1628           0 :     for (size_t i = 0, n = maRepositories.size(); i < n; ++i)
    1629             :     {
    1630           0 :         if (maRepositories[i]->maTitle == rName)
    1631           0 :             return false;
    1632             :     }
    1633             : 
    1634           0 :     TemplateRepository *pItem = new TemplateRepository();
    1635             : 
    1636           0 :     pItem->mnId = maRepositories.size()+1;
    1637           0 :     pItem->maTitle = rName;
    1638           0 :     pItem->setURL(rURL);
    1639             : 
    1640           0 :     maRepositories.push_back(pItem);
    1641             : 
    1642           0 :     mbIsSynced = false;
    1643           0 :     return true;
    1644             : }
    1645             : 
    1646           0 : bool SfxTemplateManagerDlg::deleteRepository(const sal_uInt16 nRepositoryId)
    1647             : {
    1648           0 :     bool bRet = false;
    1649             : 
    1650           0 :     for (size_t i = 0, n = maRepositories.size(); i < n; ++i)
    1651             :     {
    1652           0 :         if (maRepositories[i]->mnId == nRepositoryId)
    1653             :         {
    1654           0 :             delete maRepositories[i];
    1655             : 
    1656           0 :             maRepositories.erase(maRepositories.begin() + i);
    1657           0 :             mbIsSynced = false;
    1658           0 :             bRet = true;
    1659           0 :             break;
    1660             :         }
    1661             :     }
    1662             : 
    1663           0 :     return bRet;
    1664             : }
    1665             : 
    1666           0 : void SfxTemplateManagerDlg::syncRepositories() const
    1667             : {
    1668           0 :     if (!mbIsSynced)
    1669             :     {
    1670           0 :         uno::Reference < uno::XComponentContext > pContext(comphelper::getProcessComponentContext());
    1671           0 :         std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create(pContext));
    1672             : 
    1673           0 :         size_t nSize = maRepositories.size();
    1674           0 :         uno::Sequence<OUString> aUrls(nSize);
    1675           0 :         uno::Sequence<OUString> aNames(nSize);
    1676             : 
    1677           0 :         for(size_t i = 0; i < nSize; ++i)
    1678             :         {
    1679           0 :             aUrls[i] = maRepositories[i]->getURL();
    1680           0 :             aNames[i] = maRepositories[i]->maTitle;
    1681             :         }
    1682             : 
    1683           0 :         officecfg::Office::Common::Misc::TemplateRepositoryUrls::set(aUrls, batch);
    1684           0 :         officecfg::Office::Common::Misc::TemplateRepositoryNames::set(aNames, batch);
    1685           0 :         batch->commit();
    1686             :     }
    1687           0 : }
    1688             : 
    1689           0 : static bool lcl_getServiceName ( const OUString &rFileURL, OUString &rName )
    1690             : {
    1691           0 :     bool bRet = false;
    1692             : 
    1693           0 :     if ( !rFileURL.isEmpty() )
    1694             :     {
    1695             :         try
    1696             :         {
    1697             :             uno::Reference< embed::XStorage > xStorage =
    1698           0 :                     comphelper::OStorageHelper::GetStorageFromURL( rFileURL, embed::ElementModes::READ );
    1699             : 
    1700           0 :             SotClipboardFormatId nFormat = SotStorage::GetFormatID( xStorage );
    1701             : 
    1702           0 :             const SfxFilter* pFilter = SfxGetpApp()->GetFilterMatcher().GetFilter4ClipBoardId( nFormat );
    1703             : 
    1704           0 :             if ( pFilter )
    1705             :             {
    1706           0 :                 rName = pFilter->GetServiceName();
    1707           0 :                 bRet = true;
    1708           0 :             }
    1709             :         }
    1710           0 :         catch( uno::Exception& )
    1711             :         {}
    1712             :     }
    1713             : 
    1714           0 :     return bRet;
    1715             : }
    1716             : 
    1717           0 : static std::vector<OUString> lcl_getAllFactoryURLs ()
    1718             : {
    1719           0 :     SvtModuleOptions aModOpt;
    1720           0 :     std::vector<OUString> aList;
    1721           0 :     const ::com::sun::star::uno::Sequence<OUString> &aServiceNames = aModOpt.GetAllServiceNames();
    1722             : 
    1723           0 :     for( sal_Int32 i=0, nCount = aServiceNames.getLength(); i < nCount; ++i )
    1724             :     {
    1725           0 :         if ( ! SfxObjectFactory::GetStandardTemplate( aServiceNames[i] ).isEmpty() )
    1726             :         {
    1727           0 :             SvtModuleOptions::EFactory eFac = SvtModuleOptions::EFactory::WRITER;
    1728           0 :             SvtModuleOptions::ClassifyFactoryByName( aServiceNames[i], eFac );
    1729           0 :             aList.push_back(aModOpt.GetFactoryEmptyDocumentURL(eFac));
    1730             :         }
    1731             :     }
    1732             : 
    1733           0 :     return aList;
    1734         648 : }
    1735             : 
    1736             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11