Line data Source code
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 :
10 : #include "limitboxcontroller.hxx"
11 : #include "uiservices.hxx"
12 :
13 : #include <com/sun/star/frame/XDispatchProvider.hpp>
14 : #include <com/sun/star/beans/PropertyValue.hpp>
15 :
16 : #include <vcl/svapp.hxx>
17 : #include <vcl/window.hxx>
18 : #include <toolkit/helper/vclunohelper.hxx>
19 : #include <osl/mutex.hxx>
20 : #include <cppuhelper/queryinterface.hxx>
21 : #include <comphelper/processfactory.hxx>
22 :
23 : #include "LimitBox.hxx"
24 : #include "dbu_reghelper.hxx"
25 : #include "moduledbu.hxx"
26 :
27 :
28 : using namespace ::com::sun::star;
29 :
30 : namespace dbaui
31 : {
32 :
33 0 : class LimitBoxImpl: public LimitBox
34 : {
35 : public:
36 : LimitBoxImpl( vcl::Window* pParent, LimitBoxController* pCtrl );
37 :
38 : virtual bool Notify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
39 :
40 : private:
41 : LimitBoxController* m_pControl;
42 : };
43 :
44 0 : LimitBoxImpl::LimitBoxImpl( vcl::Window* pParent, LimitBoxController* pCtrl )
45 : : LimitBox( pParent, WinBits( WB_DROPDOWN | WB_VSCROLL) )
46 0 : , m_pControl( pCtrl )
47 : {
48 0 : }
49 :
50 0 : bool LimitBoxImpl::Notify( NotifyEvent& rNEvt )
51 : {
52 0 : bool nHandled = false;
53 0 : switch ( rNEvt.GetType() )
54 : {
55 : case MouseNotifyEvent::LOSEFOCUS:
56 : {
57 0 : nHandled = LimitBox::Notify( rNEvt );
58 0 : uno::Sequence< beans::PropertyValue > aArgs( 1 );
59 0 : aArgs[0].Name = "DBLimit.Value";
60 0 : aArgs[0].Value = uno::makeAny( GetValue() );
61 0 : m_pControl->dispatchCommand( aArgs );
62 0 : break;
63 : }
64 : case MouseNotifyEvent::KEYINPUT:
65 : {
66 0 : const sal_uInt16 nCode = rNEvt.GetKeyEvent()->GetKeyCode().GetCode();
67 0 : switch ( nCode )
68 : {
69 : case KEY_ESCAPE:
70 0 : Undo();
71 : // fall-through
72 : case KEY_RETURN:
73 0 : GrabFocusToDocument();
74 0 : nHandled = true;
75 0 : break;
76 : case KEY_TAB:
77 0 : Select();
78 0 : break;
79 : }
80 0 : break;
81 : }
82 : default:
83 0 : break;
84 : }
85 0 : return nHandled || LimitBox::Notify( rNEvt );
86 : }
87 :
88 :
89 1 : LimitBoxController::LimitBoxController(
90 : const uno::Reference< uno::XComponentContext >& rxContext ) :
91 : svt::ToolboxController( rxContext,
92 : uno::Reference< frame::XFrame >(),
93 : OUString( ".uno:DBLimit" ) ),
94 1 : m_pLimitBox( NULL )
95 : {
96 1 : }
97 :
98 2 : LimitBoxController::~LimitBoxController()
99 : {
100 2 : }
101 :
102 : /// XInterface
103 4 : uno::Any SAL_CALL LimitBoxController::queryInterface( const uno::Type& aType )
104 : throw (uno::RuntimeException, std::exception)
105 : {
106 4 : uno::Any a = ToolboxController::queryInterface( aType );
107 4 : if ( a.hasValue() )
108 3 : return a;
109 :
110 1 : return ::cppu::queryInterface( aType, static_cast< lang::XServiceInfo* >( this ));
111 : }
112 :
113 16 : void SAL_CALL LimitBoxController::acquire() throw ()
114 : {
115 16 : ToolboxController::acquire();
116 16 : }
117 :
118 16 : void SAL_CALL LimitBoxController::release() throw ()
119 : {
120 16 : ToolboxController::release();
121 16 : }
122 :
123 :
124 : /// XServiceInfo
125 26 : IMPLEMENT_SERVICE_INFO_IMPLNAME_STATIC(LimitBoxController, "org.libreoffice.comp.dbu.LimitBoxController")
126 0 : IMPLEMENT_SERVICE_INFO_SUPPORTS(LimitBoxController)
127 14 : IMPLEMENT_SERVICE_INFO_GETSUPPORTED1_STATIC(LimitBoxController, "com.sun.star.frame.ToolbarController")
128 :
129 : uno::Reference< uno::XInterface >
130 1 : SAL_CALL LimitBoxController::Create(const uno::Reference< css::lang::XMultiServiceFactory >& _rxORB)
131 : {
132 1 : return static_cast< XServiceInfo* >(new LimitBoxController( comphelper::getComponentContext(_rxORB) ));
133 : }
134 :
135 : /// XComponent
136 1 : void SAL_CALL LimitBoxController::dispose()
137 : throw (uno::RuntimeException, std::exception)
138 : {
139 1 : svt::ToolboxController::dispose();
140 :
141 1 : SolarMutexGuard aSolarMutexGuard;
142 1 : m_pLimitBox.disposeAndClear();
143 1 : }
144 :
145 : /// XStatusListener
146 0 : void SAL_CALL LimitBoxController::statusChanged(
147 : const frame::FeatureStateEvent& rEvent )
148 : throw ( uno::RuntimeException, std::exception )
149 : {
150 0 : if ( m_pLimitBox )
151 : {
152 0 : SolarMutexGuard aSolarMutexGuard;
153 0 : if ( rEvent.FeatureURL.Path == "DBLimit" )
154 : {
155 0 : if ( rEvent.IsEnabled )
156 : {
157 0 : m_pLimitBox->Enable();
158 0 : sal_Int64 nLimit = 0;
159 0 : if ( (rEvent.State >>= nLimit) )
160 : {
161 0 : m_pLimitBox->SetValue( nLimit );
162 : }
163 : }
164 : else
165 0 : m_pLimitBox->Disable();
166 0 : }
167 : }
168 0 : }
169 :
170 : /// XToolbarController
171 0 : void SAL_CALL LimitBoxController::execute( sal_Int16 /*KeyModifier*/ )
172 : throw (uno::RuntimeException, std::exception)
173 : {
174 0 : }
175 :
176 0 : void SAL_CALL LimitBoxController::click()
177 : throw (uno::RuntimeException, std::exception)
178 : {
179 0 : }
180 :
181 0 : void SAL_CALL LimitBoxController::doubleClick()
182 : throw (uno::RuntimeException, std::exception)
183 : {
184 0 : }
185 :
186 0 : uno::Reference< awt::XWindow > SAL_CALL LimitBoxController::createPopupWindow()
187 : throw (uno::RuntimeException, std::exception)
188 : {
189 0 : return uno::Reference< awt::XWindow >();
190 : }
191 :
192 0 : uno::Reference< awt::XWindow > SAL_CALL LimitBoxController::createItemWindow(
193 : const uno::Reference< awt::XWindow >& Parent )
194 : throw (uno::RuntimeException, std::exception)
195 : {
196 0 : uno::Reference< awt::XWindow > xItemWindow;
197 0 : uno::Reference< awt::XWindow > xParent( Parent );
198 :
199 0 : vcl::Window* pParent = VCLUnoHelper::GetWindow( xParent );
200 0 : if ( pParent )
201 : {
202 0 : SolarMutexGuard aSolarMutexGuard;
203 0 : m_pLimitBox = VclPtr<LimitBoxImpl>::Create(pParent, this);
204 0 : m_pLimitBox->SetSizePixel(m_pLimitBox->CalcBlockSize(6,1));
205 0 : xItemWindow = VCLUnoHelper::GetInterface( m_pLimitBox );
206 : }
207 :
208 0 : return xItemWindow;
209 : }
210 :
211 0 : void LimitBoxController::dispatchCommand(
212 : const uno::Sequence< beans::PropertyValue >& rArgs )
213 : {
214 0 : uno::Reference< frame::XDispatchProvider > xDispatchProvider( m_xFrame, uno::UNO_QUERY );
215 0 : if ( xDispatchProvider.is() )
216 : {
217 0 : util::URL aURL;
218 0 : uno::Reference< frame::XDispatch > xDispatch;
219 0 : uno::Reference< util::XURLTransformer > xURLTransformer = getURLTransformer();
220 :
221 0 : aURL.Complete = ".uno:DBLimit";
222 0 : xURLTransformer->parseStrict( aURL );
223 0 : xDispatch = xDispatchProvider->queryDispatch( aURL, OUString(), 0 );
224 0 : if ( xDispatch.is() )
225 0 : xDispatch->dispatch( aURL, rArgs );
226 0 : }
227 0 : }
228 :
229 : } ///dbaui namespace
230 :
231 12 : extern "C" void SAL_CALL createRegistryInfo_LimitBoxController()
232 : {
233 12 : static ::dbaui::OMultiInstanceAutoRegistration< ::dbaui::LimitBoxController > aAutoRegistration;
234 48 : }
235 :
236 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|