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 : #include "SelectionBrowseBox.hxx"
21 : #include <com/sun/star/sdbc/XDatabaseMetaData.hpp>
22 : #include <com/sun/star/sdbc/DataType.hpp>
23 : #include "QueryDesignView.hxx"
24 : #include "querycontroller.hxx"
25 : #include "QueryTableView.hxx"
26 : #include "browserids.hxx"
27 : #include <comphelper/extract.hxx>
28 : #include <comphelper/stl_types.hxx>
29 : #include <comphelper/string.hxx>
30 : #include <comphelper/types.hxx>
31 : #include "TableFieldInfo.hxx"
32 : #include "dbu_qry.hrc"
33 : #include "dbaccess_helpid.hrc"
34 : #include <com/sun/star/container/XNameAccess.hpp>
35 : #include "dbustrings.hrc"
36 : #include "QTableWindow.hxx"
37 : #include <vcl/msgbox.hxx>
38 : #include "QueryDesignFieldUndoAct.hxx"
39 : #include "sqlmessage.hxx"
40 : #include "UITools.hxx"
41 : #include <osl/diagnose.h>
42 : #include "svtools/treelistentry.hxx"
43 :
44 : using namespace ::svt;
45 : using namespace ::dbaui;
46 : using namespace ::connectivity;
47 : using namespace ::com::sun::star::uno;
48 : using namespace ::com::sun::star::sdbc;
49 : using namespace ::com::sun::star::beans;
50 : using namespace ::com::sun::star::container;
51 : using namespace ::com::sun::star::util;
52 : using namespace ::com::sun::star::accessibility;
53 :
54 : #define g_strOne rtl::OUString("1")
55 : #define g_strZero rtl::OUString("0")
56 :
57 : #define DEFAULT_QUERY_COLS 20
58 : #define DEFAULT_SIZE GetTextWidth(g_strZero) * 30
59 : #define CHECKBOX_SIZE 10
60 : #define HANDLE_ID 0
61 : #define HANDLE_COLUMN_WITDH 70
62 : #define SORT_COLUMN_NONE 0xFFFFFFFF
63 :
64 : // -----------------------------------------------------------------------------
65 : namespace
66 : {
67 0 : sal_Bool isFieldNameAsterix(const ::rtl::OUString& _sFieldName )
68 : {
69 0 : sal_Bool bAsterix = !(!_sFieldName.isEmpty() && _sFieldName.toChar() != '*');
70 0 : if ( !bAsterix )
71 : {
72 0 : String sName = _sFieldName;
73 0 : xub_StrLen nTokenCount = comphelper::string::getTokenCount(sName, '.');
74 0 : if ( (nTokenCount == 2 && sName.GetToken(1,'.').GetChar(0) == '*' )
75 0 : || (nTokenCount == 3 && sName.GetToken(2,'.').GetChar(0) == '*' ) )
76 : {
77 0 : bAsterix = sal_True;
78 0 : }
79 : }
80 0 : return bAsterix;
81 : }
82 : // -----------------------------------------------------------------------------
83 0 : sal_Bool lcl_SupportsCoreSQLGrammar(const Reference< XConnection>& _xConnection)
84 : {
85 0 : sal_Bool bSupportsCoreGrammar = sal_False;
86 0 : if ( _xConnection.is() )
87 : {
88 : try
89 : {
90 0 : Reference< XDatabaseMetaData > xMetaData = _xConnection->getMetaData();
91 0 : bSupportsCoreGrammar = xMetaData.is() && xMetaData->supportsCoreSQLGrammar();
92 : }
93 0 : catch(Exception&)
94 : {
95 : }
96 : }
97 0 : return bSupportsCoreGrammar;
98 : }
99 : }
100 :
101 : DBG_NAME(OSelectionBrowseBox)
102 : //------------------------------------------------------------------------------
103 0 : OSelectionBrowseBox::OSelectionBrowseBox( Window* pParent )
104 : :EditBrowseBox( pParent,EBBF_NOROWPICTURE, WB_3DLOOK, BROWSER_COLUMNSELECTION | BROWSER_KEEPSELECTION | BROWSER_HIDESELECT |
105 : BROWSER_HIDECURSOR | BROWSER_HLINESFULL | BROWSER_VLINESFULL )
106 : ,m_aFunctionStrings(ModuleRes(STR_QUERY_FUNCTIONS))
107 : ,m_nVisibleCount(0)
108 : ,m_nLastSortColumn(SORT_COLUMN_NONE)
109 : ,m_bOrderByUnRelated(sal_True)
110 : ,m_bGroupByUnRelated(sal_True)
111 : ,m_bStopTimer(sal_False)
112 : ,m_bWasEditing(sal_False)
113 : ,m_bDisableErrorBox(sal_False)
114 0 : ,m_bInUndoMode(sal_False)
115 : {
116 : DBG_CTOR(OSelectionBrowseBox,NULL);
117 0 : SetHelpId(HID_CTL_QRYDGNCRIT);
118 :
119 : m_nMode = BROWSER_COLUMNSELECTION | BROWSER_HIDESELECT
120 : | BROWSER_KEEPSELECTION | BROWSER_HIDECURSOR
121 : | BROWSER_HLINESFULL | BROWSER_VLINESFULL
122 0 : | BROWSER_HEADERBAR_NEW ;
123 :
124 0 : m_pTextCell = new Edit(&GetDataWindow(), 0);
125 0 : m_pVisibleCell = new CheckBoxControl(&GetDataWindow());
126 0 : m_pTableCell = new ListBoxControl(&GetDataWindow()); m_pTableCell->SetDropDownLineCount( 20 );
127 0 : m_pFieldCell = new ComboBoxControl(&GetDataWindow()); m_pFieldCell->SetDropDownLineCount( 20 );
128 0 : m_pOrderCell = new ListBoxControl(&GetDataWindow());
129 0 : m_pFunctionCell = new ListBoxControl(&GetDataWindow()); m_pFunctionCell->SetDropDownLineCount( 20 );
130 :
131 0 : m_pVisibleCell->SetHelpId(HID_QRYDGN_ROW_VISIBLE);
132 0 : m_pTableCell->SetHelpId(HID_QRYDGN_ROW_TABLE);
133 0 : m_pFieldCell->SetHelpId(HID_QRYDGN_ROW_FIELD);
134 0 : m_pOrderCell->SetHelpId(HID_QRYDGN_ROW_ORDER);
135 0 : m_pFunctionCell->SetHelpId(HID_QRYDGN_ROW_FUNCTION);
136 :
137 : //////////////////////////////////////////////////////////////////////
138 : // TriState der ::com::sun::star::form::CheckBox abschalten
139 0 : m_pVisibleCell->GetBox().EnableTriState( sal_False );
140 :
141 0 : Font aTitleFont = OutputDevice::GetDefaultFont( DEFAULTFONT_SANS_UNICODE,Window::GetSettings().GetLanguageTag().getLanguageType(),DEFAULTFONT_FLAGS_ONLYONE);
142 0 : aTitleFont.SetSize(Size(0, 6));
143 0 : SetTitleFont(aTitleFont);
144 :
145 0 : String aTxt(ModuleRes(STR_QUERY_SORTTEXT));
146 0 : xub_StrLen nCount = comphelper::string::getTokenCount(aTxt, ';');
147 0 : xub_StrLen nIdx = 0;
148 0 : for (; nIdx < nCount; nIdx++)
149 0 : m_pOrderCell->InsertEntry(aTxt.GetToken(nIdx));
150 :
151 0 : for(long i=0;i < BROW_ROW_CNT;i++)
152 0 : m_bVisibleRow.push_back(sal_True);
153 :
154 0 : m_bVisibleRow[BROW_FUNCTION_ROW] = sal_False; // zuerst ausblenden
155 :
156 0 : m_timerInvalidate.SetTimeout(200);
157 0 : m_timerInvalidate.SetTimeoutHdl(LINK(this, OSelectionBrowseBox, OnInvalidateTimer));
158 0 : m_timerInvalidate.Start();
159 0 : }
160 :
161 : //------------------------------------------------------------------------------
162 0 : OSelectionBrowseBox::~OSelectionBrowseBox()
163 : {
164 : DBG_DTOR(OSelectionBrowseBox,NULL);
165 :
166 0 : delete m_pTextCell;
167 0 : delete m_pVisibleCell;
168 0 : delete m_pFieldCell;
169 0 : delete m_pTableCell;
170 0 : delete m_pOrderCell;
171 0 : delete m_pFunctionCell;
172 0 : }
173 : // -----------------------------------------------------------------------------
174 0 : void OSelectionBrowseBox::initialize()
175 : {
176 0 : Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection();
177 0 : if(xConnection.is())
178 : {
179 0 : const IParseContext& rContext = static_cast<OQueryController&>(getDesignView()->getController()).getParser().getContext();
180 : IParseContext::InternationalKeyCode eFunctions[] = { IParseContext::KEY_AVG,IParseContext::KEY_COUNT,IParseContext::KEY_MAX
181 : ,IParseContext::KEY_MIN,IParseContext::KEY_SUM
182 : ,IParseContext::KEY_EVERY
183 : ,IParseContext::KEY_ANY
184 : ,IParseContext::KEY_SOME
185 : ,IParseContext::KEY_STDDEV_POP
186 : ,IParseContext::KEY_STDDEV_SAMP
187 : ,IParseContext::KEY_VAR_SAMP
188 : ,IParseContext::KEY_VAR_POP
189 : ,IParseContext::KEY_COLLECT
190 : ,IParseContext::KEY_FUSION
191 : ,IParseContext::KEY_INTERSECTION
192 0 : };
193 :
194 0 : String sGroup = m_aFunctionStrings.GetToken(comphelper::string::getTokenCount(m_aFunctionStrings, ';') - 1);
195 0 : m_aFunctionStrings = m_aFunctionStrings.GetToken(0);
196 :
197 0 : for (size_t i = 0; i < sizeof (eFunctions) / sizeof (eFunctions[0]); ++i)
198 : {
199 0 : m_aFunctionStrings += String(RTL_CONSTASCII_USTRINGPARAM(";"));
200 0 : m_aFunctionStrings += rtl::OStringToOUString(rContext.getIntlKeywordAscii(eFunctions[i]),
201 0 : RTL_TEXTENCODING_UTF8);
202 : }
203 0 : m_aFunctionStrings += String(RTL_CONSTASCII_USTRINGPARAM(";"));
204 0 : m_aFunctionStrings += sGroup;
205 :
206 : // Aggregate functions in general available only with Core SQL
207 : // We slip in a few optionals one, too.
208 0 : if ( lcl_SupportsCoreSQLGrammar(xConnection) )
209 : {
210 0 : xub_StrLen nCount = comphelper::string::getTokenCount(m_aFunctionStrings, ';');
211 0 : for (xub_StrLen nIdx = 0; nIdx < nCount; nIdx++)
212 0 : m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(nIdx));
213 : }
214 : else // else only COUNT(*) and COUNT("table".*)
215 : {
216 0 : m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(0));
217 0 : m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(2)); // 2 -> COUNT
218 : }
219 : try
220 : {
221 0 : Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData();
222 0 : if ( xMetaData.is() )
223 : {
224 0 : m_bOrderByUnRelated = xMetaData->supportsOrderByUnrelated();
225 0 : m_bGroupByUnRelated = xMetaData->supportsGroupByUnrelated();
226 0 : }
227 : }
228 0 : catch(Exception&)
229 : {
230 0 : }
231 : }
232 :
233 0 : Init();
234 0 : }
235 : //==============================================================================
236 0 : OQueryDesignView* OSelectionBrowseBox::getDesignView()
237 : {
238 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
239 : OSL_ENSURE(static_cast<const OQueryDesignView*>(GetParent()),"Parent isn't an OQueryDesignView!");
240 0 : return static_cast<OQueryDesignView*>(GetParent());
241 : }
242 : // -----------------------------------------------------------------------------
243 0 : OQueryDesignView* OSelectionBrowseBox::getDesignView() const
244 : {
245 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
246 : OSL_ENSURE(static_cast<const OQueryDesignView*>(GetParent()),"Parent isn't an OQueryDesignView!");
247 0 : return static_cast<OQueryDesignView*>(GetParent());
248 : }
249 : namespace
250 : {
251 0 : class OSelectionBrwBoxHeader : public ::svt::EditBrowserHeader
252 : {
253 : OSelectionBrowseBox* m_pBrowseBox;
254 : protected:
255 : virtual void Select();
256 : public:
257 : OSelectionBrwBoxHeader(OSelectionBrowseBox* pParent);
258 : };
259 0 : OSelectionBrwBoxHeader::OSelectionBrwBoxHeader(OSelectionBrowseBox* pParent)
260 : : ::svt::EditBrowserHeader(pParent,WB_BUTTONSTYLE|WB_DRAG)
261 0 : ,m_pBrowseBox(pParent)
262 : {
263 0 : }
264 :
265 0 : void OSelectionBrwBoxHeader::Select()
266 : {
267 0 : EditBrowserHeader::Select();
268 0 : m_pBrowseBox->GrabFocus();
269 :
270 0 : BrowserMode nMode = m_pBrowseBox->GetMode();
271 0 : if ( 0 == m_pBrowseBox->GetSelectColumnCount() )
272 : {
273 0 : m_pBrowseBox->DeactivateCell();
274 : // wenn es schon eine selektierte Spalte gibt, bin ich schon im richtigen Modus
275 0 : if ( BROWSER_HIDESELECT == ( nMode & BROWSER_HIDESELECT ) )
276 : {
277 0 : nMode &= ~BROWSER_HIDESELECT;
278 0 : nMode |= BROWSER_MULTISELECTION;
279 0 : m_pBrowseBox->SetMode( nMode );
280 : }
281 : }
282 0 : m_pBrowseBox->SelectColumnId( GetCurItemId() );
283 0 : m_pBrowseBox->DeactivateCell();
284 0 : }
285 : }
286 :
287 : // -----------------------------------------------------------------------------
288 0 : BrowserHeader* OSelectionBrowseBox::imp_CreateHeaderBar(BrowseBox* /*pParent*/)
289 : {
290 0 : return new OSelectionBrwBoxHeader(this);
291 : }
292 : // -----------------------------------------------------------------------------
293 0 : void OSelectionBrowseBox::ColumnMoved( sal_uInt16 nColId,sal_Bool _bCreateUndo )
294 : {
295 0 : EditBrowseBox::ColumnMoved( nColId );
296 : // swap the two columns
297 0 : sal_uInt16 nNewPos = GetColumnPos( nColId );
298 0 : OTableFields& rFields = getFields();
299 0 : if ( rFields.size() > sal_uInt16(nNewPos-1) )
300 : {
301 0 : sal_uInt16 nOldPos = 0;
302 0 : OTableFields::iterator aEnd = rFields.end();
303 0 : OTableFields::iterator aIter = rFields.begin();
304 0 : for (; aIter != aEnd && ( (*aIter)->GetColumnId() != nColId ); ++aIter,++nOldPos)
305 : ;
306 :
307 : OSL_ENSURE( (nNewPos-1) != nOldPos && nOldPos < rFields.size(),"Old and new position are equal!");
308 0 : if ( aIter != aEnd )
309 : {
310 0 : OTableFieldDescRef pOldEntry = rFields[nOldPos];
311 0 : rFields.erase(rFields.begin() + nOldPos);
312 0 : rFields.insert(rFields.begin() + nNewPos - 1,pOldEntry);
313 :
314 : // create the undo action
315 0 : if ( !m_bInUndoMode && _bCreateUndo )
316 : {
317 0 : OTabFieldMovedUndoAct* pUndoAct = new OTabFieldMovedUndoAct(this);
318 0 : pUndoAct->SetColumnPosition( nOldPos + 1);
319 0 : pUndoAct->SetTabFieldDescr(pOldEntry);
320 :
321 0 : getDesignView()->getController().addUndoActionAndInvalidate(pUndoAct);
322 0 : }
323 : }
324 : }
325 : else
326 : OSL_FAIL("Invalid column id!");
327 0 : }
328 : //------------------------------------------------------------------------------
329 0 : void OSelectionBrowseBox::Init()
330 : {
331 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
332 :
333 0 : EditBrowseBox::Init();
334 :
335 : // set the header bar
336 0 : BrowserHeader* pNewHeaderBar = CreateHeaderBar(this);
337 0 : pNewHeaderBar->SetMouseTransparent(sal_False);
338 :
339 0 : SetHeaderBar(pNewHeaderBar);
340 0 : SetMode(m_nMode);
341 :
342 0 : Font aFont( GetDataWindow().GetFont() );
343 0 : aFont.SetWeight( WEIGHT_NORMAL );
344 0 : GetDataWindow().SetFont( aFont );
345 :
346 0 : Size aHeight;
347 0 : const Control* pControls[] = { m_pTextCell,m_pVisibleCell,m_pTableCell,m_pFieldCell };
348 :
349 0 : for (sal_Size i = 0; i < sizeof (pControls) / sizeof (pControls[0]); ++i)
350 : {
351 0 : const Size aTemp( pControls[i]->GetOptimalSize(WINDOWSIZE_PREFERRED) );
352 0 : if ( aTemp.Height() > aHeight.Height() )
353 0 : aHeight.Height() = aTemp.Height();
354 : }
355 0 : SetDataRowHeight(aHeight.Height());
356 0 : SetTitleLines(1);
357 : // Anzahl der sichtbaren Zeilen ermitteln
358 0 : for(long i=0;i<BROW_ROW_CNT;i++)
359 : {
360 0 : if(m_bVisibleRow[i])
361 0 : m_nVisibleCount++;
362 : }
363 0 : RowInserted(0, m_nVisibleCount, sal_False);
364 : try
365 : {
366 0 : Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection();
367 0 : if(xConnection.is())
368 : {
369 0 : Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData();
370 0 : m_nMaxColumns = xMetaData.is() ? xMetaData->getMaxColumnsInSelect() : 0;
371 :
372 : }
373 : else
374 0 : m_nMaxColumns = 0;
375 : }
376 0 : catch(const SQLException&)
377 : {
378 : OSL_FAIL("Catched Exception when asking for database metadata options!");
379 0 : m_nMaxColumns = 0;
380 0 : }
381 0 : }
382 :
383 : //------------------------------------------------------------------------------
384 0 : void OSelectionBrowseBox::PreFill()
385 : {
386 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
387 0 : SetUpdateMode(sal_False);
388 :
389 0 : if (GetCurRow() != 0)
390 0 : GoToRow(0);
391 :
392 :
393 0 : static_cast< OQueryController& >( getDesignView()->getController() ).clearFields();
394 :
395 0 : DeactivateCell();
396 :
397 0 : RemoveColumns();
398 0 : InsertHandleColumn( HANDLE_COLUMN_WITDH );
399 0 : SetUpdateMode(sal_True);
400 0 : }
401 : //------------------------------------------------------------------------------
402 0 : void OSelectionBrowseBox::ClearAll()
403 : {
404 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
405 0 : SetUpdateMode(sal_False);
406 :
407 0 : OTableFields::reverse_iterator aIter = getFields().rbegin();
408 0 : for ( ;aIter != getFields().rend(); ++aIter )
409 : {
410 0 : if ( !(*aIter)->IsEmpty() )
411 : {
412 0 : RemoveField( (*aIter)->GetColumnId() );
413 0 : aIter = getFields().rbegin();
414 : }
415 : }
416 0 : m_nLastSortColumn = SORT_COLUMN_NONE;
417 0 : SetUpdateMode(sal_True);
418 0 : }
419 : //------------------------------------------------------------------------------
420 0 : void OSelectionBrowseBox::SetReadOnly(sal_Bool bRO)
421 : {
422 0 : if (bRO)
423 : {
424 0 : DeactivateCell();
425 0 : m_nMode &= ~BROWSER_HIDECURSOR;
426 0 : SetMode(m_nMode);
427 : }
428 : else
429 : {
430 0 : m_nMode |= BROWSER_HIDECURSOR;
431 0 : SetMode(m_nMode);
432 0 : ActivateCell();
433 : }
434 0 : }
435 :
436 : //------------------------------------------------------------------------------
437 0 : CellController* OSelectionBrowseBox::GetController(long nRow, sal_uInt16 nColId)
438 : {
439 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
440 0 : if ( nColId > getFields().size() )
441 0 : return NULL;
442 0 : OTableFieldDescRef pEntry = getFields()[nColId-1];
443 : OSL_ENSURE(pEntry.is(), "OSelectionBrowseBox::GetController : keine FieldDescription !");
444 :
445 0 : if (!pEntry.is())
446 0 : return NULL;
447 :
448 0 : if (static_cast<OQueryController&>(getDesignView()->getController()).isReadOnly())
449 0 : return NULL;
450 :
451 0 : long nCellIndex = GetRealRow(nRow);
452 0 : switch (nCellIndex)
453 : {
454 : case BROW_FIELD_ROW:
455 0 : return new ComboBoxCellController(m_pFieldCell);
456 : case BROW_TABLE_ROW:
457 0 : return new ListBoxCellController(m_pTableCell);
458 : case BROW_VIS_ROW:
459 0 : return new CheckBoxCellController(m_pVisibleCell);
460 : case BROW_ORDER_ROW:
461 0 : return new ListBoxCellController(m_pOrderCell);
462 : case BROW_FUNCTION_ROW:
463 0 : return new ListBoxCellController(m_pFunctionCell);
464 : default:
465 0 : return new EditCellController(m_pTextCell);
466 0 : }
467 : }
468 :
469 : //------------------------------------------------------------------------------
470 0 : void OSelectionBrowseBox::InitController(CellControllerRef& /*rController*/, long nRow, sal_uInt16 nColId)
471 : {
472 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
473 : OSL_ENSURE(nColId != BROWSER_INVALIDID,"An Invalid Id was set!");
474 0 : if ( nColId == BROWSER_INVALIDID )
475 : return;
476 0 : sal_uInt16 nPos = GetColumnPos(nColId);
477 0 : if ( nPos == 0 || nPos == BROWSER_INVALIDID || nPos > getFields().size() )
478 : return;
479 0 : OTableFieldDescRef pEntry = getFields()[nPos-1];
480 : OSL_ENSURE(pEntry.is(), "OSelectionBrowseBox::InitController : keine FieldDescription !");
481 0 : long nCellIndex = GetRealRow(nRow);
482 :
483 0 : switch (nCellIndex)
484 : {
485 : case BROW_FIELD_ROW:
486 : {
487 0 : m_pFieldCell->Clear();
488 0 : m_pFieldCell->SetText(String());
489 :
490 0 : String aField(pEntry->GetField());
491 0 : String aTable(pEntry->GetAlias());
492 :
493 0 : getDesignView()->fillValidFields(aTable, m_pFieldCell);
494 :
495 : // * durch alias.* ersetzen
496 0 : if ((aField.GetChar(0) == '*') && aTable.Len())
497 : {
498 0 : aField = aTable;
499 0 : aField.AppendAscii(".*");
500 : }
501 0 : m_pFieldCell->SetText(aField);
502 0 : } break;
503 : case BROW_TABLE_ROW:
504 : {
505 0 : m_pTableCell->Clear();
506 0 : enableControl(pEntry,m_pTableCell);
507 0 : if ( !pEntry->isCondition() )
508 : {
509 0 : OJoinTableView::OTableWindowMap* pTabWinList = getDesignView()->getTableView()->GetTabWinMap();
510 0 : if (pTabWinList)
511 : {
512 0 : OJoinTableView::OTableWindowMap::iterator aIter = pTabWinList->begin();
513 0 : OJoinTableView::OTableWindowMap::iterator aEnd = pTabWinList->end();
514 :
515 0 : for(;aIter != aEnd;++aIter)
516 0 : m_pTableCell->InsertEntry(static_cast<OQueryTableWindow*>(aIter->second)->GetAliasName());
517 :
518 0 : m_pTableCell->InsertEntry(String(ModuleRes(STR_QUERY_NOTABLE)), 0);
519 0 : if (!pEntry->GetAlias().isEmpty())
520 0 : m_pTableCell->SelectEntry(pEntry->GetAlias());
521 : else
522 0 : m_pTableCell->SelectEntry(String(ModuleRes(STR_QUERY_NOTABLE)));
523 : }
524 : }
525 0 : } break;
526 : case BROW_VIS_ROW:
527 : {
528 0 : m_pVisibleCell->GetBox().Check(pEntry->IsVisible());
529 0 : m_pVisibleCell->GetBox().SaveValue();
530 :
531 0 : enableControl(pEntry,m_pTextCell);
532 :
533 0 : if(!pEntry->IsVisible() && pEntry->GetOrderDir() != ORDER_NONE && !m_bOrderByUnRelated)
534 : {
535 : // Spalte muss sichtbar sein, um im ORDER BY aufzutauchen
536 0 : pEntry->SetVisible(sal_True);
537 0 : m_pVisibleCell->GetBox().Check(pEntry->IsVisible());
538 0 : m_pVisibleCell->GetBox().SaveValue();
539 0 : m_pVisibleCell->GetBox().Disable();
540 0 : m_pVisibleCell->GetBox().EnableInput(sal_False);
541 0 : String aMessage(ModuleRes(STR_QRY_ORDERBY_UNRELATED));
542 0 : OQueryDesignView* paDView = getDesignView();
543 0 : InfoBox(paDView, aMessage).Execute();
544 : }
545 0 : } break;
546 : case BROW_ORDER_ROW:
547 : m_pOrderCell->SelectEntryPos(
548 0 : sal::static_int_cast< sal_uInt16 >(pEntry->GetOrderDir()));
549 0 : enableControl(pEntry,m_pOrderCell);
550 0 : break;
551 : case BROW_COLUMNALIAS_ROW:
552 0 : setTextCellContext(pEntry,pEntry->GetFieldAlias(),HID_QRYDGN_ROW_ALIAS);
553 0 : break;
554 : case BROW_FUNCTION_ROW:
555 0 : setFunctionCell(pEntry);
556 0 : break;
557 : default:
558 : {
559 0 : sal_uInt16 nIdx = sal_uInt16(nCellIndex - BROW_CRIT1_ROW);
560 0 : setTextCellContext(pEntry,pEntry->GetCriteria( nIdx ),HID_QRYDGN_ROW_CRIT);
561 : }
562 : }
563 0 : Controller()->ClearModified();
564 : }
565 : // -----------------------------------------------------------------------------
566 0 : void OSelectionBrowseBox::notifyTableFieldChanged(const String& _sOldAlias,const String& _sAlias,sal_Bool& _bListAction,sal_uInt16 _nColumnId)
567 : {
568 0 : appendUndoAction(_sOldAlias,_sAlias,BROW_TABLE_ROW,_bListAction);
569 0 : if ( m_bVisibleRow[BROW_TABLE_ROW] )
570 0 : RowModified(GetBrowseRow(BROW_TABLE_ROW), _nColumnId);
571 0 : }
572 : // -----------------------------------------------------------------------------
573 0 : void OSelectionBrowseBox::notifyFunctionFieldChanged(const String& _sOldFunctionName,const String& _sFunctionName,sal_Bool& _bListAction,sal_uInt16 _nColumnId)
574 : {
575 0 : appendUndoAction(_sOldFunctionName,_sFunctionName,BROW_FUNCTION_ROW,_bListAction);
576 0 : if ( !m_bVisibleRow[BROW_FUNCTION_ROW] )
577 0 : SetRowVisible(BROW_FUNCTION_ROW, sal_True);
578 0 : RowModified(GetBrowseRow(BROW_FUNCTION_ROW), _nColumnId);
579 0 : }
580 : // -----------------------------------------------------------------------------
581 0 : void OSelectionBrowseBox::clearEntryFunctionField(const String& _sFieldName,OTableFieldDescRef& _pEntry,sal_Bool& _bListAction,sal_uInt16 _nColumnId)
582 : {
583 0 : if ( isFieldNameAsterix( _sFieldName ) && (!_pEntry->isNoneFunction() || _pEntry->IsGroupBy()) )
584 : {
585 0 : String sFunctionName;
586 0 : GetFunctionName(SQL_TOKEN_COUNT,sFunctionName);
587 0 : String sOldLocalizedFunctionName = _pEntry->GetFunction();
588 0 : if ( !sOldLocalizedFunctionName.Equals(sFunctionName) || _pEntry->IsGroupBy() )
589 : {
590 : // append undo action for the function field
591 0 : _pEntry->SetFunctionType(FKT_NONE);
592 0 : _pEntry->SetFunction(::rtl::OUString());
593 0 : _pEntry->SetGroupBy(sal_False);
594 0 : notifyFunctionFieldChanged(sOldLocalizedFunctionName,_pEntry->GetFunction(),_bListAction,_nColumnId);
595 0 : }
596 : }
597 0 : }
598 : // -----------------------------------------------------------------------------
599 0 : sal_Bool OSelectionBrowseBox::fillColumnRef(const OSQLParseNode* _pColumnRef, const Reference< XConnection >& _rxConnection, OTableFieldDescRef& _pEntry, sal_Bool& _bListAction )
600 : {
601 : OSL_ENSURE(_pColumnRef,"No valid parsenode!");
602 0 : ::rtl::OUString sColumnName,sTableRange;
603 0 : OSQLParseTreeIterator::getColumnRange(_pColumnRef,_rxConnection,sColumnName,sTableRange);
604 0 : return fillColumnRef(sColumnName,sTableRange,_rxConnection->getMetaData(),_pEntry,_bListAction);
605 : }
606 : // -----------------------------------------------------------------------------
607 0 : sal_Bool OSelectionBrowseBox::fillColumnRef(const ::rtl::OUString& _sColumnName,const ::rtl::OUString& _sTableRange,const Reference<XDatabaseMetaData>& _xMetaData,OTableFieldDescRef& _pEntry,sal_Bool& _bListAction)
608 : {
609 0 : sal_Bool bError = sal_False;
610 0 : ::comphelper::UStringMixEqual bCase(_xMetaData->supportsMixedCaseQuotedIdentifiers());
611 : // check if the table name is the same
612 0 : if ( !_sTableRange.isEmpty() && (bCase(_pEntry->GetTable(),_sTableRange) || bCase(_pEntry->GetAlias(),_sTableRange)) )
613 : { // a table was already inserted and the tables contains that column name
614 :
615 0 : if ( !_pEntry->GetTabWindow() )
616 : { // fill tab window
617 0 : ::rtl::OUString sOldAlias = _pEntry->GetAlias();
618 0 : if ( !fillEntryTable(_pEntry,_pEntry->GetTable()) )
619 0 : fillEntryTable(_pEntry,_pEntry->GetAlias()); // only when the first failed
620 0 : if ( !bCase(sOldAlias,_pEntry->GetAlias()) )
621 0 : notifyTableFieldChanged(sOldAlias,_pEntry->GetAlias(),_bListAction,GetCurColumnId());
622 : }
623 : }
624 : // check if the table window
625 0 : OQueryTableWindow* pEntryTab = static_cast<OQueryTableWindow*>(_pEntry->GetTabWindow());
626 0 : if ( !pEntryTab ) // no table found with this name so we have to travel through all tables
627 : {
628 0 : OJoinTableView::OTableWindowMap* pTabWinList = getDesignView()->getTableView()->GetTabWinMap();
629 0 : if ( pTabWinList )
630 : {
631 0 : sal_uInt16 nTabCount = 0;
632 0 : if ( !static_cast<OQueryTableView*>(getDesignView()->getTableView())->FindTableFromField(_sColumnName,_pEntry,nTabCount) ) // error occurred: column not in table window
633 : {
634 0 : String sErrorMsg(ModuleRes(RID_STR_FIELD_DOESNT_EXIST));
635 0 : sErrorMsg.SearchAndReplaceAscii("$name$",_sColumnName);
636 0 : OSQLWarningBox( this, sErrorMsg ).Execute();
637 0 : bError = sal_True;
638 : }
639 : else
640 : {
641 0 : pEntryTab = static_cast<OQueryTableWindow*>(_pEntry->GetTabWindow());
642 0 : notifyTableFieldChanged(String(),_pEntry->GetAlias(),_bListAction,GetCurColumnId());
643 : }
644 : }
645 : }
646 0 : if ( pEntryTab ) // here we got a valid table
647 0 : _pEntry->SetField(_sColumnName);
648 :
649 0 : return bError;
650 : }
651 : // -----------------------------------------------------------------------------
652 0 : sal_Bool OSelectionBrowseBox::saveField(const String& _sFieldName,OTableFieldDescRef& _pEntry,sal_Bool& _bListAction)
653 : {
654 0 : sal_Bool bError = sal_False;
655 :
656 0 : OQueryController& rController = static_cast<OQueryController&>(getDesignView()->getController());
657 :
658 : // first look if the name can be found in our tables
659 0 : sal_uInt16 nTabCount = 0;
660 0 : String sOldAlias = _pEntry->GetAlias();
661 0 : if ( static_cast<OQueryTableView*>(getDesignView()->getTableView())->FindTableFromField(_sFieldName,_pEntry,nTabCount) )
662 : {
663 : // append undo action for the alias name
664 0 : _pEntry->SetField(_sFieldName);
665 0 : notifyTableFieldChanged(sOldAlias,_pEntry->GetAlias(),_bListAction,GetCurColumnId());
666 0 : clearEntryFunctionField(_sFieldName,_pEntry,_bListAction,_pEntry->GetColumnId());
667 0 : return bError;
668 : }
669 :
670 0 : Reference<XConnection> xConnection( rController.getConnection() );
671 0 : Reference< XDatabaseMetaData > xMetaData;
672 0 : if ( xConnection.is() )
673 0 : xMetaData = xConnection->getMetaData();
674 : OSL_ENSURE( xMetaData.is(), "OSelectionBrowseBox::saveField: invalid connection/meta data!" );
675 0 : if ( !xMetaData.is() )
676 0 : return sal_True;
677 :
678 0 : ::rtl::OUString sErrorMsg;
679 : // second test if the name can be set as select columns in a pseudo statement
680 : // we have to look which entries we should quote
681 :
682 0 : const ::rtl::OUString sFieldAlias = _pEntry->GetFieldAlias();
683 0 : size_t nPass = 4;
684 0 : ::connectivity::OSQLParser& rParser( rController.getParser() );
685 0 : OSQLParseNode* pParseNode = NULL;
686 : // 4 passes in trying to interprete the field name
687 : // - don't quote the field name, parse internationally
688 : // - don't quote the field name, parse en-US
689 : // - quote the field name, parse internationally
690 : // - quote the field name, parse en-US
691 0 : do
692 : {
693 0 : bool bQuote = ( nPass <= 2 );
694 0 : bool bInternational = ( nPass % 2 ) == 0;
695 :
696 0 : ::rtl::OUString sSql;
697 0 : if ( bQuote )
698 0 : sSql += ::dbtools::quoteName( xMetaData->getIdentifierQuoteString(), _sFieldName );
699 : else
700 0 : sSql += _sFieldName;
701 :
702 0 : if ( _pEntry->isAggreateFunction() )
703 : {
704 : OSL_ENSURE(!_pEntry->GetFunction().isEmpty(),"Functionname darf hier nicht leer sein! ;-(");
705 0 : ::rtl::OUStringBuffer aTmpStr2( _pEntry->GetFunction());
706 0 : aTmpStr2.appendAscii("(");
707 0 : aTmpStr2.append(sSql);
708 0 : aTmpStr2.appendAscii(")");
709 0 : sSql = aTmpStr2.makeStringAndClear();
710 : }
711 :
712 0 : sSql = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SELECT ")) + sSql;
713 0 : if ( !sFieldAlias.isEmpty() )
714 : { // always quote the alias name there canbe no function in it
715 0 : sSql += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" "));
716 0 : sSql += ::dbtools::quoteName( xMetaData->getIdentifierQuoteString(), sFieldAlias );
717 : }
718 0 : sSql += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" FROM x"));
719 :
720 0 : pParseNode = rParser.parseTree( sErrorMsg, sSql, bInternational );
721 : }
722 : while ( ( pParseNode == NULL ) && ( --nPass > 0 ) );
723 :
724 0 : if ( pParseNode == NULL )
725 : {
726 : // something different which we have to check (may be a select statement)
727 0 : String sErrorMessage( ModuleRes( STR_QRY_COLUMN_NOT_FOUND ) );
728 0 : sErrorMessage.SearchAndReplaceAscii("$name$",_sFieldName);
729 0 : OSQLWarningBox( this, sErrorMessage ).Execute();
730 0 : return sal_True;
731 : }
732 :
733 : // we got a valid select column
734 : // find what type of column has be inserted
735 0 : ::connectivity::OSQLParseNode* pSelection = pParseNode->getChild(2);
736 0 : if ( SQL_ISRULE(pSelection,selection) ) // we found the asterix
737 : {
738 0 : _pEntry->SetField(_sFieldName);
739 0 : clearEntryFunctionField(_sFieldName,_pEntry,_bListAction,_pEntry->GetColumnId());
740 : } // travel through the select column parse node
741 : else
742 : {
743 0 : ::comphelper::UStringMixEqual bCase(xMetaData->supportsMixedCaseQuotedIdentifiers());
744 :
745 0 : OTableFieldDescRef aSelEntry = _pEntry;
746 0 : sal_uInt16 nColumnId = aSelEntry->GetColumnId();
747 :
748 0 : sal_uInt32 nCount = pSelection->count();
749 0 : for (sal_uInt32 i = 0; i < nCount; ++i)
750 : {
751 0 : if ( i > 0 ) // may we have to append more than one field
752 : {
753 : sal_uInt16 nColumnPostion;
754 0 : aSelEntry = FindFirstFreeCol(nColumnPostion);
755 0 : if ( !aSelEntry.is() )
756 : {
757 0 : AppendNewCol(1);
758 0 : aSelEntry = FindFirstFreeCol(nColumnPostion);
759 : }
760 0 : ++nColumnPostion;
761 0 : nColumnId = GetColumnId(nColumnPostion);
762 : }
763 :
764 0 : ::connectivity::OSQLParseNode* pChild = pSelection->getChild( i );
765 : OSL_ENSURE(SQL_ISRULE(pChild,derived_column), "No derived column found!");
766 : // get the column alias
767 0 : ::rtl::OUString sColumnAlias = OSQLParseTreeIterator::getColumnAlias(pChild);
768 0 : if ( !sColumnAlias.isEmpty() ) // we found an as clause
769 : {
770 0 : String aSelectionAlias = aSelEntry->GetFieldAlias();
771 0 : aSelEntry->SetFieldAlias( sColumnAlias );
772 : // append undo
773 0 : appendUndoAction(aSelectionAlias,aSelEntry->GetFieldAlias(),BROW_COLUMNALIAS_ROW,_bListAction);
774 0 : if ( m_bVisibleRow[BROW_COLUMNALIAS_ROW] )
775 0 : RowModified(GetBrowseRow(BROW_COLUMNALIAS_ROW), nColumnId);
776 : }
777 :
778 0 : ::connectivity::OSQLParseNode* pColumnRef = pChild->getChild(0);
779 0 : if (
780 0 : pColumnRef->count() == 3 &&
781 0 : SQL_ISPUNCTUATION(pColumnRef->getChild(0),"(") &&
782 0 : SQL_ISPUNCTUATION(pColumnRef->getChild(2),")")
783 : )
784 0 : pColumnRef = pColumnRef->getChild(1);
785 :
786 0 : if ( SQL_ISRULE(pColumnRef,column_ref) ) // we found a valid column name or more column names
787 : {
788 : // look if we can find the corresponding table
789 0 : bError = fillColumnRef( pColumnRef, xConnection, aSelEntry, _bListAction );
790 :
791 : // we found a simple column so we must clear the function fields but only when the column name is '*'
792 : // and the function is different to count
793 0 : clearEntryFunctionField(_sFieldName,aSelEntry,_bListAction,nColumnId);
794 : }
795 : // do we have a aggregate function and only a function?
796 0 : else if ( SQL_ISRULE(pColumnRef,general_set_fct) )
797 : {
798 0 : String sLocalizedFunctionName;
799 0 : if ( GetFunctionName(pColumnRef->getChild(0)->getTokenID(),sLocalizedFunctionName) )
800 : {
801 0 : String sOldLocalizedFunctionName = aSelEntry->GetFunction();
802 0 : aSelEntry->SetFunction(sLocalizedFunctionName);
803 0 : sal_uInt32 nFunCount = pColumnRef->count() - 1;
804 0 : sal_Int32 nFunctionType = FKT_AGGREGATE;
805 0 : sal_Bool bQuote = sal_False;
806 : // may be there exists only one parameter which is a column, fill all information into our fields
807 0 : if ( nFunCount == 4 && SQL_ISRULE(pColumnRef->getChild(3),column_ref) )
808 0 : bError = fillColumnRef( pColumnRef->getChild(3), xConnection, aSelEntry, _bListAction );
809 0 : else if ( nFunCount == 3 ) // we have a COUNT(*) here, so take the first table
810 0 : bError = fillColumnRef( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("*")), ::rtl::OUString(), xMetaData, aSelEntry, _bListAction );
811 : else
812 : {
813 0 : nFunctionType |= FKT_NUMERIC;
814 0 : bQuote = sal_True;
815 0 : aSelEntry->SetDataType(DataType::DOUBLE);
816 0 : aSelEntry->SetFieldType(TAB_NORMAL_FIELD);
817 : }
818 :
819 : // now parse the parameters
820 0 : ::rtl::OUString sParameters;
821 0 : for(sal_uInt32 function = 2; function < nFunCount; ++function) // we only want to parse the parameters of the function
822 0 : pColumnRef->getChild(function)->parseNodeToStr( sParameters, xConnection, &rParser.getContext(), sal_True, bQuote );
823 :
824 0 : aSelEntry->SetFunctionType(nFunctionType);
825 0 : aSelEntry->SetField(sParameters);
826 0 : if ( aSelEntry->IsGroupBy() )
827 : {
828 0 : sOldLocalizedFunctionName = m_aFunctionStrings.GetToken(comphelper::string::getTokenCount(m_aFunctionStrings, ';')-1);
829 0 : aSelEntry->SetGroupBy(sal_False);
830 : }
831 :
832 : // append undo action
833 0 : notifyFunctionFieldChanged(sOldLocalizedFunctionName,sLocalizedFunctionName,_bListAction, nColumnId);
834 : }
835 : else
836 0 : OSL_FAIL("Unsupported function inserted!");
837 :
838 : }
839 : else
840 : {
841 : // so we first clear the function field
842 0 : clearEntryFunctionField(_sFieldName,aSelEntry,_bListAction,nColumnId);
843 0 : ::rtl::OUString sFunction;
844 : pColumnRef->parseNodeToStr( sFunction,
845 : xConnection,
846 0 : &rController.getParser().getContext(),
847 : sal_True,
848 0 : sal_True); // quote is to true because we need quoted elements inside the function
849 :
850 0 : getDesignView()->fillFunctionInfo(pColumnRef,sFunction,aSelEntry);
851 :
852 0 : if( SQL_ISRULEOR3(pColumnRef, position_exp, extract_exp, fold) ||
853 0 : SQL_ISRULEOR3(pColumnRef, char_substring_fct, length_exp, char_value_fct) )
854 : // a calculation has been found ( can be calc and function )
855 : {
856 : // now parse the whole statement
857 0 : sal_uInt32 nFunCount = pColumnRef->count();
858 0 : ::rtl::OUString sParameters;
859 0 : for(sal_uInt32 function = 0; function < nFunCount; ++function)
860 0 : pColumnRef->getChild(function)->parseNodeToStr( sParameters, xConnection, &rParser.getContext(), sal_True, sal_True );
861 :
862 0 : sOldAlias = aSelEntry->GetAlias();
863 0 : sal_Int32 nNewFunctionType = aSelEntry->GetFunctionType() | FKT_NUMERIC | FKT_OTHER;
864 0 : aSelEntry->SetFunctionType(nNewFunctionType);
865 0 : aSelEntry->SetField(sParameters);
866 : }
867 : else
868 : {
869 0 : aSelEntry->SetFieldAlias(sColumnAlias);
870 0 : if ( SQL_ISRULE(pColumnRef,set_fct_spec) )
871 0 : aSelEntry->SetFunctionType(/*FKT_NUMERIC | */FKT_OTHER);
872 : else
873 0 : aSelEntry->SetFunctionType(FKT_NUMERIC | FKT_OTHER);
874 : }
875 :
876 0 : aSelEntry->SetAlias(::rtl::OUString());
877 0 : notifyTableFieldChanged(sOldAlias,aSelEntry->GetAlias(),_bListAction, nColumnId);
878 : }
879 :
880 0 : if ( i > 0 && !InsertField(aSelEntry,BROWSER_INVALIDID,sal_True,sal_False).is() ) // may we have to append more than one field
881 : { // the field could not be inserted
882 0 : String sErrorMessage( ModuleRes( RID_STR_FIELD_DOESNT_EXIST ) );
883 0 : sErrorMessage.SearchAndReplaceAscii("$name$",aSelEntry->GetField());
884 0 : OSQLWarningBox( this, sErrorMessage ).Execute();
885 0 : bError = sal_True;
886 : }
887 0 : }
888 : }
889 0 : delete pParseNode;
890 :
891 0 : return bError;
892 : }
893 : //------------------------------------------------------------------------------
894 0 : sal_Bool OSelectionBrowseBox::SaveModified()
895 : {
896 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
897 0 : OQueryController& rController = static_cast<OQueryController&>(getDesignView()->getController());
898 0 : OTableFieldDescRef pEntry = NULL;
899 0 : sal_uInt16 nCurrentColumnPos = GetColumnPos(GetCurColumnId());
900 0 : if(getFields().size() > static_cast<sal_uInt16>(nCurrentColumnPos - 1))
901 0 : pEntry = getEntry(nCurrentColumnPos - 1);
902 :
903 0 : sal_Bool bWasEmpty = pEntry.is() ? pEntry->IsEmpty() : sal_False;
904 0 : sal_Bool bError = sal_False;
905 0 : sal_Bool bListAction = sal_False;
906 :
907 0 : if (pEntry.is() && Controller().Is() && Controller()->IsModified())
908 : {
909 : // fuer die Undo-Action
910 0 : String strOldCellContents,sNewValue;
911 0 : long nRow = GetRealRow(GetCurRow());
912 0 : sal_Bool bAppendRow = sal_False;
913 0 : switch (nRow)
914 : {
915 : case BROW_VIS_ROW:
916 : {
917 0 : sal_Bool bOldValue = m_pVisibleCell->GetBox().GetSavedValue() != STATE_NOCHECK;
918 0 : strOldCellContents = bOldValue ? g_strOne : g_strZero;
919 0 : sNewValue = !bOldValue ? g_strOne : g_strZero;
920 : }
921 0 : if((m_bOrderByUnRelated || pEntry->GetOrderDir() == ORDER_NONE) &&
922 0 : (m_bGroupByUnRelated || !pEntry->IsGroupBy()))
923 : {
924 0 : pEntry->SetVisible(m_pVisibleCell->GetBox().IsChecked());
925 : }
926 : else
927 : {
928 0 : pEntry->SetVisible(sal_True);
929 0 : m_pVisibleCell->GetBox().Check();
930 : }
931 0 : break;
932 :
933 : case BROW_FIELD_ROW:
934 : {
935 0 : String aFieldName(m_pFieldCell->GetText());
936 : try
937 : {
938 0 : if (!aFieldName.Len())
939 : {
940 0 : OTableFieldDescRef pNewEntry = new OTableFieldDesc();
941 0 : pNewEntry->SetColumnId( pEntry->GetColumnId() );
942 0 : ::std::replace(getFields().begin(),getFields().end(),pEntry,pNewEntry);
943 0 : sal_uInt16 nCol = GetCurColumnId();
944 0 : for (int i = 0; i < m_nVisibleCount; i++) // Spalte neu zeichnen
945 0 : RowModified(i,nCol);
946 : }
947 : else
948 : {
949 0 : strOldCellContents = pEntry->GetField();
950 0 : bListAction = sal_True;
951 0 : if ( !m_bInUndoMode )
952 0 : rController.GetUndoManager().EnterListAction(String(),String());
953 :
954 0 : sal_uInt16 nPos = m_pFieldCell->GetEntryPos(aFieldName);
955 0 : String aAliasName = pEntry->GetAlias();
956 0 : if ( nPos != COMBOBOX_ENTRY_NOTFOUND && !aAliasName.Len() && comphelper::string::getTokenCount(aFieldName, '.') > 1 )
957 : { // special case, we have a table field so we must cut the table name
958 0 : String sTableAlias = aFieldName.GetToken(0,'.');
959 0 : pEntry->SetAlias(sTableAlias);
960 0 : String sColumnName = aFieldName.Copy(sTableAlias.Len()+1,aFieldName.Len() - sTableAlias.Len() -1);
961 0 : Reference<XConnection> xConnection = rController.getConnection();
962 0 : if ( !xConnection.is() )
963 0 : return sal_False;
964 0 : bError = fillColumnRef( sColumnName, sTableAlias, xConnection->getMetaData(), pEntry, bListAction );
965 : }
966 : else
967 0 : bError = sal_True;
968 :
969 0 : if ( bError )
970 0 : bError = saveField(aFieldName,pEntry,bListAction);
971 : }
972 : }
973 0 : catch(Exception&)
974 : {
975 0 : bError = sal_True;
976 : }
977 0 : if ( bError )
978 : {
979 0 : sNewValue = aFieldName;
980 0 : if ( !m_bInUndoMode )
981 0 : static_cast<OQueryController&>(getDesignView()->getController()).GetUndoManager().LeaveListAction();
982 0 : bListAction = sal_False;
983 : }
984 : else
985 0 : sNewValue = pEntry->GetField();
986 0 : rController.InvalidateFeature( ID_BROWSER_QUERY_EXECUTE );
987 : }
988 0 : break;
989 :
990 : case BROW_TABLE_ROW:
991 : {
992 0 : String aAliasName = m_pTableCell->GetSelectEntry();
993 0 : strOldCellContents = pEntry->GetAlias();
994 0 : if ( m_pTableCell->GetSelectEntryPos() != 0 )
995 : {
996 0 : pEntry->SetAlias(aAliasName);
997 : // we have to set the table name as well as the table window
998 0 : OJoinTableView::OTableWindowMap* pTabWinList = getDesignView()->getTableView()->GetTabWinMap();
999 0 : if (pTabWinList)
1000 : {
1001 0 : OJoinTableView::OTableWindowMapIterator aIter = pTabWinList->find(aAliasName);
1002 0 : if(aIter != pTabWinList->end())
1003 : {
1004 0 : OQueryTableWindow* pEntryTab = static_cast<OQueryTableWindow*>(aIter->second);
1005 0 : if (pEntryTab)
1006 : {
1007 0 : pEntry->SetTable(pEntryTab->GetTableName());
1008 0 : pEntry->SetTabWindow(pEntryTab);
1009 : }
1010 : }
1011 : }
1012 : }
1013 : else
1014 : {
1015 0 : pEntry->SetAlias(::rtl::OUString());
1016 0 : pEntry->SetTable(::rtl::OUString());
1017 0 : pEntry->SetTabWindow(NULL);
1018 : }
1019 0 : sNewValue = pEntry->GetAlias();
1020 :
1021 0 : } break;
1022 :
1023 : case BROW_ORDER_ROW:
1024 : {
1025 0 : strOldCellContents = String::CreateFromInt32((sal_uInt16)pEntry->GetOrderDir());
1026 0 : sal_uInt16 nIdx = m_pOrderCell->GetSelectEntryPos();
1027 0 : if (nIdx == sal_uInt16(-1))
1028 0 : nIdx = 0;
1029 0 : pEntry->SetOrderDir(EOrderDir(nIdx));
1030 0 : if(!m_bOrderByUnRelated)
1031 : {
1032 0 : pEntry->SetVisible(sal_True);
1033 0 : m_pVisibleCell->GetBox().Check();
1034 0 : RowModified(GetBrowseRow(BROW_VIS_ROW), GetCurColumnId());
1035 : }
1036 0 : sNewValue = String::CreateFromInt32((sal_uInt16)pEntry->GetOrderDir());
1037 0 : } break;
1038 :
1039 : case BROW_COLUMNALIAS_ROW:
1040 0 : strOldCellContents = pEntry->GetFieldAlias();
1041 0 : pEntry->SetFieldAlias(m_pTextCell->GetText());
1042 0 : sNewValue = pEntry->GetFieldAlias();
1043 0 : break;
1044 : case BROW_FUNCTION_ROW:
1045 : {
1046 0 : strOldCellContents = pEntry->GetFunction();
1047 0 : sal_uInt16 nPos = m_pFunctionCell->GetSelectEntryPos();
1048 : // Diese Funktionen stehen nur unter CORE zur Verf�gung
1049 0 : String sFunctionName = m_pFunctionCell->GetEntry(nPos);
1050 0 : String sGroupFunctionName = m_aFunctionStrings.GetToken(comphelper::string::getTokenCount(m_aFunctionStrings, ';')-1);
1051 0 : sal_Bool bGroupBy = sal_False;
1052 0 : if ( sGroupFunctionName.Equals(sFunctionName) ) // check if the function name is GROUP
1053 : {
1054 0 : bGroupBy = sal_True;
1055 :
1056 0 : if ( !m_bGroupByUnRelated && !pEntry->IsVisible() )
1057 : {
1058 : // we have to change the visblie flag, so we must append also an undo action
1059 0 : pEntry->SetVisible(sal_True);
1060 0 : m_pVisibleCell->GetBox().Check();
1061 0 : appendUndoAction(g_strZero,g_strOne,BROW_VIS_ROW,bListAction);
1062 0 : RowModified(GetBrowseRow(BROW_VIS_ROW), GetCurColumnId());
1063 : }
1064 :
1065 0 : pEntry->SetFunction(String());
1066 0 : pEntry->SetFunctionType(pEntry->GetFunctionType() & ~FKT_AGGREGATE );
1067 : }
1068 0 : else if ( nPos ) // we found an aggregate function
1069 : {
1070 0 : pEntry->SetFunctionType(pEntry->GetFunctionType() | FKT_AGGREGATE );
1071 0 : pEntry->SetFunction(sFunctionName);
1072 : }
1073 : else
1074 : {
1075 0 : sFunctionName = String();
1076 0 : pEntry->SetFunction(String());
1077 0 : pEntry->SetFunctionType(pEntry->GetFunctionType() & ~FKT_AGGREGATE );
1078 : }
1079 :
1080 0 : pEntry->SetGroupBy(bGroupBy);
1081 :
1082 0 : sNewValue = sFunctionName;
1083 : }
1084 0 : break;
1085 : default:
1086 : {
1087 0 : Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection();
1088 0 : if(!xConnection.is())
1089 : break;
1090 :
1091 0 : sal_uInt16 nIdx = sal_uInt16(nRow - BROW_CRIT1_ROW);
1092 0 : String aText = comphelper::string::stripStart(m_pTextCell->GetText(), ' ');
1093 :
1094 0 : ::rtl::OUString aCrit;
1095 0 : if(aText.Len())
1096 : {
1097 0 : ::rtl::OUString aErrorMsg;
1098 0 : Reference<XPropertySet> xColumn;
1099 0 : OSQLParseNode* pParseNode = getDesignView()->getPredicateTreeFromEntry(pEntry,aText,aErrorMsg,xColumn);
1100 :
1101 0 : if (pParseNode)
1102 : {
1103 : pParseNode->parseNodeToPredicateStr(aCrit,
1104 : xConnection,
1105 0 : static_cast<OQueryController&>(getDesignView()->getController()).getNumberFormatter(),
1106 : xColumn,
1107 : getDesignView()->getLocale(),
1108 0 : static_cast<sal_Char>(getDesignView()->getDecimalSeparator().toChar()),
1109 0 : &(static_cast<OQueryController&>(getDesignView()->getController()).getParser().getContext()));
1110 0 : delete pParseNode;
1111 : }
1112 : else
1113 : {
1114 0 : if(xColumn.is())
1115 : {
1116 0 : sal_Int32 nType = 0;
1117 0 : xColumn->getPropertyValue(PROPERTY_TYPE) >>= nType;
1118 0 : switch(nType)
1119 : {
1120 : case DataType::CHAR:
1121 : case DataType::VARCHAR:
1122 : case DataType::LONGVARCHAR:
1123 : case DataType::CLOB:
1124 0 : if(aText.GetChar(0) != '\'' || aText.GetChar(aText.Len() -1) != '\'')
1125 : {
1126 0 : aText.SearchAndReplaceAll(rtl::OUString("'"), rtl::OUString("''"));
1127 0 : String aTmp(rtl::OUString("'"));
1128 0 : (aTmp += aText) += rtl::OUString("'");
1129 0 : aText = aTmp;
1130 : }
1131 0 : break;
1132 : default:
1133 : ;
1134 : }
1135 0 : ::connectivity::OSQLParser& rParser = static_cast<OQueryController&>(getDesignView()->getController()).getParser();
1136 : pParseNode = rParser.predicateTree(aErrorMsg,
1137 : aText,
1138 0 : static_cast<OQueryController&>(getDesignView()->getController()).getNumberFormatter(),
1139 0 : xColumn);
1140 0 : if (pParseNode)
1141 : {
1142 : pParseNode->parseNodeToPredicateStr(aCrit,
1143 : xConnection,
1144 0 : static_cast<OQueryController&>(getDesignView()->getController()).getNumberFormatter(),
1145 : xColumn,
1146 : getDesignView()->getLocale(),
1147 0 : static_cast<sal_Char>(getDesignView()->getDecimalSeparator().toChar()),
1148 0 : &(static_cast<OQueryController&>(getDesignView()->getController()).getParser().getContext()));
1149 0 : delete pParseNode;
1150 : }
1151 : else
1152 : {
1153 0 : if ( !m_bDisableErrorBox )
1154 : {
1155 0 : OSQLWarningBox( this, aErrorMsg ).Execute();
1156 : }
1157 0 : bError = sal_True;
1158 : }
1159 : }
1160 : else
1161 : {
1162 0 : if ( !m_bDisableErrorBox )
1163 : {
1164 0 : OSQLWarningBox( this, aErrorMsg ).Execute();
1165 : }
1166 0 : bError = sal_True;
1167 : }
1168 0 : }
1169 : }
1170 0 : strOldCellContents = pEntry->GetCriteria(nIdx);
1171 0 : pEntry->SetCriteria(nIdx, aCrit);
1172 0 : sNewValue = pEntry->GetCriteria(nIdx);
1173 0 : if(!aCrit.isEmpty() && nRow >= (GetRowCount()-1))
1174 0 : bAppendRow = sal_True;
1175 : }
1176 : }
1177 0 : if(!bError && Controller())
1178 0 : Controller()->ClearModified();
1179 :
1180 0 : RowModified(GetCurRow(), GetCurColumnId());
1181 :
1182 0 : if ( bAppendRow )
1183 : {
1184 0 : RowInserted( GetRowCount()-1, 1, sal_True );
1185 0 : m_bVisibleRow.push_back(sal_True);
1186 0 : ++m_nVisibleCount;
1187 : }
1188 :
1189 0 : if(!bError)
1190 : {
1191 : // und noch die Undo-Action fuer das Ganze
1192 0 : appendUndoAction(strOldCellContents,sNewValue,nRow);
1193 :
1194 0 : }
1195 : }
1196 :
1197 : // habe ich Daten in einer FieldDescription gespeichert, die vorher leer war und es nach den Aenderungen nicht mehr ist ?
1198 0 : if ( pEntry.is() && bWasEmpty && !pEntry->IsEmpty() && !bError )
1199 : {
1200 : // Default auf sichtbar
1201 0 : pEntry->SetVisible(sal_True);
1202 0 : appendUndoAction(g_strZero,g_strOne,BROW_VIS_ROW,bListAction);
1203 0 : RowModified(BROW_VIS_ROW, GetCurColumnId());
1204 :
1205 : // wenn noetig neue freie Spalten anlegen
1206 : sal_uInt16 nDummy;
1207 0 : CheckFreeColumns(nDummy);
1208 : }
1209 :
1210 0 : if ( bListAction && !m_bInUndoMode )
1211 0 : static_cast<OQueryController&>(getDesignView()->getController()).GetUndoManager().LeaveListAction();
1212 :
1213 0 : return pEntry != NULL && !bError;
1214 : }
1215 :
1216 : //------------------------------------------------------------------------------
1217 0 : sal_Bool OSelectionBrowseBox::SeekRow(long nRow)
1218 : {
1219 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1220 0 : sal_Bool bRet = sal_False;
1221 :
1222 0 : m_nSeekRow = nRow;
1223 0 : if (nRow < m_nVisibleCount )
1224 0 : bRet = sal_True;
1225 :
1226 0 : return bRet;
1227 : }
1228 :
1229 : //------------------------------------------------------------------------------
1230 0 : void OSelectionBrowseBox::PaintCell(OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColumnId) const
1231 : {
1232 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1233 0 : rDev.SetClipRegion( rRect );
1234 :
1235 0 : OTableFieldDescRef pEntry = NULL;
1236 0 : sal_uInt16 nPos = GetColumnPos(nColumnId);
1237 0 : if(getFields().size() > sal_uInt16(nPos - 1))
1238 0 : pEntry = getFields()[nPos - 1];
1239 :
1240 0 : if (!pEntry.is())
1241 0 : return;
1242 :
1243 0 : long nRow = GetRealRow(m_nSeekRow);
1244 0 : if (nRow == BROW_VIS_ROW)
1245 0 : PaintTristate(rDev, rRect, pEntry->IsVisible() ? STATE_CHECK : STATE_NOCHECK);
1246 : else
1247 0 : rDev.DrawText(rRect, GetCellText(nRow, nColumnId),TEXT_DRAW_VCENTER);
1248 :
1249 0 : rDev.SetClipRegion( );
1250 : }
1251 :
1252 : //------------------------------------------------------------------------------
1253 0 : void OSelectionBrowseBox::PaintStatusCell(OutputDevice& rDev, const Rectangle& rRect) const
1254 : {
1255 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1256 0 : Rectangle aRect(rRect);
1257 0 : aRect.TopLeft().Y() -= 2;
1258 0 : String aLabel(ModuleRes(STR_QUERY_HANDLETEXT));
1259 :
1260 : // ab BROW_CRIT2_ROW werden alle Zeilen mit "oder" angegeben
1261 0 : xub_StrLen nToken = (xub_StrLen) (m_nSeekRow >= GetBrowseRow(BROW_CRIT2_ROW))
1262 : ?
1263 0 : xub_StrLen(BROW_CRIT2_ROW) : xub_StrLen(GetRealRow(m_nSeekRow));
1264 0 : rDev.DrawText(aRect, aLabel.GetToken(nToken),TEXT_DRAW_VCENTER);
1265 0 : }
1266 :
1267 : //------------------------------------------------------------------------------
1268 0 : void OSelectionBrowseBox::RemoveColumn(sal_uInt16 _nColumnId)
1269 : {
1270 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1271 0 : OQueryController& rController = static_cast<OQueryController&>(getDesignView()->getController());
1272 :
1273 0 : sal_uInt16 nPos = GetColumnPos(_nColumnId);
1274 : // das Control sollte immer genau eine Spalte mehr haben, naemlich die HandleColumn
1275 : OSL_ENSURE((nPos == 0) || (nPos <= getFields().size()), "OSelectionBrowseBox::RemoveColumn : invalid parameter nColId");
1276 : // ColId ist bei mir gleichbedeutend mit Position, und da sollte die Bedingung natuerlich zutreffen
1277 :
1278 0 : sal_uInt16 nCurCol = GetCurColumnId();
1279 0 : long nCurrentRow = GetCurRow();
1280 :
1281 0 : DeactivateCell();
1282 :
1283 0 : getFields().erase( getFields().begin() + (nPos - 1) );
1284 0 : OTableFieldDescRef pEntry = new OTableFieldDesc();
1285 0 : pEntry->SetColumnId(_nColumnId);
1286 0 : getFields().push_back(pEntry);
1287 :
1288 0 : EditBrowseBox::RemoveColumn( _nColumnId );
1289 0 : InsertDataColumn( _nColumnId , String(), DEFAULT_SIZE, HIB_STDSTYLE, HEADERBAR_APPEND);
1290 :
1291 : // Neuzeichnen
1292 0 : Rectangle aInvalidRect = GetInvalidRect( _nColumnId );
1293 0 : Invalidate( aInvalidRect );
1294 :
1295 0 : ActivateCell( nCurrentRow, nCurCol );
1296 :
1297 0 : rController.setModified( sal_True );
1298 :
1299 0 : invalidateUndoRedo();
1300 0 : }
1301 :
1302 : //------------------------------------------------------------------------------
1303 0 : void OSelectionBrowseBox::RemoveField(sal_uInt16 nColumnId )
1304 : {
1305 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1306 0 : OQueryController& rController = static_cast<OQueryController&>(getDesignView()->getController());
1307 :
1308 0 : sal_uInt16 nPos = GetColumnPos(nColumnId);
1309 : OSL_ENSURE(getFields().size() > sal_uInt16(nPos-1),"ID is to great!");
1310 :
1311 0 : OTableFieldDescRef pDesc = getEntry((sal_uInt32)(nPos - 1)) ;
1312 0 : pDesc->SetColWidth( (sal_uInt16)GetColumnWidth(nColumnId) ); // hat er sich vorher leider nicht gemerkt
1313 :
1314 : // UndoAction erzeugen
1315 0 : if ( !m_bInUndoMode )
1316 : {
1317 0 : OTabFieldDelUndoAct* pUndoAction = new OTabFieldDelUndoAct( this );
1318 0 : pUndoAction->SetTabFieldDescr(pDesc);
1319 0 : pUndoAction->SetColumnPosition(nPos);
1320 0 : rController.addUndoActionAndInvalidate( pUndoAction );
1321 : }
1322 :
1323 0 : RemoveColumn(nColumnId);
1324 :
1325 0 : invalidateUndoRedo();
1326 0 : }
1327 :
1328 : //------------------------------------------------------------------------------
1329 0 : void OSelectionBrowseBox::adjustSelectionMode( sal_Bool _bClickedOntoHeader, sal_Bool _bClickedOntoHandleCol )
1330 : {
1331 : // wenn ein Header selectiert wird, mu� die selection angezeigt werden, sonst nicht)
1332 0 : if ( _bClickedOntoHeader )
1333 : {
1334 0 : if (0 == GetSelectColumnCount() )
1335 : // wenn es schon eine selektierte Spalte gibt, bin ich schon im richtigen Modus
1336 0 : if ( BROWSER_HIDESELECT == ( m_nMode & BROWSER_HIDESELECT ) )
1337 : {
1338 0 : m_nMode &= ~BROWSER_HIDESELECT;
1339 0 : m_nMode |= BROWSER_MULTISELECTION;
1340 0 : SetMode( m_nMode );
1341 : }
1342 : }
1343 0 : else if ( BROWSER_HIDESELECT != ( m_nMode & BROWSER_HIDESELECT ) )
1344 : {
1345 0 : if ( GetSelectColumnCount() != 0 )
1346 0 : SetNoSelection();
1347 :
1348 0 : if ( _bClickedOntoHandleCol )
1349 : {
1350 0 : m_nMode |= BROWSER_HIDESELECT;
1351 0 : m_nMode &= ~BROWSER_MULTISELECTION;
1352 0 : SetMode( m_nMode );
1353 : }
1354 : }
1355 0 : }
1356 :
1357 : //------------------------------------------------------------------------------
1358 0 : void OSelectionBrowseBox::MouseButtonDown(const BrowserMouseEvent& rEvt)
1359 : {
1360 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1361 0 : if( rEvt.IsLeft() )
1362 : {
1363 0 : sal_Bool bOnHandle = HANDLE_ID == rEvt.GetColumnId();
1364 0 : sal_Bool bOnHeader = ( rEvt.GetRow() < 0 ) && !bOnHandle;
1365 0 : adjustSelectionMode( bOnHeader, bOnHandle );
1366 : }
1367 0 : EditBrowseBox::MouseButtonDown(rEvt);
1368 0 : }
1369 :
1370 : //------------------------------------------------------------------------------
1371 0 : void OSelectionBrowseBox::MouseButtonUp(const BrowserMouseEvent& rEvt)
1372 : {
1373 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1374 0 : EditBrowseBox::MouseButtonUp( rEvt );
1375 0 : static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature( ID_BROWSER_QUERY_EXECUTE );
1376 0 : }
1377 :
1378 : //------------------------------------------------------------------------------
1379 0 : void OSelectionBrowseBox::KeyInput( const KeyEvent& rEvt )
1380 : {
1381 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1382 0 : if (IsColumnSelected(GetCurColumnId()))
1383 : {
1384 0 : if (rEvt.GetKeyCode().GetCode() == KEY_DELETE && // Delete rows
1385 0 : !rEvt.GetKeyCode().IsShift() &&
1386 0 : !rEvt.GetKeyCode().IsMod1())
1387 : {
1388 0 : RemoveField(GetCurColumnId());
1389 0 : return;
1390 : }
1391 : }
1392 0 : EditBrowseBox::KeyInput(rEvt);
1393 : }
1394 :
1395 :
1396 : //------------------------------------------------------------------------------
1397 0 : sal_Int8 OSelectionBrowseBox::AcceptDrop( const BrowserAcceptDropEvent& rEvt )
1398 : {
1399 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1400 0 : sal_Int8 nDropAction = DND_ACTION_NONE;
1401 0 : if ( rEvt.GetRow() >= -1 )
1402 : {
1403 0 : if ( IsEditing() )
1404 : {
1405 : // allow the asterix again
1406 0 : m_bDisableErrorBox = sal_True;
1407 0 : SaveModified();
1408 0 : m_bDisableErrorBox = sal_False;
1409 0 : DeactivateCell();
1410 : }
1411 : // check if the format is already supported, if not deactivate the current cell and try again
1412 0 : if ( OJoinExchObj::isFormatAvailable(GetDataFlavors()) )
1413 0 : nDropAction = DND_ACTION_LINK;
1414 : }
1415 :
1416 0 : return nDropAction;
1417 : }
1418 :
1419 : //------------------------------------------------------------------------------
1420 0 : sal_Int8 OSelectionBrowseBox::ExecuteDrop( const BrowserExecuteDropEvent& _rEvt )
1421 : {
1422 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1423 :
1424 0 : TransferableDataHelper aDropped(_rEvt.maDropEvent.Transferable);
1425 0 : if (!OJoinExchObj::isFormatAvailable(aDropped.GetDataFlavorExVector()))
1426 : {
1427 : OSL_FAIL("OSelectionBrowseBox::ExecuteDrop: this should never have passed AcceptDrop!");
1428 0 : return DND_ACTION_NONE;
1429 : }
1430 :
1431 0 : OTableFieldDesc aInfo;
1432 : // Einfuegen des Feldes an der gewuenschten Position
1433 0 : OJoinExchangeData jxdSource = OJoinExchObj::GetSourceDescription(_rEvt.maDropEvent.Transferable);
1434 0 : InsertField(jxdSource);
1435 :
1436 0 : return DND_ACTION_LINK;
1437 : }
1438 :
1439 : //------------------------------------------------------------------------------
1440 0 : OTableFieldDescRef OSelectionBrowseBox::AppendNewCol( sal_uInt16 nCnt)
1441 : {
1442 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1443 : // es koennen mehrere angelegt werden, aber der Erste
1444 : // wird returnt
1445 0 : sal_uInt32 nCount = getFields().size();
1446 0 : for (sal_uInt16 i=0 ; i<nCnt ; i++)
1447 : {
1448 0 : OTableFieldDescRef pEmptyEntry = new OTableFieldDesc();
1449 0 : getFields().push_back(pEmptyEntry);
1450 0 : sal_uInt16 nColumnId = sal::static_int_cast< sal_uInt16 >(getFields().size());
1451 0 : pEmptyEntry->SetColumnId( nColumnId );
1452 :
1453 0 : InsertDataColumn( nColumnId , String(), DEFAULT_SIZE, HIB_STDSTYLE, HEADERBAR_APPEND);
1454 0 : }
1455 :
1456 0 : return getFields()[nCount];
1457 : }
1458 :
1459 : //------------------------------------------------------------------------------
1460 0 : void OSelectionBrowseBox::DeleteFields(const String& rAliasName)
1461 : {
1462 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1463 0 : if (!getFields().empty())
1464 : {
1465 0 : sal_uInt16 nColId = GetCurColumnId();
1466 0 : sal_uInt32 nRow = GetCurRow();
1467 :
1468 0 : sal_Bool bWasEditing = IsEditing();
1469 0 : if (bWasEditing)
1470 0 : DeactivateCell();
1471 :
1472 0 : OTableFields::reverse_iterator aIter = getFields().rbegin();
1473 0 : OTableFieldDescRef pEntry = NULL;
1474 0 : for(sal_uInt16 nPos=sal::static_int_cast< sal_uInt16 >(getFields().size());aIter != getFields().rend();++aIter,--nPos)
1475 : {
1476 0 : pEntry = *aIter;
1477 0 : if ( pEntry->GetAlias().equals( rAliasName ) )
1478 : {
1479 0 : RemoveField( GetColumnId( nPos ) );
1480 0 : break;
1481 : }
1482 : }
1483 :
1484 0 : if (bWasEditing)
1485 0 : ActivateCell(nRow , nColId);
1486 : }
1487 0 : }
1488 :
1489 : //------------------------------------------------------------------------------
1490 0 : void OSelectionBrowseBox::SetColWidth(sal_uInt16 nColId, long nNewWidth)
1491 : {
1492 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1493 0 : sal_Bool bWasEditing = IsEditing();
1494 0 : if (bWasEditing)
1495 0 : DeactivateCell();
1496 :
1497 : // die Basisklasse machen lassen
1498 0 : SetColumnWidth(nColId, nNewWidth);
1499 :
1500 : // der FieldDescription Bescheid sagen
1501 0 : OTableFieldDescRef pEntry = getEntry(GetColumnPos(nColId) - 1);
1502 0 : if (pEntry.is())
1503 0 : pEntry->SetColWidth(sal_uInt16(GetColumnWidth(nColId)));
1504 :
1505 0 : if (bWasEditing)
1506 0 : ActivateCell(GetCurRow(), GetCurColumnId());
1507 0 : }
1508 :
1509 : //------------------------------------------------------------------------------
1510 0 : Rectangle OSelectionBrowseBox::GetInvalidRect( sal_uInt16 nColId )
1511 : {
1512 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1513 : //////////////////////////////////////////////////////////////////////
1514 : // Rechteck ist erst einmal der gesamte Outputbereich des Fensters
1515 0 : Rectangle aInvalidRect( Point(0,0), GetOutputSizePixel() );
1516 :
1517 : //////////////////////////////////////////////////////////////////////
1518 : // Dann wird die linke Seite angepasst
1519 0 : Rectangle aFieldRect(GetCellRect( 0, nColId )); // used instead of GetFieldRectPixel
1520 0 : aInvalidRect.Left() = aFieldRect.Left();
1521 :
1522 0 : return aInvalidRect;
1523 : }
1524 :
1525 : //------------------------------------------------------------------------------
1526 0 : void OSelectionBrowseBox::InsertColumn(OTableFieldDescRef pEntry, sal_uInt16& _nColumnPosition)
1527 : {
1528 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1529 : // das Control sollte immer genau eine Spalte mehr haben, naemlich die HandleColumn
1530 : OSL_ENSURE(_nColumnPosition == BROWSER_INVALIDID || (_nColumnPosition <= (long)getFields().size()), "OSelectionBrowseBox::InsertColumn : invalid parameter nColId.");
1531 : // -1 heisst ganz hinten, Count heisst ganz hinten, der Rest bezeichnet eine richtige Position
1532 :
1533 0 : sal_uInt16 nCurCol = GetCurColumnId();
1534 0 : long nCurrentRow = GetCurRow();
1535 :
1536 0 : DeactivateCell();
1537 :
1538 : // remember the column id of the current positon
1539 0 : sal_uInt16 nColumnId = GetColumnId(_nColumnPosition);
1540 : // Wenn zu klein oder zu gross, auf Ende der Liste setzen
1541 0 : if ((_nColumnPosition == BROWSER_INVALIDID) || (_nColumnPosition >= getFields().size())) // Anhaengen des Feldes
1542 : {
1543 0 : if (FindFirstFreeCol(_nColumnPosition) == NULL) // keine freie Column mehr
1544 : {
1545 0 : AppendNewCol(1);
1546 : _nColumnPosition = sal::static_int_cast< sal_uInt16 >(
1547 0 : getFields().size());
1548 : }
1549 : else
1550 0 : ++_nColumnPosition; // innerhalb der vorgegebenen Liste
1551 0 : nColumnId = GetColumnId(_nColumnPosition);
1552 0 : pEntry->SetColumnId( nColumnId );
1553 0 : getFields()[ _nColumnPosition - 1] = pEntry;
1554 : }
1555 :
1556 : // check if the column ids are identical, if not we have to move
1557 0 : if ( pEntry->GetColumnId() != nColumnId )
1558 : {
1559 0 : sal_uInt16 nOldPosition = GetColumnPos(pEntry->GetColumnId());
1560 : OSL_ENSURE( nOldPosition != 0,"Old position was 0. Not possible!");
1561 0 : SetColumnPos(pEntry->GetColumnId(),_nColumnPosition);
1562 : // we have to delete an empty field for the fields list, because the columns must have equal length
1563 0 : if ( nOldPosition > 0 && nOldPosition <= getFields().size() )
1564 0 : getFields()[nOldPosition - 1] = pEntry;
1565 :
1566 0 : ColumnMoved(pEntry->GetColumnId(),sal_False);
1567 : }
1568 :
1569 0 : if ( pEntry->GetFunctionType() & (FKT_AGGREGATE) )
1570 : {
1571 0 : String sFunctionName = pEntry->GetFunction();
1572 0 : if ( GetFunctionName(sal_uInt32(-1),sFunctionName) )
1573 0 : pEntry->SetFunction(sFunctionName);
1574 : }
1575 :
1576 0 : nColumnId = pEntry->GetColumnId();
1577 :
1578 0 : SetColWidth(nColumnId,getDesignView()->getColWidth(GetColumnPos(nColumnId)-1));
1579 : // Neuzeichnen
1580 0 : Rectangle aInvalidRect = GetInvalidRect( nColumnId );
1581 0 : Invalidate( aInvalidRect );
1582 :
1583 0 : ActivateCell( nCurrentRow, nCurCol );
1584 0 : static_cast<OQueryController&>(getDesignView()->getController()).setModified( sal_True );
1585 :
1586 0 : invalidateUndoRedo();
1587 0 : }
1588 :
1589 : //------------------------------------------------------------------------------
1590 0 : OTableFieldDescRef OSelectionBrowseBox::InsertField(const OJoinExchangeData& jxdSource, sal_uInt16 _nColumnPosition, sal_Bool bVis, sal_Bool bActivate)
1591 : {
1592 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1593 0 : OQueryTableWindow* pSourceWin = static_cast<OQueryTableWindow*>(jxdSource.pListBox->GetTabWin());
1594 0 : if (!pSourceWin)
1595 0 : return NULL;
1596 :
1597 : // Namen/Position des selektierten Feldes
1598 0 : String aFieldName = jxdSource.pListBox->GetEntryText(jxdSource.pEntry);
1599 0 : sal_uInt32 nFieldIndex = jxdSource.pListBox->GetModel()->GetAbsPos(jxdSource.pEntry);
1600 0 : OTableFieldInfo* pInf = static_cast<OTableFieldInfo*>(jxdSource.pEntry->GetUserData());
1601 :
1602 : // eine DragInfo aufbauen, damit ich mich auf das andere InsertField zurueckziehen kann
1603 0 : OTableFieldDescRef aInfo = new OTableFieldDesc(pSourceWin->GetTableName(),aFieldName);
1604 0 : aInfo->SetTabWindow(pSourceWin);
1605 0 : aInfo->SetFieldIndex(nFieldIndex);
1606 0 : aInfo->SetFieldType(pInf->GetKeyType());
1607 0 : aInfo->SetAlias(pSourceWin->GetAliasName());
1608 :
1609 0 : aInfo->SetDataType(pInf->GetDataType());
1610 0 : aInfo->SetVisible(bVis);
1611 :
1612 0 : return InsertField(aInfo, _nColumnPosition, bVis, bActivate);
1613 : }
1614 :
1615 : //------------------------------------------------------------------------------
1616 0 : OTableFieldDescRef OSelectionBrowseBox::InsertField(const OTableFieldDescRef& _rInfo, sal_uInt16 _nColumnPosition, sal_Bool bVis, sal_Bool bActivate)
1617 : {
1618 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1619 :
1620 0 : if(m_nMaxColumns && m_nMaxColumns <= FieldsCount())
1621 0 : return NULL;
1622 0 : if (bActivate)
1623 0 : SaveModified();
1624 :
1625 : // Neue Spaltenbeschreibung
1626 0 : OTableFieldDescRef pEntry = _rInfo;
1627 0 : pEntry->SetVisible(bVis);
1628 :
1629 : // Spalte einfuegen
1630 0 : InsertColumn( pEntry, _nColumnPosition );
1631 :
1632 0 : if ( !m_bInUndoMode )
1633 : {
1634 : // UndoAction erzeugen
1635 0 : OTabFieldCreateUndoAct* pUndoAction = new OTabFieldCreateUndoAct( this );
1636 0 : pUndoAction->SetTabFieldDescr( pEntry );
1637 0 : pUndoAction->SetColumnPosition(_nColumnPosition);
1638 0 : getDesignView()->getController().addUndoActionAndInvalidate( pUndoAction );
1639 : }
1640 :
1641 0 : return pEntry;
1642 : }
1643 :
1644 : //------------------------------------------------------------------------------
1645 0 : sal_uInt16 OSelectionBrowseBox::FieldsCount()
1646 : {
1647 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1648 0 : OTableFields::iterator aIter = getFields().begin();
1649 0 : sal_uInt16 nCount = 0;
1650 :
1651 0 : while (aIter != getFields().end())
1652 : {
1653 0 : if ((*aIter).is() && !(*aIter)->IsEmpty())
1654 0 : ++nCount;
1655 0 : ++aIter;
1656 : }
1657 :
1658 0 : return nCount;
1659 : }
1660 :
1661 : //------------------------------------------------------------------------------
1662 0 : OTableFieldDescRef OSelectionBrowseBox::FindFirstFreeCol(sal_uInt16& _rColumnPosition )
1663 : {
1664 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1665 0 : OTableFields::iterator aIter = getFields().begin();
1666 0 : OTableFields::iterator aEnd = getFields().end();
1667 :
1668 0 : _rColumnPosition = BROWSER_INVALIDID;
1669 :
1670 0 : while ( aIter != aEnd )
1671 : {
1672 0 : ++_rColumnPosition;
1673 0 : OTableFieldDescRef pEntry = (*aIter);
1674 0 : if ( pEntry.is() && pEntry->IsEmpty() )
1675 0 : return pEntry;
1676 0 : ++aIter;
1677 0 : }
1678 :
1679 0 : return NULL;
1680 : }
1681 :
1682 : //------------------------------------------------------------------------------
1683 0 : void OSelectionBrowseBox::CheckFreeColumns(sal_uInt16& _rColumnPosition)
1684 : {
1685 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1686 0 : if (FindFirstFreeCol(_rColumnPosition) == NULL)
1687 : {
1688 : // es ist voll, also einen Packen Spalten anhaengen
1689 0 : AppendNewCol(DEFAULT_QUERY_COLS);
1690 0 : OSL_VERIFY(FindFirstFreeCol(_rColumnPosition).is());
1691 : }
1692 0 : }
1693 : //------------------------------------------------------------------------------
1694 0 : void OSelectionBrowseBox::AddGroupBy( const OTableFieldDescRef& rInfo , sal_uInt32 /*_nCurrentPos*/)
1695 : {
1696 0 : Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection();
1697 0 : if(!xConnection.is())
1698 0 : return;
1699 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1700 : OSL_ENSURE(!rInfo->IsEmpty(),"AddGroupBy:: OTableFieldDescRef sollte nicht Empty sein!");
1701 0 : OTableFieldDescRef pEntry;
1702 0 : const Reference<XDatabaseMetaData> xMeta = xConnection->getMetaData();
1703 0 : const ::comphelper::UStringMixEqual bCase(xMeta.is() && xMeta->supportsMixedCaseQuotedIdentifiers());
1704 : //sal_Bool bAppend = sal_False;
1705 :
1706 0 : OTableFields& rFields = getFields();
1707 0 : OTableFields::iterator aIter = rFields.begin();
1708 0 : OTableFields::iterator aEnd = rFields.end();
1709 0 : for(;aIter != aEnd;++aIter)
1710 : {
1711 0 : pEntry = *aIter;
1712 : OSL_ENSURE(pEntry.is(),"OTableFieldDescRef was null!");
1713 :
1714 0 : const ::rtl::OUString aField = pEntry->GetField();
1715 0 : const ::rtl::OUString aAlias = pEntry->GetAlias();
1716 :
1717 0 : if (bCase(aField,rInfo->GetField()) &&
1718 0 : bCase(aAlias,rInfo->GetAlias()) &&
1719 0 : pEntry->GetFunctionType() == rInfo->GetFunctionType() &&
1720 0 : pEntry->GetFunction() == rInfo->GetFunction())
1721 : {
1722 0 : if ( pEntry->isNumericOrAggreateFunction() && rInfo->IsGroupBy() )
1723 : {
1724 0 : pEntry->SetGroupBy(sal_False);
1725 0 : aIter = rFields.end();
1726 : break;
1727 : }
1728 : else
1729 : {
1730 0 : if ( !pEntry->IsGroupBy() && !pEntry->HasCriteria() ) // here we have a where condition which is no having clause
1731 : {
1732 0 : pEntry->SetGroupBy(rInfo->IsGroupBy());
1733 0 : if(!m_bGroupByUnRelated && pEntry->IsGroupBy())
1734 0 : pEntry->SetVisible(sal_True);
1735 : break;
1736 : }
1737 : }
1738 :
1739 : }
1740 0 : }
1741 :
1742 0 : if (aIter == rFields.end())
1743 : {
1744 0 : OTableFieldDescRef pTmp = InsertField(rInfo, BROWSER_INVALIDID, sal_False, sal_False );
1745 0 : if ( (pTmp->isNumericOrAggreateFunction() && rInfo->IsGroupBy()) ) // das GroupBy wird bereits von rInfo "ubernommen
1746 0 : pTmp->SetGroupBy(sal_False);
1747 0 : }
1748 : }
1749 : //------------------------------------------------------------------------------
1750 0 : void OSelectionBrowseBox::DuplicateConditionLevel( const sal_uInt16 nLevel)
1751 : {
1752 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1753 0 : const sal_uInt16 nNewLevel = nLevel +1;
1754 0 : OTableFields& rFields = getFields();
1755 0 : OTableFields::iterator aIter = rFields.begin();
1756 0 : OTableFields::iterator aEnd = rFields.end();
1757 0 : for(;aIter != aEnd;++aIter)
1758 : {
1759 0 : OTableFieldDescRef pEntry = *aIter;
1760 :
1761 0 : ::rtl::OUString sValue = pEntry->GetCriteria(nLevel);
1762 0 : if ( !sValue.isEmpty() )
1763 : {
1764 0 : pEntry->SetCriteria( nNewLevel, sValue);
1765 0 : if ( nNewLevel == (m_nVisibleCount-BROW_CRIT1_ROW-1) )
1766 : {
1767 0 : RowInserted( GetRowCount()-1, 1, sal_True );
1768 0 : m_bVisibleRow.push_back(sal_True);
1769 0 : ++m_nVisibleCount;
1770 : }
1771 0 : m_bVisibleRow[BROW_CRIT1_ROW + nNewLevel] = sal_True;
1772 : }
1773 0 : }
1774 0 : }
1775 : //------------------------------------------------------------------------------
1776 0 : void OSelectionBrowseBox::AddCondition( const OTableFieldDescRef& rInfo, const String& rValue, const sal_uInt16 nLevel,bool _bAddOrOnOneLine )
1777 : {
1778 0 : Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection();
1779 0 : if(!xConnection.is())
1780 0 : return;
1781 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1782 : OSL_ENSURE(rInfo.is() && !rInfo->IsEmpty(),"AddCondition:: OTableFieldDescRef sollte nicht Empty sein!");
1783 :
1784 0 : OTableFieldDescRef pLastEntry;
1785 0 : Reference<XDatabaseMetaData> xMeta = xConnection->getMetaData();
1786 0 : ::comphelper::UStringMixEqual bCase(xMeta.is() && xMeta->supportsMixedCaseQuotedIdentifiers());
1787 :
1788 0 : OTableFields& rFields = getFields();
1789 0 : OTableFields::iterator aIter = rFields.begin();
1790 0 : OTableFields::iterator aEnd = rFields.end();
1791 0 : for(;aIter != aEnd;++aIter)
1792 : {
1793 0 : OTableFieldDescRef pEntry = *aIter;
1794 0 : const ::rtl::OUString aField = pEntry->GetField();
1795 0 : const ::rtl::OUString aAlias = pEntry->GetAlias();
1796 :
1797 0 : if (bCase(aField,rInfo->GetField()) &&
1798 0 : bCase(aAlias,rInfo->GetAlias()) &&
1799 0 : pEntry->GetFunctionType() == rInfo->GetFunctionType() &&
1800 0 : pEntry->GetFunction() == rInfo->GetFunction() &&
1801 0 : pEntry->IsGroupBy() == rInfo->IsGroupBy() )
1802 : {
1803 0 : if ( pEntry->isNumericOrAggreateFunction() && rInfo->IsGroupBy() )
1804 0 : pEntry->SetGroupBy(sal_False);
1805 : else
1806 : {
1807 0 : if(!m_bGroupByUnRelated && pEntry->IsGroupBy())
1808 0 : pEntry->SetVisible(sal_True);
1809 : }
1810 0 : if (pEntry->GetCriteria(nLevel).isEmpty() )
1811 : {
1812 0 : pEntry->SetCriteria( nLevel, rValue);
1813 0 : if(nLevel == (m_nVisibleCount-BROW_CRIT1_ROW-1))
1814 : {
1815 0 : RowInserted( GetRowCount()-1, 1, sal_True );
1816 0 : m_bVisibleRow.push_back(sal_True);
1817 0 : ++m_nVisibleCount;
1818 : }
1819 0 : m_bVisibleRow[BROW_CRIT1_ROW + nLevel] = sal_True;
1820 : break;
1821 : }
1822 0 : if ( _bAddOrOnOneLine )
1823 : {
1824 0 : pLastEntry = pEntry;
1825 : }
1826 : }
1827 0 : }
1828 0 : if ( pLastEntry.is() )
1829 : {
1830 0 : String sCriteria = rValue;
1831 0 : String sOldCriteria = pLastEntry->GetCriteria( nLevel );
1832 0 : if ( sOldCriteria.Len() )
1833 : {
1834 0 : sCriteria = String(RTL_CONSTASCII_USTRINGPARAM("( "));
1835 0 : sCriteria += sOldCriteria;
1836 0 : sCriteria += String(RTL_CONSTASCII_USTRINGPARAM(" OR "));
1837 0 : sCriteria += rValue;
1838 0 : sCriteria += String(RTL_CONSTASCII_USTRINGPARAM(" )"));
1839 : }
1840 0 : pLastEntry->SetCriteria( nLevel, sCriteria);
1841 0 : if(nLevel == (m_nVisibleCount-BROW_CRIT1_ROW-1))
1842 : {
1843 0 : RowInserted( GetRowCount()-1, 1, sal_True );
1844 0 : m_bVisibleRow.push_back(sal_True);
1845 0 : ++m_nVisibleCount;
1846 : }
1847 0 : m_bVisibleRow[BROW_CRIT1_ROW + nLevel] = sal_True;
1848 : }
1849 :
1850 0 : else if (aIter == getFields().end())
1851 : {
1852 0 : OTableFieldDescRef pTmp = InsertField(rInfo, BROWSER_INVALIDID, sal_False, sal_False );
1853 0 : if ( pTmp->isNumericOrAggreateFunction() && rInfo->IsGroupBy() ) // das GroupBy wird bereits von rInfo "ubernommen
1854 0 : pTmp->SetGroupBy(sal_False);
1855 0 : if ( pTmp.is() )
1856 : {
1857 0 : pTmp->SetCriteria( nLevel, rValue);
1858 0 : if(nLevel == (m_nVisibleCount-BROW_CRIT1_ROW-1))
1859 : {
1860 0 : RowInserted( GetRowCount()-1, 1, sal_True );
1861 0 : m_bVisibleRow.push_back(sal_True);
1862 0 : ++m_nVisibleCount;
1863 : }
1864 0 : }
1865 0 : }
1866 : }
1867 :
1868 : //------------------------------------------------------------------------------
1869 0 : void OSelectionBrowseBox::AddOrder( const OTableFieldDescRef& rInfo, const EOrderDir eDir, sal_uInt32 _nCurrentPos)
1870 : {
1871 0 : if (_nCurrentPos == 0)
1872 0 : m_nLastSortColumn = SORT_COLUMN_NONE;
1873 :
1874 0 : Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection();
1875 0 : if(!xConnection.is())
1876 0 : return;
1877 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1878 : OSL_ENSURE(!rInfo->IsEmpty(),"AddOrder:: OTableFieldDescRef should not be Empty!");
1879 0 : OTableFieldDescRef pEntry;
1880 0 : Reference<XDatabaseMetaData> xMeta = xConnection->getMetaData();
1881 0 : ::comphelper::UStringMixEqual bCase(xMeta.is() && xMeta->supportsMixedCaseQuotedIdentifiers());
1882 :
1883 0 : sal_Bool bAppend = sal_False;
1884 0 : OTableFields& rFields = getFields();
1885 0 : OTableFields::iterator aIter = rFields.begin();
1886 0 : OTableFields::iterator aEnd = rFields.end();
1887 0 : for(;aIter != aEnd;++aIter)
1888 : {
1889 0 : pEntry = *aIter;
1890 0 : ::rtl::OUString aField = pEntry->GetField();
1891 0 : ::rtl::OUString aAlias = pEntry->GetAlias();
1892 :
1893 0 : if (bCase(aField,rInfo->GetField()) &&
1894 0 : bCase(aAlias,rInfo->GetAlias()))
1895 : {
1896 0 : sal_uInt32 nPos = aIter - rFields.begin();
1897 0 : bAppend = (m_nLastSortColumn != SORT_COLUMN_NONE) && (nPos <= m_nLastSortColumn);
1898 0 : if ( bAppend )
1899 0 : aIter = rFields.end();
1900 : else
1901 : {
1902 0 : if ( !m_bOrderByUnRelated )
1903 0 : pEntry->SetVisible(sal_True);
1904 0 : pEntry->SetOrderDir( eDir );
1905 0 : m_nLastSortColumn = nPos;
1906 : }
1907 : break;
1908 : }
1909 0 : }
1910 :
1911 0 : if (aIter == rFields.end())
1912 : {
1913 0 : OTableFieldDescRef pTmp = InsertField(rInfo, BROWSER_INVALIDID, sal_False, sal_False );
1914 0 : if(pTmp.is())
1915 : {
1916 0 : m_nLastSortColumn = pTmp->GetColumnId() - 1;
1917 0 : if ( !m_bOrderByUnRelated && !bAppend )
1918 0 : pTmp->SetVisible(sal_True);
1919 0 : pTmp->SetOrderDir( eDir );
1920 0 : }
1921 0 : }
1922 : }
1923 :
1924 : //------------------------------------------------------------------------------
1925 0 : void OSelectionBrowseBox::ArrangeControls(sal_uInt16& nX, sal_uInt16 nY)
1926 : {
1927 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1928 0 : EditBrowseBox::ArrangeControls(nX, nY);
1929 0 : }
1930 :
1931 : //------------------------------------------------------------------------------
1932 0 : sal_Bool OSelectionBrowseBox::Save()
1933 : {
1934 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1935 0 : sal_Bool bRet = sal_True;
1936 0 : if (IsModified())
1937 0 : bRet = SaveModified();
1938 0 : return bRet;
1939 : }
1940 :
1941 : //------------------------------------------------------------------------------
1942 0 : void OSelectionBrowseBox::CellModified()
1943 : {
1944 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1945 0 : long nRow = GetRealRow(GetCurRow());
1946 0 : switch (nRow)
1947 : {
1948 : case BROW_VIS_ROW:
1949 : {
1950 0 : OTableFieldDescRef pEntry = getEntry(GetColumnPos(GetCurColumnId()) - 1);
1951 :
1952 0 : sal_uInt16 nIdx = m_pOrderCell->GetSelectEntryPos();
1953 0 : if(!m_bOrderByUnRelated && nIdx > 0 &&
1954 : nIdx != sal_uInt16(-1) &&
1955 0 : !pEntry->IsEmpty() &&
1956 0 : pEntry->GetOrderDir() != ORDER_NONE)
1957 : {
1958 0 : m_pVisibleCell->GetBox().Check();
1959 0 : pEntry->SetVisible(sal_True);
1960 : }
1961 : else
1962 0 : pEntry->SetVisible(m_pVisibleCell->GetBox().IsChecked());
1963 : }
1964 0 : break;
1965 : }
1966 0 : static_cast<OQueryController&>(getDesignView()->getController()).setModified( sal_True );
1967 0 : }
1968 :
1969 : //------------------------------------------------------------------------------
1970 0 : void OSelectionBrowseBox::Fill()
1971 : {
1972 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1973 : OSL_ENSURE(ColCount() >= 1, "OSelectionBrowseBox::Fill : please call only after inserting the handle column !");
1974 :
1975 0 : sal_uInt16 nColCount = ColCount() - 1;
1976 0 : if (nColCount < DEFAULT_QUERY_COLS)
1977 0 : AppendNewCol(DEFAULT_QUERY_COLS - nColCount);
1978 0 : }
1979 :
1980 : //------------------------------------------------------------------------------
1981 0 : Size OSelectionBrowseBox::CalcOptimalSize( const Size& _rAvailable )
1982 : {
1983 0 : Size aReturn( _rAvailable.Width(), GetTitleHeight() );
1984 :
1985 0 : aReturn.Height() += ( m_nVisibleCount ? m_nVisibleCount : 15 ) * GetDataRowHeight();
1986 0 : aReturn.Height() += 40; // just some space
1987 :
1988 0 : return aReturn;
1989 : }
1990 :
1991 : //------------------------------------------------------------------------------
1992 0 : void OSelectionBrowseBox::Command(const CommandEvent& rEvt)
1993 : {
1994 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
1995 0 : switch (rEvt.GetCommand())
1996 : {
1997 : case COMMAND_CONTEXTMENU:
1998 : {
1999 0 : Point aMenuPos( rEvt.GetMousePosPixel() );
2000 :
2001 0 : if (!rEvt.IsMouseEvent())
2002 : {
2003 0 : if ( 1 == GetSelectColumnCount() )
2004 : {
2005 : sal_uInt16 nSelId = GetColumnId(
2006 : sal::static_int_cast< sal_uInt16 >(
2007 0 : FirstSelectedColumn() ) );
2008 0 : ::Rectangle aColRect( GetFieldRectPixel( 0, nSelId, sal_False ) );
2009 :
2010 0 : aMenuPos = aColRect.TopCenter();
2011 : }
2012 : else
2013 : {
2014 0 : EditBrowseBox::Command(rEvt);
2015 : return;
2016 : }
2017 : }
2018 :
2019 0 : sal_uInt16 nColId = GetColumnId(GetColumnAtXPosPixel( aMenuPos.X() ));
2020 0 : long nRow = GetRowAtYPosPixel( aMenuPos.Y() );
2021 :
2022 0 : if (nRow < 0 && nColId > HANDLE_ID )
2023 : {
2024 0 : if ( !IsColumnSelected( nColId ) )
2025 : {
2026 0 : adjustSelectionMode( sal_True /* clicked onto a header */ , sal_False /* not onto the handle col */ );
2027 0 : SelectColumnId( nColId );
2028 : }
2029 :
2030 0 : if (!static_cast<OQueryController&>(getDesignView()->getController()).isReadOnly())
2031 : {
2032 0 : PopupMenu aContextMenu( ModuleRes( RID_QUERYCOLPOPUPMENU ) );
2033 0 : switch (aContextMenu.Execute(this, aMenuPos))
2034 : {
2035 : case SID_DELETE:
2036 0 : RemoveField(nColId);
2037 0 : break;
2038 :
2039 : case ID_BROWSER_COLWIDTH:
2040 0 : adjustBrowseBoxColumnWidth( this, nColId );
2041 0 : break;
2042 0 : }
2043 0 : }
2044 : }
2045 0 : else if(nRow >= 0 && nColId <= HANDLE_ID)
2046 : {
2047 0 : if (!static_cast<OQueryController&>(getDesignView()->getController()).isReadOnly())
2048 : {
2049 0 : PopupMenu aContextMenu(ModuleRes(RID_QUERYFUNCTION_POPUPMENU));
2050 0 : aContextMenu.CheckItem( ID_QUERY_FUNCTION, m_bVisibleRow[BROW_FUNCTION_ROW]);
2051 0 : aContextMenu.CheckItem( ID_QUERY_TABLENAME, m_bVisibleRow[BROW_TABLE_ROW]);
2052 0 : aContextMenu.CheckItem( ID_QUERY_ALIASNAME, m_bVisibleRow[BROW_COLUMNALIAS_ROW]);
2053 0 : aContextMenu.CheckItem( ID_QUERY_DISTINCT, static_cast<OQueryController&>(getDesignView()->getController()).isDistinct());
2054 :
2055 0 : switch (aContextMenu.Execute(this, aMenuPos))
2056 : {
2057 : case ID_QUERY_FUNCTION:
2058 0 : SetRowVisible(BROW_FUNCTION_ROW, !IsRowVisible(BROW_FUNCTION_ROW));
2059 0 : static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature( SID_QUERY_VIEW_FUNCTIONS );
2060 0 : break;
2061 : case ID_QUERY_TABLENAME:
2062 0 : SetRowVisible(BROW_TABLE_ROW, !IsRowVisible(BROW_TABLE_ROW));
2063 0 : static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature( SID_QUERY_VIEW_TABLES );
2064 0 : break;
2065 : case ID_QUERY_ALIASNAME:
2066 0 : SetRowVisible(BROW_COLUMNALIAS_ROW, !IsRowVisible(BROW_COLUMNALIAS_ROW));
2067 0 : static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature( SID_QUERY_VIEW_ALIASES );
2068 0 : break;
2069 : case ID_QUERY_DISTINCT:
2070 0 : static_cast<OQueryController&>(getDesignView()->getController()).setDistinct(!static_cast<OQueryController&>(getDesignView()->getController()).isDistinct());
2071 0 : static_cast<OQueryController&>(getDesignView()->getController()).setModified( sal_True );
2072 0 : static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature( SID_QUERY_DISTINCT_VALUES );
2073 0 : break;
2074 : }
2075 :
2076 0 : static_cast<OQueryController&>(getDesignView()->getController()).setModified( sal_True );
2077 0 : }
2078 : }
2079 : else
2080 : {
2081 0 : EditBrowseBox::Command(rEvt);
2082 : return;
2083 : }
2084 : }
2085 : default:
2086 0 : EditBrowseBox::Command(rEvt);
2087 : }
2088 : }
2089 :
2090 : //------------------------------------------------------------------------------
2091 0 : sal_Bool OSelectionBrowseBox::IsRowVisible(sal_uInt16 _nWhich) const
2092 : {
2093 : OSL_ENSURE(_nWhich<(m_bVisibleRow.size()), "OSelectionBrowseBox::IsRowVisible : invalid parameter !");
2094 0 : return m_bVisibleRow[_nWhich];
2095 : }
2096 :
2097 : //------------------------------------------------------------------------------
2098 0 : void OSelectionBrowseBox::SetRowVisible(sal_uInt16 _nWhich, sal_Bool _bVis)
2099 : {
2100 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2101 : OSL_ENSURE(_nWhich<m_bVisibleRow.size(), "OSelectionBrowseBox::SetRowVisible : invalid parameter !");
2102 :
2103 0 : sal_Bool bWasEditing = IsEditing();
2104 0 : if (bWasEditing)
2105 0 : DeactivateCell();
2106 :
2107 : // do this before removing or inserting rows, as this triggers ActivateCell-calls, which rely on m_bVisibleRow
2108 0 : m_bVisibleRow[_nWhich] = !m_bVisibleRow[_nWhich];
2109 :
2110 0 : long nId = GetBrowseRow(_nWhich);
2111 0 : if (_bVis)
2112 : {
2113 0 : RowInserted(nId,1);
2114 0 : ++m_nVisibleCount;
2115 : }
2116 : else
2117 : {
2118 0 : RowRemoved(nId,1);
2119 0 : --m_nVisibleCount;
2120 : }
2121 :
2122 0 : if (bWasEditing)
2123 0 : ActivateCell();
2124 0 : }
2125 :
2126 : //------------------------------------------------------------------------------
2127 0 : long OSelectionBrowseBox::GetBrowseRow(long nRowId) const
2128 : {
2129 0 : sal_uInt16 nCount(0);
2130 0 : for(sal_uInt16 i = 0 ; i < nRowId ; ++i)
2131 : {
2132 0 : if ( m_bVisibleRow[i] )
2133 0 : ++nCount;
2134 : }
2135 0 : return nCount;
2136 : }
2137 : //------------------------------------------------------------------------------
2138 0 : long OSelectionBrowseBox::GetRealRow(long nRowId) const
2139 : {
2140 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2141 0 : long nErg=0,i;
2142 0 : const long nCount = m_bVisibleRow.size();
2143 0 : for(i=0;i < nCount; ++i)
2144 : {
2145 0 : if(m_bVisibleRow[i])
2146 : {
2147 0 : if(nErg++ == nRowId)
2148 0 : break;
2149 : }
2150 : }
2151 : OSL_ENSURE(nErg <= long(m_bVisibleRow.size()),"nErg kann nicht groesser als BROW_ROW_CNT sein!");
2152 0 : return i;
2153 : }
2154 : static long nVisibleRowMask[] =
2155 : {
2156 : 0x0001,
2157 : 0x0002,
2158 : 0x0004,
2159 : 0x0008,
2160 : 0x0010,
2161 : 0x0020,
2162 : 0x0040,
2163 : 0x0080,
2164 : 0x0100,
2165 : 0x0200,
2166 : 0x0400,
2167 : 0x0800
2168 : };
2169 : //------------------------------------------------------------------------------
2170 0 : sal_Int32 OSelectionBrowseBox::GetNoneVisibleRows() const
2171 : {
2172 0 : sal_Int32 nErg(0);
2173 : // only the first 11 row are interesting
2174 0 : sal_Int32 nSize = sizeof(nVisibleRowMask) / sizeof(nVisibleRowMask[0]);
2175 0 : for(sal_Int32 i=0;i<nSize;i++)
2176 : {
2177 0 : if(!m_bVisibleRow[i])
2178 0 : nErg |= nVisibleRowMask[i];
2179 : }
2180 0 : return nErg;
2181 : }
2182 : //------------------------------------------------------------------------------
2183 0 : void OSelectionBrowseBox::SetNoneVisbleRow(long nRows)
2184 : {
2185 : // only the first 11 row are interesting
2186 0 : sal_Int32 nSize = sizeof(nVisibleRowMask) / sizeof(nVisibleRowMask[0]);
2187 0 : for(sal_Int32 i=0;i< nSize;i++)
2188 0 : m_bVisibleRow[i] = !(nRows & nVisibleRowMask[i]);
2189 0 : }
2190 : //------------------------------------------------------------------------------
2191 0 : String OSelectionBrowseBox::GetCellText(long nRow, sal_uInt16 nColId) const
2192 : {
2193 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2194 :
2195 0 : sal_uInt16 nPos = GetColumnPos(nColId);
2196 :
2197 0 : OTableFieldDescRef pEntry = getFields()[nPos-1];
2198 : OSL_ENSURE(pEntry != NULL, "OSelectionBrowseBox::GetCellText : invalid column id, prepare for GPF ... ");
2199 0 : if ( pEntry->IsEmpty() )
2200 0 : return String();
2201 :
2202 0 : String aText;
2203 0 : switch (nRow)
2204 : {
2205 : case BROW_TABLE_ROW:
2206 0 : aText = pEntry->GetAlias();
2207 0 : break;
2208 : case BROW_FIELD_ROW:
2209 : {
2210 0 : String aField = pEntry->GetField();
2211 0 : if (aField.GetChar(0) == '*') // * durch alias.* ersetzen
2212 : {
2213 0 : aField = pEntry->GetAlias();
2214 0 : if(aField.Len())
2215 0 : aField += '.';
2216 0 : aField += '*';
2217 : }
2218 0 : aText = aField;
2219 0 : } break;
2220 : case BROW_ORDER_ROW:
2221 0 : if (pEntry->GetOrderDir() != ORDER_NONE)
2222 0 : aText = String(ModuleRes(STR_QUERY_SORTTEXT) ).GetToken(sal::static_int_cast< sal_uInt16 >(pEntry->GetOrderDir()));
2223 0 : break;
2224 : case BROW_VIS_ROW:
2225 0 : break;
2226 : case BROW_COLUMNALIAS_ROW:
2227 0 : aText = pEntry->GetFieldAlias();
2228 0 : break;
2229 : case BROW_FUNCTION_ROW:
2230 : // we always show the group function at first
2231 0 : if ( pEntry->IsGroupBy() )
2232 0 : aText = m_aFunctionStrings.GetToken(comphelper::string::getTokenCount(m_aFunctionStrings, ';')-1);
2233 0 : else if ( pEntry->isNumericOrAggreateFunction() )
2234 0 : aText = pEntry->GetFunction();
2235 0 : break;
2236 : default:
2237 0 : aText = pEntry->GetCriteria(sal_uInt16(nRow - BROW_CRIT1_ROW));
2238 : }
2239 0 : return aText;
2240 : }
2241 : //------------------------------------------------------------------------------
2242 0 : sal_Bool OSelectionBrowseBox::GetFunctionName(sal_uInt32 _nFunctionTokenId,String& rFkt)
2243 : {
2244 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2245 0 : sal_Bool bErg=sal_True;
2246 0 : String aText;
2247 0 : switch(_nFunctionTokenId)
2248 : {
2249 : case SQL_TOKEN_COUNT:
2250 0 : rFkt = (m_pFunctionCell->GetEntryCount() < 3) ? m_pFunctionCell->GetEntry(1) : m_pFunctionCell->GetEntry(2);
2251 0 : break;
2252 : case SQL_TOKEN_AVG:
2253 0 : rFkt = m_pFunctionCell->GetEntry(1);
2254 0 : break;
2255 : case SQL_TOKEN_MAX:
2256 0 : rFkt = m_pFunctionCell->GetEntry(3);
2257 0 : break;
2258 : case SQL_TOKEN_MIN:
2259 0 : rFkt = m_pFunctionCell->GetEntry(4);
2260 0 : break;
2261 : case SQL_TOKEN_SUM:
2262 0 : rFkt = m_pFunctionCell->GetEntry(5);
2263 0 : break;
2264 : case SQL_TOKEN_EVERY:
2265 0 : rFkt = m_pFunctionCell->GetEntry(6);
2266 0 : break;
2267 : case SQL_TOKEN_ANY:
2268 0 : rFkt = m_pFunctionCell->GetEntry(7);
2269 0 : break;
2270 : case SQL_TOKEN_SOME:
2271 0 : rFkt = m_pFunctionCell->GetEntry(8);
2272 0 : break;
2273 : case SQL_TOKEN_STDDEV_POP:
2274 0 : rFkt = m_pFunctionCell->GetEntry(9);
2275 0 : break;
2276 : case SQL_TOKEN_STDDEV_SAMP:
2277 0 : rFkt = m_pFunctionCell->GetEntry(10);
2278 0 : break;
2279 : case SQL_TOKEN_VAR_SAMP:
2280 0 : rFkt = m_pFunctionCell->GetEntry(11);
2281 0 : break;
2282 : case SQL_TOKEN_VAR_POP:
2283 0 : rFkt = m_pFunctionCell->GetEntry(12);
2284 0 : break;
2285 : case SQL_TOKEN_COLLECT:
2286 0 : rFkt = m_pFunctionCell->GetEntry(13);
2287 0 : break;
2288 : case SQL_TOKEN_FUSION:
2289 0 : rFkt = m_pFunctionCell->GetEntry(14);
2290 0 : break;
2291 : case SQL_TOKEN_INTERSECTION:
2292 0 : rFkt = m_pFunctionCell->GetEntry(15);
2293 0 : break;
2294 : default:
2295 : {
2296 0 : xub_StrLen nCount = comphelper::string::getTokenCount(m_aFunctionStrings, ';');
2297 : xub_StrLen i;
2298 0 : for ( i = 0; i < nCount-1; i++) // Gruppierung wird nicht mit gez"ahlt
2299 : {
2300 0 : if(rFkt.EqualsIgnoreCaseAscii(m_aFunctionStrings.GetToken(i)))
2301 : {
2302 0 : rFkt = m_aFunctionStrings.GetToken(i);
2303 0 : break;
2304 : }
2305 : }
2306 0 : if(i == nCount-1)
2307 0 : bErg = sal_False;
2308 : }
2309 : }
2310 :
2311 0 : return bErg;
2312 : }
2313 : //------------------------------------------------------------------------------
2314 0 : String OSelectionBrowseBox::GetCellContents(sal_Int32 nCellIndex, sal_uInt16 nColId)
2315 : {
2316 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2317 0 : if ( GetCurColumnId() == nColId && !m_bInUndoMode )
2318 0 : SaveModified();
2319 :
2320 0 : sal_uInt16 nPos = GetColumnPos(nColId);
2321 0 : OTableFieldDescRef pEntry = getFields()[nPos - 1];
2322 : OSL_ENSURE(pEntry != NULL, "OSelectionBrowseBox::GetCellContents : invalid column id, prepare for GPF ... ");
2323 :
2324 0 : switch (nCellIndex)
2325 : {
2326 : case BROW_VIS_ROW :
2327 0 : return pEntry->IsVisible() ? g_strOne : g_strZero;
2328 : case BROW_ORDER_ROW:
2329 : {
2330 0 : sal_uInt16 nIdx = m_pOrderCell->GetSelectEntryPos();
2331 0 : if (nIdx == sal_uInt16(-1))
2332 0 : nIdx = 0;
2333 0 : return rtl::OUString(nIdx);
2334 : }
2335 : default:
2336 0 : return GetCellText(nCellIndex, nColId);
2337 0 : }
2338 : }
2339 :
2340 : //------------------------------------------------------------------------------
2341 0 : void OSelectionBrowseBox::SetCellContents(sal_Int32 nRow, sal_uInt16 nColId, const String& strNewText)
2342 : {
2343 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2344 0 : sal_Bool bWasEditing = IsEditing() && (GetCurColumnId() == nColId) && IsRowVisible(static_cast<sal_uInt16>(nRow)) && (GetCurRow() == static_cast<sal_uInt16>(GetBrowseRow(nRow)));
2345 0 : if (bWasEditing)
2346 0 : DeactivateCell();
2347 :
2348 0 : sal_uInt16 nPos = GetColumnPos(nColId);
2349 0 : OTableFieldDescRef pEntry = getEntry(nPos - 1);
2350 : OSL_ENSURE(pEntry != NULL, "OSelectionBrowseBox::SetCellContents : invalid column id, prepare for GPF ... ");
2351 :
2352 :
2353 0 : switch (nRow)
2354 : {
2355 : case BROW_VIS_ROW:
2356 0 : pEntry->SetVisible(strNewText.Equals(g_strOne));
2357 0 : break;
2358 : case BROW_FIELD_ROW:
2359 0 : pEntry->SetField(strNewText);
2360 0 : break;
2361 : case BROW_TABLE_ROW:
2362 0 : pEntry->SetAlias(strNewText);
2363 0 : break;
2364 : case BROW_ORDER_ROW:
2365 : {
2366 0 : sal_uInt16 nIdx = (sal_uInt16)strNewText.ToInt32();
2367 0 : pEntry->SetOrderDir(EOrderDir(nIdx));
2368 0 : } break;
2369 : case BROW_COLUMNALIAS_ROW:
2370 0 : pEntry->SetFieldAlias(strNewText);
2371 0 : break;
2372 : case BROW_FUNCTION_ROW:
2373 : {
2374 0 : String sOldFunctionName = pEntry->GetFunction();
2375 0 : String sGroupFunctionName = m_aFunctionStrings.GetToken(comphelper::string::getTokenCount(m_aFunctionStrings, ';')-1);
2376 0 : pEntry->SetFunction(strNewText);
2377 : // first reset this two member
2378 0 : sal_Int32 nFunctionType = pEntry->GetFunctionType();
2379 0 : nFunctionType &= ~FKT_AGGREGATE;
2380 0 : pEntry->SetFunctionType(nFunctionType);
2381 0 : if ( pEntry->IsGroupBy() && !sGroupFunctionName.EqualsIgnoreCaseAscii(strNewText) )
2382 0 : pEntry->SetGroupBy(sal_False);
2383 :
2384 :
2385 0 : if ( sGroupFunctionName.EqualsIgnoreCaseAscii(strNewText) )
2386 0 : pEntry->SetGroupBy(sal_True);
2387 0 : else if ( strNewText.Len() )
2388 : {
2389 0 : nFunctionType |= FKT_AGGREGATE;
2390 0 : pEntry->SetFunctionType(nFunctionType);
2391 0 : }
2392 0 : } break;
2393 : default:
2394 0 : pEntry->SetCriteria(sal_uInt16(nRow - BROW_CRIT1_ROW), strNewText);
2395 : }
2396 :
2397 0 : long nCellIndex = GetRealRow(nRow);
2398 0 : if(IsRowVisible(static_cast<sal_uInt16>(nRow)))
2399 0 : RowModified(nCellIndex, nColId);
2400 :
2401 : // die entsprechende Feld-Beschreibung ist jetzt leer -> Visible auf sal_False (damit das konsistent mit normalen leeren Spalten ist)
2402 0 : if (pEntry->IsEmpty())
2403 0 : pEntry->SetVisible(sal_False);
2404 :
2405 0 : if (bWasEditing)
2406 0 : ActivateCell(nCellIndex, nColId);
2407 :
2408 0 : static_cast<OQueryController&>(getDesignView()->getController()).setModified( sal_True );
2409 0 : }
2410 : //------------------------------------------------------------------------------
2411 0 : sal_uInt32 OSelectionBrowseBox::GetTotalCellWidth(long nRow, sal_uInt16 nColId) const
2412 : {
2413 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2414 :
2415 0 : long nRowId = GetRealRow(nRow);
2416 0 : if (nRowId == BROW_VIS_ROW)
2417 0 : return CHECKBOX_SIZE;
2418 : else
2419 0 : return GetDataWindow().GetTextWidth(GetCellText(nRowId, nColId));
2420 : }
2421 :
2422 : //------------------------------------------------------------------------------
2423 0 : void OSelectionBrowseBox::ColumnResized(sal_uInt16 nColId)
2424 : {
2425 0 : if (static_cast<OQueryController&>(getDesignView()->getController()).isReadOnly())
2426 0 : return;
2427 : // The resizing of columns can't be suppressed (BrowseBox doesn't support that) so we have to do this
2428 : // fake. It's not _that_ bad : the user may change column widths while in read-only mode to see all details
2429 : // but the changes aren't permanent ...
2430 :
2431 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2432 0 : sal_uInt16 nPos = GetColumnPos(nColId);
2433 : OSL_ENSURE(nPos <= getFields().size(),"ColumnResized:: nColId sollte nicht groesser als List::count sein!");
2434 0 : OTableFieldDescRef pEntry = getEntry(nPos-1);
2435 : OSL_ENSURE(pEntry.is(), "OSelectionBrowseBox::ColumnResized : keine FieldDescription !");
2436 0 : static_cast<OQueryController&>(getDesignView()->getController()).setModified( sal_True );
2437 0 : EditBrowseBox::ColumnResized(nColId);
2438 :
2439 0 : if ( pEntry.is())
2440 : {
2441 0 : if ( !m_bInUndoMode )
2442 : {
2443 : // create the undo action
2444 0 : OTabFieldSizedUndoAct* pUndo = new OTabFieldSizedUndoAct(this);
2445 0 : pUndo->SetColumnPosition( nPos );
2446 0 : pUndo->SetOriginalWidth(pEntry->GetColWidth());
2447 0 : getDesignView()->getController().addUndoActionAndInvalidate(pUndo);
2448 : }
2449 0 : pEntry->SetColWidth(sal_uInt16(GetColumnWidth(nColId)));
2450 0 : }
2451 : }
2452 :
2453 : //------------------------------------------------------------------------------
2454 0 : sal_uInt32 OSelectionBrowseBox::GetTotalCellWidth(long nRowId, sal_uInt16 nColId)
2455 : {
2456 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2457 0 : sal_uInt16 nPos = GetColumnPos(nColId);
2458 : OSL_ENSURE((nPos == 0) || (nPos <= getFields().size()), "OSelectionBrowseBox::GetTotalCellWidth : invalid parameter nColId");
2459 :
2460 0 : OTableFieldDescRef pEntry = getFields()[nPos-1];
2461 : OSL_ENSURE(pEntry.is(), "OSelectionBrowseBox::GetTotalCellWidth : invalid FieldDescription !");
2462 :
2463 0 : long nRow = GetRealRow(nRowId);
2464 0 : String strText(GetCellText(nRow, nColId));
2465 0 : return GetDataWindow().LogicToPixel(Size(GetDataWindow().GetTextWidth(strText),0)).Width();
2466 : }
2467 :
2468 : //------------------------------------------------------------------------------
2469 0 : sal_uInt16 OSelectionBrowseBox::GetDefaultColumnWidth(const String& /*rName*/) const
2470 : {
2471 : DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2472 : // die Baissklasse macht das von dem Text abhaengig, ich habe aber keine Spaltenueberschriften, daher haette ich
2473 : // hier gern einen anderen Default-Wert
2474 0 : return static_cast<sal_uInt16>(DEFAULT_SIZE);
2475 : }
2476 : //------------------------------------------------------------------------------
2477 0 : sal_Bool OSelectionBrowseBox::isCutAllowed()
2478 : {
2479 0 : sal_Bool bCutAllowed = sal_False;
2480 0 : long nRow = GetRealRow(GetCurRow());
2481 0 : switch (nRow)
2482 : {
2483 : case BROW_VIS_ROW:
2484 : case BROW_ORDER_ROW:
2485 : case BROW_TABLE_ROW:
2486 : case BROW_FUNCTION_ROW:
2487 0 : break;
2488 : case BROW_FIELD_ROW:
2489 0 : bCutAllowed = m_pFieldCell->GetSelected().Len() != 0;
2490 0 : break;
2491 : default:
2492 0 : bCutAllowed = m_pTextCell->GetSelected().Len() != 0;
2493 0 : break;
2494 : }
2495 0 : return bCutAllowed;
2496 : }
2497 : // -----------------------------------------------------------------------------
2498 0 : void OSelectionBrowseBox::cut()
2499 : {
2500 0 : String sOldValue = GetCellContents(GetRealRow(GetCurRow()),GetCurColumnId());
2501 0 : long nRow = GetRealRow(GetCurRow());
2502 0 : switch (nRow)
2503 : {
2504 : case BROW_FIELD_ROW:
2505 0 : m_pFieldCell->Cut();
2506 0 : m_pFieldCell->SetModifyFlag();
2507 0 : break;
2508 : default:
2509 0 : m_pTextCell->Cut();
2510 0 : m_pTextCell->SetModifyFlag();
2511 : }
2512 0 : SaveModified();
2513 0 : RowModified(GetBrowseRow(nRow), GetCurColumnId());
2514 :
2515 0 : invalidateUndoRedo();
2516 0 : }
2517 : // -----------------------------------------------------------------------------
2518 0 : void OSelectionBrowseBox::paste()
2519 : {
2520 0 : long nRow = GetRealRow(GetCurRow());
2521 0 : switch (nRow)
2522 : {
2523 : case BROW_FIELD_ROW:
2524 0 : m_pFieldCell->Paste();
2525 0 : m_pFieldCell->SetModifyFlag();
2526 0 : break;
2527 : default:
2528 0 : m_pTextCell->Paste();
2529 0 : m_pTextCell->SetModifyFlag();
2530 : }
2531 0 : RowModified(GetBrowseRow(nRow), GetCurColumnId());
2532 0 : invalidateUndoRedo();
2533 0 : }
2534 : // -----------------------------------------------------------------------------
2535 0 : sal_Bool OSelectionBrowseBox::isPasteAllowed()
2536 : {
2537 0 : sal_Bool bPasteAllowed = sal_True;
2538 0 : long nRow = GetRealRow(GetCurRow());
2539 0 : switch (nRow)
2540 : {
2541 : case BROW_VIS_ROW:
2542 : case BROW_ORDER_ROW:
2543 : case BROW_TABLE_ROW:
2544 : case BROW_FUNCTION_ROW:
2545 0 : bPasteAllowed = sal_False;
2546 0 : break;
2547 : }
2548 0 : return bPasteAllowed;
2549 : }
2550 : // -----------------------------------------------------------------------------
2551 0 : sal_Bool OSelectionBrowseBox::isCopyAllowed()
2552 : {
2553 0 : return isCutAllowed();
2554 : }
2555 : // -----------------------------------------------------------------------------
2556 0 : void OSelectionBrowseBox::copy()
2557 : {
2558 0 : long nRow = GetRealRow(GetCurRow());
2559 0 : switch (nRow)
2560 : {
2561 : case BROW_FIELD_ROW:
2562 0 : m_pFieldCell->Copy();
2563 0 : break;
2564 : default:
2565 0 : m_pTextCell->Copy();
2566 : }
2567 0 : }
2568 : // -----------------------------------------------------------------------------
2569 0 : void OSelectionBrowseBox::appendUndoAction(const String& _rOldValue,const String& _rNewValue,sal_Int32 _nRow,sal_Bool& _bListAction)
2570 : {
2571 0 : if ( !m_bInUndoMode && !_rNewValue.Equals(_rOldValue) )
2572 : {
2573 0 : if ( !_bListAction )
2574 : {
2575 0 : _bListAction = sal_True;
2576 0 : static_cast<OQueryController&>(getDesignView()->getController()).GetUndoManager().EnterListAction(String(),String());
2577 : }
2578 0 : appendUndoAction(_rOldValue,_rNewValue,_nRow);
2579 : }
2580 0 : }
2581 : // -----------------------------------------------------------------------------
2582 0 : void OSelectionBrowseBox::appendUndoAction(const String& _rOldValue,const String& _rNewValue,sal_Int32 _nRow)
2583 : {
2584 0 : if ( !m_bInUndoMode && !_rNewValue.Equals(_rOldValue) )
2585 : {
2586 0 : OTabFieldCellModifiedUndoAct* pUndoAct = new OTabFieldCellModifiedUndoAct(this);
2587 0 : pUndoAct->SetCellIndex(_nRow);
2588 : OSL_ENSURE(GetColumnPos(GetCurColumnId()) != BROWSER_INVALIDID,"Current position isn't valid!");
2589 0 : pUndoAct->SetColumnPosition( GetColumnPos(GetCurColumnId()) );
2590 0 : pUndoAct->SetCellContents(_rOldValue);
2591 0 : getDesignView()->getController().addUndoActionAndInvalidate(pUndoAct);
2592 : }
2593 0 : }
2594 : // -----------------------------------------------------------------------------
2595 0 : IMPL_LINK_NOARG(OSelectionBrowseBox, OnInvalidateTimer)
2596 : {
2597 0 : static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature(SID_CUT);
2598 0 : static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature(SID_COPY);
2599 0 : static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature(SID_PASTE);
2600 0 : if(!m_bStopTimer)
2601 0 : m_timerInvalidate.Start();
2602 0 : return 0L;
2603 : }
2604 : // -----------------------------------------------------------------------------
2605 0 : void OSelectionBrowseBox::stopTimer()
2606 : {
2607 0 : m_bStopTimer = sal_True;
2608 0 : if (m_timerInvalidate.IsActive())
2609 0 : m_timerInvalidate.Stop();
2610 0 : }
2611 : // -----------------------------------------------------------------------------
2612 0 : void OSelectionBrowseBox::startTimer()
2613 : {
2614 0 : m_bStopTimer = sal_False;
2615 0 : if (!m_timerInvalidate.IsActive())
2616 0 : m_timerInvalidate.Start();
2617 0 : }
2618 : // -----------------------------------------------------------------------------
2619 0 : OTableFields& OSelectionBrowseBox::getFields() const
2620 : {
2621 0 : OQueryController& rController = static_cast<OQueryController&>(getDesignView()->getController());
2622 0 : return rController.getTableFieldDesc();
2623 : }
2624 : // -----------------------------------------------------------------------------
2625 0 : void OSelectionBrowseBox::enableControl(const OTableFieldDescRef& _rEntry,Window* _pControl)
2626 : {
2627 0 : sal_Bool bEnable = !_rEntry->isCondition();
2628 0 : _pControl->Enable(bEnable);
2629 0 : _pControl->EnableInput(bEnable);
2630 0 : }
2631 : // -----------------------------------------------------------------------------
2632 0 : void OSelectionBrowseBox::setTextCellContext(const OTableFieldDescRef& _rEntry,const String& _sText,const rtl::OString& _sHelpId)
2633 : {
2634 0 : m_pTextCell->SetText(_sText);
2635 0 : m_pTextCell->ClearModifyFlag();
2636 0 : if (!m_pTextCell->HasFocus())
2637 0 : m_pTextCell->GrabFocus();
2638 :
2639 0 : enableControl(_rEntry,m_pTextCell);
2640 :
2641 0 : if (m_pTextCell->GetHelpId() != _sHelpId)
2642 : // da TextCell in verschiedenen Kontexten verwendet wird, muss ich den gecachten HelpText loeschen
2643 0 : m_pTextCell->SetHelpText(String());
2644 0 : m_pTextCell->SetHelpId(_sHelpId);
2645 0 : }
2646 : // -----------------------------------------------------------------------------
2647 0 : void OSelectionBrowseBox::invalidateUndoRedo()
2648 : {
2649 0 : OQueryController& rController = static_cast<OQueryController&>(getDesignView()->getController());
2650 0 : rController.InvalidateFeature( ID_BROWSER_UNDO );
2651 0 : rController.InvalidateFeature( ID_BROWSER_REDO );
2652 0 : rController.InvalidateFeature( ID_BROWSER_QUERY_EXECUTE );
2653 0 : }
2654 : // -----------------------------------------------------------------------------
2655 0 : OTableFieldDescRef OSelectionBrowseBox::getEntry(OTableFields::size_type _nPos)
2656 : {
2657 : // we have to check if we need a new entry at this position
2658 0 : OTableFields& aFields = getFields();
2659 : OSL_ENSURE(aFields.size() > _nPos,"ColID is to great!");
2660 :
2661 0 : OTableFieldDescRef pEntry = aFields[_nPos];
2662 : OSL_ENSURE(pEntry.is(),"Invalid entry!");
2663 0 : if ( !pEntry.is() )
2664 : {
2665 0 : pEntry = new OTableFieldDesc();
2666 : pEntry->SetColumnId(
2667 0 : GetColumnId(sal::static_int_cast< sal_uInt16 >(_nPos+1)));
2668 0 : aFields[_nPos] = pEntry;
2669 : }
2670 0 : return pEntry;
2671 : }
2672 : // -----------------------------------------------------------------------------
2673 0 : void OSelectionBrowseBox::GetFocus()
2674 : {
2675 0 : if(!IsEditing() && !m_bWasEditing)
2676 0 : ActivateCell();
2677 0 : EditBrowseBox::GetFocus();
2678 0 : }
2679 : // -----------------------------------------------------------------------------
2680 0 : void OSelectionBrowseBox::DeactivateCell(sal_Bool _bUpdate)
2681 : {
2682 0 : m_bWasEditing = sal_True;
2683 0 : EditBrowseBox::DeactivateCell(_bUpdate);
2684 0 : m_bWasEditing = sal_False;
2685 0 : }
2686 : // -----------------------------------------------------------------------------
2687 0 : ::rtl::OUString OSelectionBrowseBox::GetRowDescription( sal_Int32 _nRow ) const
2688 : {
2689 0 : String aLabel(ModuleRes(STR_QUERY_HANDLETEXT));
2690 :
2691 : // ab BROW_CRIT2_ROW werden alle Zeilen mit "oder" angegeben
2692 0 : xub_StrLen nToken = (xub_StrLen) (_nRow >= GetBrowseRow(BROW_CRIT2_ROW))
2693 : ?
2694 0 : xub_StrLen(BROW_CRIT2_ROW) : xub_StrLen(GetRealRow(_nRow));
2695 0 : return ::rtl::OUString(aLabel.GetToken(nToken));
2696 : }
2697 : // -----------------------------------------------------------------------------
2698 0 : ::rtl::OUString OSelectionBrowseBox::GetAccessibleObjectName( ::svt::AccessibleBrowseBoxObjType _eObjType,sal_Int32 _nPosition) const
2699 : {
2700 0 : ::rtl::OUString sRetText;
2701 0 : switch( _eObjType )
2702 : {
2703 : case ::svt::BBTYPE_ROWHEADERCELL:
2704 0 : sRetText = GetRowDescription(_nPosition);
2705 0 : break;
2706 : default:
2707 0 : sRetText = EditBrowseBox::GetAccessibleObjectDescription(_eObjType,_nPosition);
2708 : }
2709 0 : return sRetText;
2710 : }
2711 : // -----------------------------------------------------------------------------
2712 0 : sal_Bool OSelectionBrowseBox::fillEntryTable(OTableFieldDescRef& _pEntry,const ::rtl::OUString& _sTableName)
2713 : {
2714 0 : sal_Bool bRet = sal_False;
2715 0 : OJoinTableView::OTableWindowMap* pTabWinList = getDesignView()->getTableView()->GetTabWinMap();
2716 0 : if (pTabWinList)
2717 : {
2718 0 : OJoinTableView::OTableWindowMapIterator aIter = pTabWinList->find(_sTableName);
2719 0 : if(aIter != pTabWinList->end())
2720 : {
2721 0 : OQueryTableWindow* pEntryTab = static_cast<OQueryTableWindow*>(aIter->second);
2722 0 : if (pEntryTab)
2723 : {
2724 0 : _pEntry->SetTable(pEntryTab->GetTableName());
2725 0 : _pEntry->SetTabWindow(pEntryTab);
2726 0 : bRet = sal_True;
2727 : }
2728 : }
2729 : }
2730 0 : return bRet;
2731 : }
2732 : // -----------------------------------------------------------------------------
2733 0 : void OSelectionBrowseBox::setFunctionCell(OTableFieldDescRef& _pEntry)
2734 : {
2735 0 : Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection();
2736 0 : if ( xConnection.is() )
2737 : {
2738 : // Aggregate functions in general only available with Core SQL
2739 0 : if ( lcl_SupportsCoreSQLGrammar(xConnection) )
2740 : {
2741 : // if we have an asterix, no other function than count is allowed
2742 0 : m_pFunctionCell->Clear();
2743 0 : m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(0));
2744 0 : if ( isFieldNameAsterix(_pEntry->GetField()) )
2745 0 : m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(2)); // 2 -> COUNT
2746 : else
2747 : {
2748 0 : xub_StrLen nCount = comphelper::string::getTokenCount(m_aFunctionStrings, ';');
2749 0 : if ( _pEntry->isNumeric() )
2750 0 : --nCount;
2751 0 : for (xub_StrLen nIdx = 1; nIdx < nCount; nIdx++)
2752 0 : m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(nIdx));
2753 : }
2754 :
2755 0 : if ( _pEntry->IsGroupBy() )
2756 : {
2757 : OSL_ENSURE(!_pEntry->isNumeric(),"Not allowed to combine group by and numeric values!");
2758 0 : m_pFunctionCell->SelectEntry(m_pFunctionCell->GetEntry(m_pFunctionCell->GetEntryCount() - 1));
2759 : }
2760 0 : else if ( m_pFunctionCell->GetEntryPos(String(_pEntry->GetFunction())) != COMBOBOX_ENTRY_NOTFOUND )
2761 0 : m_pFunctionCell->SelectEntry(String(_pEntry->GetFunction()));
2762 : else
2763 0 : m_pFunctionCell->SelectEntryPos(0);
2764 :
2765 0 : enableControl(_pEntry,m_pFunctionCell);
2766 : }
2767 : else
2768 : {
2769 : // only COUNT(*) and COUNT("table".*) allowed
2770 0 : sal_Bool bCountRemoved = !isFieldNameAsterix(_pEntry->GetField());
2771 0 : if ( bCountRemoved )
2772 0 : m_pFunctionCell->RemoveEntry(1);
2773 :
2774 0 : if ( !bCountRemoved && m_pFunctionCell->GetEntryCount() < 2)
2775 0 : m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(2)); // 2 -> COUNT
2776 :
2777 0 : if(m_pFunctionCell->GetEntryPos(String(_pEntry->GetFunction())) != COMBOBOX_ENTRY_NOTFOUND)
2778 0 : m_pFunctionCell->SelectEntry(_pEntry->GetFunction());
2779 : else
2780 0 : m_pFunctionCell->SelectEntryPos(0);
2781 : }
2782 0 : }
2783 0 : }
2784 : // -----------------------------------------------------------------------------
2785 0 : Reference< XAccessible > OSelectionBrowseBox::CreateAccessibleCell( sal_Int32 _nRow, sal_uInt16 _nColumnPos )
2786 : {
2787 0 : OTableFieldDescRef pEntry = NULL;
2788 0 : if(getFields().size() > sal_uInt16(_nColumnPos - 1))
2789 0 : pEntry = getFields()[_nColumnPos - 1];
2790 :
2791 0 : if ( _nRow == BROW_VIS_ROW && pEntry.is() )
2792 0 : return EditBrowseBox::CreateAccessibleCheckBoxCell( _nRow, _nColumnPos,pEntry->IsVisible() ? STATE_CHECK : STATE_NOCHECK );
2793 :
2794 0 : return EditBrowseBox::CreateAccessibleCell( _nRow, _nColumnPos );
2795 : }
2796 : // -----------------------------------------------------------------------------
2797 0 : bool OSelectionBrowseBox::HasFieldByAliasName(const ::rtl::OUString& rFieldName, OTableFieldDescRef& rInfo) const
2798 : {
2799 0 : OTableFields& aFields = getFields();
2800 0 : OTableFields::iterator aIter = aFields.begin();
2801 0 : OTableFields::iterator aEnd = aFields.end();
2802 :
2803 0 : for(;aIter != aEnd;++aIter)
2804 : {
2805 0 : if ( (*aIter)->GetFieldAlias() == rFieldName )
2806 : {
2807 0 : *rInfo = *(*aIter);
2808 0 : break;
2809 : }
2810 : }
2811 0 : return aIter != aEnd;
2812 : }
2813 : // -----------------------------------------------------------------------------
2814 :
2815 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|