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 <rangelst.hxx>
21 : #include <sfx2/dispatch.hxx>
22 : #include <vcl/waitobj.hxx>
23 :
24 : #include "uiitems.hxx"
25 : #include "dbdata.hxx"
26 : #include "reffact.hxx"
27 : #include "viewdata.hxx"
28 : #include "document.hxx"
29 : #include "docsh.hxx"
30 : #include "scresid.hxx"
31 : #include "queryentry.hxx"
32 :
33 : #include "foptmgr.hxx"
34 :
35 : #include "globstr.hrc"
36 : #include "filter.hrc"
37 :
38 : #include "filtdlg.hxx"
39 : #include <vcl/layout.hxx>
40 : #include <svl/sharedstringpool.hxx>
41 :
42 : #include <limits>
43 :
44 : #define ERRORBOX(rid) ScopedVclPtrInstance<MessageDialog>::Create(this, ScGlobal::GetRscString(rid))->Execute()
45 :
46 : #define QUERY_ENTRY_COUNT 4
47 : #define INVALID_HEADER_POS std::numeric_limits<size_t>::max()
48 :
49 0 : ScFilterDlg::EntryList::EntryList() :
50 0 : mnHeaderPos(INVALID_HEADER_POS) {}
51 :
52 0 : ScFilterDlg::ScFilterDlg(SfxBindings* pB, SfxChildWindow* pCW, vcl::Window* pParent,
53 : const SfxItemSet& rArgSet)
54 : : ScAnyRefDlg ( pB, pCW, pParent, "StandardFilterDialog",
55 : "modules/scalc/ui/standardfilterdialog.ui" )
56 : , aStrUndefined(SC_RESSTR(SCSTR_UNDEFINED))
57 : , aStrNone(SC_RESSTR(SCSTR_NONE))
58 : , aStrEmpty(SC_RESSTR(SCSTR_FILTER_EMPTY))
59 : , aStrNotEmpty(SC_RESSTR(SCSTR_FILTER_NOTEMPTY))
60 : , aStrColumn(SC_RESSTR(SCSTR_COLUMN))
61 : , pOptionsMgr(NULL)
62 0 : , nWhichQuery(rArgSet.GetPool()->GetWhich(SID_QUERY))
63 0 : , theQueryData(static_cast<const ScQueryItem&>(rArgSet.Get(nWhichQuery)).GetQueryData())
64 : , pOutItem(NULL)
65 : , pViewData(NULL)
66 : , pDoc(NULL)
67 : , nSrcTab(0)
68 : , bRefInputMode(false)
69 0 : , pTimer(NULL)
70 : {
71 0 : get(pLbConnect1,"connect1");
72 0 : get(pLbField1,"field1");
73 0 : get(pLbCond1,"cond1");
74 0 : get(pEdVal1,"val1");
75 0 : get(pLbConnect2,"connect2");
76 0 : get(pLbField2,"field2");
77 0 : get(pLbCond2,"cond2");
78 0 : get(pEdVal2,"val2");
79 0 : get(pLbConnect3,"connect3");
80 0 : get(pLbField3,"field3");
81 0 : get(pLbCond3,"cond3");
82 0 : get(pEdVal3,"val3");
83 0 : get(pLbConnect4,"connect4");
84 0 : get(pLbField4,"field4");
85 0 : get(pLbCond4,"cond4");
86 0 : get(pEdVal4,"val4");
87 0 : get(pScrollBar,"scrollbar");
88 0 : get(pExpander,"more");
89 0 : pExpander->SetExpandedHdl(LINK(this, ScFilterDlg, MoreExpandedHdl));
90 0 : get(pBtnOk,"ok");
91 0 : get(pBtnCancel,"cancel");
92 0 : get(pBtnCase,"case");
93 0 : get(pBtnRegExp,"regexp");
94 0 : get(pBtnHeader,"header");
95 0 : get(pBtnUnique,"unique");
96 0 : get(pBtnCopyResult,"copyresult");
97 0 : get(pLbCopyArea,"lbcopyarea");
98 0 : get(pEdCopyArea,"edcopyarea");
99 0 : pEdCopyArea->SetReferences(this, pBtnCopyResult);
100 0 : get(pRbCopyArea,"rbcopyarea");
101 0 : pRbCopyArea->SetReferences(this, pEdCopyArea);
102 0 : get(pBtnDestPers,"destpers");
103 0 : get(pFtDbAreaLabel,"dbarealabel");
104 0 : get(pFtDbArea,"dbarea");
105 :
106 0 : Init( rArgSet );
107 :
108 : // Hack: RefInput control
109 0 : pTimer = new Timer;
110 0 : pTimer->SetTimeout( 50 ); // Wait 50ms
111 0 : pTimer->SetTimeoutHdl( LINK( this, ScFilterDlg, TimeOutHdl ) );
112 :
113 0 : OUStringBuffer aBuf;
114 :
115 0 : OUString sAccName = SC_RESSTR(RID_FILTER_OPERATOR);
116 0 : aBuf.append(sAccName);
117 0 : aBuf.append(" 1");
118 0 : pLbConnect1->SetAccessibleName(aBuf.makeStringAndClear());
119 0 : aBuf.append(sAccName);
120 0 : aBuf.append(" 2");
121 0 : pLbConnect2->SetAccessibleName(aBuf.makeStringAndClear());
122 :
123 0 : sAccName = SC_RESSTR(RID_FILTER_FIELDNAME);
124 0 : aBuf.append(sAccName);
125 0 : aBuf.append(" 1");
126 0 : pLbField1->SetAccessibleName(aBuf.makeStringAndClear());
127 0 : aBuf.append(sAccName);
128 0 : aBuf.append(" 2");
129 0 : pLbField2->SetAccessibleName(aBuf.makeStringAndClear());
130 0 : aBuf.append(sAccName);
131 0 : aBuf.append(" 3");
132 0 : pLbField3->SetAccessibleName(aBuf.makeStringAndClear());
133 :
134 0 : sAccName = SC_RESSTR(RID_FILTER_CONDITION);
135 0 : aBuf.append(sAccName);
136 0 : aBuf.append(" 1");
137 0 : pLbCond1->SetAccessibleName(aBuf.makeStringAndClear());
138 0 : aBuf.append(sAccName);
139 0 : aBuf.append(" 2");
140 0 : pLbCond2->SetAccessibleName(aBuf.makeStringAndClear());
141 0 : aBuf.append(sAccName);
142 0 : aBuf.append(" 3");
143 0 : pLbCond3->SetAccessibleName(aBuf.makeStringAndClear());
144 :
145 0 : sAccName = SC_RESSTR(RID_FILTER_VALUE);
146 0 : aBuf.append(sAccName);
147 0 : aBuf.append(" 1");
148 0 : pEdVal1->SetAccessibleName(aBuf.makeStringAndClear());
149 0 : aBuf.append(sAccName);
150 0 : aBuf.append(" 2");
151 0 : pEdVal2->SetAccessibleName(aBuf.makeStringAndClear());
152 0 : aBuf.append(sAccName);
153 0 : aBuf.append(" 3");
154 0 : pEdVal3->SetAccessibleName(aBuf.makeStringAndClear());
155 :
156 0 : pLbCopyArea->SetAccessibleName(ScResId(STR_COPY_AREA_TO));
157 0 : pEdCopyArea->SetAccessibleName(ScResId(STR_COPY_AREA_TO));
158 :
159 0 : }
160 :
161 0 : ScFilterDlg::~ScFilterDlg()
162 : {
163 0 : disposeOnce();
164 0 : }
165 :
166 0 : void ScFilterDlg::dispose()
167 : {
168 0 : delete pOptionsMgr;
169 0 : delete pOutItem;
170 :
171 : // Hack: RefInput control
172 0 : pTimer->Stop();
173 0 : delete pTimer;
174 :
175 0 : pLbConnect1.clear();
176 0 : pLbField1.clear();
177 0 : pLbCond1.clear();
178 0 : pEdVal1.clear();
179 0 : pLbConnect2.clear();
180 0 : pLbField2.clear();
181 0 : pLbCond2.clear();
182 0 : pEdVal2.clear();
183 0 : pLbConnect3.clear();
184 0 : pLbField3.clear();
185 0 : pLbCond3.clear();
186 0 : pEdVal3.clear();
187 0 : pLbConnect4.clear();
188 0 : pLbField4.clear();
189 0 : pLbCond4.clear();
190 0 : pEdVal4.clear();
191 0 : pScrollBar.clear();
192 0 : pExpander.clear();
193 0 : pBtnOk.clear();
194 0 : pBtnCancel.clear();
195 0 : pBtnCase.clear();
196 0 : pBtnRegExp.clear();
197 0 : pBtnHeader.clear();
198 0 : pBtnUnique.clear();
199 0 : pBtnCopyResult.clear();
200 0 : pLbCopyArea.clear();
201 0 : pEdCopyArea.clear();
202 0 : pRbCopyArea.clear();
203 0 : pBtnDestPers.clear();
204 0 : pFtDbAreaLabel.clear();
205 0 : pFtDbArea.clear();
206 0 : ScAnyRefDlg::dispose();
207 0 : }
208 :
209 0 : void ScFilterDlg::Init( const SfxItemSet& rArgSet )
210 : {
211 : const ScQueryItem& rQueryItem = static_cast<const ScQueryItem&>(
212 0 : rArgSet.Get( nWhichQuery ));
213 :
214 0 : pBtnOk->SetClickHdl ( LINK( this, ScFilterDlg, EndDlgHdl ) );
215 0 : pBtnCancel->SetClickHdl ( LINK( this, ScFilterDlg, EndDlgHdl ) );
216 0 : pBtnHeader->SetClickHdl ( LINK( this, ScFilterDlg, CheckBoxHdl ) );
217 0 : pBtnCase->SetClickHdl ( LINK( this, ScFilterDlg, CheckBoxHdl ) );
218 :
219 0 : pLbField1->SetSelectHdl ( LINK( this, ScFilterDlg, LbSelectHdl ) );
220 0 : pLbField2->SetSelectHdl ( LINK( this, ScFilterDlg, LbSelectHdl ) );
221 0 : pLbField3->SetSelectHdl ( LINK( this, ScFilterDlg, LbSelectHdl ) );
222 0 : pLbField4->SetSelectHdl ( LINK( this, ScFilterDlg, LbSelectHdl ) );
223 0 : pLbConnect1->SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) );
224 0 : pLbConnect2->SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) );
225 0 : pLbConnect3->SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) );
226 0 : pLbConnect4->SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) );
227 :
228 0 : pLbCond1->SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) );
229 0 : pLbCond2->SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) );
230 0 : pLbCond3->SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) );
231 0 : pLbCond4->SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) );
232 :
233 0 : pViewData = rQueryItem.GetViewData();
234 0 : pDoc = pViewData ? pViewData->GetDocument() : NULL;
235 0 : nSrcTab = pViewData ? pViewData->GetTabNo() : static_cast<SCTAB>(0);
236 :
237 : // for easier access:
238 0 : maFieldLbArr.reserve(QUERY_ENTRY_COUNT);
239 0 : maFieldLbArr.push_back(pLbField1);
240 0 : maFieldLbArr.push_back(pLbField2);
241 0 : maFieldLbArr.push_back(pLbField3);
242 0 : maFieldLbArr.push_back(pLbField4);
243 0 : maValueEdArr.reserve(QUERY_ENTRY_COUNT);
244 0 : maValueEdArr.push_back(pEdVal1);
245 0 : maValueEdArr.push_back(pEdVal2);
246 0 : maValueEdArr.push_back(pEdVal3);
247 0 : maValueEdArr.push_back(pEdVal4);
248 0 : maCondLbArr.reserve(QUERY_ENTRY_COUNT);
249 0 : maCondLbArr.push_back(pLbCond1);
250 0 : maCondLbArr.push_back(pLbCond2);
251 0 : maCondLbArr.push_back(pLbCond3);
252 0 : maCondLbArr.push_back(pLbCond4);
253 0 : maConnLbArr.reserve(QUERY_ENTRY_COUNT);
254 0 : maConnLbArr.push_back(pLbConnect1);
255 0 : maConnLbArr.push_back(pLbConnect2);
256 0 : maConnLbArr.push_back(pLbConnect3);
257 0 : maConnLbArr.push_back(pLbConnect4);
258 :
259 : // Option initialization:
260 : pOptionsMgr = new ScFilterOptionsMgr(
261 : pViewData,
262 : theQueryData,
263 : pBtnCase,
264 : pBtnRegExp,
265 : pBtnHeader,
266 : pBtnUnique,
267 : pBtnCopyResult,
268 : pBtnDestPers,
269 : pLbCopyArea,
270 : pEdCopyArea,
271 : pRbCopyArea,
272 : pFtDbAreaLabel,
273 : pFtDbArea,
274 0 : aStrUndefined );
275 : // Read in field lists and select entries
276 :
277 0 : FillFieldLists();
278 :
279 0 : for (size_t i = 0; i < QUERY_ENTRY_COUNT; ++i)
280 : {
281 0 : OUString aValStr;
282 0 : size_t nCondPos = 0;
283 0 : size_t nFieldSelPos = 0;
284 :
285 0 : ScQueryEntry& rEntry = theQueryData.GetEntry(i);
286 0 : if ( rEntry.bDoQuery )
287 : {
288 0 : const ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
289 0 : nCondPos = static_cast<size_t>(rEntry.eOp);
290 0 : nFieldSelPos = GetFieldSelPos( static_cast<SCCOL>(rEntry.nField) );
291 0 : if (rEntry.IsQueryByEmpty())
292 : {
293 0 : aValStr = aStrEmpty;
294 0 : maCondLbArr[i]->Disable();
295 : }
296 0 : else if (rEntry.IsQueryByNonEmpty())
297 : {
298 0 : aValStr = aStrNotEmpty;
299 0 : maCondLbArr[i]->Disable();
300 : }
301 : else
302 : {
303 0 : OUString aQueryStr = rItem.maString.getString();
304 0 : if (aQueryStr.isEmpty())
305 : {
306 0 : if (rItem.meType == ScQueryEntry::ByValue)
307 : {
308 0 : if (pDoc)
309 : {
310 0 : pDoc->GetFormatTable()->GetInputLineString(rItem.mfVal, 0, aValStr);
311 : }
312 : }
313 0 : else if (rItem.meType == ScQueryEntry::ByDate)
314 : {
315 0 : if (pDoc)
316 : {
317 0 : SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
318 : pFormatter->GetInputLineString(rItem.mfVal,
319 0 : pFormatter->GetStandardFormat( css::util::NumberFormat::DATE), aValStr);
320 : }
321 : }
322 : else
323 : {
324 : SAL_WARN( "sc", "ScFilterDlg::Init: empty query string, really?");
325 0 : aValStr = aQueryStr;
326 : }
327 : }
328 : else
329 : {
330 : // XXX NOTE: if not ByString we just assume this has been
331 : // set to a proper string corresponding to the numeric
332 : // value earlier!
333 0 : aValStr = aQueryStr;
334 0 : }
335 : }
336 : }
337 0 : else if ( i == 0 )
338 : {
339 0 : nFieldSelPos = pViewData ? GetFieldSelPos(pViewData->GetCurX()) : 0;
340 0 : rEntry.nField = nFieldSelPos ? (theQueryData.nCol1 +
341 0 : static_cast<SCCOL>(nFieldSelPos) - 1) : static_cast<SCCOL>(0);
342 0 : rEntry.bDoQuery=true;
343 0 : if (maRefreshExceptQuery.size() < i + 1)
344 0 : maRefreshExceptQuery.resize(i + 1, false);
345 0 : maRefreshExceptQuery[i] = true;
346 :
347 : }
348 0 : maFieldLbArr[i]->SelectEntryPos( nFieldSelPos );
349 0 : maCondLbArr [i]->SelectEntryPos( nCondPos );
350 0 : maValueEdArr[i]->SetText( aValStr );
351 0 : maValueEdArr[i]->EnableAutocomplete( false );
352 0 : maValueEdArr[i]->SetModifyHdl( LINK( this, ScFilterDlg, ValModifyHdl ) );
353 0 : UpdateValueList(i+1);
354 0 : }
355 :
356 0 : pScrollBar->SetEndScrollHdl( LINK( this, ScFilterDlg, ScrollHdl ) );
357 0 : pScrollBar->SetScrollHdl( LINK( this, ScFilterDlg, ScrollHdl ) );
358 :
359 0 : pScrollBar->SetRange( Range( 0, 4 ) );
360 0 : pScrollBar->SetLineSize( 1 );
361 0 : pLbConnect1->Hide();
362 : // Disable/Enable Logic:
363 :
364 0 : (pLbField1->GetSelectEntryPos() != 0)
365 0 : && (pLbField2->GetSelectEntryPos() != 0)
366 0 : ? pLbConnect2->SelectEntryPos( (sal_uInt16)theQueryData.GetEntry(1).eConnect )
367 0 : : pLbConnect2->SetNoSelection();
368 :
369 0 : (pLbField2->GetSelectEntryPos() != 0)
370 0 : && (pLbField3->GetSelectEntryPos() != 0)
371 0 : ? pLbConnect3->SelectEntryPos( (sal_uInt16)theQueryData.GetEntry(2).eConnect )
372 0 : : pLbConnect3->SetNoSelection();
373 :
374 0 : (pLbField3->GetSelectEntryPos() != 0)
375 0 : && (pLbField4->GetSelectEntryPos() != 0)
376 0 : ? pLbConnect4->SelectEntryPos( (sal_uInt16)theQueryData.GetEntry(3).eConnect )
377 0 : : pLbConnect4->SetNoSelection();
378 0 : if ( pLbField1->GetSelectEntryPos() == 0 )
379 : {
380 0 : pLbConnect2->Disable();
381 0 : pLbField2->Disable();
382 0 : pLbCond2->Disable();
383 0 : pEdVal2->Disable();
384 : }
385 0 : else if ( pLbConnect2->GetSelectEntryCount() == 0 )
386 : {
387 0 : pLbField2->Disable();
388 0 : pLbCond2->Disable();
389 0 : pEdVal2->Disable();
390 : }
391 :
392 0 : if ( pLbField2->GetSelectEntryPos() == 0 )
393 : {
394 0 : pLbConnect3->Disable();
395 0 : pLbField3->Disable();
396 0 : pLbCond3->Disable();
397 0 : pEdVal3->Disable();
398 : }
399 0 : else if ( pLbConnect3->GetSelectEntryCount() == 0 )
400 : {
401 0 : pLbField3->Disable();
402 0 : pLbCond3->Disable();
403 0 : pEdVal3->Disable();
404 : }
405 0 : if ( pLbField3->GetSelectEntryPos() == 0 )
406 : {
407 0 : pLbConnect4->Disable();
408 0 : pLbField4->Disable();
409 0 : pLbCond4->Disable();
410 0 : pEdVal4->Disable();
411 : }
412 0 : else if ( pLbConnect4->GetSelectEntryCount() == 0 )
413 : {
414 0 : pLbField4->Disable();
415 0 : pLbCond4->Disable();
416 0 : pEdVal4->Disable();
417 : }
418 :
419 0 : if(pDoc!=NULL &&
420 0 : pDoc->GetChangeTrack()!=NULL) pBtnCopyResult->Disable();
421 : // Switch on modal mode
422 : // SetDispatcherLock( true );
423 : //@BugID 54702 Enable/disable only in Basic class
424 : // SFX_APPWINDOW->Disable(false); //! general method in ScAnyRefDlg
425 0 : }
426 :
427 0 : bool ScFilterDlg::Close()
428 : {
429 0 : if (pViewData)
430 0 : pViewData->GetDocShell()->CancelAutoDBRange();
431 :
432 0 : return DoClose( ScFilterDlgWrapper::GetChildWindowId() );
433 : }
434 :
435 : // Mouse-selected cell area becomes the new selection and is shown in the
436 : // reference text box
437 :
438 0 : void ScFilterDlg::SetReference( const ScRange& rRef, ScDocument* pDocP )
439 : {
440 0 : if ( bRefInputMode ) // Only possible if in reference edit mode
441 : {
442 0 : if ( rRef.aStart != rRef.aEnd )
443 0 : RefInputStart( pEdCopyArea );
444 0 : OUString aRefStr(rRef.aStart.Format(SCA_ABS_3D, pDocP, pDocP->GetAddressConvention()));
445 0 : pEdCopyArea->SetRefString( aRefStr );
446 : }
447 0 : }
448 :
449 0 : void ScFilterDlg::SetActive()
450 : {
451 0 : if ( bRefInputMode )
452 : {
453 0 : pEdCopyArea->GrabFocus();
454 0 : if ( pEdCopyArea->GetModifyHdl().IsSet() )
455 0 : ((Link<>&)pEdCopyArea->GetModifyHdl()).Call( pEdCopyArea );
456 : }
457 : else
458 0 : GrabFocus();
459 :
460 0 : RefInputDone();
461 0 : }
462 :
463 0 : void ScFilterDlg::FillFieldLists()
464 : {
465 0 : pLbField1->Clear();
466 0 : pLbField2->Clear();
467 0 : pLbField3->Clear();
468 0 : pLbField4->Clear();
469 0 : pLbField1->InsertEntry( aStrNone, 0 );
470 0 : pLbField2->InsertEntry( aStrNone, 0 );
471 0 : pLbField3->InsertEntry( aStrNone, 0 );
472 0 : pLbField4->InsertEntry( aStrNone, 0 );
473 :
474 0 : if ( pDoc )
475 : {
476 0 : OUString aFieldName;
477 0 : SCTAB nTab = nSrcTab;
478 0 : SCCOL nFirstCol = theQueryData.nCol1;
479 0 : SCROW nFirstRow = theQueryData.nRow1;
480 0 : SCCOL nMaxCol = theQueryData.nCol2;
481 0 : SCCOL col = 0;
482 0 : sal_uInt16 i=1;
483 :
484 0 : for ( col=nFirstCol; col<=nMaxCol; col++ )
485 : {
486 0 : aFieldName = pDoc->GetString(col, nFirstRow, nTab);
487 0 : if (!pBtnHeader->IsChecked() || aFieldName.isEmpty())
488 : {
489 0 : aFieldName = ScGlobal::ReplaceOrAppend( aStrColumn, "%1", ScColToAlpha( col ));
490 : }
491 0 : pLbField1->InsertEntry( aFieldName, i );
492 0 : pLbField2->InsertEntry( aFieldName, i );
493 0 : pLbField3->InsertEntry( aFieldName, i );
494 0 : pLbField4->InsertEntry( aFieldName, i );
495 0 : i++;
496 0 : }
497 : }
498 0 : }
499 :
500 0 : void ScFilterDlg::UpdateValueList( size_t nList )
501 : {
502 0 : bool bCaseSens = pBtnCase->IsChecked();
503 :
504 0 : if (pDoc && nList > 0 && nList <= QUERY_ENTRY_COUNT)
505 : {
506 0 : ComboBox* pValList = maValueEdArr[nList-1];
507 0 : sal_uInt16 nFieldSelPos = maFieldLbArr[nList-1]->GetSelectEntryPos();
508 0 : sal_uInt16 nListPos = 0;
509 0 : OUString aCurValue = pValList->GetText();
510 :
511 0 : pValList->Clear();
512 0 : pValList->InsertEntry( aStrNotEmpty, 0 );
513 0 : pValList->InsertEntry( aStrEmpty, 1 );
514 0 : nListPos = 2;
515 :
516 0 : if ( nFieldSelPos )
517 : {
518 0 : WaitObject aWaiter( this ); // even if only the list box has content
519 :
520 0 : SCCOL nColumn = theQueryData.nCol1 + static_cast<SCCOL>(nFieldSelPos) - 1;
521 0 : EntryList* pList = NULL;
522 0 : if (!maEntryLists.count(nColumn))
523 : {
524 0 : size_t nOffset = GetSliderPos();
525 0 : SCTAB nTab = nSrcTab;
526 0 : SCROW nFirstRow = theQueryData.nRow1;
527 0 : SCROW nLastRow = theQueryData.nRow2;
528 0 : if (maHasDates.size() < nOffset+nList)
529 0 : maHasDates.resize(nOffset+nList, false);
530 0 : maHasDates[nOffset+nList-1] = false;
531 :
532 : // first without the first line
533 : std::pair<EntryListsMap::iterator, bool> r =
534 0 : maEntryLists.insert(nColumn, new EntryList);
535 0 : if (!r.second)
536 : // insertion failed.
537 0 : return;
538 :
539 0 : pList = r.first->second;
540 : pDoc->GetFilterEntriesArea(
541 : nColumn, nFirstRow+1, nLastRow,
542 0 : nTab, bCaseSens, pList->maList, maHasDates[nOffset+nList-1] );
543 :
544 : // Entry for the first line
545 : //! Entry (pHdrEntry) doesn't generate collection?
546 :
547 0 : pList->mnHeaderPos = INVALID_HEADER_POS;
548 0 : std::vector<ScTypedStrData> aHdrColl;
549 0 : bool bDummy = false;
550 : pDoc->GetFilterEntriesArea(
551 0 : nColumn, nFirstRow, nFirstRow, nTab, true, aHdrColl, bDummy );
552 0 : if (!aHdrColl.empty())
553 : {
554 : // See if the header value is already in the list.
555 0 : std::vector<ScTypedStrData>::iterator itBeg = pList->maList.begin(), itEnd = pList->maList.end();
556 : std::vector<ScTypedStrData>::iterator it = std::find_if(
557 0 : itBeg, itEnd, FindTypedStrData(aHdrColl.front(), bCaseSens));
558 0 : if (it == itEnd)
559 : {
560 : // Not in the list. Insert it.
561 0 : pList->maList.push_back(aHdrColl.front());
562 0 : if (bCaseSens)
563 0 : std::sort(pList->maList.begin(), pList->maList.end(), ScTypedStrData::LessCaseSensitive());
564 : else
565 0 : std::sort(pList->maList.begin(), pList->maList.end(), ScTypedStrData::LessCaseInsensitive());
566 :
567 : // Record its position.
568 0 : itBeg = pList->maList.begin();
569 0 : itEnd = pList->maList.end();
570 0 : it = std::find_if(itBeg, itEnd, FindTypedStrData(aHdrColl.front(), bCaseSens));
571 0 : pList->mnHeaderPos = std::distance(itBeg, it);
572 : }
573 0 : }
574 : }
575 : else
576 0 : pList = &maEntryLists[nColumn];
577 :
578 : OSL_ASSERT(pList);
579 :
580 0 : std::vector<ScTypedStrData>::const_iterator it = pList->maList.begin(), itEnd = pList->maList.end();
581 0 : for (; it != itEnd; ++it)
582 : {
583 0 : pValList->InsertEntry(it->GetString(), nListPos);
584 0 : nListPos++;
585 0 : }
586 : }
587 0 : pValList->SetText( aCurValue );
588 0 : pValList->EnableDDAutoWidth(false);
589 : }
590 :
591 0 : UpdateHdrInValueList( nList );
592 : }
593 :
594 0 : void ScFilterDlg::UpdateHdrInValueList( size_t nList )
595 : {
596 : //! GetText / SetText ??
597 :
598 0 : if (!pDoc)
599 0 : return;
600 :
601 0 : if (nList == 0 || nList > QUERY_ENTRY_COUNT)
602 0 : return;
603 :
604 0 : size_t nFieldSelPos = maFieldLbArr[nList-1]->GetSelectEntryPos();
605 0 : if (!nFieldSelPos)
606 0 : return;
607 :
608 0 : SCCOL nColumn = theQueryData.nCol1 + static_cast<SCCOL>(nFieldSelPos) - 1;
609 0 : if (!maEntryLists.count(nColumn))
610 : {
611 : OSL_FAIL("Spalte noch nicht initialisiert");
612 0 : return;
613 : }
614 :
615 0 : size_t nPos = maEntryLists[nColumn].mnHeaderPos;
616 0 : if (nPos == INVALID_HEADER_POS)
617 0 : return;
618 :
619 0 : ComboBox* pValList = maValueEdArr[nList-1];
620 0 : size_t nListPos = nPos + 2; // for "empty" and "non-empty"
621 :
622 0 : const ScTypedStrData& rHdrEntry = maEntryLists[nColumn].maList[nPos];
623 :
624 0 : const OUString& aHdrStr = rHdrEntry.GetString();
625 0 : bool bWasThere = aHdrStr.equals(pValList->GetEntry(nListPos));
626 0 : bool bInclude = !pBtnHeader->IsChecked();
627 :
628 0 : if (bInclude) // Include entry
629 : {
630 0 : if (!bWasThere)
631 0 : pValList->InsertEntry(aHdrStr, nListPos);
632 : }
633 : else // Omit entry
634 : {
635 0 : if (bWasThere)
636 0 : pValList->RemoveEntryAt(nListPos);
637 : }
638 : }
639 :
640 0 : void ScFilterDlg::ClearValueList( size_t nList )
641 : {
642 0 : if (nList > 0 && nList <= QUERY_ENTRY_COUNT)
643 : {
644 0 : ComboBox* pValList = maValueEdArr[nList-1];
645 0 : pValList->Clear();
646 0 : pValList->InsertEntry( aStrNotEmpty, 0 );
647 0 : pValList->InsertEntry( aStrEmpty, 1 );
648 0 : pValList->SetText( EMPTY_OUSTRING );
649 : }
650 0 : }
651 :
652 0 : size_t ScFilterDlg::GetFieldSelPos( SCCOL nField )
653 : {
654 0 : if ( nField >= theQueryData.nCol1 && nField <= theQueryData.nCol2 )
655 0 : return static_cast<size_t>(nField - theQueryData.nCol1 + 1);
656 : else
657 0 : return 0;
658 : }
659 :
660 0 : ScQueryItem* ScFilterDlg::GetOutputItem()
661 : {
662 0 : ScAddress theCopyPos;
663 0 : ScQueryParam theParam( theQueryData );
664 0 : bool bCopyPosOk = false;
665 :
666 0 : if ( pBtnCopyResult->IsChecked() )
667 : {
668 : sal_uInt16 nResult = theCopyPos.Parse(
669 0 : pEdCopyArea->GetText(), pDoc, pDoc->GetAddressConvention());
670 0 : bCopyPosOk = ( SCA_VALID == (nResult & SCA_VALID) );
671 : }
672 :
673 0 : if ( pBtnCopyResult->IsChecked() && bCopyPosOk )
674 : {
675 0 : theParam.bInplace = false;
676 0 : theParam.nDestTab = theCopyPos.Tab();
677 0 : theParam.nDestCol = theCopyPos.Col();
678 0 : theParam.nDestRow = theCopyPos.Row();
679 : }
680 : else
681 : {
682 0 : theParam.bInplace = true;
683 0 : theParam.nDestTab = 0;
684 0 : theParam.nDestCol = 0;
685 0 : theParam.nDestRow = 0;
686 : }
687 :
688 0 : theParam.bHasHeader = pBtnHeader->IsChecked();
689 0 : theParam.bByRow = true;
690 0 : theParam.bDuplicate = !pBtnUnique->IsChecked();
691 0 : theParam.bCaseSens = pBtnCase->IsChecked();
692 0 : theParam.bRegExp = pBtnRegExp->IsChecked();
693 0 : theParam.bDestPers = pBtnDestPers->IsChecked();
694 :
695 : // only set the three - reset everything else
696 :
697 0 : DELETEZ( pOutItem );
698 0 : pOutItem = new ScQueryItem( nWhichQuery, &theParam );
699 :
700 0 : return pOutItem;
701 : }
702 :
703 0 : bool ScFilterDlg::IsRefInputMode() const
704 : {
705 0 : return bRefInputMode;
706 : }
707 :
708 : // Handler:
709 :
710 0 : IMPL_LINK( ScFilterDlg, EndDlgHdl, Button*, pBtn )
711 : {
712 0 : if ( pBtn == pBtnOk )
713 : {
714 0 : bool bAreaInputOk = true;
715 :
716 0 : if ( pBtnCopyResult->IsChecked() )
717 : {
718 0 : if ( !pOptionsMgr->VerifyPosStr( pEdCopyArea->GetText() ) )
719 : {
720 0 : if (!pExpander->get_expanded())
721 0 : pExpander->set_expanded(true);
722 :
723 0 : ERRORBOX( STR_INVALID_TABREF );
724 0 : pEdCopyArea->GrabFocus();
725 0 : bAreaInputOk = false;
726 : }
727 : }
728 :
729 0 : if ( bAreaInputOk )
730 : {
731 0 : SetDispatcherLock( false );
732 0 : SwitchToDocument();
733 0 : GetBindings().GetDispatcher()->Execute( FID_FILTER_OK,
734 : SfxCallMode::SLOT | SfxCallMode::RECORD,
735 0 : GetOutputItem(), 0L, 0L );
736 0 : Close();
737 : }
738 : }
739 0 : else if ( pBtn == pBtnCancel )
740 : {
741 0 : Close();
742 : }
743 :
744 0 : return 0;
745 : }
746 :
747 0 : IMPL_LINK_NOARG(ScFilterDlg, MoreExpandedHdl)
748 : {
749 0 : if ( pExpander->get_expanded() )
750 0 : pTimer->Start();
751 : else
752 : {
753 0 : pTimer->Stop();
754 0 : bRefInputMode = false;
755 : //@BugID 54702 Enable/disable only in Basic class
756 : //SFX_APPWINDOW->Disable(FALSE); //! general method in ScAnyRefDlg
757 : }
758 0 : return 0;
759 : }
760 :
761 0 : IMPL_LINK_TYPED( ScFilterDlg, TimeOutHdl, Timer*, _pTimer, void )
762 : {
763 : // Check if RefInputMode is still true every 50ms
764 :
765 0 : if( _pTimer == pTimer && IsActive() )
766 0 : bRefInputMode = (pEdCopyArea->HasFocus() || pRbCopyArea->HasFocus());
767 :
768 0 : if ( pExpander->get_expanded() )
769 0 : pTimer->Start();
770 0 : }
771 :
772 0 : IMPL_LINK( ScFilterDlg, LbSelectHdl, ListBox*, pLb )
773 : {
774 : /*
775 : * Handle enable/disable logic depending on which ListBox was selected
776 : */
777 0 : sal_uInt16 nOffset = GetSliderPos();
778 :
779 0 : if ( pLb == pLbConnect1 )
780 : {
781 0 : pLbField1->Enable();
782 0 : pLbCond1->Enable();
783 0 : pEdVal1->Enable();
784 :
785 0 : sal_uInt16 nConnect1 = pLbConnect1->GetSelectEntryPos();
786 0 : size_t nQE = nOffset;
787 0 : theQueryData.GetEntry(nQE).eConnect =(ScQueryConnect)nConnect1;
788 0 : if (maRefreshExceptQuery.size() < nQE + 1)
789 0 : maRefreshExceptQuery.resize(nQE + 1, false);
790 0 : maRefreshExceptQuery[nQE] = true;
791 : }
792 :
793 0 : else if ( pLb == pLbConnect2 )
794 : {
795 0 : pLbField2->Enable();
796 0 : pLbCond2->Enable();
797 0 : pEdVal2->Enable();
798 :
799 0 : sal_uInt16 nConnect2 = pLbConnect2->GetSelectEntryPos();
800 0 : size_t nQE = 1+nOffset;
801 0 : theQueryData.GetEntry(nQE).eConnect =(ScQueryConnect)nConnect2;
802 0 : if (maRefreshExceptQuery.size() < nQE + 1)
803 0 : maRefreshExceptQuery.resize(nQE + 1, false);
804 0 : maRefreshExceptQuery[nQE]=true;
805 : }
806 0 : else if ( pLb == pLbConnect3 )
807 : {
808 0 : pLbField3->Enable();
809 0 : pLbCond3->Enable();
810 0 : pEdVal3->Enable();
811 :
812 0 : sal_uInt16 nConnect3 = pLbConnect3->GetSelectEntryPos();
813 0 : size_t nQE = 2 + nOffset;
814 0 : theQueryData.GetEntry(nQE).eConnect = (ScQueryConnect)nConnect3;
815 0 : if (maRefreshExceptQuery.size() < nQE + 1)
816 0 : maRefreshExceptQuery.resize(nQE + 1, false);
817 0 : maRefreshExceptQuery[nQE] = true;
818 :
819 : }
820 0 : else if ( pLb == pLbConnect4 )
821 : {
822 0 : pLbField4->Enable();
823 0 : pLbCond4->Enable();
824 0 : pEdVal4->Enable();
825 :
826 0 : sal_uInt16 nConnect4 = pLbConnect4->GetSelectEntryPos();
827 0 : size_t nQE = 3 + nOffset;
828 0 : theQueryData.GetEntry(nQE).eConnect = (ScQueryConnect)nConnect4;
829 0 : if (maRefreshExceptQuery.size() < nQE + 1)
830 0 : maRefreshExceptQuery.resize(nQE + 1, false);
831 0 : maRefreshExceptQuery[nQE] = true;
832 : }
833 0 : else if ( pLb == pLbField1 )
834 : {
835 0 : if ( pLbField1->GetSelectEntryPos() == 0 )
836 : {
837 0 : pLbConnect2->SetNoSelection();
838 0 : pLbConnect3->SetNoSelection();
839 0 : pLbConnect4->SetNoSelection();
840 0 : pLbField2->SelectEntryPos( 0 );
841 0 : pLbField3->SelectEntryPos( 0 );
842 0 : pLbField4->SelectEntryPos( 0 );
843 0 : pLbCond2->SelectEntryPos( 0 );
844 0 : pLbCond3->SelectEntryPos( 0 );
845 0 : pLbCond4->SelectEntryPos( 0 );
846 0 : ClearValueList( 1 );
847 0 : ClearValueList( 2 );
848 0 : ClearValueList( 3 );
849 0 : ClearValueList( 4 );
850 :
851 0 : pLbConnect2->Disable();
852 0 : pLbConnect3->Disable();
853 0 : pLbConnect4->Disable();
854 0 : pLbField2->Disable();
855 0 : pLbField3->Disable();
856 0 : pLbField4->Disable();
857 0 : pLbCond2->Disable();
858 0 : pLbCond3->Disable();
859 0 : pLbCond4->Disable();
860 0 : pEdVal2->Disable();
861 0 : pEdVal3->Disable();
862 0 : pEdVal4->Disable();
863 0 : SCSIZE nCount = theQueryData.GetEntryCount();
864 0 : if (maRefreshExceptQuery.size() < nCount + 1)
865 0 : maRefreshExceptQuery.resize(nCount + 1, false);
866 0 : for (SCSIZE i = nOffset; i < nCount; ++i)
867 : {
868 0 : theQueryData.GetEntry(i).bDoQuery = false;
869 0 : maRefreshExceptQuery[i] = false;
870 0 : theQueryData.GetEntry(i).nField = static_cast<SCCOL>(0);
871 : }
872 0 : maRefreshExceptQuery[nOffset] = true;
873 : }
874 : else
875 : {
876 0 : UpdateValueList( 1 );
877 0 : if ( !pLbConnect2->IsEnabled() )
878 : {
879 0 : pLbConnect2->Enable();
880 : }
881 0 : theQueryData.GetEntry(nOffset).bDoQuery = true;
882 0 : sal_uInt16 nField = pLb->GetSelectEntryPos();
883 0 : theQueryData.GetEntry(nOffset).nField = theQueryData.nCol1 + static_cast<SCCOL>(nField) - 1 ;
884 : }
885 : }
886 0 : else if ( pLb == pLbField2 )
887 : {
888 0 : if ( pLbField2->GetSelectEntryPos() == 0 )
889 : {
890 0 : pLbConnect3->SetNoSelection();
891 0 : pLbConnect4->SetNoSelection();
892 0 : pLbField3->SelectEntryPos( 0 );
893 0 : pLbField4->SelectEntryPos( 0 );
894 0 : pLbCond3->SelectEntryPos( 0 );
895 0 : pLbCond4->SelectEntryPos( 0 );
896 0 : ClearValueList( 2 );
897 0 : ClearValueList( 3 );
898 0 : ClearValueList( 4 );
899 :
900 0 : pLbConnect3->Disable();
901 0 : pLbConnect4->Disable();
902 0 : pLbField3->Disable();
903 0 : pLbField4->Disable();
904 0 : pLbCond3->Disable();
905 0 : pLbCond4->Disable();
906 0 : pEdVal3->Disable();
907 0 : pEdVal4->Disable();
908 :
909 0 : sal_uInt16 nTemp=nOffset+1;
910 0 : SCSIZE nCount = theQueryData.GetEntryCount();
911 0 : if (maRefreshExceptQuery.size() < nCount)
912 0 : maRefreshExceptQuery.resize(nCount, false);
913 0 : for (SCSIZE i= nTemp; i< nCount; i++)
914 : {
915 0 : theQueryData.GetEntry(i).bDoQuery = false;
916 0 : maRefreshExceptQuery[i] = false;
917 0 : theQueryData.GetEntry(i).nField = static_cast<SCCOL>(0);
918 : }
919 0 : maRefreshExceptQuery[nTemp] = true;
920 : }
921 : else
922 : {
923 0 : UpdateValueList( 2 );
924 0 : if ( !pLbConnect3->IsEnabled() )
925 : {
926 0 : pLbConnect3->Enable();
927 : }
928 0 : sal_uInt16 nField = pLb->GetSelectEntryPos();
929 0 : sal_uInt16 nQ=1+nOffset;
930 0 : theQueryData.GetEntry(nQ).bDoQuery = true;
931 0 : theQueryData.GetEntry(nQ).nField = theQueryData.nCol1 + static_cast<SCCOL>(nField) - 1 ;
932 : }
933 : }
934 0 : else if ( pLb == pLbField3 )
935 : {
936 0 : if ( pLbField3->GetSelectEntryPos() == 0 )
937 : {
938 0 : pLbConnect4->SetNoSelection();
939 0 : pLbField4->SelectEntryPos( 0 );
940 0 : pLbCond4->SelectEntryPos( 0 );
941 0 : ClearValueList( 3 );
942 0 : ClearValueList( 4 );
943 :
944 0 : pLbConnect4->Disable();
945 0 : pLbField4->Disable();
946 0 : pLbCond4->Disable();
947 0 : pEdVal4->Disable();
948 :
949 0 : sal_uInt16 nTemp=nOffset+2;
950 0 : SCSIZE nCount = theQueryData.GetEntryCount();
951 0 : if (maRefreshExceptQuery.size() < nCount)
952 0 : maRefreshExceptQuery.resize(nCount, false);
953 0 : for (SCSIZE i = nTemp; i < nCount; ++i)
954 : {
955 0 : theQueryData.GetEntry(i).bDoQuery = false;
956 0 : maRefreshExceptQuery[i] = false;
957 0 : theQueryData.GetEntry(i).nField = static_cast<SCCOL>(0);
958 : }
959 0 : maRefreshExceptQuery[nTemp] = true;
960 : }
961 : else
962 : {
963 0 : UpdateValueList( 3 );
964 0 : if ( !pLbConnect4->IsEnabled() )
965 : {
966 0 : pLbConnect4->Enable();
967 : }
968 :
969 0 : sal_uInt16 nField = pLb->GetSelectEntryPos();
970 0 : sal_uInt16 nQ=2+nOffset;
971 0 : theQueryData.GetEntry(nQ).bDoQuery = true;
972 0 : theQueryData.GetEntry(nQ).nField = theQueryData.nCol1 + static_cast<SCCOL>(nField) - 1 ;
973 :
974 : }
975 : }
976 0 : else if ( pLb == pLbField4 )
977 : {
978 0 : if ( pLbField4->GetSelectEntryPos() == 0 )
979 : {
980 0 : ClearValueList( 4 );
981 0 : sal_uInt16 nTemp=nOffset+3;
982 0 : SCSIZE nCount = theQueryData.GetEntryCount();
983 0 : if (maRefreshExceptQuery.size() < nCount)
984 0 : maRefreshExceptQuery.resize(nCount, false);
985 0 : for (SCSIZE i = nTemp; i < nCount; ++i)
986 : {
987 0 : theQueryData.GetEntry(i).bDoQuery = false;
988 0 : maRefreshExceptQuery[i] = false;
989 0 : theQueryData.GetEntry(i).nField = static_cast<SCCOL>(0);
990 : }
991 0 : maRefreshExceptQuery[nTemp] = true;
992 : }
993 : else
994 : {
995 0 : UpdateValueList( 4 );
996 0 : sal_uInt16 nField = pLb->GetSelectEntryPos();
997 0 : sal_uInt16 nQ=3+nOffset;
998 0 : theQueryData.GetEntry(nQ).bDoQuery = true;
999 0 : theQueryData.GetEntry(nQ).nField = theQueryData.nCol1 + static_cast<SCCOL>(nField) - 1 ;
1000 : }
1001 :
1002 : }
1003 0 : else if ( pLb == pLbCond1)
1004 : {
1005 0 : theQueryData.GetEntry(nOffset).eOp=(ScQueryOp)pLb->GetSelectEntryPos();
1006 : }
1007 0 : else if ( pLb == pLbCond2)
1008 : {
1009 0 : sal_uInt16 nQ=1+nOffset;
1010 0 : theQueryData.GetEntry(nQ).eOp=(ScQueryOp)pLb->GetSelectEntryPos();
1011 : }
1012 0 : else if ( pLb == pLbCond3)
1013 : {
1014 0 : sal_uInt16 nQ=2+nOffset;
1015 0 : theQueryData.GetEntry(nQ).eOp=(ScQueryOp)pLb->GetSelectEntryPos();
1016 : }
1017 : else
1018 : {
1019 0 : sal_uInt16 nQ=3+nOffset;
1020 0 : theQueryData.GetEntry(nQ).eOp=(ScQueryOp)pLb->GetSelectEntryPos();
1021 : }
1022 :
1023 0 : return 0;
1024 : }
1025 :
1026 0 : IMPL_LINK( ScFilterDlg, CheckBoxHdl, CheckBox*, pBox )
1027 : {
1028 : // Column headers:
1029 : // Field list: Columnxx <-> column header string
1030 : // Value list: Column header value not applicable.
1031 : // Upper/lower case:
1032 : // Value list: completely new
1033 :
1034 0 : if ( pBox == pBtnHeader ) // Field list and value list
1035 : {
1036 0 : sal_uInt16 nCurSel1 = pLbField1->GetSelectEntryPos();
1037 0 : sal_uInt16 nCurSel2 = pLbField2->GetSelectEntryPos();
1038 0 : sal_uInt16 nCurSel3 = pLbField3->GetSelectEntryPos();
1039 0 : sal_uInt16 nCurSel4 = pLbField4->GetSelectEntryPos();
1040 0 : FillFieldLists();
1041 0 : pLbField1->SelectEntryPos( nCurSel1 );
1042 0 : pLbField2->SelectEntryPos( nCurSel2 );
1043 0 : pLbField3->SelectEntryPos( nCurSel3 );
1044 0 : pLbField4->SelectEntryPos( nCurSel4 );
1045 :
1046 0 : UpdateHdrInValueList( 1 );
1047 0 : UpdateHdrInValueList( 2 );
1048 0 : UpdateHdrInValueList( 3 );
1049 0 : UpdateHdrInValueList( 4 );
1050 : }
1051 :
1052 0 : if ( pBox == pBtnCase ) // Complete value list
1053 : {
1054 0 : maEntryLists.clear();
1055 0 : UpdateValueList( 1 ); // current text is recorded
1056 0 : UpdateValueList( 2 );
1057 0 : UpdateValueList( 3 );
1058 0 : UpdateValueList( 4 );
1059 : }
1060 :
1061 0 : return 0;
1062 : }
1063 :
1064 0 : IMPL_LINK( ScFilterDlg, ValModifyHdl, ComboBox*, pEd )
1065 : {
1066 0 : size_t nOffset = GetSliderPos();
1067 0 : size_t i = 0;
1068 0 : size_t nQE = i + nOffset;
1069 0 : if ( pEd )
1070 : {
1071 0 : OUString aStrVal = pEd->GetText();
1072 0 : ListBox* pLbCond = pLbCond1;
1073 0 : ListBox* pLbField = pLbField1;
1074 0 : if ( pEd == pEdVal2 )
1075 : {
1076 0 : pLbCond = pLbCond2;
1077 0 : pLbField = pLbField2;
1078 0 : i=1;
1079 0 : nQE=i+nOffset;
1080 : }
1081 0 : if ( pEd == pEdVal3 )
1082 : {
1083 0 : pLbCond = pLbCond3;
1084 0 : pLbField = pLbField3;
1085 0 : i=2;
1086 0 : nQE=i+nOffset;
1087 : }
1088 0 : if ( pEd == pEdVal4 )
1089 : {
1090 0 : pLbCond = pLbCond4;
1091 0 : pLbField = pLbField4;
1092 0 : i=3;
1093 0 : nQE=i+nOffset;
1094 : }
1095 :
1096 0 : if ( aStrEmpty.equals(aStrVal) || aStrNotEmpty.equals(aStrVal) )
1097 : {
1098 0 : pLbCond->SelectEntry(OUString('='));
1099 0 : pLbCond->Disable();
1100 : }
1101 : else
1102 0 : pLbCond->Enable();
1103 :
1104 0 : if (maHasDates.size() < nQE + 1)
1105 0 : maHasDates.resize(nQE + 1, false);
1106 0 : if (maRefreshExceptQuery.size() < nQE + 1)
1107 0 : maRefreshExceptQuery.resize(nQE + 1, false);
1108 :
1109 0 : ScQueryEntry& rEntry = theQueryData.GetEntry( nQE );
1110 0 : ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
1111 0 : bool bDoThis = (pLbField->GetSelectEntryPos() != 0);
1112 0 : rEntry.bDoQuery = bDoThis;
1113 :
1114 0 : if ( rEntry.bDoQuery || maRefreshExceptQuery[nQE] )
1115 : {
1116 0 : bool bByEmptyOrNotByEmpty = false;
1117 0 : if ( aStrEmpty.equals(aStrVal) )
1118 : {
1119 0 : bByEmptyOrNotByEmpty = true;
1120 0 : rEntry.SetQueryByEmpty();
1121 : }
1122 0 : else if ( aStrNotEmpty.equals(aStrVal) )
1123 : {
1124 0 : bByEmptyOrNotByEmpty = true;
1125 0 : rEntry.SetQueryByNonEmpty();
1126 : }
1127 : else
1128 : {
1129 0 : rItem.maString = pDoc->GetSharedStringPool().intern(aStrVal);
1130 0 : rItem.mfVal = 0.0;
1131 :
1132 0 : sal_uInt32 nIndex = 0;
1133 : bool bNumber = pDoc->GetFormatTable()->IsNumberFormat(
1134 0 : rItem.maString.getString(), nIndex, rItem.mfVal);
1135 0 : rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
1136 : }
1137 :
1138 0 : sal_uInt16 nField = pLbField->GetSelectEntryPos();
1139 0 : rEntry.nField = nField ? (theQueryData.nCol1 +
1140 0 : static_cast<SCCOL>(nField) - 1) : static_cast<SCCOL>(0);
1141 :
1142 0 : ScQueryOp eOp = (ScQueryOp)pLbCond->GetSelectEntryPos();
1143 0 : rEntry.eOp = eOp;
1144 0 : if (maHasDates[nQE] && !bByEmptyOrNotByEmpty)
1145 0 : rItem.meType = ScQueryEntry::ByDate;
1146 0 : }
1147 : }
1148 0 : return 0;
1149 : }
1150 :
1151 0 : IMPL_LINK_NOARG(ScFilterDlg, ScrollHdl)
1152 : {
1153 0 : SliderMoved();
1154 0 : return 0;
1155 : }
1156 :
1157 0 : void ScFilterDlg::SliderMoved()
1158 : {
1159 0 : size_t nOffset = GetSliderPos();
1160 0 : RefreshEditRow( nOffset);
1161 0 : }
1162 :
1163 0 : size_t ScFilterDlg::GetSliderPos()
1164 : {
1165 0 : return static_cast<size_t>(pScrollBar->GetThumbPos());
1166 : }
1167 :
1168 0 : void ScFilterDlg::RefreshEditRow( size_t nOffset )
1169 : {
1170 0 : if (nOffset==0)
1171 0 : maConnLbArr[0]->Hide();
1172 : else
1173 0 : maConnLbArr[0]->Show();
1174 :
1175 0 : for (size_t i = 0; i < QUERY_ENTRY_COUNT; ++i)
1176 : {
1177 0 : OUString aValStr;
1178 0 : size_t nCondPos = 0;
1179 0 : size_t nFieldSelPos = 0;
1180 0 : size_t nQE = i + nOffset;
1181 :
1182 0 : if (maRefreshExceptQuery.size() < nQE + 1)
1183 0 : maRefreshExceptQuery.resize(nQE + 1, false);
1184 :
1185 0 : ScQueryEntry& rEntry = theQueryData.GetEntry( nQE);
1186 0 : if ( rEntry.bDoQuery || maRefreshExceptQuery[nQE] )
1187 : {
1188 0 : nCondPos = static_cast<size_t>(rEntry.eOp);
1189 0 : if(rEntry.bDoQuery)
1190 0 : nFieldSelPos = GetFieldSelPos( static_cast<SCCOL>(rEntry.nField) );
1191 :
1192 0 : const ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
1193 0 : OUString aQueryStr = rItem.maString.getString();
1194 0 : if (rEntry.IsQueryByEmpty())
1195 : {
1196 0 : aValStr = aStrEmpty;
1197 0 : maCondLbArr[i]->Disable();
1198 : }
1199 0 : else if (rEntry.IsQueryByNonEmpty())
1200 : {
1201 0 : aValStr = aStrNotEmpty;
1202 0 : maCondLbArr[i]->Disable();
1203 : }
1204 : else
1205 : {
1206 0 : aValStr = aQueryStr;
1207 0 : maCondLbArr[i]->Enable();
1208 : }
1209 0 : maFieldLbArr[i]->Enable();
1210 0 : maValueEdArr[i]->Enable();
1211 :
1212 0 : if (nOffset==0)
1213 : {
1214 0 : if (i<3)
1215 : {
1216 0 : if(rEntry.bDoQuery)
1217 0 : maConnLbArr[i+1]->Enable();
1218 : else
1219 0 : maConnLbArr[i+1]->Disable();
1220 0 : size_t nQENext = nQE + 1;
1221 0 : if (maRefreshExceptQuery.size() < nQENext + 1)
1222 0 : maRefreshExceptQuery.resize(nQENext + 1, false);
1223 0 : if (theQueryData.GetEntry(nQENext).bDoQuery || maRefreshExceptQuery[nQENext])
1224 0 : maConnLbArr[i+1]->SelectEntryPos( (sal_uInt16) theQueryData.GetEntry(nQENext).eConnect );
1225 : else
1226 0 : maConnLbArr[i+1]->SetNoSelection();
1227 : }
1228 : }
1229 : else
1230 : {
1231 0 : if(theQueryData.GetEntry( nQE-1).bDoQuery)
1232 0 : maConnLbArr[i]->Enable();
1233 : else
1234 0 : maConnLbArr[i]->Disable();
1235 :
1236 0 : if (maRefreshExceptQuery.size() < nQE + 1)
1237 0 : maRefreshExceptQuery.resize(nQE + 1, false);
1238 0 : if(rEntry.bDoQuery || maRefreshExceptQuery[nQE])
1239 0 : maConnLbArr[i]->SelectEntryPos( (sal_uInt16) rEntry.eConnect );
1240 : else
1241 0 : maConnLbArr[i]->SetNoSelection();
1242 0 : }
1243 :
1244 : }
1245 : else
1246 : {
1247 0 : if (nOffset==0)
1248 : {
1249 0 : if(i<3)
1250 : {
1251 0 : maConnLbArr[i+1]->SetNoSelection();
1252 0 : maConnLbArr[i+1]->Disable();
1253 : }
1254 : }
1255 : else
1256 : {
1257 0 : if(theQueryData.GetEntry( nQE-1).bDoQuery)
1258 0 : maConnLbArr[i]->Enable();
1259 : else
1260 0 : maConnLbArr[i]->Disable();
1261 0 : maConnLbArr[i]->SetNoSelection();
1262 : }
1263 0 : maFieldLbArr[i]->Disable();
1264 0 : maCondLbArr[i]->Disable();
1265 0 : maValueEdArr[i]->Disable();
1266 : }
1267 0 : maFieldLbArr[i]->SelectEntryPos( nFieldSelPos );
1268 0 : maCondLbArr [i]->SelectEntryPos( nCondPos );
1269 0 : maValueEdArr[i]->SetText( aValStr );
1270 0 : UpdateValueList(i+1);
1271 0 : }
1272 156 : }
1273 :
1274 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|