nss: upgrade to release 3.73
[LibreOffice.git] / sfx2 / source / doc / templatedlg.cxx
blob26787f0d2ac95abb331831f131baf49ac7478f4a
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 <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"
73 #define MNI_WRITER 1
74 #define MNI_CALC 2
75 #define MNI_IMPRESS 3
76 #define MNI_DRAW 4
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 ();
91 namespace {
93 class SearchView_Keyword
95 public:
97 SearchView_Keyword (const OUString &rKeyword, FILTER_APPLICATION App)
98 : maKeyword(rKeyword.toAsciiLowerCase()), meApp(App)
101 bool operator() (const TemplateItemProperties &rItem)
103 bool bRet = true;
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())
131 return false;
132 return sItemName.toAsciiLowerCase().indexOf(maKeyword) >= 0;
135 private:
137 OUString maKeyword;
138 FILTER_APPLICATION meApp;
143 /***
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)
148 ***/
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));
226 mxActionBar->show();
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));
243 mxLocalView->Show();
245 m_aUpdateDataTimer.SetInvokeHandler(LINK(this, SfxTemplateManagerDlg, ImplUpdateDataHdl));
246 m_aUpdateDataTimer.SetDebugName( "SfxTemplateManagerDlg UpdateDataTimer" );
247 m_aUpdateDataTimer.SetTimeout(EDIT_UPDATEDATA_TIMEOUT);
250 SfxTemplateManagerDlg::~SfxTemplateManagerDlg()
252 writeSettings();
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();
266 readSettings();
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);
282 return true;
285 return false;
288 void SfxTemplateManagerDlg::setDocumentModel(const uno::Reference<frame::XModel> &rModel)
290 m_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();
328 return;
331 SvtModuleOptions::EFactory eFactory = SvtModuleOptions::ClassifyFactoryByModel(m_xModel);
333 switch(eFactory)
335 case SvtModuleOptions::EFactory::WRITER:
336 case SvtModuleOptions::EFactory::WRITERWEB:
337 case SvtModuleOptions::EFactory::WRITERGLOBAL:
338 mxCBApp->set_active(MNI_WRITER);
339 break;
340 case SvtModuleOptions::EFactory::CALC:
341 mxCBApp->set_active(MNI_CALC);
342 break;
343 case SvtModuleOptions::EFactory::IMPRESS:
344 mxCBApp->set_active(MNI_IMPRESS);
345 break;
346 case SvtModuleOptions::EFactory::DRAW:
347 mxCBApp->set_active(MNI_DRAW);
348 break;
349 default:
350 mxCBApp->set_active(0);
351 break;
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() )
367 sal_uInt16 nTmp = 0;
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
372 if(!m_xModel.is())
374 switch (nTmp)
376 case MNI_WRITER:
377 mxCBApp->set_active(MNI_WRITER);
378 break;
379 case MNI_CALC:
380 mxCBApp->set_active(MNI_CALC);
381 break;
382 case MNI_IMPRESS:
383 mxCBApp->set_active(MNI_IMPRESS);
384 break;
385 case MNI_DRAW:
386 mxCBApp->set_active(MNI_DRAW);
387 break;
388 default:
389 mxCBApp->set_active(0);
390 break;
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();
404 else
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);
419 // last folder
420 Sequence< NamedValue > aSettings
422 { TM_SETTING_LASTFOLDER, css::uno::makeAny(aLastFolder) },
423 { TM_SETTING_LASTAPPLICATION, css::uno::makeAny(sal_uInt16(mxCBApp->get_active())) }
426 // write
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())
441 SearchUpdate();
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);
453 else
455 mxLocalView->showRegion(sSelectedRegion);
456 mxActionBar->set_item_visible(MNI_ACTION_RENAME_FOLDER, true);
458 if (mxSearchView->IsVisible())
459 SearchUpdate();
462 IMPL_LINK(SfxTemplateManagerDlg, TVItemStateHdl, const ThumbnailViewItem*, pItem, void)
464 const TemplateViewItem *pViewItem = dynamic_cast<const TemplateViewItem*>(pItem);
466 if (pViewItem)
467 OnTemplateState(pItem);
470 IMPL_LINK(SfxTemplateManagerDlg, MenuSelectHdl, const OString&, rIdent, void)
472 if (rIdent == MNI_ACTION_NEW_FOLDER)
473 OnCategoryNew();
474 else if (rIdent == MNI_ACTION_RENAME_FOLDER)
475 OnCategoryRename();
476 else if (rIdent == MNI_ACTION_DELETE_FOLDER)
477 OnCategoryDelete();
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);
497 else
498 mxLocalView->RemoveDefaultTemplateIcon(sPrevDefault);
501 SfxObjectFactory::SetStandardTemplate( aServiceName, OUString() );
503 createDefaultTemplateMenu();
506 IMPL_LINK_NOARG(SfxTemplateManagerDlg, OkClickHdl, weld::Button&, void)
508 OnTemplateOpen();
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());
518 size_t nItemId = 0;
520 if (aDlg.run() == RET_OK)
522 const OUString& sCategory = aDlg.GetSelectedCategory();
523 bool bIsNewCategory = aDlg.IsNewCategoryCreated();
524 if(bIsNewCategory)
526 if (!sCategory.isEmpty())
528 nItemId = mxLocalView->createRegion(sCategory);
529 if(nItemId)
530 mxCBFolder->append_text(sCategory);
533 else
534 nItemId = mxLocalView->getRegionId(sCategory);
537 if(nItemId)
539 if (mxSearchView->IsVisible())
540 localSearchMoveTo(nItemId);
541 else
542 localMoveTo(nItemId);
545 mxLocalView->reload();
548 IMPL_LINK_NOARG(SfxTemplateManagerDlg, ExportClickHdl, weld::Button&, void)
550 OnTemplateExport();
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();
563 if(bIsNewCategory)
565 if(mxLocalView->createRegion(sCategory))
567 mxCBFolder->append_text(sCategory);
568 OnTemplateImportCategory(sCategory);
570 else
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)));
576 xBox->run();
577 return;
580 else
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);
603 mxActionBar->show();
606 IMPL_LINK(SfxTemplateManagerDlg, CreateContextMenuHdl, ThumbnailViewItem*, pItem, void)
608 const TemplateViewItem *pViewItem = dynamic_cast<TemplateViewItem*>(pItem);
610 if (pViewItem)
612 if (mxSearchView->IsVisible())
613 mxSearchView->createContextMenu(pViewItem->IsDefaultTemplate());
614 else
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 ),
662 uno::UNO_QUERY );
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;
683 else
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)));
700 xBox->run();
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);
718 else
719 mxLocalView->RemoveDefaultTemplateIcon(sPrevDefault);
721 SfxObjectFactory::SetStandardTemplate(aServiceName,pViewItem->getPath());
722 pViewItem->showDefaultIcon(true);
725 else
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)
744 SearchUpdate();
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();
769 mxLocalView->Hide();
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),
780 rItem.nDocId,
781 rItem.aName,
782 aFolderName,
783 rItem.aPath,
784 rItem.aThumbnail);
787 mxSearchView->Invalidate();
789 else
791 mxSearchView->deselectItems();
792 mxSearchView->Hide();
793 mxLocalView->Show();
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);
825 if (!bInSelection)
826 maSelTemplates.insert(pItem);
828 else
830 if (bInSelection)
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);
850 else
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());
862 // add "All" filter
863 aFileDlg.AddFilter( SfxResId(STR_SFX_FILTERNAME_ALL),
864 FILEDIALOG_FILTER_ALL );
866 // add template filter
867 OUString sFilterExt;
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() )
878 sFilterExt += ";";
880 sFilterExt += "*.ots;*.stc;*.xltx;*.xlt";
883 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::EModule::IMPRESS ) )
885 if ( !sFilterExt.isEmpty() )
886 sFilterExt += ";";
888 sFilterExt += "*.otp;*.sti;*.pot;*.potx";
891 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::EModule::DRAW ) )
893 if ( !sFilterExt.isEmpty() )
894 sFilterExt += ";";
896 sFilterExt += "*.otg;*.std";
899 if ( !sFilterExt.isEmpty() )
900 sFilterExt += ";";
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 )
912 return;
914 const css::uno::Sequence<OUString> aFiles = aFileDlg.GetSelectedFiles();
916 if (!aFiles.hasElements())
917 return;
919 //Import to the selected regions
920 TemplateContainerItem* pContItem = mxLocalView->getRegion(sCategory);
921 if(!pContItem)
922 return;
924 OUString aTemplateList;
926 for (const auto& rFile : aFiles)
928 if(!mxLocalView->copyFrom(pContItem, rFile))
930 if (aTemplateList.isEmpty())
931 aTemplateList = rFile;
932 else
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)));
944 xBox->run();
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 )
959 return;
961 OUString aTemplateList;
962 INetURLObject aPathObj(xFolderPicker->getDirectory());
963 aPathObj.setFinalSlash();
965 if (mxSearchView->IsVisible())
967 sal_uInt16 i = 1;
969 for (auto const& selTemplate : maSelTemplates)
971 const TemplateSearchViewItem *pItem = static_cast<const TemplateSearchViewItem*>(selTemplate);
973 INetURLObject aItemPath(pItem->getPath());
975 if ( 1 == i )
976 aPathObj.Append(aItemPath.getName());
977 else
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;
986 else
987 aTemplateList += "\n" + pItem->maTitle;
989 ++i;
992 mxSearchView->deselectItems();
994 else
996 // export templates from the current view
998 sal_uInt16 i = 1;
1000 for (auto const& selTemplate : maSelTemplates)
1002 const TemplateViewItem *pItem = static_cast<const TemplateViewItem*>(selTemplate);
1004 INetURLObject aItemPath(pItem->getPath());
1006 if ( 1 == i )
1007 aPathObj.Append(aItemPath.getName());
1008 else
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
1015 aPath))
1017 if (aTemplateList.isEmpty())
1018 aTemplateList = pItem->maTitle;
1019 else
1020 aTemplateList += "\n" + pItem->maTitle;
1022 ++i;
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)));
1034 xBox->run();
1036 else
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))));
1042 xBox->run();
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();
1059 if (!ret)
1060 return;
1062 OUString aName = dlg.GetEntryText();
1064 if(mxLocalView->createRegion(aName))
1065 mxCBFolder->append_text(aName);
1066 else
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)));
1072 xBox->run();
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();
1084 if (!ret)
1085 return;
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);
1099 else
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)));
1105 xBox->run();
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)
1124 return;
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)));
1134 xBox->run();
1136 else
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();
1153 if (!aList.empty())
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);
1166 else
1167 mxActionBar->set_item_visible(MNI_ACTION_DEFAULT, false);
1170 void SfxTemplateManagerDlg::localMoveTo(sal_uInt16 nItemId)
1172 if (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)
1182 if (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)));
1201 xBox->run();
1206 // Deselect all items and update search results
1207 mxSearchView->deselectItems();
1209 SearchUpdateHdl(*mxSearchFilter);
1212 static bool lcl_getServiceName ( const OUString &rFileURL, OUString &rName )
1214 bool bRet = false;
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 );
1227 if ( pFilter )
1229 rName = pFilter->GetServiceName();
1230 bRet = true;
1233 catch( uno::Exception& )
1237 return bRet;
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));
1256 return aList;
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);
1294 else
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);
1309 else
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()
1365 maIdle.Stop();
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));
1379 maIdle.Start();
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: */