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