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