2000-09-18 23:16:46 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-10 18:59:29 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2008-04-10 18:59:29 +00:00
|
|
|
* Copyright 2008 by Sun Microsystems, Inc.
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2008-04-10 18:59:29 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2008-04-10 18:59:29 +00:00
|
|
|
* $RCSfile: rangeutl.cxx,v $
|
2008-09-30 05:48:28 +00:00
|
|
|
* $Revision: 1.12.30.4 $
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2008-04-10 18:59:29 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2008-04-10 18:59:29 +00:00
|
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
|
|
* only, as published by the Free Software Foundation.
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2008-04-10 18:59:29 +00:00
|
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU Lesser General Public License version 3 for more details
|
|
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2008-04-10 18:59:29 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
|
|
* <http://www.openoffice.org/license.html>
|
|
|
|
* for a copy of the LGPLv3 License.
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
2006-07-21 10:41:52 +00:00
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_sc.hxx"
|
|
|
|
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
// INCLUDE ---------------------------------------------------------------
|
|
|
|
|
|
|
|
#include <tools/debug.hxx>
|
|
|
|
|
|
|
|
#include "rangeutl.hxx"
|
|
|
|
#include "document.hxx"
|
|
|
|
#include "global.hxx"
|
|
|
|
#include "dbcolect.hxx"
|
|
|
|
#include "rangenam.hxx"
|
|
|
|
#include "scresid.hxx"
|
|
|
|
#include "globstr.hrc"
|
2007-05-22 18:43:40 +00:00
|
|
|
#include "convuno.hxx"
|
2000-09-18 23:16:46 +00:00
|
|
|
|
2008-03-12 12:15:01 +00:00
|
|
|
using ::rtl::OUString;
|
2007-05-22 18:43:40 +00:00
|
|
|
using namespace ::com::sun::star;
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
|
|
|
|
|
|
BOOL ScRangeUtil::MakeArea( const String& rAreaStr,
|
|
|
|
ScArea& rArea,
|
|
|
|
ScDocument* pDoc,
|
2006-10-18 11:23:33 +00:00
|
|
|
SCTAB nTab,
|
|
|
|
ScAddress::Details const & rDetails ) const
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
// Eingabe in rAreaStr: "$Tabelle1.$A1:$D17"
|
|
|
|
|
2006-10-18 11:23:33 +00:00
|
|
|
// BROKEN BROKEN BROKEN
|
|
|
|
// but it is only used in the consolidate dialog. Ignore for now.
|
|
|
|
|
2000-09-18 23:16:46 +00:00
|
|
|
BOOL nSuccess = FALSE;
|
|
|
|
USHORT nPointPos = rAreaStr.Search('.');
|
|
|
|
USHORT nColonPos = rAreaStr.Search(':');
|
|
|
|
String aStrArea( rAreaStr );
|
2004-06-04 09:38:52 +00:00
|
|
|
ScRefAddress startPos;
|
|
|
|
ScRefAddress endPos;
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
if ( nColonPos == STRING_NOTFOUND )
|
|
|
|
if ( nPointPos != STRING_NOTFOUND )
|
|
|
|
{
|
|
|
|
aStrArea += ':';
|
|
|
|
aStrArea += rAreaStr.Copy( nPointPos+1 ); // '.' nicht mitkopieren
|
|
|
|
}
|
|
|
|
|
2006-10-18 11:23:33 +00:00
|
|
|
nSuccess = ConvertDoubleRef( pDoc, aStrArea, nTab, startPos, endPos, rDetails );
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
if ( nSuccess )
|
2004-06-04 09:38:52 +00:00
|
|
|
rArea = ScArea( startPos.Tab(),
|
|
|
|
startPos.Col(), startPos.Row(),
|
|
|
|
endPos.Col(), endPos.Row() );
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
return nSuccess;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ScRangeUtil::CutPosString( const String& theAreaStr,
|
|
|
|
String& thePosStr ) const
|
|
|
|
{
|
|
|
|
String aPosStr;
|
2006-10-18 11:23:33 +00:00
|
|
|
// BROKEN BROKEN BROKEN
|
|
|
|
// but it is only used in the consolidate dialog. Ignore for now.
|
|
|
|
|
2000-09-18 23:16:46 +00:00
|
|
|
USHORT nColonPos = theAreaStr.Search(':');
|
|
|
|
|
|
|
|
if ( nColonPos != STRING_NOTFOUND )
|
|
|
|
aPosStr = theAreaStr.Copy( 0, nColonPos ); // ':' nicht mitkopieren
|
|
|
|
else
|
|
|
|
aPosStr = theAreaStr;
|
|
|
|
|
|
|
|
thePosStr = aPosStr;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
|
|
|
|
|
|
BOOL ScRangeUtil::IsAbsTabArea( const String& rAreaStr,
|
|
|
|
ScDocument* pDoc,
|
|
|
|
ScArea*** pppAreas,
|
2000-11-03 14:56:03 +00:00
|
|
|
USHORT* pAreaCount,
|
2007-02-27 11:18:25 +00:00
|
|
|
BOOL /* bAcceptCellRef */,
|
2006-10-18 11:23:33 +00:00
|
|
|
ScAddress::Details const & rDetails ) const
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
DBG_ASSERT( pDoc, "Kein Dokument uebergeben!" );
|
|
|
|
if ( !pDoc )
|
|
|
|
return FALSE;
|
|
|
|
|
2006-10-18 11:23:33 +00:00
|
|
|
// BROKEN BROKEN BROKEN
|
|
|
|
// but it is only used in the consolidate dialog. Ignore for now.
|
|
|
|
|
2000-09-18 23:16:46 +00:00
|
|
|
/*
|
|
|
|
* Erwartet wird ein String der Form
|
|
|
|
* "$Tabelle1.$A$1:$Tabelle3.$D$17"
|
2000-11-03 14:56:03 +00:00
|
|
|
* Wenn bAcceptCellRef == TRUE ist, wird auch ein String der Form
|
|
|
|
* "$Tabelle1.$A$1"
|
|
|
|
* akzeptiert.
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
|
|
|
* als Ergebnis wird ein ScArea-Array angelegt,
|
|
|
|
* welches ueber ppAreas bekannt gegeben wird und auch
|
|
|
|
* wieder geloescht werden muss!
|
|
|
|
*/
|
|
|
|
|
|
|
|
BOOL bStrOk = FALSE;
|
2000-11-03 14:56:03 +00:00
|
|
|
String aTempAreaStr(rAreaStr);
|
2000-09-18 23:16:46 +00:00
|
|
|
String aStartPosStr;
|
|
|
|
String aEndPosStr;
|
|
|
|
|
2000-11-03 14:56:03 +00:00
|
|
|
if ( STRING_NOTFOUND == aTempAreaStr.Search(':') )
|
|
|
|
{
|
|
|
|
aTempAreaStr.Append(':');
|
|
|
|
aTempAreaStr.Append(rAreaStr);
|
|
|
|
}
|
|
|
|
|
|
|
|
USHORT nColonPos = aTempAreaStr.Search(':');
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
if ( STRING_NOTFOUND != nColonPos
|
2000-11-03 14:56:03 +00:00
|
|
|
&& STRING_NOTFOUND != aTempAreaStr.Search('.') )
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
2004-06-04 09:38:52 +00:00
|
|
|
ScRefAddress aStartPos;
|
|
|
|
ScRefAddress aEndPos;
|
2000-09-18 23:16:46 +00:00
|
|
|
|
2000-11-03 14:56:03 +00:00
|
|
|
aStartPosStr = aTempAreaStr.Copy( 0, nColonPos );
|
|
|
|
aEndPosStr = aTempAreaStr.Copy( nColonPos+1, STRING_LEN );
|
2000-09-18 23:16:46 +00:00
|
|
|
|
2006-10-18 11:23:33 +00:00
|
|
|
if ( ConvertSingleRef( pDoc, aStartPosStr, 0, aStartPos, rDetails ) )
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
2006-10-18 11:23:33 +00:00
|
|
|
if ( ConvertSingleRef( pDoc, aEndPosStr, aStartPos.Tab(), aEndPos, rDetails ) )
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
aStartPos.SetRelCol( FALSE );
|
|
|
|
aStartPos.SetRelRow( FALSE );
|
|
|
|
aStartPos.SetRelTab( FALSE );
|
|
|
|
aEndPos.SetRelCol( FALSE );
|
|
|
|
aEndPos.SetRelRow( FALSE );
|
|
|
|
aEndPos.SetRelTab( FALSE );
|
|
|
|
|
|
|
|
bStrOk = TRUE;
|
|
|
|
|
|
|
|
if ( pppAreas && pAreaCount ) // Array zurueckgegeben?
|
|
|
|
{
|
2004-06-04 09:38:52 +00:00
|
|
|
SCTAB nStartTab = aStartPos.Tab();
|
|
|
|
SCTAB nEndTab = aEndPos.Tab();
|
|
|
|
USHORT nTabCount = static_cast<USHORT>(nEndTab-nStartTab+1);
|
2000-09-18 23:16:46 +00:00
|
|
|
ScArea** theAreas = new ScArea*[nTabCount];
|
2004-06-04 09:38:52 +00:00
|
|
|
SCTAB nTab = 0;
|
2000-09-18 23:16:46 +00:00
|
|
|
USHORT i = 0;
|
2004-06-04 09:38:52 +00:00
|
|
|
ScArea theArea( 0, aStartPos.Col(), aStartPos.Row(),
|
|
|
|
aEndPos.Col(), aEndPos.Row() );
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
nTab = nStartTab;
|
|
|
|
for ( i=0; i<nTabCount; i++ )
|
|
|
|
{
|
|
|
|
theAreas[i] = new ScArea( theArea );
|
|
|
|
theAreas[i]->nTab = nTab;
|
|
|
|
nTab++;
|
|
|
|
}
|
|
|
|
*pppAreas = theAreas;
|
|
|
|
*pAreaCount = nTabCount;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return bStrOk;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
|
|
|
|
|
|
BOOL ScRangeUtil::IsAbsArea( const String& rAreaStr,
|
|
|
|
ScDocument* pDoc,
|
2004-06-04 09:38:52 +00:00
|
|
|
SCTAB nTab,
|
2000-09-18 23:16:46 +00:00
|
|
|
String* pCompleteStr,
|
2004-06-04 09:38:52 +00:00
|
|
|
ScRefAddress* pStartPos,
|
2006-10-18 11:23:33 +00:00
|
|
|
ScRefAddress* pEndPos,
|
|
|
|
ScAddress::Details const & rDetails ) const
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
BOOL bIsAbsArea = FALSE;
|
2004-06-04 09:38:52 +00:00
|
|
|
ScRefAddress startPos;
|
|
|
|
ScRefAddress endPos;
|
2000-09-18 23:16:46 +00:00
|
|
|
|
2006-10-18 11:23:33 +00:00
|
|
|
bIsAbsArea = ConvertDoubleRef( pDoc, rAreaStr, nTab, startPos, endPos, rDetails );
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
if ( bIsAbsArea )
|
|
|
|
{
|
|
|
|
startPos.SetRelCol( FALSE );
|
|
|
|
startPos.SetRelRow( FALSE );
|
|
|
|
startPos.SetRelTab( FALSE );
|
|
|
|
endPos .SetRelCol( FALSE );
|
|
|
|
endPos .SetRelRow( FALSE );
|
|
|
|
endPos .SetRelTab( FALSE );
|
|
|
|
|
|
|
|
if ( pCompleteStr )
|
|
|
|
{
|
2006-10-18 11:23:33 +00:00
|
|
|
*pCompleteStr = startPos.GetRefString( pDoc, MAXTAB+1, rDetails );
|
2000-09-18 23:16:46 +00:00
|
|
|
*pCompleteStr += ':';
|
2006-10-18 11:23:33 +00:00
|
|
|
*pCompleteStr += endPos .GetRefString( pDoc, nTab, rDetails );
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( pStartPos && pEndPos )
|
|
|
|
{
|
|
|
|
*pStartPos = startPos;
|
|
|
|
*pEndPos = endPos;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return bIsAbsArea;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
|
|
|
|
|
|
BOOL ScRangeUtil::IsAbsPos( const String& rPosStr,
|
|
|
|
ScDocument* pDoc,
|
2004-06-04 09:38:52 +00:00
|
|
|
SCTAB nTab,
|
2000-09-18 23:16:46 +00:00
|
|
|
String* pCompleteStr,
|
2006-10-18 11:23:33 +00:00
|
|
|
ScRefAddress* pPosTripel,
|
|
|
|
ScAddress::Details const & rDetails ) const
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
BOOL bIsAbsPos = FALSE;
|
2004-06-04 09:38:52 +00:00
|
|
|
ScRefAddress thePos;
|
2000-09-18 23:16:46 +00:00
|
|
|
|
2006-10-18 11:23:33 +00:00
|
|
|
bIsAbsPos = ConvertSingleRef( pDoc, rPosStr, nTab, thePos, rDetails );
|
2000-09-18 23:16:46 +00:00
|
|
|
thePos.SetRelCol( FALSE );
|
|
|
|
thePos.SetRelRow( FALSE );
|
|
|
|
thePos.SetRelTab( FALSE );
|
|
|
|
|
|
|
|
if ( bIsAbsPos )
|
|
|
|
{
|
|
|
|
if ( pPosTripel )
|
|
|
|
*pPosTripel = thePos;
|
|
|
|
if ( pCompleteStr )
|
2006-10-18 11:23:33 +00:00
|
|
|
*pCompleteStr = thePos.GetRefString( pDoc, MAXTAB+1, rDetails );
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return bIsAbsPos;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
|
|
|
|
|
|
BOOL ScRangeUtil::MakeRangeFromName (
|
|
|
|
const String& rName,
|
|
|
|
ScDocument* pDoc,
|
2004-06-04 09:38:52 +00:00
|
|
|
SCTAB nCurTab,
|
2000-09-18 23:16:46 +00:00
|
|
|
ScRange& rRange,
|
2006-10-18 11:23:33 +00:00
|
|
|
RutlNameScope eScope,
|
|
|
|
ScAddress::Details const & rDetails ) const
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
BOOL bResult=FALSE;
|
|
|
|
ScRangeUtil aRangeUtil;
|
2007-02-27 11:18:25 +00:00
|
|
|
SCTAB nTab = 0;
|
|
|
|
SCCOL nColStart = 0;
|
|
|
|
SCCOL nColEnd = 0;
|
|
|
|
SCROW nRowStart = 0;
|
|
|
|
SCROW nRowEnd = 0;
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
if( eScope==RUTL_NAMES )
|
|
|
|
{
|
|
|
|
ScRangeName& rRangeNames = *(pDoc->GetRangeName());
|
|
|
|
USHORT nAt = 0;
|
|
|
|
|
|
|
|
if ( rRangeNames.SearchName( rName, nAt ) )
|
|
|
|
{
|
|
|
|
ScRangeData* pData = rRangeNames[nAt];
|
|
|
|
String aStrArea;
|
2004-06-04 09:38:52 +00:00
|
|
|
ScRefAddress aStartPos;
|
|
|
|
ScRefAddress aEndPos;
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
pData->GetSymbol( aStrArea );
|
|
|
|
|
|
|
|
if ( IsAbsArea( aStrArea, pDoc, nCurTab,
|
2006-10-18 11:23:33 +00:00
|
|
|
NULL, &aStartPos, &aEndPos, rDetails ) )
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
2004-06-04 09:38:52 +00:00
|
|
|
nTab = aStartPos.Tab();
|
|
|
|
nColStart = aStartPos.Col();
|
|
|
|
nRowStart = aStartPos.Row();
|
|
|
|
nColEnd = aEndPos.Col();
|
|
|
|
nRowEnd = aEndPos.Row();
|
2000-09-18 23:16:46 +00:00
|
|
|
bResult = TRUE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
CutPosString( aStrArea, aStrArea );
|
|
|
|
|
|
|
|
if ( IsAbsPos( aStrArea, pDoc, nCurTab,
|
2006-10-18 11:23:33 +00:00
|
|
|
NULL, &aStartPos, rDetails ) )
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
2004-06-04 09:38:52 +00:00
|
|
|
nTab = aStartPos.Tab();
|
|
|
|
nColStart = nColEnd = aStartPos.Col();
|
|
|
|
nRowStart = nRowEnd = aStartPos.Row();
|
2000-09-18 23:16:46 +00:00
|
|
|
bResult = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if( eScope==RUTL_DBASE )
|
|
|
|
{
|
|
|
|
ScDBCollection& rDbNames = *(pDoc->GetDBCollection());
|
|
|
|
USHORT nAt = 0;
|
|
|
|
|
|
|
|
if ( rDbNames.SearchName( rName, nAt ) )
|
|
|
|
{
|
|
|
|
ScDBData* pData = rDbNames[nAt];
|
|
|
|
|
|
|
|
pData->GetArea( nTab, nColStart, nRowStart,
|
|
|
|
nColEnd, nRowEnd );
|
|
|
|
bResult = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
DBG_ERROR( "ScRangeUtil::MakeRangeFromName" );
|
|
|
|
}
|
|
|
|
|
|
|
|
if( bResult )
|
|
|
|
{
|
|
|
|
rRange = ScRange( nColStart, nRowStart, nTab, nColEnd, nRowEnd, nTab );
|
|
|
|
}
|
|
|
|
|
|
|
|
return bResult;
|
|
|
|
}
|
|
|
|
|
|
|
|
//========================================================================
|
|
|
|
|
2007-05-22 18:43:40 +00:00
|
|
|
void ScRangeStringConverter::AssignString(
|
|
|
|
OUString& rString,
|
|
|
|
const OUString& rNewStr,
|
|
|
|
sal_Bool bAppendStr,
|
|
|
|
sal_Unicode cSeperator)
|
|
|
|
{
|
|
|
|
if( bAppendStr )
|
|
|
|
{
|
|
|
|
if( rNewStr.getLength() )
|
|
|
|
{
|
|
|
|
if( rString.getLength() )
|
|
|
|
rString += rtl::OUString(cSeperator);
|
|
|
|
rString += rNewStr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
rString = rNewStr;
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Int32 ScRangeStringConverter::IndexOf(
|
|
|
|
const OUString& rString,
|
|
|
|
sal_Unicode cSearchChar,
|
|
|
|
sal_Int32 nOffset,
|
|
|
|
sal_Unicode cQuote )
|
|
|
|
{
|
|
|
|
sal_Int32 nLength = rString.getLength();
|
|
|
|
sal_Int32 nIndex = nOffset;
|
|
|
|
sal_Bool bQuoted = sal_False;
|
|
|
|
sal_Bool bExitLoop = sal_False;
|
|
|
|
|
|
|
|
while( !bExitLoop && (nIndex < nLength) )
|
|
|
|
{
|
|
|
|
sal_Unicode cCode = rString[ nIndex ];
|
|
|
|
bExitLoop = (cCode == cSearchChar) && !bQuoted;
|
|
|
|
bQuoted = (bQuoted != (cCode == cQuote));
|
|
|
|
if( !bExitLoop )
|
|
|
|
nIndex++;
|
|
|
|
}
|
|
|
|
return (nIndex < nLength) ? nIndex : -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Int32 ScRangeStringConverter::IndexOfDifferent(
|
|
|
|
const OUString& rString,
|
|
|
|
sal_Unicode cSearchChar,
|
|
|
|
sal_Int32 nOffset )
|
|
|
|
{
|
|
|
|
sal_Int32 nLength = rString.getLength();
|
|
|
|
sal_Int32 nIndex = nOffset;
|
|
|
|
sal_Bool bExitLoop = sal_False;
|
|
|
|
|
|
|
|
while( !bExitLoop && (nIndex < nLength) )
|
|
|
|
{
|
|
|
|
bExitLoop = (rString[ nIndex ] != cSearchChar);
|
|
|
|
if( !bExitLoop )
|
|
|
|
nIndex++;
|
|
|
|
}
|
|
|
|
return (nIndex < nLength) ? nIndex : -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScRangeStringConverter::GetTokenByOffset(
|
|
|
|
OUString& rToken,
|
|
|
|
const OUString& rString,
|
|
|
|
sal_Int32& nOffset,
|
|
|
|
sal_Unicode cSeperator,
|
|
|
|
sal_Unicode cQuote)
|
|
|
|
{
|
|
|
|
sal_Int32 nLength = rString.getLength();
|
|
|
|
if( nOffset >= nLength )
|
|
|
|
{
|
|
|
|
rToken = OUString();
|
|
|
|
nOffset = -1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
sal_Int32 nTokenEnd = IndexOf( rString, cSeperator, nOffset, cQuote );
|
|
|
|
if( nTokenEnd < 0 )
|
|
|
|
nTokenEnd = nLength;
|
|
|
|
rToken = rString.copy( nOffset, nTokenEnd - nOffset );
|
|
|
|
|
|
|
|
sal_Int32 nNextBegin = IndexOfDifferent( rString, cSeperator, nTokenEnd );
|
|
|
|
nOffset = (nNextBegin < 0) ? nLength : nNextBegin;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Int32 ScRangeStringConverter::GetTokenCount( const OUString& rString, sal_Unicode cSeperator, sal_Unicode cQuote )
|
|
|
|
{
|
|
|
|
OUString sToken;
|
|
|
|
sal_Int32 nCount = 0;
|
|
|
|
sal_Int32 nOffset = 0;
|
|
|
|
while( nOffset >= 0 )
|
|
|
|
{
|
|
|
|
GetTokenByOffset( sToken, rString, nOffset, cQuote, cSeperator );
|
|
|
|
if( nOffset >= 0 )
|
|
|
|
nCount++;
|
|
|
|
}
|
|
|
|
return nCount;
|
|
|
|
}
|
|
|
|
|
|
|
|
//___________________________________________________________________
|
|
|
|
|
|
|
|
sal_Bool ScRangeStringConverter::GetAddressFromString(
|
|
|
|
ScAddress& rAddress,
|
|
|
|
const OUString& rAddressStr,
|
|
|
|
const ScDocument* pDocument,
|
|
|
|
sal_Int32& nOffset,
|
|
|
|
sal_Unicode cSeperator,
|
|
|
|
sal_Unicode cQuote )
|
|
|
|
{
|
|
|
|
OUString sToken;
|
|
|
|
GetTokenByOffset( sToken, rAddressStr, nOffset, cSeperator, cQuote );
|
|
|
|
if( nOffset >= 0 )
|
2008-05-14 08:53:33 +00:00
|
|
|
return ((rAddress.Parse( sToken, const_cast<ScDocument*>(pDocument), pDocument->GetAddressConvention() ) & SCA_VALID) == SCA_VALID);
|
2007-05-22 18:43:40 +00:00
|
|
|
return sal_False;
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Bool ScRangeStringConverter::GetRangeFromString(
|
|
|
|
ScRange& rRange,
|
|
|
|
const OUString& rRangeStr,
|
|
|
|
const ScDocument* pDocument,
|
|
|
|
sal_Int32& nOffset,
|
|
|
|
sal_Unicode cSeperator,
|
|
|
|
sal_Unicode cQuote )
|
|
|
|
{
|
|
|
|
OUString sToken;
|
|
|
|
sal_Bool bResult(sal_False);
|
|
|
|
GetTokenByOffset( sToken, rRangeStr, nOffset, cSeperator, cQuote );
|
|
|
|
if( nOffset >= 0 )
|
|
|
|
{
|
|
|
|
sal_Int32 nIndex = IndexOf( sToken, ':', 0, cQuote );
|
|
|
|
String aUIString(sToken);
|
|
|
|
|
|
|
|
if( nIndex < 0 )
|
|
|
|
{
|
|
|
|
if ( aUIString.GetChar(0) == (sal_Unicode) '.' )
|
|
|
|
aUIString.Erase( 0, 1 );
|
2008-05-14 08:53:33 +00:00
|
|
|
bResult = ((rRange.aStart.Parse( aUIString, const_cast<ScDocument*> (pDocument), pDocument->GetAddressConvention()) & SCA_VALID) == SCA_VALID);
|
2007-05-22 18:43:40 +00:00
|
|
|
rRange.aEnd = rRange.aStart;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( aUIString.GetChar(0) == (sal_Unicode) '.' )
|
2008-07-01 15:24:27 +00:00
|
|
|
{
|
2007-05-22 18:43:40 +00:00
|
|
|
aUIString.Erase( 0, 1 );
|
2008-07-01 15:24:27 +00:00
|
|
|
--nIndex;
|
|
|
|
}
|
2007-05-22 18:43:40 +00:00
|
|
|
|
|
|
|
if ( nIndex < aUIString.Len() - 1 &&
|
|
|
|
aUIString.GetChar((xub_StrLen)nIndex + 1) == (sal_Unicode) '.' )
|
|
|
|
aUIString.Erase( (xub_StrLen)nIndex + 1, 1 );
|
|
|
|
|
|
|
|
bResult = ((rRange.Parse(aUIString, const_cast<ScDocument*> (pDocument)) & SCA_VALID) == SCA_VALID);
|
2008-07-01 15:24:27 +00:00
|
|
|
|
|
|
|
// #i77703# chart ranges in the file format contain both sheet names, even for an external reference sheet.
|
|
|
|
// This isn't parsed by ScRange, so try to parse the two Addresses then.
|
|
|
|
if (!bResult)
|
|
|
|
bResult = ((rRange.aStart.Parse( aUIString.Copy(0, (xub_StrLen)nIndex), const_cast<ScDocument*>(pDocument),
|
|
|
|
pDocument->GetAddressConvention()) & SCA_VALID) == SCA_VALID) &&
|
|
|
|
((rRange.aEnd.Parse( aUIString.Copy((xub_StrLen)nIndex+1), const_cast<ScDocument*>(pDocument),
|
|
|
|
pDocument->GetAddressConvention()) & SCA_VALID) == SCA_VALID);
|
2007-05-22 18:43:40 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return bResult;
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Bool ScRangeStringConverter::GetRangeListFromString(
|
|
|
|
ScRangeList& rRangeList,
|
|
|
|
const OUString& rRangeListStr,
|
|
|
|
const ScDocument* pDocument,
|
|
|
|
sal_Unicode cSeperator,
|
|
|
|
sal_Unicode cQuote )
|
|
|
|
{
|
|
|
|
sal_Bool bRet = sal_True;
|
|
|
|
DBG_ASSERT( rRangeListStr.getLength(), "ScXMLConverter::GetRangeListFromString - empty string!" );
|
|
|
|
sal_Int32 nOffset = 0;
|
|
|
|
while( nOffset >= 0 )
|
|
|
|
{
|
|
|
|
ScRange* pRange = new ScRange;
|
|
|
|
if( GetRangeFromString( *pRange, rRangeListStr, pDocument, nOffset, cSeperator, cQuote ) && (nOffset >= 0) )
|
|
|
|
rRangeList.Insert( pRange, LIST_APPEND );
|
|
|
|
else if (nOffset > -1)
|
|
|
|
bRet = sal_False;
|
|
|
|
}
|
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//___________________________________________________________________
|
|
|
|
|
|
|
|
sal_Bool ScRangeStringConverter::GetAreaFromString(
|
|
|
|
ScArea& rArea,
|
|
|
|
const OUString& rRangeStr,
|
|
|
|
const ScDocument* pDocument,
|
|
|
|
sal_Int32& nOffset,
|
|
|
|
sal_Unicode cSeperator,
|
|
|
|
sal_Unicode cQuote )
|
|
|
|
{
|
|
|
|
ScRange aScRange;
|
|
|
|
sal_Bool bResult(sal_False);
|
|
|
|
if( GetRangeFromString( aScRange, rRangeStr, pDocument, nOffset, cSeperator, cQuote ) && (nOffset >= 0) )
|
|
|
|
{
|
|
|
|
rArea.nTab = aScRange.aStart.Tab();
|
|
|
|
rArea.nColStart = aScRange.aStart.Col();
|
|
|
|
rArea.nRowStart = aScRange.aStart.Row();
|
|
|
|
rArea.nColEnd = aScRange.aEnd.Col();
|
|
|
|
rArea.nRowEnd = aScRange.aEnd.Row();
|
|
|
|
bResult = sal_True;
|
|
|
|
}
|
|
|
|
return bResult;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//___________________________________________________________________
|
|
|
|
|
|
|
|
sal_Bool ScRangeStringConverter::GetAddressFromString(
|
|
|
|
table::CellAddress& rAddress,
|
|
|
|
const OUString& rAddressStr,
|
|
|
|
const ScDocument* pDocument,
|
|
|
|
sal_Int32& nOffset,
|
|
|
|
sal_Unicode cSeperator,
|
|
|
|
sal_Unicode cQuote )
|
|
|
|
{
|
|
|
|
ScAddress aScAddress;
|
|
|
|
sal_Bool bResult(sal_False);
|
|
|
|
if( GetAddressFromString( aScAddress, rAddressStr, pDocument, nOffset, cSeperator, cQuote ) && (nOffset >= 0) )
|
|
|
|
{
|
|
|
|
ScUnoConversion::FillApiAddress( rAddress, aScAddress );
|
|
|
|
bResult = sal_True;
|
|
|
|
}
|
|
|
|
return bResult;
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Bool ScRangeStringConverter::GetRangeFromString(
|
|
|
|
table::CellRangeAddress& rRange,
|
|
|
|
const OUString& rRangeStr,
|
|
|
|
const ScDocument* pDocument,
|
|
|
|
sal_Int32& nOffset,
|
|
|
|
sal_Unicode cSeperator,
|
|
|
|
sal_Unicode cQuote )
|
|
|
|
{
|
|
|
|
ScRange aScRange;
|
|
|
|
sal_Bool bResult(sal_False);
|
|
|
|
if( GetRangeFromString( aScRange, rRangeStr, pDocument, nOffset, cSeperator, cQuote ) && (nOffset >= 0) )
|
|
|
|
{
|
|
|
|
ScUnoConversion::FillApiRange( rRange, aScRange );
|
|
|
|
bResult = sal_True;
|
|
|
|
}
|
|
|
|
return bResult;
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Bool ScRangeStringConverter::GetRangeListFromString(
|
|
|
|
uno::Sequence< table::CellRangeAddress >& rRangeSeq,
|
|
|
|
const OUString& rRangeListStr,
|
|
|
|
const ScDocument* pDocument,
|
|
|
|
sal_Unicode cSeperator,
|
|
|
|
sal_Unicode cQuote )
|
|
|
|
{
|
|
|
|
sal_Bool bRet = sal_True;
|
|
|
|
DBG_ASSERT( rRangeListStr.getLength(), "ScXMLConverter::GetRangeListFromString - empty string!" );
|
|
|
|
table::CellRangeAddress aRange;
|
|
|
|
sal_Int32 nOffset = 0;
|
|
|
|
while( nOffset >= 0 )
|
|
|
|
{
|
|
|
|
if( GetRangeFromString( aRange, rRangeListStr, pDocument, nOffset, cSeperator, cQuote ) && (nOffset >= 0) )
|
|
|
|
{
|
|
|
|
rRangeSeq.realloc( rRangeSeq.getLength() + 1 );
|
|
|
|
rRangeSeq[ rRangeSeq.getLength() - 1 ] = aRange;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
bRet = sal_False;
|
|
|
|
}
|
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//___________________________________________________________________
|
|
|
|
|
|
|
|
void ScRangeStringConverter::GetStringFromAddress(
|
|
|
|
OUString& rString,
|
|
|
|
const ScAddress& rAddress,
|
|
|
|
const ScDocument* pDocument,
|
|
|
|
sal_Unicode cSeperator,
|
|
|
|
sal_Bool bAppendStr,
|
|
|
|
sal_uInt16 nFormatFlags )
|
|
|
|
{
|
|
|
|
if (pDocument && pDocument->HasTable(rAddress.Tab()))
|
|
|
|
{
|
|
|
|
String sAddress;
|
2008-05-14 08:53:33 +00:00
|
|
|
rAddress.Format( sAddress, nFormatFlags, (ScDocument*) pDocument, pDocument->GetAddressConvention() );
|
2007-05-22 18:43:40 +00:00
|
|
|
AssignString( rString, sAddress, bAppendStr, cSeperator );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScRangeStringConverter::GetStringFromRange(
|
|
|
|
OUString& rString,
|
|
|
|
const ScRange& rRange,
|
|
|
|
const ScDocument* pDocument,
|
|
|
|
sal_Unicode cSeperator,
|
|
|
|
sal_Bool bAppendStr,
|
|
|
|
sal_uInt16 nFormatFlags )
|
|
|
|
{
|
|
|
|
if (pDocument && pDocument->HasTable(rRange.aStart.Tab()))
|
|
|
|
{
|
|
|
|
ScAddress aStartAddress( rRange.aStart );
|
|
|
|
ScAddress aEndAddress( rRange.aEnd );
|
|
|
|
String sStartAddress;
|
|
|
|
String sEndAddress;
|
CWS-TOOLING: integrate CWS frmdlg
2008-12-18 09:13:09 +0100 oj r265667 : merge from odff05
2008-12-18 07:58:16 +0100 oj r265658 : #i94555# patch from <regina>, ODFF:
Add GAMMA, CHISQDIST, CHISQINV.
Make the 'cumulative' parameter of GAMMADIST optional.
Adapt the domain of CHIDIST to allow negative x.
Remove the constraint "degrees of freedom < 1.0E5" from CHIDIST and CHIINV.
Plus a mechanism to write the now optional parameter of GAMMADIST to PODF and
ODFF if omitted, for backwards compatibility.
2008-12-15 14:06:11 +0100 oj r265490 : CWS-TOOLING: rebase CWS frmdlg to trunk@264807 (milestone: DEV300:m37)
2008-12-15 13:55:28 +0100 oj r265488 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:55:07 +0100 oj r265487 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:48 +0100 oj r265486 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:36 +0100 oj r265485 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:24 +0100 oj r265484 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:48:11 +0100 oj r265483 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:31:12 +0100 oj r265479 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:13:58 +0100 oj r265477 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:10:09 +0100 oj r265476 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:05:11 +0100 oj r265475 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:47:17 +0100 oj r265467 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:46:19 +0100 oj r265466 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:45:47 +0100 oj r265465 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 07:35:07 +0100 oj r265458 : add dependency to formula
2008-12-15 07:34:24 +0100 oj r265457 : add dependency to formula
2008-12-12 13:22:00 +0100 msc r265413 : #i97089#
2008-12-12 13:20:25 +0100 msc r265412 : #i97089#
2008-12-12 12:35:12 +0100 msc r265406 : #i97089#
2008-12-12 12:34:16 +0100 msc r265405 : #i97089#
2008-12-12 12:33:05 +0100 msc r265404 : #i97089#
2008-12-12 12:31:11 +0100 msc r265403 : #i97089#
2008-12-08 11:59:10 +0100 oj r264981 : insert RTL_LOG
2008-12-08 11:50:17 +0100 oj r264980 : some small changes
2008-12-05 12:57:57 +0100 oj r264902 : eof changed
2008-12-05 12:56:46 +0100 oj r264901 : eof changed
2008-12-05 12:28:47 +0100 oj r264899 : wrong var used
2008-12-05 10:08:57 +0100 oj r264890 : token order reversed
2008-12-04 13:49:22 +0100 oc r264843 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:45:27 +0100 oc r264842 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:42:54 +0100 oc r264841 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:37:41 +0100 oc r264840 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:34:11 +0100 oc r264839 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 12:35:31 +0100 oj r264835 : new help ids for struct and function tabpage
2008-12-04 12:00:35 +0100 oj r264828 : set explicit help id
2008-12-03 14:53:27 +0100 oj r264786 : #i96845# change ref button
2008-12-03 14:51:49 +0100 oj r264785 : #i96845# change ref button
2008-12-03 08:51:57 +0100 oj r264746 : convert dos to unix lineends
2008-12-03 08:50:45 +0100 oj r264745 : convert dos to unix lineends
2008-12-03 08:50:05 +0100 oj r264744 : convert dos to unix lineends
2008-12-02 12:28:33 +0100 oj r264686 : clear help text when new helpid is set
2008-12-02 12:28:02 +0100 oj r264685 : set help id for listbox category
2008-12-02 07:15:56 +0100 oj r264655 : remove define to auto generate help ids
2008-12-01 14:36:43 +0100 oj r264604 : use temp var
2008-12-01 14:18:31 +0100 oj r264601 : moved ScJumpToken to formula
2008-12-01 14:18:11 +0100 oj r264600 : moved ScJumpToken to formula
2008-12-01 14:14:35 +0100 oj r264599 : moved ScJumpToken from sc
2008-12-01 10:48:51 +0100 oj r264589 : change quickhelptext from Shrink to Select
2008-12-01 10:28:41 +0100 oj r264588 : fix opcode data, has to be Any.Void
2008-11-28 11:16:48 +0100 oj r264532 : add help ids
2008-11-28 10:16:56 +0100 oj r264529 : set help id
2008-11-28 10:16:43 +0100 oj r264528 : set help id
2008-11-26 13:55:04 +0100 oj r264381 : #94535# use of optional instead of deleting a string myself and some small changes
2008-11-26 09:53:20 +0100 oj r264346 : compile error with debug/without debug
2008-11-25 07:41:28 +0100 oj r264271 : put static into the method which make use of them
2008-11-24 08:16:07 +0100 oj r264196 : removed not needed classes for op code
2008-11-24 08:13:44 +0100 oj r264195 : removed not needed classes for op code
2008-11-21 14:05:53 +0100 oj r264135 : make GetOpCode inline
2008-11-21 12:35:27 +0100 oj r264124 : hold symbols
2008-11-20 09:27:27 +0100 oj r264028 : merged code from DEV300_m35 which got lost
2008-11-19 20:42:12 +0100 oj r264022 : more changes for formula dialog remove
2008-11-19 20:37:41 +0100 oj r264021 : removed unused var
2008-11-19 20:35:35 +0100 oj r264020 : some more changes at token
2008-11-19 10:59:47 +0100 oj r263967 : deleted
2008-11-19 10:58:24 +0100 oj r263966 : add forui and for res files
2008-11-18 15:27:36 +0100 oj r263777 : unused para removed
2008-11-18 15:23:23 +0100 oj r263775 : add insert button to add field dlg
2008-11-18 13:39:53 +0100 oj r263764 : enable the formula dialog as well for conditional print as for conditional formatting
2008-11-18 12:03:25 +0100 oj r263760 : rename isRef in IsRef
2008-11-17 11:46:16 +0100 oj r263711 : patches for function handling
2008-11-17 11:36:22 +0100 oj r263710 : add new for forui and res file
2008-11-17 09:21:12 +0100 oj r263704 : patches for some resource for libformula
2008-11-15 12:45:30 +0100 oj r263701 : changes for formula editor extraction
2008-11-07 08:23:27 +0100 oj r263416 : merge from DEV300:m35
2008-11-07 08:22:35 +0100 oj r263415 : merge from DEV300:m35
2008-11-07 08:22:16 +0100 oj r263414 : merge from DEV300:m35
2008-11-07 08:21:41 +0100 oj r263413 : merge from DEV300:m35
2008-11-07 08:21:31 +0100 oj r263412 : merge from DEV300:m35
2008-11-07 08:20:38 +0100 oj r263411 : merge from DEV300:m35
2008-11-07 08:20:00 +0100 oj r263410 : merge from DEV300:m35
2008-11-07 08:18:50 +0100 oj r263409 : merge from DEV300:m35
2008-11-07 08:18:19 +0100 oj r263408 : merge from DEV300:m35
2008-11-07 08:10:27 +0100 oj r263407 : merge from DEV300:m35
2008-10-21 07:43:46 +0200 oj r262560 : some compile errors resolved
2008-10-17 16:40:01 +0200 oj r262291 : dep for 1st target
2008-10-07 10:08:39 +0200 oj r262077 : copy
2008-10-07 09:45:31 +0200 oj r262076 : #i94535#
2008-10-07 09:44:26 +0200 oj r262075 : #i94535# new base class
2008-10-07 09:43:21 +0200 oj r262074 : moved to formula
2008-10-07 09:41:51 +0200 oj r262073 : new images
2008-10-07 09:03:01 +0200 oj r262072 : new ids for formula
2008-10-02 08:46:27 +0200 oj r262024 : #i94535# move the formula compiler to formula
2008-10-02 08:08:54 +0200 oj r262023 : #i94535#
2008-10-02 08:06:28 +0200 oj r262022 : #i94535#
2008-10-02 08:05:52 +0200 oj r262021 : #i94535#
2008-10-01 17:15:29 +0200 oj r262014 : #i94535#
2008-10-01 17:12:40 +0200 oj r262013 : new module formula
2008-10-01 17:04:55 +0200 oj r262012 : #i94535#
2008-10-01 16:49:03 +0200 oj r262010 : #i94535#
2008-10-01 16:46:59 +0200 oj r262009 : #i94535#
2009-01-08 10:47:13 +00:00
|
|
|
formula::FormulaGrammar::AddressConvention eConv = pDocument->GetAddressConvention();
|
2008-05-14 08:53:33 +00:00
|
|
|
aStartAddress.Format( sStartAddress, nFormatFlags, (ScDocument*) pDocument, eConv );
|
|
|
|
aEndAddress.Format( sEndAddress, nFormatFlags, (ScDocument*) pDocument, eConv );
|
2007-05-22 18:43:40 +00:00
|
|
|
OUString sOUStartAddress( sStartAddress );
|
|
|
|
sOUStartAddress += OUString(':');
|
|
|
|
sOUStartAddress += OUString( sEndAddress );
|
|
|
|
AssignString( rString, sOUStartAddress, bAppendStr, cSeperator );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScRangeStringConverter::GetStringFromRangeList(
|
|
|
|
OUString& rString,
|
|
|
|
const ScRangeList* pRangeList,
|
|
|
|
const ScDocument* pDocument,
|
|
|
|
sal_Unicode cSeperator,
|
|
|
|
sal_uInt16 nFormatFlags )
|
|
|
|
{
|
|
|
|
OUString sRangeListStr;
|
|
|
|
if( pRangeList )
|
|
|
|
{
|
|
|
|
sal_Int32 nCount = pRangeList->Count();
|
|
|
|
for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ )
|
|
|
|
{
|
|
|
|
const ScRange* pRange = pRangeList->GetObject( nIndex );
|
|
|
|
if( pRange )
|
|
|
|
GetStringFromRange( sRangeListStr, *pRange, pDocument, cSeperator, sal_True, nFormatFlags );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
rString = sRangeListStr;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//___________________________________________________________________
|
|
|
|
|
|
|
|
void ScRangeStringConverter::GetStringFromArea(
|
|
|
|
OUString& rString,
|
|
|
|
const ScArea& rArea,
|
|
|
|
const ScDocument* pDocument,
|
|
|
|
sal_Unicode cSeperator,
|
|
|
|
sal_Bool bAppendStr,
|
|
|
|
sal_uInt16 nFormatFlags )
|
|
|
|
{
|
|
|
|
ScRange aRange( rArea.nColStart, rArea.nRowStart, rArea.nTab, rArea.nColEnd, rArea.nRowEnd, rArea.nTab );
|
|
|
|
GetStringFromRange( rString, aRange, pDocument, cSeperator, bAppendStr, nFormatFlags );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//___________________________________________________________________
|
|
|
|
|
|
|
|
void ScRangeStringConverter::GetStringFromAddress(
|
|
|
|
OUString& rString,
|
|
|
|
const table::CellAddress& rAddress,
|
|
|
|
const ScDocument* pDocument,
|
|
|
|
sal_Unicode cSeperator,
|
|
|
|
sal_Bool bAppendStr,
|
|
|
|
sal_uInt16 nFormatFlags )
|
|
|
|
{
|
|
|
|
ScAddress aScAddress( static_cast<SCCOL>(rAddress.Column), static_cast<SCROW>(rAddress.Row), rAddress.Sheet );
|
|
|
|
GetStringFromAddress( rString, aScAddress, pDocument, cSeperator, bAppendStr, nFormatFlags );
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScRangeStringConverter::GetStringFromRange(
|
|
|
|
OUString& rString,
|
|
|
|
const table::CellRangeAddress& rRange,
|
|
|
|
const ScDocument* pDocument,
|
|
|
|
sal_Unicode cSeperator,
|
|
|
|
sal_Bool bAppendStr,
|
|
|
|
sal_uInt16 nFormatFlags )
|
|
|
|
{
|
|
|
|
ScRange aScRange( static_cast<SCCOL>(rRange.StartColumn), static_cast<SCROW>(rRange.StartRow), rRange.Sheet,
|
|
|
|
static_cast<SCCOL>(rRange.EndColumn), static_cast<SCROW>(rRange.EndRow), rRange.Sheet );
|
|
|
|
GetStringFromRange( rString, aScRange, pDocument, cSeperator, bAppendStr, nFormatFlags );
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScRangeStringConverter::GetStringFromRangeList(
|
|
|
|
OUString& rString,
|
|
|
|
const uno::Sequence< table::CellRangeAddress >& rRangeSeq,
|
|
|
|
const ScDocument* pDocument,
|
|
|
|
sal_Unicode cSeperator,
|
|
|
|
sal_uInt16 nFormatFlags )
|
|
|
|
{
|
|
|
|
OUString sRangeListStr;
|
|
|
|
sal_Int32 nCount = rRangeSeq.getLength();
|
|
|
|
for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ )
|
|
|
|
{
|
|
|
|
const table::CellRangeAddress& rRange = rRangeSeq[ nIndex ];
|
|
|
|
GetStringFromRange( sRangeListStr, rRange, pDocument, cSeperator, sal_True, nFormatFlags );
|
|
|
|
}
|
|
|
|
rString = sRangeListStr;
|
|
|
|
}
|
|
|
|
|
|
|
|
//========================================================================
|
|
|
|
|
2004-06-04 09:38:52 +00:00
|
|
|
ScArea::ScArea( SCTAB tab,
|
|
|
|
SCCOL colStart, SCROW rowStart,
|
|
|
|
SCCOL colEnd, SCROW rowEnd ) :
|
2000-09-18 23:16:46 +00:00
|
|
|
nTab ( tab ),
|
|
|
|
nColStart( colStart ), nRowStart( rowStart ),
|
|
|
|
nColEnd ( colEnd ), nRowEnd ( rowEnd )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
|
|
|
|
|
|
ScArea::ScArea( const ScArea& r ) :
|
|
|
|
nTab ( r.nTab ),
|
|
|
|
nColStart( r.nColStart ), nRowStart( r.nRowStart ),
|
|
|
|
nColEnd ( r.nColEnd ), nRowEnd ( r.nRowEnd )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
|
|
|
|
|
|
ScArea& ScArea::operator=( const ScArea& r )
|
|
|
|
{
|
|
|
|
nTab = r.nTab;
|
|
|
|
nColStart = r.nColStart;
|
|
|
|
nRowStart = r.nRowStart;
|
|
|
|
nColEnd = r.nColEnd;
|
|
|
|
nRowEnd = r.nRowEnd;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
|
|
|
|
|
|
BOOL ScArea::operator==( const ScArea& r ) const
|
|
|
|
{
|
|
|
|
return ( (nTab == r.nTab)
|
|
|
|
&& (nColStart == r.nColStart)
|
|
|
|
&& (nRowStart == r.nRowStart)
|
|
|
|
&& (nColEnd == r.nColEnd)
|
|
|
|
&& (nRowEnd == r.nRowEnd) );
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
|
|
|
|
|
|
ScAreaNameIterator::ScAreaNameIterator( ScDocument* pDoc ) :
|
|
|
|
aStrNoName( ScGlobal::GetRscString(STR_DB_NONAME) )
|
|
|
|
{
|
|
|
|
pRangeName = pDoc->GetRangeName();
|
|
|
|
pDBCollection = pDoc->GetDBCollection();
|
|
|
|
nPos = 0;
|
|
|
|
bFirstPass = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL ScAreaNameIterator::Next( String& rName, ScRange& rRange )
|
|
|
|
{
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
if ( bFirstPass ) // erst Bereichsnamen
|
|
|
|
{
|
|
|
|
if ( pRangeName && nPos < pRangeName->GetCount() )
|
|
|
|
{
|
|
|
|
ScRangeData* pData = (*pRangeName)[nPos++];
|
2006-07-10 12:27:33 +00:00
|
|
|
if ( pData && pData->IsValidReference(rRange) )
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
rName = pData->GetName();
|
|
|
|
return TRUE; // gefunden
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
bFirstPass = FALSE;
|
|
|
|
nPos = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( !bFirstPass ) // dann DB-Bereiche
|
|
|
|
{
|
|
|
|
if ( pDBCollection && nPos < pDBCollection->GetCount() )
|
|
|
|
{
|
|
|
|
ScDBData* pData = (*pDBCollection)[nPos++];
|
|
|
|
if (pData && pData->GetName() != aStrNoName)
|
|
|
|
{
|
|
|
|
pData->GetArea( rRange );
|
|
|
|
rName = pData->GetName();
|
|
|
|
return TRUE; // gefunden
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return FALSE; // gibt nichts mehr
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|