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 "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/msgbox.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(Window *parent)
178 : : ModelessDialog(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), TIB_DROPDOWNONLY);
228 0 : mpActionBar->SetItemBits(mpActionBar->GetItemId(ACTIONBAR_ACTION), TIB_DROPDOWNONLY);
229 0 : mpTemplateBar->SetItemBits(mpTemplateBar->GetItemId(TEMPLATEBAR_MOVE), TIB_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 : ErrorBox(this,WB_OK,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 = (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 : ErrorBox(this,WB_OK,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 : ErrorBox(this,WB_OK,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 : ErrorBox(this, WB_OK,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 : QueryBox aQueryDlg(this, WB_YES_NO | WB_DEF_YES, SfxResId(STR_QMSG_SEL_TEMPLATE_DELETE).toString());
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 : ErrorBox(this, WB_OK,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 : QueryBox aQueryDlg(this, WB_YES_NO | WB_DEF_YES, SfxResId(STR_QMSG_SEL_FOLDER_DELETE).toString());
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 : }
1267 : }
1268 :
1269 0 : if (!aFolderList.isEmpty())
1270 : {
1271 0 : OUString aMsg( SfxResId(STR_MSG_ERROR_DELETE_FOLDER).toString() );
1272 0 : ErrorBox(this, WB_OK,aMsg.replaceFirst("$1",aFolderList)).Execute();
1273 0 : }
1274 : }
1275 :
1276 0 : void SfxTemplateManagerDlg::OnRepositoryDelete()
1277 : {
1278 0 : if(deleteRepository(mpRemoteView->getCurRegionId()))
1279 : {
1280 : // switch to local view
1281 0 : switchMainView(true);
1282 :
1283 0 : createRepositoryMenu();
1284 : }
1285 0 : }
1286 :
1287 0 : void SfxTemplateManagerDlg::OnTemplateSaveAs()
1288 : {
1289 : assert(m_xModel.is());
1290 :
1291 0 : if (!mpLocalView->isNonRootRegionVisible() && maSelFolders.empty())
1292 : {
1293 0 : ErrorBox(this, WB_OK,SfxResId(STR_MSG_ERROR_SELECT_FOLDER).toString()).Execute();
1294 0 : return;
1295 : }
1296 :
1297 0 : InputDialog aDlg(SfxResId(STR_INPUT_TEMPLATE_NEW).toString(),this);
1298 :
1299 0 : if (aDlg.Execute())
1300 : {
1301 0 : OUString aName = aDlg.getEntryText();
1302 :
1303 0 : if (!aName.isEmpty())
1304 : {
1305 0 : OUString aFolderList;
1306 0 : OUString aQMsg(SfxResId(STR_QMSG_TEMPLATE_OVERWRITE).toString());
1307 0 : QueryBox aQueryDlg(this,WB_YES_NO | WB_DEF_YES, OUString());
1308 :
1309 0 : if (mpLocalView->isNonRootRegionVisible())
1310 : {
1311 0 : sal_uInt16 nRegionItemId = mpLocalView->getRegionId(mpLocalView->getCurRegionId()-1);
1312 :
1313 0 : if (!mpLocalView->isTemplateNameUnique(nRegionItemId,aName))
1314 : {
1315 0 : aQMsg = aQMsg.replaceFirst("$1",aName);
1316 0 : aQueryDlg.SetMessText(aQMsg.replaceFirst("$2",mpLocalView->getCurRegionName()));
1317 :
1318 0 : if (aQueryDlg.Execute() == RET_NO)
1319 0 : return;
1320 : }
1321 :
1322 0 : if (!mpLocalView->saveTemplateAs(nRegionItemId,m_xModel,aName))
1323 0 : aFolderList = mpLocalView->getCurRegionName();
1324 : }
1325 : else
1326 : {
1327 0 : std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
1328 0 : for (pIter = maSelFolders.begin(); pIter != maSelFolders.end(); ++pIter)
1329 : {
1330 0 : TemplateContainerItem *pItem = (TemplateContainerItem*)(*pIter);
1331 :
1332 0 : if (!mpLocalView->isTemplateNameUnique(pItem->mnId,aName))
1333 : {
1334 0 : OUString aDQMsg = aQMsg.replaceFirst("$1",aName);
1335 0 : aQueryDlg.SetMessText(aDQMsg.replaceFirst("$2",pItem->maTitle));
1336 :
1337 0 : if (aQueryDlg.Execute() == RET_NO)
1338 0 : continue;
1339 : }
1340 :
1341 0 : if (!mpLocalView->saveTemplateAs(pItem,m_xModel,aName))
1342 : {
1343 0 : if (aFolderList.isEmpty())
1344 0 : aFolderList = (*pIter)->maTitle;
1345 : else
1346 0 : aFolderList = aFolderList + "\n" + (*pIter)->maTitle;
1347 : }
1348 : }
1349 : }
1350 :
1351 0 : if (!aFolderList.isEmpty())
1352 : {
1353 : }
1354 :
1355 : // After save file, just close the dialog
1356 0 : Close();
1357 0 : }
1358 0 : }
1359 : }
1360 :
1361 0 : void SfxTemplateManagerDlg::createRepositoryMenu()
1362 : {
1363 0 : mpRepositoryMenu->Clear();
1364 :
1365 0 : mpRepositoryMenu->InsertItem(MNI_REPOSITORY_LOCAL,SfxResId(STR_REPOSITORY_LOCAL).toString());
1366 :
1367 0 : const std::vector<TemplateRepository*> &rRepos = getRepositories();
1368 :
1369 0 : for (size_t i = 0, n = rRepos.size(); i < n; ++i)
1370 0 : mpRepositoryMenu->InsertItem(MNI_REPOSITORY_BASE+rRepos[i]->mnId,rRepos[i]->maTitle);
1371 :
1372 0 : mpRepositoryMenu->InsertSeparator();
1373 0 : mpRepositoryMenu->InsertItem(MNI_REPOSITORY_NEW,SfxResId(STR_REPOSITORY_NEW).toString());
1374 0 : }
1375 :
1376 0 : void SfxTemplateManagerDlg::createDefaultTemplateMenu ()
1377 : {
1378 0 : std::vector<OUString> aList = lcl_getAllFactoryURLs();
1379 :
1380 0 : if (!aList.empty())
1381 : {
1382 0 : mpTemplateDefaultMenu->Clear();
1383 :
1384 0 : sal_uInt16 nItemId = MNI_ACTION_DEFAULT + 1;
1385 0 : for( std::vector<OUString>::const_iterator i = aList.begin(); i != aList.end(); ++i )
1386 : {
1387 0 : INetURLObject aObj(*i);
1388 0 : OUString aTitle = SvFileInformationManager::GetDescription(aObj);
1389 0 : mpTemplateDefaultMenu->InsertItem(nItemId, aTitle, SvFileInformationManager::GetImage(aObj, false));
1390 0 : mpTemplateDefaultMenu->SetItemCommand(nItemId++, *i);
1391 0 : }
1392 :
1393 0 : mpActionMenu->ShowItem(MNI_ACTION_DEFAULT);
1394 : }
1395 : else
1396 0 : mpActionMenu->HideItem(MNI_ACTION_DEFAULT);
1397 0 : }
1398 :
1399 0 : void SfxTemplateManagerDlg::switchMainView(bool bDisplayLocal)
1400 : {
1401 0 : if (bDisplayLocal)
1402 : {
1403 0 : mpCurView = mpLocalView;
1404 :
1405 0 : mpViewBar->HideItem(VIEWBAR_DELETE);
1406 :
1407 : // Enable deleting and exporting items from the filesystem
1408 0 : mpTemplateBar->ShowItem(TEMPLATEBAR_EXPORT);
1409 0 : mpTemplateBar->ShowItem(TEMPLATEBAR_DELETE);
1410 :
1411 0 : mpRemoteView->Hide();
1412 0 : mpLocalView->Show();
1413 : }
1414 : else
1415 : {
1416 0 : mpCurView = mpRemoteView;
1417 :
1418 0 : mpViewBar->ShowItem(VIEWBAR_DELETE);
1419 :
1420 : // Disable deleting and exporting items from remote repositories
1421 0 : mpTemplateBar->HideItem(TEMPLATEBAR_EXPORT);
1422 0 : mpTemplateBar->HideItem(TEMPLATEBAR_DELETE);
1423 :
1424 0 : mpLocalView->Hide();
1425 0 : mpRemoteView->Show();
1426 : }
1427 0 : }
1428 :
1429 0 : void SfxTemplateManagerDlg::localMoveTo(sal_uInt16 nMenuId)
1430 : {
1431 0 : sal_uInt16 nItemId = 0;
1432 :
1433 0 : if (nMenuId == MNI_MOVE_NEW)
1434 : {
1435 0 : InputDialog dlg(SfxResId(STR_INPUT_NEW).toString(),this);
1436 :
1437 0 : int ret = dlg.Execute();
1438 :
1439 0 : if (ret)
1440 : {
1441 0 : OUString aName = dlg.getEntryText();
1442 :
1443 0 : if (!aName.isEmpty())
1444 0 : nItemId = mpLocalView->createRegion(aName);
1445 0 : }
1446 : }
1447 : else
1448 : {
1449 0 : nItemId = mpLocalView->getRegionId(nMenuId-MNI_MOVE_FOLDER_BASE);
1450 : }
1451 :
1452 0 : if (nItemId)
1453 : {
1454 : // Move templates to desired folder if for some reason move fails
1455 : // try copying them.
1456 0 : if (!mpLocalView->moveTemplates(maSelTemplates,nItemId))
1457 : {
1458 0 : OUString aTemplateList;
1459 :
1460 0 : std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
1461 0 : for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end(); ++pIter)
1462 : {
1463 0 : if (aTemplateList.isEmpty())
1464 0 : aTemplateList = (*pIter)->maTitle;
1465 : else
1466 0 : aTemplateList = aTemplateList + "\n" + (*pIter)->maTitle;
1467 : }
1468 :
1469 0 : OUString aDst = mpLocalView->getRegionItemName(nItemId);
1470 0 : OUString aMsg(SfxResId(STR_MSG_ERROR_LOCAL_MOVE).toString());
1471 0 : aMsg = aMsg.replaceFirst("$1",aDst);
1472 0 : ErrorBox(this, WB_OK,aMsg.replaceFirst( "$2",aTemplateList)).Execute();
1473 : }
1474 : }
1475 0 : }
1476 :
1477 0 : void SfxTemplateManagerDlg::remoteMoveTo(const sal_uInt16 nMenuId)
1478 : {
1479 0 : sal_uInt16 nItemId = 0;
1480 :
1481 0 : if (nMenuId == MNI_MOVE_NEW)
1482 : {
1483 0 : InputDialog dlg(SfxResId(STR_INPUT_NEW).toString(),this);
1484 :
1485 0 : int ret = dlg.Execute();
1486 :
1487 0 : if (ret)
1488 : {
1489 0 : OUString aName = dlg.getEntryText();
1490 :
1491 0 : if (!aName.isEmpty())
1492 0 : nItemId = mpLocalView->createRegion(aName);
1493 0 : }
1494 : }
1495 : else
1496 : {
1497 0 : nItemId = mpLocalView->getRegionId(nMenuId-MNI_MOVE_FOLDER_BASE);
1498 : }
1499 :
1500 0 : if (nItemId)
1501 : {
1502 0 : OUString aTemplateList;
1503 :
1504 0 : std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator aIter;
1505 0 : for (aIter = maSelTemplates.begin(); aIter != maSelTemplates.end(); ++aIter)
1506 : {
1507 : const TemplateSearchViewItem *pItem =
1508 0 : static_cast<const TemplateSearchViewItem*>(*aIter);
1509 :
1510 0 : if(!mpLocalView->copyFrom(nItemId,pItem->maPreview1,pItem->getPath()))
1511 : {
1512 0 : if (aTemplateList.isEmpty())
1513 0 : aTemplateList = pItem->maTitle;
1514 : else
1515 0 : aTemplateList = aTemplateList + "\n" + pItem->maTitle;
1516 : }
1517 : }
1518 :
1519 0 : mpLocalView->Invalidate(INVALIDATE_NOERASE);
1520 :
1521 0 : if (!aTemplateList.isEmpty())
1522 : {
1523 0 : OUString aMsg(SfxResId(STR_MSG_ERROR_REMOTE_MOVE).toString());
1524 0 : aMsg = aMsg.replaceFirst("$1",mpRemoteView->getCurRegionName());
1525 0 : aMsg = aMsg.replaceFirst("$2",mpLocalView->getRegionItemName(nItemId));
1526 0 : ErrorBox(this,WB_OK,aMsg.replaceFirst("$1",aTemplateList)).Execute();
1527 0 : }
1528 : }
1529 0 : }
1530 :
1531 0 : void SfxTemplateManagerDlg::localSearchMoveTo(sal_uInt16 nMenuId)
1532 : {
1533 0 : sal_uInt16 nItemId = 0;
1534 :
1535 0 : if (nMenuId == MNI_MOVE_NEW)
1536 : {
1537 0 : InputDialog dlg(SfxResId(STR_INPUT_NEW).toString(),this);
1538 :
1539 0 : int ret = dlg.Execute();
1540 :
1541 0 : if (ret)
1542 : {
1543 0 : OUString aName = dlg.getEntryText();
1544 :
1545 0 : if (!aName.isEmpty())
1546 0 : nItemId = mpLocalView->createRegion(aName);
1547 0 : }
1548 : }
1549 : else
1550 : {
1551 0 : nItemId = mpLocalView->getRegionId(nMenuId-MNI_MOVE_FOLDER_BASE);
1552 : }
1553 :
1554 0 : if (nItemId)
1555 : {
1556 0 : OUString aTemplateList;
1557 :
1558 : // Move templates to desired folder if for some reason move fails
1559 : // try copying them.
1560 0 : std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator aIter;
1561 0 : std::set<const ThumbnailViewItem*,selection_cmp_fn> aSelTemplates = maSelTemplates; //Copy to avoid invalidating an iterator
1562 :
1563 0 : for (aIter = aSelTemplates.begin(); aIter != aSelTemplates.end(); ++aIter)
1564 : {
1565 : const TemplateSearchViewItem *pItem =
1566 0 : static_cast<const TemplateSearchViewItem*>(*aIter);
1567 :
1568 0 : if(!mpLocalView->moveTemplate(pItem,pItem->mnRegionId,nItemId))
1569 : {
1570 0 : if (aTemplateList.isEmpty())
1571 0 : aTemplateList = (*aIter)->maTitle;
1572 : else
1573 0 : aTemplateList = aTemplateList + "\n" + (*aIter)->maTitle;
1574 : }
1575 : }
1576 :
1577 0 : if (!aTemplateList.isEmpty())
1578 : {
1579 0 : OUString aDst = mpLocalView->getRegionItemName(nItemId);
1580 0 : OUString aMsg(SfxResId(STR_MSG_ERROR_LOCAL_MOVE).toString());
1581 0 : aMsg = aMsg.replaceFirst("$1",aDst);
1582 0 : ErrorBox(this, WB_OK,aMsg.replaceFirst( "$2",aTemplateList)).Execute();
1583 0 : }
1584 : }
1585 :
1586 : // Deselect all items and update search results
1587 0 : mpSearchView->deselectItems();
1588 :
1589 0 : SearchUpdateHdl(mpSearchEdit);
1590 0 : }
1591 :
1592 0 : void SfxTemplateManagerDlg::loadRepositories()
1593 : {
1594 0 : uno::Reference < uno::XComponentContext > m_context(comphelper::getProcessComponentContext());
1595 :
1596 : // Load from user settings
1597 : com::sun::star::uno::Sequence<OUString> aUrls =
1598 0 : officecfg::Office::Common::Misc::TemplateRepositoryUrls::get(m_context);
1599 :
1600 : com::sun::star::uno::Sequence<OUString> aNames =
1601 0 : officecfg::Office::Common::Misc::TemplateRepositoryNames::get(m_context);
1602 :
1603 0 : for (sal_Int32 i = 0; i < aUrls.getLength() && i < aNames.getLength(); ++i)
1604 : {
1605 0 : TemplateRepository *pItem = new TemplateRepository();
1606 :
1607 0 : pItem->mnId = i+1;
1608 0 : pItem->maTitle = aNames[i];
1609 0 : pItem->setURL(aUrls[i]);
1610 :
1611 0 : maRepositories.push_back(pItem);
1612 0 : }
1613 0 : }
1614 :
1615 0 : bool SfxTemplateManagerDlg::insertRepository(const OUString &rName, const OUString &rURL)
1616 : {
1617 0 : for (size_t i = 0, n = maRepositories.size(); i < n; ++i)
1618 : {
1619 0 : if (maRepositories[i]->maTitle == rName)
1620 0 : return false;
1621 : }
1622 :
1623 0 : TemplateRepository *pItem = new TemplateRepository();
1624 :
1625 0 : pItem->mnId = maRepositories.size()+1;
1626 0 : pItem->maTitle = rName;
1627 0 : pItem->setURL(rURL);
1628 :
1629 0 : maRepositories.push_back(pItem);
1630 :
1631 0 : mbIsSynced = false;
1632 0 : return true;
1633 : }
1634 :
1635 0 : bool SfxTemplateManagerDlg::deleteRepository(const sal_uInt16 nRepositoryId)
1636 : {
1637 0 : bool bRet = false;
1638 :
1639 0 : for (size_t i = 0, n = maRepositories.size(); i < n; ++i)
1640 : {
1641 0 : if (maRepositories[i]->mnId == nRepositoryId)
1642 : {
1643 0 : delete maRepositories[i];
1644 :
1645 0 : maRepositories.erase(maRepositories.begin() + i);
1646 0 : mbIsSynced = false;
1647 0 : bRet = true;
1648 0 : break;
1649 : }
1650 : }
1651 :
1652 0 : return bRet;
1653 : }
1654 :
1655 0 : void SfxTemplateManagerDlg::syncRepositories() const
1656 : {
1657 0 : if (!mbIsSynced)
1658 : {
1659 0 : uno::Reference < uno::XComponentContext > pContext(comphelper::getProcessComponentContext());
1660 0 : boost::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create(pContext));
1661 :
1662 0 : size_t nSize = maRepositories.size();
1663 0 : uno::Sequence<OUString> aUrls(nSize);
1664 0 : uno::Sequence<OUString> aNames(nSize);
1665 :
1666 0 : for(size_t i = 0; i < nSize; ++i)
1667 : {
1668 0 : aUrls[i] = maRepositories[i]->getURL();
1669 0 : aNames[i] = maRepositories[i]->maTitle;
1670 : }
1671 :
1672 0 : officecfg::Office::Common::Misc::TemplateRepositoryUrls::set(aUrls, batch, pContext);
1673 0 : officecfg::Office::Common::Misc::TemplateRepositoryNames::set(aNames, batch, pContext);
1674 0 : batch->commit();
1675 : }
1676 0 : }
1677 :
1678 0 : static bool lcl_getServiceName ( const OUString &rFileURL, OUString &rName )
1679 : {
1680 0 : bool bRet = false;
1681 :
1682 0 : if ( !rFileURL.isEmpty() )
1683 : {
1684 : try
1685 : {
1686 : uno::Reference< embed::XStorage > xStorage =
1687 0 : comphelper::OStorageHelper::GetStorageFromURL( rFileURL, embed::ElementModes::READ );
1688 :
1689 0 : sal_uIntPtr nFormat = SotStorage::GetFormatID( xStorage );
1690 :
1691 0 : const SfxFilter* pFilter = SFX_APP()->GetFilterMatcher().GetFilter4ClipBoardId( nFormat );
1692 :
1693 0 : if ( pFilter )
1694 : {
1695 0 : rName = pFilter->GetServiceName();
1696 0 : bRet = true;
1697 0 : }
1698 : }
1699 0 : catch( uno::Exception& )
1700 : {}
1701 : }
1702 :
1703 0 : return bRet;
1704 : }
1705 :
1706 0 : static std::vector<OUString> lcl_getAllFactoryURLs ()
1707 : {
1708 0 : SvtModuleOptions aModOpt;
1709 0 : std::vector<OUString> aList;
1710 0 : const ::com::sun::star::uno::Sequence<OUString> &aServiceNames = aModOpt.GetAllServiceNames();
1711 :
1712 0 : for( sal_Int32 i=0, nCount = aServiceNames.getLength(); i < nCount; ++i )
1713 : {
1714 0 : if ( ! SfxObjectFactory::GetStandardTemplate( aServiceNames[i] ).isEmpty() )
1715 : {
1716 0 : SvtModuleOptions::EFactory eFac = SvtModuleOptions::E_WRITER;
1717 0 : SvtModuleOptions::ClassifyFactoryByName( aServiceNames[i], eFac );
1718 0 : aList.push_back(aModOpt.GetFactoryEmptyDocumentURL(eFac));
1719 : }
1720 : }
1721 :
1722 0 : return aList;
1723 3 : }
1724 :
1725 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|