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