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 : * 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 : #ifndef INCLUDED_DBACCESS_SOURCE_UI_INC_BRWCTRLR_HXX
21 : #define INCLUDED_DBACCESS_SOURCE_UI_INC_BRWCTRLR_HXX
22 :
23 : #include <dbaccess/genericcontroller.hxx>
24 : #include "moduledbu.hxx"
25 : #include "brwview.hxx"
26 : #include "sbagrid.hxx"
27 :
28 : #include <com/sun/star/form/XLoadable.hpp>
29 : #include <com/sun/star/container/XContainerListener.hpp>
30 : #include <com/sun/star/sdb/XSQLErrorListener.hpp>
31 : #include <com/sun/star/sdbc/XRowSet.hpp>
32 : #include <com/sun/star/form/XResetListener.hpp>
33 : #include <com/sun/star/form/XDatabaseParameterListener.hpp>
34 : #include <com/sun/star/form/XConfirmDeleteListener.hpp>
35 : #include <com/sun/star/form/XFormComponent.hpp>
36 : #include <com/sun/star/awt/XFocusListener.hpp>
37 : #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
38 : #include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp>
39 : #include <com/sun/star/beans/XPropertyChangeListener.hpp>
40 : #include <com/sun/star/frame/XModule.hpp>
41 :
42 : #include <vcl/timer.hxx>
43 : #include <svtools/transfer.hxx>
44 : #include <osl/mutex.hxx>
45 : #include <osl/thread.hxx>
46 : #include <cppuhelper/implbase9.hxx>
47 : #include <svtools/cliplistener.hxx>
48 :
49 : struct FmFoundRecordInformation;
50 : struct FmSearchContext;
51 :
52 : namespace dbtools
53 : {
54 : class SQLExceptionInfo;
55 : }
56 :
57 : namespace dbaui
58 : {
59 :
60 : typedef ::cppu::ImplInheritanceHelper9 < OGenericUnoController
61 : , ::com::sun::star::sdb::XSQLErrorListener
62 : , ::com::sun::star::form::XDatabaseParameterListener
63 : , ::com::sun::star::form::XConfirmDeleteListener
64 : , ::com::sun::star::form::XLoadListener
65 : , ::com::sun::star::form::XResetListener
66 : , ::com::sun::star::awt::XFocusListener
67 : , ::com::sun::star::container::XContainerListener
68 : , ::com::sun::star::beans::XPropertyChangeListener
69 : , ::com::sun::star::frame::XModule
70 : > SbaXDataBrowserController_Base;
71 :
72 : class SbaXDataBrowserController :public SbaXDataBrowserController_Base
73 : ,public SbaGridListener
74 : {
75 : // attributes
76 : private:
77 : // for implementing the XFormController
78 : class FormControllerImpl;
79 : friend class FormControllerImpl;
80 : OModuleClient m_aModuleClient;
81 :
82 : ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet > m_xRowSet; // our rowset
83 : ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XColumnsSupplier > m_xColumnsSupplier; // queried from the rowset member
84 : ::com::sun::star::uno::Reference< ::com::sun::star::form::XLoadable > m_xLoadable; // queried from the rowset member as well
85 : ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent > m_xGridModel; // the model of our grid
86 : ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter > m_xFormatter; // a number formatter working with the connection's NumberFormatsSupplier
87 : ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation > m_xFormControllerImpl;
88 : mutable ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSingleSelectQueryComposer >
89 : m_xParser; // for sorting 'n filtering
90 :
91 : sal_Int32 m_nRowSetPrivileges; // cached Privileges property of m_xRowSet
92 :
93 : AutoTimer m_aInvalidateClipboard; // for testing the state of the CUT/COPY/PASTE-slots
94 :
95 : TransferableDataHelper m_aSystemClipboard; // content of the clipboard
96 : TransferableClipboardListener*
97 : m_pClipbordNotifier; // notifier for changes in the clipboard
98 :
99 : ::osl::Mutex m_aAsyncLoadSafety; // for multi-thread access to our members
100 :
101 : OAsyncronousLink m_aAsyncGetCellFocus;
102 : OAsyncronousLink m_aAsyncDisplayError;
103 : ::dbtools::SQLExceptionInfo m_aCurrentError;
104 :
105 : OUString m_sStateSaveRecord;
106 : OUString m_sStateUndoRecord;
107 : OUString m_sModuleIdentifier;
108 :
109 : // members for asynchronous load operations
110 : FormControllerImpl* m_pFormControllerImpl; // implementing the XFormController
111 :
112 : sal_uInt16 m_nFormActionNestingLevel; // see enter-/leaveFormAction
113 :
114 : sal_Bool m_bLoadCanceled : 1; // the load was canceled somehow
115 : bool m_bCannotSelectUnfiltered : 1; // received an DATA_CANNOT_SELECT_UNFILTERED error
116 :
117 : protected:
118 : class FormErrorHelper
119 : {
120 : SbaXDataBrowserController* m_pOwner;
121 : public:
122 0 : FormErrorHelper(SbaXDataBrowserController* pOwner) : m_pOwner(pOwner) { m_pOwner->enterFormAction(); }
123 0 : virtual ~FormErrorHelper() { m_pOwner->leaveFormAction(); }
124 : };
125 : friend class FormErrorHelper;
126 :
127 : // attribute access
128 : protected:
129 0 : ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet > getRowSet() const { return m_xRowSet; }
130 0 : ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XColumnsSupplier > getColumnsSupplier()const { return m_xColumnsSupplier; }
131 0 : ::com::sun::star::uno::Reference< ::com::sun::star::form::XLoadable > getLoadable() const { return m_xLoadable; }
132 :
133 0 : ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent > getFormComponent() const { return m_xGridModel; }
134 0 : ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > getControlModel() const { return ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > (m_xGridModel, ::com::sun::star::uno::UNO_QUERY); }
135 0 : ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter > getNumberFormatter()const { return m_xFormatter; }
136 :
137 0 : sal_Bool isValid() const { return m_xRowSet.is() && m_xGridModel.is(); }
138 : sal_Bool isValidCursor() const; // checks the ::com::sun::star::data::XDatabaseCursor-interface of m_xRowSet
139 : sal_Bool isLoaded() const;
140 0 : sal_Bool loadingCancelled() const { return m_bLoadCanceled; }
141 : void onStartLoading( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XLoadable >& _rxLoadable );
142 0 : void setLoadingCancelled() { m_bLoadCanceled = sal_True; }
143 :
144 : const TransferableDataHelper&
145 : getViewClipboard() const { return m_aSystemClipboard; }
146 :
147 : public:
148 : SbaXDataBrowserController(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rM);
149 :
150 0 : UnoDataBrowserView* getBrowserView() const { return static_cast< UnoDataBrowserView*>(getView()); }
151 : // late construction
152 : virtual bool Construct(Window* pParent) SAL_OVERRIDE;
153 :
154 : // UNO
155 : virtual ::com::sun::star::uno::Any SAL_CALL queryInterface(const ::com::sun::star::uno::Type& _rType) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
156 :
157 : // XTypeProvider
158 : virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
159 : virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId( ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
160 :
161 : // ::com::sun::star::lang::XEventListener
162 : virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
163 :
164 : // ::com::sun::star::util::XModifyListener
165 : virtual void SAL_CALL modified(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
166 :
167 : // ::com::sun::star::container::XContainerListener
168 : virtual void SAL_CALL elementInserted(const ::com::sun::star::container::ContainerEvent& Event) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
169 : virtual void SAL_CALL elementRemoved(const ::com::sun::star::container::ContainerEvent& Event) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
170 : virtual void SAL_CALL elementReplaced(const ::com::sun::star::container::ContainerEvent& Event) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
171 :
172 : // XPropertyChangeListener
173 : virtual void SAL_CALL propertyChange( const ::com::sun::star::beans::PropertyChangeEvent& evt ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
174 :
175 : // XModule
176 : virtual void SAL_CALL setIdentifier( const OUString& Identifier ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
177 : virtual OUString SAL_CALL getIdentifier( ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
178 :
179 : // ::com::sun::star::awt::XFocusListener
180 : virtual void SAL_CALL focusGained(const ::com::sun::star::awt::FocusEvent& e) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
181 : virtual void SAL_CALL focusLost(const ::com::sun::star::awt::FocusEvent& e) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
182 :
183 : // ::com::sun::star::frame::XController
184 : virtual sal_Bool SAL_CALL suspend(sal_Bool bSuspend) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
185 :
186 : // ::com::sun::star::lang::XComponent
187 : virtual void SAL_CALL disposing() SAL_OVERRIDE;
188 :
189 : // ::com::sun::star::frame::XFrameActionListener
190 : virtual void SAL_CALL frameAction(const ::com::sun::star::frame::FrameActionEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
191 :
192 : // ::com::sun::star::sdb::XSQLErrorListener
193 : virtual void SAL_CALL errorOccured(const ::com::sun::star::sdb::SQLErrorEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
194 :
195 : // ::com::sun::star::form::XDatabaseParameterListener
196 : virtual sal_Bool SAL_CALL approveParameter(const ::com::sun::star::form::DatabaseParameterEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
197 :
198 : // ::com::sun::star::form::XConfirmDeleteListener
199 : virtual sal_Bool SAL_CALL confirmDelete(const ::com::sun::star::sdb::RowChangeEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
200 :
201 : // ::com::sun::star::form::XLoadListener
202 : virtual void SAL_CALL loaded(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
203 : virtual void SAL_CALL unloading(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
204 : virtual void SAL_CALL unloaded(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
205 : virtual void SAL_CALL reloading(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
206 : virtual void SAL_CALL reloaded(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
207 :
208 : // ::com::sun::star::form::XResetListener
209 : virtual sal_Bool SAL_CALL approveReset(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
210 : virtual void SAL_CALL resetted(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
211 :
212 : // SbaGridListener
213 : virtual void RowChanged() SAL_OVERRIDE;
214 : virtual void ColumnChanged() SAL_OVERRIDE;
215 : virtual void SelectionChanged() SAL_OVERRIDE;
216 : virtual void CellActivated() SAL_OVERRIDE;
217 : virtual void CellDeactivated() SAL_OVERRIDE;
218 : virtual void BeforeDrop() SAL_OVERRIDE;
219 : virtual void AfterDrop() SAL_OVERRIDE;
220 :
221 : public:
222 :
223 : protected:
224 : virtual ~SbaXDataBrowserController();
225 :
226 : // all the features which should be handled by this class
227 : virtual void describeSupportedFeatures() SAL_OVERRIDE;
228 : // state of a feature. 'feature' may be the handle of a ::com::sun::star::util::URL somebody requested a dispatch interface for OR a toolbar slot.
229 : virtual FeatureState GetState(sal_uInt16 nId) const SAL_OVERRIDE;
230 : // execute a feature
231 : virtual void Execute(sal_uInt16 nId, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue>& aArgs) SAL_OVERRIDE;
232 :
233 : virtual void startFrameListening( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& _rxFrame ) SAL_OVERRIDE;
234 : virtual void stopFrameListening( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& _rxFrame ) SAL_OVERRIDE;
235 :
236 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet > CreateForm();
237 : // our default implementation simply instantiates a stardiv.one.form.component.Form service
238 : // (probably this needs not to be overloaded, but you may return anything you want as long as it
239 : // supports the ::com::sun::star::form::DatabaseForm service. For instance you may want to create an adapter here which
240 : // is synchronized with a foreign ::com::sun::star::form::DatabaseForm you got elsewhere)
241 : virtual sal_Bool InitializeForm(
242 : const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& i_formProperties ) = 0;
243 : // called immediately after a successful CreateForm
244 : // do any initialization (data source etc.) here. the form should be fully functional after that.
245 : // return sal_False if you didn't succeed (don't throw exceptions, they won't be caught)
246 :
247 : virtual sal_Bool InitializeGridModel(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent > & xGrid);
248 :
249 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent > CreateGridModel();
250 : // our default implementation simply instantiates a stardiv.one.form.component.Grid service
251 : // you most probably don't want to override this behaviuor
252 :
253 : // the default implementation of disposing distributes the events to the following disposingXXX functions
254 : virtual void disposingGridControl(const ::com::sun::star::lang::EventObject& Source); // calls removeControlListeners
255 : virtual void disposingGridModel(const ::com::sun::star::lang::EventObject& Source); // calls removeModelListeners
256 : virtual void disposingFormModel(const ::com::sun::star::lang::EventObject& Source);
257 : virtual void disposingColumnModel(const ::com::sun::star::lang::EventObject& Source);
258 :
259 : // want to be a listener to the grid control ? use this !
260 : virtual void addControlListeners(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl > & _xGridControl);
261 : virtual void removeControlListeners(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl > & _xGridControl);
262 :
263 : // want to be a listener to the grid model ? use this !
264 : virtual void addModelListeners(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > & _xGridControlModel);
265 : virtual void removeModelListeners(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > & _xGridControlModel);
266 :
267 : // want to be a listener grid columns ? use this !
268 : virtual void AddColumnListener(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & xCol);
269 : virtual void RemoveColumnListener(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & xCol);
270 :
271 : // call after "major changes" (e.g. the completion of the async load).
272 : // invalidates all toolbox slots and all supported features.
273 :
274 : virtual sal_Bool LoadForm();
275 : // load the form
276 : // the default implementation does an direct load or starts a load thread, depending on the multithread capabilities
277 : // of the data source.
278 : // the default implementation also calls LoadFinished after a syncronous load, so be sure to do the same if you override
279 : // this metod and don't call the base class' method
280 :
281 : virtual void LoadFinished(sal_Bool bWasSynch);
282 : // called if the loading (the _complete_ loading process) is done (no matter if synchron or asynchron).
283 :
284 : virtual void criticalFail();
285 : // called whenever a reload operation on the rowset failed
286 : // (a "operation" is not only a simple reload: If the user sets a filter, an reloading the form
287 : // after setting this filter fails, the filter is reset and the form is reloaded, again. Only the
288 : // whole process (_both_ XLoadable::reload calls _together_) form the "reload operation"
289 :
290 : // empty the frame where our view resides
291 : virtual sal_Bool CommitCurrent();
292 : // commit the current column (i.e. cell)
293 : virtual sal_Bool SaveModified(sal_Bool bAskFor = sal_True);
294 : // save the modified record
295 :
296 : ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > getBoundField(sal_uInt16 nViewPos = (sal_uInt16)-1) const;
297 : // a PropertySet corresponding to the cursor field a column is bound to
298 : // if nViewPos is (sal_uInt16)-1 (the default) then the field for the current column will be retrieved
299 :
300 : void enterFormAction();
301 : void leaveFormAction();
302 :
303 : // init the formatter if form changes
304 : void initFormatter();
305 :
306 : /// loads or reloads the form
307 : virtual sal_Bool reloadForm(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XLoadable >& _rxLoadable);
308 :
309 0 : virtual sal_Bool preReloadForm(){ return sal_False; }
310 0 : virtual void postReloadForm(){}
311 :
312 : ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSingleSelectQueryComposer >
313 : createParser_nothrow();
314 :
315 : private:
316 : void setCurrentModified( sal_Bool _bSet );
317 :
318 : // execute the filter or sort slot
319 : void ExecuteFilterSortCrit(sal_Bool bFilter);
320 :
321 : // execute the search slot
322 : void ExecuteSearch();
323 :
324 : void initializeParser() const; // changes the mutable member m_xParser
325 : void applyParserFilter(const OUString& _rOldFilter, sal_Bool _bOldFilterApplied,const ::OUString& _sOldHaving,const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSingleSelectQueryComposer >& _xParser);
326 : void applyParserOrder(const OUString& _rOldOrder,const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSingleSelectQueryComposer >& _xParser);
327 :
328 : sal_Int16 getCurrentColumnPosition();
329 : void setCurrentColumnPosition( sal_Int16 _nPos );
330 : void addColumnListeners(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > & _xGridControlModel);
331 :
332 : void impl_checkForCannotSelectUnfiltered( const ::dbtools::SQLExceptionInfo& _rError );
333 :
334 : // time to check the CUT/COPY/PASTE-slot-states
335 : DECL_LINK( OnInvalidateClipboard, AutoTimer* );
336 : DECL_LINK( OnClipboardChanged, void* );
337 :
338 : // search callbacks
339 : DECL_LINK(OnSearchContextRequest, FmSearchContext*);
340 : DECL_LINK(OnFoundData, FmFoundRecordInformation*);
341 : DECL_LINK(OnCanceledNotFound, FmFoundRecordInformation*);
342 :
343 : DECL_LINK(OnAsyncGetCellFocus, void*);
344 :
345 : DECL_LINK( OnAsyncDisplayError, void* );
346 : };
347 : }
348 :
349 : #endif // INCLUDED_DBACCESS_SOURCE_UI_INC_BRWCTRLR_HXX
350 :
351 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|