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