LCOV - code coverage report
Current view: top level - sc/source/core/tool - queryparam.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 208 0.0 %
Date: 2014-04-14 Functions: 0 44 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 "queryparam.hxx"
      21             : #include "queryentry.hxx"
      22             : #include "scmatrix.hxx"
      23             : 
      24             : #include "svl/sharedstringpool.hxx"
      25             : 
      26             : namespace {
      27             : 
      28             : const size_t MAXQUERY = 8;
      29             : 
      30             : class FindByField : public std::unary_function<ScQueryEntry, bool>
      31             : {
      32             :     SCCOLROW mnField;
      33             : public:
      34           0 :     FindByField(SCCOLROW nField) : mnField(nField) {}
      35           0 :     bool operator() (const ScQueryEntry& rEntry) const
      36             :     {
      37           0 :         return rEntry.bDoQuery && rEntry.nField == mnField;
      38             :     }
      39             : };
      40             : 
      41             : struct FindUnused : public std::unary_function<ScQueryEntry, bool>
      42             : {
      43           0 :     bool operator() (const ScQueryEntry& rEntry) const
      44             :     {
      45           0 :         return !rEntry.bDoQuery;
      46             :     }
      47             : };
      48             : 
      49             : }
      50             : 
      51           0 : ScQueryParamBase::const_iterator ScQueryParamBase::begin() const
      52             : {
      53           0 :     return maEntries.begin();
      54             : }
      55             : 
      56           0 : ScQueryParamBase::const_iterator ScQueryParamBase::end() const
      57             : {
      58           0 :     return maEntries.end();
      59             : }
      60             : 
      61           0 : ScQueryParamBase::ScQueryParamBase() :
      62             :     bHasHeader(true),
      63             :     bByRow(true),
      64             :     bInplace(true),
      65             :     bCaseSens(false),
      66             :     bRegExp(false),
      67             :     bDuplicate(false),
      68           0 :     mbRangeLookup(false)
      69             : {
      70           0 :     for (size_t i = 0; i < MAXQUERY; ++i)
      71           0 :         maEntries.push_back(new ScQueryEntry);
      72           0 : }
      73             : 
      74           0 : ScQueryParamBase::ScQueryParamBase(const ScQueryParamBase& r) :
      75             :     bHasHeader(r.bHasHeader), bByRow(r.bByRow), bInplace(r.bInplace), bCaseSens(r.bCaseSens),
      76             :     bRegExp(r.bRegExp), bDuplicate(r.bDuplicate), mbRangeLookup(r.mbRangeLookup),
      77           0 :     maEntries(r.maEntries)
      78             : {
      79           0 : }
      80             : 
      81           0 : ScQueryParamBase::~ScQueryParamBase()
      82             : {
      83           0 : }
      84             : 
      85           0 : bool ScQueryParamBase::IsValidFieldIndex() const
      86             : {
      87           0 :     return true;
      88             : }
      89             : 
      90           0 : SCSIZE ScQueryParamBase::GetEntryCount() const
      91             : {
      92           0 :     return maEntries.size();
      93             : }
      94             : 
      95           0 : const ScQueryEntry& ScQueryParamBase::GetEntry(SCSIZE n) const
      96             : {
      97           0 :     return maEntries[n];
      98             : }
      99             : 
     100           0 : ScQueryEntry& ScQueryParamBase::GetEntry(SCSIZE n)
     101             : {
     102           0 :     return maEntries[n];
     103             : }
     104             : 
     105           0 : ScQueryEntry& ScQueryParamBase::AppendEntry()
     106             : {
     107             :     // Find the first unused entry.
     108             :     EntriesType::iterator itr = std::find_if(
     109           0 :         maEntries.begin(), maEntries.end(), FindUnused());
     110             : 
     111           0 :     if (itr != maEntries.end())
     112             :         // Found!
     113           0 :         return *itr;
     114             : 
     115             :     // Add a new entry to the end.
     116           0 :     maEntries.push_back(new ScQueryEntry);
     117           0 :     return maEntries.back();
     118             : }
     119             : 
     120           0 : ScQueryEntry* ScQueryParamBase::FindEntryByField(SCCOLROW nField, bool bNew)
     121             : {
     122             :     EntriesType::iterator itr = std::find_if(
     123           0 :         maEntries.begin(), maEntries.end(), FindByField(nField));
     124             : 
     125           0 :     if (itr != maEntries.end())
     126             :     {
     127             :         // existing entry found!
     128           0 :         return &(*itr);
     129             :     }
     130             : 
     131           0 :     if (!bNew)
     132             :         // no existing entry found, and we are not creating a new one.
     133           0 :         return NULL;
     134             : 
     135           0 :     return &AppendEntry();
     136             : }
     137             : 
     138           0 : void ScQueryParamBase::RemoveEntryByField(SCCOLROW nField)
     139             : {
     140             :     EntriesType::iterator itr = std::find_if(
     141           0 :         maEntries.begin(), maEntries.end(), FindByField(nField));
     142             : 
     143           0 :     if (itr != maEntries.end())
     144             :     {
     145           0 :         maEntries.erase(itr);
     146           0 :         if (maEntries.size() < MAXQUERY)
     147             :             // Make sure that we have at least MAXQUERY number of entries at
     148             :             // all times.
     149           0 :             maEntries.push_back(new ScQueryEntry);
     150             :     }
     151           0 : }
     152             : 
     153           0 : void ScQueryParamBase::Resize(size_t nNew)
     154             : {
     155           0 :     if (nNew < MAXQUERY)
     156           0 :         nNew = MAXQUERY;                // never less than MAXQUERY
     157             : 
     158           0 :     if (nNew < maEntries.size())
     159             :     {
     160           0 :         size_t n = maEntries.size() - nNew;
     161           0 :         for (size_t i = 0; i < n; ++i)
     162           0 :             maEntries.pop_back();
     163             :     }
     164           0 :     else if (nNew > maEntries.size())
     165             :     {
     166           0 :         size_t n = nNew - maEntries.size();
     167           0 :         for (size_t i = 0; i < n; ++i)
     168           0 :             maEntries.push_back(new ScQueryEntry);
     169             :     }
     170           0 : }
     171             : 
     172           0 : void ScQueryParamBase::FillInExcelSyntax(
     173             :     svl::SharedStringPool& rPool, const OUString& rStr, SCSIZE nIndex)
     174             : {
     175           0 :     const OUString aCellStr = rStr;
     176           0 :     if (!aCellStr.isEmpty())
     177             :     {
     178           0 :         if ( nIndex >= maEntries.size() )
     179           0 :             Resize( nIndex+1 );
     180             : 
     181           0 :         ScQueryEntry& rEntry = GetEntry(nIndex);
     182           0 :         ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
     183             : 
     184           0 :         rEntry.bDoQuery = true;
     185             :         // Operatoren herausfiltern
     186           0 :         if (aCellStr[0] == '<')
     187             :         {
     188           0 :             if (aCellStr[1] == '>')
     189             :             {
     190           0 :                 rItem.maString = rPool.intern(aCellStr.copy(2));
     191           0 :                 rEntry.eOp   = SC_NOT_EQUAL;
     192             :             }
     193           0 :             else if (aCellStr[1] == '=')
     194             :             {
     195           0 :                 rItem.maString = rPool.intern(aCellStr.copy(2));
     196           0 :                 rEntry.eOp   = SC_LESS_EQUAL;
     197             :             }
     198             :             else
     199             :             {
     200           0 :                 rItem.maString = rPool.intern(aCellStr.copy(1));
     201           0 :                 rEntry.eOp   = SC_LESS;
     202             :             }
     203             :         }
     204           0 :         else if (aCellStr[0]== '>')
     205             :         {
     206           0 :             if (aCellStr[1] == '=')
     207             :             {
     208           0 :                 rItem.maString = rPool.intern(aCellStr.copy(2));
     209           0 :                 rEntry.eOp   = SC_GREATER_EQUAL;
     210             :             }
     211             :             else
     212             :             {
     213           0 :                 rItem.maString = rPool.intern(aCellStr.copy(1));
     214           0 :                 rEntry.eOp   = SC_GREATER;
     215             :             }
     216             :         }
     217             :         else
     218             :         {
     219           0 :             if (aCellStr[0] == '=')
     220           0 :                 rItem.maString = rPool.intern(aCellStr.copy(1));
     221             :             else
     222           0 :                 rItem.maString = rPool.intern(aCellStr);
     223           0 :             rEntry.eOp = SC_EQUAL;
     224             :         }
     225           0 :     }
     226           0 : }
     227             : 
     228           0 : ScQueryParamTable::ScQueryParamTable()
     229             : {
     230           0 : }
     231             : 
     232           0 : ScQueryParamTable::ScQueryParamTable(const ScQueryParamTable& r) :
     233           0 :     nCol1(r.nCol1),nRow1(r.nRow1),nCol2(r.nCol2),nRow2(r.nRow2),nTab(r.nTab)
     234             : {
     235           0 : }
     236             : 
     237           0 : ScQueryParamTable::~ScQueryParamTable()
     238             : {
     239           0 : }
     240             : 
     241           0 : ScQueryParam::ScQueryParam() :
     242             :     ScQueryParamBase(),
     243             :     ScQueryParamTable(),
     244             :     bDestPers(true),
     245             :     nDestTab(0),
     246             :     nDestCol(0),
     247           0 :     nDestRow(0)
     248             : {
     249           0 :     Clear();
     250           0 : }
     251             : 
     252           0 : ScQueryParam::ScQueryParam( const ScQueryParam& r ) :
     253             :     ScQueryParamBase(r),
     254             :     ScQueryParamTable(r),
     255           0 :     bDestPers(r.bDestPers), nDestTab(r.nDestTab), nDestCol(r.nDestCol), nDestRow(r.nDestRow)
     256             : {
     257           0 : }
     258             : 
     259           0 : ScQueryParam::ScQueryParam( const ScDBQueryParamInternal& r ) :
     260             :     ScQueryParamBase(r),
     261             :     ScQueryParamTable(r),
     262             :     bDestPers(true),
     263             :     nDestTab(0),
     264             :     nDestCol(0),
     265           0 :     nDestRow(0)
     266             : {
     267           0 : }
     268             : 
     269           0 : ScQueryParam::~ScQueryParam()
     270             : {
     271           0 : }
     272             : 
     273           0 : void ScQueryParam::Clear()
     274             : {
     275           0 :     nCol1=nCol2 = 0;
     276           0 :     nRow1=nRow2 = 0;
     277           0 :     nTab = SCTAB_MAX;
     278           0 :     bHasHeader = bCaseSens = bRegExp = false;
     279           0 :     bInplace = bByRow = bDuplicate = true;
     280             : 
     281           0 :     boost::ptr_vector<ScQueryEntry>::iterator itr = maEntries.begin(), itrEnd = maEntries.end();
     282           0 :     for (; itr != itrEnd; ++itr)
     283           0 :         itr->Clear();
     284             : 
     285           0 :     ClearDestParams();
     286           0 : }
     287             : 
     288           0 : void ScQueryParam::ClearDestParams()
     289             : {
     290           0 :     bDestPers = true;
     291           0 :     nDestTab = 0;
     292           0 :     nDestCol = 0;
     293           0 :     nDestRow = 0;
     294           0 : }
     295             : 
     296           0 : ScQueryParam& ScQueryParam::operator=( const ScQueryParam& r )
     297             : {
     298           0 :     nCol1       = r.nCol1;
     299           0 :     nRow1       = r.nRow1;
     300           0 :     nCol2       = r.nCol2;
     301           0 :     nRow2       = r.nRow2;
     302           0 :     nTab        = r.nTab;
     303           0 :     nDestTab    = r.nDestTab;
     304           0 :     nDestCol    = r.nDestCol;
     305           0 :     nDestRow    = r.nDestRow;
     306           0 :     bHasHeader  = r.bHasHeader;
     307           0 :     bInplace    = r.bInplace;
     308           0 :     bCaseSens   = r.bCaseSens;
     309           0 :     bRegExp     = r.bRegExp;
     310           0 :     bDuplicate  = r.bDuplicate;
     311           0 :     bByRow      = r.bByRow;
     312           0 :     bDestPers   = r.bDestPers;
     313             : 
     314           0 :     maEntries = r.maEntries.clone();
     315             : 
     316           0 :     return *this;
     317             : }
     318             : 
     319           0 : bool ScQueryParam::operator==( const ScQueryParam& rOther ) const
     320             : {
     321           0 :     bool bEqual = false;
     322             : 
     323             :     // Anzahl der Queries gleich?
     324           0 :     SCSIZE nUsed      = 0;
     325           0 :     SCSIZE nOtherUsed = 0;
     326           0 :     SCSIZE nEntryCount = GetEntryCount();
     327           0 :     SCSIZE nOtherEntryCount = rOther.GetEntryCount();
     328             : 
     329           0 :     while ( nUsed<nEntryCount && maEntries[nUsed].bDoQuery ) ++nUsed;
     330           0 :     while ( nOtherUsed<nOtherEntryCount && rOther.maEntries[nOtherUsed].bDoQuery )
     331           0 :         ++nOtherUsed;
     332             : 
     333           0 :     if (   (nUsed       == nOtherUsed)
     334           0 :         && (nCol1       == rOther.nCol1)
     335           0 :         && (nRow1       == rOther.nRow1)
     336           0 :         && (nCol2       == rOther.nCol2)
     337           0 :         && (nRow2       == rOther.nRow2)
     338           0 :         && (nTab        == rOther.nTab)
     339           0 :         && (bHasHeader  == rOther.bHasHeader)
     340           0 :         && (bByRow      == rOther.bByRow)
     341           0 :         && (bInplace    == rOther.bInplace)
     342           0 :         && (bCaseSens   == rOther.bCaseSens)
     343           0 :         && (bRegExp     == rOther.bRegExp)
     344           0 :         && (bDuplicate  == rOther.bDuplicate)
     345           0 :         && (bDestPers   == rOther.bDestPers)
     346           0 :         && (nDestTab    == rOther.nDestTab)
     347           0 :         && (nDestCol    == rOther.nDestCol)
     348           0 :         && (nDestRow    == rOther.nDestRow) )
     349             :     {
     350           0 :         bEqual = true;
     351           0 :         for ( SCSIZE i=0; i<nUsed && bEqual; i++ )
     352           0 :             bEqual = maEntries[i] == rOther.maEntries[i];
     353             :     }
     354           0 :     return bEqual;
     355             : }
     356             : 
     357           0 : void ScQueryParam::MoveToDest()
     358             : {
     359           0 :     if (!bInplace)
     360             :     {
     361           0 :         SCsCOL nDifX = ((SCsCOL) nDestCol) - ((SCsCOL) nCol1);
     362           0 :         SCsROW nDifY = ((SCsROW) nDestRow) - ((SCsROW) nRow1);
     363           0 :         SCsTAB nDifZ = ((SCsTAB) nDestTab) - ((SCsTAB) nTab);
     364             : 
     365           0 :         nCol1 = sal::static_int_cast<SCCOL>( nCol1 + nDifX );
     366           0 :         nRow1 = sal::static_int_cast<SCROW>( nRow1 + nDifY );
     367           0 :         nCol2 = sal::static_int_cast<SCCOL>( nCol2 + nDifX );
     368           0 :         nRow2 = sal::static_int_cast<SCROW>( nRow2 + nDifY );
     369           0 :         nTab  = sal::static_int_cast<SCTAB>( nTab  + nDifZ );
     370           0 :         size_t n = maEntries.size();
     371           0 :         for (size_t i=0; i<n; i++)
     372           0 :             maEntries[i].nField += nDifX;
     373             : 
     374           0 :         bInplace = true;
     375             :     }
     376             :     else
     377             :     {
     378             :         OSL_FAIL("MoveToDest, bInplace == TRUE");
     379             :     }
     380           0 : }
     381             : 
     382           0 : ScDBQueryParamBase::ScDBQueryParamBase(DataType eType) :
     383             :     ScQueryParamBase(),
     384             :     mnField(-1),
     385             :     mbSkipString(true),
     386           0 :     meType(eType)
     387             : {
     388           0 : }
     389             : 
     390           0 : ScDBQueryParamBase::~ScDBQueryParamBase()
     391             : {
     392           0 : }
     393             : 
     394           0 : ScDBQueryParamBase::DataType ScDBQueryParamBase::GetType() const
     395             : {
     396           0 :     return meType;
     397             : }
     398             : 
     399           0 : ScDBQueryParamInternal::ScDBQueryParamInternal() :
     400             :     ScDBQueryParamBase(ScDBQueryParamBase::INTERNAL),
     401           0 :     ScQueryParamTable()
     402             : {
     403           0 : }
     404             : 
     405           0 : ScDBQueryParamInternal::~ScDBQueryParamInternal()
     406             : {
     407           0 : }
     408             : 
     409           0 : bool ScDBQueryParamInternal::IsValidFieldIndex() const
     410             : {
     411           0 :     return nCol1 <= mnField && mnField <= nCol2;
     412             : }
     413             : 
     414           0 : ScDBQueryParamMatrix::ScDBQueryParamMatrix() :
     415           0 :     ScDBQueryParamBase(ScDBQueryParamBase::MATRIX)
     416             : {
     417           0 : }
     418             : 
     419           0 : bool ScDBQueryParamMatrix::IsValidFieldIndex() const
     420             : {
     421             :     SCSIZE nC, nR;
     422           0 :     mpMatrix->GetDimensions(nC, nR);
     423           0 :     return 0 <= mnField && mnField <= static_cast<SCCOL>(nC);
     424             : }
     425             : 
     426           0 : ScDBQueryParamMatrix::~ScDBQueryParamMatrix()
     427             : {
     428           0 : }
     429             : 
     430             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10