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: */
|