bump product version to 4.1.6.2
[LibreOffice.git] / sfx2 / source / doc / templatedlg.cxx
blob703291462eaef4bedd76951ca0aeca731bd6b989
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
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 */
10 #include "templatedlg.hxx"
12 #include "inputdlg.hxx"
13 #include "templatesearchview.hxx"
14 #include "templatesearchviewitem.hxx"
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/miscopt.hxx>
34 #include <svtools/PlaceEditDialog.hxx>
35 #include <tools/urlobj.hxx>
36 #include <unotools/moduleoptions.hxx>
37 #include <unotools/pathoptions.hxx>
38 #include <unotools/viewoptions.hxx>
39 #include <vcl/edit.hxx>
40 #include <vcl/msgbox.hxx>
41 #include <vcl/toolbox.hxx>
43 #include <com/sun/star/beans/PropertyValue.hpp>
44 #include <com/sun/star/document/MacroExecMode.hpp>
45 #include <com/sun/star/document/UpdateDocMode.hpp>
46 #include <com/sun/star/embed/XStorage.hpp>
47 #include <com/sun/star/embed/ElementModes.hpp>
48 #include <com/sun/star/frame/Desktop.hpp>
49 #include <com/sun/star/frame/XComponentLoader.hpp>
50 #include <com/sun/star/frame/XStorable.hpp>
51 #include <com/sun/star/lang/XComponent.hpp>
52 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
53 #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
54 #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
55 #include <com/sun/star/ui/dialogs/FolderPicker.hpp>
56 #include <com/sun/star/task/InteractionHandler.hpp>
58 #include "doc.hrc"
59 #include "templatedlg.hrc"
61 #define PADDING_DLG_BORDER 10
63 #define TM_SETTING_MANAGER "TemplateManager"
64 #define TM_SETTING_LASTFOLDER "LastFolder"
65 #define TM_SETTING_FILTER "SelectedFilter"
67 using namespace ::com::sun::star;
68 using namespace ::com::sun::star::beans;
69 using namespace ::com::sun::star::embed;
70 using namespace ::com::sun::star::frame;
71 using namespace ::com::sun::star::lang;
72 using namespace ::com::sun::star::uno;
73 using namespace ::com::sun::star::ui::dialogs;
74 using namespace ::com::sun::star::document;
76 static bool lcl_getServiceName (const OUString &rFileURL, OUString &rName );
78 static std::vector<OUString> lcl_getAllFactoryURLs ();
80 // Sort by name in ascending order
81 class SortView_Name
83 public:
85 bool operator() (const ThumbnailViewItem *pItem1, const ThumbnailViewItem *pItem2)
87 return (pItem1->maTitle.compareTo(pItem2->maTitle) < 0);
91 class SearchView_Keyword
93 public:
95 SearchView_Keyword (const OUString &rKeyword, FILTER_APPLICATION App)
96 : maKeyword(rKeyword), meApp(App)
99 bool operator() (const TemplateItemProperties &rItem)
101 bool bRet = true;
103 INetURLObject aUrl(rItem.aPath);
104 OUString aExt = aUrl.getExtension();
106 if (meApp == FILTER_APP_WRITER)
108 bRet = aExt == "ott" || aExt == "stw" || aExt == "oth" || aExt == "dot" || aExt == "dotx";
110 else if (meApp == FILTER_APP_CALC)
112 bRet = aExt == "ots" || aExt == "stc" || aExt == "xlt" || aExt == "xltm" || aExt == "xltx";
114 else if (meApp == FILTER_APP_IMPRESS)
116 bRet = aExt == "otp" || aExt == "sti" || aExt == "pot" || aExt == "potm" || aExt == "potx";
118 else if (meApp == FILTER_APP_DRAW)
120 bRet = aExt == "otg" || aExt == "std";
123 return bRet && rItem.aName.matchIgnoreAsciiCase(maKeyword);
126 private:
128 OUString maKeyword;
129 FILTER_APPLICATION meApp;
132 /***
134 * Order items in ascending order (useful for the selection sets and move/copy operations since the associated ids
135 * change when processed by the SfxDocumentTemplates class so we want to process to ones with higher id first)
137 ***/
139 static bool cmpSelectionItems (const ThumbnailViewItem *pItem1, const ThumbnailViewItem *pItem2)
141 return pItem1->mnId > pItem2->mnId;
144 class TemplateManagerPage : public TabPage
146 private:
147 FixedText maFixedText;
149 public:
150 TemplateManagerPage( Window* pParent );
151 ~TemplateManagerPage( ) { };
154 SfxTemplateManagerDlg::SfxTemplateManagerDlg (Window *parent)
155 : ModelessDialog(parent, SfxResId(DLG_TEMPLATE_MANAGER)),
156 maTabControl(this,SfxResId(TAB_CONTROL)),
157 maTabPage(&maTabControl, SfxResId(TAB_TEMPLATE_MANAGER)),
158 mpSearchEdit(new Edit(&maTabPage,WB_HIDE | WB_BORDER)),
159 mpViewBar( new ToolBox(&maTabPage, SfxResId(TBX_ACTION_VIEW))),
160 mpActionBar( new ToolBox(&maTabPage, SfxResId(TBX_ACTION_ACTION))),
161 mpTemplateBar( new ToolBox(&maTabPage, SfxResId(TBX_ACTION_TEMPLATES))),
162 mpSearchView(new TemplateSearchView(&maTabPage)),
163 mpLocalView(new TemplateLocalView(&maTabPage,SfxResId(TEMPLATE_VIEW))),
164 mpRemoteView(new TemplateRemoteView(&maTabPage, WB_VSCROLL,false)),
165 maSelTemplates(cmpSelectionItems),
166 maSelFolders(cmpSelectionItems),
167 mbIsSaveMode(false),
168 mxDesktop( Desktop::create(comphelper::getProcessComponentContext()) ),
169 mbIsSynced(false),
170 maRepositories()
172 maTabControl.SetTabPage( FILTER_DOCS, &maTabPage );
173 maTabControl.SetTabPage( FILTER_SHEETS, &maTabPage );
174 maTabControl.SetTabPage( FILTER_PRESENTATIONS, &maTabPage );
175 maTabControl.SetTabPage( FILTER_DRAWS, &maTabPage );
177 // Create popup menus
178 mpActionMenu = new PopupMenu;
179 mpActionMenu->InsertItem(MNI_ACTION_SORT_NAME,SfxResId(STR_ACTION_SORT_NAME).toString(),SfxResId(IMG_ACTION_SORT));
180 mpActionMenu->InsertItem(MNI_ACTION_REFRESH,SfxResId(STR_ACTION_REFRESH).toString(),SfxResId(IMG_ACTION_REFRESH));
181 mpActionMenu->InsertItem(MNI_ACTION_DEFAULT,SfxResId(STR_ACTION_DEFAULT).toString());
182 mpActionMenu->SetSelectHdl(LINK(this,SfxTemplateManagerDlg,MenuSelectHdl));
184 mpRepositoryMenu = new PopupMenu;
185 mpRepositoryMenu->SetSelectHdl(LINK(this,SfxTemplateManagerDlg,RepositoryMenuSelectHdl));
187 mpTemplateDefaultMenu = new PopupMenu;
188 mpTemplateDefaultMenu->SetSelectHdl(LINK(this,SfxTemplateManagerDlg,DefaultTemplateMenuSelectHdl));
189 mpActionMenu->SetPopupMenu(MNI_ACTION_DEFAULT,mpTemplateDefaultMenu);
191 // Set toolbox styles
192 mpViewBar->SetButtonType(BUTTON_SYMBOLTEXT);
193 mpTemplateBar->SetButtonType(BUTTON_SYMBOLTEXT);
195 // Set toolbox button bits
196 mpViewBar->SetItemBits(TBI_TEMPLATE_REPOSITORY, TIB_DROPDOWNONLY);
197 mpActionBar->SetItemBits(TBI_TEMPLATE_ACTION, TIB_DROPDOWNONLY);
198 mpTemplateBar->SetItemBits(TBI_TEMPLATE_MOVE,TIB_DROPDOWNONLY);
200 // Set toolbox handlers
201 mpViewBar->SetClickHdl(LINK(this,SfxTemplateManagerDlg,TBXViewHdl));
202 mpViewBar->SetDropdownClickHdl(LINK(this,SfxTemplateManagerDlg,TBXDropdownHdl));
203 mpActionBar->SetClickHdl(LINK(this,SfxTemplateManagerDlg,TBXActionHdl));
204 mpActionBar->SetDropdownClickHdl(LINK(this,SfxTemplateManagerDlg,TBXDropdownHdl));
205 mpTemplateBar->SetClickHdl(LINK(this,SfxTemplateManagerDlg,TBXTemplateHdl));
206 mpTemplateBar->SetDropdownClickHdl(LINK(this,SfxTemplateManagerDlg,TBXDropdownHdl));
207 mpSearchEdit->SetUpdateDataHdl(LINK(this,SfxTemplateManagerDlg,SearchUpdateHdl));
208 mpSearchEdit->EnableUpdateData();
210 mpLocalView->SetStyle(mpLocalView->GetStyle() | WB_VSCROLL);
211 mpLocalView->setItemMaxTextLength(TEMPLATE_ITEM_MAX_TEXT_LENGTH);
213 mpLocalView->setItemDimensions(TEMPLATE_ITEM_MAX_WIDTH,TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
214 TEMPLATE_ITEM_MAX_HEIGHT-TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
215 TEMPLATE_ITEM_PADDING);
217 mpLocalView->setItemStateHdl(LINK(this,SfxTemplateManagerDlg,TVItemStateHdl));
218 mpLocalView->setOpenRegionHdl(LINK(this,SfxTemplateManagerDlg,OpenRegionHdl));
219 mpLocalView->setOpenTemplateHdl(LINK(this,SfxTemplateManagerDlg,OpenTemplateHdl));
221 // Set online view position and dimensions
222 mpRemoteView->setItemMaxTextLength(TEMPLATE_ITEM_MAX_TEXT_LENGTH);
224 mpRemoteView->setItemDimensions(TEMPLATE_ITEM_MAX_WIDTH,TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
225 TEMPLATE_ITEM_MAX_HEIGHT-TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
226 TEMPLATE_ITEM_PADDING);
228 mpRemoteView->setItemStateHdl(LINK(this,SfxTemplateManagerDlg,TVItemStateHdl));
229 mpRemoteView->setOpenRegionHdl(LINK(this,SfxTemplateManagerDlg,OpenRegionHdl));
230 mpRemoteView->setOpenTemplateHdl(LINK(this,SfxTemplateManagerDlg,OpenTemplateHdl));
232 mpSearchView->setItemMaxTextLength(TEMPLATE_ITEM_MAX_TEXT_LENGTH);
234 mpSearchView->setItemDimensions(TEMPLATE_ITEM_MAX_WIDTH,TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
235 TEMPLATE_ITEM_MAX_HEIGHT_SUB-TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT,
236 TEMPLATE_ITEM_PADDING);
238 mpSearchView->setItemStateHdl(LINK(this,SfxTemplateManagerDlg,TVItemStateHdl));
239 mpSearchView->setOpenTemplateHdl(LINK(this,SfxTemplateManagerDlg,OpenTemplateHdl));
241 maTabControl.SetActivatePageHdl(LINK(this,SfxTemplateManagerDlg,ActivatePageHdl));
243 SvtMiscOptions aMiscOptions;
244 if ( !aMiscOptions.IsExperimentalMode() )
246 sal_uInt16 nPos = mpViewBar->GetItemId(TBI_TEMPLATE_REPOSITORY);
247 mpViewBar->RemoveItem(nPos);
250 SetMinOutputSizePixel(GetOutputSizePixel());
252 mpViewBar->Show();
253 mpActionBar->Show();
255 switchMainView(true);
257 loadRepositories();
259 createRepositoryMenu();
260 createDefaultTemplateMenu();
262 mpLocalView->Populate();
263 mpCurView->filterItems(ViewFilter_Application(FILTER_APP_WRITER));
265 readSettings();
267 mpLocalView->Show();
269 FreeResource();
272 SfxTemplateManagerDlg::~SfxTemplateManagerDlg ()
274 writeSettings();
276 // Synchronize the config before deleting it
277 syncRepositories();
278 for (size_t i = 0, n = maRepositories.size(); i < n; ++i)
279 delete maRepositories[i];
281 // Ignore view events since we are cleaning the object
282 mpLocalView->setItemStateHdl(Link());
283 mpLocalView->setOpenRegionHdl(Link());
284 mpLocalView->setOpenTemplateHdl(Link());
286 mpRemoteView->setItemStateHdl(Link());
287 mpRemoteView->setOpenRegionHdl(Link());
288 mpRemoteView->setOpenTemplateHdl(Link());
290 mpSearchView->setItemStateHdl(Link());
291 mpSearchView->setOpenTemplateHdl(Link());
293 delete mpSearchEdit;
294 delete mpViewBar;
295 delete mpActionBar;
296 delete mpTemplateBar;
297 delete mpSearchView;
298 delete mpLocalView;
299 delete mpRemoteView;
300 delete mpTemplateDefaultMenu;
301 delete mpActionMenu;
302 delete mpRepositoryMenu;
305 void SfxTemplateManagerDlg::setSaveMode(bool bMode)
307 mbIsSaveMode = bMode;
308 maTabControl.Clear();
309 mpCurView->filterItems(ViewFilter_Application(FILTER_APP_NONE));
311 if (bMode)
313 mpViewBar->ShowItem(TBI_TEMPLATE_SAVE);
314 mpViewBar->HideItem(TBI_TEMPLATE_IMPORT);
315 mpViewBar->HideItem(TBI_TEMPLATE_REPOSITORY);
317 mpTemplateBar->ShowItem(TBI_TEMPLATE_SAVE);
318 mpTemplateBar->ShowItem(TBI_TEMPLATE_PROPERTIES);
319 mpTemplateBar->ShowItem(TBI_TEMPLATE_DEFAULT);
320 mpTemplateBar->HideItem(TBI_TEMPLATE_OPEN);
321 mpTemplateBar->HideItem(TBI_TEMPLATE_EDIT);
322 mpTemplateBar->HideItem(TBI_TEMPLATE_MOVE);
323 mpTemplateBar->HideItem(TBI_TEMPLATE_EXPORT);
324 mpTemplateBar->HideItem(TBI_TEMPLATE_DELETE);
326 else
328 mpViewBar->HideItem(TBI_TEMPLATE_SAVE);
329 mpViewBar->ShowItem(TBI_TEMPLATE_IMPORT);
330 mpViewBar->ShowItem(TBI_TEMPLATE_REPOSITORY);
334 void SfxTemplateManagerDlg::setDocumentModel(const uno::Reference<frame::XModel> &rModel)
336 m_xModel = rModel;
339 IMPL_LINK_NOARG(SfxTemplateManagerDlg,ActivatePageHdl)
341 FILTER_APPLICATION eFilter = FILTER_APP_NONE;
342 switch (maTabControl.GetCurPageId())
344 case FILTER_DOCS:
345 eFilter = FILTER_APP_WRITER;
346 break;
347 case FILTER_PRESENTATIONS:
348 eFilter = FILTER_APP_IMPRESS;
349 break;
350 case FILTER_SHEETS:
351 eFilter = FILTER_APP_CALC;
352 break;
353 case FILTER_DRAWS:
354 eFilter = FILTER_APP_DRAW;
355 break;
357 mpCurView->filterItems(ViewFilter_Application(eFilter));
359 if (mpSearchView->IsVisible())
360 SearchUpdateHdl(NULL);
362 return 0;
365 void SfxTemplateManagerDlg::readSettings ()
367 OUString aLastFolder;
368 sal_uInt16 nPageId = FILTER_DOCS;
369 SvtViewOptions aViewSettings( E_DIALOG, TM_SETTING_MANAGER );
371 if ( aViewSettings.Exists() )
373 sal_uInt16 nFilter = 0;
374 aViewSettings.GetUserItem(TM_SETTING_LASTFOLDER) >>= aLastFolder;
375 aViewSettings.GetUserItem(TM_SETTING_FILTER) >>= nFilter;
377 switch (nFilter)
379 case FILTER_APP_WRITER:
380 nPageId = FILTER_DOCS;
381 break;
382 case FILTER_APP_IMPRESS:
383 nPageId = FILTER_PRESENTATIONS;
384 break;
385 case FILTER_APP_CALC:
386 nPageId = FILTER_SHEETS;
387 break;
388 case FILTER_APP_DRAW:
389 nPageId = FILTER_DRAWS;
390 break;
394 if (!aLastFolder.getLength())
395 mpLocalView->showRootRegion();
396 else
397 mpLocalView->showRegion(aLastFolder);
399 maTabControl.SelectTabPage(nPageId);
402 void SfxTemplateManagerDlg::writeSettings ()
404 Sequence< NamedValue > aSettings(2);
406 OUString aLastFolder;
408 if (mpCurView == mpLocalView && mpLocalView->getCurRegionId())
409 aLastFolder = mpLocalView->getRegionName(mpLocalView->getCurRegionId()-1);
411 // last folder
412 aSettings[0].Name = TM_SETTING_LASTFOLDER;
413 aSettings[0].Value <<= aLastFolder;
415 sal_uInt16 nFilter = FILTER_APP_WRITER;
416 switch (maTabControl.GetCurPageId())
418 case FILTER_DOCS:
419 nFilter = FILTER_APP_WRITER;
420 break;
421 case FILTER_PRESENTATIONS:
422 nFilter = FILTER_APP_IMPRESS;
423 break;
424 case FILTER_SHEETS:
425 nFilter = FILTER_APP_CALC;
426 break;
427 case FILTER_DRAWS:
428 nFilter = FILTER_APP_DRAW;
429 break;
432 aSettings[1].Name = TM_SETTING_FILTER;
433 aSettings[1].Value <<= nFilter;
435 // write
436 SvtViewOptions aViewSettings( E_DIALOG, TM_SETTING_MANAGER );
437 aViewSettings.SetUserData( aSettings );
440 void SfxTemplateManagerDlg::Resize()
442 // Fit the tab page control and the toolbars
443 maTabControl.SetSizePixel(GetSizePixel());
444 const Size aWinSize = maTabControl.GetTabPageSizePixel();
446 // Calculate toolboxes size and positions
447 Size aViewSize = mpViewBar->CalcMinimumWindowSizePixel();
448 Size aActionSize = mpActionBar->CalcMinimumWindowSizePixel();
449 Size aTemplateSize = mpTemplateBar->CalcMinimumWindowSizePixel();
451 long nToolbarsHeight = std::max(std::max(aViewSize.getHeight(), aActionSize.getHeight()), aTemplateSize.getHeight());
453 aActionSize.setWidth(2.5*aActionSize.getWidth());
454 aViewSize.setWidth(aWinSize.getWidth()-aActionSize.getWidth()-mpViewBar->GetPosPixel().X());
455 aTemplateSize.setWidth(aWinSize.getWidth());
457 Point aActionPos = mpActionBar->GetPosPixel();
458 aActionPos.setX(aWinSize.getWidth() - aActionSize.getWidth());
460 mpViewBar->SetSizePixel(aViewSize);
461 mpActionBar->SetPosSizePixel(aActionPos,aActionSize);
462 mpTemplateBar->SetSizePixel(aTemplateSize);
464 Point aViewPos = mpLocalView->GetPosPixel();
465 aViewPos.setY(nToolbarsHeight);
466 aViewPos.setX(0);
468 // Set search box position and size
469 Size aSearchSize = mpSearchEdit->CalcMinimumSize();
470 aSearchSize.setWidth(aWinSize.getWidth() - 2*PADDING_DLG_BORDER);
472 mpSearchEdit->SetSizePixel(aSearchSize);
473 mpSearchEdit->SetPosPixel(Point(PADDING_DLG_BORDER,aViewPos.Y()));
475 if (mpSearchEdit->IsVisible())
476 aViewPos.setY(aViewPos.getY() + mpSearchEdit->GetSizePixel().getHeight() );
478 // Set view position below toolbox and search box
479 Size aThumbSize(aWinSize.getWidth(), aWinSize.getHeight() - aViewPos.getY());
481 mpLocalView->SetPosSizePixel(aViewPos,aThumbSize);
482 mpRemoteView->SetPosSizePixel(aViewPos,aThumbSize);
483 mpSearchView->SetPosSizePixel(aViewPos,aThumbSize);
485 ModelessDialog::Resize();
488 IMPL_LINK_NOARG(SfxTemplateManagerDlg,TBXViewHdl)
490 switch(mpViewBar->GetCurItemId())
492 case TBI_TEMPLATE_IMPORT:
493 OnTemplateImport();
494 break;
495 case TBI_TEMPLATE_FOLDER_DEL:
496 if (mpCurView == mpLocalView)
497 OnFolderDelete();
498 else
499 OnRepositoryDelete();
500 break;
501 case TBI_TEMPLATE_FOLDER_NEW:
502 OnFolderNew();
503 break;
504 case TBI_TEMPLATE_SAVE:
505 OnTemplateSaveAs();
506 break;
507 default:
508 break;
511 return 0;
514 IMPL_LINK_NOARG(SfxTemplateManagerDlg,TBXActionHdl)
516 switch(mpActionBar->GetCurItemId())
518 case TBI_TEMPLATE_SEARCH:
519 OnTemplateSearch();
520 break;
521 default:
522 break;
525 return 0;
528 IMPL_LINK_NOARG(SfxTemplateManagerDlg,TBXTemplateHdl)
530 switch(mpTemplateBar->GetCurItemId())
532 case TBI_TEMPLATE_OPEN:
533 OnTemplateOpen();
534 break;
535 case TBI_TEMPLATE_EDIT:
536 OnTemplateEdit();
537 break;
538 case TBI_TEMPLATE_PROPERTIES:
539 OnTemplateProperties();
540 break;
541 case TBI_TEMPLATE_DELETE:
542 OnTemplateDelete();
543 break;
544 case TBI_TEMPLATE_DEFAULT:
545 OnTemplateAsDefault();
546 break;
547 case TBI_TEMPLATE_EXPORT:
548 OnTemplateExport();
549 break;
550 default:
551 break;
554 return 0;
557 IMPL_LINK(SfxTemplateManagerDlg, TBXDropdownHdl, ToolBox*, pBox)
559 const sal_uInt16 nCurItemId = pBox->GetCurItemId();
561 switch(nCurItemId)
563 case TBI_TEMPLATE_ACTION:
564 pBox->SetItemDown( nCurItemId, true );
566 mpActionMenu->Execute(pBox,pBox->GetItemRect(TBI_TEMPLATE_ACTION),
567 POPUPMENU_EXECUTE_DOWN);
569 pBox->SetItemDown( nCurItemId, false );
570 pBox->EndSelection();
571 pBox->Invalidate();
572 break;
573 case TBI_TEMPLATE_MOVE:
575 pBox->SetItemDown( nCurItemId, true );
577 std::vector<OUString> aNames = mpLocalView->getFolderNames();
579 PopupMenu *pMoveMenu = new PopupMenu;
580 pMoveMenu->SetSelectHdl(LINK(this,SfxTemplateManagerDlg,MoveMenuSelectHdl));
582 if (!aNames.empty())
584 for (size_t i = 0, n = aNames.size(); i < n; ++i)
585 pMoveMenu->InsertItem(MNI_MOVE_FOLDER_BASE+i,aNames[i]);
588 pMoveMenu->InsertSeparator();
590 pMoveMenu->InsertItem(MNI_MOVE_NEW,SfxResId(STR_MOVE_NEW).toString());
592 pMoveMenu->Execute(pBox,pBox->GetItemRect(TBI_TEMPLATE_MOVE),
593 POPUPMENU_EXECUTE_DOWN);
595 delete pMoveMenu;
597 pBox->SetItemDown( nCurItemId, false );
598 pBox->EndSelection();
599 pBox->Invalidate();
600 break;
602 case TBI_TEMPLATE_REPOSITORY:
603 pBox->SetItemDown( nCurItemId, true );
605 mpRepositoryMenu->Execute(pBox,pBox->GetItemRect(TBI_TEMPLATE_REPOSITORY),
606 POPUPMENU_EXECUTE_DOWN);
608 pBox->SetItemDown( nCurItemId, false );
609 pBox->EndSelection();
610 pBox->Invalidate();
611 break;
612 default:
613 break;
616 return 0;
619 IMPL_LINK(SfxTemplateManagerDlg, TVItemStateHdl, const ThumbnailViewItem*, pItem)
621 const TemplateContainerItem *pCntItem = dynamic_cast<const TemplateContainerItem*>(pItem);
623 if (pCntItem)
624 OnRegionState(pItem);
625 else
626 OnTemplateState(pItem);
628 return 0;
631 IMPL_LINK(SfxTemplateManagerDlg, MenuSelectHdl, Menu*, pMenu)
633 sal_uInt16 nMenuId = pMenu->GetCurItemId();
635 switch(nMenuId)
637 case MNI_ACTION_SORT_NAME:
638 mpLocalView->sortItems(SortView_Name());
639 break;
640 case MNI_ACTION_REFRESH:
641 mpCurView->reload();
642 break;
643 default:
644 break;
647 return 0;
650 IMPL_LINK(SfxTemplateManagerDlg, MoveMenuSelectHdl, Menu*, pMenu)
652 sal_uInt16 nMenuId = pMenu->GetCurItemId();
654 if (mpSearchView->IsVisible())
656 // Check if we are searching the local or remote templates
657 if (mpCurView == mpLocalView)
658 localSearchMoveTo(nMenuId);
660 else
662 // Check if we are displaying the local or remote templates
663 if (mpCurView == mpLocalView)
664 localMoveTo(nMenuId);
665 else
666 remoteMoveTo(nMenuId);
669 return 0;
672 IMPL_LINK(SfxTemplateManagerDlg, RepositoryMenuSelectHdl, Menu*, pMenu)
674 sal_uInt16 nMenuId = pMenu->GetCurItemId();
676 if (nMenuId == MNI_REPOSITORY_LOCAL)
678 switchMainView(true);
680 else if (nMenuId == MNI_REPOSITORY_NEW)
682 PlaceEditDialog dlg(this);
684 if (dlg.Execute())
686 boost::shared_ptr<Place> pPlace = dlg.GetPlace();
688 if (insertRepository(pPlace->GetName(),pPlace->GetUrl()))
690 // update repository list menu.
691 createRepositoryMenu();
693 else
695 OUString aMsg(SfxResId(STR_MSG_ERROR_REPOSITORY_NAME).toString());
696 aMsg = aMsg.replaceFirst("$1",pPlace->GetName());
697 ErrorBox(this,WB_OK,aMsg).Execute();
701 else
703 sal_uInt16 nRepoId = nMenuId - MNI_REPOSITORY_BASE;
705 TemplateRepository *pRepository = NULL;
707 for (size_t i = 0, n = maRepositories.size(); i < n; ++i)
709 if (maRepositories[i]->mnId == nRepoId)
711 pRepository = maRepositories[i];
712 break;
716 if (mpRemoteView->loadRepository(pRepository,false))
717 switchMainView(false);
720 return 0;
723 IMPL_LINK(SfxTemplateManagerDlg, DefaultTemplateMenuSelectHdl, Menu*, pMenu)
725 sal_uInt16 nId = pMenu->GetCurItemId();
727 OUString aServiceName = SfxObjectShell::GetServiceNameFromFactory( mpTemplateDefaultMenu->GetItemCommand(nId));
728 SfxObjectFactory::SetStandardTemplate( aServiceName, OUString() );
730 createDefaultTemplateMenu();
732 return 0;
735 IMPL_LINK_NOARG(SfxTemplateManagerDlg, OpenRegionHdl)
737 maSelFolders.clear();
738 maSelTemplates.clear();
740 mpViewBar->ShowItem(TBI_TEMPLATE_FOLDER_NEW,mpCurView->isNestedRegionAllowed());
742 if (!mbIsSaveMode)
743 mpViewBar->ShowItem(TBI_TEMPLATE_IMPORT,mpCurView->isImportAllowed());
745 mpTemplateBar->Hide();
746 mpViewBar->Show();
747 mpActionBar->Show();
749 return 0;
752 IMPL_LINK(SfxTemplateManagerDlg, OpenTemplateHdl, ThumbnailViewItem*, pItem)
754 if (!mbIsSaveMode)
756 uno::Sequence< PropertyValue > aArgs(4);
757 aArgs[0].Name = "AsTemplate";
758 aArgs[0].Value <<= sal_True;
759 aArgs[1].Name = "MacroExecutionMode";
760 aArgs[1].Value <<= MacroExecMode::USE_CONFIG;
761 aArgs[2].Name = "UpdateDocMode";
762 aArgs[2].Value <<= UpdateDocMode::ACCORDING_TO_CONFIG;
763 aArgs[3].Name = "InteractionHandler";
764 aArgs[3].Value <<= task::InteractionHandler::createWithParent( ::comphelper::getProcessComponentContext(), 0 );
766 TemplateViewItem *pTemplateItem = static_cast<TemplateViewItem*>(pItem);
770 mxDesktop->loadComponentFromURL(pTemplateItem->getPath(),"_default", 0, aArgs );
772 catch( const uno::Exception& )
776 Close();
779 return 0;
782 IMPL_LINK_NOARG(SfxTemplateManagerDlg, SearchUpdateHdl)
784 OUString aKeyword = mpSearchEdit->GetText();
786 if (!aKeyword.isEmpty())
788 mpSearchView->Clear();
790 // if the search view is hidden, hide the folder view and display search one
791 if (!mpSearchView->IsVisible())
793 mpCurView->deselectItems();
794 mpSearchView->Show();
795 mpCurView->Hide();
798 bool bDisplayFolder = !mpCurView->isNonRootRegionVisible();
800 FILTER_APPLICATION eFilter = FILTER_APP_NONE;
801 switch (maTabControl.GetCurPageId())
803 case FILTER_DOCS:
804 eFilter = FILTER_APP_WRITER;
805 break;
806 case FILTER_PRESENTATIONS:
807 eFilter = FILTER_APP_IMPRESS;
808 break;
809 case FILTER_SHEETS:
810 eFilter = FILTER_APP_CALC;
811 break;
812 case FILTER_DRAWS:
813 eFilter = FILTER_APP_DRAW;
814 break;
817 std::vector<TemplateItemProperties> aItems =
818 mpLocalView->getFilteredItems(SearchView_Keyword(aKeyword,eFilter));
820 for (size_t i = 0; i < aItems.size(); ++i)
822 TemplateItemProperties *pItem = &aItems[i];
824 OUString aFolderName;
826 if (bDisplayFolder)
827 aFolderName = mpLocalView->getRegionName(pItem->nRegionId);
829 mpSearchView->AppendItem(pItem->nId,mpLocalView->getRegionId(pItem->nRegionId),
830 pItem->nDocId,
831 pItem->aName,
832 aFolderName,
833 pItem->aPath,
834 pItem->aThumbnail);
837 mpSearchView->Invalidate();
839 else
841 mpSearchView->Hide();
842 mpCurView->Show();
845 return 0;
848 void SfxTemplateManagerDlg::OnRegionState (const ThumbnailViewItem *pItem)
850 if (pItem->isSelected())
852 if (maSelFolders.empty() && !mbIsSaveMode)
854 mpViewBar->ShowItem(TBI_TEMPLATE_IMPORT);
855 mpViewBar->ShowItem(TBI_TEMPLATE_FOLDER_DEL);
856 mpViewBar->HideItem(TBI_TEMPLATE_FOLDER_NEW);
859 maSelFolders.insert(pItem);
861 else
863 maSelFolders.erase(pItem);
865 if (maSelFolders.empty() && !mbIsSaveMode)
867 mpViewBar->HideItem(TBI_TEMPLATE_IMPORT);
868 mpViewBar->HideItem(TBI_TEMPLATE_FOLDER_DEL);
869 mpViewBar->ShowItem(TBI_TEMPLATE_FOLDER_NEW);
874 void SfxTemplateManagerDlg::OnTemplateState (const ThumbnailViewItem *pItem)
876 bool bInSelection = maSelTemplates.find(pItem) != maSelTemplates.end();
878 if (pItem->isSelected())
880 if (maSelTemplates.empty())
882 mpViewBar->Show(false);
883 mpTemplateBar->Show();
885 else if (maSelTemplates.size() != 1 || !bInSelection)
887 if (!mbIsSaveMode)
889 mpTemplateBar->HideItem(TBI_TEMPLATE_OPEN);
890 mpTemplateBar->HideItem(TBI_TEMPLATE_EDIT);
891 mpTemplateBar->HideItem(TBI_TEMPLATE_PROPERTIES);
892 mpTemplateBar->HideItem(TBI_TEMPLATE_DEFAULT);
894 else
896 mpTemplateBar->HideItem(TBI_TEMPLATE_SAVE);
897 mpTemplateBar->HideItem(TBI_TEMPLATE_PROPERTIES);
898 mpTemplateBar->HideItem(TBI_TEMPLATE_DEFAULT);
902 if (!bInSelection)
903 maSelTemplates.insert(pItem);
905 else
907 if (bInSelection)
909 maSelTemplates.erase(pItem);
911 if (maSelTemplates.empty())
913 mpTemplateBar->Show(false);
914 mpViewBar->Show();
916 else if (maSelTemplates.size() == 1)
918 if (!mbIsSaveMode)
920 mpTemplateBar->ShowItem(TBI_TEMPLATE_OPEN);
921 mpTemplateBar->ShowItem(TBI_TEMPLATE_EDIT);
922 mpTemplateBar->ShowItem(TBI_TEMPLATE_PROPERTIES);
923 mpTemplateBar->ShowItem(TBI_TEMPLATE_DEFAULT);
925 else
927 mpTemplateBar->ShowItem(TBI_TEMPLATE_SAVE);
928 mpTemplateBar->ShowItem(TBI_TEMPLATE_PROPERTIES);
929 mpTemplateBar->ShowItem(TBI_TEMPLATE_DEFAULT);
936 void SfxTemplateManagerDlg::OnTemplateImport ()
938 sal_Int16 nDialogType =
939 com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE;
941 sfx2::FileDialogHelper aFileDlg(nDialogType, SFXWB_MULTISELECTION);
943 // add "All" filter
944 aFileDlg.AddFilter( String(SfxResId( STR_SFX_FILTERNAME_ALL) ),
945 OUString(FILEDIALOG_FILTER_ALL) );
947 // add template filter
948 OUString sFilterExt;
949 OUString sFilterName( SfxResId( STR_TEMPLATE_FILTER ).toString() );
951 // add filters of modules which are installed
952 SvtModuleOptions aModuleOpt;
953 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SWRITER ) )
954 sFilterExt += "*.ott;*.stw;*.oth";
956 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SCALC ) )
958 if ( !sFilterExt.isEmpty() )
959 sFilterExt += ";";
961 sFilterExt += "*.ots;*.stc";
964 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SIMPRESS ) )
966 if ( !sFilterExt.isEmpty() )
967 sFilterExt += ";";
969 sFilterExt += "*.otp;*.sti";
972 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SDRAW ) )
974 if ( !sFilterExt.isEmpty() )
975 sFilterExt += ";";
977 sFilterExt += "*.otg;*.std";
980 if ( !sFilterExt.isEmpty() )
981 sFilterExt += ";";
983 sFilterExt += "*.vor";
985 sFilterName += " (";
986 sFilterName += sFilterExt;
987 sFilterName += ")";
989 aFileDlg.AddFilter( sFilterName, sFilterExt );
990 aFileDlg.SetCurrentFilter( sFilterName );
992 ErrCode nCode = aFileDlg.Execute();
994 if ( nCode == ERRCODE_NONE )
996 com::sun::star::uno::Sequence<OUString> aFiles = aFileDlg.GetSelectedFiles();
998 if (aFiles.hasElements())
1000 if (!maSelFolders.empty())
1002 //Import to the selected regions
1003 std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
1004 for (pIter = maSelFolders.begin(); pIter != maSelFolders.end(); ++pIter)
1006 OUString aTemplateList;
1007 TemplateContainerItem *pFolder = (TemplateContainerItem*)(*pIter);
1009 for (size_t i = 0, n = aFiles.getLength(); i < n; ++i)
1011 if(!mpLocalView->copyFrom(pFolder,aFiles[i]))
1013 if (aTemplateList.isEmpty())
1014 aTemplateList = aFiles[i];
1015 else
1016 aTemplateList = aTemplateList + "\n" + aFiles[i];
1020 if (!aTemplateList.isEmpty())
1022 OUString aMsg(SfxResId(STR_MSG_ERROR_IMPORT).toString());
1023 aMsg = aMsg.replaceFirst("$1",pFolder->maTitle);
1024 ErrorBox(this,WB_OK,aMsg.replaceFirst("$2",aTemplateList));
1028 else
1030 //Import to current region
1031 OUString aTemplateList;
1032 for (size_t i = 0, n = aFiles.getLength(); i < n; ++i)
1034 if(!mpLocalView->copyFrom(aFiles[i]))
1036 if (aTemplateList.isEmpty())
1037 aTemplateList = aFiles[i];
1038 else
1039 aTemplateList = aTemplateList + "\n" + aFiles[i];
1043 if (!aTemplateList.isEmpty())
1045 OUString aMsg(SfxResId(STR_MSG_ERROR_IMPORT).toString());
1046 aMsg = aMsg.replaceFirst("$1",mpLocalView->getCurRegionName());
1047 ErrorBox(this,WB_OK,aMsg.replaceFirst("$2",aTemplateList));
1051 mpLocalView->Invalidate(INVALIDATE_NOERASE);
1056 void SfxTemplateManagerDlg::OnTemplateExport()
1058 uno::Reference<XComponentContext> xContext(comphelper::getProcessComponentContext());
1059 uno::Reference<XFolderPicker2> xFolderPicker = FolderPicker::create(xContext);
1061 xFolderPicker->setDisplayDirectory(SvtPathOptions().GetWorkPath());
1063 sal_Int16 nResult = xFolderPicker->execute();
1065 if( nResult == ExecutableDialogResults::OK )
1067 OUString aTemplateList;
1068 INetURLObject aPathObj(xFolderPicker->getDirectory());
1069 aPathObj.setFinalSlash();
1071 if (mpSearchView->IsVisible())
1073 sal_uInt16 i = 1;
1075 std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter = maSelTemplates.begin();
1076 for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end(); ++pIter, ++i)
1078 const TemplateSearchViewItem *pItem = static_cast<const TemplateSearchViewItem*>(*pIter);
1080 INetURLObject aItemPath(pItem->getPath());
1082 if ( 1 == i )
1083 aPathObj.Append(aItemPath.getName());
1084 else
1085 aPathObj.setName(aItemPath.getName());
1087 OUString aPath = aPathObj.GetMainURL( INetURLObject::NO_DECODE );
1089 if (!mpLocalView->exportTo(pItem->mnAssocId,pItem->mnRegionId,aPath))
1091 if (aTemplateList.isEmpty())
1092 aTemplateList = pItem->maTitle;
1093 else
1094 aTemplateList = aTemplateList + "\n" + pItem->maTitle;
1098 mpSearchView->deselectItems();
1100 else
1102 // export templates from the current view
1104 sal_uInt16 i = 1;
1105 sal_uInt16 nRegionItemId = mpLocalView->getCurRegionItemId();
1107 std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter = maSelTemplates.begin();
1108 for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end(); ++pIter, ++i)
1110 const TemplateViewItem *pItem = static_cast<const TemplateViewItem*>(*pIter);
1112 INetURLObject aItemPath(pItem->getPath());
1114 if ( 1 == i )
1115 aPathObj.Append(aItemPath.getName());
1116 else
1117 aPathObj.setName(aItemPath.getName());
1119 OUString aPath = aPathObj.GetMainURL( INetURLObject::NO_DECODE );
1121 if (!mpLocalView->exportTo(pItem->mnId,nRegionItemId,aPath))
1123 if (aTemplateList.isEmpty())
1124 aTemplateList = pItem->maTitle;
1125 else
1126 aTemplateList = aTemplateList + "\n" + pItem->maTitle;
1130 mpLocalView->deselectItems();
1133 if (!aTemplateList.isEmpty())
1135 OUString aText( SfxResId(STR_MSG_ERROR_EXPORT).toString() );
1136 ErrorBox(this, WB_OK,aText.replaceFirst("$1",aTemplateList)).Execute();
1141 void SfxTemplateManagerDlg::OnTemplateSearch ()
1143 Point aPos = mpLocalView->GetPosPixel();
1144 bool bVisible = mpSearchEdit->IsVisible();
1145 Size aWinSize = GetSizePixel();
1146 long nEditHeight = mpSearchEdit->GetSizePixel().getHeight();
1148 if (bVisible)
1150 aWinSize.setHeight(aWinSize.getHeight() - nEditHeight );
1151 aPos.setY(aPos.getY() - nEditHeight );
1152 mpActionBar->SetItemState(TBI_TEMPLATE_SEARCH,STATE_NOCHECK);
1154 else
1156 aWinSize.setHeight(aWinSize.getHeight() + nEditHeight );
1157 aPos.setY(aPos.getY() + nEditHeight );
1158 mpActionBar->SetItemState(TBI_TEMPLATE_SEARCH,STATE_CHECK);
1161 // SetSizePixel(aWinSize);
1162 mpLocalView->SetPosPixel(aPos);
1163 mpRemoteView->SetPosPixel(aPos);
1164 mpSearchView->SetPosPixel(aPos);
1166 // Hide search view
1167 if (bVisible)
1169 mpSearchView->deselectItems();
1170 mpSearchView->Hide();
1171 mpCurView->Show();
1174 mpSearchEdit->Show(!bVisible);
1175 mpSearchEdit->SetText(OUString());
1176 if (!bVisible)
1177 mpSearchEdit->GrabFocus();
1180 void SfxTemplateManagerDlg::OnTemplateOpen ()
1182 ThumbnailViewItem *pItem = const_cast<ThumbnailViewItem*>(*maSelTemplates.begin());
1184 OpenTemplateHdl(pItem);
1187 void SfxTemplateManagerDlg::OnTemplateEdit ()
1189 uno::Sequence< PropertyValue > aArgs(3);
1190 aArgs[0].Name = "AsTemplate";
1191 aArgs[0].Value <<= sal_False;
1192 aArgs[1].Name = "MacroExecutionMode";
1193 aArgs[1].Value <<= MacroExecMode::USE_CONFIG;
1194 aArgs[2].Name = "UpdateDocMode";
1195 aArgs[2].Value <<= UpdateDocMode::ACCORDING_TO_CONFIG;
1197 uno::Reference< XStorable > xStorable;
1198 std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
1199 for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end(); ++pIter)
1201 const TemplateViewItem *pItem = static_cast<const TemplateViewItem*>(*pIter);
1205 xStorable = uno::Reference< XStorable >(
1206 mxDesktop->loadComponentFromURL(pItem->getPath(),"_default", 0, aArgs ),
1207 uno::UNO_QUERY );
1209 catch( const uno::Exception& )
1214 Close();
1217 void SfxTemplateManagerDlg::OnTemplateProperties ()
1219 const TemplateViewItem *pItem = static_cast<const TemplateViewItem*>(*maSelTemplates.begin());
1221 SfxTemplateInfoDlg aDlg;
1222 aDlg.loadDocument(pItem->getPath());
1223 aDlg.Execute();
1226 void SfxTemplateManagerDlg::OnTemplateDelete ()
1228 QueryBox aQueryDlg(this, WB_YES_NO | WB_DEF_YES, SfxResId(STR_QMSG_SEL_TEMPLATE_DELETE).toString());
1230 if ( aQueryDlg.Execute() == RET_NO )
1231 return;
1233 OUString aTemplateList;
1235 if (mpSearchView->IsVisible())
1237 std::set<const ThumbnailViewItem*,selection_cmp_fn> aSelTemplates = maSelTemplates; //Avoids invalid iterators
1239 std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
1240 for (pIter = aSelTemplates.begin(); pIter != aSelTemplates.end(); ++pIter)
1242 const TemplateSearchViewItem *pItem =
1243 static_cast<const TemplateSearchViewItem*>(*pIter);
1245 if (!mpLocalView->removeTemplate(pItem->mnAssocId,pItem->mnRegionId))
1247 if (aTemplateList.isEmpty())
1248 aTemplateList = pItem->maTitle;
1249 else
1250 aTemplateList = aTemplateList + "\n" + pItem->maTitle;
1252 else
1253 mpSearchView->RemoveItem(pItem->mnId);
1256 else
1258 sal_uInt16 nRegionItemId = mpLocalView->getCurRegionItemId();
1259 std::set<const ThumbnailViewItem*,selection_cmp_fn> aSelTemplates = maSelTemplates; //Avoid invalid iterators
1261 std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
1262 for (pIter = aSelTemplates.begin(); pIter != aSelTemplates.end(); ++pIter)
1264 if (!mpLocalView->removeTemplate((*pIter)->mnId,nRegionItemId))
1266 if (aTemplateList.isEmpty())
1267 aTemplateList = (*pIter)->maTitle;
1268 else
1269 aTemplateList = aTemplateList + "\n" + (*pIter)->maTitle;
1274 if (!aTemplateList.isEmpty())
1276 OUString aMsg( SfxResId(STR_MSG_ERROR_DELETE_TEMPLATE).toString() );
1277 ErrorBox(this, WB_OK,aMsg.replaceFirst("$1",aTemplateList)).Execute();
1281 void SfxTemplateManagerDlg::OnTemplateAsDefault ()
1283 if (!maSelTemplates.empty())
1285 const TemplateViewItem *pItem = static_cast<const TemplateViewItem*>(*(maSelTemplates.begin()));
1287 OUString aServiceName;
1288 if (lcl_getServiceName(pItem->getPath(),aServiceName))
1290 SfxObjectFactory::SetStandardTemplate(aServiceName,pItem->getPath());
1292 createDefaultTemplateMenu();
1297 void SfxTemplateManagerDlg::OnFolderNew()
1299 InputDialog dlg(SfxResId(STR_INPUT_NEW).toString(),this);
1301 int ret = dlg.Execute();
1303 if (ret)
1305 OUString aName = dlg.getEntryText();
1307 mpCurView->createRegion(aName);
1311 void SfxTemplateManagerDlg::OnFolderDelete()
1313 QueryBox aQueryDlg(this, WB_YES_NO | WB_DEF_YES, SfxResId(STR_QMSG_SEL_FOLDER_DELETE).toString());
1315 if ( aQueryDlg.Execute() == RET_NO )
1316 return;
1318 OUString aFolderList;
1320 std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
1321 std::set<const ThumbnailViewItem*,selection_cmp_fn> aSelFolders = maSelFolders; //Copy to avoid invalidating an iterator
1323 for (pIter = aSelFolders.begin(); pIter != aSelFolders.end(); ++pIter)
1325 if (!mpLocalView->removeRegion((*pIter)->mnId))
1327 if (aFolderList.isEmpty())
1328 aFolderList = (*pIter)->maTitle;
1329 else
1330 aFolderList = aFolderList + "\n" + (*pIter)->maTitle;
1332 ++pIter;
1336 if (!aFolderList.isEmpty())
1338 OUString aMsg( SfxResId(STR_MSG_ERROR_DELETE_FOLDER).toString() );
1339 ErrorBox(this, WB_OK,aMsg.replaceFirst("$1",aFolderList)).Execute();
1343 void SfxTemplateManagerDlg::OnRepositoryDelete()
1345 if(deleteRepository(mpRemoteView->getCurRegionId()))
1347 // switch to local view
1348 switchMainView(true);
1350 createRepositoryMenu();
1354 void SfxTemplateManagerDlg::OnTemplateSaveAs()
1356 assert(m_xModel.is());
1358 if (!mpLocalView->isNonRootRegionVisible() && maSelFolders.empty())
1360 ErrorBox(this, WB_OK,SfxResId(STR_MSG_ERROR_SELECT_FOLDER).toString()).Execute();
1361 return;
1364 InputDialog aDlg(SfxResId(STR_INPUT_TEMPLATE_NEW).toString(),this);
1366 if (aDlg.Execute())
1368 OUString aName = aDlg.getEntryText();
1370 if (!aName.isEmpty())
1372 OUString aFolderList;
1373 OUString aQMsg(SfxResId(STR_QMSG_TEMPLATE_OVERWRITE).toString());
1374 QueryBox aQueryDlg(this,WB_YES_NO | WB_DEF_YES, OUString());
1376 if (mpLocalView->isNonRootRegionVisible())
1378 sal_uInt16 nRegionItemId = mpLocalView->getRegionId(mpLocalView->getCurRegionId()-1);
1380 if (!mpLocalView->isTemplateNameUnique(nRegionItemId,aName))
1382 aQMsg = aQMsg.replaceFirst("$1",aName);
1383 aQueryDlg.SetMessText(aQMsg.replaceFirst("$2",mpLocalView->getCurRegionName()));
1385 if (aQueryDlg.Execute() == RET_NO)
1386 return;
1389 if (!mpLocalView->saveTemplateAs(nRegionItemId,m_xModel,aName))
1390 aFolderList = mpLocalView->getCurRegionName();
1392 else
1394 std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
1395 for (pIter = maSelFolders.begin(); pIter != maSelFolders.end(); ++pIter)
1397 TemplateContainerItem *pItem = (TemplateContainerItem*)(*pIter);
1399 if (!mpLocalView->isTemplateNameUnique(pItem->mnId,aName))
1401 OUString aDQMsg = aQMsg.replaceFirst("$1",aName);
1402 aQueryDlg.SetMessText(aDQMsg.replaceFirst("$2",pItem->maTitle));
1404 if (aQueryDlg.Execute() == RET_NO)
1405 continue;
1408 if (!mpLocalView->saveTemplateAs(pItem,m_xModel,aName))
1410 if (aFolderList.isEmpty())
1411 aFolderList = (*pIter)->maTitle;
1412 else
1413 aFolderList = aFolderList + "\n" + (*pIter)->maTitle;
1418 if (!aFolderList.isEmpty())
1425 void SfxTemplateManagerDlg::createRepositoryMenu()
1427 mpRepositoryMenu->Clear();
1429 mpRepositoryMenu->InsertItem(MNI_REPOSITORY_LOCAL,SfxResId(STR_REPOSITORY_LOCAL).toString());
1431 const std::vector<TemplateRepository*> &rRepos = getRepositories();
1433 for (size_t i = 0, n = rRepos.size(); i < n; ++i)
1434 mpRepositoryMenu->InsertItem(MNI_REPOSITORY_BASE+rRepos[i]->mnId,rRepos[i]->maTitle);
1436 mpRepositoryMenu->InsertSeparator();
1437 mpRepositoryMenu->InsertItem(MNI_REPOSITORY_NEW,SfxResId(STR_REPOSITORY_NEW).toString());
1440 void SfxTemplateManagerDlg::createDefaultTemplateMenu ()
1442 std::vector<OUString> aList = lcl_getAllFactoryURLs();
1444 if (!aList.empty())
1446 mpTemplateDefaultMenu->Clear();
1448 sal_uInt16 nItemId = MNI_ACTION_DEFAULT + 1;
1449 for( std::vector<OUString>::const_iterator i = aList.begin(); i != aList.end(); ++i )
1451 INetURLObject aObj(*i);
1452 OUString aTitle = SvFileInformationManager::GetDescription(aObj);
1453 mpTemplateDefaultMenu->InsertItem(nItemId, aTitle, SvFileInformationManager::GetImage(aObj, false));
1454 mpTemplateDefaultMenu->SetItemCommand(nItemId++, *i);
1457 mpActionMenu->ShowItem(MNI_ACTION_DEFAULT);
1459 else
1460 mpActionMenu->HideItem(MNI_ACTION_DEFAULT);
1463 void SfxTemplateManagerDlg::switchMainView(bool bDisplayLocal)
1465 if (bDisplayLocal)
1467 mpCurView = mpLocalView;
1469 mpViewBar->HideItem(TBI_TEMPLATE_FOLDER_DEL);
1471 // Enable deleting and exporting items from the filesystem
1472 mpTemplateBar->ShowItem(TBI_TEMPLATE_EXPORT);
1473 mpTemplateBar->ShowItem(TBI_TEMPLATE_DELETE);
1475 mpRemoteView->Hide();
1476 mpLocalView->Show();
1478 else
1480 mpCurView = mpRemoteView;
1482 mpViewBar->ShowItem(TBI_TEMPLATE_FOLDER_DEL);
1484 // Disable deleting and exporting items from remote repositories
1485 mpTemplateBar->HideItem(TBI_TEMPLATE_EXPORT);
1486 mpTemplateBar->HideItem(TBI_TEMPLATE_DELETE);
1488 mpLocalView->Hide();
1489 mpRemoteView->Show();
1493 void SfxTemplateManagerDlg::localMoveTo(sal_uInt16 nMenuId)
1495 sal_uInt16 nItemId = 0;
1497 if (nMenuId == MNI_MOVE_NEW)
1499 InputDialog dlg(SfxResId(STR_INPUT_NEW).toString(),this);
1501 int ret = dlg.Execute();
1503 if (ret)
1505 OUString aName = dlg.getEntryText();
1507 if (!aName.isEmpty())
1508 nItemId = mpLocalView->createRegion(aName);
1511 else
1513 nItemId = mpLocalView->getRegionId(nMenuId-MNI_MOVE_FOLDER_BASE);
1516 if (nItemId)
1518 // Move templates to desired folder if for some reason move fails
1519 // try copying them.
1520 if (!mpLocalView->moveTemplates(maSelTemplates,nItemId))
1522 OUString aTemplateList;
1524 std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
1525 for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end(); ++pIter)
1527 if (aTemplateList.isEmpty())
1528 aTemplateList = (*pIter)->maTitle;
1529 else
1530 aTemplateList = aTemplateList + "\n" + (*pIter)->maTitle;
1533 OUString aDst = mpLocalView->getRegionItemName(nItemId);
1534 OUString aMsg(SfxResId(STR_MSG_ERROR_LOCAL_MOVE).toString());
1535 aMsg = aMsg.replaceFirst("$1",aDst);
1536 ErrorBox(this, WB_OK,aMsg.replaceFirst( "$2",aTemplateList)).Execute();
1541 void SfxTemplateManagerDlg::remoteMoveTo(const sal_uInt16 nMenuId)
1543 sal_uInt16 nItemId = 0;
1545 if (nMenuId == MNI_MOVE_NEW)
1547 InputDialog dlg(SfxResId(STR_INPUT_NEW).toString(),this);
1549 int ret = dlg.Execute();
1551 if (ret)
1553 OUString aName = dlg.getEntryText();
1555 if (!aName.isEmpty())
1556 nItemId = mpLocalView->createRegion(aName);
1559 else
1561 nItemId = mpLocalView->getRegionId(nMenuId-MNI_MOVE_FOLDER_BASE);
1564 if (nItemId)
1566 OUString aTemplateList;
1568 std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator aIter;
1569 for (aIter = maSelTemplates.begin(); aIter != maSelTemplates.end(); ++aIter)
1571 const TemplateSearchViewItem *pItem =
1572 static_cast<const TemplateSearchViewItem*>(*aIter);
1574 if(!mpLocalView->copyFrom(nItemId,pItem->maPreview1,pItem->getPath()))
1576 if (aTemplateList.isEmpty())
1577 aTemplateList = pItem->maTitle;
1578 else
1579 aTemplateList = aTemplateList + "\n" + pItem->maTitle;
1583 mpLocalView->Invalidate(INVALIDATE_NOERASE);
1585 if (!aTemplateList.isEmpty())
1587 OUString aMsg(SfxResId(STR_MSG_ERROR_REMOTE_MOVE).toString());
1588 aMsg = aMsg.replaceFirst("$1",mpRemoteView->getCurRegionName());
1589 aMsg = aMsg.replaceFirst("$2",mpLocalView->getRegionItemName(nItemId));
1590 ErrorBox(this,WB_OK,aMsg.replaceFirst("$1",aTemplateList)).Execute();
1595 void SfxTemplateManagerDlg::localSearchMoveTo(sal_uInt16 nMenuId)
1597 sal_uInt16 nItemId = 0;
1599 if (nMenuId == MNI_MOVE_NEW)
1601 InputDialog dlg(SfxResId(STR_INPUT_NEW).toString(),this);
1603 int ret = dlg.Execute();
1605 if (ret)
1607 OUString aName = dlg.getEntryText();
1609 if (!aName.isEmpty())
1610 nItemId = mpLocalView->createRegion(aName);
1613 else
1615 nItemId = mpLocalView->getRegionId(nMenuId-MNI_MOVE_FOLDER_BASE);
1618 if (nItemId)
1620 OUString aTemplateList;
1622 // Move templates to desired folder if for some reason move fails
1623 // try copying them.
1624 std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator aIter;
1625 std::set<const ThumbnailViewItem*,selection_cmp_fn> aSelTemplates = maSelTemplates; //Copy to avoid invalidating an iterator
1627 for (aIter = aSelTemplates.begin(); aIter != aSelTemplates.end(); ++aIter)
1629 const TemplateSearchViewItem *pItem =
1630 static_cast<const TemplateSearchViewItem*>(*aIter);
1632 if(!mpLocalView->moveTemplate(pItem,pItem->mnRegionId,nItemId))
1634 if (aTemplateList.isEmpty())
1635 aTemplateList = (*aIter)->maTitle;
1636 else
1637 aTemplateList = aTemplateList + "\n" + (*aIter)->maTitle;
1641 if (!aTemplateList.isEmpty())
1643 OUString aDst = mpLocalView->getRegionItemName(nItemId);
1644 OUString aMsg(SfxResId(STR_MSG_ERROR_LOCAL_MOVE).toString());
1645 aMsg = aMsg.replaceFirst("$1",aDst);
1646 ErrorBox(this, WB_OK,aMsg.replaceFirst( "$2",aTemplateList)).Execute();
1650 // Deselect all items and update search results
1651 mpSearchView->deselectItems();
1653 SearchUpdateHdl(mpSearchEdit);
1656 void SfxTemplateManagerDlg::loadRepositories()
1658 uno::Reference < uno::XComponentContext > m_context(comphelper::getProcessComponentContext());
1660 // Load from user settings
1661 com::sun::star::uno::Sequence<OUString> aUrls =
1662 officecfg::Office::Common::Misc::TemplateRepositoryUrls::get(m_context);
1664 com::sun::star::uno::Sequence<OUString> aNames =
1665 officecfg::Office::Common::Misc::TemplateRepositoryNames::get(m_context);
1667 for (sal_Int32 i = 0; i < aUrls.getLength() && i < aNames.getLength(); ++i)
1669 TemplateRepository *pItem = new TemplateRepository();
1671 pItem->mnId = i+1;
1672 pItem->maTitle = aNames[i];
1673 pItem->setURL(aUrls[i]);
1675 maRepositories.push_back(pItem);
1679 bool SfxTemplateManagerDlg::insertRepository(const OUString &rName, const OUString &rURL)
1681 for (size_t i = 0, n = maRepositories.size(); i < n; ++i)
1683 if (maRepositories[i]->maTitle == rName)
1684 return false;
1687 TemplateRepository *pItem = new TemplateRepository();
1689 pItem->mnId = maRepositories.size()+1;
1690 pItem->maTitle = rName;
1691 pItem->setURL(rURL);
1693 maRepositories.push_back(pItem);
1695 mbIsSynced = false;
1696 return true;
1699 bool SfxTemplateManagerDlg::deleteRepository(const sal_uInt16 nRepositoryId)
1701 bool bRet = false;
1703 for (size_t i = 0, n = maRepositories.size(); i < n; ++i)
1705 if (maRepositories[i]->mnId == nRepositoryId)
1707 delete maRepositories[i];
1709 maRepositories.erase(maRepositories.begin() + i);
1710 mbIsSynced = false;
1711 bRet = true;
1712 break;
1716 return bRet;
1719 void SfxTemplateManagerDlg::syncRepositories() const
1721 if (!mbIsSynced)
1723 uno::Reference < uno::XComponentContext > pContext(comphelper::getProcessComponentContext());
1724 boost::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create(pContext));
1726 size_t nSize = maRepositories.size();
1727 uno::Sequence<OUString> aUrls(nSize);
1728 uno::Sequence<OUString> aNames(nSize);
1730 for(size_t i = 0; i < nSize; ++i)
1732 aUrls[i] = maRepositories[i]->getURL();
1733 aNames[i] = maRepositories[i]->maTitle;
1736 officecfg::Office::Common::Misc::TemplateRepositoryUrls::set(aUrls, batch, pContext);
1737 officecfg::Office::Common::Misc::TemplateRepositoryNames::set(aNames, batch, pContext);
1738 batch->commit();
1742 static bool lcl_getServiceName ( const OUString &rFileURL, OUString &rName )
1744 bool bRet = false;
1746 if ( !rFileURL.isEmpty() )
1750 uno::Reference< embed::XStorage > xStorage =
1751 comphelper::OStorageHelper::GetStorageFromURL( rFileURL, embed::ElementModes::READ );
1753 sal_uIntPtr nFormat = SotStorage::GetFormatID( xStorage );
1755 const SfxFilter* pFilter = SFX_APP()->GetFilterMatcher().GetFilter4ClipBoardId( nFormat );
1757 if ( pFilter )
1759 rName = pFilter->GetServiceName();
1760 bRet = true;
1763 catch( uno::Exception& )
1767 return bRet;
1770 static std::vector<OUString> lcl_getAllFactoryURLs ()
1772 SvtModuleOptions aModOpt;
1773 std::vector<OUString> aList;
1774 const ::com::sun::star::uno::Sequence<OUString> &aServiceNames = aModOpt.GetAllServiceNames();
1776 for( sal_Int32 i=0, nCount = aServiceNames.getLength(); i < nCount; ++i )
1778 if ( SfxObjectFactory::GetStandardTemplate( aServiceNames[i] ).Len() > 0 )
1780 SvtModuleOptions::EFactory eFac = SvtModuleOptions::E_WRITER;
1781 SvtModuleOptions::ClassifyFactoryByName( aServiceNames[i], eFac );
1782 aList.push_back(aModOpt.GetFactoryEmptyDocumentURL(eFac));
1786 return aList;
1789 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */