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