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 "queryfilter.hxx"
21 : #include "moduledbu.hxx"
22 : #include <com/sun/star/sdbc/DataType.hpp>
23 : #include <com/sun/star/util/Date.hpp>
24 : #include <com/sun/star/util/DateTime.hpp>
25 : #include <com/sun/star/util/Time.hpp>
26 : #include <com/sun/star/sdb/XSQLQueryComposer.hpp>
27 : #include <com/sun/star/sdbc/ColumnSearch.hpp>
28 : #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
29 : #include <com/sun/star/sdb/SQLFilterOperator.hpp>
30 : #include <com/sun/star/sdbc/XRow.hpp>
31 : #include <com/sun/star/sdbc/XResultSet.hpp>
32 : #include <com/sun/star/container/XNameAccess.hpp>
33 : #include <comphelper/string.hxx>
34 : #include <tools/diagnose_ex.h>
35 : #include <osl/diagnose.h>
36 : #include <connectivity/sqliterator.hxx>
37 : #include <connectivity/dbtools.hxx>
38 : #include "queryfilter.hrc"
39 : #include "dbustrings.hrc"
40 : #include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp>
41 :
42 : using namespace dbaui;
43 : using namespace connectivity;
44 : using namespace ::com::sun::star::uno;
45 : using namespace ::com::sun::star::lang;
46 : using namespace ::com::sun::star::container;
47 : using namespace ::com::sun::star::util;
48 : using namespace ::com::sun::star::sdb;
49 : using namespace ::com::sun::star::sdbc;
50 : using namespace ::com::sun::star::sdbcx;
51 : using namespace ::com::sun::star::beans;
52 :
53 0 : void Replace_OS_PlaceHolder(String& aString)
54 : {
55 0 : while (aString.SearchAndReplace( '*', '%' ) != STRING_NOTFOUND) ;
56 0 : while (aString.SearchAndReplace( '?', '_' ) != STRING_NOTFOUND) ;
57 0 : }
58 :
59 0 : void Replace_SQL_PlaceHolder(String& aString)
60 : {
61 0 : while (aString.SearchAndReplace( '%', '*' ) != STRING_NOTFOUND) ;
62 0 : while (aString.SearchAndReplace( '_', '?' ) != STRING_NOTFOUND) ;
63 0 : }
64 :
65 : DBG_NAME(DlgFilterCrit);
66 :
67 0 : DlgFilterCrit::DlgFilterCrit(Window * pParent,
68 : const Reference< XComponentContext >& rxContext,
69 : const Reference< XConnection>& _rxConnection,
70 : const Reference< XSingleSelectQueryComposer >& _rxComposer,
71 : const Reference< XNameAccess>& _rxCols
72 : )
73 : :ModalDialog( pParent, ModuleRes( DLG_FILTERCRIT ) )
74 : ,aLB_WHEREFIELD1 ( this, ModuleRes( LB_WHEREFIELD1 ) )
75 : ,aLB_WHERECOMP1 ( this, ModuleRes( LB_WHERECOMP1 ) )
76 : ,aET_WHEREVALUE1 ( this, ModuleRes( ET_WHEREVALUE1 ) )
77 : ,aLB_WHERECOND2 ( this, ModuleRes( LB_WHERECOND2 ) )
78 : ,aLB_WHEREFIELD2 ( this, ModuleRes( LB_WHEREFIELD2 ) )
79 : ,aLB_WHERECOMP2 ( this, ModuleRes( LB_WHERECOMP2 ) )
80 : ,aET_WHEREVALUE2 ( this, ModuleRes( ET_WHEREVALUE2 ) )
81 : ,aLB_WHERECOND3 ( this, ModuleRes( LB_WHERECOND3 ) )
82 : ,aLB_WHEREFIELD3 ( this, ModuleRes( LB_WHEREFIELD3 ) )
83 : ,aLB_WHERECOMP3 ( this, ModuleRes( LB_WHERECOMP3 ) )
84 : ,aET_WHEREVALUE3 ( this, ModuleRes( ET_WHEREVALUE3 ) )
85 : ,aFT_WHEREFIELD ( this, ModuleRes( FT_WHEREFIELD ) )
86 : ,aFT_WHERECOMP ( this, ModuleRes( FT_WHERECOMP ) )
87 : ,aFT_WHEREVALUE ( this, ModuleRes( FT_WHEREVALUE ) )
88 : ,aFT_WHEREOPER ( this, ModuleRes( FT_WHEREOPER ) )
89 : ,aFL_FIELDS ( this, ModuleRes( FL_FIELDS ) )
90 : ,aBT_OK ( this, ModuleRes( BT_OK ) )
91 : ,aBT_CANCEL ( this, ModuleRes( BT_CANCEL ) )
92 : ,aBT_HELP ( this, ModuleRes( BT_HELP ) )
93 : ,aSTR_NOENTRY ( ModuleRes( STR_NOENTRY ) )
94 : ,aSTR_COMPARE_OPERATORS( ModuleRes( STR_COMPARE_OPERATORS ) )
95 : ,m_xQueryComposer(_rxComposer)
96 : ,m_xColumns( _rxCols )
97 : ,m_xConnection( _rxConnection )
98 0 : ,m_xMetaData( _rxConnection->getMetaData() )
99 0 : ,m_aPredicateInput( rxContext, _rxConnection, getParseContext() )
100 : {
101 : DBG_CTOR(DlgFilterCrit,NULL);
102 : // Write the String for noEntry into the ListBoxes of the field names
103 0 : aLB_WHEREFIELD1.InsertEntry( aSTR_NOENTRY );
104 0 : aLB_WHEREFIELD2.InsertEntry( aSTR_NOENTRY );
105 0 : aLB_WHEREFIELD3.InsertEntry( aSTR_NOENTRY );
106 :
107 : try
108 : {
109 : // ... also write it into the remaining fields
110 0 : Sequence< OUString> aNames = m_xColumns->getElementNames();
111 0 : const OUString* pIter = aNames.getConstArray();
112 0 : const OUString* pEnd = pIter + aNames.getLength();
113 0 : Reference<XPropertySet> xColumn;
114 0 : for(;pIter != pEnd;++pIter)
115 : {
116 : try
117 : {
118 0 : xColumn.set( m_xColumns->getByName( *pIter ), UNO_QUERY_THROW );
119 :
120 0 : sal_Int32 nDataType( 0 );
121 0 : OSL_VERIFY( xColumn->getPropertyValue( PROPERTY_TYPE ) >>= nDataType );
122 0 : sal_Int32 eColumnSearch = ::dbtools::getSearchColumnFlag( m_xConnection, nDataType );
123 0 : if ( eColumnSearch == ColumnSearch::NONE )
124 0 : continue;
125 :
126 0 : sal_Bool bIsSearchable( sal_True );
127 0 : OSL_VERIFY( xColumn->getPropertyValue( PROPERTY_ISSEARCHABLE ) >>= bIsSearchable );
128 0 : if ( !bIsSearchable )
129 0 : continue;
130 : }
131 0 : catch( const Exception& )
132 : {
133 : DBG_UNHANDLED_EXCEPTION();
134 : }
135 0 : aLB_WHEREFIELD1.InsertEntry( *pIter );
136 0 : aLB_WHEREFIELD2.InsertEntry( *pIter );
137 0 : aLB_WHEREFIELD3.InsertEntry( *pIter );
138 : }
139 :
140 0 : Reference<XNameAccess> xSelectColumns = Reference<XColumnsSupplier>(m_xQueryComposer,UNO_QUERY)->getColumns();
141 0 : aNames = xSelectColumns->getElementNames();
142 0 : pIter = aNames.getConstArray();
143 0 : pEnd = pIter + aNames.getLength();
144 0 : for(;pIter != pEnd;++pIter)
145 : {
146 : // don't insert a column name twice
147 0 : if ( !m_xColumns->hasByName(*pIter) )
148 : {
149 0 : xColumn.set(xSelectColumns->getByName(*pIter),UNO_QUERY);
150 : OSL_ENSURE(xColumn.is(),"DlgFilterCrit::DlgFilterCrit: Column is null!");
151 0 : sal_Int32 nDataType(0);
152 0 : xColumn->getPropertyValue(PROPERTY_TYPE) >>= nDataType;
153 0 : sal_Int32 eColumnSearch = dbtools::getSearchColumnFlag(m_xConnection,nDataType);
154 : // TODO
155 : // !pColumn->IsFunction()
156 0 : if(eColumnSearch != ColumnSearch::NONE)
157 : {
158 0 : aLB_WHEREFIELD1.InsertEntry( *pIter );
159 0 : aLB_WHEREFIELD2.InsertEntry( *pIter );
160 0 : aLB_WHEREFIELD3.InsertEntry( *pIter );
161 : }
162 : }
163 : }
164 : // initialize the listboxes with noEntry
165 0 : aLB_WHEREFIELD1.SelectEntryPos(0);
166 0 : aLB_WHEREFIELD2.SelectEntryPos(0);
167 0 : aLB_WHEREFIELD3.SelectEntryPos(0);
168 :
169 : // insert the criteria into the dialog
170 0 : Sequence<Sequence<PropertyValue > > aValues = m_xQueryComposer->getStructuredFilter();
171 0 : fillLines(aValues);
172 0 : aValues = m_xQueryComposer->getStructuredHavingClause();
173 0 : fillLines(aValues);
174 :
175 : }
176 0 : catch(const Exception&)
177 : {
178 0 : FreeResource();
179 0 : throw;
180 : }
181 :
182 0 : EnableLines();
183 :
184 0 : aLB_WHEREFIELD1.SetSelectHdl(LINK(this,DlgFilterCrit,ListSelectHdl));
185 0 : aLB_WHEREFIELD2.SetSelectHdl(LINK(this,DlgFilterCrit,ListSelectHdl));
186 0 : aLB_WHEREFIELD3.SetSelectHdl(LINK(this,DlgFilterCrit,ListSelectHdl));
187 :
188 0 : aLB_WHERECOMP1.SetSelectHdl(LINK(this,DlgFilterCrit,ListSelectCompHdl));
189 0 : aLB_WHERECOMP2.SetSelectHdl(LINK(this,DlgFilterCrit,ListSelectCompHdl));
190 0 : aLB_WHERECOMP3.SetSelectHdl(LINK(this,DlgFilterCrit,ListSelectCompHdl));
191 :
192 0 : aET_WHEREVALUE1.SetLoseFocusHdl( LINK( this, DlgFilterCrit, PredicateLoseFocus ) );
193 0 : aET_WHEREVALUE2.SetLoseFocusHdl( LINK( this, DlgFilterCrit, PredicateLoseFocus ) );
194 0 : aET_WHEREVALUE3.SetLoseFocusHdl( LINK( this, DlgFilterCrit, PredicateLoseFocus ) );
195 :
196 0 : if ( aET_WHEREVALUE1.IsEnabled() )
197 0 : aET_WHEREVALUE1.GrabFocus();
198 :
199 0 : FreeResource();
200 0 : }
201 :
202 0 : DlgFilterCrit::~DlgFilterCrit()
203 : {
204 : DBG_DTOR(DlgFilterCrit,NULL);
205 0 : }
206 :
207 : #define LbText(x) ((x).GetSelectEntry())
208 : #define LbPos(x) ((x).GetSelectEntryPos())
209 :
210 0 : sal_Int32 DlgFilterCrit::GetOSQLPredicateType( const String& _rSelectedPredicate ) const
211 : {
212 0 : sal_Int32 nPredicateIndex = -1;
213 0 : for ( xub_StrLen i=0; i < comphelper::string::getTokenCount(aSTR_COMPARE_OPERATORS, ';'); ++i)
214 0 : if ( aSTR_COMPARE_OPERATORS.GetToken(i) == _rSelectedPredicate )
215 : {
216 0 : nPredicateIndex = i;
217 0 : break;
218 : }
219 :
220 0 : sal_Int32 nPredicateType = SQLFilterOperator::NOT_SQLNULL;
221 0 : switch ( nPredicateIndex )
222 : {
223 : case 0:
224 0 : nPredicateType = SQLFilterOperator::EQUAL;
225 0 : break;
226 : case 1:
227 0 : nPredicateType = SQLFilterOperator::NOT_EQUAL;
228 0 : break;
229 : case 2:
230 0 : nPredicateType = SQLFilterOperator::LESS;
231 0 : break;
232 : case 3:
233 0 : nPredicateType = SQLFilterOperator::LESS_EQUAL;
234 0 : break;
235 : case 4:
236 0 : nPredicateType = SQLFilterOperator::GREATER;
237 0 : break;
238 : case 5:
239 0 : nPredicateType = SQLFilterOperator::GREATER_EQUAL;
240 0 : break;
241 : case 6:
242 0 : nPredicateType = SQLFilterOperator::LIKE;
243 0 : break;
244 : case 7:
245 0 : nPredicateType = SQLFilterOperator::NOT_LIKE;
246 0 : break;
247 : case 8:
248 0 : nPredicateType = SQLFilterOperator::SQLNULL;
249 0 : break;
250 : case 9:
251 0 : nPredicateType = SQLFilterOperator::NOT_SQLNULL;
252 0 : break;
253 : default:
254 : OSL_FAIL( "DlgFilterCrit::GetOSQLPredicateType: unknown predicate string!" );
255 0 : break;
256 : }
257 :
258 0 : return nPredicateType;
259 : }
260 :
261 0 : sal_uInt16 DlgFilterCrit::GetSelectionPos(sal_Int32 eType,const ListBox& rListBox) const
262 : {
263 : sal_uInt16 nPos;
264 0 : switch(eType)
265 : {
266 : case SQLFilterOperator::EQUAL:
267 0 : nPos = 0;
268 0 : break;
269 : case SQLFilterOperator::NOT_EQUAL:
270 0 : nPos = 1;
271 0 : break;
272 : case SQLFilterOperator::LESS:
273 0 : nPos = 2;
274 0 : break;
275 : case SQLFilterOperator::LESS_EQUAL:
276 0 : nPos = 3;
277 0 : break;
278 : case SQLFilterOperator::GREATER:
279 0 : nPos = 4;
280 0 : break;
281 : case SQLFilterOperator::GREATER_EQUAL:
282 0 : nPos = 5;
283 0 : break;
284 : case SQLFilterOperator::NOT_LIKE:
285 0 : nPos = rListBox.GetEntryCount() > 2 ? rListBox.GetEntryCount()-3 : 0;
286 0 : break;
287 : case SQLFilterOperator::LIKE:
288 0 : nPos = rListBox.GetEntryCount() > 2 ? rListBox.GetEntryCount()-4 : 1;
289 0 : break;
290 : case SQLFilterOperator::SQLNULL:
291 0 : nPos = rListBox.GetEntryCount()-2;
292 0 : break;
293 : case SQLFilterOperator::NOT_SQLNULL:
294 0 : nPos = rListBox.GetEntryCount()-1;
295 0 : break;
296 : default:
297 : // TODO What value should this be?
298 0 : nPos = 0;
299 0 : break;
300 : }
301 0 : return nPos;
302 : }
303 :
304 0 : sal_Bool DlgFilterCrit::getCondition(const ListBox& _rField,const ListBox& _rComp,const Edit& _rValue,PropertyValue& _rFilter) const
305 : {
306 0 : sal_Bool bHaving = sal_False;
307 : try
308 : {
309 0 : OUString sTableName;
310 0 : sal_Bool bFunction = sal_False;
311 0 : _rFilter.Name = _rField.GetSelectEntry();
312 0 : Reference< XPropertySet > xColumn = getQueryColumn(_rFilter.Name);
313 0 : if ( xColumn.is() )
314 : {
315 0 : Reference< XPropertySetInfo > xInfo = xColumn->getPropertySetInfo();
316 0 : if ( xInfo->hasPropertyByName(PROPERTY_REALNAME) )
317 : {
318 0 : if ( xInfo->hasPropertyByName(PROPERTY_TABLENAME) )
319 : {
320 0 : xColumn->getPropertyValue(PROPERTY_TABLENAME) >>= sTableName;
321 0 : if ( !sTableName.isEmpty() )
322 : {
323 : // properly quote all parts of the table name, so
324 : // e.g. <schema>.<table> becomes "<schema>"."<table>"
325 0 : OUString aCatlog,aSchema,aTable;
326 0 : ::dbtools::qualifiedNameComponents( m_xMetaData, sTableName, aCatlog, aSchema, aTable, ::dbtools::eInDataManipulation );
327 0 : sTableName = ::dbtools::composeTableName( m_xMetaData, aCatlog, aSchema, aTable, sal_True, ::dbtools::eInDataManipulation );
328 : }
329 : }
330 0 : xColumn->getPropertyValue(PROPERTY_REALNAME) >>= _rFilter.Name;
331 0 : static OUString sAgg("AggregateFunction");
332 0 : if ( xInfo->hasPropertyByName(sAgg) )
333 0 : xColumn->getPropertyValue(sAgg) >>= bHaving;
334 0 : static OUString sFunction("Function");
335 0 : if ( xInfo->hasPropertyByName(sFunction) )
336 0 : xColumn->getPropertyValue(sFunction) >>= bFunction;
337 : }
338 0 : if ( !bFunction )
339 : {
340 0 : const OUString aQuote = m_xMetaData.is() ? m_xMetaData->getIdentifierQuoteString() : OUString();
341 0 : _rFilter.Name = ::dbtools::quoteName(aQuote,_rFilter.Name);
342 0 : if ( !sTableName.isEmpty() )
343 : {
344 0 : static OUString sSep(".");
345 0 : sTableName += sSep;
346 0 : sTableName += _rFilter.Name;
347 0 : _rFilter.Name = sTableName;
348 0 : }
349 0 : }
350 0 : }
351 : }
352 0 : catch(const Exception&)
353 : {
354 : }
355 :
356 0 : _rFilter.Handle = GetOSQLPredicateType( _rComp.GetSelectEntry() );
357 0 : if ( SQLFilterOperator::SQLNULL != _rFilter.Handle && _rFilter.Handle != SQLFilterOperator::NOT_SQLNULL )
358 : {
359 0 : String sPredicateValue = m_aPredicateInput.getPredicateValue( _rValue.GetText(), getMatchingColumn( _rValue ), sal_False );
360 0 : if ( _rFilter.Handle == SQLFilterOperator::LIKE ||
361 0 : _rFilter.Handle == SQLFilterOperator::NOT_LIKE )
362 0 : ::Replace_OS_PlaceHolder( sPredicateValue );
363 0 : _rFilter.Value <<= OUString(sPredicateValue);
364 : }
365 0 : return bHaving;
366 : }
367 :
368 0 : Reference< XPropertySet > DlgFilterCrit::getColumn( const OUString& _rFieldName ) const
369 : {
370 0 : Reference< XPropertySet > xColumn;
371 : try
372 : {
373 0 : if ( m_xColumns.is() && m_xColumns->hasByName( _rFieldName ) )
374 0 : m_xColumns->getByName( _rFieldName ) >>= xColumn;
375 :
376 0 : Reference< XNameAccess> xColumns = Reference< XColumnsSupplier >(m_xQueryComposer,UNO_QUERY)->getColumns();
377 0 : if ( xColumns.is() && !xColumn.is() )
378 : {
379 0 : Sequence< OUString> aSeq = xColumns->getElementNames();
380 0 : const OUString* pIter = aSeq.getConstArray();
381 0 : const OUString* pEnd = pIter + aSeq.getLength();
382 0 : for(;pIter != pEnd;++pIter)
383 : {
384 0 : Reference<XPropertySet> xProp(xColumns->getByName(*pIter),UNO_QUERY);
385 0 : if ( xProp.is() && xProp->getPropertySetInfo()->hasPropertyByName(PROPERTY_REALNAME) )
386 : {
387 0 : OUString sRealName;
388 0 : xProp->getPropertyValue(PROPERTY_REALNAME) >>= sRealName;
389 0 : if ( sRealName == _rFieldName )
390 : {
391 0 : if ( m_xColumns.is() && m_xColumns->hasByName( *pIter ) )
392 0 : m_xColumns->getByName( *pIter ) >>= xColumn;
393 0 : break;
394 0 : }
395 : }
396 0 : }
397 0 : }
398 : }
399 0 : catch( const Exception& )
400 : {
401 : DBG_UNHANDLED_EXCEPTION();
402 : }
403 :
404 0 : return xColumn;
405 : }
406 :
407 0 : Reference< XPropertySet > DlgFilterCrit::getQueryColumn( const OUString& _rFieldName ) const
408 : {
409 0 : Reference< XPropertySet > xColumn;
410 : try
411 : {
412 0 : Reference< XNameAccess> xColumns = Reference< XColumnsSupplier >(m_xQueryComposer,UNO_QUERY)->getColumns();
413 0 : if ( xColumns.is() && xColumns->hasByName( _rFieldName ) )
414 0 : xColumns->getByName( _rFieldName ) >>= xColumn;
415 : }
416 0 : catch( const Exception& )
417 : {
418 : DBG_UNHANDLED_EXCEPTION();
419 : }
420 :
421 0 : return xColumn;
422 : }
423 :
424 0 : Reference< XPropertySet > DlgFilterCrit::getMatchingColumn( const Edit& _rValueInput ) const
425 : {
426 : // the name
427 0 : OUString sField;
428 0 : if ( &_rValueInput == &aET_WHEREVALUE1 )
429 : {
430 0 : sField = aLB_WHEREFIELD1.GetSelectEntry();
431 : }
432 0 : else if ( &_rValueInput == &aET_WHEREVALUE2 )
433 : {
434 0 : sField = aLB_WHEREFIELD2.GetSelectEntry();
435 : }
436 0 : else if ( &_rValueInput == &aET_WHEREVALUE3 )
437 : {
438 0 : sField = aLB_WHEREFIELD3.GetSelectEntry();
439 : }
440 : else {
441 : OSL_FAIL( "DlgFilterCrit::getMatchingColumn: invalid event source!" );
442 : }
443 :
444 : // the field itself
445 0 : return getColumn( sField );
446 : }
447 :
448 0 : IMPL_LINK( DlgFilterCrit, PredicateLoseFocus, Edit*, _pField )
449 : {
450 : OSL_ENSURE( _pField, "DlgFilterCrit::PredicateLoseFocus: invalid event source!" );
451 0 : if ( _pField )
452 : {
453 : // retrieve the field affected
454 0 : Reference< XPropertySet> xColumn( getMatchingColumn( *_pField ) );
455 : // and normalize it's content
456 0 : if ( xColumn.is() )
457 : {
458 0 : OUString sText( _pField->GetText() );
459 0 : m_aPredicateInput.normalizePredicateString( sText, xColumn );
460 0 : _pField->SetText( sText );
461 0 : }
462 : }
463 :
464 0 : return 0L;
465 : }
466 :
467 0 : void DlgFilterCrit::SetLine( sal_uInt16 nIdx,const PropertyValue& _rItem,sal_Bool _bOr )
468 : {
469 : DBG_CHKTHIS(DlgFilterCrit,NULL);
470 0 : OUString aCondition;
471 0 : _rItem.Value >>= aCondition;
472 0 : String aStr = aCondition;
473 0 : if ( _rItem.Handle == SQLFilterOperator::LIKE ||
474 0 : _rItem.Handle == SQLFilterOperator::NOT_LIKE )
475 0 : ::Replace_SQL_PlaceHolder(aStr);
476 0 : aStr = comphelper::string::stripEnd(aStr, ' ');
477 :
478 0 : Reference< XPropertySet > xColumn = getColumn( _rItem.Name );
479 :
480 : // remove the predicate from the condition
481 0 : switch(_rItem.Handle)
482 : {
483 : case SQLFilterOperator::EQUAL:
484 : // aStr.Erase(0,1);
485 0 : break;
486 : case SQLFilterOperator::NOT_EQUAL:
487 0 : aStr.Erase(0,2);
488 0 : break;
489 : case SQLFilterOperator::LESS:
490 0 : aStr.Erase(0,1);
491 0 : break;
492 : case SQLFilterOperator::LESS_EQUAL:
493 0 : aStr.Erase(0,2);
494 0 : break;
495 : case SQLFilterOperator::GREATER:
496 0 : aStr.Erase(0,1);
497 0 : break;
498 : case SQLFilterOperator::GREATER_EQUAL:
499 0 : aStr.Erase(0,2);
500 0 : break;
501 : case SQLFilterOperator::NOT_LIKE:
502 0 : aStr.Erase(0,8);
503 0 : break;
504 : case SQLFilterOperator::LIKE:
505 0 : aStr.Erase(0,4);
506 0 : break;
507 : case SQLFilterOperator::SQLNULL:
508 0 : aStr.Erase(0,7);
509 0 : break;
510 : case SQLFilterOperator::NOT_SQLNULL:
511 0 : aStr.Erase(0,11);
512 0 : break;
513 : }
514 0 : aStr = comphelper::string::stripStart(aStr, ' ');
515 :
516 : // to make sure that we only set first three
517 0 : ListBox* pColumnListControl = NULL;
518 0 : ListBox* pPredicateListControl = NULL;
519 0 : Edit* pPredicateValueControl = NULL;
520 0 : switch( nIdx )
521 : {
522 : case 0:
523 0 : pColumnListControl = &aLB_WHEREFIELD1;
524 0 : pPredicateListControl = &aLB_WHERECOMP1;
525 0 : pPredicateValueControl = &aET_WHEREVALUE1;
526 0 : break;
527 : case 1:
528 0 : aLB_WHERECOND2.SelectEntryPos( _bOr ? 1 : 0 );
529 :
530 0 : pColumnListControl = &aLB_WHEREFIELD2;
531 0 : pPredicateListControl = &aLB_WHERECOMP2;
532 0 : pPredicateValueControl = &aET_WHEREVALUE2;
533 0 : break;
534 : case 2:
535 0 : aLB_WHERECOND3.SelectEntryPos( _bOr ? 1 : 0 );
536 :
537 0 : pColumnListControl = &aLB_WHEREFIELD3;
538 0 : pPredicateListControl = &aLB_WHERECOMP3;
539 0 : pPredicateValueControl = &aET_WHEREVALUE3;
540 0 : break;
541 : }
542 :
543 0 : if ( pColumnListControl && pPredicateListControl && pPredicateValueControl )
544 : {
545 0 : OUString sName;
546 0 : if ( xColumn.is() )
547 0 : xColumn->getPropertyValue(PROPERTY_NAME) >>= sName;
548 : else
549 0 : sName = _rItem.Name;
550 : // select the appropriate field name
551 0 : SelectField( *pColumnListControl, sName );
552 0 : ListSelectHdl( pColumnListControl );
553 :
554 : // select the appropriate condition
555 0 : pPredicateListControl->SelectEntryPos( GetSelectionPos( (sal_Int32)_rItem.Handle, *pPredicateListControl ) );
556 :
557 : // initially normalize this value
558 0 : OUString aString( aStr );
559 0 : m_aPredicateInput.normalizePredicateString( aString, xColumn );
560 0 : pPredicateValueControl->SetText( aString );
561 0 : }
562 0 : }
563 :
564 0 : void DlgFilterCrit::SelectField( ListBox& rBox, const String& rField )
565 : {
566 : DBG_CHKTHIS(DlgFilterCrit,NULL);
567 0 : sal_uInt16 nCnt = rBox.GetEntryCount();
568 :
569 0 : for( sal_uInt16 i=0 ; i<nCnt ; i++ )
570 : {
571 0 : if(rBox.GetEntry(i) == rField)
572 : {
573 0 : rBox.SelectEntryPos(i);
574 0 : return;
575 : }
576 : }
577 :
578 0 : rBox.SelectEntryPos(0);
579 : }
580 :
581 0 : void DlgFilterCrit::EnableLines()
582 : {
583 : DBG_CHKTHIS(DlgFilterCrit,NULL);
584 : // enabling/disabling of whole lines
585 0 : if( LbPos(aLB_WHEREFIELD1) == 0 )
586 : {
587 0 : aLB_WHEREFIELD2.Disable();
588 0 : aLB_WHERECOND2.Disable();
589 0 : aLB_WHERECOMP2.Disable();
590 0 : aET_WHEREVALUE2.Disable();
591 :
592 0 : aLB_WHEREFIELD3.Disable();
593 0 : aLB_WHERECOND3.Disable();
594 0 : aLB_WHERECOMP3.Disable();
595 0 : aET_WHEREVALUE3.Disable();
596 : }
597 : else
598 : {
599 0 : aLB_WHEREFIELD2.Enable();
600 0 : aLB_WHERECOND2.Enable();
601 0 : aLB_WHERECOMP2.Enable();
602 0 : aET_WHEREVALUE2.Enable();
603 :
604 0 : aLB_WHEREFIELD3.Enable();
605 0 : aLB_WHERECOND3.Enable();
606 0 : aLB_WHERECOMP3.Enable();
607 0 : aET_WHEREVALUE3.Enable();
608 : }
609 :
610 0 : if( LbPos(aLB_WHEREFIELD2) == 0 )
611 : {
612 0 : aLB_WHEREFIELD3.Disable();
613 0 : aLB_WHERECOND3.Disable();
614 0 : aLB_WHERECOMP3.Disable();
615 0 : aET_WHEREVALUE3.Disable();
616 : }
617 : else
618 : {
619 0 : aLB_WHEREFIELD3.Enable();
620 0 : aLB_WHERECOND3.Enable();
621 0 : aLB_WHERECOMP3.Enable();
622 0 : aET_WHEREVALUE3.Enable();
623 : }
624 :
625 : // comparison field equal to NOENTRY
626 0 : if( LbPos(aLB_WHEREFIELD1) == 0 )
627 : {
628 0 : aLB_WHERECOMP1.Disable();
629 0 : aET_WHEREVALUE1.Disable();
630 : }
631 : else
632 : {
633 0 : aLB_WHEREFIELD1.Enable();
634 0 : aLB_WHERECOMP1.Enable();
635 0 : aET_WHEREVALUE1.Enable();
636 : }
637 :
638 0 : if( LbPos(aLB_WHEREFIELD2) == 0 )
639 : {
640 0 : aLB_WHERECOND2.Disable();
641 0 : aLB_WHERECOMP2.Disable();
642 0 : aET_WHEREVALUE2.Disable();
643 : }
644 : else
645 : {
646 0 : aLB_WHERECOND2.Enable();
647 0 : aLB_WHEREFIELD2.Enable();
648 0 : aLB_WHERECOMP2.Enable();
649 0 : aET_WHEREVALUE2.Enable();
650 : }
651 :
652 0 : if( LbPos(aLB_WHEREFIELD3) == 0 )
653 : {
654 0 : aLB_WHERECOND3.Disable();
655 0 : aLB_WHERECOMP3.Disable();
656 0 : aET_WHEREVALUE3.Disable();
657 : }
658 : else
659 : {
660 0 : aLB_WHERECOND3.Enable();
661 0 : aLB_WHERECOND3.Enable();
662 0 : aLB_WHEREFIELD3.Enable();
663 0 : aLB_WHERECOMP3.Enable();
664 0 : aET_WHEREVALUE3.Enable();
665 : }
666 :
667 : // comparison operator equal to ISNULL or ISNOTNULL
668 0 : if(aLB_WHERECOMP1.GetEntryCount() > 2 &&
669 0 : ((LbPos(aLB_WHERECOMP1) == aLB_WHERECOMP1.GetEntryCount()-1) ||
670 0 : (LbPos(aLB_WHERECOMP1) == aLB_WHERECOMP1.GetEntryCount()-2)) )
671 0 : aET_WHEREVALUE1.Disable();
672 :
673 0 : if(aLB_WHERECOMP2.GetEntryCount() > 2 &&
674 0 : ((LbPos(aLB_WHERECOMP2) == aLB_WHERECOMP2.GetEntryCount()-1) ||
675 0 : (LbPos(aLB_WHERECOMP2) == aLB_WHERECOMP2.GetEntryCount()-2)) )
676 0 : aET_WHEREVALUE2.Disable();
677 :
678 0 : if(aLB_WHERECOMP3.GetEntryCount() > 2 &&
679 0 : ((LbPos(aLB_WHERECOMP3) == aLB_WHERECOMP3.GetEntryCount()-1) ||
680 0 : (LbPos(aLB_WHERECOMP3) == aLB_WHERECOMP3.GetEntryCount()-2)) )
681 0 : aET_WHEREVALUE3.Disable();
682 0 : }
683 :
684 0 : IMPL_LINK( DlgFilterCrit, ListSelectHdl, ListBox *, pListBox )
685 : {
686 0 : String aName;
687 : ListBox* pComp;
688 0 : if(pListBox == &aLB_WHEREFIELD1)
689 : {
690 0 : aName = LbText(aLB_WHEREFIELD1);
691 0 : pComp = &aLB_WHERECOMP1;
692 : }
693 0 : else if(pListBox == &aLB_WHEREFIELD2)
694 : {
695 0 : aName = LbText(aLB_WHEREFIELD2);
696 0 : pComp = &aLB_WHERECOMP2;
697 : }
698 : else
699 : {
700 0 : aName = LbText(aLB_WHEREFIELD3);
701 0 : pComp = &aLB_WHERECOMP3;
702 : }
703 :
704 0 : pComp->Clear();
705 :
706 0 : Reference<XPropertySet> xColumn = getColumn(aName);
707 0 : if ( xColumn.is() )
708 : {
709 0 : sal_Int32 nDataType = 0;
710 0 : xColumn->getPropertyValue(PROPERTY_TYPE) >>= nDataType;
711 0 : sal_Int32 eColumnSearch = dbtools::getSearchColumnFlag(m_xConnection,nDataType);
712 :
713 0 : if(eColumnSearch == ColumnSearch::FULL)
714 : {
715 0 : for(xub_StrLen i=0;i < comphelper::string::getTokenCount(aSTR_COMPARE_OPERATORS, ';');i++)
716 0 : pComp->InsertEntry(aSTR_COMPARE_OPERATORS.GetToken(i));
717 : }
718 0 : else if(eColumnSearch == ColumnSearch::CHAR)
719 : {
720 0 : for(xub_StrLen i=6;i<10;i++)
721 0 : pComp->InsertEntry(aSTR_COMPARE_OPERATORS.GetToken(i));
722 : }
723 0 : else if(eColumnSearch == ColumnSearch::BASIC)
724 : {
725 : xub_StrLen i;
726 0 : for( i = 0; i < 6; i++ )
727 0 : pComp->InsertEntry(aSTR_COMPARE_OPERATORS.GetToken(i));
728 0 : for(i=8; i < comphelper::string::getTokenCount(aSTR_COMPARE_OPERATORS, ';'); ++i)
729 0 : pComp->InsertEntry(aSTR_COMPARE_OPERATORS.GetToken(i));
730 : }
731 : else
732 : {
733 : OSL_FAIL("DlgFilterCrit::ListSelectHdl: This column should not exist at all.");
734 : }
735 : }
736 0 : pComp->SelectEntryPos(0);
737 :
738 0 : EnableLines();
739 0 : return 0;
740 : }
741 :
742 0 : IMPL_LINK_INLINE_START( DlgFilterCrit, ListSelectCompHdl, ListBox *, /*pListBox*/ )
743 : {
744 0 : EnableLines();
745 0 : return 0;
746 : }
747 0 : IMPL_LINK_INLINE_END( DlgFilterCrit, ListSelectCompHdl, ListBox *, pListBox )
748 :
749 0 : void DlgFilterCrit::BuildWherePart()
750 : {
751 : DBG_CHKTHIS(DlgFilterCrit,NULL);
752 0 : Sequence<Sequence<PropertyValue> > aFilter,aHaving;
753 0 : aFilter.realloc(1);
754 0 : aHaving.realloc(1);
755 :
756 0 : if( LbPos(aLB_WHEREFIELD1) != 0 )
757 : {
758 0 : PropertyValue aValue;
759 0 : if ( getCondition(aLB_WHEREFIELD1,aLB_WHERECOMP1,aET_WHEREVALUE1,aValue) )
760 : {
761 0 : aHaving[0].realloc(1);
762 0 : aHaving[0][0] = aValue;
763 : }
764 : else
765 : {
766 0 : aFilter[0].realloc(1);
767 0 : aFilter[0][0] = aValue;
768 0 : }
769 : }
770 :
771 0 : if( LbPos(aLB_WHEREFIELD2) != 0 )
772 : {
773 0 : PropertyValue aValue;
774 0 : Sequence<Sequence<PropertyValue> >& _rValues = aFilter;
775 0 : if ( getCondition(aLB_WHEREFIELD2,aLB_WHERECOMP2,aET_WHEREVALUE2,aValue) )
776 0 : _rValues = aHaving;
777 0 : PropertyValue* pPos = NULL;
778 0 : if ( aLB_WHERECOND2.GetSelectEntryPos() )
779 : {
780 0 : sal_Int32 nPos = _rValues.getLength();
781 0 : _rValues.realloc( nPos + 1);
782 0 : _rValues[nPos].realloc( 1);
783 0 : pPos = &_rValues[nPos][0];
784 : }
785 : else
786 : {
787 0 : sal_Int32 nPos = _rValues.getLength() - 1;
788 0 : sal_Int32 nAndPos = _rValues[nPos].getLength();
789 0 : _rValues[nPos].realloc( _rValues[nPos].getLength() + 1);
790 0 : pPos = &_rValues[nPos][nAndPos];
791 : }
792 0 : *pPos = aValue;
793 : }
794 :
795 0 : if( LbPos(aLB_WHEREFIELD3) != 0 )
796 : {
797 0 : PropertyValue aValue;
798 0 : Sequence<Sequence<PropertyValue> >& _rValues = aFilter;
799 0 : if ( getCondition(aLB_WHEREFIELD3,aLB_WHERECOMP3,aET_WHEREVALUE3,aValue) )
800 0 : _rValues = aHaving;
801 0 : PropertyValue* pPos = NULL;
802 0 : if ( aLB_WHERECOND3.GetSelectEntryPos() )
803 : {
804 0 : sal_Int32 nPos = _rValues.getLength();
805 0 : _rValues.realloc( nPos + 1);
806 0 : _rValues[nPos].realloc( 1);
807 0 : pPos = &_rValues[nPos][0];
808 : }
809 : else
810 : {
811 0 : sal_Int32 nPos = _rValues.getLength() - 1;
812 0 : sal_Int32 nAndPos = _rValues[nPos].getLength();
813 0 : _rValues[nPos].realloc( _rValues[nPos].getLength() + 1);
814 0 : pPos = &_rValues[nPos][nAndPos];
815 : }
816 0 : *pPos = aValue;
817 : }
818 : try
819 : {
820 0 : m_xQueryComposer->setStructuredFilter(aFilter);
821 0 : m_xQueryComposer->setStructuredHavingClause(aHaving);
822 : }
823 0 : catch(const Exception&)
824 : {
825 : DBG_UNHANDLED_EXCEPTION();
826 0 : }
827 0 : }
828 :
829 0 : void DlgFilterCrit::fillLines(const Sequence<Sequence<PropertyValue > >& _aValues)
830 : {
831 0 : const Sequence<PropertyValue >* pOrIter = _aValues.getConstArray();
832 0 : const Sequence<PropertyValue >* pOrEnd = pOrIter + _aValues.getLength();
833 0 : sal_Bool bOr = sal_True;
834 0 : for(sal_uInt16 i=0;pOrIter != pOrEnd; ++pOrIter)
835 : {
836 0 : bOr = sal_True;
837 0 : const PropertyValue* pAndIter = pOrIter->getConstArray();
838 0 : const PropertyValue* pAndEnd = pAndIter + pOrIter->getLength();
839 0 : for(;pAndIter != pAndEnd; ++pAndIter)
840 : {
841 0 : SetLine( i++,*pAndIter,bOr);
842 0 : bOr = sal_False;
843 : }
844 : }
845 12 : }
846 :
847 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|