Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * Copyright 2012 LibreOffice contributors.
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/PlaceEditDialog.hxx>
34 : #include <tools/urlobj.hxx>
35 : #include <unotools/moduleoptions.hxx>
36 : #include <unotools/pathoptions.hxx>
37 : #include <vcl/edit.hxx>
38 : #include <vcl/msgbox.hxx>
39 : #include <vcl/toolbox.hxx>
40 :
41 : #include <com/sun/star/beans/PropertyValue.hpp>
42 : #include <com/sun/star/embed/XStorage.hpp>
43 : #include <com/sun/star/embed/ElementModes.hpp>
44 : #include <com/sun/star/frame/Desktop.hpp>
45 : #include <com/sun/star/frame/XComponentLoader.hpp>
46 : #include <com/sun/star/frame/XStorable.hpp>
47 : #include <com/sun/star/lang/XComponent.hpp>
48 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
49 : #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
50 : #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
51 : #include <com/sun/star/ui/dialogs/FolderPicker.hpp>
52 :
53 : #include "doc.hrc"
54 : #include "templatedlg.hrc"
55 :
56 : #define PADDING_DLG_BORDER 10
57 :
58 : using namespace ::com::sun::star;
59 : using namespace ::com::sun::star::beans;
60 : using namespace ::com::sun::star::embed;
61 : using namespace ::com::sun::star::frame;
62 : using namespace ::com::sun::star::lang;
63 : using namespace ::com::sun::star::uno;
64 : using namespace ::com::sun::star::ui::dialogs;
65 :
66 : static bool lcl_getServiceName (const OUString &rFileURL, OUString &rName );
67 :
68 : static std::vector<OUString> lcl_getAllFactoryURLs ();
69 :
70 : // Sort by name in ascending order
71 : class SortView_Name
72 : {
73 : public:
74 :
75 0 : bool operator() (const ThumbnailViewItem *pItem1, const ThumbnailViewItem *pItem2)
76 : {
77 0 : return (pItem1->maTitle.compareTo(pItem2->maTitle) < 0);
78 : }
79 : };
80 :
81 0 : class SearchView_Keyword
82 : {
83 : public:
84 :
85 0 : SearchView_Keyword (const OUString &rKeyword)
86 0 : : maKeyword(rKeyword)
87 0 : {}
88 :
89 0 : bool operator() (const TemplateItemProperties &rItem)
90 : {
91 0 : return rItem.aName.matchIgnoreAsciiCase(maKeyword);
92 : }
93 :
94 : private:
95 :
96 : OUString maKeyword;
97 : };
98 :
99 0 : SfxTemplateManagerDlg::SfxTemplateManagerDlg (Window *parent)
100 : : ModelessDialog(parent, SfxResId(DLG_TEMPLATE_MANAGER)),
101 : maTabControl(this,SfxResId(TAB_CONTROL)),
102 0 : mpToolbars( new Control(&maTabControl,SfxResId(TOOLBARS))),
103 0 : mpSearchEdit(new Edit(this,WB_HIDE | WB_BORDER)),
104 0 : mpViewBar( new ToolBox(mpToolbars, SfxResId(TBX_ACTION_VIEW))),
105 0 : mpActionBar( new ToolBox(mpToolbars, SfxResId(TBX_ACTION_ACTION))),
106 0 : mpTemplateBar( new ToolBox(mpToolbars, SfxResId(TBX_ACTION_TEMPLATES))),
107 0 : mpSearchView(new TemplateSearchView(this)),
108 0 : maView(new TemplateLocalView(this,SfxResId(TEMPLATE_VIEW))),
109 0 : mpOnlineView(new TemplateRemoteView(this, WB_VSCROLL,false)),
110 : mbIsSaveMode(false),
111 : mxDesktop( Desktop::create(comphelper::getProcessComponentContext()) ),
112 : mbIsSynced(false),
113 0 : maRepositories()
114 : {
115 : // Create popup menus
116 0 : mpActionMenu = new PopupMenu;
117 0 : mpActionMenu->InsertItem(MNI_ACTION_SORT_NAME,SfxResId(STR_ACTION_SORT_NAME).toString(),SfxResId(IMG_ACTION_SORT));
118 0 : mpActionMenu->InsertItem(MNI_ACTION_REFRESH,SfxResId(STR_ACTION_REFRESH).toString(),SfxResId(IMG_ACTION_REFRESH));
119 0 : mpActionMenu->InsertItem(MNI_ACTION_DEFAULT,SfxResId(STR_ACTION_DEFAULT).toString());
120 0 : mpActionMenu->SetSelectHdl(LINK(this,SfxTemplateManagerDlg,MenuSelectHdl));
121 :
122 0 : mpRepositoryMenu = new PopupMenu;
123 0 : mpRepositoryMenu->SetSelectHdl(LINK(this,SfxTemplateManagerDlg,RepositoryMenuSelectHdl));
124 :
125 0 : mpTemplateDefaultMenu = new PopupMenu;
126 0 : mpTemplateDefaultMenu->SetSelectHdl(LINK(this,SfxTemplateManagerDlg,DefaultTemplateMenuSelectHdl));
127 0 : mpActionMenu->SetPopupMenu(MNI_ACTION_DEFAULT,mpTemplateDefaultMenu);
128 :
129 : // Set toolbox styles
130 0 : mpViewBar->SetButtonType(BUTTON_SYMBOLTEXT);
131 0 : mpTemplateBar->SetButtonType(BUTTON_SYMBOLTEXT);
132 :
133 : // Set toolbox button bits
134 0 : mpViewBar->SetItemBits(TBI_TEMPLATE_REPOSITORY, TIB_DROPDOWNONLY);
135 0 : mpActionBar->SetItemBits(TBI_TEMPLATE_ACTION, TIB_DROPDOWNONLY);
136 0 : mpTemplateBar->SetItemBits(TBI_TEMPLATE_MOVE,TIB_DROPDOWNONLY);
137 :
138 : // Set toolbox handlers
139 0 : mpViewBar->SetClickHdl(LINK(this,SfxTemplateManagerDlg,TBXViewHdl));
140 0 : mpViewBar->SetDropdownClickHdl(LINK(this,SfxTemplateManagerDlg,TBXDropdownHdl));
141 0 : mpActionBar->SetClickHdl(LINK(this,SfxTemplateManagerDlg,TBXActionHdl));
142 0 : mpActionBar->SetDropdownClickHdl(LINK(this,SfxTemplateManagerDlg,TBXDropdownHdl));
143 0 : mpTemplateBar->SetClickHdl(LINK(this,SfxTemplateManagerDlg,TBXTemplateHdl));
144 0 : mpTemplateBar->SetDropdownClickHdl(LINK(this,SfxTemplateManagerDlg,TBXDropdownHdl));
145 0 : mpSearchEdit->SetUpdateDataHdl(LINK(this,SfxTemplateManagerDlg,SearchUpdateHdl));
146 0 : mpSearchEdit->EnableUpdateData();
147 :
148 0 : maView->SetStyle(WB_VSCROLL);
149 0 : maView->setItemMaxTextLength(TEMPLATE_ITEM_MAX_TEXT_LENGTH);
150 :
151 : maView->setItemDimensions(TEMPLATE_ITEM_MAX_WIDTH,TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
152 : TEMPLATE_ITEM_MAX_HEIGHT-TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
153 0 : TEMPLATE_ITEM_PADDING);
154 :
155 0 : maView->setItemStateHdl(LINK(this,SfxTemplateManagerDlg,TVFolderStateHdl));
156 0 : maView->setOverlayItemStateHdl(LINK(this,SfxTemplateManagerDlg,TVTemplateStateHdl));
157 0 : maView->setOverlayDblClickHdl(LINK(this,SfxTemplateManagerDlg,OpenTemplateHdl));
158 0 : maView->setOverlayCloseHdl(LINK(this,SfxTemplateManagerDlg,CloseOverlayHdl));
159 :
160 : // Set online view position and dimensions
161 0 : mpOnlineView->setItemMaxTextLength(TEMPLATE_ITEM_MAX_TEXT_LENGTH);
162 :
163 : mpOnlineView->setItemDimensions(TEMPLATE_ITEM_MAX_WIDTH,TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
164 : TEMPLATE_ITEM_MAX_HEIGHT-TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
165 0 : TEMPLATE_ITEM_PADDING);
166 :
167 0 : mpOnlineView->setOverlayItemStateHdl(LINK(this,SfxTemplateManagerDlg,TVTemplateStateHdl));
168 0 : mpOnlineView->setOverlayDblClickHdl(LINK(this,SfxTemplateManagerDlg,OpenTemplateHdl));
169 0 : mpOnlineView->setOverlayCloseHdl(LINK(this,SfxTemplateManagerDlg,CloseOverlayHdl));
170 :
171 0 : mpSearchView->setItemMaxTextLength(TEMPLATE_ITEM_MAX_TEXT_LENGTH);
172 :
173 : mpSearchView->setItemDimensions(TEMPLATE_ITEM_MAX_WIDTH,TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
174 : TEMPLATE_ITEM_MAX_HEIGHT-TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
175 0 : TEMPLATE_ITEM_PADDING);
176 :
177 0 : mpSearchView->setItemStateHdl(LINK(this,SfxTemplateManagerDlg,TVTemplateStateHdl));
178 :
179 0 : maTabControl.SetActivatePageHdl(LINK(this,SfxTemplateManagerDlg,ActivatePageHdl));
180 :
181 0 : mpViewBar->Show();
182 0 : mpActionBar->Show();
183 :
184 0 : switchMainView(true);
185 :
186 0 : loadRepositories();
187 :
188 0 : createRepositoryMenu();
189 0 : createDefaultTemplateMenu();
190 :
191 0 : maView->Populate();
192 0 : maView->Show();
193 :
194 0 : FreeResource();
195 0 : }
196 :
197 0 : SfxTemplateManagerDlg::~SfxTemplateManagerDlg ()
198 : {
199 : // Synchronize the config before deleting it
200 0 : syncRepositories();
201 0 : for (size_t i = 0, n = maRepositories.size(); i < n; ++i)
202 0 : delete maRepositories[i];
203 :
204 0 : delete mpSearchEdit;
205 0 : delete mpViewBar;
206 0 : delete mpActionBar;
207 0 : delete mpTemplateBar;
208 0 : delete mpSearchView;
209 0 : delete maView;
210 0 : delete mpOnlineView;
211 0 : delete mpActionMenu;
212 0 : delete mpRepositoryMenu;
213 0 : delete mpTemplateDefaultMenu;
214 0 : delete mpToolbars;
215 0 : }
216 :
217 0 : void SfxTemplateManagerDlg::setSaveMode(bool bMode)
218 : {
219 0 : mbIsSaveMode = bMode;
220 :
221 0 : if (bMode)
222 : {
223 0 : mpViewBar->ShowItem(TBI_TEMPLATE_SAVE);
224 0 : mpViewBar->HideItem(TBI_TEMPLATE_IMPORT);
225 0 : mpViewBar->HideItem(TBI_TEMPLATE_REPOSITORY);
226 : }
227 : else
228 : {
229 0 : mpViewBar->HideItem(TBI_TEMPLATE_SAVE);
230 0 : mpViewBar->ShowItem(TBI_TEMPLATE_IMPORT);
231 0 : mpViewBar->ShowItem(TBI_TEMPLATE_REPOSITORY);
232 : }
233 0 : }
234 :
235 0 : void SfxTemplateManagerDlg::setDocumentModel(const uno::Reference<frame::XModel> &rModel)
236 : {
237 0 : m_xModel = rModel;
238 0 : }
239 :
240 0 : IMPL_LINK_NOARG(SfxTemplateManagerDlg,ActivatePageHdl)
241 : {
242 0 : FILTER_APPLICATION eFilter = FILTER_APP_NONE;
243 0 : switch (maTabControl.GetCurPageId())
244 : {
245 : case FILTER_DOCS:
246 0 : eFilter = FILTER_APP_WRITER;
247 0 : break;
248 : case FILTER_PRESENTATIONS:
249 0 : eFilter = FILTER_APP_IMPRESS;
250 0 : break;
251 : case FILTER_SHEETS:
252 0 : eFilter = FILTER_APP_CALC;
253 0 : break;
254 : case FILTER_DRAWS:
255 0 : eFilter = FILTER_APP_DRAW;
256 0 : break;
257 : default:
258 : case FILTER_ALL:
259 : ;
260 : }
261 0 : mpCurView->filterTemplatesByApp(eFilter);
262 0 : return 0;
263 : }
264 :
265 0 : void SfxTemplateManagerDlg::MouseButtonDown( const MouseEvent& rMEvt )
266 : {
267 0 : if (!maView->GetActiveClipRegion().IsInside(rMEvt.GetPosPixel()) && maView->isOverlayVisible())
268 : {
269 0 : maSelTemplates.clear();
270 0 : mpTemplateBar->Hide();
271 0 : mpViewBar->Show();
272 :
273 0 : maView->showOverlay(false);
274 : }
275 0 : }
276 :
277 0 : void SfxTemplateManagerDlg::Resize()
278 : {
279 0 : Size aWinSize = GetSizePixel();
280 :
281 : // Fit the tab page control and the toolbars
282 0 : Size aTabSize = maTabControl.GetSizePixel();
283 0 : aTabSize.setWidth(aWinSize.getWidth());
284 0 : maTabControl.SetSizePixel(aTabSize);
285 0 : Size aTabPageSize = maTabControl.GetTabPageSizePixel();
286 0 : Point aToolbarsPos(0, aTabSize.getHeight() - aTabPageSize.getHeight());
287 0 : mpToolbars->SetPosPixel(aToolbarsPos);
288 0 : aTabPageSize.setHeight(mpToolbars->GetSizePixel().getHeight() + 3);
289 0 : maTabControl.SetTabPageSizePixel(aTabPageSize);
290 :
291 0 : Size aToolbarsSize = mpToolbars->GetSizePixel();
292 0 : aToolbarsSize.setWidth(aWinSize.getWidth());
293 0 : mpToolbars->SetSizePixel(aToolbarsSize);
294 :
295 : // Calculate toolboxes size and positions
296 0 : Size aViewSize = mpViewBar->CalcMinimumWindowSizePixel();
297 0 : Size aActionSize = mpActionBar->CalcMinimumWindowSizePixel();
298 0 : Size aTemplateSize = mpTemplateBar->CalcMinimumWindowSizePixel();
299 :
300 0 : aActionSize.setWidth(3*aActionSize.getWidth());
301 0 : aViewSize.setWidth(aWinSize.getWidth()-aActionSize.getWidth()-mpViewBar->GetPosPixel().X());
302 0 : aTemplateSize.setWidth(aWinSize.getWidth());
303 :
304 0 : Point aActionPos = mpActionBar->GetPosPixel();
305 0 : aActionPos.setX(aWinSize.getWidth() - aActionSize.getWidth());
306 :
307 0 : mpViewBar->SetSizePixel(aViewSize);
308 0 : mpActionBar->SetPosSizePixel(aActionPos,aActionSize);
309 0 : mpTemplateBar->SetSizePixel(aTemplateSize);
310 :
311 : // Set view position below toolbox
312 0 : Point aViewPos = maView->GetPosPixel();
313 0 : aViewPos.setY(maTabControl.GetPosPixel().Y() + maTabControl.GetSizePixel().getHeight());
314 0 : aViewPos.setX(0);
315 0 : Size aThumbSize(aWinSize.getWidth(), aWinSize.getHeight() - aViewPos.getY());
316 0 : maView->SetPosSizePixel(aViewPos, aThumbSize);
317 :
318 0 : if (aWinSize.getHeight() < aViewPos.getY() + aThumbSize.getHeight() + PADDING_DLG_BORDER)
319 0 : aWinSize.setHeight(aViewPos.getY() + aThumbSize.getHeight() + PADDING_DLG_BORDER);
320 :
321 : // Set search box position and size
322 0 : Size aSearchSize = mpSearchEdit->CalcMinimumSize();
323 0 : aSearchSize.setWidth(aWinSize.getWidth() - 2*PADDING_DLG_BORDER);
324 :
325 0 : mpSearchEdit->SetSizePixel(aSearchSize);
326 0 : mpSearchEdit->SetPosPixel(Point(PADDING_DLG_BORDER,aViewPos.Y()));
327 :
328 0 : maView->SetSizePixel(aThumbSize);
329 0 : mpOnlineView->SetPosSizePixel(aViewPos,aThumbSize);
330 0 : mpSearchView->SetSizePixel(aThumbSize);
331 :
332 0 : mpCurView->Resize();
333 :
334 0 : ModelessDialog::Resize();
335 0 : }
336 :
337 0 : IMPL_LINK_NOARG(SfxTemplateManagerDlg, CloseOverlayHdl)
338 : {
339 0 : maSelTemplates.clear();
340 0 : mpTemplateBar->Hide();
341 0 : mpViewBar->Show();
342 0 : mpActionBar->Show();
343 :
344 0 : if (mpCurView == maView)
345 0 : mpCurView->showOverlay(false);
346 : else
347 0 : switchMainView(true);
348 :
349 0 : return 0;
350 : }
351 :
352 0 : IMPL_LINK_NOARG(SfxTemplateManagerDlg,TBXViewHdl)
353 : {
354 0 : switch(mpViewBar->GetCurItemId())
355 : {
356 : case TBI_TEMPLATE_IMPORT:
357 0 : OnTemplateImport();
358 0 : break;
359 : case TBI_TEMPLATE_FOLDER_DEL:
360 0 : if (mpCurView == maView)
361 0 : OnFolderDelete();
362 : else
363 0 : OnRepositoryDelete();
364 0 : break;
365 : case TBI_TEMPLATE_SAVE:
366 0 : OnTemplateSaveAs();
367 0 : break;
368 : default:
369 0 : break;
370 : }
371 :
372 0 : return 0;
373 : }
374 :
375 0 : IMPL_LINK_NOARG(SfxTemplateManagerDlg,TBXActionHdl)
376 : {
377 0 : switch(mpActionBar->GetCurItemId())
378 : {
379 : case TBI_TEMPLATE_SEARCH:
380 0 : OnTemplateSearch();
381 0 : break;
382 : default:
383 0 : break;
384 : }
385 :
386 0 : return 0;
387 : }
388 :
389 0 : IMPL_LINK_NOARG(SfxTemplateManagerDlg,TBXTemplateHdl)
390 : {
391 0 : switch(mpTemplateBar->GetCurItemId())
392 : {
393 : case TBI_TEMPLATE_EDIT:
394 0 : OnTemplateEdit();
395 0 : break;
396 : case TBI_TEMPLATE_PROPERTIES:
397 0 : OnTemplateProperties();
398 0 : break;
399 : case TBI_TEMPLATE_DELETE:
400 0 : OnTemplateDelete();
401 0 : break;
402 : case TBI_TEMPLATE_DEFAULT:
403 0 : OnTemplateAsDefault();
404 0 : break;
405 : case TBI_TEMPLATE_EXPORT:
406 0 : OnTemplateExport();
407 0 : break;
408 : default:
409 0 : break;
410 : }
411 :
412 0 : return 0;
413 : }
414 :
415 0 : IMPL_LINK(SfxTemplateManagerDlg, TBXDropdownHdl, ToolBox*, pBox)
416 : {
417 0 : const sal_uInt16 nCurItemId = pBox->GetCurItemId();
418 :
419 0 : switch(nCurItemId)
420 : {
421 : case TBI_TEMPLATE_ACTION:
422 0 : pBox->SetItemDown( nCurItemId, true );
423 :
424 : mpActionMenu->Execute(pBox,pBox->GetItemRect(TBI_TEMPLATE_ACTION),
425 0 : POPUPMENU_EXECUTE_DOWN);
426 :
427 0 : pBox->SetItemDown( nCurItemId, false );
428 0 : pBox->EndSelection();
429 0 : pBox->Invalidate();
430 0 : break;
431 : case TBI_TEMPLATE_MOVE:
432 : {
433 0 : pBox->SetItemDown( nCurItemId, true );
434 :
435 0 : std::vector<OUString> aNames = maView->getFolderNames();
436 :
437 0 : PopupMenu *pMoveMenu = new PopupMenu;
438 0 : pMoveMenu->SetSelectHdl(LINK(this,SfxTemplateManagerDlg,MoveMenuSelectHdl));
439 :
440 0 : if (!aNames.empty())
441 : {
442 0 : for (size_t i = 0, n = aNames.size(); i < n; ++i)
443 0 : pMoveMenu->InsertItem(MNI_MOVE_FOLDER_BASE+i,aNames[i]);
444 : }
445 :
446 0 : pMoveMenu->InsertSeparator();
447 :
448 0 : pMoveMenu->InsertItem(MNI_MOVE_NEW,SfxResId(STR_MOVE_NEW).toString());
449 :
450 : pMoveMenu->Execute(pBox,pBox->GetItemRect(TBI_TEMPLATE_MOVE),
451 0 : POPUPMENU_EXECUTE_DOWN);
452 :
453 0 : delete pMoveMenu;
454 :
455 0 : pBox->SetItemDown( nCurItemId, false );
456 0 : pBox->EndSelection();
457 0 : pBox->Invalidate();
458 0 : break;
459 : }
460 : case TBI_TEMPLATE_REPOSITORY:
461 0 : pBox->SetItemDown( nCurItemId, true );
462 :
463 : mpRepositoryMenu->Execute(pBox,pBox->GetItemRect(TBI_TEMPLATE_REPOSITORY),
464 0 : POPUPMENU_EXECUTE_DOWN);
465 :
466 0 : pBox->SetItemDown( nCurItemId, false );
467 0 : pBox->EndSelection();
468 0 : pBox->Invalidate();
469 0 : break;
470 : default:
471 0 : break;
472 : }
473 :
474 0 : return 0;
475 : }
476 :
477 0 : IMPL_LINK(SfxTemplateManagerDlg, TVFolderStateHdl, const ThumbnailViewItem*, pItem)
478 : {
479 0 : if (pItem->isSelected())
480 : {
481 0 : if (maSelFolders.empty() && !mbIsSaveMode)
482 : {
483 0 : mpViewBar->ShowItem(TBI_TEMPLATE_IMPORT);
484 0 : mpViewBar->ShowItem(TBI_TEMPLATE_FOLDER_DEL);
485 : }
486 :
487 0 : maSelFolders.insert(pItem);
488 : }
489 : else
490 : {
491 0 : maSelFolders.erase(pItem);
492 :
493 0 : if (maSelFolders.empty() && !mbIsSaveMode)
494 : {
495 0 : mpViewBar->HideItem(TBI_TEMPLATE_IMPORT);
496 0 : mpViewBar->HideItem(TBI_TEMPLATE_FOLDER_DEL);
497 : }
498 : }
499 :
500 0 : return 0;
501 : }
502 :
503 0 : IMPL_LINK(SfxTemplateManagerDlg, TVTemplateStateHdl, const ThumbnailViewItem*, pItem)
504 : {
505 0 : if (pItem->isSelected())
506 : {
507 0 : if (!mbIsSaveMode)
508 : {
509 0 : if (maSelTemplates.empty())
510 : {
511 0 : mpViewBar->Show(false);
512 0 : mpActionBar->Show(false);
513 0 : mpTemplateBar->Show();
514 : }
515 : else
516 : {
517 0 : mpTemplateBar->HideItem(TBI_TEMPLATE_EDIT);
518 0 : mpTemplateBar->HideItem(TBI_TEMPLATE_PROPERTIES);
519 0 : mpTemplateBar->HideItem(TBI_TEMPLATE_DEFAULT);
520 : }
521 : }
522 :
523 0 : maSelTemplates.insert(pItem);
524 : }
525 : else
526 : {
527 0 : if (maSelTemplates.find(pItem) != maSelTemplates.end())
528 : {
529 0 : maSelTemplates.erase(pItem);
530 :
531 0 : if (!mbIsSaveMode)
532 : {
533 0 : if (maSelTemplates.empty())
534 : {
535 0 : mpTemplateBar->Show(false);
536 0 : mpViewBar->Show();
537 0 : mpActionBar->Show();
538 : }
539 0 : else if (maSelTemplates.size() == 1)
540 : {
541 0 : mpTemplateBar->ShowItem(TBI_TEMPLATE_EDIT);
542 0 : mpTemplateBar->ShowItem(TBI_TEMPLATE_PROPERTIES);
543 0 : mpTemplateBar->ShowItem(TBI_TEMPLATE_DEFAULT);
544 : }
545 : }
546 : }
547 : }
548 :
549 0 : return 0;
550 : }
551 :
552 0 : IMPL_LINK(SfxTemplateManagerDlg, MenuSelectHdl, Menu*, pMenu)
553 : {
554 0 : sal_uInt16 nMenuId = pMenu->GetCurItemId();
555 :
556 0 : switch(nMenuId)
557 : {
558 : case MNI_ACTION_SORT_NAME:
559 0 : if (maView->isOverlayVisible())
560 0 : maView->sortOverlayItems(SortView_Name());
561 : else
562 0 : maView->sortItems(SortView_Name());
563 0 : break;
564 : case MNI_ACTION_REFRESH:
565 0 : mpCurView->reload();
566 0 : break;
567 : default:
568 0 : break;
569 : }
570 :
571 0 : return 0;
572 : }
573 :
574 0 : IMPL_LINK(SfxTemplateManagerDlg, MoveMenuSelectHdl, Menu*, pMenu)
575 : {
576 0 : sal_uInt16 nMenuId = pMenu->GetCurItemId();
577 :
578 0 : if (mpSearchView->IsVisible())
579 : {
580 : // Check if we are searching the local or remote templates
581 0 : if (mpCurView == maView)
582 0 : localSearchMoveTo(nMenuId);
583 : }
584 : else
585 : {
586 : // Check if we are displaying the local or remote templates
587 0 : if (mpCurView == maView)
588 0 : localMoveTo(nMenuId);
589 : else
590 0 : remoteMoveTo(nMenuId);
591 : }
592 :
593 0 : return 0;
594 : }
595 :
596 0 : IMPL_LINK(SfxTemplateManagerDlg, RepositoryMenuSelectHdl, Menu*, pMenu)
597 : {
598 0 : sal_uInt16 nMenuId = pMenu->GetCurItemId();
599 :
600 0 : if (nMenuId == MNI_REPOSITORY_LOCAL)
601 : {
602 0 : switchMainView(true);
603 : }
604 0 : else if (nMenuId == MNI_REPOSITORY_NEW)
605 : {
606 0 : PlaceEditDialog dlg(this);
607 :
608 0 : if (dlg.Execute())
609 : {
610 0 : boost::shared_ptr<Place> pPlace = dlg.GetPlace();
611 :
612 0 : if (insertRepository(pPlace->GetName(),pPlace->GetUrl()))
613 : {
614 : // update repository list menu.
615 0 : createRepositoryMenu();
616 : }
617 : else
618 : {
619 0 : OUString aMsg(SfxResId(STR_MSG_ERROR_REPOSITORY_NAME).toString());
620 0 : aMsg = aMsg.replaceFirst("$1",pPlace->GetName());
621 0 : ErrorBox(this,WB_OK,aMsg).Execute();
622 0 : }
623 0 : }
624 : }
625 : else
626 : {
627 0 : sal_uInt16 nRepoId = nMenuId - MNI_REPOSITORY_BASE;
628 :
629 0 : TemplateRepository *pRepository = NULL;
630 :
631 0 : for (size_t i = 0, n = maRepositories.size(); i < n; ++i)
632 : {
633 0 : if (maRepositories[i]->mnId == nRepoId)
634 : {
635 0 : pRepository = maRepositories[i];
636 0 : break;
637 : }
638 : }
639 :
640 0 : if (mpOnlineView->loadRepository(pRepository,false))
641 : {
642 0 : switchMainView(false);
643 0 : mpOnlineView->showOverlay(true);
644 : }
645 : }
646 :
647 0 : return 0;
648 : }
649 :
650 0 : IMPL_LINK(SfxTemplateManagerDlg, DefaultTemplateMenuSelectHdl, Menu*, pMenu)
651 : {
652 0 : sal_uInt16 nId = pMenu->GetCurItemId();
653 :
654 0 : OUString aServiceName = SfxObjectShell::GetServiceNameFromFactory( mpTemplateDefaultMenu->GetItemCommand(nId));
655 0 : SfxObjectFactory::SetStandardTemplate( aServiceName, OUString() );
656 :
657 0 : createDefaultTemplateMenu();
658 :
659 0 : return 0;
660 : }
661 :
662 0 : IMPL_LINK(SfxTemplateManagerDlg, OpenTemplateHdl, ThumbnailViewItem*, pItem)
663 : {
664 0 : if (!mbIsSaveMode)
665 : {
666 0 : uno::Sequence< PropertyValue > aArgs(1);
667 0 : aArgs[0].Name = "AsTemplate";
668 0 : aArgs[0].Value <<= sal_True;
669 :
670 0 : TemplateViewItem *pTemplateItem = static_cast<TemplateViewItem*>(pItem);
671 :
672 : try
673 : {
674 0 : mxDesktop->loadComponentFromURL(pTemplateItem->getPath(),"_default", 0, aArgs );
675 : }
676 0 : catch( const uno::Exception& )
677 : {
678 : }
679 :
680 0 : Close();
681 : }
682 :
683 0 : return 0;
684 : }
685 :
686 0 : IMPL_LINK_NOARG(SfxTemplateManagerDlg, SearchUpdateHdl)
687 : {
688 : // if the search view is hidden, hide the folder view and display search one
689 0 : if (!mpCurView->isOverlayVisible() && !mpSearchView->IsVisible())
690 : {
691 0 : mpSearchView->Clear();
692 0 : mpSearchView->Show();
693 0 : mpCurView->Hide();
694 : }
695 :
696 0 : OUString aKeyword = mpSearchEdit->GetText();
697 :
698 0 : if (!aKeyword.isEmpty())
699 : {
700 0 : if (mpCurView->isOverlayVisible())
701 : {
702 0 : mpCurView->filterTemplatesByKeyword(aKeyword);
703 : }
704 : else
705 : {
706 0 : mpSearchView->Clear();
707 :
708 : std::vector<TemplateItemProperties> aItems =
709 0 : maView->getFilteredItems(SearchView_Keyword(aKeyword));
710 :
711 0 : size_t nCounter = 0;
712 0 : for (size_t i = 0; i < aItems.size(); ++i)
713 : {
714 0 : TemplateItemProperties *pItem = &aItems[i];
715 :
716 : mpSearchView->AppendItem(++nCounter,pItem->nRegionId,
717 : pItem->nId-1,
718 : pItem->aName,
719 : maView->GetItemText(pItem->nRegionId+1),
720 : pItem->aPath,
721 0 : pItem->aThumbnail);
722 : }
723 :
724 0 : mpSearchView->Invalidate();
725 : }
726 : }
727 : else
728 : {
729 0 : if (mpCurView->isOverlayVisible())
730 : {
731 0 : mpCurView->filterTemplatesByApp(FILTER_APP_NONE);
732 : }
733 : else
734 : {
735 0 : mpSearchView->Hide();
736 0 : mpCurView->Show();
737 : }
738 : }
739 :
740 0 : return 0;
741 : }
742 :
743 0 : void SfxTemplateManagerDlg::OnTemplateImport ()
744 : {
745 : sal_Int16 nDialogType =
746 0 : com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE;
747 :
748 0 : sfx2::FileDialogHelper aFileDlg(nDialogType, SFXWB_MULTISELECTION);
749 :
750 : // add "All" filter
751 : aFileDlg.AddFilter( String(SfxResId( STR_SFX_FILTERNAME_ALL) ),
752 0 : DEFINE_CONST_UNICODE(FILEDIALOG_FILTER_ALL) );
753 :
754 : // add template filter
755 0 : OUString sFilterExt;
756 0 : OUString sFilterName( SfxResId( STR_TEMPLATE_FILTER ).toString() );
757 :
758 : // add filters of modules which are installed
759 0 : SvtModuleOptions aModuleOpt;
760 0 : if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SWRITER ) )
761 0 : sFilterExt += "*.ott;*.stw;*.oth";
762 :
763 0 : if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SCALC ) )
764 : {
765 0 : if ( !sFilterExt.isEmpty() )
766 0 : sFilterExt += ";";
767 :
768 0 : sFilterExt += "*.ots;*.stc";
769 : }
770 :
771 0 : if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SIMPRESS ) )
772 : {
773 0 : if ( !sFilterExt.isEmpty() )
774 0 : sFilterExt += ";";
775 :
776 0 : sFilterExt += "*.otp;*.sti";
777 : }
778 :
779 0 : if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SDRAW ) )
780 : {
781 0 : if ( !sFilterExt.isEmpty() )
782 0 : sFilterExt += ";";
783 :
784 0 : sFilterExt += "*.otg;*.std";
785 : }
786 :
787 0 : if ( !sFilterExt.isEmpty() )
788 0 : sFilterExt += ";";
789 :
790 0 : sFilterExt += "*.vor";
791 :
792 0 : sFilterName += " (";
793 0 : sFilterName += sFilterExt;
794 0 : sFilterName += ")";
795 :
796 0 : aFileDlg.AddFilter( sFilterName, sFilterExt );
797 0 : aFileDlg.SetCurrentFilter( sFilterName );
798 :
799 0 : ErrCode nCode = aFileDlg.Execute();
800 :
801 0 : if ( nCode == ERRCODE_NONE )
802 : {
803 0 : com::sun::star::uno::Sequence<OUString> aFiles = aFileDlg.GetSelectedFiles();
804 :
805 0 : if (aFiles.hasElements())
806 : {
807 0 : std::set<const ThumbnailViewItem*>::const_iterator pIter;
808 0 : for (pIter = maSelFolders.begin(); pIter != maSelFolders.end(); ++pIter)
809 : {
810 0 : OUString aTemplateList;
811 0 : TemplateContainerItem *pFolder = (TemplateContainerItem*)(*pIter);
812 :
813 0 : for (size_t i = 0, n = aFiles.getLength(); i < n; ++i)
814 : {
815 0 : if(!maView->copyFrom(pFolder,aFiles[i]))
816 : {
817 0 : if (aTemplateList.isEmpty())
818 0 : aTemplateList = aFiles[i];
819 : else
820 0 : aTemplateList = aTemplateList + "\n" + aFiles[i];
821 : }
822 : }
823 :
824 0 : if (!aTemplateList.isEmpty())
825 : {
826 0 : OUString aMsg(SfxResId(STR_MSG_ERROR_IMPORT).toString());
827 0 : aMsg = aMsg.replaceFirst("$1",pFolder->maTitle);
828 0 : ErrorBox(this,WB_OK,aMsg.replaceFirst("$2",aTemplateList));
829 : }
830 0 : }
831 :
832 0 : maView->Invalidate(INVALIDATE_NOERASE);
833 0 : }
834 0 : }
835 0 : }
836 :
837 0 : void SfxTemplateManagerDlg::OnTemplateExport()
838 : {
839 0 : uno::Reference<XComponentContext> xContext(comphelper::getProcessComponentContext());
840 0 : uno::Reference<XFolderPicker2> xFolderPicker = FolderPicker::create(xContext);
841 :
842 0 : xFolderPicker->setDisplayDirectory(SvtPathOptions().GetWorkPath());
843 :
844 0 : sal_Int16 nResult = xFolderPicker->execute();
845 :
846 0 : if( nResult == ExecutableDialogResults::OK )
847 : {
848 0 : OUString aTemplateList;
849 0 : INetURLObject aPathObj(xFolderPicker->getDirectory());
850 0 : aPathObj.setFinalSlash();
851 :
852 0 : if (mpSearchView->IsVisible())
853 : {
854 0 : sal_uInt16 i = 1;
855 :
856 0 : std::set<const ThumbnailViewItem*>::const_iterator pIter = maSelTemplates.begin();
857 0 : for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end(); ++pIter, ++i)
858 : {
859 0 : const TemplateSearchViewItem *pItem = static_cast<const TemplateSearchViewItem*>(*pIter);
860 :
861 0 : INetURLObject aItemPath(pItem->getPath());
862 :
863 0 : if ( 1 == i )
864 0 : aPathObj.Append(aItemPath.getName());
865 : else
866 0 : aPathObj.setName(aItemPath.getName());
867 :
868 0 : OUString aPath = aPathObj.GetMainURL( INetURLObject::NO_DECODE );
869 :
870 0 : if (!maView->exportTo(pItem->mnIdx+1,pItem->mnRegionId+1,aPath))
871 : {
872 0 : if (aTemplateList.isEmpty())
873 0 : aTemplateList = pItem->maTitle;
874 : else
875 0 : aTemplateList = aTemplateList + "\n" + pItem->maTitle;
876 : }
877 0 : }
878 :
879 0 : mpSearchView->deselectItems();
880 : }
881 : else
882 : {
883 : // export templates from the current open overlay
884 :
885 0 : sal_uInt16 i = 1;
886 0 : sal_uInt16 nRegionItemId = maView->getOverlayRegionId() + 1;
887 :
888 0 : std::set<const ThumbnailViewItem*>::const_iterator pIter = maSelTemplates.begin();
889 0 : for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end(); ++pIter, ++i)
890 : {
891 0 : const TemplateViewItem *pItem = static_cast<const TemplateViewItem*>(*pIter);
892 :
893 0 : INetURLObject aItemPath(pItem->getPath());
894 :
895 0 : if ( 1 == i )
896 0 : aPathObj.Append(aItemPath.getName());
897 : else
898 0 : aPathObj.setName(aItemPath.getName());
899 :
900 0 : OUString aPath = aPathObj.GetMainURL( INetURLObject::NO_DECODE );
901 :
902 0 : if (!maView->exportTo(pItem->mnId,nRegionItemId,aPath))
903 : {
904 0 : if (aTemplateList.isEmpty())
905 0 : aTemplateList = pItem->maTitle;
906 : else
907 0 : aTemplateList = aTemplateList + "\n" + pItem->maTitle;
908 : }
909 0 : }
910 :
911 0 : maView->deselectOverlayItems();
912 : }
913 :
914 0 : if (!aTemplateList.isEmpty())
915 : {
916 0 : OUString aText( SfxResId(STR_MSG_ERROR_EXPORT).toString() );
917 0 : ErrorBox(this, WB_OK,aText.replaceFirst("$1",aTemplateList)).Execute();
918 0 : }
919 0 : }
920 0 : }
921 :
922 0 : void SfxTemplateManagerDlg::OnTemplateSearch ()
923 : {
924 0 : Point aPos = maView->GetPosPixel();
925 0 : bool bVisible = mpSearchEdit->IsVisible();
926 0 : Size aWinSize = GetSizePixel();
927 0 : long nEditHeight = mpSearchEdit->GetSizePixel().getHeight();
928 :
929 0 : if (bVisible)
930 : {
931 0 : aWinSize.setHeight(aWinSize.getHeight() - nEditHeight );
932 0 : aPos.setY(aPos.getY() - nEditHeight );
933 0 : mpActionBar->SetItemState(TBI_TEMPLATE_SEARCH,STATE_NOCHECK);
934 : }
935 : else
936 : {
937 0 : aWinSize.setHeight(aWinSize.getHeight() + nEditHeight );
938 0 : aPos.setY(aPos.getY() + nEditHeight );
939 0 : mpActionBar->SetItemState(TBI_TEMPLATE_SEARCH,STATE_CHECK);
940 : }
941 :
942 : // SetSizePixel(aWinSize);
943 0 : maView->SetPosPixel(aPos);
944 0 : mpOnlineView->SetPosPixel(aPos);
945 0 : mpSearchView->SetPosPixel(aPos);
946 :
947 : // Hide search view
948 0 : if (bVisible)
949 : {
950 0 : mpSearchView->Hide();
951 0 : mpCurView->Show();
952 : }
953 :
954 0 : mpSearchEdit->Show(!bVisible);
955 0 : mpSearchEdit->SetText(OUString());
956 :
957 : // display all templates if we hide the search bar
958 0 : if (bVisible && mpCurView->isOverlayVisible())
959 0 : mpCurView->filterTemplatesByApp(FILTER_APP_NONE);
960 0 : }
961 :
962 0 : void SfxTemplateManagerDlg::OnTemplateEdit ()
963 : {
964 0 : uno::Sequence< PropertyValue > aArgs(1);
965 0 : aArgs[0].Name = "AsTemplate";
966 0 : aArgs[0].Value <<= sal_False;
967 :
968 0 : uno::Reference< XStorable > xStorable;
969 0 : std::set<const ThumbnailViewItem*>::const_iterator pIter;
970 0 : for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end(); ++pIter)
971 : {
972 0 : const TemplateViewItem *pItem = static_cast<const TemplateViewItem*>(*pIter);
973 :
974 : try
975 : {
976 : xStorable = uno::Reference< XStorable >(
977 0 : mxDesktop->loadComponentFromURL(pItem->getPath(),"_default", 0, aArgs ),
978 0 : uno::UNO_QUERY );
979 : }
980 0 : catch( const uno::Exception& )
981 : {
982 : }
983 : }
984 :
985 0 : Close();
986 0 : }
987 :
988 0 : void SfxTemplateManagerDlg::OnTemplateProperties ()
989 : {
990 0 : const TemplateViewItem *pItem = static_cast<const TemplateViewItem*>(*maSelTemplates.begin());
991 :
992 0 : SfxTemplateInfoDlg aDlg;
993 0 : aDlg.loadDocument(pItem->getPath());
994 0 : aDlg.Execute();
995 0 : }
996 :
997 0 : void SfxTemplateManagerDlg::OnTemplateDelete ()
998 : {
999 0 : OUString aTemplateList;
1000 :
1001 0 : if (mpSearchView->IsVisible())
1002 : {
1003 0 : std::set<const ThumbnailViewItem*>::const_iterator pIter;
1004 0 : for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end();)
1005 : {
1006 : const TemplateSearchViewItem *pItem =
1007 0 : static_cast<const TemplateSearchViewItem*>(*pIter);
1008 :
1009 0 : sal_uInt16 nItemId = pItem->mnIdx + 1;
1010 0 : sal_uInt16 nItemRegionId = pItem->mnRegionId + 1;
1011 :
1012 0 : if (maView->removeTemplate(nItemId,nItemRegionId))
1013 0 : maSelTemplates.erase(pIter++);
1014 : else
1015 : {
1016 0 : if (aTemplateList.isEmpty())
1017 0 : aTemplateList = pItem->maTitle;
1018 : else
1019 0 : aTemplateList = aTemplateList + "\n" + pItem->maTitle;
1020 :
1021 0 : ++pIter;
1022 : }
1023 : }
1024 :
1025 : // Update search results
1026 0 : if (maSelTemplates.empty())
1027 : {
1028 0 : mpTemplateBar->Show(false);
1029 0 : mpViewBar->Show();
1030 0 : mpActionBar->Show();
1031 : }
1032 :
1033 0 : SearchUpdateHdl(mpSearchEdit);
1034 : }
1035 : else
1036 : {
1037 0 : std::set<const ThumbnailViewItem*>::const_iterator pIter;
1038 0 : for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end();)
1039 : {
1040 0 : if (maView->removeTemplate((*pIter)->mnId,maView->getOverlayRegionId()+1))
1041 0 : maSelTemplates.erase(pIter++);
1042 : else
1043 : {
1044 0 : if (aTemplateList.isEmpty())
1045 0 : aTemplateList = (*pIter)->maTitle;
1046 : else
1047 0 : aTemplateList = aTemplateList + "\n" + (*pIter)->maTitle;
1048 :
1049 0 : ++pIter;
1050 : }
1051 : }
1052 :
1053 0 : if (maSelTemplates.empty())
1054 : {
1055 0 : mpTemplateBar->SetItemDown(TBI_TEMPLATE_DELETE,false);
1056 0 : mpTemplateBar->Show(false);
1057 0 : mpViewBar->Show();
1058 0 : mpActionBar->Show();
1059 : }
1060 : }
1061 :
1062 0 : if (!aTemplateList.isEmpty())
1063 : {
1064 0 : OUString aMsg( SfxResId(STR_MSG_ERROR_DELETE_TEMPLATE).toString() );
1065 0 : ErrorBox(this, WB_OK,aMsg.replaceFirst("$1",aTemplateList)).Execute();
1066 0 : }
1067 0 : }
1068 :
1069 0 : void SfxTemplateManagerDlg::OnTemplateAsDefault ()
1070 : {
1071 : assert(!maSelTemplates.empty());
1072 :
1073 0 : const TemplateViewItem *pItem = static_cast<const TemplateViewItem*>(*(maSelTemplates.begin()));
1074 :
1075 0 : OUString aServiceName;
1076 0 : if (lcl_getServiceName(pItem->getPath(),aServiceName))
1077 : {
1078 0 : SfxObjectFactory::SetStandardTemplate(aServiceName,pItem->getPath());
1079 :
1080 0 : createDefaultTemplateMenu();
1081 :
1082 : // clear selection and display view/action toolbars
1083 0 : maView->deselectOverlayItem(pItem->mnId);
1084 0 : }
1085 0 : }
1086 :
1087 0 : void SfxTemplateManagerDlg::OnFolderDelete()
1088 : {
1089 0 : QueryBox aQueryDlg(this, WB_YES_NO | WB_DEF_YES, SfxResId(STR_QMSG_SEL_FOLDER_DELETE).toString());
1090 :
1091 0 : if ( aQueryDlg.Execute() == RET_NO )
1092 0 : return;
1093 :
1094 0 : OUString aFolderList;
1095 :
1096 0 : std::set<const ThumbnailViewItem*>::const_iterator pIter;
1097 0 : for (pIter = maSelFolders.begin(); pIter != maSelFolders.end();)
1098 : {
1099 0 : if (maView->removeRegion((*pIter)->mnId))
1100 0 : maSelFolders.erase(pIter++);
1101 : else
1102 : {
1103 0 : if (aFolderList.isEmpty())
1104 0 : aFolderList = (*pIter)->maTitle;
1105 : else
1106 0 : aFolderList = aFolderList + "\n" + (*pIter)->maTitle;
1107 :
1108 0 : ++pIter;
1109 : }
1110 : }
1111 :
1112 0 : if (maSelFolders.empty())
1113 : {
1114 0 : mpViewBar->HideItem(TBI_TEMPLATE_IMPORT);
1115 0 : mpViewBar->HideItem(TBI_TEMPLATE_FOLDER_DEL);
1116 : }
1117 :
1118 0 : if (!aFolderList.isEmpty())
1119 : {
1120 0 : OUString aMsg( SfxResId(STR_MSG_ERROR_DELETE_FOLDER).toString() );
1121 0 : ErrorBox(this, WB_OK,aMsg.replaceFirst("$1",aFolderList)).Execute();
1122 0 : }
1123 : }
1124 :
1125 0 : void SfxTemplateManagerDlg::OnRepositoryDelete()
1126 : {
1127 0 : if(deleteRepository(mpOnlineView->getOverlayRegionId()))
1128 : {
1129 : // close overlay and switch to local view
1130 0 : switchMainView(true);
1131 :
1132 0 : createRepositoryMenu();
1133 : }
1134 0 : }
1135 :
1136 0 : void SfxTemplateManagerDlg::OnTemplateSaveAs()
1137 : {
1138 : assert(m_xModel.is());
1139 :
1140 0 : if (!maView->isOverlayVisible() && maSelFolders.empty())
1141 : {
1142 0 : ErrorBox(this, WB_OK,SfxResId(STR_MSG_ERROR_SELECT_FOLDER).toString()).Execute();
1143 : return;
1144 : }
1145 :
1146 0 : InputDialog aDlg(SfxResId(STR_INPUT_TEMPLATE_NEW).toString(),this);
1147 :
1148 0 : if (aDlg.Execute())
1149 : {
1150 0 : OUString aName = aDlg.getEntryText();
1151 :
1152 0 : if (!aName.isEmpty())
1153 : {
1154 0 : OUString aFolderList;
1155 0 : OUString aQMsg(SfxResId(STR_QMSG_TEMPLATE_OVERWRITE).toString());
1156 0 : QueryBox aQueryDlg(this,WB_YES_NO | WB_DEF_YES, OUString());
1157 :
1158 0 : if (maView->isOverlayVisible())
1159 : {
1160 0 : sal_uInt16 nRegionItemId = maView->getOverlayRegionId()+1;
1161 :
1162 0 : if (!maView->isTemplateNameUnique(nRegionItemId,aName))
1163 : {
1164 0 : aQMsg = aQMsg.replaceFirst("$1",aName);
1165 0 : aQueryDlg.SetMessText(aQMsg.replaceFirst("$2",maView->getOverlayName()));
1166 :
1167 0 : if (aQueryDlg.Execute() == RET_NO)
1168 : return;
1169 : }
1170 :
1171 0 : if (!maView->saveTemplateAs(nRegionItemId,m_xModel,aName))
1172 0 : aFolderList = maView->getOverlayName();
1173 : }
1174 : else
1175 : {
1176 0 : std::set<const ThumbnailViewItem*>::const_iterator pIter;
1177 0 : for (pIter = maSelFolders.begin(); pIter != maSelFolders.end(); ++pIter)
1178 : {
1179 0 : TemplateContainerItem *pItem = (TemplateContainerItem*)(*pIter);
1180 :
1181 0 : if (!maView->isTemplateNameUnique(pItem->mnId,aName))
1182 : {
1183 0 : OUString aDQMsg = aQMsg.replaceFirst("$1",aName);
1184 0 : aQueryDlg.SetMessText(aDQMsg.replaceFirst("$2",pItem->maTitle));
1185 :
1186 0 : if (aQueryDlg.Execute() == RET_NO)
1187 0 : continue;
1188 : }
1189 :
1190 0 : if (!maView->saveTemplateAs(pItem,m_xModel,aName))
1191 : {
1192 0 : if (aFolderList.isEmpty())
1193 0 : aFolderList = (*pIter)->maTitle;
1194 : else
1195 0 : aFolderList = aFolderList + "\n" + (*pIter)->maTitle;
1196 : }
1197 : }
1198 : }
1199 :
1200 0 : maView->reload();
1201 :
1202 0 : if (!aFolderList.isEmpty())
1203 : {
1204 0 : }
1205 0 : }
1206 0 : }
1207 : }
1208 :
1209 0 : void SfxTemplateManagerDlg::createRepositoryMenu()
1210 : {
1211 0 : mpRepositoryMenu->Clear();
1212 :
1213 0 : mpRepositoryMenu->InsertItem(MNI_REPOSITORY_LOCAL,SfxResId(STR_REPOSITORY_LOCAL).toString());
1214 :
1215 0 : const std::vector<TemplateRepository*> &rRepos = getRepositories();
1216 :
1217 0 : for (size_t i = 0, n = rRepos.size(); i < n; ++i)
1218 0 : mpRepositoryMenu->InsertItem(MNI_REPOSITORY_BASE+rRepos[i]->mnId,rRepos[i]->maTitle);
1219 :
1220 0 : mpRepositoryMenu->InsertSeparator();
1221 0 : mpRepositoryMenu->InsertItem(MNI_REPOSITORY_NEW,SfxResId(STR_REPOSITORY_NEW).toString());
1222 0 : }
1223 :
1224 0 : void SfxTemplateManagerDlg::createDefaultTemplateMenu ()
1225 : {
1226 0 : std::vector<OUString> aList = lcl_getAllFactoryURLs();
1227 :
1228 0 : if (!aList.empty())
1229 : {
1230 0 : mpTemplateDefaultMenu->Clear();
1231 :
1232 0 : sal_uInt16 nItemId = MNI_ACTION_DEFAULT + 1;
1233 0 : for( std::vector<OUString>::const_iterator i = aList.begin(); i != aList.end(); ++i )
1234 : {
1235 0 : INetURLObject aObj(*i);
1236 0 : OUString aTitle = SvFileInformationManager::GetDescription(aObj);
1237 0 : mpTemplateDefaultMenu->InsertItem(nItemId, aTitle, SvFileInformationManager::GetImage(aObj, false));
1238 0 : mpTemplateDefaultMenu->SetItemCommand(nItemId++, *i);
1239 0 : }
1240 :
1241 0 : mpActionMenu->ShowItem(MNI_ACTION_DEFAULT);
1242 : }
1243 : else
1244 0 : mpActionMenu->HideItem(MNI_ACTION_DEFAULT);
1245 0 : }
1246 :
1247 0 : void SfxTemplateManagerDlg::switchMainView(bool bDisplayLocal)
1248 : {
1249 0 : if (bDisplayLocal)
1250 : {
1251 0 : mpCurView = maView;
1252 :
1253 0 : mpViewBar->HideItem(TBI_TEMPLATE_FOLDER_DEL);
1254 :
1255 : // Enable deleting and exporting items from the filesystem
1256 0 : mpTemplateBar->ShowItem(TBI_TEMPLATE_EXPORT);
1257 0 : mpTemplateBar->ShowItem(TBI_TEMPLATE_DELETE);
1258 :
1259 0 : mpOnlineView->Hide();
1260 0 : maView->Show();
1261 : }
1262 : else
1263 : {
1264 0 : mpCurView = mpOnlineView;
1265 :
1266 0 : mpViewBar->ShowItem(TBI_TEMPLATE_FOLDER_DEL);
1267 :
1268 : // Disable deleting and exporting items from remote repositories
1269 0 : mpTemplateBar->HideItem(TBI_TEMPLATE_EXPORT);
1270 0 : mpTemplateBar->HideItem(TBI_TEMPLATE_DELETE);
1271 :
1272 0 : maView->Hide();
1273 0 : mpOnlineView->Show();
1274 : }
1275 0 : }
1276 :
1277 0 : void SfxTemplateManagerDlg::localMoveTo(sal_uInt16 nMenuId)
1278 : {
1279 0 : sal_uInt16 nItemId = 0;
1280 :
1281 0 : if (nMenuId == MNI_MOVE_NEW)
1282 : {
1283 0 : InputDialog dlg(SfxResId(STR_INPUT_NEW).toString(),this);
1284 :
1285 0 : int ret = dlg.Execute();
1286 :
1287 0 : if (ret)
1288 : {
1289 0 : OUString aName = dlg.getEntryText();
1290 :
1291 0 : if (!aName.isEmpty())
1292 0 : nItemId = maView->createRegion(aName);
1293 0 : }
1294 : }
1295 : else
1296 : {
1297 0 : nItemId = maView->GetItemId(nMenuId-MNI_MOVE_FOLDER_BASE);
1298 : }
1299 :
1300 0 : if (nItemId)
1301 : {
1302 : // Move templates to desired folder if for some reason move fails
1303 : // try copying them.
1304 0 : if (!maView->moveTemplates(maSelTemplates,nItemId,false) &&
1305 0 : !maView->moveTemplates(maSelTemplates,nItemId,true))
1306 : {
1307 0 : OUString aTemplateList;
1308 :
1309 0 : std::set<const ThumbnailViewItem*>::const_iterator pIter;
1310 0 : for (pIter = maSelFolders.begin(); pIter != maSelFolders.end(); ++pIter)
1311 : {
1312 0 : if (aTemplateList.isEmpty())
1313 0 : aTemplateList = (*pIter)->maTitle;
1314 : else
1315 0 : aTemplateList = aTemplateList + "\n" + (*pIter)->maTitle;
1316 : }
1317 :
1318 0 : OUString aDst = maView->GetItemText(nItemId);
1319 0 : OUString aMsg(SfxResId(STR_MSG_ERROR_LOCAL_MOVE).toString());
1320 0 : aMsg = aMsg.replaceFirst("$1",aDst);
1321 0 : ErrorBox(this, WB_OK,aMsg.replaceFirst( "$2",aTemplateList)).Execute();
1322 : }
1323 : }
1324 0 : }
1325 :
1326 0 : void SfxTemplateManagerDlg::remoteMoveTo(const sal_uInt16 nMenuId)
1327 : {
1328 0 : sal_uInt16 nItemId = 0;
1329 :
1330 0 : if (nMenuId == MNI_MOVE_NEW)
1331 : {
1332 0 : InputDialog dlg(SfxResId(STR_INPUT_NEW).toString(),this);
1333 :
1334 0 : int ret = dlg.Execute();
1335 :
1336 0 : if (ret)
1337 : {
1338 0 : OUString aName = dlg.getEntryText();
1339 :
1340 0 : if (!aName.isEmpty())
1341 0 : nItemId = maView->createRegion(aName);
1342 0 : }
1343 : }
1344 : else
1345 : {
1346 0 : nItemId = maView->GetItemId(nMenuId-MNI_MOVE_FOLDER_BASE);
1347 : }
1348 :
1349 0 : if (nItemId)
1350 : {
1351 0 : OUString aTemplateList;
1352 :
1353 0 : std::set<const ThumbnailViewItem*>::const_iterator aIter;
1354 0 : for (aIter = maSelTemplates.begin(); aIter != maSelTemplates.end(); ++aIter)
1355 : {
1356 : const TemplateSearchViewItem *pItem =
1357 0 : static_cast<const TemplateSearchViewItem*>(*aIter);
1358 :
1359 0 : if(!maView->copyFrom(nItemId,pItem->maPreview1,pItem->getPath()))
1360 : {
1361 0 : if (aTemplateList.isEmpty())
1362 0 : aTemplateList = pItem->maTitle;
1363 : else
1364 0 : aTemplateList = aTemplateList + "\n" + pItem->maTitle;
1365 : }
1366 : }
1367 :
1368 0 : maView->Invalidate(INVALIDATE_NOERASE);
1369 :
1370 0 : if (!aTemplateList.isEmpty())
1371 : {
1372 0 : OUString aMsg(SfxResId(STR_MSG_ERROR_REMOTE_MOVE).toString());
1373 0 : aMsg = aMsg.replaceFirst("$1",mpOnlineView->getOverlayName());
1374 0 : aMsg = aMsg.replaceFirst("$2",maView->GetItemText(nItemId));
1375 0 : ErrorBox(this,WB_OK,aMsg.replaceFirst("$1",aTemplateList)).Execute();
1376 0 : }
1377 : }
1378 0 : }
1379 :
1380 0 : void SfxTemplateManagerDlg::localSearchMoveTo(sal_uInt16 nMenuId)
1381 : {
1382 0 : sal_uInt16 nItemId = 0;
1383 :
1384 0 : if (nMenuId == MNI_MOVE_NEW)
1385 : {
1386 0 : InputDialog dlg(SfxResId(STR_INPUT_NEW).toString(),this);
1387 :
1388 0 : int ret = dlg.Execute();
1389 :
1390 0 : if (ret)
1391 : {
1392 0 : OUString aName = dlg.getEntryText();
1393 :
1394 0 : if (!aName.isEmpty())
1395 0 : nItemId = maView->createRegion(aName);
1396 0 : }
1397 : }
1398 : else
1399 : {
1400 0 : nItemId = maView->GetItemId(nMenuId-MNI_MOVE_FOLDER_BASE);
1401 : }
1402 :
1403 0 : if (nItemId)
1404 : {
1405 0 : OUString aTemplateList;
1406 :
1407 : // Move templates to desired folder if for some reason move fails
1408 : // try copying them.
1409 0 : std::set<const ThumbnailViewItem*>::const_iterator aIter;
1410 0 : for (aIter = maSelTemplates.begin(); aIter != maSelTemplates.end(); ++aIter)
1411 : {
1412 : const TemplateSearchViewItem *pItem =
1413 0 : static_cast<const TemplateSearchViewItem*>(*aIter);
1414 :
1415 0 : if(!maView->moveTemplate(pItem,pItem->mnRegionId+1,nItemId,false)
1416 0 : && !maView->moveTemplate(pItem,pItem->mnRegionId+1,nItemId,true))
1417 : {
1418 0 : if (aTemplateList.isEmpty())
1419 0 : aTemplateList = (*aIter)->maTitle;
1420 : else
1421 0 : aTemplateList = aTemplateList + "\n" + (*aIter)->maTitle;
1422 : }
1423 : }
1424 :
1425 0 : if (!aTemplateList.isEmpty())
1426 : {
1427 0 : OUString aDst = maView->GetItemText(nItemId);
1428 0 : OUString aMsg(SfxResId(STR_MSG_ERROR_LOCAL_MOVE).toString());
1429 0 : aMsg = aMsg.replaceFirst("$1",aDst);
1430 0 : ErrorBox(this, WB_OK,aMsg.replaceFirst( "$2",aTemplateList)).Execute();
1431 0 : }
1432 : }
1433 :
1434 : // Deselect all items and update search results
1435 0 : mpSearchView->deselectItems();
1436 :
1437 0 : SearchUpdateHdl(mpSearchEdit);
1438 0 : }
1439 :
1440 0 : void SfxTemplateManagerDlg::loadRepositories()
1441 : {
1442 0 : uno::Reference < uno::XComponentContext > m_context(comphelper::getProcessComponentContext());
1443 :
1444 : // Load from user settings
1445 : com::sun::star::uno::Sequence<OUString> aUrls =
1446 0 : officecfg::Office::Common::Misc::TemplateRepositoryUrls::get(m_context);
1447 :
1448 : com::sun::star::uno::Sequence<OUString> aNames =
1449 0 : officecfg::Office::Common::Misc::TemplateRepositoryNames::get(m_context);
1450 :
1451 0 : for (sal_Int32 i = 0; i < aUrls.getLength() && i < aNames.getLength(); ++i)
1452 : {
1453 0 : TemplateRepository *pItem = new TemplateRepository();
1454 :
1455 0 : pItem->mnId = i+1;
1456 0 : pItem->maTitle = aNames[i];
1457 0 : pItem->setURL(aUrls[i]);
1458 :
1459 0 : maRepositories.push_back(pItem);
1460 0 : }
1461 0 : }
1462 :
1463 0 : bool SfxTemplateManagerDlg::insertRepository(const OUString &rName, const OUString &rURL)
1464 : {
1465 0 : for (size_t i = 0, n = maRepositories.size(); i < n; ++i)
1466 : {
1467 0 : if (maRepositories[i]->maTitle == rName)
1468 0 : return false;
1469 : }
1470 :
1471 0 : TemplateRepository *pItem = new TemplateRepository();
1472 :
1473 0 : pItem->mnId = maRepositories.size()+1;
1474 0 : pItem->maTitle = rName;
1475 0 : pItem->setURL(rURL);
1476 :
1477 0 : maRepositories.push_back(pItem);
1478 :
1479 0 : mbIsSynced = false;
1480 0 : return true;
1481 : }
1482 :
1483 0 : bool SfxTemplateManagerDlg::deleteRepository(const sal_uInt16 nRepositoryId)
1484 : {
1485 0 : bool bRet = false;
1486 :
1487 0 : for (size_t i = 0, n = maRepositories.size(); i < n; ++i)
1488 : {
1489 0 : if (maRepositories[i]->mnId == nRepositoryId)
1490 : {
1491 0 : delete maRepositories[i];
1492 :
1493 0 : maRepositories.erase(maRepositories.begin() + i);
1494 0 : mbIsSynced = false;
1495 0 : bRet = true;
1496 0 : break;
1497 : }
1498 : }
1499 :
1500 0 : return bRet;
1501 : }
1502 :
1503 0 : void SfxTemplateManagerDlg::syncRepositories() const
1504 : {
1505 0 : if (!mbIsSynced)
1506 : {
1507 0 : uno::Reference < uno::XComponentContext > pContext(comphelper::getProcessComponentContext());
1508 0 : boost::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create(pContext));
1509 :
1510 0 : size_t nSize = maRepositories.size();
1511 0 : uno::Sequence<OUString> aUrls(nSize);
1512 0 : uno::Sequence<OUString> aNames(nSize);
1513 :
1514 0 : for(size_t i = 0; i < nSize; ++i)
1515 : {
1516 0 : aUrls[i] = maRepositories[i]->getURL();
1517 0 : aNames[i] = maRepositories[i]->maTitle;
1518 : }
1519 :
1520 0 : officecfg::Office::Common::Misc::TemplateRepositoryUrls::set(aUrls, batch, pContext);
1521 0 : officecfg::Office::Common::Misc::TemplateRepositoryNames::set(aNames, batch, pContext);
1522 0 : batch->commit();
1523 : }
1524 0 : }
1525 :
1526 0 : static bool lcl_getServiceName ( const OUString &rFileURL, OUString &rName )
1527 : {
1528 0 : bool bRet = false;
1529 :
1530 0 : if ( !rFileURL.isEmpty() )
1531 : {
1532 : try
1533 : {
1534 : uno::Reference< embed::XStorage > xStorage =
1535 0 : comphelper::OStorageHelper::GetStorageFromURL( rFileURL, embed::ElementModes::READ );
1536 :
1537 0 : sal_uIntPtr nFormat = SotStorage::GetFormatID( xStorage );
1538 :
1539 0 : const SfxFilter* pFilter = SFX_APP()->GetFilterMatcher().GetFilter4ClipBoardId( nFormat );
1540 :
1541 0 : if ( pFilter )
1542 : {
1543 0 : rName = pFilter->GetServiceName();
1544 0 : bRet = true;
1545 0 : }
1546 : }
1547 0 : catch( uno::Exception& )
1548 : {}
1549 : }
1550 :
1551 0 : return bRet;
1552 : }
1553 :
1554 0 : static std::vector<OUString> lcl_getAllFactoryURLs ()
1555 : {
1556 0 : SvtModuleOptions aModOpt;
1557 0 : std::vector<OUString> aList;
1558 0 : const ::com::sun::star::uno::Sequence<OUString> &aServiceNames = aModOpt.GetAllServiceNames();
1559 :
1560 0 : for( sal_Int32 i=0, nCount = aServiceNames.getLength(); i < nCount; ++i )
1561 : {
1562 0 : if ( SfxObjectFactory::GetStandardTemplate( aServiceNames[i] ).Len() > 0 )
1563 : {
1564 0 : SvtModuleOptions::EFactory eFac = SvtModuleOptions::E_WRITER;
1565 0 : SvtModuleOptions::ClassifyFactoryByName( aServiceNames[i], eFac );
1566 0 : aList.push_back(aModOpt.GetFactoryEmptyDocumentURL(eFac));
1567 : }
1568 : }
1569 :
1570 0 : return aList;
1571 66 : }
1572 :
1573 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|