1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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/.
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>
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
85 bool operator() (const ThumbnailViewItem
*pItem1
, const ThumbnailViewItem
*pItem2
)
87 return (pItem1
->maTitle
.compareTo(pItem2
->maTitle
) < 0);
91 class SearchView_Keyword
95 SearchView_Keyword (const OUString
&rKeyword
, FILTER_APPLICATION App
)
96 : maKeyword(rKeyword
), meApp(App
)
99 bool operator() (const TemplateItemProperties
&rItem
)
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
);
129 FILTER_APPLICATION meApp
;
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)
139 static bool cmpSelectionItems (const ThumbnailViewItem
*pItem1
, const ThumbnailViewItem
*pItem2
)
141 return pItem1
->mnId
> pItem2
->mnId
;
144 class TemplateManagerPage
: public TabPage
147 FixedText maFixedText
;
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
),
168 mxDesktop( Desktop::create(comphelper::getProcessComponentContext()) ),
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());
255 switchMainView(true);
259 createRepositoryMenu();
260 createDefaultTemplateMenu();
262 mpLocalView
->Populate();
263 mpCurView
->filterItems(ViewFilter_Application(FILTER_APP_WRITER
));
272 SfxTemplateManagerDlg::~SfxTemplateManagerDlg ()
276 // Synchronize the config before deleting it
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());
296 delete mpTemplateBar
;
300 delete mpTemplateDefaultMenu
;
302 delete mpRepositoryMenu
;
305 void SfxTemplateManagerDlg::setSaveMode(bool bMode
)
307 mbIsSaveMode
= bMode
;
308 maTabControl
.Clear();
309 mpCurView
->filterItems(ViewFilter_Application(FILTER_APP_NONE
));
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
);
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
)
339 IMPL_LINK_NOARG(SfxTemplateManagerDlg
,ActivatePageHdl
)
341 FILTER_APPLICATION eFilter
= FILTER_APP_NONE
;
342 switch (maTabControl
.GetCurPageId())
345 eFilter
= FILTER_APP_WRITER
;
347 case FILTER_PRESENTATIONS
:
348 eFilter
= FILTER_APP_IMPRESS
;
351 eFilter
= FILTER_APP_CALC
;
354 eFilter
= FILTER_APP_DRAW
;
357 mpCurView
->filterItems(ViewFilter_Application(eFilter
));
359 if (mpSearchView
->IsVisible())
360 SearchUpdateHdl(NULL
);
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
;
379 case FILTER_APP_WRITER
:
380 nPageId
= FILTER_DOCS
;
382 case FILTER_APP_IMPRESS
:
383 nPageId
= FILTER_PRESENTATIONS
;
385 case FILTER_APP_CALC
:
386 nPageId
= FILTER_SHEETS
;
388 case FILTER_APP_DRAW
:
389 nPageId
= FILTER_DRAWS
;
394 if (!aLastFolder
.getLength())
395 mpLocalView
->showRootRegion();
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);
412 aSettings
[0].Name
= TM_SETTING_LASTFOLDER
;
413 aSettings
[0].Value
<<= aLastFolder
;
415 sal_uInt16 nFilter
= FILTER_APP_WRITER
;
416 switch (maTabControl
.GetCurPageId())
419 nFilter
= FILTER_APP_WRITER
;
421 case FILTER_PRESENTATIONS
:
422 nFilter
= FILTER_APP_IMPRESS
;
425 nFilter
= FILTER_APP_CALC
;
428 nFilter
= FILTER_APP_DRAW
;
432 aSettings
[1].Name
= TM_SETTING_FILTER
;
433 aSettings
[1].Value
<<= nFilter
;
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
);
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
:
495 case TBI_TEMPLATE_FOLDER_DEL
:
496 if (mpCurView
== mpLocalView
)
499 OnRepositoryDelete();
501 case TBI_TEMPLATE_FOLDER_NEW
:
504 case TBI_TEMPLATE_SAVE
:
514 IMPL_LINK_NOARG(SfxTemplateManagerDlg
,TBXActionHdl
)
516 switch(mpActionBar
->GetCurItemId())
518 case TBI_TEMPLATE_SEARCH
:
528 IMPL_LINK_NOARG(SfxTemplateManagerDlg
,TBXTemplateHdl
)
530 switch(mpTemplateBar
->GetCurItemId())
532 case TBI_TEMPLATE_OPEN
:
535 case TBI_TEMPLATE_EDIT
:
538 case TBI_TEMPLATE_PROPERTIES
:
539 OnTemplateProperties();
541 case TBI_TEMPLATE_DELETE
:
544 case TBI_TEMPLATE_DEFAULT
:
545 OnTemplateAsDefault();
547 case TBI_TEMPLATE_EXPORT
:
557 IMPL_LINK(SfxTemplateManagerDlg
, TBXDropdownHdl
, ToolBox
*, pBox
)
559 const sal_uInt16 nCurItemId
= pBox
->GetCurItemId();
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();
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
));
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
);
597 pBox
->SetItemDown( nCurItemId
, false );
598 pBox
->EndSelection();
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();
619 IMPL_LINK(SfxTemplateManagerDlg
, TVItemStateHdl
, const ThumbnailViewItem
*, pItem
)
621 const TemplateContainerItem
*pCntItem
= dynamic_cast<const TemplateContainerItem
*>(pItem
);
624 OnRegionState(pItem
);
626 OnTemplateState(pItem
);
631 IMPL_LINK(SfxTemplateManagerDlg
, MenuSelectHdl
, Menu
*, pMenu
)
633 sal_uInt16 nMenuId
= pMenu
->GetCurItemId();
637 case MNI_ACTION_SORT_NAME
:
638 mpLocalView
->sortItems(SortView_Name());
640 case MNI_ACTION_REFRESH
:
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
);
662 // Check if we are displaying the local or remote templates
663 if (mpCurView
== mpLocalView
)
664 localMoveTo(nMenuId
);
666 remoteMoveTo(nMenuId
);
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);
686 boost::shared_ptr
<Place
> pPlace
= dlg
.GetPlace();
688 if (insertRepository(pPlace
->GetName(),pPlace
->GetUrl()))
690 // update repository list menu.
691 createRepositoryMenu();
695 OUString
aMsg(SfxResId(STR_MSG_ERROR_REPOSITORY_NAME
).toString());
696 aMsg
= aMsg
.replaceFirst("$1",pPlace
->GetName());
697 ErrorBox(this,WB_OK
,aMsg
).Execute();
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
];
716 if (mpRemoteView
->loadRepository(pRepository
,false))
717 switchMainView(false);
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();
735 IMPL_LINK_NOARG(SfxTemplateManagerDlg
, OpenRegionHdl
)
737 maSelFolders
.clear();
738 maSelTemplates
.clear();
740 mpViewBar
->ShowItem(TBI_TEMPLATE_FOLDER_NEW
,mpCurView
->isNestedRegionAllowed());
743 mpViewBar
->ShowItem(TBI_TEMPLATE_IMPORT
,mpCurView
->isImportAllowed());
745 mpTemplateBar
->Hide();
752 IMPL_LINK(SfxTemplateManagerDlg
, OpenTemplateHdl
, ThumbnailViewItem
*, pItem
)
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
& )
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();
798 bool bDisplayFolder
= !mpCurView
->isNonRootRegionVisible();
800 FILTER_APPLICATION eFilter
= FILTER_APP_NONE
;
801 switch (maTabControl
.GetCurPageId())
804 eFilter
= FILTER_APP_WRITER
;
806 case FILTER_PRESENTATIONS
:
807 eFilter
= FILTER_APP_IMPRESS
;
810 eFilter
= FILTER_APP_CALC
;
813 eFilter
= FILTER_APP_DRAW
;
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
;
827 aFolderName
= mpLocalView
->getRegionName(pItem
->nRegionId
);
829 mpSearchView
->AppendItem(pItem
->nId
,mpLocalView
->getRegionId(pItem
->nRegionId
),
837 mpSearchView
->Invalidate();
841 mpSearchView
->Hide();
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
);
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
)
889 mpTemplateBar
->HideItem(TBI_TEMPLATE_OPEN
);
890 mpTemplateBar
->HideItem(TBI_TEMPLATE_EDIT
);
891 mpTemplateBar
->HideItem(TBI_TEMPLATE_PROPERTIES
);
892 mpTemplateBar
->HideItem(TBI_TEMPLATE_DEFAULT
);
896 mpTemplateBar
->HideItem(TBI_TEMPLATE_SAVE
);
897 mpTemplateBar
->HideItem(TBI_TEMPLATE_PROPERTIES
);
898 mpTemplateBar
->HideItem(TBI_TEMPLATE_DEFAULT
);
903 maSelTemplates
.insert(pItem
);
909 maSelTemplates
.erase(pItem
);
911 if (maSelTemplates
.empty())
913 mpTemplateBar
->Show(false);
916 else if (maSelTemplates
.size() == 1)
920 mpTemplateBar
->ShowItem(TBI_TEMPLATE_OPEN
);
921 mpTemplateBar
->ShowItem(TBI_TEMPLATE_EDIT
);
922 mpTemplateBar
->ShowItem(TBI_TEMPLATE_PROPERTIES
);
923 mpTemplateBar
->ShowItem(TBI_TEMPLATE_DEFAULT
);
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
);
944 aFileDlg
.AddFilter( String(SfxResId( STR_SFX_FILTERNAME_ALL
) ),
945 OUString(FILEDIALOG_FILTER_ALL
) );
947 // add template filter
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() )
961 sFilterExt
+= "*.ots;*.stc";
964 if ( aModuleOpt
.IsModuleInstalled( SvtModuleOptions::E_SIMPRESS
) )
966 if ( !sFilterExt
.isEmpty() )
969 sFilterExt
+= "*.otp;*.sti";
972 if ( aModuleOpt
.IsModuleInstalled( SvtModuleOptions::E_SDRAW
) )
974 if ( !sFilterExt
.isEmpty() )
977 sFilterExt
+= "*.otg;*.std";
980 if ( !sFilterExt
.isEmpty() )
983 sFilterExt
+= "*.vor";
986 sFilterName
+= sFilterExt
;
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
];
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
));
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
];
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())
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());
1083 aPathObj
.Append(aItemPath
.getName());
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
;
1094 aTemplateList
= aTemplateList
+ "\n" + pItem
->maTitle
;
1098 mpSearchView
->deselectItems();
1102 // export templates from the current view
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());
1115 aPathObj
.Append(aItemPath
.getName());
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
;
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();
1150 aWinSize
.setHeight(aWinSize
.getHeight() - nEditHeight
);
1151 aPos
.setY(aPos
.getY() - nEditHeight
);
1152 mpActionBar
->SetItemState(TBI_TEMPLATE_SEARCH
,STATE_NOCHECK
);
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
);
1169 mpSearchView
->deselectItems();
1170 mpSearchView
->Hide();
1174 mpSearchEdit
->Show(!bVisible
);
1175 mpSearchEdit
->SetText(OUString());
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
),
1209 catch( const uno::Exception
& )
1217 void SfxTemplateManagerDlg::OnTemplateProperties ()
1219 const TemplateViewItem
*pItem
= static_cast<const TemplateViewItem
*>(*maSelTemplates
.begin());
1221 SfxTemplateInfoDlg aDlg
;
1222 aDlg
.loadDocument(pItem
->getPath());
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
)
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
;
1250 aTemplateList
= aTemplateList
+ "\n" + pItem
->maTitle
;
1253 mpSearchView
->RemoveItem(pItem
->mnId
);
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
;
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();
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
)
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
;
1330 aFolderList
= aFolderList
+ "\n" + (*pIter
)->maTitle
;
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();
1364 InputDialog
aDlg(SfxResId(STR_INPUT_TEMPLATE_NEW
).toString(),this);
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
)
1389 if (!mpLocalView
->saveTemplateAs(nRegionItemId
,m_xModel
,aName
))
1390 aFolderList
= mpLocalView
->getCurRegionName();
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
)
1408 if (!mpLocalView
->saveTemplateAs(pItem
,m_xModel
,aName
))
1410 if (aFolderList
.isEmpty())
1411 aFolderList
= (*pIter
)->maTitle
;
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();
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
);
1460 mpActionMenu
->HideItem(MNI_ACTION_DEFAULT
);
1463 void SfxTemplateManagerDlg::switchMainView(bool 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();
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();
1505 OUString aName
= dlg
.getEntryText();
1507 if (!aName
.isEmpty())
1508 nItemId
= mpLocalView
->createRegion(aName
);
1513 nItemId
= mpLocalView
->getRegionId(nMenuId
-MNI_MOVE_FOLDER_BASE
);
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
;
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();
1553 OUString aName
= dlg
.getEntryText();
1555 if (!aName
.isEmpty())
1556 nItemId
= mpLocalView
->createRegion(aName
);
1561 nItemId
= mpLocalView
->getRegionId(nMenuId
-MNI_MOVE_FOLDER_BASE
);
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
;
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();
1607 OUString aName
= dlg
.getEntryText();
1609 if (!aName
.isEmpty())
1610 nItemId
= mpLocalView
->createRegion(aName
);
1615 nItemId
= mpLocalView
->getRegionId(nMenuId
-MNI_MOVE_FOLDER_BASE
);
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
;
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();
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
)
1687 TemplateRepository
*pItem
= new TemplateRepository();
1689 pItem
->mnId
= maRepositories
.size()+1;
1690 pItem
->maTitle
= rName
;
1691 pItem
->setURL(rURL
);
1693 maRepositories
.push_back(pItem
);
1699 bool SfxTemplateManagerDlg::deleteRepository(const sal_uInt16 nRepositoryId
)
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
);
1719 void SfxTemplateManagerDlg::syncRepositories() const
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
);
1742 static bool lcl_getServiceName ( const OUString
&rFileURL
, OUString
&rName
)
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
);
1759 rName
= pFilter
->GetServiceName();
1763 catch( uno::Exception
& )
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
));
1789 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */