blob: 389d6f6af26b4339dadf86c3c4e581350cff290a [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
// INCLUDE ---------------------------------------------------------------
#include <sfx2/docfile.hxx>
#include <sfx2/objsh.hxx>
#include <unotools/textsearch.hxx>
#include <unotools/pathoptions.hxx>
#include <unotools/useroptions.hxx>
#include <tools/urlobj.hxx>
#include <unotools/charclass.hxx>
#include <stdlib.h>
#include <ctype.h>
#include <unotools/syslocale.hxx>
#include "global.hxx"
#include "rangeutl.hxx"
#include "rechead.hxx"
#include "compiler.hxx"
#include "paramisc.hxx"
#include "sc.hrc"
#include "globstr.hrc"
using ::std::vector;
// -----------------------------------------------------------------------
//------------------------------------------------------------------------
// struct ScImportParam:
ScImportParam::ScImportParam() :
nCol1(0),
nRow1(0),
nCol2(0),
nRow2(0),
bImport(sal_False),
bNative(sal_False),
bSql(sal_True),
nType(ScDbTable)
{
}
ScImportParam::ScImportParam( const ScImportParam& r ) :
nCol1 (r.nCol1),
nRow1 (r.nRow1),
nCol2 (r.nCol2),
nRow2 (r.nRow2),
bImport (r.bImport),
aDBName (r.aDBName),
aStatement (r.aStatement),
bNative (r.bNative),
bSql (r.bSql),
nType (r.nType)
{
}
ScImportParam::~ScImportParam()
{
}
//UNUSED2009-05 void ScImportParam::Clear()
//UNUSED2009-05 {
//UNUSED2009-05 nCol1 = nCol2 = 0;
//UNUSED2009-05 nRow1 = nRow2 = 0;
//UNUSED2009-05 bImport = sal_False;
//UNUSED2009-05 bNative = sal_False;
//UNUSED2009-05 bSql = sal_True;
//UNUSED2009-05 nType = ScDbTable;
//UNUSED2009-05 aDBName.Erase();
//UNUSED2009-05 aStatement.Erase();
//UNUSED2009-05 }
ScImportParam& ScImportParam::operator=( const ScImportParam& r )
{
nCol1 = r.nCol1;
nRow1 = r.nRow1;
nCol2 = r.nCol2;
nRow2 = r.nRow2;
bImport = r.bImport;
aDBName = r.aDBName;
aStatement = r.aStatement;
bNative = r.bNative;
bSql = r.bSql;
nType = r.nType;
return *this;
}
sal_Bool ScImportParam::operator==( const ScImportParam& rOther ) const
{
return( nCol1 == rOther.nCol1 &&
nRow1 == rOther.nRow1 &&
nCol2 == rOther.nCol2 &&
nRow2 == rOther.nRow2 &&
bImport == rOther.bImport &&
aDBName == rOther.aDBName &&
aStatement == rOther.aStatement &&
bNative == rOther.bNative &&
bSql == rOther.bSql &&
nType == rOther.nType );
//! nQuerySh und pConnection sind gleich ?
}
//------------------------------------------------------------------------
// struct ScQueryParam:
ScQueryEntry::ScQueryEntry() :
bDoQuery(sal_False),
bQueryByString(sal_False),
bQueryByDate(false),
nField(0),
eOp(SC_EQUAL),
eConnect(SC_AND),
pStr(new String),
nVal(0.0),
pSearchParam(NULL),
pSearchText(NULL)
{
}
ScQueryEntry::ScQueryEntry(const ScQueryEntry& r) :
bDoQuery(r.bDoQuery),
bQueryByString(r.bQueryByString),
bQueryByDate(r.bQueryByDate),
nField(r.nField),
eOp(r.eOp),
eConnect(r.eConnect),
pStr(new String(*r.pStr)),
nVal(r.nVal),
pSearchParam(NULL),
pSearchText(NULL)
{
}
ScQueryEntry::~ScQueryEntry()
{
delete pStr;
if ( pSearchParam )
{
delete pSearchParam;
delete pSearchText;
}
}
ScQueryEntry& ScQueryEntry::operator=( const ScQueryEntry& r )
{
bDoQuery = r.bDoQuery;
bQueryByString = r.bQueryByString;
bQueryByDate = r.bQueryByDate;
eOp = r.eOp;
eConnect = r.eConnect;
nField = r.nField;
nVal = r.nVal;
*pStr = *r.pStr;
if ( pSearchParam )
{
delete pSearchParam;
delete pSearchText;
}
pSearchParam = NULL;
pSearchText = NULL;
return *this;
}
void ScQueryEntry::Clear()
{
bDoQuery = sal_False;
bQueryByString = sal_False;
bQueryByDate = false;
eOp = SC_EQUAL;
eConnect = SC_AND;
nField = 0;
nVal = 0.0;
pStr->Erase();
if ( pSearchParam )
{
delete pSearchParam;
delete pSearchText;
}
pSearchParam = NULL;
pSearchText = NULL;
}
sal_Bool ScQueryEntry::operator==( const ScQueryEntry& r ) const
{
return bDoQuery == r.bDoQuery
&& bQueryByString == r.bQueryByString
&& bQueryByDate == r.bQueryByDate
&& eOp == r.eOp
&& eConnect == r.eConnect
&& nField == r.nField
&& nVal == r.nVal
&& *pStr == *r.pStr;
//! pSearchParam und pSearchText nicht vergleichen
}
utl::TextSearch* ScQueryEntry::GetSearchTextPtr( sal_Bool bCaseSens )
{
if ( !pSearchParam )
{
pSearchParam = new utl::SearchParam( *pStr, utl::SearchParam::SRCH_REGEXP,
bCaseSens, sal_False, sal_False );
pSearchText = new utl::TextSearch( *pSearchParam, *ScGlobal::pCharClass );
}
return pSearchText;
}
//------------------------------------------------------------------------
// struct ScSubTotalParam:
ScSubTotalParam::ScSubTotalParam()
{
for ( sal_uInt16 i=0; i<MAXSUBTOTAL; i++ )
{
nSubTotals[i] = 0;
pSubTotals[i] = NULL;
pFunctions[i] = NULL;
}
Clear();
}
//------------------------------------------------------------------------
ScSubTotalParam::ScSubTotalParam( const ScSubTotalParam& r ) :
nCol1(r.nCol1),nRow1(r.nRow1),nCol2(r.nCol2),nRow2(r.nRow2),
bRemoveOnly(r.bRemoveOnly),bReplace(r.bReplace),bPagebreak(r.bPagebreak),bCaseSens(r.bCaseSens),
bDoSort(r.bDoSort),bAscending(r.bAscending),bUserDef(r.bUserDef),nUserIndex(r.nUserIndex),
bIncludePattern(r.bIncludePattern)
{
for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++)
{
bGroupActive[i] = r.bGroupActive[i];
nField[i] = r.nField[i];
if ( (r.nSubTotals[i] > 0) && r.pSubTotals[i] && r.pFunctions[i] )
{
nSubTotals[i] = r.nSubTotals[i];
pSubTotals[i] = new SCCOL [r.nSubTotals[i]];
pFunctions[i] = new ScSubTotalFunc [r.nSubTotals[i]];
for (SCCOL j=0; j<r.nSubTotals[i]; j++)
{
pSubTotals[i][j] = r.pSubTotals[i][j];
pFunctions[i][j] = r.pFunctions[i][j];
}
}
else
{
nSubTotals[i] = 0;
pSubTotals[i] = NULL;
pFunctions[i] = NULL;
}
}
}
//------------------------------------------------------------------------
void ScSubTotalParam::Clear()
{
nCol1=nCol2= 0;
nRow1=nRow2 = 0;
nUserIndex = 0;
bPagebreak=bCaseSens=bUserDef=bIncludePattern=bRemoveOnly = sal_False;
bAscending=bReplace=bDoSort = sal_True;
for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++)
{
bGroupActive[i] = sal_False;
nField[i] = 0;
if ( (nSubTotals[i] > 0) && pSubTotals[i] && pFunctions[i] )
{
for ( SCCOL j=0; j<nSubTotals[i]; j++ ) {
pSubTotals[i][j] = 0;
pFunctions[i][j] = SUBTOTAL_FUNC_NONE;
}
}
}
}
//------------------------------------------------------------------------
ScSubTotalParam& ScSubTotalParam::operator=( const ScSubTotalParam& r )
{
nCol1 = r.nCol1;
nRow1 = r.nRow1;
nCol2 = r.nCol2;
nRow2 = r.nRow2;
bRemoveOnly = r.bRemoveOnly;
bReplace = r.bReplace;
bPagebreak = r.bPagebreak;
bCaseSens = r.bCaseSens;
bDoSort = r.bDoSort;
bAscending = r.bAscending;
bUserDef = r.bUserDef;
nUserIndex = r.nUserIndex;
bIncludePattern = r.bIncludePattern;
for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++)
{
bGroupActive[i] = r.bGroupActive[i];
nField[i] = r.nField[i];
nSubTotals[i] = r.nSubTotals[i];
if ( pSubTotals[i] ) delete [] pSubTotals[i];
if ( pFunctions[i] ) delete [] pFunctions[i];
if ( r.nSubTotals[i] > 0 )
{
pSubTotals[i] = new SCCOL [r.nSubTotals[i]];
pFunctions[i] = new ScSubTotalFunc [r.nSubTotals[i]];
for (SCCOL j=0; j<r.nSubTotals[i]; j++)
{
pSubTotals[i][j] = r.pSubTotals[i][j];
pFunctions[i][j] = r.pFunctions[i][j];
}
}
else
{
nSubTotals[i] = 0;
pSubTotals[i] = NULL;
pFunctions[i] = NULL;
}
}
return *this;
}
//------------------------------------------------------------------------
sal_Bool ScSubTotalParam::operator==( const ScSubTotalParam& rOther ) const
{
sal_Bool bEqual = (nCol1 == rOther.nCol1)
&& (nRow1 == rOther.nRow1)
&& (nCol2 == rOther.nCol2)
&& (nRow2 == rOther.nRow2)
&& (bRemoveOnly == rOther.bRemoveOnly)
&& (bReplace == rOther.bReplace)
&& (bPagebreak == rOther.bPagebreak)
&& (bDoSort == rOther.bDoSort)
&& (bCaseSens == rOther.bCaseSens)
&& (bAscending == rOther.bAscending)
&& (bUserDef == rOther.bUserDef)
&& (nUserIndex == rOther.nUserIndex)
&& (bIncludePattern== rOther.bIncludePattern);
if ( bEqual )
{
bEqual = sal_True;
for ( sal_uInt16 i=0; i<MAXSUBTOTAL && bEqual; i++ )
{
bEqual = (bGroupActive[i] == rOther.bGroupActive[i])
&& (nField[i] == rOther.nField[i])
&& (nSubTotals[i] == rOther.nSubTotals[i]);
if ( bEqual && (nSubTotals[i] > 0) )
{
bEqual = (pSubTotals != NULL) && (pFunctions != NULL);
for (SCCOL j=0; (j<nSubTotals[i]) && bEqual; j++)
{
bEqual = bEqual
&& (pSubTotals[i][j] == rOther.pSubTotals[i][j])
&& (pFunctions[i][j] == rOther.pFunctions[i][j]);
}
}
}
}
return bEqual;
}
//------------------------------------------------------------------------
void ScSubTotalParam::SetSubTotals( sal_uInt16 nGroup,
const SCCOL* ptrSubTotals,
const ScSubTotalFunc* ptrFunctions,
sal_uInt16 nCount )
{
DBG_ASSERT( (nGroup <= MAXSUBTOTAL),
"ScSubTotalParam::SetSubTotals(): nGroup > MAXSUBTOTAL!" );
DBG_ASSERT( ptrSubTotals,
"ScSubTotalParam::SetSubTotals(): ptrSubTotals == NULL!" );
DBG_ASSERT( ptrFunctions,
"ScSubTotalParam::SetSubTotals(): ptrFunctions == NULL!" );
DBG_ASSERT( (nCount > 0),
"ScSubTotalParam::SetSubTotals(): nCount <= 0!" );
if ( ptrSubTotals && ptrFunctions && (nCount > 0) && (nGroup <= MAXSUBTOTAL) )
{
// 0 wird als 1 aufgefasst, sonst zum Array-Index dekrementieren
if (nGroup != 0)
nGroup--;
delete [] pSubTotals[nGroup];
delete [] pFunctions[nGroup];
pSubTotals[nGroup] = new SCCOL [nCount];
pFunctions[nGroup] = new ScSubTotalFunc [nCount];
nSubTotals[nGroup] = static_cast<SCCOL>(nCount);
for ( sal_uInt16 i=0; i<nCount; i++ )
{
pSubTotals[nGroup][i] = ptrSubTotals[i];
pFunctions[nGroup][i] = ptrFunctions[i];
}
}
}
//------------------------------------------------------------------------
// struct ScConsolidateParam:
ScConsolidateParam::ScConsolidateParam() :
ppDataAreas( NULL )
{
Clear();
}
//------------------------------------------------------------------------
ScConsolidateParam::ScConsolidateParam( const ScConsolidateParam& r ) :
nCol(r.nCol),nRow(r.nRow),nTab(r.nTab),
eFunction(r.eFunction),nDataAreaCount(0),
ppDataAreas( NULL ),
bByCol(r.bByCol),bByRow(r.bByRow),bReferenceData(r.bReferenceData)
{
if ( r.nDataAreaCount > 0 )
{
nDataAreaCount = r.nDataAreaCount;
ppDataAreas = new ScArea*[nDataAreaCount];
for ( sal_uInt16 i=0; i<nDataAreaCount; i++ )
ppDataAreas[i] = new ScArea( *(r.ppDataAreas[i]) );
}
}
//------------------------------------------------------------------------
__EXPORT ScConsolidateParam::~ScConsolidateParam()
{
ClearDataAreas();
}
//------------------------------------------------------------------------
void __EXPORT ScConsolidateParam::ClearDataAreas()
{
if ( ppDataAreas )
{
for ( sal_uInt16 i=0; i<nDataAreaCount; i++ )
delete ppDataAreas[i];
delete [] ppDataAreas;
ppDataAreas = NULL;
}
nDataAreaCount = 0;
}
//------------------------------------------------------------------------
void __EXPORT ScConsolidateParam::Clear()
{
ClearDataAreas();
nCol = 0;
nRow = 0;
nTab = 0;
bByCol = bByRow = bReferenceData = sal_False;
eFunction = SUBTOTAL_FUNC_SUM;
}
//------------------------------------------------------------------------
ScConsolidateParam& __EXPORT ScConsolidateParam::operator=( const ScConsolidateParam& r )
{
nCol = r.nCol;
nRow = r.nRow;
nTab = r.nTab;
bByCol = r.bByCol;
bByRow = r.bByRow;
bReferenceData = r.bReferenceData;
eFunction = r.eFunction;
SetAreas( r.ppDataAreas, r.nDataAreaCount );
return *this;
}
//------------------------------------------------------------------------
sal_Bool __EXPORT ScConsolidateParam::operator==( const ScConsolidateParam& r ) const
{
sal_Bool bEqual = (nCol == r.nCol)
&& (nRow == r.nRow)
&& (nTab == r.nTab)
&& (bByCol == r.bByCol)
&& (bByRow == r.bByRow)
&& (bReferenceData == r.bReferenceData)
&& (nDataAreaCount == r.nDataAreaCount)
&& (eFunction == r.eFunction);
if ( nDataAreaCount == 0 )
bEqual = bEqual && (ppDataAreas == NULL) && (r.ppDataAreas == NULL);
else
bEqual = bEqual && (ppDataAreas != NULL) && (r.ppDataAreas != NULL);
if ( bEqual && (nDataAreaCount > 0) )
for ( sal_uInt16 i=0; i<nDataAreaCount && bEqual; i++ )
bEqual = *(ppDataAreas[i]) == *(r.ppDataAreas[i]);
return bEqual;
}
//------------------------------------------------------------------------
void __EXPORT ScConsolidateParam::SetAreas( ScArea* const* ppAreas, sal_uInt16 nCount )
{
ClearDataAreas();
if ( ppAreas && nCount > 0 )
{
ppDataAreas = new ScArea*[nCount];
for ( sal_uInt16 i=0; i<nCount; i++ )
ppDataAreas[i] = new ScArea( *(ppAreas[i]) );
nDataAreaCount = nCount;
}
}
//------------------------------------------------------------------------
// struct ScSolveParam
ScSolveParam::ScSolveParam()
: pStrTargetVal( NULL )
{
}
//------------------------------------------------------------------------
ScSolveParam::ScSolveParam( const ScSolveParam& r )
: aRefFormulaCell ( r.aRefFormulaCell ),
aRefVariableCell( r.aRefVariableCell ),
pStrTargetVal ( r.pStrTargetVal
? new String(*r.pStrTargetVal)
: NULL )
{
}
//------------------------------------------------------------------------
ScSolveParam::ScSolveParam( const ScAddress& rFormulaCell,
const ScAddress& rVariableCell,
const String& rTargetValStr )
: aRefFormulaCell ( rFormulaCell ),
aRefVariableCell( rVariableCell ),
pStrTargetVal ( new String(rTargetValStr) )
{
}
//------------------------------------------------------------------------
ScSolveParam::~ScSolveParam()
{
delete pStrTargetVal;
}
//------------------------------------------------------------------------
ScSolveParam& __EXPORT ScSolveParam::operator=( const ScSolveParam& r )
{
delete pStrTargetVal;
aRefFormulaCell = r.aRefFormulaCell;
aRefVariableCell = r.aRefVariableCell;
pStrTargetVal = r.pStrTargetVal
? new String(*r.pStrTargetVal)
: NULL;
return *this;
}
//------------------------------------------------------------------------
sal_Bool ScSolveParam::operator==( const ScSolveParam& r ) const
{
sal_Bool bEqual = (aRefFormulaCell == r.aRefFormulaCell)
&& (aRefVariableCell == r.aRefVariableCell);
if ( bEqual )
{
if ( !pStrTargetVal && !r.pStrTargetVal )
bEqual = sal_True;
else if ( !pStrTargetVal || !r.pStrTargetVal )
bEqual = sal_False;
else if ( pStrTargetVal && r.pStrTargetVal )
bEqual = ( *pStrTargetVal == *(r.pStrTargetVal) );
}
return bEqual;
}
//------------------------------------------------------------------------
// struct ScTabOpParam
ScTabOpParam::ScTabOpParam( const ScTabOpParam& r )
: aRefFormulaCell ( r.aRefFormulaCell ),
aRefFormulaEnd ( r.aRefFormulaEnd ),
aRefRowCell ( r.aRefRowCell ),
aRefColCell ( r.aRefColCell ),
nMode ( r.nMode )
{
}
//------------------------------------------------------------------------
ScTabOpParam::ScTabOpParam( const ScRefAddress& rFormulaCell,
const ScRefAddress& rFormulaEnd,
const ScRefAddress& rRowCell,
const ScRefAddress& rColCell,
sal_uInt8 nMd)
: aRefFormulaCell ( rFormulaCell ),
aRefFormulaEnd ( rFormulaEnd ),
aRefRowCell ( rRowCell ),
aRefColCell ( rColCell ),
nMode ( nMd )
{
}
//------------------------------------------------------------------------
ScTabOpParam& ScTabOpParam::operator=( const ScTabOpParam& r )
{
aRefFormulaCell = r.aRefFormulaCell;
aRefFormulaEnd = r.aRefFormulaEnd;
aRefRowCell = r.aRefRowCell;
aRefColCell = r.aRefColCell;
nMode = r.nMode;
return *this;
}
//------------------------------------------------------------------------
sal_Bool __EXPORT ScTabOpParam::operator==( const ScTabOpParam& r ) const
{
return ( (aRefFormulaCell == r.aRefFormulaCell)
&& (aRefFormulaEnd == r.aRefFormulaEnd)
&& (aRefRowCell == r.aRefRowCell)
&& (aRefColCell == r.aRefColCell)
&& (nMode == r.nMode) );
}
String ScGlobal::GetAbsDocName( const String& rFileName,
SfxObjectShell* pShell )
{
String aAbsName;
if ( !pShell->HasName() )
{ // maybe relative to document path working directory
INetURLObject aObj;
SvtPathOptions aPathOpt;
aObj.SetSmartURL( aPathOpt.GetWorkPath() );
aObj.setFinalSlash(); // it IS a path
bool bWasAbs = true;
aAbsName = aObj.smartRel2Abs( rFileName, bWasAbs ).GetMainURL(INetURLObject::NO_DECODE);
// returned string must be encoded because it's used directly to create SfxMedium
}
else
{
const SfxMedium* pMedium = pShell->GetMedium();
if ( pMedium )
{
bool bWasAbs = true;
aAbsName = pMedium->GetURLObject().smartRel2Abs( rFileName, bWasAbs ).GetMainURL(INetURLObject::NO_DECODE);
}
else
{ // This can't happen, but ...
// just to be sure to have the same encoding
INetURLObject aObj;
aObj.SetSmartURL( aAbsName );
aAbsName = aObj.GetMainURL(INetURLObject::NO_DECODE);
}
}
return aAbsName;
}
String ScGlobal::GetDocTabName( const String& rFileName,
const String& rTabName )
{
String aDocTab( '\'' );
aDocTab += rFileName;
xub_StrLen nPos = 1;
while( (nPos = aDocTab.Search( '\'', nPos ))
!= STRING_NOTFOUND )
{ // escape Quotes
aDocTab.Insert( '\\', nPos );
nPos += 2;
}
aDocTab += '\'';
aDocTab += SC_COMPILER_FILE_TAB_SEP;
aDocTab += rTabName; // "'Doc'#Tab"
return aDocTab;
}