LCOV - code coverage report
Current view: top level - sc/source/ui/dbgui - filtdlg.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 740 0.0 %
Date: 2014-04-14 Functions: 0 34 0.0 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.10