xref: /trunk/main/dbaccess/source/ui/inc/querycontroller.hxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef DBAUI_QUERYCONTROLLER_HXX
29 #define DBAUI_QUERYCONTROLLER_HXX
30 
31 #include "JoinController.hxx"
32 #include "JoinTableView.hxx"
33 #include "querycontainerwindow.hxx"
34 #include "queryview.hxx"
35 #include "svx/ParseContext.hxx"
36 #include "TableFieldDescription.hxx"
37 
38 /** === begin UNO includes === **/
39 #include <com/sun/star/io/XObjectInputStream.hpp>
40 #include <com/sun/star/io/XObjectOutputStream.hpp>
41 #include <com/sun/star/sdb/CommandType.hpp>
42 #include <com/sun/star/sdb/XSQLQueryComposer.hpp>
43 #include <com/sun/star/sdbc/XConnection.hpp>
44 #include <com/sun/star/sdbcx/XAlterView.hpp>
45 /** === end UNO includes === **/
46 
47 #include <comphelper/proparrhlp.hxx>
48 #include <comphelper/propertycontainer.hxx>
49 #include <comphelper/uno3.hxx>
50 #include <comphelper/uno3.hxx>
51 #include <connectivity/sqliterator.hxx>
52 #include <connectivity/sqlnode.hxx>
53 #include <connectivity/sqlparse.hxx>
54 #include <svl/undo.hxx>
55 
56 namespace comphelper
57 {
58     class NamedValueCollection;
59 }
60 
61 class VCLXWindow;
62 namespace dbaui
63 {
64     class OQueryView;
65     class OQueryContainerWindow;
66     class OTableConnectionData;
67     class OTableWindowData;
68     class OAddTableDlg;
69     class OTableFieldDesc;
70     class OQueryTableWindow;
71 
72     class OQueryController;
73     typedef ::comphelper::OPropertyContainer                            OQueryController_PBase;
74     typedef ::comphelper::OPropertyArrayUsageHelper< OQueryController > OQueryController_PABase;
75     class OQueryController  :public OJoinController
76                             ,public OQueryController_PBase
77                             ,public OQueryController_PABase
78     {
79         OTableFields                            m_vTableFieldDesc;
80         OTableFields                            m_vUnUsedFieldsDesc; // contains fields which aren't visible and don't have any criteria
81 
82         ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >       m_aFieldInformation;
83 
84         ::svxform::OSystemParseContext*         m_pParseContext;
85         ::connectivity::OSQLParser              m_aSqlParser;
86         ::connectivity::OSQLParseTreeIterator*  m_pSqlIterator;
87 
88         ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSQLQueryComposer >    m_xComposer;
89         /// if we're editing an existing view, this is non-NULL
90         ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XAlterView >         m_xAlterView;
91 
92         ::rtl::OUString m_sStatement;           // contains the current sql statement
93         ::rtl::OUString m_sUpdateCatalogName;   // catalog for update data
94         ::rtl::OUString m_sUpdateSchemaName;    // schema for update data
95         ::rtl::OUString m_sUpdateTableName;     // table for update data
96         mutable ::rtl::OUString
97                         m_sName;                // name of the query
98 
99         sal_Int32       m_nVisibleRows;     // which rows the selection browse should show
100         sal_Int32       m_nSplitPos;        // the position of the splitter
101         sal_Int32       m_nCommandType;     // the type of the object we're designing
102         sal_Bool        m_bGraphicalDesign; // are we in the graphical design mode (sal_True) or in the text design (sal_False)?
103         sal_Bool        m_bDistinct;        // true when you want "select distinct" otherwise false
104         sal_Bool        m_bViewAlias;       // show the alias row in the design view
105         sal_Bool        m_bViewTable;       // show the table row in the design view
106         sal_Bool        m_bViewFunction;    // show the function row in the design view
107         sal_Bool        m_bEscapeProcessing;// is true when we shouldn't parse the statement
108 
109 
110         /** returns the container of queries, views, or command definitions, depending on what object type
111             we design currently.
112 
113             Not allowed to be called if we design an independent SQL command.
114         */
115         ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >
116             getObjectContainer() const;
117 
118         inline  bool    editingView() const    { return m_nCommandType == ::com::sun::star::sdb::CommandType::TABLE; }
119         inline  bool    editingQuery() const   { return m_nCommandType == ::com::sun::star::sdb::CommandType::QUERY; }
120         inline  bool    editingCommand() const { return m_nCommandType == ::com::sun::star::sdb::CommandType::COMMAND; }
121 
122         sal_Bool askForNewName( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess>& _xElements,
123                             sal_Bool _bSaveAs);
124         // creates the querycomposer
125         void setQueryComposer();
126         void deleteIterator();
127         void executeQuery();
128         bool doSaveAsDoc(sal_Bool _bSaveAs);
129 
130         void saveViewSettings( ::comphelper::NamedValueCollection& o_rViewSettings, const bool i_includingCriteria ) const;
131         void loadViewSettings( const ::comphelper::NamedValueCollection& o_rViewSettings );
132         ::rtl::OUString translateStatement( bool _bFireStatementChange = true );
133 
134         ::rtl::OUString getDefaultName() const;
135 
136     protected:
137         // all the features which should be handled by this class
138         virtual void            describeSupportedFeatures();
139         // 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.
140         virtual FeatureState    GetState(sal_uInt16 nId) const;
141         // execute a feature
142         virtual void            Execute(sal_uInt16 nId, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue>& aArgs);
143 
144         virtual void            reconnect( sal_Bool _bUI );
145         virtual ::rtl::OUString getPrivateTitle( ) const;
146 
147         OQueryContainerWindow* getContainer() const { return static_cast< OQueryContainerWindow* >( getView() ); }
148 
149     public:
150         OQueryController(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rM);
151 
152         virtual ~OQueryController();
153         OTableFields&   getTableFieldDesc()         { return m_vTableFieldDesc; }
154         OTableFields&   getUnUsedFields()           { return m_vUnUsedFieldsDesc; }
155 
156         void            clearFields();
157 
158         virtual void impl_onModifyChanged();
159 
160         // should the statement be parsed by our own sql parser
161         sal_Bool        isEsacpeProcessing()    const { return m_bEscapeProcessing; }
162         sal_Bool        isGraphicalDesign()     const { return m_bGraphicalDesign; }
163         sal_Bool        isDistinct()            const { return m_bDistinct; }
164 
165         ::rtl::OUString getStatement()          const { return m_sStatement; }
166         sal_Int32       getSplitPos()           const { return m_nSplitPos;}
167         sal_Int32       getVisibleRows()        const { return m_nVisibleRows; }
168 
169         void            setDistinct(sal_Bool _bDistinct)        { m_bDistinct = _bDistinct;}
170         void            setSplitPos(sal_Int32 _nSplitPos)       { m_nSplitPos = _nSplitPos;}
171         void            setVisibleRows(sal_Int32 _nVisibleRows) { m_nVisibleRows = _nVisibleRows;}
172 
173         sal_Int32       getColWidth(sal_uInt16 _nColPos) const;
174 
175         const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >&
176                         getFieldInformation() const { return m_aFieldInformation; }
177 
178         ::connectivity::OSQLParser&             getParser()         { return m_aSqlParser;  }
179         ::connectivity::OSQLParseTreeIterator&  getParseIterator()  { return *m_pSqlIterator; }
180 
181         virtual sal_Bool Construct(Window* pParent);
182 
183         DECLARE_XINTERFACE( )
184         DECLARE_XTYPEPROVIDER( )
185         // XPropertySet
186         virtual com::sun::star::uno::Reference<com::sun::star::beans::XPropertySetInfo>  SAL_CALL getPropertySetInfo() throw(com::sun::star::uno::RuntimeException);
187         virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper();
188 
189         // XEventListener
190         virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException);
191 
192         // ::com::sun::star::lang::XComponent
193         virtual void        SAL_CALL disposing();
194 
195         virtual ::rtl::OUString SAL_CALL getImplementationName() throw(::com::sun::star::uno::RuntimeException);
196         virtual ::com::sun::star::uno::Sequence< ::rtl::OUString> SAL_CALL getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException);
197         // need by registration
198         static ::rtl::OUString getImplementationName_Static() throw( ::com::sun::star::uno::RuntimeException );
199         static ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedServiceNames_Static(void) throw( ::com::sun::star::uno::RuntimeException );
200         static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >
201                 SAL_CALL Create(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >&);
202 
203         // XController
204         virtual ::com::sun::star::uno::Any SAL_CALL getViewData(void) throw( ::com::sun::star::uno::RuntimeException );
205         virtual void SAL_CALL restoreViewData(const ::com::sun::star::uno::Any& Data) throw( ::com::sun::star::uno::RuntimeException );
206 
207     private:
208         virtual void    onLoadedMenu(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XLayoutManager >& _xLayoutManager);
209         // OPropertyArrayUsageHelper
210         virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const;
211 
212         // OPropertySetHelper
213         virtual sal_Bool SAL_CALL convertFastPropertyValue(
214                                     ::com::sun::star::uno::Any& rConvertedValue,
215                                     ::com::sun::star::uno::Any& rOldValue,
216                                     sal_Int32 nHandle,
217                                     const ::com::sun::star::uno::Any& rValue
218                                 ) throw (::com::sun::star::lang::IllegalArgumentException);
219         virtual void SAL_CALL setFastPropertyValue_NoBroadcast(
220                                     sal_Int32 nHandle,
221                                     const ::com::sun::star::uno::Any& rValue
222                                 ) throw (::com::sun::star::uno::Exception );
223         virtual void SAL_CALL getFastPropertyValue(
224                                     ::com::sun::star::uno::Any& rValue,
225                                     sal_Int32 nHandle
226                                 ) const;
227 
228         virtual OJoinDesignView*  getJoinView();
229         // ask the user if the design should be saved when it is modified
230         virtual short saveModified();
231         virtual void reset();
232         virtual void impl_initialize();
233 
234         void    impl_reset( const bool i_bIgnoreQuerySettings = false );
235         /// tells the user that we needed to switch to SQL view automatically
236         void    impl_showAutoSQLViewError( const ::com::sun::star::uno::Any& _rErrorDetails );
237 
238         /** switches to the graphical or SQL view mode, as determined by m_bGraphicalDesign
239         */
240         bool    impl_setViewMode( ::dbtools::SQLExceptionInfo* _pErrorInfo );
241 
242         /// sets m_sStatement, and notifies our respective property change listeners
243         void    setStatement_fireEvent( const ::rtl::OUString& _rNewStatement, bool _bFireStatementChange = true );
244         /// sets the m_bEscapeProcessing member, and notifies our respective property change listeners
245         void    setEscapeProcessing_fireEvent( const sal_Bool _bEscapeProcessing );
246 
247         // OJoinController overridables
248         virtual bool allowViews() const;
249         virtual bool allowQueries() const;
250 
251     private:
252         DECL_LINK( OnExecuteAddTable, void* );
253 
254     private:
255         using OQueryController_PBase::getFastPropertyValue;
256     };
257 }
258 #endif // DBAUI_QUERYCONTROLLER_HXX
259 
260