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