xref: /trunk/main/sc/source/ui/dbgui/filtdlg.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sc.hxx"
30 
31 // System - Includes ---------------------------------------------------------
32 
33 
34 
35 // INCLUDE -------------------------------------------------------------------
36 #include <rangelst.hxx>
37 #include <sfx2/dispatch.hxx>
38 #include <vcl/waitobj.hxx>
39 
40 #include "uiitems.hxx"
41 #include "dbcolect.hxx"
42 #include "reffact.hxx"
43 #include "viewdata.hxx"
44 #include "document.hxx"
45 #include "docsh.hxx"
46 #include "scresid.hxx"
47 
48 #include "foptmgr.hxx"
49 
50 #include "globstr.hrc"
51 #include "filter.hrc"
52 
53 #define _FILTDLG_CXX
54 #include "filtdlg.hxx"
55 #undef _FILTDLG_CXX
56 #include <vcl/msgbox.hxx>
57 
58 // DEFINE --------------------------------------------------------------------
59 
60 #define ERRORBOX(rid)   ErrorBox( this, WinBits( WB_OK|WB_DEF_OK), \
61                                   ScGlobal::GetRscString(rid) ).Execute()
62 
63 
64 //============================================================================
65 //  class ScFilterDlg
66 
67 //----------------------------------------------------------------------------
68 
69 ScFilterDlg::ScFilterDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
70                           const SfxItemSet& rArgSet )
71 
72     :   ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_FILTER ),
73         //
74         aFlCriteria     ( this, ScResId( FL_CRITERIA ) ),
75         aLbConnect1     ( this, ScResId( LB_OP1 ) ),
76         aLbField1       ( this, ScResId( LB_FIELD1 ) ),
77         aLbCond1        ( this, ScResId( LB_COND1 ) ),
78         aEdVal1         ( this, ScResId( ED_VAL1 ) ),
79         aLbConnect2     ( this, ScResId( LB_OP2 ) ),
80         aLbField2       ( this, ScResId( LB_FIELD2 ) ),
81         aLbCond2        ( this, ScResId( LB_COND2 ) ),
82         aEdVal2         ( this, ScResId( ED_VAL2 ) ),
83         aLbConnect3     ( this, ScResId( LB_OP3 ) ),
84         aLbField3       ( this, ScResId( LB_FIELD3 ) ),
85         aLbCond3        ( this, ScResId( LB_COND3 ) ),
86         aEdVal3         ( this, ScResId( ED_VAL3 ) ),
87         aLbConnect4     ( this, ScResId( LB_OP4 ) ),
88         aLbField4       ( this, ScResId( LB_FIELD4 ) ),
89         aLbCond4        ( this, ScResId( LB_COND4 ) ),
90         aEdVal4         ( this, ScResId( ED_VAL4 ) ),
91         aFtConnect      ( this, ScResId( FT_OP ) ),
92         aFtField        ( this, ScResId( FT_FIELD ) ),
93         aFtCond         ( this, ScResId( FT_COND ) ),
94         aFtVal          ( this, ScResId( FT_VAL ) ),
95         aFlSeparator    ( this, ScResId( FL_SEPARATOR ) ),
96         aScrollBar      ( this, ScResId( LB_SCROLL ) ),
97         aFlOptions      ( this, ScResId( FL_OPTIONS ) ),
98         aBtnMore        ( this, ScResId( BTN_MORE ) ),
99         aBtnHelp        ( this, ScResId( BTN_HELP ) ),
100         aBtnOk          ( this, ScResId( BTN_OK ) ),
101         aBtnCancel      ( this, ScResId( BTN_CANCEL ) ),
102         _INIT_COMMON_FILTER_RSCOBJS
103         aStrEmpty       ( ScResId( SCSTR_EMPTY ) ),
104         aStrNotEmpty    ( ScResId( SCSTR_NOTEMPTY ) ),
105         aStrRow         ( ScResId( SCSTR_ROW ) ),
106         aStrColumn      ( ScResId( SCSTR_COLUMN ) ),
107         //
108         pOptionsMgr     ( NULL ),
109         nWhichQuery     ( rArgSet.GetPool()->GetWhich( SID_QUERY ) ),
110         theQueryData    ( ((const ScQueryItem&)
111                            rArgSet.Get( nWhichQuery )).GetQueryData() ),
112         pOutItem        ( NULL ),
113         pViewData       ( NULL ),
114         pDoc            ( NULL ),
115         nSrcTab         ( 0 ),
116         nFieldCount     ( 0 ),
117         bRefInputMode   ( sal_False ),
118         pTimer          ( NULL )
119 {
120     for (sal_uInt16 i=0; i<=MAXCOL; i++)
121         pEntryLists[i] = NULL;
122     for (SCSIZE i=0;i<MAXQUERY;i++)
123     {
124          bRefreshExceptQuery[i]=sal_False;
125     }
126     aBtnMore.SetMoreText( String(ScResId( SCSTR_MOREBTN_MOREOPTIONS )) );
127     aBtnMore.SetLessText( String(ScResId( SCSTR_MOREBTN_FEWEROPTIONS )) );
128     Init( rArgSet );
129     FreeResource();
130 
131     // Hack: RefInput-Kontrolle
132     pTimer = new Timer;
133     pTimer->SetTimeout( 50 ); // 50ms warten
134     pTimer->SetTimeoutHdl( LINK( this, ScFilterDlg, TimeOutHdl ) );
135 
136     String sAccName (ScResId(RID_FILTER_OPERATOR));
137     String sIndexName(sAccName);
138     sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 1"));
139     aLbConnect1.SetAccessibleName(sIndexName);
140     sIndexName = sAccName;
141     sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 2"));
142     aLbConnect2.SetAccessibleName(sIndexName);
143 
144     sAccName = String(ScResId(RID_FILTER_FIELDNAME));
145     sIndexName = sAccName;
146     sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 1"));
147     aLbField1.SetAccessibleName(sIndexName);
148     sIndexName = sAccName;
149     sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 2"));
150     aLbField2.SetAccessibleName(sIndexName);
151     sIndexName = sAccName;
152     sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 3"));
153     aLbField3.SetAccessibleName(sIndexName);
154 
155 
156     sAccName = String(ScResId(RID_FILTER_CONDITION));
157     sIndexName = sAccName;
158     sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 1"));
159     aLbCond1.SetAccessibleName(sIndexName);
160     sIndexName = sAccName;
161     sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 2"));
162     aLbCond2.SetAccessibleName(sIndexName);
163     sIndexName = sAccName;
164     sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 3"));
165     aLbCond3.SetAccessibleName(sIndexName);
166 
167     sAccName = String(ScResId(RID_FILTER_VALUE));
168     sIndexName = sAccName;
169     sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 1"));
170     aEdVal1.SetAccessibleName(sIndexName);
171     sIndexName = sAccName;
172     sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 2"));
173     aEdVal2.SetAccessibleName(sIndexName);
174     sIndexName = sAccName;
175     sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 3"));
176     aEdVal3.SetAccessibleName(sIndexName);
177 
178     aLbCopyArea.SetAccessibleName(ScResId(STR_COPY_AREA_TO));
179     aEdCopyArea.SetAccessibleName(ScResId(STR_COPY_AREA_TO));
180     aLbCopyArea.SetAccessibleRelationLabeledBy(&aBtnCopyResult);
181     aEdCopyArea.SetAccessibleRelationLabeledBy(&aBtnCopyResult);
182 
183     aLbConnect1.SetAccessibleRelationLabeledBy(&aFtConnect);
184     aLbConnect2.SetAccessibleRelationLabeledBy(&aFtConnect);
185     aLbField1.SetAccessibleRelationLabeledBy(&aFtField);
186     aLbField2.SetAccessibleRelationLabeledBy(&aFtField);
187     aLbField3.SetAccessibleRelationLabeledBy(&aFtField);
188     aLbCond1.SetAccessibleRelationLabeledBy(&aFtCond);
189     aLbCond2.SetAccessibleRelationLabeledBy(&aFtCond);
190     aLbCond3.SetAccessibleRelationLabeledBy(&aFtCond);
191     aEdVal1.SetAccessibleRelationLabeledBy(&aFtVal);
192     aEdVal2.SetAccessibleRelationLabeledBy(&aFtVal);
193     aEdVal3.SetAccessibleRelationLabeledBy(&aFtVal);
194 }
195 
196 
197 //----------------------------------------------------------------------------
198 
199 __EXPORT ScFilterDlg::~ScFilterDlg()
200 {
201     for (sal_uInt16 i=0; i<=MAXCOL; i++)
202         delete pEntryLists[i];
203 
204     delete pOptionsMgr;
205     delete pOutItem;
206 
207     // Hack: RefInput-Kontrolle
208     pTimer->Stop();
209     delete pTimer;
210 }
211 
212 
213 //----------------------------------------------------------------------------
214 
215 void __EXPORT ScFilterDlg::Init( const SfxItemSet& rArgSet )
216 {
217     const ScQueryItem& rQueryItem = (const ScQueryItem&)
218                                     rArgSet.Get( nWhichQuery );
219 
220     aBtnOk.SetClickHdl      ( LINK( this, ScFilterDlg, EndDlgHdl ) );
221     aBtnCancel.SetClickHdl  ( LINK( this, ScFilterDlg, EndDlgHdl ) );
222     aBtnMore.SetClickHdl    ( LINK( this, ScFilterDlg, MoreClickHdl ) );
223     aBtnHeader.SetClickHdl  ( LINK( this, ScFilterDlg, CheckBoxHdl ) );
224     aBtnCase.SetClickHdl    ( LINK( this, ScFilterDlg, CheckBoxHdl ) );
225     //
226     aLbField1.SetSelectHdl  ( LINK( this, ScFilterDlg, LbSelectHdl ) );
227     aLbField2.SetSelectHdl  ( LINK( this, ScFilterDlg, LbSelectHdl ) );
228     aLbField3.SetSelectHdl  ( LINK( this, ScFilterDlg, LbSelectHdl ) );
229     aLbField4.SetSelectHdl  ( LINK( this, ScFilterDlg, LbSelectHdl ) );
230     aLbConnect1.SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) );
231     aLbConnect2.SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) );
232     aLbConnect3.SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) );
233     aLbConnect4.SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) );
234 
235     aLbCond1.SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) );
236     aLbCond2.SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) );
237     aLbCond3.SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) );
238     aLbCond4.SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) );
239 
240     pViewData   = rQueryItem.GetViewData();
241     pDoc        = pViewData ? pViewData->GetDocument() : NULL;
242     nSrcTab     = pViewData ? pViewData->GetTabNo() : static_cast<SCTAB>(0);
243 
244     // fuer leichteren Zugriff:
245     aFieldLbArr  [0] = &aLbField1;
246     aFieldLbArr  [1] = &aLbField2;
247     aFieldLbArr  [2] = &aLbField3;
248     aFieldLbArr  [3] = &aLbField4;
249     aValueEdArr  [0] = &aEdVal1;
250     aValueEdArr  [1] = &aEdVal2;
251     aValueEdArr  [2] = &aEdVal3;
252     aValueEdArr  [3] = &aEdVal4;
253     aCondLbArr   [0] = &aLbCond1;
254     aCondLbArr   [1] = &aLbCond2;
255     aCondLbArr   [2] = &aLbCond3;
256     aCondLbArr   [3] = &aLbCond4;
257     aConnLbArr   [0] = &aLbConnect1;
258     aConnLbArr   [1] = &aLbConnect2;
259     aConnLbArr   [2] = &aLbConnect3;
260     aConnLbArr   [3] = &aLbConnect4;
261 
262     // Optionen initialisieren lassen:
263 
264     pOptionsMgr  = new ScFilterOptionsMgr(
265                             this,
266                             pViewData,
267                             theQueryData,
268                             aBtnMore,
269                             aBtnCase,
270                             aBtnRegExp,
271                             aBtnHeader,
272                             aBtnUnique,
273                             aBtnCopyResult,
274                             aBtnDestPers,
275                             aLbCopyArea,
276                             aEdCopyArea,
277                             aRbCopyArea,
278                             aFtDbAreaLabel,
279                             aFtDbArea,
280                             aFlOptions,
281                             aStrNoName,
282                             aStrUndefined );
283 
284     // Feldlisten einlesen und Eintraege selektieren:
285 
286     FillFieldLists();
287 
288     for ( SCSIZE i=0; i<4; i++ )
289     {
290         String  aValStr;
291         sal_uInt16  nCondPos     = 0;
292         sal_uInt16  nFieldSelPos = 0;
293 
294         ScQueryEntry& rEntry = theQueryData.GetEntry(i);
295         if ( rEntry.bDoQuery )
296         {
297             nCondPos     = (sal_uInt16)rEntry.eOp;
298             nFieldSelPos = GetFieldSelPos( static_cast<SCCOL>(rEntry.nField) );
299             if ( rEntry.nVal == SC_EMPTYFIELDS && !rEntry.bQueryByString && *rEntry.pStr == EMPTY_STRING )
300             {
301                 aValStr = aStrEmpty;
302                 aCondLbArr[i]->Disable();
303             }
304             else if ( rEntry.nVal == SC_NONEMPTYFIELDS && !rEntry.bQueryByString && *rEntry.pStr == EMPTY_STRING )
305             {
306                 aValStr = aStrNotEmpty;
307                 aCondLbArr[i]->Disable();
308             }
309             else
310                 aValStr = *rEntry.pStr;
311         }
312         else if ( i == 0 )
313         {
314             nFieldSelPos = GetFieldSelPos( pViewData->GetCurX() );
315             rEntry.nField = nFieldSelPos ? (theQueryData.nCol1 +
316                 static_cast<SCCOL>(nFieldSelPos) - 1) : static_cast<SCCOL>(0);
317             rEntry.bDoQuery=sal_True;
318             bRefreshExceptQuery[i]=sal_True;
319 
320         }
321         aFieldLbArr[i]->SelectEntryPos( nFieldSelPos );
322         aCondLbArr [i]->SelectEntryPos( nCondPos );
323         aValueEdArr[i]->SetText( aValStr );
324         aValueEdArr[i]->SetModifyHdl( LINK( this, ScFilterDlg, ValModifyHdl ) );
325         UpdateValueList( static_cast<sal_uInt16>(i+1) );
326     }
327 
328     aScrollBar.SetEndScrollHdl( LINK( this, ScFilterDlg, ScrollHdl ) );
329     aScrollBar.SetScrollHdl( LINK( this, ScFilterDlg, ScrollHdl ) );
330 
331     aScrollBar.SetRange( Range( 0, 4 ) );
332     aScrollBar.SetLineSize( 1 );
333     aLbConnect1.Hide();
334     // Disable/Enable Logik:
335 
336        (aLbField1.GetSelectEntryPos() != 0)
337     && (aLbField2.GetSelectEntryPos() != 0)
338         ? aLbConnect2.SelectEntryPos( (sal_uInt16)theQueryData.GetEntry(1).eConnect )
339         : aLbConnect2.SetNoSelection();
340 
341        (aLbField2.GetSelectEntryPos() != 0)
342     && (aLbField3.GetSelectEntryPos() != 0)
343         ? aLbConnect3.SelectEntryPos( (sal_uInt16)theQueryData.GetEntry(2).eConnect )
344         : aLbConnect3.SetNoSelection();
345 
346        (aLbField3.GetSelectEntryPos() != 0)
347     && (aLbField4.GetSelectEntryPos() != 0)
348         ? aLbConnect4.SelectEntryPos( (sal_uInt16)theQueryData.GetEntry(3).eConnect )
349         : aLbConnect4.SetNoSelection();
350     if ( aLbField1.GetSelectEntryPos() == 0 )
351     {
352         aLbConnect2.Disable();
353         aLbField2.Disable();
354         aLbCond2.Disable();
355         aEdVal2.Disable();
356     }
357     else if ( aLbConnect2.GetSelectEntryCount() == 0 )
358     {
359         aLbField2.Disable();
360         aLbCond2.Disable();
361         aEdVal2.Disable();
362     }
363 
364     if ( aLbField2.GetSelectEntryPos() == 0 )
365     {
366         aLbConnect3.Disable();
367         aLbField3.Disable();
368         aLbCond3.Disable();
369         aEdVal3.Disable();
370     }
371     else if ( aLbConnect3.GetSelectEntryCount() == 0 )
372     {
373         aLbField3.Disable();
374         aLbCond3.Disable();
375         aEdVal3.Disable();
376     }
377     if ( aLbField3.GetSelectEntryPos() == 0 )
378     {
379         aLbConnect4.Disable();
380         aLbField4.Disable();
381         aLbCond4.Disable();
382         aEdVal4.Disable();
383     }
384     else if ( aLbConnect4.GetSelectEntryCount() == 0 )
385     {
386         aLbField4.Disable();
387         aLbCond4.Disable();
388         aEdVal4.Disable();
389     }
390 
391     if(pDoc!=NULL &&
392         pDoc->GetChangeTrack()!=NULL) aBtnCopyResult.Disable();
393     // Modal-Modus einschalten
394 //  SetDispatcherLock( sal_True );
395     //@BugID 54702 Enablen/Disablen nur noch in Basisklasse
396 //  SFX_APPWINDOW->Disable(sal_False);      //! allgemeine Methode im ScAnyRefDlg
397 }
398 
399 
400 //----------------------------------------------------------------------------
401 
402 sal_Bool __EXPORT ScFilterDlg::Close()
403 {
404     if (pViewData)
405         pViewData->GetDocShell()->CancelAutoDBRange();
406 
407     return DoClose( ScFilterDlgWrapper::GetChildWindowId() );
408 }
409 
410 
411 //----------------------------------------------------------------------------
412 // Uebergabe eines mit der Maus selektierten Tabellenbereiches, der dann als
413 // neue Selektion im Referenz-Edit angezeigt wird.
414 
415 void ScFilterDlg::SetReference( const ScRange& rRef, ScDocument* pDocP )
416 {
417     if ( bRefInputMode )    // Nur moeglich, wenn im Referenz-Editmodus
418     {
419         if ( rRef.aStart != rRef.aEnd )
420             RefInputStart( &aEdCopyArea );
421         String aRefStr;
422         rRef.aStart.Format( aRefStr, SCA_ABS_3D, pDocP, pDocP->GetAddressConvention() );
423         aEdCopyArea.SetRefString( aRefStr );
424     }
425 }
426 
427 
428 //----------------------------------------------------------------------------
429 
430 void ScFilterDlg::SetActive()
431 {
432     if ( bRefInputMode )
433     {
434         aEdCopyArea.GrabFocus();
435         if ( aEdCopyArea.GetModifyHdl().IsSet() )
436             ((Link&)aEdCopyArea.GetModifyHdl()).Call( &aEdCopyArea );
437     }
438     else
439         GrabFocus();
440 
441     RefInputDone();
442 }
443 
444 //----------------------------------------------------------------------------
445 
446 void ScFilterDlg::FillFieldLists()
447 {
448     aLbField1.Clear();
449     aLbField2.Clear();
450     aLbField3.Clear();
451     aLbField4.Clear();
452     aLbField1.InsertEntry( aStrNone, 0 );
453     aLbField2.InsertEntry( aStrNone, 0 );
454     aLbField3.InsertEntry( aStrNone, 0 );
455     aLbField4.InsertEntry( aStrNone, 0 );
456 
457     if ( pDoc )
458     {
459         String  aFieldName;
460         SCTAB   nTab        = nSrcTab;
461         SCCOL   nFirstCol   = theQueryData.nCol1;
462         SCROW   nFirstRow   = theQueryData.nRow1;
463         SCCOL   nMaxCol     = theQueryData.nCol2;
464         SCCOL   col = 0;
465         sal_uInt16  i=1;
466 
467         for ( col=nFirstCol; col<=nMaxCol; col++ )
468         {
469             pDoc->GetString( col, nFirstRow, nTab, aFieldName );
470             if ( !aBtnHeader.IsChecked() || (aFieldName.Len() == 0) )
471             {
472                 aFieldName  = aStrColumn;
473                 aFieldName += ' ';
474                 aFieldName += ScColToAlpha( col );
475             }
476             aLbField1.InsertEntry( aFieldName, i );
477             aLbField2.InsertEntry( aFieldName, i );
478             aLbField3.InsertEntry( aFieldName, i );
479             aLbField4.InsertEntry( aFieldName, i );
480             i++;
481         }
482         nFieldCount = i;
483     }
484 }
485 
486 
487 //----------------------------------------------------------------------------
488 
489 void ScFilterDlg::UpdateValueList( sal_uInt16 nList )
490 {
491     if ( pDoc && nList>0 && nList<=4 )
492     {
493         ComboBox*   pValList        = aValueEdArr[nList-1];
494         sal_uInt16      nFieldSelPos    = aFieldLbArr[nList-1]->GetSelectEntryPos();
495         sal_uInt16      nListPos        = 0;
496         String      aCurValue       = pValList->GetText();
497 
498         pValList->Clear();
499         pValList->InsertEntry( aStrNotEmpty, 0 );
500         pValList->InsertEntry( aStrEmpty, 1 );
501         nListPos = 2;
502 
503         if ( nFieldSelPos )
504         {
505             WaitObject aWaiter( this );     // auch wenn nur die ListBox gefuellt wird
506 
507             SCCOL nColumn = theQueryData.nCol1 + static_cast<SCCOL>(nFieldSelPos) - 1;
508             if (!pEntryLists[nColumn])
509             {
510                 sal_uInt16 nOffset = GetSliderPos();
511                 SCTAB nTab       = nSrcTab;
512                 SCROW nFirstRow = theQueryData.nRow1;
513                 SCROW nLastRow   = theQueryData.nRow2;
514                 mbHasDates[nOffset+nList-1] = false;
515 
516                 //  erstmal ohne die erste Zeile
517 
518                 pEntryLists[nColumn] = new TypedScStrCollection( 128, 128 );
519                 pEntryLists[nColumn]->SetCaseSensitive( aBtnCase.IsChecked() );
520                 pDoc->GetFilterEntriesArea( nColumn, nFirstRow+1, nLastRow,
521                                             nTab, *pEntryLists[nColumn], mbHasDates[nOffset+nList-1] );
522 
523                 //  Eintrag fuer die erste Zeile
524                 //! Eintrag (pHdrEntry) ohne Collection erzeugen?
525 
526                 nHeaderPos[nColumn] = USHRT_MAX;
527                 TypedScStrCollection aHdrColl( 1, 1 );
528                 bool bDummy = false;
529                 pDoc->GetFilterEntriesArea( nColumn, nFirstRow, nFirstRow,
530                                             nTab, aHdrColl, bDummy );
531                 TypedStrData* pHdrEntry = aHdrColl[0];
532                 if ( pHdrEntry )
533                 {
534                     TypedStrData* pNewEntry = new TypedStrData(*pHdrEntry);
535                     if ( pEntryLists[nColumn]->Insert( pNewEntry ) )
536                     {
537                         nHeaderPos[nColumn] = pEntryLists[nColumn]->IndexOf( pNewEntry );
538                         DBG_ASSERT( nHeaderPos[nColumn] != USHRT_MAX,
539                                     "Header-Eintrag nicht wiedergefunden" );
540                     }
541                     else
542                         delete pNewEntry;           // war schon drin
543                 }
544             }
545 
546             TypedScStrCollection* pColl = pEntryLists[nColumn];
547             sal_uInt16 nValueCount = pColl->GetCount();
548             if ( nValueCount > 0 )
549             {
550                 for ( sal_uInt16 i=0; i<nValueCount; i++ )
551                 {
552                     pValList->InsertEntry( (*pColl)[i]->GetString(), nListPos );
553                     nListPos++;
554                 }
555             }
556         }
557         pValList->SetText( aCurValue );
558     }
559 
560     UpdateHdrInValueList( nList );
561 }
562 
563 void ScFilterDlg::UpdateHdrInValueList( sal_uInt16 nList )
564 {
565     //! GetText / SetText ??
566 
567     if ( pDoc && nList>0 && nList<=4 )
568     {
569         sal_uInt16 nFieldSelPos = aFieldLbArr[nList-1]->GetSelectEntryPos();
570         if ( nFieldSelPos )
571         {
572             SCCOL nColumn = theQueryData.nCol1 + static_cast<SCCOL>(nFieldSelPos) - 1;
573             if ( pEntryLists[nColumn] )
574             {
575                 sal_uInt16 nPos = nHeaderPos[nColumn];
576                 if ( nPos != USHRT_MAX )
577                 {
578                     ComboBox* pValList = aValueEdArr[nList-1];
579                     sal_uInt16 nListPos = nPos + 2;                 // nach "leer" und "nicht leer"
580 
581                     TypedStrData* pHdrEntry = (*pEntryLists[nColumn])[nPos];
582                     if ( pHdrEntry )
583                     {
584                         String aHdrStr = pHdrEntry->GetString();
585                         sal_Bool bWasThere = ( pValList->GetEntry(nListPos) == aHdrStr );
586                         sal_Bool bInclude = !aBtnHeader.IsChecked();
587 
588                         if (bInclude)           // Eintrag aufnehmen
589                         {
590                             if (!bWasThere)
591                                 pValList->InsertEntry(aHdrStr, nListPos);
592                         }
593                         else                    // Eintrag weglassen
594                         {
595                             if (bWasThere)
596                                 pValList->RemoveEntry(nListPos);
597                         }
598                     }
599                     else
600                     {
601                         DBG_ERROR("Eintag in Liste nicht gefunden");
602                     }
603                 }
604             }
605             else
606             {
607                 DBG_ERROR("Spalte noch nicht initialisiert");
608             }
609         }
610     }
611 }
612 
613 //----------------------------------------------------------------------------
614 
615 void ScFilterDlg::ClearValueList( sal_uInt16 nList )
616 {
617     if ( nList>0 && nList<=4 )
618     {
619         ComboBox* pValList = aValueEdArr[nList-1];
620         pValList->Clear();
621         pValList->InsertEntry( aStrNotEmpty, 0 );
622         pValList->InsertEntry( aStrEmpty, 1 );
623         pValList->SetText( EMPTY_STRING );
624     }
625 }
626 
627 
628 //----------------------------------------------------------------------------
629 
630 sal_uInt16 ScFilterDlg::GetFieldSelPos( SCCOL nField )
631 {
632     if ( nField >= theQueryData.nCol1 && nField <= theQueryData.nCol2 )
633         return static_cast<sal_uInt16>(nField - theQueryData.nCol1 + 1);
634     else
635         return 0;
636 }
637 
638 //----------------------------------------------------------------------------
639 
640 ScQueryItem* ScFilterDlg::GetOutputItem()
641 {
642     ScAddress       theCopyPos;
643     ScQueryParam    theParam( theQueryData );
644     sal_Bool            bCopyPosOk = sal_False;
645 
646     if ( aBtnCopyResult.IsChecked() )
647     {
648         String theCopyStr( aEdCopyArea.GetText() );
649         xub_StrLen nColonPos = theCopyStr.Search( ':' );
650 
651         if ( STRING_NOTFOUND != nColonPos )
652             theCopyStr.Erase( nColonPos );
653 
654         sal_uInt16 nResult = theCopyPos.Parse( theCopyStr, pDoc, pDoc->GetAddressConvention() );
655         bCopyPosOk = ( SCA_VALID == (nResult & SCA_VALID) );
656     }
657 
658     if ( aBtnCopyResult.IsChecked() && bCopyPosOk )
659     {
660         theParam.bInplace   = sal_False;
661         theParam.nDestTab   = theCopyPos.Tab();
662         theParam.nDestCol   = theCopyPos.Col();
663         theParam.nDestRow   = theCopyPos.Row();
664     }
665     else
666     {
667         theParam.bInplace   = sal_True;
668         theParam.nDestTab   = 0;
669         theParam.nDestCol   = 0;
670         theParam.nDestRow   = 0;
671     }
672 
673     theParam.bHasHeader     = aBtnHeader.IsChecked();
674     theParam.bByRow         = sal_True;
675     theParam.bDuplicate     = !aBtnUnique.IsChecked();
676     theParam.bCaseSens      = aBtnCase.IsChecked();
677     theParam.bRegExp        = aBtnRegExp.IsChecked();
678     theParam.bDestPers      = aBtnDestPers.IsChecked();
679 
680     //  nur die drei eingestellten - alles andere zuruecksetzen
681 
682     DELETEZ( pOutItem );
683     pOutItem = new ScQueryItem( nWhichQuery, &theParam );
684 
685     return pOutItem;
686 }
687 
688 
689 //----------------------------------------------------------------------------
690 
691 sal_Bool ScFilterDlg::IsRefInputMode() const
692 {
693     return bRefInputMode;
694 }
695 
696 
697 //----------------------------------------------------------------------------
698 // Handler:
699 // ========
700 
701 IMPL_LINK( ScFilterDlg, EndDlgHdl, Button*, pBtn )
702 {
703     if ( pBtn == &aBtnOk )
704     {
705         sal_Bool bAreaInputOk = sal_True;
706 
707         if ( aBtnCopyResult.IsChecked() )
708         {
709             if ( !pOptionsMgr->VerifyPosStr( aEdCopyArea.GetText() ) )
710             {
711                 if ( !aBtnMore.GetState() )
712                     aBtnMore.SetState( sal_True );
713 
714                 ERRORBOX( STR_INVALID_TABREF );
715                 aEdCopyArea.GrabFocus();
716                 bAreaInputOk = sal_False;
717             }
718         }
719 
720         if ( bAreaInputOk )
721         {
722             SetDispatcherLock( sal_False );
723             SwitchToDocument();
724             GetBindings().GetDispatcher()->Execute( FID_FILTER_OK,
725                                       SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD,
726                                       GetOutputItem(), 0L, 0L );
727             Close();
728         }
729     }
730     else if ( pBtn == &aBtnCancel )
731     {
732         Close();
733     }
734 
735     return 0;
736 }
737 
738 
739 //----------------------------------------------------------------------------
740 
741 IMPL_LINK( ScFilterDlg, MoreClickHdl, MoreButton*, EMPTYARG )
742 {
743     if ( aBtnMore.GetState() )
744         pTimer->Start();
745     else
746     {
747         pTimer->Stop();
748         bRefInputMode = sal_False;
749         //@BugID 54702 Enablen/Disablen nur noch in Basisklasse
750         //SFX_APPWINDOW->Disable(sal_False);        //! allgemeine Methode im ScAnyRefDlg
751     }
752     return 0;
753 }
754 
755 
756 //----------------------------------------------------------------------------
757 
758 IMPL_LINK( ScFilterDlg, TimeOutHdl, Timer*, _pTimer )
759 {
760     // alle 50ms nachschauen, ob RefInputMode noch stimmt
761 
762     if( _pTimer == pTimer && IsActive() )
763         bRefInputMode = (aEdCopyArea.HasFocus() || aRbCopyArea.HasFocus());
764 
765     if ( aBtnMore.GetState() )
766         pTimer->Start();
767 
768     return 0;
769 }
770 
771 
772 //----------------------------------------------------------------------------
773 
774 IMPL_LINK( ScFilterDlg, LbSelectHdl, ListBox*, pLb )
775 {
776     /*
777      * Behandlung der Enable/Disable-Logik,
778      * abhaengig davon, welche ListBox angefasst wurde:
779      */
780     sal_uInt16 nOffset = GetSliderPos();
781 
782     if ( pLb == &aLbConnect1 )
783     {
784         aLbField1.Enable();
785         aLbCond1.Enable();
786         aEdVal1.Enable();
787 
788         sal_uInt16  nConnect1 = aLbConnect1.GetSelectEntryPos();
789         sal_uInt16 nQE = nOffset;
790         theQueryData.GetEntry(nQE).eConnect =(ScQueryConnect)nConnect1;
791         bRefreshExceptQuery[nQE]=sal_True;
792     }
793 
794     else if ( pLb == &aLbConnect2 )
795     {
796         aLbField2.Enable();
797         aLbCond2.Enable();
798         aEdVal2.Enable();
799 
800         sal_uInt16  nConnect2 = aLbConnect2.GetSelectEntryPos();
801         sal_uInt16 nQE = 1+nOffset;
802         theQueryData.GetEntry(nQE).eConnect =(ScQueryConnect)nConnect2;
803          bRefreshExceptQuery[nQE]=sal_True;
804     }
805     else if ( pLb == &aLbConnect3 )
806     {
807         aLbField3.Enable();
808         aLbCond3.Enable();
809         aEdVal3.Enable();
810 
811         sal_uInt16  nConnect3 = aLbConnect3.GetSelectEntryPos();
812         sal_uInt16 nQE = 2+nOffset;
813         theQueryData.GetEntry(nQE).eConnect = (ScQueryConnect)nConnect3;
814         bRefreshExceptQuery[nQE]=sal_True;
815 
816     }
817     else if ( pLb == &aLbConnect4 )
818     {
819         aLbField4.Enable();
820         aLbCond4.Enable();
821         aEdVal4.Enable();
822 
823         sal_uInt16  nConnect4 = aLbConnect4.GetSelectEntryPos();
824         sal_uInt16 nQE = 3+nOffset;
825         theQueryData.GetEntry(nQE).eConnect = (ScQueryConnect)nConnect4;
826         bRefreshExceptQuery[nQE]=sal_True;
827 
828     }
829     else if ( pLb == &aLbField1 )
830     {
831         if ( aLbField1.GetSelectEntryPos() == 0 )
832         {
833             aLbConnect2.SetNoSelection();
834             aLbConnect3.SetNoSelection();
835             aLbConnect4.SetNoSelection();
836             aLbField2.SelectEntryPos( 0 );
837             aLbField3.SelectEntryPos( 0 );
838             aLbField4.SelectEntryPos( 0 );
839             aLbCond2.SelectEntryPos( 0 );
840             aLbCond3.SelectEntryPos( 0 );
841             aLbCond4.SelectEntryPos( 0 );
842             ClearValueList( 1 );
843             ClearValueList( 2 );
844             ClearValueList( 3 );
845             ClearValueList( 4 );
846 
847             aLbConnect2.Disable();
848             aLbConnect3.Disable();
849             aLbConnect4.Disable();
850             aLbField2.Disable();
851             aLbField3.Disable();
852             aLbField4.Disable();
853             aLbCond2.Disable();
854             aLbCond3.Disable();
855             aLbCond4.Disable();
856             aEdVal2.Disable();
857             aEdVal3.Disable();
858             aEdVal4.Disable();
859             for (sal_uInt16 i= nOffset; i< MAXQUERY; i++)
860             {
861                 theQueryData.GetEntry(i).bDoQuery = sal_False;
862                 bRefreshExceptQuery[i]=sal_False;
863                 theQueryData.GetEntry(i).nField =  static_cast<SCCOL>(0);
864             }
865             bRefreshExceptQuery[nOffset] =sal_True;
866         }
867         else
868         {
869             UpdateValueList( 1 );
870             if ( !aLbConnect2.IsEnabled() )
871             {
872                 aLbConnect2.Enable();
873             }
874             theQueryData.GetEntry(nOffset).bDoQuery = sal_True;
875             sal_uInt16  nField  = pLb->GetSelectEntryPos();
876             theQueryData.GetEntry(nOffset).nField = theQueryData.nCol1 + static_cast<SCCOL>(nField) - 1 ;
877         }
878     }
879     else if ( pLb == &aLbField2 )
880     {
881         if ( aLbField2.GetSelectEntryPos() == 0 )
882         {
883             aLbConnect3.SetNoSelection();
884             aLbConnect4.SetNoSelection();
885             aLbField3.SelectEntryPos( 0 );
886             aLbField4.SelectEntryPos( 0 );
887             aLbCond3.SelectEntryPos( 0 );
888             aLbCond4.SelectEntryPos( 0 );
889             ClearValueList( 2 );
890             ClearValueList( 3 );
891             ClearValueList( 4 );
892 
893             aLbConnect3.Disable();
894             aLbConnect4.Disable();
895             aLbField3.Disable();
896             aLbField4.Disable();
897             aLbCond3.Disable();
898             aLbCond4.Disable();
899             aEdVal3.Disable();
900             aEdVal4.Disable();
901 
902             sal_uInt16 nTemp=nOffset+1;
903             for (sal_uInt16 i= nTemp; i< MAXQUERY; i++)
904             {
905                 theQueryData.GetEntry(i).bDoQuery = sal_False;
906                 bRefreshExceptQuery[i]=sal_False;
907                 theQueryData.GetEntry(i).nField =  static_cast<SCCOL>(0);
908             }
909             bRefreshExceptQuery[nTemp]=sal_True;
910         }
911         else
912         {
913             UpdateValueList( 2 );
914             if ( !aLbConnect3.IsEnabled() )
915             {
916                 aLbConnect3.Enable();
917             }
918             sal_uInt16  nField  = pLb->GetSelectEntryPos();
919             sal_uInt16 nQ=1+nOffset;
920             theQueryData.GetEntry(nQ).bDoQuery = sal_True;
921             theQueryData.GetEntry(nQ).nField = theQueryData.nCol1 + static_cast<SCCOL>(nField) - 1 ;
922         }
923     }
924     else if ( pLb == &aLbField3 )
925     {
926         if ( aLbField3.GetSelectEntryPos() == 0 )
927         {
928             aLbConnect4.SetNoSelection();
929             aLbField4.SelectEntryPos( 0 );
930             aLbCond4.SelectEntryPos( 0 );
931             ClearValueList( 3 );
932             ClearValueList( 4 );
933 
934             aLbConnect4.Disable();
935             aLbField4.Disable();
936             aLbCond4.Disable();
937             aEdVal4.Disable();
938 
939             sal_uInt16 nTemp=nOffset+2;
940             for (sal_uInt16 i= nTemp; i< MAXQUERY; i++)
941             {
942                 theQueryData.GetEntry(i).bDoQuery = sal_False;
943                 bRefreshExceptQuery[i]=sal_False;
944                 theQueryData.GetEntry(i).nField =  static_cast<SCCOL>(0);
945             }
946             bRefreshExceptQuery[nTemp]=sal_True;
947         }
948         else
949         {
950             UpdateValueList( 3 );
951             if ( !aLbConnect4.IsEnabled() )
952             {
953                 aLbConnect4.Enable();
954             }
955 
956             sal_uInt16  nField  = pLb->GetSelectEntryPos();
957             sal_uInt16 nQ=2+nOffset;
958             theQueryData.GetEntry(nQ).bDoQuery = sal_True;
959             theQueryData.GetEntry(nQ).nField = theQueryData.nCol1 + static_cast<SCCOL>(nField) - 1 ;
960 
961         }
962     }
963     else if ( pLb == &aLbField4 )
964     {
965         if ( aLbField4.GetSelectEntryPos() == 0 )
966         {
967             ClearValueList( 4 );
968             sal_uInt16 nTemp=nOffset+3;
969             for (sal_uInt16 i= nTemp; i< MAXQUERY; i++)
970             {
971                 theQueryData.GetEntry(i).bDoQuery = sal_False;
972                 bRefreshExceptQuery[i]=sal_False;
973                 theQueryData.GetEntry(i).nField =  static_cast<SCCOL>(0);
974             }
975             bRefreshExceptQuery[nTemp]=sal_True;
976         }
977         else
978         {
979             UpdateValueList( 4 );
980             sal_uInt16  nField  = pLb->GetSelectEntryPos();
981             sal_uInt16 nQ=3+nOffset;
982             theQueryData.GetEntry(nQ).bDoQuery = sal_True;
983             theQueryData.GetEntry(nQ).nField = theQueryData.nCol1 + static_cast<SCCOL>(nField) - 1 ;
984         }
985 
986     }
987     else if ( pLb == &aLbCond1)
988     {
989         theQueryData.GetEntry(nOffset).eOp=(ScQueryOp)pLb->GetSelectEntryPos();
990     }
991     else if ( pLb == &aLbCond2)
992     {
993         sal_uInt16 nQ=1+nOffset;
994         theQueryData.GetEntry(nQ).eOp=(ScQueryOp)pLb->GetSelectEntryPos();
995     }
996     else if ( pLb == &aLbCond3)
997     {
998         sal_uInt16 nQ=2+nOffset;
999         theQueryData.GetEntry(nQ).eOp=(ScQueryOp)pLb->GetSelectEntryPos();
1000     }
1001     else
1002     {
1003         sal_uInt16 nQ=3+nOffset;
1004         theQueryData.GetEntry(nQ).eOp=(ScQueryOp)pLb->GetSelectEntryPos();
1005     }
1006 
1007     return 0;
1008 }
1009 
1010 
1011 //----------------------------------------------------------------------------
1012 
1013 IMPL_LINK( ScFilterDlg, CheckBoxHdl, CheckBox*, pBox )
1014 {
1015     //  Spaltenkoepfe:
1016     //      FeldListen: Spaltexx <-> Spaltenkopf-String
1017     //      WertListen: Spaltenkopf-Wert entfaellt.
1018     //  Gross-/Kleinschreibung:
1019     //      WertListen: komplett neu
1020 
1021     if ( pBox == &aBtnHeader )              // Feldlisten und Wertlisten
1022     {
1023         sal_uInt16 nCurSel1 = aLbField1.GetSelectEntryPos();
1024         sal_uInt16 nCurSel2 = aLbField2.GetSelectEntryPos();
1025         sal_uInt16 nCurSel3 = aLbField3.GetSelectEntryPos();
1026         sal_uInt16 nCurSel4 = aLbField4.GetSelectEntryPos();
1027         FillFieldLists();
1028         aLbField1.SelectEntryPos( nCurSel1 );
1029         aLbField2.SelectEntryPos( nCurSel2 );
1030         aLbField3.SelectEntryPos( nCurSel3 );
1031         aLbField4.SelectEntryPos( nCurSel4 );
1032 
1033         UpdateHdrInValueList( 1 );
1034         UpdateHdrInValueList( 2 );
1035         UpdateHdrInValueList( 3 );
1036         UpdateHdrInValueList( 4 );
1037     }
1038 
1039     if ( pBox == &aBtnCase )            // Wertlisten komplett
1040     {
1041         for (sal_uInt16 i=0; i<=MAXCOL; i++)
1042             DELETEZ( pEntryLists[i] );
1043 
1044         UpdateValueList( 1 );       // aktueller Text wird gemerkt
1045         UpdateValueList( 2 );
1046         UpdateValueList( 3 );
1047         UpdateValueList( 4 );
1048     }
1049 
1050     return 0;
1051 }
1052 
1053 
1054 //----------------------------------------------------------------------------
1055 
1056 IMPL_LINK( ScFilterDlg, ValModifyHdl, ComboBox*, pEd )
1057 {
1058     sal_uInt16   nOffset = GetSliderPos();
1059     sal_uInt16   i=0;
1060     sal_uInt16   nQE =i + nOffset;
1061     if ( pEd )
1062     {
1063         String    aStrVal   = pEd->GetText();
1064         ListBox*  pLbCond   = &aLbCond1;
1065         ListBox*  pLbField  = &aLbField1;
1066         if ( pEd == &aEdVal2 )
1067         {
1068             pLbCond  = &aLbCond2;
1069             pLbField = &aLbField2;
1070             i=1;
1071             nQE=i+nOffset;
1072         }
1073         if ( pEd == &aEdVal3 )
1074         {
1075             pLbCond = &aLbCond3;
1076             pLbField = &aLbField3;
1077             i=2;
1078             nQE=i+nOffset;
1079         }
1080         if ( pEd == &aEdVal4 )
1081         {
1082             pLbCond = &aLbCond4;
1083             pLbField = &aLbField4;
1084             i=3;
1085             nQE=i+nOffset;
1086         }
1087 
1088         if ( aStrEmpty == aStrVal || aStrNotEmpty == aStrVal )
1089         {
1090             pLbCond->SelectEntry( '=' );
1091             pLbCond->Disable();
1092         }
1093         else
1094             pLbCond->Enable();
1095 
1096         ScQueryEntry& rEntry = theQueryData.GetEntry( nQE );
1097         sal_Bool bDoThis = (pLbField->GetSelectEntryPos() != 0);
1098         rEntry.bDoQuery = bDoThis;
1099 
1100         if ( rEntry.bDoQuery || bRefreshExceptQuery[nQE] )
1101         {
1102             if ( aStrVal == aStrEmpty )
1103             {
1104                 rEntry.pStr->Erase();
1105                 rEntry.nVal = SC_EMPTYFIELDS;
1106                 rEntry.bQueryByString = sal_False;
1107             }
1108             else if ( aStrVal == aStrNotEmpty )
1109             {
1110                 rEntry.pStr->Erase();
1111                 rEntry.nVal = SC_NONEMPTYFIELDS;
1112                 rEntry.bQueryByString = sal_False;
1113             }
1114             else
1115             {
1116                 *rEntry.pStr          = aStrVal;
1117                 rEntry.nVal           = 0;
1118                 rEntry.bQueryByString = sal_True;
1119             }
1120 
1121             sal_uInt16  nField  = pLbField->GetSelectEntryPos();
1122             rEntry.nField = nField ? (theQueryData.nCol1 +
1123                 static_cast<SCCOL>(nField) - 1) : static_cast<SCCOL>(0);
1124 
1125             ScQueryOp eOp  = (ScQueryOp)pLbCond->GetSelectEntryPos();
1126             rEntry.eOp     = eOp;
1127             rEntry.bQueryByDate = mbHasDates[nQE];
1128 
1129         }
1130     }
1131     return 0;
1132 }
1133 
1134 //----------------------------------------------------------------------------
1135 IMPL_LINK( ScFilterDlg, ScrollHdl, ScrollBar*, EMPTYARG )
1136 {
1137     SliderMoved();
1138     return 0;
1139 }
1140 
1141 void ScFilterDlg::SliderMoved()
1142 {
1143     sal_uInt16 nOffset = GetSliderPos();
1144     RefreshEditRow( nOffset);
1145 }
1146 sal_uInt16 ScFilterDlg::GetSliderPos()
1147 {
1148     return (sal_uInt16) aScrollBar.GetThumbPos();
1149 }
1150 void ScFilterDlg::RefreshEditRow( sal_uInt16 nOffset )
1151 {
1152     if (nOffset==0)
1153         aConnLbArr[0]->Hide();
1154     else
1155         aConnLbArr[0]->Show();
1156 
1157     for ( sal_uInt16 i=0; i<4; i++ )
1158     {
1159         String  aValStr;
1160         sal_uInt16  nCondPos     = 0;
1161         sal_uInt16  nFieldSelPos = 0;
1162         sal_uInt16  nQE = i+nOffset;
1163 
1164         ScQueryEntry& rEntry = theQueryData.GetEntry( nQE);
1165         if ( rEntry.bDoQuery || bRefreshExceptQuery[nQE] )
1166         {
1167             nCondPos     = (sal_uInt16)rEntry.eOp;
1168             if(rEntry.bDoQuery)
1169                nFieldSelPos = GetFieldSelPos( static_cast<SCCOL>(rEntry.nField) );
1170 
1171             if ( rEntry.nVal == SC_EMPTYFIELDS && !rEntry.bQueryByString && *rEntry.pStr == EMPTY_STRING )
1172             {
1173                 aValStr = aStrEmpty;
1174                 aCondLbArr[i]->Disable();
1175             }
1176             else if ( rEntry.nVal == SC_NONEMPTYFIELDS && !rEntry.bQueryByString && *rEntry.pStr == EMPTY_STRING )
1177             {
1178                 aValStr = aStrNotEmpty;
1179                 aCondLbArr[i]->Disable();
1180             }
1181             else
1182             {
1183                 aValStr = *rEntry.pStr;
1184                 aCondLbArr[i]->Enable();
1185             }
1186             aFieldLbArr[i]->Enable();
1187             aValueEdArr[i]->Enable();
1188 
1189             if (nOffset==0)
1190             {
1191                 if (i<3)
1192                 {
1193                     if(rEntry.bDoQuery)
1194                         aConnLbArr[i+1]->Enable();
1195                     else
1196                         aConnLbArr[i+1]->Disable();
1197                     sal_uInt16 nQENext = nQE+1;
1198                     if(theQueryData.GetEntry(nQENext).bDoQuery || bRefreshExceptQuery[nQENext])
1199                         aConnLbArr[i+1]->SelectEntryPos( (sal_uInt16) theQueryData.GetEntry(nQENext).eConnect );
1200                     else
1201                         aConnLbArr[i+1]->SetNoSelection();
1202                 }
1203             }
1204             else
1205             {
1206                 if(theQueryData.GetEntry( nQE-1).bDoQuery)
1207                     aConnLbArr[i]->Enable();
1208                 else
1209                     aConnLbArr[i]->Disable();
1210 
1211                 if(rEntry.bDoQuery || bRefreshExceptQuery[nQE])
1212                     aConnLbArr[i]->SelectEntryPos( (sal_uInt16) rEntry.eConnect );
1213                 else
1214                     aConnLbArr[i]->SetNoSelection();
1215             }
1216 
1217         }
1218         else
1219         {
1220             if (nOffset==0)
1221             {
1222                 if(i<3)
1223                 {
1224                     aConnLbArr[i+1]->SetNoSelection();
1225                     aConnLbArr[i+1]->Disable();
1226                 }
1227             }
1228             else
1229             {
1230                 if(theQueryData.GetEntry( nQE-1).bDoQuery)
1231                     aConnLbArr[i]->Enable();
1232                 else
1233                     aConnLbArr[i]->Disable();
1234                 aConnLbArr[i]->SetNoSelection();
1235             }
1236             aFieldLbArr[i]->Disable();
1237             aCondLbArr[i]->Disable();
1238             aValueEdArr[i]->Disable();
1239         }
1240         aFieldLbArr[i]->SelectEntryPos( nFieldSelPos );
1241         aCondLbArr [i]->SelectEntryPos( nCondPos );
1242         aValueEdArr[i]->SetText( aValStr );
1243         UpdateValueList( static_cast<sal_uInt16>(i+1) );
1244     }
1245 }
1246