xref: /trunk/main/dbaccess/source/ui/querydesign/SelectionBrowseBox.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 #ifndef DBAUI_QUERYDESIGN_OSELECTIONBROWSEBOX_HXX
28 #define DBAUI_QUERYDESIGN_OSELECTIONBROWSEBOX_HXX
29 
30 #ifndef _SVTOOLS_EDITBROWSEBOX_HXX_
31 #include <svtools/editbrowsebox.hxx>
32 #endif
33 //#ifndef DBAUI_QUERYCONTROLLER_HXX
34 //#include "querycontroller.hxx"
35 //#endif
36 #ifndef DBAUI_TABLEFIELDDESC_HXX
37 #include "TableFieldDescription.hxx"
38 #endif
39 #ifndef DBAUI_JOINEXCHANGE_HXX
40 #include "JoinExchange.hxx"
41 #endif
42 #ifndef DBAUI_ENUMTYPES_HXX
43 #include "QEnumTypes.hxx"
44 #endif
45 #ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATTER_HPP_
46 #include <com/sun/star/util/XNumberFormatter.hpp>
47 #endif
48 #ifndef _STRING_HXX
49 #include <tools/string.hxx>
50 #endif
51 #ifndef _TRANSFER_HXX
52 #include <svtools/transfer.hxx>
53 #endif
54 
55 namespace connectivity
56 {
57     class OSQLParseNode;
58 }
59 
60 namespace dbaui
61 {
62     //==================================================================
63 #define SIZ_NONE        0
64 #define SIZ_TOP         1
65 #define SIZ_BOTTOM      2
66 #define SIZ_LEFT        4
67 #define SIZ_RIGHT       8
68 
69 #define BROW_FIELD_ROW          0
70 #define BROW_COLUMNALIAS_ROW    1
71 #define BROW_TABLE_ROW          2
72 #define BROW_ORDER_ROW          3
73 #define BROW_VIS_ROW            4
74 #define BROW_FUNCTION_ROW       5
75 #define BROW_CRIT1_ROW          6
76 #define BROW_CRIT2_ROW          7
77 #define BROW_CRIT3_ROW          8
78 #define BROW_CRIT4_ROW          9
79 #define BROW_CRIT5_ROW          10
80 #define BROW_CRIT6_ROW          11
81 #define BROW_ROW_CNT            12
82 
83     //==================================================================
84     class OQueryDesignView;
85     class OSelectionBrowseBox : public ::svt::EditBrowseBox
86     {
87         friend class OQueryDesignView;
88         ::std::vector<bool>                 m_bVisibleRow;  // an Pos steht die RowId
89         Timer                               m_timerInvalidate;
90 
91         long                                m_nSeekRow;
92         BrowserMode                         m_nMode;                        // Merken des BrowseModes
93         Edit*                               m_pTextCell;
94         ::svt::CheckBoxControl*             m_pVisibleCell;
95         ::svt::ComboBoxControl*             m_pFieldCell;
96         ::svt::ListBoxControl*              m_pFunctionCell;
97         ::svt::ListBoxControl*              m_pTableCell;
98         ::svt::ListBoxControl*              m_pOrderCell;
99 
100         OTableFieldDescRef                  m_pEmptyEntry;      // default entry in the list may reference more than once
101 
102         sal_Int32                           m_nMaxColumns;              // maximale Anzahl der Spalten in einem Select-Statement
103 
104         String                              m_aFunctionStrings;
105         sal_uInt16                          m_nVisibleCount;                // Anzahl der max sichtbaren Zeilen
106         sal_Bool                            m_bOrderByUnRelated;
107         sal_Bool                            m_bGroupByUnRelated;
108         sal_Bool                            m_bStopTimer;
109         sal_Bool                            m_bWasEditing;
110         sal_Bool                            m_bDisableErrorBox;
111         sal_Bool                            m_bInUndoMode;
112 
113         DECL_LINK(OnInvalidateTimer, void*);
114     public:                         OSelectionBrowseBox( Window* pParent );
115                                     ~OSelectionBrowseBox();
116 
117         void                        initialize();
118         OTableFieldDescRef          InsertField( const OJoinExchangeData& jxdSource, sal_uInt16 _nColumnPostion = BROWSER_INVALIDID, sal_Bool bVis=sal_True, sal_Bool bActivate=sal_True );
119         OTableFieldDescRef          InsertField( const OTableFieldDescRef& rInfo, sal_uInt16 _nColumnPostion = BROWSER_INVALIDID, sal_Bool bVis=sal_True, sal_Bool bActivate=sal_True );
120         void                        InsertColumn( OTableFieldDescRef pEntry, sal_uInt16& _nColumnPostion );
121         void                        RemoveColumn( sal_uInt16 _nColumnId );
122         void                        DeleteFields( const String& rAliasName );
123 
124         bool                        HasFieldByAliasName(const ::rtl::OUString& rFieldName, OTableFieldDescRef& rInfo) const;
125         // AddGroupBy:: F"ugt ein Feld mit Funktion == Grupierung. Falls das Feld schon vorhanden ist und ein Aggregate Funktion
126         // benutzt, wird das Flag nicht gesetzt
127         void                        AddGroupBy( const OTableFieldDescRef& rInfo,sal_uInt32 _nCurrentPos);
128         void                        AddCondition( const OTableFieldDescRef& rInfo,
129                                                   const String& rValue,
130                                                   const sal_uInt16 nLevel,
131                                                   bool _bAddOrOnOneLine  );
132         void                        DuplicateConditionLevel( const sal_uInt16 nLevel);
133         void                        AddOrder(const OTableFieldDescRef& rInfo, const EOrderDir eDir, sal_uInt32 _nCurrentPos);
134         void                        ClearAll();
135         OTableFieldDescRef          AppendNewCol( sal_uInt16 nCnt=1 );
136         sal_Bool                    Save();
137         OQueryDesignView*           getDesignView();
138         OQueryDesignView*           getDesignView() const;
139         sal_uInt16                  FieldsCount();
140 
141         void                        SetColWidth(sal_uInt16 nColId, long lNewWidth);
142                                     // beachtet im Gegensatz zum SetColumnWidth der Basisklasse auch eine eventuell aktive Zelle in dieser Spalte
143 
144         String                      GetCellContents(sal_Int32 nCellIndex, sal_uInt16 nColId);
145         void                        SetCellContents(sal_Int32 nCellIndex, sal_uInt16 nColId, const String& strNewText);
146                                         // Zelleninhalt (als String formatiert) setzen/liefern
147         sal_Int32                   GetNoneVisibleRows() const;
148         void                        SetNoneVisbleRow(long nRows);
149         sal_Bool                    IsRowVisible(sal_uInt16 _nWhich) const;
150         void                        SetRowVisible(sal_uInt16 _nWhich, sal_Bool _bVis);
151 
152         void                        SetReadOnly(sal_Bool bRO);
153         // calculate an optimal size. Basically, this takes into account the number of visible rows.
154         Size                        CalcOptimalSize( const Size& _rAvailable );
155 
156         // can the current content be cut
157         sal_Bool                    isPasteAllowed();
158         sal_Bool                    isCutAllowed();
159         sal_Bool                    isCopyAllowed();
160         void                        cut();
161         void                        paste();
162         void                        copy();
163 
164         virtual void                GetFocus();
165         virtual void                DeactivateCell(sal_Bool bUpdate = sal_True);
166         virtual void                ColumnMoved( sal_uInt16 nColId ) { ColumnMoved(nColId,sal_True); }
167         void                        ColumnMoved( sal_uInt16 nColId,sal_Bool _bCreateUndo);
168 
169         void                        Fill();
170         void                        PreFill();
171 
172         /** Disables the generation of undo actions
173         */
174         inline void                 EnterUndoMode() { m_bInUndoMode = sal_True; }
175         /** Enables the generation of undo actions
176         */
177         inline void                 LeaveUndoMode() { m_bInUndoMode = sal_False; }
178 
179         /** GetCellText returns the text at the given position
180             @param  _nRow
181                 the number of the row
182             @param  _nColId
183                 the ID of the column
184             @return
185                 the text out of the cell
186         */
187         virtual String              GetCellText(long _nRow, sal_uInt16 _nColId) const;
188 
189         /** returns the description of the row.
190             @param  _nRow
191                 The row number.
192             @return
193                 The header text of the specified row.
194         */
195         virtual ::rtl::OUString     GetRowDescription( sal_Int32 _nRow ) const;
196 
197         /** return the name of the specified object.
198             @param  eObjType
199                 The type to ask for
200             @param  _nPosition
201                 The position of a tablecell (index position), header bar  colum/row cell
202             @return
203                 The name of the specified object.
204         */
205         virtual ::rtl::OUString     GetAccessibleObjectName( ::svt::AccessibleBrowseBoxObjType eObjType,sal_Int32 _nPosition = -1) const;
206 
207         // IAccessibleTableProvider
208         /** Creates the accessible object of a data table cell.
209         @param nRow  The row index of the cell.
210         @param nColumnId  The column ID of the cell.
211         @return  The XAccessible interface of the specified cell. */
212         virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessibleCell( sal_Int32 nRow, sal_uInt16 nColumnId );
213 
214 
215     protected:
216         virtual sal_Bool            SeekRow( long nRow );
217 
218         virtual void                PaintStatusCell(OutputDevice& rDev, const Rectangle& rRect) const;
219         virtual void                PaintCell(OutputDevice& rDev, const Rectangle& rRect,
220                                               sal_uInt16 nColumnId ) const;
221 
222         virtual sal_Int8            AcceptDrop( const BrowserAcceptDropEvent& rEvt );
223         virtual sal_Int8            ExecuteDrop( const BrowserExecuteDropEvent& rEvt );
224         virtual void                MouseButtonDown( const BrowserMouseEvent& rEvt );
225         virtual void                MouseButtonUp( const BrowserMouseEvent& rEvt );
226         virtual void                KeyInput( const KeyEvent& rEvt );
227         virtual void                Command(const CommandEvent& rEvt);
228         virtual void                ArrangeControls(sal_uInt16& nX, sal_uInt16 nY);
229 
230         virtual ::svt::CellController*  GetController(long nRow, sal_uInt16 nCol);
231         virtual void                InitController(::svt::CellControllerRef& rController, long nRow, sal_uInt16 nCol);
232         virtual void                CellModified();
233         virtual sal_Bool            SaveModified();
234         virtual void                Init();
235         virtual sal_uInt32          GetTotalCellWidth(long nRow, sal_uInt16 nColId) const;
236         virtual void                ColumnResized( sal_uInt16 nColId );
237 
238         virtual sal_uInt32          GetTotalCellWidth(long nRow, sal_uInt16 nColId);
239 
240         virtual sal_uInt16          GetDefaultColumnWidth(const String& rName) const;
241         // if you want to have an own header ...
242         virtual BrowserHeader*      imp_CreateHeaderBar(BrowseBox* pParent);
243 
244         void                        stopTimer();
245         void                        startTimer();
246 
247     private:
248         OTableFieldDescRef          FindFirstFreeCol(sal_uInt16& _rColumnPosition);
249             // rCol enthaelt die Nummer (in pOTableFieldDescList) der ersten Spalte, die von sich sagt, dass sie leer ist
250             // wenn es keine solche gibt, ist rCol undefiniert und der Rueckgabewert NULL
251         void                        CheckFreeColumns(sal_uInt16& _rColumnPosition);
252             // testet, ob es noch freie Spalten gibt, wenn nicht, wird ein neuer Packen angefuegt
253             // rCol enthaelt die Nummer der ersten freien Spalte (in pOTableFieldDescList)
254 
255         void            RemoveField( sal_uInt16 nId );
256         Rectangle       GetInvalidRect( sal_uInt16 nColId );
257         long            GetRealRow(long nRow) const;
258         long            GetBrowseRow(long nRowId) const;
259         sal_Bool        GetFunctionName(sal_uInt32 _nFunctionTokenId,String& rFkt);
260         void            appendUndoAction(const String& _rOldValue,const String& _rNewValue,sal_Int32 _nRow,sal_Bool& _bListAction);
261         void            appendUndoAction(const String& _rOldValue,const String& _rNewValue,sal_Int32 _nRow);
262         OTableFields&   getFields() const;
263         void            enableControl(const OTableFieldDescRef& _rEntry,Window* _pControl);
264         void            setTextCellContext(const OTableFieldDescRef& _rEntry,const String& _sText,const rtl::OString& _sHelpId);
265         void            invalidateUndoRedo();
266         OTableFieldDescRef getEntry(OTableFields::size_type _nPos);
267 
268         void            adjustSelectionMode( sal_Bool _bClickedOntoHeader, sal_Bool _bClickedOntoHandleCol );
269 
270         /** save the filed change in save modified
271             @param  _sFieldName
272                 The field name inserted by the user.
273             @param  _pEntry
274                 The entry which will contain the nescessary entries.
275             @param  _bListAction
276                 Will be set to <TRUE/> when we are in a list action otherwise <FALSE/>
277             @return
278                 <TRUE/> if an error occured otherwise <FALSE/>
279         */
280         sal_Bool        saveField(const String& _sFieldName,OTableFieldDescRef& _pEntry,sal_Bool& _bListAction);
281 
282         /** sets the table window at the _pEntry
283             @param  _pEntry
284                 The entry where the window should be set.
285             @param  _sTableName
286                 The table name to search for.
287             @return
288                 <TRUE/> if the table name was set otherwise <FALSE/>
289         */
290         sal_Bool        fillEntryTable(OTableFieldDescRef& _pEntry,const ::rtl::OUString& _sTableName);
291 
292         /** uses the parse node to fill all information into the field
293             @param  _pColumnRef
294                 The parse node used to fill the info into the field.
295             @param  _xMetaData
296                 Use to parse the node to a string.
297             @param  _pEntry
298                 The entry which will contain the nescessary entries.
299             @param  _bListAction
300                 Will be set to <TRUE/> when we are in a list action otherwise <FALSE/>
301             @return
302                 <TRUE/> if an error occured otherwise <FALSE/>
303         */
304         sal_Bool        fillColumnRef(  const ::connectivity::OSQLParseNode* _pColumnRef,
305                                         const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection,
306                                         OTableFieldDescRef& _pEntry,
307                                         sal_Bool& _bListAction);
308         sal_Bool        fillColumnRef(  const ::rtl::OUString& _sColumnName,
309                                         const ::rtl::OUString& _sTableRange,
310                                         const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >& _xMetaData,
311                                         OTableFieldDescRef& _pEntry,
312                                         sal_Bool& _bListAction);
313 
314 
315         /** append an undo action for the table field
316             @param  _sOldAlias
317                 The old table alias.
318             @param  _sAlias
319                 The new alias name.
320             @param  _bListAction
321                 Will be set to <TRUE/> when we are in a list action otherwise <FALSE/>
322         */
323         void            notifyTableFieldChanged(const String& _sOldAlias,const String& _sAlias,sal_Bool& _bListAction,sal_uInt16 _nColumnId);
324 
325         /** append an undo action for the function field
326             @param  _sOldFunctionName
327                 The old value.
328             @param  _sFunctionName
329                 The new function name.
330             @param  _bListAction
331                 Will be set to <TRUE/> when we are in a list action otherwise <FALSE/>
332         */
333         void            notifyFunctionFieldChanged(const String& _sOldFunctionName,const String& _sFunctionName,sal_Bool& _bListAction,sal_uInt16 _nColumnId);
334 
335         /** clears the function fields of the submitted entry if it doesn't match the SQL standard and append an undo action.
336             E.q. AGGREGATE functions are only valid when the field name isn't an asterix
337             @param  _sFieldName
338                 The field name.
339             @param  _pEntry
340                 The entry to be cleared
341             @param  _bListAction
342                 When <TRUE/> an list action will be created.
343         */
344         void            clearEntryFunctionField(const String& _sFieldName,OTableFieldDescRef& _pEntry,sal_Bool& _bListAction,sal_uInt16 _nColumnId);
345 
346         /** remove or insert the necessary function types
347             @param  _pEntry
348                 The currently edited entry.
349         */
350         void            setFunctionCell(OTableFieldDescRef& _pEntry);
351 
352     private:
353         using ::svt::EditBrowseBox::AcceptDrop;
354         using ::svt::EditBrowseBox::ExecuteDrop;
355         using ::svt::EditBrowseBox::MouseButtonDown;
356         using ::svt::EditBrowseBox::MouseButtonUp;
357     };
358 }
359 #endif // DBAUI_QUERYDESIGN_OSELECTIONBROWSEBOX_HXX
360 
361 
362 
363