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