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