1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <sal/config.h>
21 
22 #include <map>
23 #include <utility>
24 #include <vector>
25 
26 #include <config_feature_desktop.h>
27 #include <officecfg/Office/Common.hxx>
28 
29 #include <svx/strings.hrc>
30 #include <svx/dialmgr.hxx>
31 
32 #include <comphelper/propertysequence.hxx>
33 #include <cppuhelper/queryinterface.hxx>
34 #include <cppuhelper/supportsservice.hxx>
35 #include <cppuhelper/weak.hxx>
36 #include <com/sun/star/beans/PropertyValue.hpp>
37 #include <com/sun/star/beans/XPropertySet.hpp>
38 #include <com/sun/star/frame/DispatchDescriptor.hpp>
39 #include <com/sun/star/frame/XDispatch.hpp>
40 #include <com/sun/star/frame/XDispatchProvider.hpp>
41 #include <com/sun/star/frame/XLayoutManager.hpp>
42 #include <com/sun/star/frame/XStatusListener.hpp>
43 #include <com/sun/star/lang/XInitialization.hpp>
44 #include <com/sun/star/lang/XServiceInfo.hpp>
45 #include <com/sun/star/text/XTextRange.hpp>
46 #include <com/sun/star/text/XTextViewCursorSupplier.hpp>
47 #include <com/sun/star/ui/XUIElement.hpp>
48 #include <com/sun/star/container/XEnumeration.hpp>
49 #include <com/sun/star/util/URL.hpp>
50 #include <com/sun/star/util/URLTransformer.hpp>
51 #include <com/sun/star/util/SearchAlgorithms.hpp>
52 #include <com/sun/star/util/SearchAlgorithms2.hpp>
53 
54 #include <vcl/InterimItemWindow.hxx>
55 #include <svl/ctloptions.hxx>
56 #include <svl/srchitem.hxx>
57 #include <svtools/acceleratorexecute.hxx>
58 #include <svtools/toolboxcontroller.hxx>
59 #include <toolkit/helper/vclunohelper.hxx>
60 #include <vcl/toolbox.hxx>
61 #include <vcl/svapp.hxx>
62 #include <svx/labelitemwindow.hxx>
63 #include <svx/srchdlg.hxx>
64 #include <vcl/event.hxx>
65 
66 #include <findtextfield.hxx>
67 
68 using namespace css;
69 
70 namespace {
71 
72 constexpr OUString COMMAND_FINDTEXT = u".uno:FindText"_ustr;
73 constexpr OUString COMMAND_DOWNSEARCH = u".uno:DownSearch"_ustr;
74 constexpr OUString COMMAND_UPSEARCH = u".uno:UpSearch"_ustr;
75 constexpr OUStringLiteral COMMAND_FINDALL = u".uno:FindAll";
76 constexpr OUString COMMAND_MATCHCASE = u".uno:MatchCase"_ustr;
77 constexpr OUString COMMAND_SEARCHFORMATTED = u".uno:SearchFormattedDisplayString"_ustr;
78 
79 class CheckButtonItemWindow final : public InterimItemWindow
80 {
81 public:
CheckButtonItemWindow(vcl::Window * pParent,const OUString & rLabel)82     CheckButtonItemWindow(vcl::Window* pParent, const OUString& rLabel)
83         : InterimItemWindow(pParent, u"svx/ui/checkbuttonbox.ui"_ustr, u"CheckButtonBox"_ustr)
84         , m_xWidget(m_xBuilder->weld_check_button(u"checkbutton"_ustr))
85     {
86         InitControlBase(m_xWidget.get());
87 
88         m_xWidget->connect_key_press(LINK(this, CheckButtonItemWindow, KeyInputHdl));
89         m_xWidget->set_label(rLabel);
90         SetSizePixel(m_xWidget->get_preferred_size());
91     }
92 
get_active() const93     bool get_active() const
94     {
95         return m_xWidget->get_active();
96     }
97 
dispose()98     virtual void dispose() override
99     {
100         m_xWidget.reset();
101         InterimItemWindow::dispose();
102     }
103 
~CheckButtonItemWindow()104     virtual ~CheckButtonItemWindow() override
105     {
106         disposeOnce();
107     }
108 
109 private:
110     std::unique_ptr<weld::CheckButton> m_xWidget;
111 
112     DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
113 };
114 
IMPL_LINK(CheckButtonItemWindow,KeyInputHdl,const KeyEvent &,rKeyEvent,bool)115 IMPL_LINK(CheckButtonItemWindow, KeyInputHdl, const KeyEvent&, rKeyEvent, bool)
116 {
117     return ChildKeyInput(rKeyEvent);
118 }
119 
impl_executeSearch(const css::uno::Reference<css::uno::XComponentContext> & rxContext,const css::uno::Reference<css::frame::XFrame> & xFrame,const ToolBox * pToolBox,const bool aSearchBackwards,const bool aFindAll=false)120 void impl_executeSearch( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
121                          const css::uno::Reference< css::frame::XFrame >& xFrame,
122                          const ToolBox* pToolBox,
123                          const bool aSearchBackwards,
124                          const bool aFindAll = false )
125 {
126     css::uno::Reference< css::util::XURLTransformer > xURLTransformer( css::util::URLTransformer::create( rxContext ) );
127     css::util::URL aURL;
128     aURL.Complete = ".uno:ExecuteSearch";
129     xURLTransformer->parseStrict(aURL);
130 
131     OUString sFindText;
132     bool aMatchCase = false;
133     bool bSearchFormatted = false;
134     if ( pToolBox )
135     {
136         ToolBox::ImplToolItems::size_type nItemCount = pToolBox->GetItemCount();
137         for ( ToolBox::ImplToolItems::size_type i=0; i<nItemCount; ++i )
138         {
139             ToolBoxItemId id = pToolBox->GetItemId(i);
140             OUString sItemCommand = pToolBox->GetItemCommand(id);
141             if ( sItemCommand == COMMAND_FINDTEXT )
142             {
143                 FindTextFieldControl* pItemWin = static_cast<FindTextFieldControl*>(pToolBox->GetItemWindow(id));
144                 if (pItemWin)
145                 {
146                     sFindText = pItemWin->get_active_text();
147                     if (aFindAll && !pItemWin->ControlHasFocus())
148                         pItemWin->GetFocus();
149                 }
150             } else if ( sItemCommand == COMMAND_MATCHCASE )
151             {
152                 CheckButtonItemWindow* pItemWin = static_cast<CheckButtonItemWindow*>(pToolBox->GetItemWindow(id));
153                 if (pItemWin)
154                     aMatchCase = pItemWin->get_active();
155             } else if ( sItemCommand == COMMAND_SEARCHFORMATTED )
156             {
157                 CheckButtonItemWindow* pItemWin = static_cast<CheckButtonItemWindow*>(pToolBox->GetItemWindow(id));
158                 if (pItemWin)
159                     bSearchFormatted = pItemWin->get_active();
160             }
161         }
162     }
163 
164     TransliterationFlags nFlags = TransliterationFlags::NONE;
165     if (!aMatchCase)
166         nFlags |= TransliterationFlags::IGNORE_CASE;
167     if (SvtCTLOptions::IsCTLFontEnabled())
168         nFlags |= TransliterationFlags::IGNORE_DIACRITICS_CTL
169                   | TransliterationFlags::IGNORE_KASHIDA_CTL;
170 
171     auto aArgs( comphelper::InitPropertySequence( {
172         { "SearchItem.SearchString", css::uno::Any( sFindText ) },
173         // Related tdf#102506: make Find Bar Ctrl+F searching by value by default
174         { "SearchItem.CellType", css::uno::Any( sal_Int16(SvxSearchCellType::VALUE) ) },
175         { "SearchItem.Backward", css::uno::Any( aSearchBackwards ) },
176         { "SearchItem.SearchFlags", css::uno::Any( sal_Int32(0) ) },
177         { "SearchItem.TransliterateFlags", css::uno::Any( static_cast<sal_Int32>(nFlags) ) },
178         { "SearchItem.Command", css::uno::Any( static_cast<sal_Int16>(aFindAll ?SvxSearchCmd::FIND_ALL : SvxSearchCmd::FIND ) ) },
179         { "SearchItem.AlgorithmType", css::uno::Any( sal_Int16(css::util::SearchAlgorithms_ABSOLUTE) ) },
180         { "SearchItem.AlgorithmType2", css::uno::Any( sal_Int16(css::util::SearchAlgorithms2::ABSOLUTE) ) },
181         { "SearchItem.SearchFormatted", css::uno::Any( bSearchFormatted ) },
182         { "UseAttrItemList", css::uno::Any(false) }
183     } ) );
184 
185     css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider(xFrame, css::uno::UNO_QUERY);
186     if ( xDispatchProvider.is() )
187     {
188         css::uno::Reference< css::frame::XDispatch > xDispatch = xDispatchProvider->queryDispatch( aURL, OUString(), 0 );
189         if ( xDispatch.is() && !aURL.Complete.isEmpty() )
190             xDispatch->dispatch( aURL, aArgs );
191     }
192 }
193 
194 }
195 
196 // tdf#154818 - remember last search string
197 OUString FindTextFieldControl::m_sRememberedSearchString;
198 
FindTextFieldControl(vcl::Window * pParent,css::uno::Reference<css::frame::XFrame> xFrame,css::uno::Reference<css::uno::XComponentContext> xContext)199 FindTextFieldControl::FindTextFieldControl( vcl::Window* pParent,
200     css::uno::Reference< css::frame::XFrame > xFrame,
201     css::uno::Reference< css::uno::XComponentContext > xContext) :
202     InterimItemWindow(pParent, u"svx/ui/findbox.ui"_ustr, u"FindBox"_ustr),
203     m_nAsyncGetFocusId(nullptr),
204     m_xWidget(m_xBuilder->weld_combo_box(u"find"_ustr)),
205     m_xFrame(std::move(xFrame)),
206     m_xContext(std::move(xContext)),
207     m_pAcc(svt::AcceleratorExecute::createAcceleratorHelper())
208 {
209     InitControlBase(m_xWidget.get());
210 
211     m_xWidget->set_entry_placeholder_text(SvxResId(RID_SVXSTR_FINDBAR_FIND));
212     m_xWidget->set_entry_completion(true, true);
213     m_pAcc->init(m_xContext, m_xFrame);
214 
215     m_xWidget->connect_focus_in(LINK(this, FindTextFieldControl, FocusInHdl));
216     m_xWidget->connect_key_press(LINK(this, FindTextFieldControl, KeyInputHdl));
217     m_xWidget->connect_entry_activate(LINK(this, FindTextFieldControl, ActivateHdl));
218 
219     m_xWidget->set_size_request(250, -1);
220     SetSizePixel(m_xWidget->get_preferred_size());
221 
222     // tdf#154269 - respect FindReplaceRememberedSearches expert option
223     m_nRememberSize = officecfg::Office::Common::Misc::FindReplaceRememberedSearches::get();
224     if (m_nRememberSize < 1)
225         m_nRememberSize = 1;
226 }
227 
Remember_Impl(const OUString & rStr)228 void FindTextFieldControl::Remember_Impl(const OUString& rStr)
229 {
230     if (rStr.isEmpty())
231         return;
232 
233     // tdf#154818 - rearrange the search items
234     const auto nPos = m_xWidget->find_text(rStr);
235     if (nPos != -1)
236         m_xWidget->remove(nPos);
237     else if (m_xWidget->get_count() >= m_nRememberSize)
238         m_xWidget->remove(m_nRememberSize - 1);
239     m_xWidget->insert_text(0, rStr);
240 }
241 
SetTextToSelected_Impl()242 void FindTextFieldControl::SetTextToSelected_Impl()
243 {
244     OUString aString;
245 
246     try
247     {
248         css::uno::Reference<css::frame::XController> xController(m_xFrame->getController(), css::uno::UNO_SET_THROW);
249         uno::Reference<text::XTextViewCursorSupplier> const xTVCS(xController, uno::UNO_QUERY);
250         if (xTVCS.is())
251         {
252             uno::Reference<text::XTextViewCursor> const xTVC(xTVCS->getViewCursor());
253             aString = xTVC->getString();
254         }
255         else
256         {
257             uno::Reference<frame::XModel> xModel(xController->getModel(), uno::UNO_SET_THROW);
258             uno::Reference<uno::XInterface> xSelection = xModel->getCurrentSelection();
259             uno::Reference<container::XIndexAccess> xIndexAccess(xSelection, uno::UNO_QUERY);
260             if (xIndexAccess.is())
261             {
262                 if (xIndexAccess->getCount() > 0)
263                 {
264                     uno::Reference<text::XTextRange> xTextRange(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW);
265                     aString = xTextRange->getString();
266                 }
267             }
268             else
269             {
270                 // The Basic IDE returns a XEnumeration with a single item
271                 uno::Reference<container::XEnumeration> xEnum(xSelection, uno::UNO_QUERY_THROW);
272                 if (xEnum->hasMoreElements())
273                     xEnum->nextElement() >>= aString;
274             }
275         }
276     }
277     catch ( ... )
278     {
279     }
280 
281     if ( !aString.isEmpty() )
282     {
283         // If something is selected in the document, prepopulate with this
284         m_xWidget->set_entry_text(aString);
285         m_aChangeHdl.Call(*m_xWidget);
286     }
287     // tdf#154818 - reuse last search string
288     else if (!m_sRememberedSearchString.isEmpty() || get_count() > 0)
289     {
290         // prepopulate with last search word (fdo#84256)
291         m_xWidget->set_entry_text(m_sRememberedSearchString.isEmpty() ? m_xWidget->get_text(0)
292                                                                       : m_sRememberedSearchString);
293     }
294 }
295 
IMPL_LINK(FindTextFieldControl,KeyInputHdl,const KeyEvent &,rKeyEvent,bool)296 IMPL_LINK(FindTextFieldControl, KeyInputHdl, const KeyEvent&, rKeyEvent, bool)
297 {
298     if (isDisposed())
299         return true;
300 
301     bool bRet = false;
302 
303     bool bShift = rKeyEvent.GetKeyCode().IsShift();
304     bool bMod1 = rKeyEvent.GetKeyCode().IsMod1();
305     sal_uInt16 nCode = rKeyEvent.GetKeyCode().GetCode();
306 
307     // Close the search bar on Escape
308     if ( KEY_ESCAPE == nCode )
309     {
310         bRet = true;
311         GrabFocusToDocument();
312 
313         // hide the findbar
314         css::uno::Reference< css::beans::XPropertySet > xPropSet(m_xFrame, css::uno::UNO_QUERY);
315         if (xPropSet.is())
316         {
317             css::uno::Reference< css::frame::XLayoutManager > xLayoutManager;
318             css::uno::Any aValue = xPropSet->getPropertyValue(u"LayoutManager"_ustr);
319             aValue >>= xLayoutManager;
320             if (xLayoutManager.is())
321             {
322                 static constexpr OUString sResourceURL( u"private:resource/toolbar/findbar"_ustr );
323                 xLayoutManager->hideElement( sResourceURL );
324                 xLayoutManager->destroyElement( sResourceURL );
325             }
326         }
327     }
328     else
329     {
330         auto awtKey = svt::AcceleratorExecute::st_VCLKey2AWTKey(rKeyEvent.GetKeyCode());
331         const OUString aCommand(m_pAcc->findCommand(awtKey));
332 
333         // Select text in the search box when Ctrl-F pressed
334         if ( bMod1 && nCode == KEY_F )
335             m_xWidget->select_entry_region(0, -1);
336         // Execute the search when Ctrl-G, F3 and Shift-RETURN pressed (in addition to ActivateHdl condition which handles bare RETURN)
337         else if ( (bMod1 && KEY_G == nCode) || (bShift && KEY_RETURN == nCode) || (KEY_F3 == nCode) )
338         {
339             ActivateFind(bShift);
340             bRet = true;
341         }
342         else if (aCommand == ".uno:SearchDialog")
343             bRet = m_pAcc->execute(awtKey);
344 
345         // find-shortcut called with focus already in find
346         if (aCommand == "vnd.sun.star.findbar:FocusToFindbar")
347         {
348             m_xWidget->call_attention_to();
349             bRet = true;
350         }
351     }
352 
353     return bRet || ChildKeyInput(rKeyEvent);
354 }
355 
ActivateFind(bool bShift)356 void FindTextFieldControl::ActivateFind(bool bShift)
357 {
358     // tdf#154818 - remember last search string
359     m_sRememberedSearchString = m_xWidget->get_active_text();
360     Remember_Impl(m_sRememberedSearchString);
361 
362     vcl::Window* pWindow = GetParent();
363     ToolBox* pToolBox = static_cast<ToolBox*>(pWindow);
364 
365     impl_executeSearch(m_xContext, m_xFrame, pToolBox, bShift);
366 
367     m_xWidget->grab_focus();
368 }
369 
370 // Execute the search when activated, typically due to "Return"
IMPL_LINK_NOARG(FindTextFieldControl,ActivateHdl,weld::ComboBox &,bool)371 IMPL_LINK_NOARG(FindTextFieldControl, ActivateHdl, weld::ComboBox&, bool)
372 {
373     if (isDisposed())
374         return true;
375 
376     ActivateFind(false);
377 
378     return true;
379 }
380 
IMPL_LINK_NOARG(FindTextFieldControl,OnAsyncGetFocus,void *,void)381 IMPL_LINK_NOARG(FindTextFieldControl, OnAsyncGetFocus, void*, void)
382 {
383     m_nAsyncGetFocusId = nullptr;
384     m_xWidget->select_entry_region(0, -1);
385 }
386 
FocusIn()387 void FindTextFieldControl::FocusIn()
388 {
389     if (m_nAsyncGetFocusId || !m_xWidget)
390         return;
391 
392     // do it async to defeat entry in combobox having its own ideas about the focus
393     m_nAsyncGetFocusId = Application::PostUserEvent(LINK(this, FindTextFieldControl, OnAsyncGetFocus));
394 
395     GrabFocus(); // tdf#137993 ensure the toplevel vcl::Window is activated so SfxViewFrame::Current is valid
396 }
397 
IMPL_LINK_NOARG(FindTextFieldControl,FocusInHdl,weld::Widget &,void)398 IMPL_LINK_NOARG(FindTextFieldControl, FocusInHdl, weld::Widget&, void)
399 {
400     FocusIn();
401 }
402 
dispose()403 void FindTextFieldControl::dispose()
404 {
405     if (m_nAsyncGetFocusId)
406     {
407         Application::RemoveUserEvent(m_nAsyncGetFocusId);
408         m_nAsyncGetFocusId = nullptr;
409     }
410     m_xWidget.reset();
411     InterimItemWindow::dispose();
412 }
413 
~FindTextFieldControl()414 FindTextFieldControl::~FindTextFieldControl()
415 {
416     disposeOnce();
417 }
418 
connect_changed(const Link<weld::ComboBox &,void> & rLink)419 void FindTextFieldControl::connect_changed(const Link<weld::ComboBox&, void>& rLink)
420 {
421     m_aChangeHdl = rLink;
422     m_xWidget->connect_changed(rLink);
423 }
424 
get_count() const425 int FindTextFieldControl::get_count() const
426 {
427     return m_xWidget->get_count();
428 }
429 
get_text(int nIndex) const430 OUString FindTextFieldControl::get_text(int nIndex) const
431 {
432     return m_xWidget->get_text(nIndex);
433 }
434 
get_active_text() const435 OUString FindTextFieldControl::get_active_text() const
436 {
437     return m_xWidget->get_active_text();
438 }
439 
append_text(const OUString & rText)440 void FindTextFieldControl::append_text(const OUString& rText)
441 {
442     m_xWidget->append_text(rText);
443 }
444 
445 namespace {
446 
447 class SearchToolbarControllersManager
448 {
449 public:
450 
451     SearchToolbarControllersManager();
452 
453     static SearchToolbarControllersManager& createControllersManager();
454 
455     void registryController( const css::uno::Reference< css::frame::XFrame >& xFrame, const css::uno::Reference< css::frame::XStatusListener >& xStatusListener, const OUString& sCommandURL );
456     void freeController ( const css::uno::Reference< css::frame::XFrame >& xFrame, const OUString& sCommandURL );
457     css::uno::Reference< css::frame::XStatusListener > findController( const css::uno::Reference< css::frame::XFrame >& xFrame, const OUString& sCommandURL );
458 
459     void saveSearchHistory(const FindTextFieldControl* m_pFindTextFieldControl);
460     void loadSearchHistory(FindTextFieldControl* m_pFindTextFieldControl);
461 
462 private:
463 
464     typedef ::std::vector< css::beans::PropertyValue > SearchToolbarControllersVec;
465     typedef ::std::map< css::uno::Reference< css::frame::XFrame >, SearchToolbarControllersVec > SearchToolbarControllersMap;
466     SearchToolbarControllersMap aSearchToolbarControllersMap;
467     std::vector<OUString> m_aSearchStrings;
468 
469 };
470 
SearchToolbarControllersManager()471 SearchToolbarControllersManager::SearchToolbarControllersManager()
472 {
473 }
474 
createControllersManager()475 SearchToolbarControllersManager& SearchToolbarControllersManager::createControllersManager()
476 {
477     static SearchToolbarControllersManager theSearchToolbarControllersManager;
478     return theSearchToolbarControllersManager;
479 }
480 
saveSearchHistory(const FindTextFieldControl * pFindTextFieldControl)481 void SearchToolbarControllersManager::saveSearchHistory(const FindTextFieldControl* pFindTextFieldControl)
482 {
483     const sal_Int32 nECount( pFindTextFieldControl->get_count() );
484     m_aSearchStrings.resize( nECount );
485     for( sal_Int32 i=0; i<nECount; ++i )
486     {
487         m_aSearchStrings[i] = pFindTextFieldControl->get_text(i);
488     }
489 }
490 
loadSearchHistory(FindTextFieldControl * pFindTextFieldControl)491 void SearchToolbarControllersManager::loadSearchHistory(FindTextFieldControl* pFindTextFieldControl)
492 {
493     for( size_t i=0; i<m_aSearchStrings.size(); ++i )
494     {
495         pFindTextFieldControl->append_text(m_aSearchStrings[i]);
496     }
497 }
498 
registryController(const css::uno::Reference<css::frame::XFrame> & xFrame,const css::uno::Reference<css::frame::XStatusListener> & xStatusListener,const OUString & sCommandURL)499 void SearchToolbarControllersManager::registryController( const css::uno::Reference< css::frame::XFrame >& xFrame, const css::uno::Reference< css::frame::XStatusListener >& xStatusListener, const OUString& sCommandURL )
500 {
501     SearchToolbarControllersMap::iterator pIt = aSearchToolbarControllersMap.find(xFrame);
502     if (pIt == aSearchToolbarControllersMap.end())
503     {
504         SearchToolbarControllersVec lControllers(1);
505         lControllers[0].Name = sCommandURL;
506         lControllers[0].Value <<= xStatusListener;
507         aSearchToolbarControllersMap.emplace(xFrame, lControllers);
508     }
509     else
510     {
511         sal_Int32 nSize = pIt->second.size();
512         for (sal_Int32 i=0; i<nSize; ++i)
513         {
514             if (pIt->second[i].Name == sCommandURL)
515                 return;
516         }
517 
518         pIt->second.resize(nSize+1);
519         pIt->second[nSize].Name = sCommandURL;
520         pIt->second[nSize].Value <<= xStatusListener;
521     }
522 }
523 
freeController(const css::uno::Reference<css::frame::XFrame> & xFrame,const OUString & sCommandURL)524 void SearchToolbarControllersManager::freeController( const css::uno::Reference< css::frame::XFrame >& xFrame, const OUString& sCommandURL )
525 {
526     SearchToolbarControllersMap::iterator pIt = aSearchToolbarControllersMap.find(xFrame);
527     if (pIt != aSearchToolbarControllersMap.end())
528     {
529         auto pItCtrl = std::find_if(pIt->second.begin(), pIt->second.end(),
530             [&sCommandURL](const css::beans::PropertyValue& rCtrl) { return rCtrl.Name == sCommandURL; });
531         if (pItCtrl != pIt->second.end())
532             pIt->second.erase(pItCtrl);
533 
534         if (pIt->second.empty())
535             aSearchToolbarControllersMap.erase(pIt);
536     }
537 }
538 
findController(const css::uno::Reference<css::frame::XFrame> & xFrame,const OUString & sCommandURL)539 css::uno::Reference< css::frame::XStatusListener > SearchToolbarControllersManager::findController( const css::uno::Reference< css::frame::XFrame >& xFrame, const OUString& sCommandURL )
540 {
541     css::uno::Reference< css::frame::XStatusListener > xStatusListener;
542 
543     SearchToolbarControllersMap::iterator pIt = aSearchToolbarControllersMap.find(xFrame);
544     if (pIt != aSearchToolbarControllersMap.end())
545     {
546         auto pItCtrl = std::find_if(pIt->second.begin(), pIt->second.end(),
547             [&sCommandURL](const css::beans::PropertyValue& rCtrl) { return rCtrl.Name == sCommandURL; });
548         if (pItCtrl != pIt->second.end())
549             pItCtrl->Value >>= xStatusListener;
550     }
551 
552     return xStatusListener;
553 }
554 
555 typedef cppu::ImplInheritanceHelper< ::svt::ToolboxController, css::lang::XServiceInfo> FindTextToolbarController_Base;
556 class FindTextToolbarController : public FindTextToolbarController_Base
557 {
558 public:
559 
560     FindTextToolbarController( const css::uno::Reference< css::uno::XComponentContext > & rxContext );
561 
562     // XServiceInfo
563     virtual OUString SAL_CALL getImplementationName() override;
564     virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
565     virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
566 
567     // XComponent
568     virtual void SAL_CALL dispose() override;
569 
570     // XInitialization
571     virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override;
572 
573     // XToolbarController
574     virtual css::uno::Reference< css::awt::XWindow > SAL_CALL createItemWindow( const css::uno::Reference< css::awt::XWindow >& Parent ) override;
575 
576     // XStatusListener
577     virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& Event ) override;
578 
579     DECL_LINK(EditModifyHdl, weld::ComboBox&, void);
580 
581 private:
582 
583     void textfieldChanged();
584 
585     VclPtr<FindTextFieldControl> m_pFindTextFieldControl;
586 
587     ToolBoxItemId m_nDownSearchId;
588     ToolBoxItemId m_nUpSearchId;
589     ToolBoxItemId m_nFindAllId;
590 
591 };
592 
FindTextToolbarController(const css::uno::Reference<css::uno::XComponentContext> & rxContext)593 FindTextToolbarController::FindTextToolbarController( const css::uno::Reference< css::uno::XComponentContext >& rxContext )
594     : FindTextToolbarController_Base(rxContext, css::uno::Reference< css::frame::XFrame >(), COMMAND_FINDTEXT)
595     , m_pFindTextFieldControl(nullptr)
596     , m_nDownSearchId(0)
597     , m_nUpSearchId(0)
598     , m_nFindAllId(0)
599 {
600 }
601 
602 // XServiceInfo
getImplementationName()603 OUString SAL_CALL FindTextToolbarController::getImplementationName()
604 {
605     return u"com.sun.star.svx.FindTextToolboxController"_ustr;
606 }
607 
supportsService(const OUString & ServiceName)608 sal_Bool SAL_CALL FindTextToolbarController::supportsService( const OUString& ServiceName )
609 {
610     return cppu::supportsService(this, ServiceName);
611 }
612 
getSupportedServiceNames()613 css::uno::Sequence< OUString > SAL_CALL FindTextToolbarController::getSupportedServiceNames()
614 {
615     return { u"com.sun.star.frame.ToolbarController"_ustr };
616 }
617 
618 // XComponent
dispose()619 void SAL_CALL FindTextToolbarController::dispose()
620 {
621     SolarMutexGuard aSolarMutexGuard;
622 
623     SearchToolbarControllersManager::createControllersManager().freeController(m_xFrame, m_aCommandURL);
624 
625     svt::ToolboxController::dispose();
626     if (m_pFindTextFieldControl != nullptr) {
627         SearchToolbarControllersManager::createControllersManager()
628             .saveSearchHistory(m_pFindTextFieldControl);
629         m_pFindTextFieldControl.disposeAndClear();
630     }
631 }
632 
633 // XInitialization
initialize(const css::uno::Sequence<css::uno::Any> & aArguments)634 void SAL_CALL FindTextToolbarController::initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
635 {
636     svt::ToolboxController::initialize(aArguments);
637 
638     VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow( getParent() );
639     ToolBox* pToolBox = static_cast<ToolBox*>(pWindow.get());
640     if ( pToolBox )
641     {
642         m_nDownSearchId = pToolBox->GetItemId(COMMAND_DOWNSEARCH);
643         m_nUpSearchId = pToolBox->GetItemId(COMMAND_UPSEARCH);
644         m_nFindAllId = pToolBox->GetItemId(COMMAND_FINDALL);
645     }
646 
647     SearchToolbarControllersManager::createControllersManager().registryController(m_xFrame, css::uno::Reference< css::frame::XStatusListener >(this), m_aCommandURL);
648 }
649 
createItemWindow(const css::uno::Reference<css::awt::XWindow> & xParent)650 css::uno::Reference< css::awt::XWindow > SAL_CALL FindTextToolbarController::createItemWindow( const css::uno::Reference< css::awt::XWindow >& xParent )
651 {
652     css::uno::Reference< css::awt::XWindow > xItemWindow;
653 
654     VclPtr<vcl::Window> pParent = VCLUnoHelper::GetWindow( xParent );
655     if ( pParent )
656     {
657         ToolBox* pToolbar = static_cast<ToolBox*>(pParent.get());
658         m_pFindTextFieldControl = VclPtr<FindTextFieldControl>::Create(pToolbar, m_xFrame, m_xContext);
659 
660         m_pFindTextFieldControl->connect_changed(LINK(this, FindTextToolbarController, EditModifyHdl));
661         SearchToolbarControllersManager::createControllersManager().loadSearchHistory(m_pFindTextFieldControl);
662     }
663     xItemWindow = VCLUnoHelper::GetInterface( m_pFindTextFieldControl );
664 
665     return xItemWindow;
666 }
667 
668 // XStatusListener
statusChanged(const css::frame::FeatureStateEvent & rEvent)669 void SAL_CALL FindTextToolbarController::statusChanged( const css::frame::FeatureStateEvent& rEvent )
670 {
671     SolarMutexGuard aSolarMutexGuard;
672     if ( m_bDisposed )
673         return;
674 
675     OUString aFeatureURL = rEvent.FeatureURL.Complete;
676     if ( aFeatureURL == "AppendSearchHistory" )
677     {
678         m_pFindTextFieldControl->Remember_Impl(m_pFindTextFieldControl->get_active_text());
679     }
680     // enable up/down buttons in case there is already text (from the search history)
681     textfieldChanged();
682 }
683 
IMPL_LINK_NOARG(FindTextToolbarController,EditModifyHdl,weld::ComboBox &,void)684 IMPL_LINK_NOARG(FindTextToolbarController, EditModifyHdl, weld::ComboBox&, void)
685 {
686     // Clear SearchLabel when search string altered
687     #if HAVE_FEATURE_DESKTOP
688     SvxSearchDialogWrapper::SetSearchLabel(SearchLabel::Empty);
689     #endif
690 
691     textfieldChanged();
692 }
693 
textfieldChanged()694 void FindTextToolbarController::textfieldChanged() {
695     // enable or disable item DownSearch/UpSearch/FindAll of findbar
696     VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow( getParent() );
697     ToolBox* pToolBox = static_cast<ToolBox*>(pWindow.get());
698     if ( pToolBox && m_pFindTextFieldControl )
699     {
700         bool enableButtons = !m_pFindTextFieldControl->get_active_text().isEmpty();
701         pToolBox->EnableItem(m_nDownSearchId, enableButtons);
702         pToolBox->EnableItem(m_nUpSearchId, enableButtons);
703         pToolBox->EnableItem(m_nFindAllId, enableButtons);
704     }
705 }
706 
707 typedef cppu::ImplInheritanceHelper< ::svt::ToolboxController, css::lang::XServiceInfo> UpDownSearchToolboxController_Base;
708 class UpDownSearchToolboxController : public UpDownSearchToolboxController_Base
709 {
710 public:
711     enum Type { UP, DOWN };
712 
713     UpDownSearchToolboxController( const css::uno::Reference< css::uno::XComponentContext >& rxContext, Type eType );
714 
715     // XServiceInfo
716     virtual OUString SAL_CALL getImplementationName() override;
717     virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
718     virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
719 
720     // XComponent
721     virtual void SAL_CALL dispose() override;
722 
723     // XInitialization
724     virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override;
725 
726     // XToolbarController
727     virtual void SAL_CALL execute( sal_Int16 KeyModifier ) override;
728 
729     // XStatusListener
730     virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& rEvent ) override;
731 
732 private:
733     Type meType;
734 };
735 
UpDownSearchToolboxController(const css::uno::Reference<css::uno::XComponentContext> & rxContext,Type eType)736 UpDownSearchToolboxController::UpDownSearchToolboxController( const css::uno::Reference< css::uno::XComponentContext > & rxContext, Type eType )
737     : UpDownSearchToolboxController_Base( rxContext,
738             css::uno::Reference< css::frame::XFrame >(),
739             (eType == UP) ? COMMAND_UPSEARCH:  COMMAND_DOWNSEARCH ),
740       meType( eType )
741 {
742 }
743 
744 // XServiceInfo
getImplementationName()745 OUString SAL_CALL UpDownSearchToolboxController::getImplementationName()
746 {
747     return meType == UpDownSearchToolboxController::UP?
748         u"com.sun.star.svx.UpSearchToolboxController"_ustr :
749         u"com.sun.star.svx.DownSearchToolboxController"_ustr;
750 }
751 
supportsService(const OUString & ServiceName)752 sal_Bool SAL_CALL UpDownSearchToolboxController::supportsService( const OUString& ServiceName )
753 {
754     return cppu::supportsService(this, ServiceName);
755 }
756 
getSupportedServiceNames()757 css::uno::Sequence< OUString > SAL_CALL UpDownSearchToolboxController::getSupportedServiceNames()
758 {
759     return { u"com.sun.star.frame.ToolbarController"_ustr };
760 }
761 
762 // XComponent
dispose()763 void SAL_CALL UpDownSearchToolboxController::dispose()
764 {
765     SolarMutexGuard aSolarMutexGuard;
766 
767     SearchToolbarControllersManager::createControllersManager().freeController(m_xFrame, m_aCommandURL);
768 
769     svt::ToolboxController::dispose();
770 }
771 
772 // XInitialization
initialize(const css::uno::Sequence<css::uno::Any> & aArguments)773 void SAL_CALL UpDownSearchToolboxController::initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
774 {
775     svt::ToolboxController::initialize( aArguments );
776     SearchToolbarControllersManager::createControllersManager().registryController(m_xFrame, css::uno::Reference< css::frame::XStatusListener >(this), m_aCommandURL);
777 }
778 
779 // XToolbarController
execute(sal_Int16)780 void SAL_CALL UpDownSearchToolboxController::execute( sal_Int16 /*KeyModifier*/ )
781 {
782     if ( m_bDisposed )
783         throw css::lang::DisposedException();
784 
785     VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow( getParent() );
786     ToolBox* pToolBox = static_cast<ToolBox*>(pWindow.get());
787 
788     impl_executeSearch(m_xContext, m_xFrame, pToolBox, meType == UP );
789 
790     css::frame::FeatureStateEvent aEvent;
791     aEvent.FeatureURL.Complete = "AppendSearchHistory";
792     css::uno::Reference< css::frame::XStatusListener > xStatusListener = SearchToolbarControllersManager::createControllersManager().findController(m_xFrame, COMMAND_FINDTEXT);
793     if (xStatusListener.is())
794         xStatusListener->statusChanged( aEvent );
795 }
796 
797 // XStatusListener
statusChanged(const css::frame::FeatureStateEvent &)798 void SAL_CALL UpDownSearchToolboxController::statusChanged( const css::frame::FeatureStateEvent& /*rEvent*/ )
799 {
800 }
801 
802 typedef cppu::ImplInheritanceHelper< ::svt::ToolboxController, css::lang::XServiceInfo> MatchCaseToolboxController_Base;
803 class MatchCaseToolboxController : public MatchCaseToolboxController_Base
804 {
805 public:
806     MatchCaseToolboxController( const css::uno::Reference< css::uno::XComponentContext >& rxContext );
807 
808     // XServiceInfo
809     virtual OUString SAL_CALL getImplementationName() override;
810     virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
811     virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
812 
813     // XComponent
814     virtual void SAL_CALL dispose() override;
815 
816     // XInitialization
817     virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override;
818 
819     // XToolbarController
820     virtual css::uno::Reference< css::awt::XWindow > SAL_CALL createItemWindow( const css::uno::Reference< css::awt::XWindow >& Parent ) override;
821 
822     // XStatusListener
823     virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& rEvent ) override;
824 
825 private:
826     VclPtr<CheckButtonItemWindow> m_xMatchCaseControl;
827 };
828 
MatchCaseToolboxController(const css::uno::Reference<css::uno::XComponentContext> & rxContext)829 MatchCaseToolboxController::MatchCaseToolboxController( const css::uno::Reference< css::uno::XComponentContext >& rxContext )
830     : MatchCaseToolboxController_Base( rxContext,
831         css::uno::Reference< css::frame::XFrame >(),
832         COMMAND_MATCHCASE )
833     , m_xMatchCaseControl(nullptr)
834 {
835 }
836 
837 // XServiceInfo
getImplementationName()838 OUString SAL_CALL MatchCaseToolboxController::getImplementationName()
839 {
840     return u"com.sun.star.svx.MatchCaseToolboxController"_ustr;
841 }
842 
supportsService(const OUString & ServiceName)843 sal_Bool SAL_CALL MatchCaseToolboxController::supportsService( const OUString& ServiceName )
844 {
845     return cppu::supportsService(this, ServiceName);
846 }
847 
getSupportedServiceNames()848 css::uno::Sequence< OUString > SAL_CALL MatchCaseToolboxController::getSupportedServiceNames()
849 {
850     return { u"com.sun.star.frame.ToolbarController"_ustr };
851 }
852 
853 // XComponent
dispose()854 void SAL_CALL MatchCaseToolboxController::dispose()
855 {
856     SolarMutexGuard aSolarMutexGuard;
857 
858     SearchToolbarControllersManager::createControllersManager().freeController(m_xFrame, m_aCommandURL);
859 
860     svt::ToolboxController::dispose();
861 
862     m_xMatchCaseControl.disposeAndClear();
863 }
864 
865 // XInitialization
initialize(const css::uno::Sequence<css::uno::Any> & aArguments)866 void SAL_CALL MatchCaseToolboxController::initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
867 {
868     svt::ToolboxController::initialize(aArguments);
869 
870     SearchToolbarControllersManager::createControllersManager().registryController(m_xFrame, css::uno::Reference< css::frame::XStatusListener >(this), m_aCommandURL);
871 }
872 
createItemWindow(const css::uno::Reference<css::awt::XWindow> & xParent)873 css::uno::Reference< css::awt::XWindow > SAL_CALL MatchCaseToolboxController::createItemWindow( const css::uno::Reference< css::awt::XWindow >& xParent )
874 {
875     css::uno::Reference< css::awt::XWindow > xItemWindow;
876 
877     VclPtr<vcl::Window> pParent = VCLUnoHelper::GetWindow( xParent );
878     if ( pParent )
879     {
880         ToolBox* pToolbar = static_cast<ToolBox*>(pParent.get());
881         m_xMatchCaseControl = VclPtr<CheckButtonItemWindow>::Create(pToolbar, SvxResId(RID_SVXSTR_FINDBAR_MATCHCASE));
882     }
883     xItemWindow = VCLUnoHelper::GetInterface(m_xMatchCaseControl);
884 
885     return xItemWindow;
886 }
887 
888 // XStatusListener
statusChanged(const css::frame::FeatureStateEvent &)889 void SAL_CALL MatchCaseToolboxController::statusChanged( const css::frame::FeatureStateEvent& )
890 {
891 }
892 
893 typedef cppu::ImplInheritanceHelper< ::svt::ToolboxController, css::lang::XServiceInfo> SearchFormattedToolboxController_Base;
894 class SearchFormattedToolboxController : public SearchFormattedToolboxController_Base
895 {
896 public:
897     SearchFormattedToolboxController( const css::uno::Reference< css::uno::XComponentContext >& rxContext );
898 
899     // XServiceInfo
900     virtual OUString SAL_CALL getImplementationName() override;
901     virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
902     virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
903 
904     // XComponent
905     virtual void SAL_CALL dispose() override;
906 
907     // XInitialization
908     virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override;
909 
910     // XToolbarController
911     virtual css::uno::Reference< css::awt::XWindow > SAL_CALL createItemWindow( const css::uno::Reference< css::awt::XWindow >& Parent ) override;
912 
913     // XStatusListener
914     virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& rEvent ) override;
915 
916 private:
917     VclPtr<CheckButtonItemWindow> m_xSearchFormattedControl;
918 };
919 
SearchFormattedToolboxController(const css::uno::Reference<css::uno::XComponentContext> & rxContext)920 SearchFormattedToolboxController::SearchFormattedToolboxController( const css::uno::Reference< css::uno::XComponentContext >& rxContext )
921     : SearchFormattedToolboxController_Base( rxContext,
922         css::uno::Reference< css::frame::XFrame >(),
923         COMMAND_SEARCHFORMATTED )
924     , m_xSearchFormattedControl(nullptr)
925 {
926 }
927 
928 // XServiceInfo
getImplementationName()929 OUString SAL_CALL SearchFormattedToolboxController::getImplementationName()
930 {
931     return u"com.sun.star.svx.SearchFormattedToolboxController"_ustr;
932 }
933 
supportsService(const OUString & ServiceName)934 sal_Bool SAL_CALL SearchFormattedToolboxController::supportsService( const OUString& ServiceName )
935 {
936     return cppu::supportsService(this, ServiceName);
937 }
938 
getSupportedServiceNames()939 css::uno::Sequence< OUString > SAL_CALL SearchFormattedToolboxController::getSupportedServiceNames()
940 {
941     return { u"com.sun.star.frame.ToolbarController"_ustr };
942 }
943 
944 // XComponent
dispose()945 void SAL_CALL SearchFormattedToolboxController::dispose()
946 {
947     SolarMutexGuard aSolarMutexGuard;
948 
949     SearchToolbarControllersManager::createControllersManager().freeController(m_xFrame, m_aCommandURL);
950 
951     svt::ToolboxController::dispose();
952 
953     m_xSearchFormattedControl.disposeAndClear();
954 }
955 
956 // XInitialization
initialize(const css::uno::Sequence<css::uno::Any> & aArguments)957 void SAL_CALL SearchFormattedToolboxController::initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
958 {
959     svt::ToolboxController::initialize(aArguments);
960 
961     SearchToolbarControllersManager::createControllersManager().registryController(m_xFrame, css::uno::Reference< css::frame::XStatusListener >(this), m_aCommandURL);
962 }
963 
createItemWindow(const css::uno::Reference<css::awt::XWindow> & xParent)964 css::uno::Reference< css::awt::XWindow > SAL_CALL SearchFormattedToolboxController::createItemWindow( const css::uno::Reference< css::awt::XWindow >& xParent )
965 {
966     css::uno::Reference< css::awt::XWindow > xItemWindow;
967 
968     VclPtr<vcl::Window> pParent = VCLUnoHelper::GetWindow( xParent );
969     if ( pParent )
970     {
971         ToolBox* pToolbar = static_cast<ToolBox*>(pParent.get());
972         m_xSearchFormattedControl = VclPtr<CheckButtonItemWindow>::Create(pToolbar, SvxResId(RID_SVXSTR_FINDBAR_SEARCHFORMATTED));
973     }
974     xItemWindow = VCLUnoHelper::GetInterface(m_xSearchFormattedControl);
975 
976     return xItemWindow;
977 }
978 
979 // XStatusListener
statusChanged(const css::frame::FeatureStateEvent &)980 void SAL_CALL SearchFormattedToolboxController::statusChanged( const css::frame::FeatureStateEvent& )
981 {
982 }
983 
984 typedef cppu::ImplInheritanceHelper< ::svt::ToolboxController, css::lang::XServiceInfo> FindAllToolboxController_Base;
985 class FindAllToolboxController : public FindAllToolboxController_Base
986 {
987 public:
988     FindAllToolboxController( const css::uno::Reference< css::uno::XComponentContext >& rxContext );
989 
990     // XServiceInfo
991     virtual OUString SAL_CALL getImplementationName() override;
992     virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
993     virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
994 
995     // XComponent
996     virtual void SAL_CALL dispose() override;
997 
998     // XInitialization
999     virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override;
1000 
1001     // XToolbarController
1002     virtual void SAL_CALL execute( sal_Int16 KeyModifier ) override;
1003 
1004     // XStatusListener
1005     virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& rEvent ) override;
1006 };
1007 
FindAllToolboxController(const css::uno::Reference<css::uno::XComponentContext> & rxContext)1008 FindAllToolboxController::FindAllToolboxController( const css::uno::Reference< css::uno::XComponentContext > & rxContext )
1009     : FindAllToolboxController_Base( rxContext,
1010             css::uno::Reference< css::frame::XFrame >(),
1011             ".uno:FindAll" )
1012 {
1013 }
1014 
1015 // XServiceInfo
getImplementationName()1016 OUString SAL_CALL FindAllToolboxController::getImplementationName()
1017 {
1018     return u"com.sun.star.svx.FindAllToolboxController"_ustr;
1019 }
1020 
1021 
supportsService(const OUString & ServiceName)1022 sal_Bool SAL_CALL FindAllToolboxController::supportsService( const OUString& ServiceName )
1023 {
1024     return cppu::supportsService(this, ServiceName);
1025 }
1026 
getSupportedServiceNames()1027 css::uno::Sequence< OUString > SAL_CALL FindAllToolboxController::getSupportedServiceNames()
1028 {
1029     return { u"com.sun.star.frame.ToolbarController"_ustr };
1030 }
1031 
1032 // XComponent
dispose()1033 void SAL_CALL FindAllToolboxController::dispose()
1034 {
1035     SolarMutexGuard aSolarMutexGuard;
1036 
1037     SearchToolbarControllersManager::createControllersManager().freeController(m_xFrame, m_aCommandURL);
1038 
1039     svt::ToolboxController::dispose();
1040 }
1041 
1042 // XInitialization
initialize(const css::uno::Sequence<css::uno::Any> & aArguments)1043 void SAL_CALL FindAllToolboxController::initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
1044 {
1045     svt::ToolboxController::initialize( aArguments );
1046     SearchToolbarControllersManager::createControllersManager().registryController(m_xFrame, css::uno::Reference< css::frame::XStatusListener >(this), m_aCommandURL);
1047 }
1048 
1049 // XToolbarController
execute(sal_Int16)1050 void SAL_CALL FindAllToolboxController::execute( sal_Int16 /*KeyModifier*/ )
1051 {
1052     if ( m_bDisposed )
1053         throw css::lang::DisposedException();
1054 
1055     VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow( getParent() );
1056     ToolBox* pToolBox = static_cast<ToolBox*>(pWindow.get());
1057 
1058     impl_executeSearch(m_xContext, m_xFrame, pToolBox, false, true);
1059 }
1060 
1061 // XStatusListener
statusChanged(const css::frame::FeatureStateEvent &)1062 void SAL_CALL FindAllToolboxController::statusChanged( const css::frame::FeatureStateEvent& /*rEvent*/ )
1063 {
1064 }
1065 
1066 typedef cppu::ImplInheritanceHelper< ::svt::ToolboxController, css::lang::XServiceInfo> ExitSearchToolboxController_Base;
1067 class ExitSearchToolboxController : public ExitSearchToolboxController_Base
1068 {
1069 public:
1070     ExitSearchToolboxController( const css::uno::Reference< css::uno::XComponentContext >& rxContext );
1071 
1072     // XServiceInfo
1073     virtual OUString SAL_CALL getImplementationName() override;
1074     virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
1075     virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
1076 
1077     // XComponent
1078     virtual void SAL_CALL dispose() override;
1079 
1080     // XInitialization
1081     virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override;
1082 
1083     // XToolbarController
1084     virtual void SAL_CALL execute( sal_Int16 KeyModifier ) override;
1085 
1086     // XStatusListener
1087     virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& rEvent ) override;
1088 };
1089 
ExitSearchToolboxController(const css::uno::Reference<css::uno::XComponentContext> & rxContext)1090 ExitSearchToolboxController::ExitSearchToolboxController( const css::uno::Reference< css::uno::XComponentContext > & rxContext )
1091     : ExitSearchToolboxController_Base( rxContext,
1092             css::uno::Reference< css::frame::XFrame >(),
1093             ".uno:ExitSearch" )
1094 {
1095 }
1096 
1097 // XServiceInfo
getImplementationName()1098 OUString SAL_CALL ExitSearchToolboxController::getImplementationName()
1099 {
1100     return u"com.sun.star.svx.ExitFindbarToolboxController"_ustr;
1101 }
1102 
1103 
supportsService(const OUString & ServiceName)1104 sal_Bool SAL_CALL ExitSearchToolboxController::supportsService( const OUString& ServiceName )
1105 {
1106     return cppu::supportsService(this, ServiceName);
1107 }
1108 
getSupportedServiceNames()1109 css::uno::Sequence< OUString > SAL_CALL ExitSearchToolboxController::getSupportedServiceNames()
1110 {
1111     return { u"com.sun.star.frame.ToolbarController"_ustr };
1112 }
1113 
1114 // XComponent
dispose()1115 void SAL_CALL ExitSearchToolboxController::dispose()
1116 {
1117     SolarMutexGuard aSolarMutexGuard;
1118 
1119     SearchToolbarControllersManager::createControllersManager().freeController(m_xFrame, m_aCommandURL);
1120 
1121     svt::ToolboxController::dispose();
1122 }
1123 
1124 // XInitialization
initialize(const css::uno::Sequence<css::uno::Any> & aArguments)1125 void SAL_CALL ExitSearchToolboxController::initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
1126 {
1127     svt::ToolboxController::initialize( aArguments );
1128     SearchToolbarControllersManager::createControllersManager().registryController(m_xFrame, css::uno::Reference< css::frame::XStatusListener >(this), m_aCommandURL);
1129 }
1130 
1131 // XToolbarController
execute(sal_Int16)1132 void SAL_CALL ExitSearchToolboxController::execute( sal_Int16 /*KeyModifier*/ )
1133 {
1134     vcl::Window *pFocusWindow = Application::GetFocusWindow();
1135     if ( pFocusWindow )
1136         pFocusWindow->GrabFocusToDocument();
1137 
1138     // hide the findbar
1139     css::uno::Reference< css::beans::XPropertySet > xPropSet(m_xFrame, css::uno::UNO_QUERY);
1140     if (xPropSet.is())
1141     {
1142         css::uno::Reference< css::frame::XLayoutManager > xLayoutManager;
1143         css::uno::Any aValue = xPropSet->getPropertyValue(u"LayoutManager"_ustr);
1144         aValue >>= xLayoutManager;
1145         if (xLayoutManager.is())
1146         {
1147             static constexpr OUString sResourceURL( u"private:resource/toolbar/findbar"_ustr );
1148             xLayoutManager->hideElement( sResourceURL );
1149             xLayoutManager->destroyElement( sResourceURL );
1150         }
1151     }
1152 }
1153 
1154 // XStatusListener
statusChanged(const css::frame::FeatureStateEvent &)1155 void SAL_CALL ExitSearchToolboxController::statusChanged( const css::frame::FeatureStateEvent& /*rEvent*/ )
1156 {
1157 }
1158 
1159 typedef cppu::ImplInheritanceHelper< ::svt::ToolboxController, css::lang::XServiceInfo> SearchLabelToolboxController_Base;
1160 class SearchLabelToolboxController : public SearchLabelToolboxController_Base
1161 {
1162 public:
1163     SearchLabelToolboxController( const css::uno::Reference< css::uno::XComponentContext >& rxContext );
1164 
1165     // XServiceInfo
1166     virtual OUString SAL_CALL getImplementationName() override;
1167     virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
1168     virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
1169 
1170     // XComponent
1171     virtual void SAL_CALL dispose() override;
1172 
1173     // XInitialization
1174     virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override;
1175 
1176     // XToolbarController
1177     virtual css::uno::Reference< css::awt::XWindow > SAL_CALL createItemWindow( const css::uno::Reference< css::awt::XWindow >& Parent ) override;
1178 
1179     // XStatusListener
1180     virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& rEvent ) override;
1181 
1182 private:
1183     VclPtr<LabelItemWindow> m_xSL;
1184 };
1185 
SearchLabelToolboxController(const css::uno::Reference<css::uno::XComponentContext> & rxContext)1186 SearchLabelToolboxController::SearchLabelToolboxController( const css::uno::Reference< css::uno::XComponentContext > & rxContext )
1187     : SearchLabelToolboxController_Base( rxContext,
1188             css::uno::Reference< css::frame::XFrame >(),
1189             ".uno:SearchLabel" )
1190 {
1191 }
1192 
1193 // XServiceInfo
getImplementationName()1194 OUString SAL_CALL SearchLabelToolboxController::getImplementationName()
1195 {
1196     return u"com.sun.star.svx.SearchLabelToolboxController"_ustr;
1197 }
1198 
1199 
supportsService(const OUString & ServiceName)1200 sal_Bool SAL_CALL SearchLabelToolboxController::supportsService( const OUString& ServiceName )
1201 {
1202     return cppu::supportsService(this, ServiceName);
1203 }
1204 
getSupportedServiceNames()1205 css::uno::Sequence< OUString > SAL_CALL SearchLabelToolboxController::getSupportedServiceNames()
1206 {
1207     return { u"com.sun.star.frame.ToolbarController"_ustr };
1208 }
1209 
1210 // XComponent
dispose()1211 void SAL_CALL SearchLabelToolboxController::dispose()
1212 {
1213     SolarMutexGuard aSolarMutexGuard;
1214 
1215     SearchToolbarControllersManager::createControllersManager().freeController(m_xFrame, m_aCommandURL);
1216 
1217     svt::ToolboxController::dispose();
1218     m_xSL.disposeAndClear();
1219 }
1220 
1221 // XInitialization
initialize(const css::uno::Sequence<css::uno::Any> & aArguments)1222 void SAL_CALL SearchLabelToolboxController::initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
1223 {
1224     svt::ToolboxController::initialize( aArguments );
1225     SearchToolbarControllersManager::createControllersManager().registryController(m_xFrame, css::uno::Reference< css::frame::XStatusListener >(this), m_aCommandURL);
1226 }
1227 
1228 // XStatusListener
statusChanged(const css::frame::FeatureStateEvent &)1229 void SAL_CALL SearchLabelToolboxController::statusChanged( const css::frame::FeatureStateEvent& )
1230 {
1231     if (m_xSL)
1232     {
1233         OUString aStr = SvxSearchDialogWrapper::GetSearchLabel();
1234         m_xSL->set_label(aStr);
1235         m_xSL->SetOptimalSize();
1236         Size aSize(m_xSL->GetSizePixel());
1237         tools::Long nWidth = !aStr.isEmpty() ? aSize.getWidth() : 16;
1238         m_xSL->SetSizePixel(Size(nWidth, aSize.Height()));
1239     }
1240 }
1241 
createItemWindow(const css::uno::Reference<css::awt::XWindow> & Parent)1242 css::uno::Reference< css::awt::XWindow > SAL_CALL SearchLabelToolboxController::createItemWindow( const css::uno::Reference< css::awt::XWindow >& Parent )
1243 {
1244     ToolBox* pToolBox = nullptr;
1245     ToolBoxItemId nId;
1246     if (getToolboxId(nId, &pToolBox))
1247         pToolBox->SetItemWindowNonInteractive(nId, true);
1248 
1249     m_xSL = VclPtr<LabelItemWindow>::Create(VCLUnoHelper::GetWindow(Parent), "");
1250     m_xSL->SetSizePixel(Size(16, m_xSL->GetSizePixel().Height()));
1251     return VCLUnoHelper::GetInterface(m_xSL);
1252 }
1253 
1254 // protocol handler for "vnd.sun.star.findbar:*" URLs
1255 // The dispatch object will be used for shortcut commands for findbar
1256 class FindbarDispatcher : public css::lang::XServiceInfo,
1257                           public css::lang::XInitialization,
1258                           public css::frame::XDispatchProvider,
1259                           public css::frame::XDispatch,
1260                           public ::cppu::OWeakObject
1261 {
1262 public:
1263 
1264     FindbarDispatcher();
1265     virtual ~FindbarDispatcher() override;
1266 
1267     // XInterface
1268     virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type& aType ) override;
1269     virtual void SAL_CALL acquire() noexcept override;
1270     virtual void SAL_CALL release() noexcept override;
1271 
1272     // XServiceInfo
1273     virtual OUString SAL_CALL getImplementationName() override;
1274     virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
1275     virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
1276 
1277     // XInitialization
1278     virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override;
1279 
1280     // XDispatchProvider
1281     virtual css::uno::Reference< css::frame::XDispatch > SAL_CALL queryDispatch( const css::util::URL& aURL, const OUString& sTargetFrameName , sal_Int32 nSearchFlags ) override;
1282     virtual css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > SAL_CALL queryDispatches( const css::uno::Sequence< css::frame::DispatchDescriptor >& lDescriptions    ) override;
1283 
1284     // XDispatch
1285     virtual void SAL_CALL dispatch( const css::util::URL& aURL, const css::uno::Sequence< css::beans::PropertyValue >& lArguments ) override;
1286     virtual void SAL_CALL addStatusListener( const css::uno::Reference< css::frame::XStatusListener >& xListener, const css::util::URL& aURL ) override;
1287     virtual void SAL_CALL removeStatusListener( const css::uno::Reference< css::frame::XStatusListener >& xListener, const css::util::URL& aURL ) override;
1288 
1289 private:
1290 
1291     css::uno::Reference< css::frame::XFrame > m_xFrame;
1292 
1293 };
1294 
FindbarDispatcher()1295 FindbarDispatcher::FindbarDispatcher()
1296 {
1297 }
1298 
~FindbarDispatcher()1299 FindbarDispatcher::~FindbarDispatcher()
1300 {
1301     m_xFrame = nullptr;
1302 }
1303 
1304 // XInterface
queryInterface(const css::uno::Type & aType)1305 css::uno::Any SAL_CALL FindbarDispatcher::queryInterface( const css::uno::Type& aType )
1306 {
1307     css::uno::Any aReturn( ::cppu::queryInterface( aType,
1308         static_cast< css::lang::XServiceInfo* >(this),
1309         static_cast< css::lang::XInitialization* >(this),
1310         static_cast< css::frame::XDispatchProvider* >(this),
1311         static_cast< css::frame::XDispatch* >(this)) );
1312 
1313     if ( aReturn.hasValue() )
1314         return aReturn;
1315 
1316     return OWeakObject::queryInterface( aType );
1317 }
1318 
acquire()1319 void SAL_CALL FindbarDispatcher::acquire() noexcept
1320 {
1321     OWeakObject::acquire();
1322 }
1323 
release()1324 void SAL_CALL FindbarDispatcher::release() noexcept
1325 {
1326     OWeakObject::release();
1327 }
1328 
1329 // XServiceInfo
getImplementationName()1330 OUString SAL_CALL FindbarDispatcher::getImplementationName()
1331 {
1332     return u"com.sun.star.comp.svx.Impl.FindbarDispatcher"_ustr;
1333 }
1334 
supportsService(const OUString & ServiceName)1335 sal_Bool SAL_CALL FindbarDispatcher::supportsService( const OUString& ServiceName )
1336 {
1337     return cppu::supportsService(this, ServiceName);
1338 }
1339 
getSupportedServiceNames()1340 css::uno::Sequence< OUString > SAL_CALL FindbarDispatcher::getSupportedServiceNames()
1341 {
1342     return { u"com.sun.star.comp.svx.FindbarDispatcher"_ustr, u"com.sun.star.frame.ProtocolHandler"_ustr };
1343 }
1344 
1345 // XInitialization
initialize(const css::uno::Sequence<css::uno::Any> & aArguments)1346 void SAL_CALL FindbarDispatcher::initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
1347 {
1348     if ( aArguments.hasElements() )
1349         aArguments[0] >>= m_xFrame;
1350 }
1351 
1352 // XDispatchProvider
queryDispatch(const css::util::URL & aURL,const OUString &,sal_Int32)1353 css::uno::Reference< css::frame::XDispatch > SAL_CALL FindbarDispatcher::queryDispatch( const css::util::URL& aURL, const OUString& /*sTargetFrameName*/, sal_Int32 /*nSearchFlags*/ )
1354 {
1355     css::uno::Reference< css::frame::XDispatch > xDispatch;
1356 
1357     if ( aURL.Protocol == "vnd.sun.star.findbar:" )
1358         xDispatch = this;
1359 
1360     return xDispatch;
1361 }
1362 
queryDispatches(const css::uno::Sequence<css::frame::DispatchDescriptor> & seqDescripts)1363 css::uno::Sequence < css::uno::Reference< css::frame::XDispatch > > SAL_CALL FindbarDispatcher::queryDispatches( const css::uno::Sequence < css::frame::DispatchDescriptor >& seqDescripts )
1364 {
1365     sal_Int32 nCount = seqDescripts.getLength();
1366     css::uno::Sequence < css::uno::Reference < XDispatch > > lDispatcher( nCount );
1367 
1368     std::transform(seqDescripts.begin(), seqDescripts.end(), lDispatcher.getArray(),
1369         [this](const css::frame::DispatchDescriptor& rDescript) -> css::uno::Reference < XDispatch > {
1370             return queryDispatch( rDescript.FeatureURL, rDescript.FrameName, rDescript.SearchFlags ); });
1371 
1372     return lDispatcher;
1373 }
1374 
1375 // XDispatch
dispatch(const css::util::URL & aURL,const css::uno::Sequence<css::beans::PropertyValue> &)1376 void SAL_CALL FindbarDispatcher::dispatch( const css::util::URL& aURL, const css::uno::Sequence < css::beans::PropertyValue >& /*lArgs*/ )
1377 {
1378     //vnd.sun.star.findbar:FocusToFindbar  - set cursor to the FindTextFieldControl of the findbar
1379     if ( aURL.Path != "FocusToFindbar" )
1380         return;
1381 
1382     css::uno::Reference< css::beans::XPropertySet > xPropSet(m_xFrame, css::uno::UNO_QUERY);
1383     if(!xPropSet.is())
1384         return;
1385 
1386     css::uno::Reference< css::frame::XLayoutManager > xLayoutManager;
1387     css::uno::Any aValue = xPropSet->getPropertyValue(u"LayoutManager"_ustr);
1388     aValue >>= xLayoutManager;
1389     if (!xLayoutManager.is())
1390         return;
1391 
1392     static constexpr OUString sResourceURL( u"private:resource/toolbar/findbar"_ustr );
1393     css::uno::Reference< css::ui::XUIElement > xUIElement = xLayoutManager->getElement(sResourceURL);
1394     if (!xUIElement.is())
1395     {
1396         // show the findbar if necessary
1397         xLayoutManager->createElement( sResourceURL );
1398         xLayoutManager->showElement( sResourceURL );
1399         xUIElement = xLayoutManager->getElement( sResourceURL );
1400         if ( !xUIElement.is() )
1401             return;
1402     }
1403 
1404     css::uno::Reference< css::awt::XWindow > xWindow(xUIElement->getRealInterface(), css::uno::UNO_QUERY);
1405     VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow( xWindow );
1406     ToolBox* pToolBox = static_cast<ToolBox*>(pWindow.get());
1407     pToolBox->set_id(u"FindBar"_ustr);
1408     if ( !pToolBox )
1409         return;
1410 
1411     ToolBox::ImplToolItems::size_type nItemCount = pToolBox->GetItemCount();
1412     for ( ToolBox::ImplToolItems::size_type i=0; i<nItemCount; ++i )
1413     {
1414         ToolBoxItemId id = pToolBox->GetItemId(i);
1415         OUString sItemCommand = pToolBox->GetItemCommand(id);
1416         if ( sItemCommand == COMMAND_FINDTEXT )
1417         {
1418             vcl::Window* pItemWin = pToolBox->GetItemWindow( id );
1419             if ( pItemWin )
1420             {
1421                 SolarMutexGuard aSolarMutexGuard;
1422                 FindTextFieldControl* pFindTextFieldControl = dynamic_cast<FindTextFieldControl*>(pItemWin);
1423                 if ( pFindTextFieldControl )
1424                     pFindTextFieldControl->SetTextToSelected_Impl();
1425                 pItemWin->GrabFocus();
1426                 return;
1427             }
1428         }
1429     }
1430 }
1431 
addStatusListener(const css::uno::Reference<css::frame::XStatusListener> &,const css::util::URL &)1432 void SAL_CALL FindbarDispatcher::addStatusListener( const css::uno::Reference< css::frame::XStatusListener >& /*xControl*/, const css::util::URL& /*aURL*/ )
1433 {
1434 }
1435 
removeStatusListener(const css::uno::Reference<css::frame::XStatusListener> &,const css::util::URL &)1436 void SAL_CALL FindbarDispatcher::removeStatusListener( const css::uno::Reference< css::frame::XStatusListener >& /*xControl*/, const css::util::URL& /*aURL*/ )
1437 {
1438 }
1439 
1440 }
1441 
1442 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
com_sun_star_svx_FindTextToolboxController_get_implementation(css::uno::XComponentContext * context,css::uno::Sequence<css::uno::Any> const &)1443 com_sun_star_svx_FindTextToolboxController_get_implementation(
1444     css::uno::XComponentContext *context,
1445     css::uno::Sequence<css::uno::Any> const &)
1446 {
1447     return cppu::acquire(new FindTextToolbarController(context));
1448 }
1449 
1450 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
com_sun_star_svx_ExitFindbarToolboxController_get_implementation(css::uno::XComponentContext * context,css::uno::Sequence<css::uno::Any> const &)1451 com_sun_star_svx_ExitFindbarToolboxController_get_implementation(
1452     css::uno::XComponentContext *context,
1453     css::uno::Sequence<css::uno::Any> const &)
1454 {
1455     return cppu::acquire(new ExitSearchToolboxController(context));
1456 }
1457 
1458 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
com_sun_star_svx_UpSearchToolboxController_get_implementation(css::uno::XComponentContext * context,css::uno::Sequence<css::uno::Any> const &)1459 com_sun_star_svx_UpSearchToolboxController_get_implementation(
1460     css::uno::XComponentContext *context,
1461     css::uno::Sequence<css::uno::Any> const &)
1462 {
1463     return cppu::acquire(new UpDownSearchToolboxController(context, UpDownSearchToolboxController::UP));
1464 }
1465 
1466 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
com_sun_star_svx_DownSearchToolboxController_get_implementation(css::uno::XComponentContext * context,css::uno::Sequence<css::uno::Any> const &)1467 com_sun_star_svx_DownSearchToolboxController_get_implementation(
1468     css::uno::XComponentContext *context,
1469     css::uno::Sequence<css::uno::Any> const &)
1470 {
1471     return cppu::acquire(new UpDownSearchToolboxController(context, UpDownSearchToolboxController::DOWN));
1472 }
1473 
1474 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
com_sun_star_svx_MatchCaseToolboxController_get_implementation(css::uno::XComponentContext * context,css::uno::Sequence<css::uno::Any> const &)1475 com_sun_star_svx_MatchCaseToolboxController_get_implementation(
1476     css::uno::XComponentContext *context,
1477     css::uno::Sequence<css::uno::Any> const &)
1478 {
1479     return cppu::acquire(new MatchCaseToolboxController(context));
1480 }
1481 
1482 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
com_sun_star_svx_SearchFormattedToolboxController_get_implementation(css::uno::XComponentContext * context,css::uno::Sequence<css::uno::Any> const &)1483 com_sun_star_svx_SearchFormattedToolboxController_get_implementation(
1484     css::uno::XComponentContext *context,
1485     css::uno::Sequence<css::uno::Any> const &)
1486 {
1487     return cppu::acquire(new SearchFormattedToolboxController(context));
1488 }
1489 
1490 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
com_sun_star_svx_FindAllToolboxController_get_implementation(css::uno::XComponentContext * context,css::uno::Sequence<css::uno::Any> const &)1491 com_sun_star_svx_FindAllToolboxController_get_implementation(
1492     css::uno::XComponentContext *context,
1493     css::uno::Sequence<css::uno::Any> const &)
1494 {
1495     return cppu::acquire(new FindAllToolboxController(context));
1496 }
1497 
1498 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
com_sun_star_svx_SearchLabelToolboxController_get_implementation(css::uno::XComponentContext * context,css::uno::Sequence<css::uno::Any> const &)1499 com_sun_star_svx_SearchLabelToolboxController_get_implementation(
1500     css::uno::XComponentContext *context,
1501     css::uno::Sequence<css::uno::Any> const &)
1502 {
1503     return cppu::acquire(new SearchLabelToolboxController(context));
1504 }
1505 
1506 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
com_sun_star_comp_svx_Impl_FindbarDispatcher_get_implementation(SAL_UNUSED_PARAMETER css::uno::XComponentContext *,css::uno::Sequence<css::uno::Any> const &)1507 com_sun_star_comp_svx_Impl_FindbarDispatcher_get_implementation(
1508     SAL_UNUSED_PARAMETER css::uno::XComponentContext *,
1509     css::uno::Sequence<css::uno::Any> const &)
1510 {
1511     return cppu::acquire(new FindbarDispatcher);
1512 }
1513 
1514 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
1515