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 <sfx2/templatedlg.hxx>
12 #include <sfx2/inputdlg.hxx>
13 #include <templatesearchview.hxx>
14 #include <templatesearchviewitem.hxx>
16 #include <comphelper/processfactory.hxx>
17 #include <comphelper/propertysequence.hxx>
18 #include <comphelper/string.hxx>
19 #include <comphelper/storagehelper.hxx>
20 #include <sfx2/app.hxx>
21 #include <sfx2/docfac.hxx>
22 #include <sfx2/docfilt.hxx>
23 #include <sfx2/fcontnr.hxx>
24 #include <sfx2/filedlghelper.hxx>
25 #include <sfx2/objsh.hxx>
26 #include <sfx2/sfxresid.hxx>
27 #include <sfx2/templatelocalview.hxx>
28 #include <templatecontaineritem.hxx>
29 #include <templateviewitem.hxx>
30 #include <sfx2/thumbnailviewitem.hxx>
31 #include <sot/storage.hxx>
32 #include <svtools/imagemgr.hxx>
33 #include <svtools/langhelp.hxx>
34 #include <tools/urlobj.hxx>
35 #include <unotools/moduleoptions.hxx>
36 #include <unotools/pathoptions.hxx>
37 #include <unotools/viewoptions.hxx>
38 #include <vcl/event.hxx>
39 #include <vcl/mnemonic.hxx>
40 #include <vcl/svapp.hxx>
41 #include <vcl/weld.hxx>
43 #include <com/sun/star/beans/NamedValue.hpp>
44 #include <com/sun/star/beans/PropertyValue.hpp>
45 #include <com/sun/star/configuration/theDefaultProvider.hpp>
46 #include <com/sun/star/document/MacroExecMode.hpp>
47 #include <com/sun/star/document/UpdateDocMode.hpp>
48 #include <com/sun/star/embed/XStorage.hpp>
49 #include <com/sun/star/embed/ElementModes.hpp>
50 #include <com/sun/star/frame/Desktop.hpp>
51 #include <com/sun/star/frame/XStorable.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/system/SystemShellExecute.hpp>
57 #include <com/sun/star/system/SystemShellExecuteFlags.hpp>
58 #include <com/sun/star/task/InteractionHandler.hpp>
59 #include <comphelper/dispatchcommand.hxx>
61 #include <sfx2/strings.hrc>
62 #include <bitmaps.hlst>
64 const char TM_SETTING_MANAGER
[] = "TemplateManager";
65 const char TM_SETTING_LASTFOLDER
[] = "LastFolder";
66 const char TM_SETTING_LASTAPPLICATION
[] = "LastApplication";
68 #define MNI_ACTION_NEW_FOLDER "new"
69 #define MNI_ACTION_RENAME_FOLDER "rename"
70 #define MNI_ACTION_DELETE_FOLDER "delete"
71 #define MNI_ACTION_REFRESH "refresh"
72 #define MNI_ACTION_DEFAULT "default"
78 using namespace ::com::sun::star
;
79 using namespace ::com::sun::star::beans
;
80 using namespace ::com::sun::star::embed
;
81 using namespace ::com::sun::star::frame
;
82 using namespace ::com::sun::star::lang
;
83 using namespace ::com::sun::star::uno
;
84 using namespace ::com::sun::star::ui::dialogs
;
85 using namespace ::com::sun::star::document
;
87 static bool lcl_getServiceName (const OUString
&rFileURL
, OUString
&rName
);
89 static std::vector
<OUString
> lcl_getAllFactoryURLs ();
93 class SearchView_Keyword
97 SearchView_Keyword (const OUString
&rKeyword
, FILTER_APPLICATION App
)
98 : maKeyword(rKeyword
.toAsciiLowerCase()), meApp(App
)
101 bool operator() (const TemplateItemProperties
&rItem
)
105 INetURLObject
aUrl(rItem
.aPath
);
106 OUString aExt
= aUrl
.getExtension();
108 if (meApp
== FILTER_APPLICATION::WRITER
)
110 bRet
= aExt
== "ott" || aExt
== "stw" || aExt
== "oth" || aExt
== "dot" || aExt
== "dotx";
112 else if (meApp
== FILTER_APPLICATION::CALC
)
114 bRet
= aExt
== "ots" || aExt
== "stc" || aExt
== "xlt" || aExt
== "xltm" || aExt
== "xltx";
116 else if (meApp
== FILTER_APPLICATION::IMPRESS
)
118 bRet
= aExt
== "otp" || aExt
== "sti" || aExt
== "pot" || aExt
== "potm" || aExt
== "potx";
120 else if (meApp
== FILTER_APPLICATION::DRAW
)
122 bRet
= aExt
== "otg" || aExt
== "std";
125 return bRet
&& MatchSubstring(rItem
.aName
);
128 bool MatchSubstring( OUString
const & sItemName
)
130 if(maKeyword
.isEmpty())
132 return sItemName
.toAsciiLowerCase().indexOf(maKeyword
) >= 0;
138 FILTER_APPLICATION meApp
;
145 * Order items in ascending order (useful for the selection sets and move/copy operations since the associated ids
146 * change when processed by the SfxDocumentTemplates class so we want to process to ones with higher id first)
150 static bool cmpSelectionItems (const ThumbnailViewItem
*pItem1
, const ThumbnailViewItem
*pItem2
)
152 return pItem1
->mnId
> pItem2
->mnId
;
155 SfxTemplateManagerDlg::SfxTemplateManagerDlg(weld::Window
*pParent
)
156 : GenericDialogController(pParent
, "sfx/ui/templatedlg.ui", "TemplateDialog")
157 , maSelTemplates(cmpSelectionItems
)
158 , mxDesktop(Desktop::create(comphelper::getProcessComponentContext()))
159 , m_aUpdateDataTimer("UpdateDataTimer")
160 , mxSearchFilter(m_xBuilder
->weld_entry("search_filter"))
161 , mxCBApp(m_xBuilder
->weld_combo_box("filter_application"))
162 , mxCBFolder(m_xBuilder
->weld_combo_box("filter_folder"))
163 , mxOKButton(m_xBuilder
->weld_button("ok"))
164 , mxMoveButton(m_xBuilder
->weld_button("move_btn"))
165 , mxExportButton(m_xBuilder
->weld_button("export_btn"))
166 , mxImportButton(m_xBuilder
->weld_button("import_btn"))
167 , mxMoreTemplatesButton(m_xBuilder
->weld_button("btnMoreTemplates"))
168 , mxCBXHideDlg(m_xBuilder
->weld_check_button("hidedialogcb"))
169 , mxActionBar(m_xBuilder
->weld_menu_button("action_menu"))
170 , mxSearchView(new TemplateSearchView(m_xBuilder
->weld_scrolled_window("scrollsearch", true),
171 m_xBuilder
->weld_menu("contextmenu1")))
172 , mxLocalView(new TemplateLocalView(m_xBuilder
->weld_scrolled_window("scrolllocal", true),
173 m_xBuilder
->weld_menu("contextmenu2")))
174 , mxTemplateDefaultMenu(m_xBuilder
->weld_menu("submenu"))
175 , mxSearchViewWeld(new weld::CustomWeld(*m_xBuilder
, "search_view", *mxSearchView
))
176 , mxLocalViewWeld(new weld::CustomWeld(*m_xBuilder
, "template_view", *mxLocalView
))
178 // Create popup menus
179 mxActionBar
->insert_item(0, MNI_ACTION_NEW_FOLDER
, SfxResId(STR_CATEGORY_NEW
), nullptr, nullptr, TRISTATE_INDET
);
180 mxActionBar
->insert_item(1, MNI_ACTION_RENAME_FOLDER
, SfxResId(STR_CATEGORY_RENAME
), nullptr, nullptr, TRISTATE_INDET
);
181 mxActionBar
->insert_item(2, MNI_ACTION_DELETE_FOLDER
, SfxResId(STR_CATEGORY_DELETE
), nullptr, nullptr, TRISTATE_INDET
);
182 mxActionBar
->insert_separator(3, "separator");
183 mxActionBar
->insert_item(4, MNI_ACTION_REFRESH
, SfxResId(STR_ACTION_REFRESH
), nullptr, nullptr, TRISTATE_INDET
);
184 mxActionBar
->connect_selected(LINK(this,SfxTemplateManagerDlg
,MenuSelectHdl
));
186 mxLocalView
->setItemMaxTextLength(TEMPLATE_ITEM_MAX_TEXT_LENGTH
);
187 mxLocalView
->setItemDimensions(TEMPLATE_ITEM_MAX_WIDTH
,TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT
,
188 TEMPLATE_ITEM_MAX_HEIGHT
-TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT
,
189 TEMPLATE_ITEM_PADDING
);
191 mxLocalView
->setItemStateHdl(LINK(this,SfxTemplateManagerDlg
,TVItemStateHdl
));
192 mxLocalView
->setCreateContextMenuHdl(LINK(this,SfxTemplateManagerDlg
, CreateContextMenuHdl
));
193 mxLocalView
->setOpenRegionHdl(LINK(this,SfxTemplateManagerDlg
, OpenRegionHdl
));
194 mxLocalView
->setOpenTemplateHdl(LINK(this,SfxTemplateManagerDlg
, OpenTemplateHdl
));
195 mxLocalView
->setEditTemplateHdl(LINK(this,SfxTemplateManagerDlg
, EditTemplateHdl
));
196 mxLocalView
->setDeleteTemplateHdl(LINK(this,SfxTemplateManagerDlg
, DeleteTemplateHdl
));
197 mxLocalView
->setDefaultTemplateHdl(LINK(this,SfxTemplateManagerDlg
, DefaultTemplateHdl
));
199 mxSearchView
->setItemMaxTextLength(TEMPLATE_ITEM_MAX_TEXT_LENGTH
);
201 mxSearchView
->setItemDimensions(TEMPLATE_ITEM_MAX_WIDTH
,TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT
,
202 TEMPLATE_ITEM_MAX_HEIGHT_SUB
-TEMPLATE_ITEM_THUMBNAIL_MAX_HEIGHT
,
203 TEMPLATE_ITEM_PADDING
);
205 mxSearchView
->setItemStateHdl(LINK(this,SfxTemplateManagerDlg
,TVItemStateHdl
));
206 mxSearchView
->setCreateContextMenuHdl(LINK(this,SfxTemplateManagerDlg
, CreateContextMenuHdl
));
207 mxSearchView
->setOpenTemplateHdl(LINK(this,SfxTemplateManagerDlg
,OpenTemplateHdl
));
208 mxSearchView
->setEditTemplateHdl(LINK(this,SfxTemplateManagerDlg
, EditTemplateHdl
));
209 mxSearchView
->setDeleteTemplateHdl(LINK(this,SfxTemplateManagerDlg
, DeleteTemplateHdl
));
210 mxSearchView
->setDefaultTemplateHdl(LINK(this,SfxTemplateManagerDlg
, DefaultTemplateHdl
));
212 mxLocalView
->ShowTooltips(true);
213 mxSearchView
->ShowTooltips(true);
215 mxOKButton
->connect_clicked(LINK(this, SfxTemplateManagerDlg
, OkClickHdl
));
216 mxMoveButton
->connect_clicked(LINK(this, SfxTemplateManagerDlg
, MoveClickHdl
));
217 mxExportButton
->connect_clicked(LINK(this, SfxTemplateManagerDlg
, ExportClickHdl
));
218 mxImportButton
->connect_clicked(LINK(this, SfxTemplateManagerDlg
, ImportClickHdl
));
219 mxMoreTemplatesButton
->connect_clicked(LINK(this, SfxTemplateManagerDlg
, LinkClickHdl
));
221 mxSearchFilter
->connect_changed(LINK(this, SfxTemplateManagerDlg
, SearchUpdateHdl
));
222 mxSearchFilter
->connect_focus_in(LINK( this, SfxTemplateManagerDlg
, GetFocusHdl
));
223 mxSearchFilter
->connect_focus_out(LINK( this, SfxTemplateManagerDlg
, LoseFocusHdl
));
224 mxSearchFilter
->connect_key_press(LINK( this, SfxTemplateManagerDlg
, KeyInputHdl
));
228 createDefaultTemplateMenu();
230 mxLocalView
->Populate();
231 mxLocalView
->filterItems(ViewFilter_Application(FILTER_APPLICATION::NONE
));
233 mxCBApp
->set_active(0);
234 fillFolderComboBox();
236 mxExportButton
->set_sensitive(false);
237 mxMoveButton
->set_sensitive(false);
238 mxOKButton
->set_label(SfxResId(STR_OPEN
));
240 mxCBApp
->connect_changed(LINK(this, SfxTemplateManagerDlg
, SelectApplicationHdl
));
241 mxCBFolder
->connect_changed(LINK(this, SfxTemplateManagerDlg
, SelectRegionHdl
));
245 m_aUpdateDataTimer
.SetInvokeHandler(LINK(this, SfxTemplateManagerDlg
, ImplUpdateDataHdl
));
246 m_aUpdateDataTimer
.SetDebugName( "SfxTemplateManagerDlg UpdateDataTimer" );
247 m_aUpdateDataTimer
.SetTimeout(EDIT_UPDATEDATA_TIMEOUT
);
250 SfxTemplateManagerDlg::~SfxTemplateManagerDlg()
254 // Ignore view events since we are cleaning the object
255 mxLocalView
->setItemStateHdl(Link
<const ThumbnailViewItem
*,void>());
256 mxLocalView
->setOpenRegionHdl(Link
<void*,void>());
257 mxLocalView
->setOpenTemplateHdl(Link
<ThumbnailViewItem
*, void>());
258 mxSearchView
->setItemStateHdl(Link
<const ThumbnailViewItem
*,void>());
259 mxSearchView
->setOpenTemplateHdl(Link
<ThumbnailViewItem
*, void>());
262 short SfxTemplateManagerDlg::run()
264 //use application specific settings if there's no previous setting
265 getApplicationSpecificSettings();
268 return weld::GenericDialogController::run();
271 IMPL_LINK(SfxTemplateManagerDlg
, KeyInputHdl
, const KeyEvent
&, rKeyEvent
, bool)
273 if (mxSearchFilter
!= nullptr && !mxSearchFilter
->get_text().isEmpty())
275 vcl::KeyCode aKeyCode
= rKeyEvent
.GetKeyCode();
276 sal_uInt16 nKeyCode
= aKeyCode
.GetCode();
278 if ( nKeyCode
== KEY_ESCAPE
)
280 mxSearchFilter
->set_text("");
281 SearchUpdateHdl(*mxSearchFilter
);
288 void SfxTemplateManagerDlg::setDocumentModel(const uno::Reference
<frame::XModel
> &rModel
)
293 FILTER_APPLICATION
SfxTemplateManagerDlg::getCurrentApplicationFilter() const
295 const sal_Int16 nCurAppId
= mxCBApp
->get_active();
297 if (nCurAppId
== MNI_WRITER
)
298 return FILTER_APPLICATION::WRITER
;
299 else if (nCurAppId
== MNI_IMPRESS
)
300 return FILTER_APPLICATION::IMPRESS
;
301 else if (nCurAppId
== MNI_CALC
)
302 return FILTER_APPLICATION::CALC
;
303 else if (nCurAppId
== MNI_DRAW
)
304 return FILTER_APPLICATION::DRAW
;
306 return FILTER_APPLICATION::NONE
;
309 void SfxTemplateManagerDlg::fillFolderComboBox()
311 std::vector
<OUString
> aFolderNames
= mxLocalView
->getFolderNames();
313 for (size_t i
= 0, n
= aFolderNames
.size(); i
< n
; ++i
)
314 mxCBFolder
->append_text(aFolderNames
[i
]);
315 mxCBFolder
->set_active(0);
316 mxActionBar
->set_item_visible(MNI_ACTION_RENAME_FOLDER
, false);
319 void SfxTemplateManagerDlg::getApplicationSpecificSettings()
321 if ( ! m_xModel
.is() )
323 mxCBApp
->set_active(0);
324 mxCBFolder
->set_active(0);
325 mxActionBar
->set_item_visible(MNI_ACTION_RENAME_FOLDER
, false);
326 mxLocalView
->filterItems(ViewFilter_Application(getCurrentApplicationFilter()));
327 mxLocalView
->showAllTemplates();
331 SvtModuleOptions::EFactory eFactory
= SvtModuleOptions::ClassifyFactoryByModel(m_xModel
);
335 case SvtModuleOptions::EFactory::WRITER
:
336 case SvtModuleOptions::EFactory::WRITERWEB
:
337 case SvtModuleOptions::EFactory::WRITERGLOBAL
:
338 mxCBApp
->set_active(MNI_WRITER
);
340 case SvtModuleOptions::EFactory::CALC
:
341 mxCBApp
->set_active(MNI_CALC
);
343 case SvtModuleOptions::EFactory::IMPRESS
:
344 mxCBApp
->set_active(MNI_IMPRESS
);
346 case SvtModuleOptions::EFactory::DRAW
:
347 mxCBApp
->set_active(MNI_DRAW
);
350 mxCBApp
->set_active(0);
354 mxLocalView
->filterItems(ViewFilter_Application(getCurrentApplicationFilter()));
355 mxCBFolder
->set_active(0);
356 mxActionBar
->set_item_visible(MNI_ACTION_RENAME_FOLDER
, false);
357 mxLocalView
->showAllTemplates();
360 void SfxTemplateManagerDlg::readSettings ()
362 OUString aLastFolder
;
363 SvtViewOptions
aViewSettings( EViewType::Dialog
, TM_SETTING_MANAGER
);
365 if ( aViewSettings
.Exists() )
368 aViewSettings
.GetUserItem(TM_SETTING_LASTFOLDER
) >>= aLastFolder
;
369 aViewSettings
.GetUserItem(TM_SETTING_LASTAPPLICATION
) >>= nTmp
;
371 //open last remembered application only when application model is not set
377 mxCBApp
->set_active(MNI_WRITER
);
380 mxCBApp
->set_active(MNI_CALC
);
383 mxCBApp
->set_active(MNI_IMPRESS
);
386 mxCBApp
->set_active(MNI_DRAW
);
389 mxCBApp
->set_active(0);
395 mxLocalView
->filterItems(ViewFilter_Application(getCurrentApplicationFilter()));
397 if (aLastFolder
.isEmpty())
399 //show all categories
400 mxCBFolder
->set_active(0);
401 mxActionBar
->set_item_visible(MNI_ACTION_RENAME_FOLDER
, false);
402 mxLocalView
->showAllTemplates();
406 mxCBFolder
->set_active_text(aLastFolder
);
407 mxLocalView
->showRegion(aLastFolder
);
408 mxActionBar
->set_item_visible(MNI_ACTION_RENAME_FOLDER
, true);
412 void SfxTemplateManagerDlg::writeSettings ()
414 OUString aLastFolder
;
416 if (mxLocalView
->getCurRegionId())
417 aLastFolder
= mxLocalView
->getRegionName(mxLocalView
->getCurRegionId()-1);
420 Sequence
< NamedValue
> aSettings
422 { TM_SETTING_LASTFOLDER
, css::uno::makeAny(aLastFolder
) },
423 { TM_SETTING_LASTAPPLICATION
, css::uno::makeAny(sal_uInt16(mxCBApp
->get_active())) }
427 SvtViewOptions
aViewSettings(EViewType::Dialog
, TM_SETTING_MANAGER
);
428 aViewSettings
.SetUserData(aSettings
);
431 IMPL_LINK_NOARG(SfxTemplateManagerDlg
, SelectApplicationHdl
, weld::ComboBox
&, void)
433 if (mxLocalView
->IsVisible())
435 mxLocalView
->filterItems(ViewFilter_Application(getCurrentApplicationFilter()));
436 mxLocalView
->showAllTemplates();
437 mxCBFolder
->set_active(0);
438 mxActionBar
->set_item_visible(MNI_ACTION_RENAME_FOLDER
, false);
440 if (mxSearchView
->IsVisible())
444 IMPL_LINK_NOARG(SfxTemplateManagerDlg
, SelectRegionHdl
, weld::ComboBox
&, void)
446 const OUString sSelectedRegion
= mxCBFolder
->get_active_text();
448 if(mxCBFolder
->get_active() == 0)
450 mxLocalView
->showAllTemplates();
451 mxActionBar
->set_item_visible(MNI_ACTION_RENAME_FOLDER
, false);
455 mxLocalView
->showRegion(sSelectedRegion
);
456 mxActionBar
->set_item_visible(MNI_ACTION_RENAME_FOLDER
, true);
458 if (mxSearchView
->IsVisible())
462 IMPL_LINK(SfxTemplateManagerDlg
, TVItemStateHdl
, const ThumbnailViewItem
*, pItem
, void)
464 const TemplateViewItem
*pViewItem
= dynamic_cast<const TemplateViewItem
*>(pItem
);
467 OnTemplateState(pItem
);
470 IMPL_LINK(SfxTemplateManagerDlg
, MenuSelectHdl
, const OString
&, rIdent
, void)
472 if (rIdent
== MNI_ACTION_NEW_FOLDER
)
474 else if (rIdent
== MNI_ACTION_RENAME_FOLDER
)
476 else if (rIdent
== MNI_ACTION_DELETE_FOLDER
)
478 else if (rIdent
== MNI_ACTION_REFRESH
)
480 mxLocalView
->reload();
481 if(mxSearchView
->IsVisible())
482 SearchUpdateHdl(*mxSearchFilter
);
484 else if (rIdent
!= MNI_ACTION_DEFAULT
)
485 DefaultTemplateMenuSelectHdl(rIdent
);
488 void SfxTemplateManagerDlg::DefaultTemplateMenuSelectHdl(const OString
& rIdent
)
490 OUString aServiceName
= SfxObjectShell::GetServiceNameFromFactory(OUString::fromUtf8(rIdent
));
492 OUString sPrevDefault
= SfxObjectFactory::GetStandardTemplate( aServiceName
);
493 if(!sPrevDefault
.isEmpty())
495 if(mxSearchView
->IsVisible())
496 mxSearchView
->RemoveDefaultTemplateIcon(sPrevDefault
);
498 mxLocalView
->RemoveDefaultTemplateIcon(sPrevDefault
);
501 SfxObjectFactory::SetStandardTemplate( aServiceName
, OUString() );
503 createDefaultTemplateMenu();
506 IMPL_LINK_NOARG(SfxTemplateManagerDlg
, OkClickHdl
, weld::Button
&, void)
509 m_xDialog
->response(RET_OK
);
512 IMPL_LINK_NOARG(SfxTemplateManagerDlg
, MoveClickHdl
, weld::Button
&, void)
514 // modal dialog to select templates category
515 SfxTemplateCategoryDialog
aDlg(m_xDialog
.get());
516 aDlg
.SetCategoryLBEntries(mxLocalView
->getFolderNames());
520 if (aDlg
.run() == RET_OK
)
522 const OUString
& sCategory
= aDlg
.GetSelectedCategory();
523 bool bIsNewCategory
= aDlg
.IsNewCategoryCreated();
526 if (!sCategory
.isEmpty())
528 nItemId
= mxLocalView
->createRegion(sCategory
);
530 mxCBFolder
->append_text(sCategory
);
534 nItemId
= mxLocalView
->getRegionId(sCategory
);
539 if (mxSearchView
->IsVisible())
540 localSearchMoveTo(nItemId
);
542 localMoveTo(nItemId
);
545 mxLocalView
->reload();
548 IMPL_LINK_NOARG(SfxTemplateManagerDlg
, ExportClickHdl
, weld::Button
&, void)
553 IMPL_LINK_NOARG(SfxTemplateManagerDlg
, ImportClickHdl
, weld::Button
&, void)
555 //Modal Dialog to select Category
556 SfxTemplateCategoryDialog
aDlg(m_xDialog
.get());
557 aDlg
.SetCategoryLBEntries(mxLocalView
->getFolderNames());
559 if (aDlg
.run() == RET_OK
)
561 const OUString
& sCategory
= aDlg
.GetSelectedCategory();
562 bool bIsNewCategory
= aDlg
.IsNewCategoryCreated();
565 if(mxLocalView
->createRegion(sCategory
))
567 mxCBFolder
->append_text(sCategory
);
568 OnTemplateImportCategory(sCategory
);
572 OUString
aMsg( SfxResId(STR_CREATE_ERROR
) );
573 std::unique_ptr
<weld::MessageDialog
> xBox(Application::CreateMessageDialog(m_xDialog
.get(),
574 VclMessageType::Warning
, VclButtonsType::Ok
,
575 aMsg
.replaceFirst("$1", sCategory
)));
581 OnTemplateImportCategory(sCategory
);
584 mxLocalView
->reload();
585 mxLocalView
->showAllTemplates();
586 mxCBApp
->set_active(0);
587 mxCBFolder
->set_active(0);
588 mxActionBar
->set_item_visible(MNI_ACTION_RENAME_FOLDER
, false);
591 IMPL_STATIC_LINK_NOARG(SfxTemplateManagerDlg
, LinkClickHdl
, weld::Button
&, void)
593 uno::Sequence
<beans::PropertyValue
> aArgs(1);
594 aArgs
[0].Name
= "AdditionsTag";
595 aArgs
[0].Value
<<= OUString("Templates");
596 comphelper::dispatchCommand(".uno:AdditionsDialog", aArgs
);
599 IMPL_LINK_NOARG(SfxTemplateManagerDlg
, OpenRegionHdl
, void*, void)
601 maSelTemplates
.clear();
602 mxOKButton
->set_sensitive(false);
606 IMPL_LINK(SfxTemplateManagerDlg
, CreateContextMenuHdl
, ThumbnailViewItem
*, pItem
, void)
608 const TemplateViewItem
*pViewItem
= dynamic_cast<TemplateViewItem
*>(pItem
);
612 if (mxSearchView
->IsVisible())
613 mxSearchView
->createContextMenu(pViewItem
->IsDefaultTemplate());
615 mxLocalView
->createContextMenu(pViewItem
->IsDefaultTemplate());
619 IMPL_LINK(SfxTemplateManagerDlg
, OpenTemplateHdl
, ThumbnailViewItem
*, pItem
, void)
621 uno::Sequence
< PropertyValue
> aArgs(5);
622 aArgs
[0].Name
= "AsTemplate";
623 aArgs
[0].Value
<<= true;
624 aArgs
[1].Name
= "MacroExecutionMode";
625 aArgs
[1].Value
<<= MacroExecMode::USE_CONFIG
;
626 aArgs
[2].Name
= "UpdateDocMode";
627 aArgs
[2].Value
<<= UpdateDocMode::ACCORDING_TO_CONFIG
;
628 aArgs
[3].Name
= "InteractionHandler";
629 aArgs
[3].Value
<<= task::InteractionHandler::createWithParent( ::comphelper::getProcessComponentContext(), nullptr );
630 aArgs
[4].Name
= "ReadOnly";
631 aArgs
[4].Value
<<= true;
633 TemplateViewItem
*pTemplateItem
= static_cast<TemplateViewItem
*>(pItem
);
637 mxDesktop
->loadComponentFromURL(pTemplateItem
->getPath(),"_default", 0, aArgs
);
639 catch( const uno::Exception
& )
643 m_xDialog
->response(RET_OK
);
646 IMPL_LINK(SfxTemplateManagerDlg
, EditTemplateHdl
, ThumbnailViewItem
*, pItem
, void)
648 uno::Sequence
< PropertyValue
> aArgs(3);
649 aArgs
[0].Name
= "AsTemplate";
650 aArgs
[0].Value
<<= false;
651 aArgs
[1].Name
= "MacroExecutionMode";
652 aArgs
[1].Value
<<= MacroExecMode::USE_CONFIG
;
653 aArgs
[2].Name
= "UpdateDocMode";
654 aArgs
[2].Value
<<= UpdateDocMode::ACCORDING_TO_CONFIG
;
656 uno::Reference
< XStorable
> xStorable
;
657 TemplateViewItem
*pViewItem
= static_cast<TemplateViewItem
*>(pItem
);
661 xStorable
.set( mxDesktop
->loadComponentFromURL(pViewItem
->getPath(),"_default", 0, aArgs
),
664 catch( const uno::Exception
& )
668 m_xDialog
->response(RET_OK
);
671 IMPL_LINK(SfxTemplateManagerDlg
, DeleteTemplateHdl
, ThumbnailViewItem
*, pItem
, void)
673 OUString aDeletedTemplate
;
674 if(mxSearchView
->IsVisible())
676 TemplateSearchViewItem
*pSrchItem
= static_cast<TemplateSearchViewItem
*>(pItem
);
678 if (!mxLocalView
->removeTemplate(pSrchItem
->mnAssocId
, pSrchItem
->mnRegionId
))
680 aDeletedTemplate
= pSrchItem
->maTitle
;
685 TemplateViewItem
*pViewItem
= static_cast<TemplateViewItem
*>(pItem
);
686 sal_uInt16 nRegionItemId
= mxLocalView
->getRegionId(pViewItem
->mnRegionId
);
688 if (!mxLocalView
->removeTemplate(pViewItem
->mnDocId
+ 1, nRegionItemId
))//mnId w.r.t. region is mnDocId + 1;
690 aDeletedTemplate
= pItem
->maTitle
;
694 if (!aDeletedTemplate
.isEmpty())
696 OUString
aMsg( SfxResId(STR_MSG_ERROR_DELETE_TEMPLATE
) );
697 std::unique_ptr
<weld::MessageDialog
> xBox(Application::CreateMessageDialog(m_xDialog
.get(),
698 VclMessageType::Warning
, VclButtonsType::Ok
,
699 aMsg
.replaceFirst("$1",aDeletedTemplate
)));
704 IMPL_LINK(SfxTemplateManagerDlg
, DefaultTemplateHdl
, ThumbnailViewItem
*, pItem
, void)
706 TemplateViewItem
*pViewItem
= static_cast<TemplateViewItem
*>(pItem
);
707 OUString aServiceName
;
709 if(!pViewItem
->IsDefaultTemplate())
711 if (lcl_getServiceName(pViewItem
->getPath(),aServiceName
))
713 OUString sPrevDefault
= SfxObjectFactory::GetStandardTemplate( aServiceName
);
714 if(!sPrevDefault
.isEmpty())
716 if(mxSearchView
->IsVisible())
717 mxSearchView
->RemoveDefaultTemplateIcon(sPrevDefault
);
719 mxLocalView
->RemoveDefaultTemplateIcon(sPrevDefault
);
721 SfxObjectFactory::SetStandardTemplate(aServiceName
,pViewItem
->getPath());
722 pViewItem
->showDefaultIcon(true);
727 if(lcl_getServiceName(pViewItem
->getPath(),aServiceName
))
729 SfxObjectFactory::SetStandardTemplate( aServiceName
, OUString() );
730 pViewItem
->showDefaultIcon(false);
734 createDefaultTemplateMenu();
737 IMPL_LINK_NOARG(SfxTemplateManagerDlg
, SearchUpdateHdl
, weld::Entry
&, void)
739 m_aUpdateDataTimer
.Start();
742 IMPL_LINK_NOARG(SfxTemplateManagerDlg
, ImplUpdateDataHdl
, Timer
*, void)
747 IMPL_LINK_NOARG(SfxTemplateManagerDlg
, LoseFocusHdl
, weld::Widget
&, void)
749 if (m_aUpdateDataTimer
.IsActive())
751 m_aUpdateDataTimer
.Stop();
752 m_aUpdateDataTimer
.Invoke();
756 void SfxTemplateManagerDlg::SearchUpdate()
758 OUString aKeyword
= mxSearchFilter
->get_text();
760 if (!aKeyword
.isEmpty())
762 mxSearchView
->Clear();
764 // if the search view is hidden, hide the folder view and display search one
765 if (!mxSearchView
->IsVisible())
767 mxLocalView
->deselectItems();
768 mxSearchView
->Show();
772 std::vector
<TemplateItemProperties
> aItems
=
773 mxLocalView
->getFilteredItems(SearchView_Keyword(aKeyword
, getCurrentApplicationFilter()));
775 for (const TemplateItemProperties
& rItem
: aItems
)
777 OUString aFolderName
= mxLocalView
->getRegionName(rItem
.nRegionId
);
779 mxSearchView
->AppendItem(rItem
.nId
,mxLocalView
->getRegionId(rItem
.nRegionId
),
787 mxSearchView
->Invalidate();
791 mxSearchView
->deselectItems();
792 mxSearchView
->Hide();
794 mxLocalView
->filterItems(ViewFilter_Application(getCurrentApplicationFilter()));
795 mxLocalView
->reload();
796 OUString sLastFolder
= mxCBFolder
->get_active_text();
797 mxLocalView
->showRegion(sLastFolder
);
798 mxActionBar
->set_item_visible(MNI_ACTION_RENAME_FOLDER
, true);
802 IMPL_LINK_NOARG(SfxTemplateManagerDlg
, GetFocusHdl
, weld::Widget
&, void)
804 mxLocalView
->deselectItems();
805 mxSearchView
->deselectItems();
807 maSelTemplates
.clear();
810 void SfxTemplateManagerDlg::OnTemplateState (const ThumbnailViewItem
*pItem
)
812 bool bInSelection
= maSelTemplates
.find(pItem
) != maSelTemplates
.end();
814 if (pItem
->isSelected())
816 if (maSelTemplates
.empty())
818 mxOKButton
->set_sensitive(true);
820 else if (maSelTemplates
.size() != 1 || !bInSelection
)
822 mxOKButton
->set_sensitive(false);
826 maSelTemplates
.insert(pItem
);
832 maSelTemplates
.erase(pItem
);
834 if (maSelTemplates
.empty())
836 mxOKButton
->set_sensitive(false);
838 else if (maSelTemplates
.size() == 1)
840 mxOKButton
->set_sensitive(true);
845 if(maSelTemplates
.empty())
847 mxMoveButton
->set_sensitive(false);
848 mxExportButton
->set_sensitive(false);
852 mxMoveButton
->set_sensitive(true);
853 mxExportButton
->set_sensitive(true);
857 void SfxTemplateManagerDlg::OnTemplateImportCategory(const OUString
& sCategory
)
859 sfx2::FileDialogHelper
aFileDlg(css::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE
,
860 FileDialogFlags::MultiSelection
, m_xDialog
.get());
863 aFileDlg
.AddFilter( SfxResId(STR_SFX_FILTERNAME_ALL
),
864 FILEDIALOG_FILTER_ALL
);
866 // add template filter
868 OUString
sFilterName( SfxResId( STR_TEMPLATE_FILTER
) );
870 // add filters of modules which are installed
871 SvtModuleOptions aModuleOpt
;
872 if ( aModuleOpt
.IsModuleInstalled( SvtModuleOptions::EModule::WRITER
) )
873 sFilterExt
+= "*.ott;*.stw;*.oth;*.dotx;*.dot";
875 if ( aModuleOpt
.IsModuleInstalled( SvtModuleOptions::EModule::CALC
) )
877 if ( !sFilterExt
.isEmpty() )
880 sFilterExt
+= "*.ots;*.stc;*.xltx;*.xlt";
883 if ( aModuleOpt
.IsModuleInstalled( SvtModuleOptions::EModule::IMPRESS
) )
885 if ( !sFilterExt
.isEmpty() )
888 sFilterExt
+= "*.otp;*.sti;*.pot;*.potx";
891 if ( aModuleOpt
.IsModuleInstalled( SvtModuleOptions::EModule::DRAW
) )
893 if ( !sFilterExt
.isEmpty() )
896 sFilterExt
+= "*.otg;*.std";
899 if ( !sFilterExt
.isEmpty() )
902 sFilterExt
+= "*.vor";
904 sFilterName
+= " (" + sFilterExt
+ ")";
906 aFileDlg
.AddFilter( sFilterName
, sFilterExt
);
907 aFileDlg
.SetCurrentFilter( sFilterName
);
909 ErrCode nCode
= aFileDlg
.Execute();
911 if ( nCode
!= ERRCODE_NONE
)
914 const css::uno::Sequence
<OUString
> aFiles
= aFileDlg
.GetSelectedFiles();
916 if (!aFiles
.hasElements())
919 //Import to the selected regions
920 TemplateContainerItem
* pContItem
= mxLocalView
->getRegion(sCategory
);
924 OUString aTemplateList
;
926 for (const auto& rFile
: aFiles
)
928 if(!mxLocalView
->copyFrom(pContItem
, rFile
))
930 if (aTemplateList
.isEmpty())
931 aTemplateList
= rFile
;
933 aTemplateList
+= "\n" + rFile
;
937 if (!aTemplateList
.isEmpty())
939 OUString
aMsg(SfxResId(STR_MSG_ERROR_IMPORT
));
940 aMsg
= aMsg
.replaceFirst("$1",pContItem
->maTitle
);
941 std::unique_ptr
<weld::MessageDialog
> xBox(Application::CreateMessageDialog(m_xDialog
.get(),
942 VclMessageType::Warning
, VclButtonsType::Ok
,
943 aMsg
.replaceFirst("$2",aTemplateList
)));
948 void SfxTemplateManagerDlg::OnTemplateExport()
950 uno::Reference
<XComponentContext
> xContext(comphelper::getProcessComponentContext());
951 uno::Reference
<XFolderPicker2
> xFolderPicker
= FolderPicker::create(xContext
);
953 xFolderPicker
->setDisplayDirectory(SvtPathOptions().GetWorkPath());
955 sal_Int16 nResult
= xFolderPicker
->execute();
956 sal_Int16 nCount
= maSelTemplates
.size();
958 if( nResult
!= ExecutableDialogResults::OK
)
961 OUString aTemplateList
;
962 INetURLObject
aPathObj(xFolderPicker
->getDirectory());
963 aPathObj
.setFinalSlash();
965 if (mxSearchView
->IsVisible())
969 for (auto const& selTemplate
: maSelTemplates
)
971 const TemplateSearchViewItem
*pItem
= static_cast<const TemplateSearchViewItem
*>(selTemplate
);
973 INetURLObject
aItemPath(pItem
->getPath());
976 aPathObj
.Append(aItemPath
.getName());
978 aPathObj
.setName(aItemPath
.getName());
980 OUString aPath
= aPathObj
.GetMainURL( INetURLObject::DecodeMechanism::NONE
);
982 if (!mxLocalView
->exportTo(pItem
->mnAssocId
,pItem
->mnRegionId
,aPath
))
984 if (aTemplateList
.isEmpty())
985 aTemplateList
= pItem
->maTitle
;
987 aTemplateList
+= "\n" + pItem
->maTitle
;
992 mxSearchView
->deselectItems();
996 // export templates from the current view
1000 for (auto const& selTemplate
: maSelTemplates
)
1002 const TemplateViewItem
*pItem
= static_cast<const TemplateViewItem
*>(selTemplate
);
1004 INetURLObject
aItemPath(pItem
->getPath());
1007 aPathObj
.Append(aItemPath
.getName());
1009 aPathObj
.setName(aItemPath
.getName());
1011 OUString aPath
= aPathObj
.GetMainURL( INetURLObject::DecodeMechanism::NONE
);
1013 if (!mxLocalView
->exportTo(pItem
->mnDocId
+ 1, //mnId w.r.t. region = mDocId + 1
1014 mxLocalView
->getRegionId(pItem
->mnRegionId
), //pItem->mnRegionId does not store actual region Id
1017 if (aTemplateList
.isEmpty())
1018 aTemplateList
= pItem
->maTitle
;
1020 aTemplateList
+= "\n" + pItem
->maTitle
;
1025 mxLocalView
->deselectItems();
1028 if (!aTemplateList
.isEmpty())
1030 OUString
aText( SfxResId(STR_MSG_ERROR_EXPORT
) );
1031 std::unique_ptr
<weld::MessageDialog
> xBox(Application::CreateMessageDialog(m_xDialog
.get(),
1032 VclMessageType::Warning
, VclButtonsType::Ok
,
1033 aText
.replaceFirst("$1",aTemplateList
)));
1038 OUString
sText( SfxResId(STR_MSG_EXPORT_SUCCESS
) );
1039 std::unique_ptr
<weld::MessageDialog
> xBox(Application::CreateMessageDialog(m_xDialog
.get(),
1040 VclMessageType::Info
, VclButtonsType::Ok
,
1041 sText
.replaceFirst("$1", OUString::number(nCount
))));
1046 void SfxTemplateManagerDlg::OnTemplateOpen ()
1048 ThumbnailViewItem
*pItem
= const_cast<ThumbnailViewItem
*>(*maSelTemplates
.begin());
1050 OpenTemplateHdl(pItem
);
1053 void SfxTemplateManagerDlg::OnCategoryNew()
1055 InputDialog
dlg(m_xDialog
.get(), SfxResId(STR_INPUT_NEW
));
1057 int ret
= dlg
.run();
1062 OUString aName
= dlg
.GetEntryText();
1064 if(mxLocalView
->createRegion(aName
))
1065 mxCBFolder
->append_text(aName
);
1068 OUString
aMsg( SfxResId(STR_CREATE_ERROR
) );
1069 std::unique_ptr
<weld::MessageDialog
> xBox(Application::CreateMessageDialog(m_xDialog
.get(),
1070 VclMessageType::Warning
, VclButtonsType::Ok
,
1071 aMsg
.replaceFirst("$1", aName
)));
1076 void SfxTemplateManagerDlg::OnCategoryRename()
1078 OUString sCategory
= mxCBFolder
->get_active_text();
1079 InputDialog
dlg(m_xDialog
.get(), SfxResId(STR_INPUT_NEW
));
1081 dlg
.SetEntryText(sCategory
);
1082 int ret
= dlg
.run();
1087 OUString aName
= dlg
.GetEntryText();
1089 if(mxLocalView
->renameRegion(sCategory
, aName
))
1091 sal_Int32 nPos
= mxCBFolder
->find_text(sCategory
);
1092 mxCBFolder
->remove(nPos
);
1093 mxCBFolder
->insert_text(nPos
, aName
);
1094 mxCBFolder
->set_active(nPos
);
1096 mxLocalView
->reload();
1097 mxLocalView
->showRegion(aName
);
1101 OUString
aMsg( SfxResId(STR_CREATE_ERROR
) );
1102 std::unique_ptr
<weld::MessageDialog
> xBox(Application::CreateMessageDialog(m_xDialog
.get(),
1103 VclMessageType::Warning
, VclButtonsType::Ok
,
1104 aMsg
.replaceFirst("$1", aName
)));
1109 void SfxTemplateManagerDlg::OnCategoryDelete()
1111 SfxTemplateCategoryDialog
aDlg(m_xDialog
.get());
1112 aDlg
.SetCategoryLBEntries(mxLocalView
->getFolderNames());
1113 aDlg
.HideNewCategoryOption();
1114 aDlg
.set_title(MnemonicGenerator::EraseAllMnemonicChars(SfxResId(STR_CATEGORY_DELETE
)));
1115 aDlg
.SetSelectLabelText(SfxResId(STR_CATEGORY_SELECT
));
1117 if (aDlg
.run() == RET_OK
)
1119 const OUString
& sCategory
= aDlg
.GetSelectedCategory();
1120 std::unique_ptr
<weld::MessageDialog
> popupDlg(Application::CreateMessageDialog(m_xDialog
.get(),
1121 VclMessageType::Question
, VclButtonsType::YesNo
,
1122 SfxResId(STR_QMSG_SEL_FOLDER_DELETE
)));
1123 if (popupDlg
->run() != RET_YES
)
1126 sal_Int16 nItemId
= mxLocalView
->getRegionId(sCategory
);
1128 if (!mxLocalView
->removeRegion(nItemId
))
1130 OUString
sMsg( SfxResId(STR_MSG_ERROR_DELETE_FOLDER
) );
1131 std::unique_ptr
<weld::MessageDialog
> xBox(Application::CreateMessageDialog(m_xDialog
.get(),
1132 VclMessageType::Warning
, VclButtonsType::Ok
,
1133 sMsg
.replaceFirst("$1",sCategory
)));
1138 mxCBFolder
->remove_text(sCategory
);
1142 mxLocalView
->reload();
1143 mxLocalView
->showAllTemplates();
1144 mxCBApp
->set_active(0);
1145 mxCBFolder
->set_active(0);
1146 mxActionBar
->set_item_visible(MNI_ACTION_RENAME_FOLDER
, false);
1149 void SfxTemplateManagerDlg::createDefaultTemplateMenu ()
1151 std::vector
<OUString
> aList
= lcl_getAllFactoryURLs();
1155 mxTemplateDefaultMenu
->clear();
1157 for (auto const& elem
: aList
)
1159 INetURLObject
aObj(elem
);
1160 OUString aTitle
= SvFileInformationManager::GetDescription(aObj
);
1161 mxTemplateDefaultMenu
->append(elem
, aTitle
, SvFileInformationManager::GetImageId(aObj
));
1164 mxActionBar
->set_item_visible(MNI_ACTION_DEFAULT
, true);
1167 mxActionBar
->set_item_visible(MNI_ACTION_DEFAULT
, false);
1170 void SfxTemplateManagerDlg::localMoveTo(sal_uInt16 nItemId
)
1174 // Move templates to desired folder if for some reason move fails
1175 // try copying them.
1176 mxLocalView
->moveTemplates(maSelTemplates
,nItemId
);
1180 void SfxTemplateManagerDlg::localSearchMoveTo(sal_uInt16 nItemId
)
1184 // Move templates to desired folder if for some reason move fails
1185 // try copying them.
1186 std::set
<const ThumbnailViewItem
*,selection_cmp_fn
> aSelTemplates
= maSelTemplates
; //Copy to avoid invalidating an iterator
1188 for (auto const& selTemplate
: aSelTemplates
)
1190 const TemplateSearchViewItem
*pItem
=
1191 static_cast<const TemplateSearchViewItem
*>(selTemplate
);
1193 if(!mxLocalView
->moveTemplate(pItem
,pItem
->mnRegionId
,nItemId
))
1195 OUString sDst
= mxLocalView
->getRegionItemName(nItemId
);
1196 OUString
sMsg(SfxResId(STR_MSG_ERROR_LOCAL_MOVE
));
1197 sMsg
= sMsg
.replaceFirst("$1",sDst
);
1198 std::unique_ptr
<weld::MessageDialog
> xBox(Application::CreateMessageDialog(m_xDialog
.get(),
1199 VclMessageType::Warning
, VclButtonsType::Ok
,
1200 sMsg
.replaceFirst( "$2",pItem
->maTitle
)));
1206 // Deselect all items and update search results
1207 mxSearchView
->deselectItems();
1209 SearchUpdateHdl(*mxSearchFilter
);
1212 static bool lcl_getServiceName ( const OUString
&rFileURL
, OUString
&rName
)
1216 if ( !rFileURL
.isEmpty() )
1220 uno::Reference
< embed::XStorage
> xStorage
=
1221 comphelper::OStorageHelper::GetStorageFromURL( rFileURL
, embed::ElementModes::READ
);
1223 SotClipboardFormatId nFormat
= SotStorage::GetFormatID( xStorage
);
1225 std::shared_ptr
<const SfxFilter
> pFilter
= SfxGetpApp()->GetFilterMatcher().GetFilter4ClipBoardId( nFormat
);
1229 rName
= pFilter
->GetServiceName();
1233 catch( uno::Exception
& )
1240 static std::vector
<OUString
> lcl_getAllFactoryURLs ()
1242 SvtModuleOptions aModOpt
;
1243 std::vector
<OUString
> aList
;
1244 const css::uno::Sequence
<OUString
> &aServiceNames
= aModOpt
.GetAllServiceNames();
1246 for( const auto& rServiceName
: aServiceNames
)
1248 if ( ! SfxObjectFactory::GetStandardTemplate( rServiceName
).isEmpty() )
1250 SvtModuleOptions::EFactory eFac
= SvtModuleOptions::EFactory::WRITER
;
1251 SvtModuleOptions::ClassifyFactoryByName( rServiceName
, eFac
);
1252 aList
.push_back(aModOpt
.GetFactoryEmptyDocumentURL(eFac
));
1260 // Class SfxTemplateCategoryDialog --------------------------------------------------
1262 SfxTemplateCategoryDialog::SfxTemplateCategoryDialog(weld::Window
* pParent
)
1263 : GenericDialogController(pParent
, "sfx/ui/templatecategorydlg.ui", "TemplatesCategoryDialog")
1264 , msSelectedCategory(OUString())
1265 , mbIsNewCategory(false)
1266 , mxLBCategory(m_xBuilder
->weld_tree_view("categorylb"))
1267 , mxSelectLabel(m_xBuilder
->weld_label("select_label"))
1268 , mxNewCategoryEdit(m_xBuilder
->weld_entry("category_entry"))
1269 , mxCreateLabel(m_xBuilder
->weld_label("create_label"))
1270 , mxOKButton(m_xBuilder
->weld_button("ok"))
1272 mxLBCategory
->append_text(SfxResId(STR_CATEGORY_NONE
));
1273 mxNewCategoryEdit
->connect_changed(LINK(this, SfxTemplateCategoryDialog
, NewCategoryEditHdl
));
1274 mxLBCategory
->set_size_request(mxLBCategory
->get_approximate_digit_width() * 32,
1275 mxLBCategory
->get_height_rows(8));
1276 mxLBCategory
->connect_changed(LINK(this, SfxTemplateCategoryDialog
, SelectCategoryHdl
));
1277 mxOKButton
->set_sensitive(false);
1280 SfxTemplateCategoryDialog::~SfxTemplateCategoryDialog()
1284 IMPL_LINK_NOARG(SfxTemplateCategoryDialog
, NewCategoryEditHdl
, weld::Entry
&, void)
1286 OUString sParam
= comphelper::string::strip(mxNewCategoryEdit
->get_text(), ' ');
1287 mxLBCategory
->set_sensitive(sParam
.isEmpty());
1288 if(!sParam
.isEmpty())
1290 msSelectedCategory
= sParam
;
1291 mbIsNewCategory
= true;
1292 mxOKButton
->set_sensitive(true);
1296 SelectCategoryHdl(*mxLBCategory
);
1297 mbIsNewCategory
= false;
1301 IMPL_LINK_NOARG(SfxTemplateCategoryDialog
, SelectCategoryHdl
, weld::TreeView
&, void)
1303 if (mxLBCategory
->get_selected_index() == 0)
1305 msSelectedCategory
= OUString();
1306 mxOKButton
->set_sensitive(false);
1307 mxNewCategoryEdit
->set_sensitive(true);
1311 msSelectedCategory
= mxLBCategory
->get_selected_text();
1312 mxNewCategoryEdit
->set_sensitive(false);
1313 mxOKButton
->set_sensitive(true);
1316 mbIsNewCategory
= false;
1319 void SfxTemplateCategoryDialog::SetCategoryLBEntries(std::vector
<OUString
> aFolderNames
)
1321 for (size_t i
= 0, n
= aFolderNames
.size(); i
< n
; ++i
)
1322 mxLBCategory
->append_text(aFolderNames
[i
]);
1323 mxLBCategory
->select(0);
1326 void SfxTemplateCategoryDialog::HideNewCategoryOption()
1328 mxCreateLabel
->hide();
1329 mxNewCategoryEdit
->hide();
1332 // SfxTemplateSelectionDialog -----------------------------------------------------------------
1334 SfxTemplateSelectionDlg::SfxTemplateSelectionDlg(weld::Window
* pParent
)
1335 : SfxTemplateManagerDlg(pParent
)
1336 , msTemplatePath(OUString())
1338 mxCBApp
->set_active(MNI_IMPRESS
);
1339 mxCBFolder
->set_active(0);
1340 m_xDialog
->set_title(SfxResId(STR_TEMPLATE_SELECTION
));
1342 if (mxLocalView
->IsVisible())
1344 mxLocalView
->filterItems(ViewFilter_Application(getCurrentApplicationFilter()));
1345 mxLocalView
->showAllTemplates();
1348 mxCBApp
->set_sensitive(false);
1349 mxActionBar
->hide();
1350 mxMoveButton
->hide();
1351 mxExportButton
->hide();
1352 mxCBXHideDlg
->show();
1353 mxCBXHideDlg
->set_active(true);
1355 mxLocalView
->setOpenTemplateHdl(LINK(this,SfxTemplateSelectionDlg
, OpenTemplateHdl
));
1356 mxSearchView
->setOpenTemplateHdl(LINK(this,SfxTemplateSelectionDlg
, OpenTemplateHdl
));
1358 mxSearchView
->SetMultiSelectionEnabled(false);
1360 mxOKButton
->connect_clicked(LINK(this, SfxTemplateSelectionDlg
, OkClickHdl
));
1363 SfxTemplateSelectionDlg::~SfxTemplateSelectionDlg()
1368 short SfxTemplateSelectionDlg::run()
1370 // tdf#124597 at startup this dialog is launched before its parent window
1371 // has taken its final size. The parent size request is processed during
1372 // the dialogs event loop so configure this dialog to center to
1373 // the parents pending geometry request
1374 m_xDialog
->set_centered_on_parent(true);
1376 // tdf#125079 toggle off the size tracking at some future idle point
1377 maIdle
.SetPriority(TaskPriority::LOWEST
);
1378 maIdle
.SetInvokeHandler(LINK(this,SfxTemplateSelectionDlg
,TimeOut
));
1381 return weld::GenericDialogController::run();
1384 IMPL_LINK_NOARG(SfxTemplateSelectionDlg
, TimeOut
, Timer
*, void)
1386 m_xDialog
->set_centered_on_parent(false);
1389 IMPL_LINK(SfxTemplateSelectionDlg
, OpenTemplateHdl
, ThumbnailViewItem
*, pItem
, void)
1391 TemplateViewItem
*pViewItem
= static_cast<TemplateViewItem
*>(pItem
);
1392 msTemplatePath
= pViewItem
->getPath();
1394 m_xDialog
->response(RET_OK
);
1397 IMPL_LINK_NOARG(SfxTemplateSelectionDlg
, OkClickHdl
, weld::Button
&, void)
1399 TemplateViewItem
*pViewItem
= static_cast<TemplateViewItem
*>(const_cast<ThumbnailViewItem
*>(*maSelTemplates
.begin()));
1400 msTemplatePath
= pViewItem
->getPath();
1402 m_xDialog
->response(RET_OK
);
1405 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */