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