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