1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef INCLUDED_DBACCESS_SOURCE_UI_QUERYDESIGN_SELECTIONBROWSEBOX_HXX
#define INCLUDED_DBACCESS_SOURCE_UI_QUERYDESIGN_SELECTIONBROWSEBOX_HXX
#include <svtools/editbrowsebox.hxx>
#include "TableFieldDescription.hxx"
#include "JoinExchange.hxx"
#include "QEnumTypes.hxx"
#include <com/sun/star/util/XNumberFormatter.hpp>
#include <svtools/transfer.hxx>
namespace connectivity
{
class OSQLParseNode;
}
namespace dbaui
{
#define BROW_FIELD_ROW 0
#define BROW_COLUMNALIAS_ROW 1
#define BROW_TABLE_ROW 2
#define BROW_ORDER_ROW 3
#define BROW_VIS_ROW 4
#define BROW_FUNCTION_ROW 5
#define BROW_CRIT1_ROW 6
#define BROW_CRIT2_ROW 7
#define BROW_CRIT3_ROW 8
#define BROW_CRIT4_ROW 9
#define BROW_CRIT5_ROW 10
#define BROW_CRIT6_ROW 11
#define BROW_ROW_CNT 12
class OQueryDesignView;
class OSelectionBrowseBox : public ::svt::EditBrowseBox
{
friend class OQueryDesignView;
::std::vector<bool> m_bVisibleRow; // at pos we find the RowId
Timer m_timerInvalidate;
long m_nSeekRow;
BrowserMode m_nMode; // remember the BrowseModes
Edit* m_pTextCell;
::svt::CheckBoxControl* m_pVisibleCell;
::svt::ComboBoxControl* m_pFieldCell;
::svt::ListBoxControl* m_pFunctionCell;
::svt::ListBoxControl* m_pTableCell;
::svt::ListBoxControl* m_pOrderCell;
OTableFieldDescRef m_pEmptyEntry; // default entry in the list may reference more than once
sal_Int32 m_nMaxColumns; // maximum number of columns in a Select-Statement
OUString m_aFunctionStrings;
sal_uInt16 m_nVisibleCount; // maximum number of visible rows
sal_uInt32 m_nLastSortColumn; // index of last (highest) sort column
bool m_bOrderByUnRelated;
bool m_bGroupByUnRelated;
bool m_bStopTimer;
bool m_bWasEditing;
bool m_bDisableErrorBox;
bool m_bInUndoMode;
DECL_LINK(OnInvalidateTimer, void*);
public: OSelectionBrowseBox( vcl::Window* pParent );
virtual ~OSelectionBrowseBox();
void initialize();
OTableFieldDescRef InsertField( const OJoinExchangeData& jxdSource, sal_uInt16 _nColumnPosition = BROWSER_INVALIDID, bool bVis=true, bool bActivate=true );
OTableFieldDescRef InsertField( const OTableFieldDescRef& rInfo, sal_uInt16 _nColumnPosition = BROWSER_INVALIDID, bool bVis=true, bool bActivate=true );
void InsertColumn( OTableFieldDescRef pEntry, sal_uInt16& _nColumnPosition );
void RemoveColumn( sal_uInt16 _nColumnId );
void DeleteFields( const OUString& rAliasName );
bool HasFieldByAliasName(const OUString& rFieldName, OTableFieldDescRef& rInfo) const;
// AddGroupBy:: inserts a field with function == grouping. If the fields already exists and uses an aggregate function,
// the flag is not set
void AddGroupBy( const OTableFieldDescRef& rInfo,sal_uInt32 _nCurrentPos);
void AddCondition( const OTableFieldDescRef& rInfo,
const OUString& rValue,
const sal_uInt16 nLevel,
bool _bAddOrOnOneLine );
void DuplicateConditionLevel( const sal_uInt16 nLevel);
void AddOrder(const OTableFieldDescRef& rInfo, const EOrderDir eDir, sal_uInt32 _nCurrentPos);
void ClearAll();
OTableFieldDescRef AppendNewCol( sal_uInt16 nCnt=1 );
bool Save();
OQueryDesignView* getDesignView();
OQueryDesignView* getDesignView() const;
sal_uInt16 FieldsCount();
void SetColWidth(sal_uInt16 nColId, long lNewWidth);
// unlike SetColumnWidth of the base class it checks an active cell in this column
OUString GetCellContents(sal_Int32 nCellIndex, sal_uInt16 nColId);
void SetCellContents(sal_Int32 nCellIndex, sal_uInt16 nColId, const OUString& strNewText);
// cell content (formatted as string) set/return
sal_Int32 GetNoneVisibleRows() const;
void SetNoneVisbleRow(long nRows);
bool IsRowVisible(sal_uInt16 _nWhich) const;
void SetRowVisible(sal_uInt16 _nWhich, bool _bVis);
void SetReadOnly(bool bRO);
// calculate an optimal size. Basically, this takes into account the number of visible rows.
Size CalcOptimalSize( const Size& _rAvailable );
// can the current content be cut
bool isPasteAllowed();
bool isCutAllowed();
bool isCopyAllowed();
void cut();
void paste();
void copy();
virtual void GetFocus() SAL_OVERRIDE;
virtual void DeactivateCell(bool bUpdate = true) SAL_OVERRIDE;
virtual void ColumnMoved( sal_uInt16 nColId ) SAL_OVERRIDE { ColumnMoved(nColId,true); }
void ColumnMoved( sal_uInt16 nColId, bool _bCreateUndo);
void Fill();
void PreFill();
/** Disables the generation of undo actions
*/
inline void EnterUndoMode() { m_bInUndoMode = true; }
/** Enables the generation of undo actions
*/
inline void LeaveUndoMode() { m_bInUndoMode = false; }
/** GetCellText returns the text at the given position
@param _nRow
the number of the row
@param _nColId
the ID of the column
@return
the text out of the cell
*/
virtual OUString GetCellText(long _nRow, sal_uInt16 _nColId) const SAL_OVERRIDE;
/** returns the description of the row.
@param _nRow
The row number.
@return
The header text of the specified row.
*/
virtual OUString GetRowDescription( sal_Int32 _nRow ) const SAL_OVERRIDE;
/** return the name of the specified object.
@param eObjType
The type to ask for
@param _nPosition
The position of a tablecell (index position), header bar column/row cell
@return
The name of the specified object.
*/
virtual OUString GetAccessibleObjectName( ::svt::AccessibleBrowseBoxObjType eObjType,sal_Int32 _nPosition = -1) const SAL_OVERRIDE;
// IAccessibleTableProvider
/** Creates the accessible object of a data table cell.
@param nRow The row index of the cell.
@param nColumnId The column ID of the cell.
@return The XAccessible interface of the specified cell. */
virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessibleCell( sal_Int32 nRow, sal_uInt16 nColumnId ) SAL_OVERRIDE;
protected:
virtual bool SeekRow( long nRow ) SAL_OVERRIDE;
virtual void PaintStatusCell(OutputDevice& rDev, const Rectangle& rRect) const SAL_OVERRIDE;
virtual void PaintCell(OutputDevice& rDev, const Rectangle& rRect,
sal_uInt16 nColumnId ) const SAL_OVERRIDE;
virtual sal_Int8 AcceptDrop( const BrowserAcceptDropEvent& rEvt ) SAL_OVERRIDE;
virtual sal_Int8 ExecuteDrop( const BrowserExecuteDropEvent& rEvt ) SAL_OVERRIDE;
virtual void MouseButtonDown( const BrowserMouseEvent& rEvt ) SAL_OVERRIDE;
virtual void MouseButtonUp( const BrowserMouseEvent& rEvt ) SAL_OVERRIDE;
virtual void KeyInput( const KeyEvent& rEvt ) SAL_OVERRIDE;
virtual void Command(const CommandEvent& rEvt) SAL_OVERRIDE;
virtual void ArrangeControls(sal_uInt16& nX, sal_uInt16 nY) SAL_OVERRIDE;
virtual ::svt::CellController* GetController(long nRow, sal_uInt16 nCol) SAL_OVERRIDE;
virtual void InitController(::svt::CellControllerRef& rController, long nRow, sal_uInt16 nCol) SAL_OVERRIDE;
virtual void CellModified() SAL_OVERRIDE;
virtual bool SaveModified() SAL_OVERRIDE;
virtual void Init() SAL_OVERRIDE;
sal_uInt32 GetTotalCellWidth(long nRow, sal_uInt16 nColId) const;
virtual void ColumnResized( sal_uInt16 nColId ) SAL_OVERRIDE;
virtual sal_uInt32 GetTotalCellWidth(long nRow, sal_uInt16 nColId) SAL_OVERRIDE;
sal_uInt16 GetDefaultColumnWidth(const OUString& rName) const;
// if you want to have an own header ...
virtual BrowserHeader* imp_CreateHeaderBar(BrowseBox* pParent) SAL_OVERRIDE;
void stopTimer();
void startTimer();
private:
OTableFieldDescRef FindFirstFreeCol(sal_uInt16& _rColumnPosition);
// rCol contains the Nummer (in pOTableFieldDescList) of the first column, which itself tells it is empty
// if there are none, rCol is undefined and the returnvalue NULL
void CheckFreeColumns(sal_uInt16& _rColumnPosition);
// check if empty columns are available, if not, a new Packen is appended
// rCol contains the Nummer of the first empty column (in pOTableFieldDescList)
void RemoveField( sal_uInt16 nId );
Rectangle GetInvalidRect( sal_uInt16 nColId );
long GetRealRow(long nRow) const;
long GetBrowseRow(long nRowId) const;
bool GetFunctionName(sal_uInt32 _nFunctionTokenId, OUString& rFkt);
void appendUndoAction(const OUString& _rOldValue,const OUString& _rNewValue,sal_Int32 _nRow, bool& _bListAction);
void appendUndoAction(const OUString& _rOldValue,const OUString& _rNewValue,sal_Int32 _nRow);
OTableFields& getFields() const;
void enableControl(const OTableFieldDescRef& _rEntry,Window* _pControl);
void setTextCellContext(const OTableFieldDescRef& _rEntry,const OUString& _sText,const OString& _sHelpId);
void invalidateUndoRedo();
OTableFieldDescRef getEntry(OTableFields::size_type _nPos);
void adjustSelectionMode( bool _bClickedOntoHeader, bool _bClickedOntoHandleCol );
/** save the filed change in save modified
@param _sFieldName
The field name inserted by the user.
@param _pEntry
The entry which will contain the necessary entries.
@param _bListAction
Will be set to <TRUE/> when we are in a list action otherwise <FALSE/>
@return
<TRUE/> if an error occurred otherwise <FALSE/>
*/
bool saveField(OUString& _sFieldName, OTableFieldDescRef& _pEntry, bool& _bListAction);
/** sets the table window at the _pEntry
@param _pEntry
The entry where the window should be set.
@param _sTableName
The table name to search for.
@return
<TRUE/> if the table name was set otherwise <FALSE/>
*/
bool fillEntryTable(OTableFieldDescRef& _pEntry,const OUString& _sTableName);
/** uses the parse node to fill all information into the field
@param _pColumnRef
The parse node used to fill the info into the field.
@param _xMetaData
Use to parse the node to a string.
@param _pEntry
The entry which will contain the necessary entries.
@param _bListAction
Will be set to <TRUE/> when we are in a list action otherwise <FALSE/>
@return
<TRUE/> if an error occurred otherwise <FALSE/>
*/
bool fillColumnRef( const ::connectivity::OSQLParseNode* _pColumnRef,
const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection,
OTableFieldDescRef& _pEntry,
bool& _bListAction);
bool fillColumnRef( const OUString& _sColumnName,
const OUString& _sTableRange,
const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >& _xMetaData,
OTableFieldDescRef& _pEntry,
bool& _bListAction);
/** append an undo action for the table field
@param _sOldAlias
The old table alias.
@param _sAlias
The new alias name.
@param _bListAction
Will be set to <TRUE/> when we are in a list action otherwise <FALSE/>
*/
void notifyTableFieldChanged(const OUString& _sOldAlias,const OUString& _sAlias, bool& _bListAction,sal_uInt16 _nColumnId);
/** append an undo action for the function field
@param _sOldFunctionName
The old value.
@param _sFunctionName
The new function name.
@param _bListAction
Will be set to <TRUE/> when we are in a list action otherwise <FALSE/>
*/
void notifyFunctionFieldChanged(const OUString& _sOldFunctionName,const OUString& _sFunctionName, bool& _bListAction,sal_uInt16 _nColumnId);
/** clears the function fields of the submitted entry if it doesn't match the SQL standard and append an undo action.
E.q. AGGREGATE functions are only valid when the field name isn't an asterisk
@param _sFieldName
The field name.
@param _pEntry
The entry to be cleared
@param _bListAction
When <TRUE/> an list action will be created.
*/
void clearEntryFunctionField(const OUString& _sFieldName,OTableFieldDescRef& _pEntry, bool& _bListAction,sal_uInt16 _nColumnId);
/** remove or insert the necessary function types
@param _pEntry
The currently edited entry.
*/
void setFunctionCell(OTableFieldDescRef& _pEntry);
private:
using ::svt::EditBrowseBox::AcceptDrop;
using ::svt::EditBrowseBox::ExecuteDrop;
using ::svt::EditBrowseBox::MouseButtonDown;
using ::svt::EditBrowseBox::MouseButtonUp;
};
}
#endif // INCLUDED_DBACCESS_SOURCE_UI_QUERYDESIGN_SELECTIONBROWSEBOX_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|