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