blob: c7fd8ec2dd2bc0331d269c4b6397a88b5ce3d603 [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 <com/sun/star/util/CellProtection.hpp>
#include <com/sun/star/util/XProtectable.hpp>
#include <com/sun/star/text/XText.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include "scitems.hxx"
#include <editeng/eeitem.hxx>
#include <editeng/boxitem.hxx>
#include <editeng/editdata.hxx>
#include <editeng/editeng.hxx>
#include <editeng/editobj.hxx>
#include <editeng/flditem.hxx>
#include "attrib.hxx"
#include "global.hxx"
#include "editutil.hxx"
#include "sc.hrc"
#include "globstr.hrc"
#include "textuno.hxx" // ScHeaderFooterContentObj
using namespace com::sun::star;
//------------------------------------------------------------------------
TYPEINIT1(ScMergeAttr, SfxPoolItem);
TYPEINIT1_AUTOFACTORY(ScProtectionAttr, SfxPoolItem);
TYPEINIT1(ScRangeItem, SfxPoolItem);
TYPEINIT1(ScTableListItem, SfxPoolItem);
TYPEINIT1(ScPageHFItem, SfxPoolItem);
TYPEINIT1(ScViewObjectModeItem, SfxEnumItem);
TYPEINIT1(ScDoubleItem, SfxPoolItem);
TYPEINIT1(ScPageScaleToItem, SfxPoolItem);
//------------------------------------------------------------------------
//
// allgemeine Hilfsfunktionen
//
sal_Bool ScHasPriority( const SvxBorderLine* pThis, const SvxBorderLine* pOther )
{
// DBG_ASSERT( pThis || pOther, "LineAttr == 0" );
if (!pThis)
return sal_False;
if (!pOther)
return sal_True;
sal_uInt16 nThisSize = pThis->GetOutWidth() + pThis->GetDistance() + pThis->GetInWidth();
sal_uInt16 nOtherSize = pOther->GetOutWidth() + pOther->GetDistance() + pOther->GetInWidth();
if (nThisSize > nOtherSize)
return sal_True;
else if (nThisSize < nOtherSize)
return sal_False;
else
{
if ( pOther->GetInWidth() && !pThis->GetInWidth() )
return sal_True;
else if ( pThis->GetInWidth() && !pOther->GetInWidth() )
return sal_False;
else
{
return sal_True; //! ???
}
}
}
//
// Item - Implementierungen
//
//------------------------------------------------------------------------
// Merge
//------------------------------------------------------------------------
ScMergeAttr::ScMergeAttr():
SfxPoolItem(ATTR_MERGE),
nColMerge(0),
nRowMerge(0)
{}
//------------------------------------------------------------------------
ScMergeAttr::ScMergeAttr( SCsCOL nCol, SCsROW nRow):
SfxPoolItem(ATTR_MERGE),
nColMerge(nCol),
nRowMerge(nRow)
{}
//------------------------------------------------------------------------
ScMergeAttr::ScMergeAttr(const ScMergeAttr& rItem):
SfxPoolItem(ATTR_MERGE)
{
nColMerge = rItem.nColMerge;
nRowMerge = rItem.nRowMerge;
}
ScMergeAttr::~ScMergeAttr()
{
}
//------------------------------------------------------------------------
String ScMergeAttr::GetValueText() const
{
String aString( '(' );
aString += String::CreateFromInt32( nColMerge );
aString += ',';
aString += String::CreateFromInt32( nRowMerge );
aString += ')';
return aString;
}
//------------------------------------------------------------------------
int ScMergeAttr::operator==( const SfxPoolItem& rItem ) const
{
DBG_ASSERT( Which() != rItem.Which() || Type() == rItem.Type(), "which ==, type !=" );
return (Which() == rItem.Which())
&& (nColMerge == ((ScMergeAttr&)rItem).nColMerge)
&& (nRowMerge == ((ScMergeAttr&)rItem).nRowMerge);
}
//------------------------------------------------------------------------
SfxPoolItem* ScMergeAttr::Clone( SfxItemPool * ) const
{
return new ScMergeAttr(*this);
}
//------------------------------------------------------------------------
SfxPoolItem* ScMergeAttr::Create( SvStream& rStream, sal_uInt16 /* nVer */ ) const
{
sal_Int16 nCol;
sal_Int16 nRow;
rStream >> nCol;
rStream >> nRow;
return new ScMergeAttr(static_cast<SCCOL>(nCol),static_cast<SCROW>(nRow));
}
//------------------------------------------------------------------------
// MergeFlag
//------------------------------------------------------------------------
ScMergeFlagAttr::ScMergeFlagAttr():
SfxInt16Item(ATTR_MERGE_FLAG, 0)
{
}
//------------------------------------------------------------------------
ScMergeFlagAttr::ScMergeFlagAttr(sal_Int16 nFlags):
SfxInt16Item(ATTR_MERGE_FLAG, nFlags)
{
}
ScMergeFlagAttr::~ScMergeFlagAttr()
{
}
//------------------------------------------------------------------------
// Protection
//------------------------------------------------------------------------
ScProtectionAttr::ScProtectionAttr():
SfxPoolItem(ATTR_PROTECTION),
bProtection(sal_True),
bHideFormula(sal_False),
bHideCell(sal_False),
bHidePrint(sal_False)
{
}
//------------------------------------------------------------------------
ScProtectionAttr::ScProtectionAttr( sal_Bool bProtect, sal_Bool bHFormula,
sal_Bool bHCell, sal_Bool bHPrint):
SfxPoolItem(ATTR_PROTECTION),
bProtection(bProtect),
bHideFormula(bHFormula),
bHideCell(bHCell),
bHidePrint(bHPrint)
{
}
//------------------------------------------------------------------------
ScProtectionAttr::ScProtectionAttr(const ScProtectionAttr& rItem):
SfxPoolItem(ATTR_PROTECTION)
{
bProtection = rItem.bProtection;
bHideFormula = rItem.bHideFormula;
bHideCell = rItem.bHideCell;
bHidePrint = rItem.bHidePrint;
}
ScProtectionAttr::~ScProtectionAttr()
{
}
//------------------------------------------------------------------------
sal_Bool ScProtectionAttr::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
{
nMemberId &= ~CONVERT_TWIPS;
switch ( nMemberId )
{
case 0 :
{
util::CellProtection aProtection;
aProtection.IsLocked = bProtection;
aProtection.IsFormulaHidden = bHideFormula;
aProtection.IsHidden = bHideCell;
aProtection.IsPrintHidden = bHidePrint;
rVal <<= aProtection;
break;
}
case MID_1 :
rVal <<= (sal_Bool ) bProtection; break;
case MID_2 :
rVal <<= (sal_Bool ) bHideFormula; break;
case MID_3 :
rVal <<= (sal_Bool ) bHideCell; break;
case MID_4 :
rVal <<= (sal_Bool ) bHidePrint; break;
default:
DBG_ERROR("Wrong MemberID!");
return sal_False;
}
return sal_True;
}
sal_Bool ScProtectionAttr::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
{
sal_Bool bRet = sal_False;
sal_Bool bVal = sal_Bool();
nMemberId &= ~CONVERT_TWIPS;
switch ( nMemberId )
{
case 0 :
{
util::CellProtection aProtection;
if ( rVal >>= aProtection )
{
bProtection = aProtection.IsLocked;
bHideFormula = aProtection.IsFormulaHidden;
bHideCell = aProtection.IsHidden;
bHidePrint = aProtection.IsPrintHidden;
bRet = sal_True;
}
else
{
DBG_ERROR("exception - wrong argument");
}
break;
}
case MID_1 :
bRet = (rVal >>= bVal); if (bRet) bProtection=bVal; break;
case MID_2 :
bRet = (rVal >>= bVal); if (bRet) bHideFormula=bVal; break;
case MID_3 :
bRet = (rVal >>= bVal); if (bRet) bHideCell=bVal; break;
case MID_4 :
bRet = (rVal >>= bVal); if (bRet) bHidePrint=bVal; break;
default:
DBG_ERROR("Wrong MemberID!");
}
return bRet;
}
//------------------------------------------------------------------------
String ScProtectionAttr::GetValueText() const
{
String aValue;
String aStrYes ( ScGlobal::GetRscString(STR_YES) );
String aStrNo ( ScGlobal::GetRscString(STR_NO) );
sal_Unicode cDelim = ',';
aValue = '(';
aValue += (bProtection ? aStrYes : aStrNo); aValue += cDelim;
aValue += (bHideFormula ? aStrYes : aStrNo); aValue += cDelim;
aValue += (bHideCell ? aStrYes : aStrNo); aValue += cDelim;
aValue += (bHidePrint ? aStrYes : aStrNo);
aValue += ')';
return aValue;
}
//------------------------------------------------------------------------
SfxItemPresentation ScProtectionAttr::GetPresentation
(
SfxItemPresentation ePres,
SfxMapUnit /* eCoreMetric */,
SfxMapUnit /* ePresMetric */,
String& rText,
const IntlWrapper* /* pIntl */
) const
{
String aStrYes ( ScGlobal::GetRscString(STR_YES) );
String aStrNo ( ScGlobal::GetRscString(STR_NO) );
String aStrSep = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( ": " ));
String aStrDelim = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( ", " ));
switch ( ePres )
{
case SFX_ITEM_PRESENTATION_NONE:
rText.Erase();
break;
case SFX_ITEM_PRESENTATION_NAMELESS:
rText = GetValueText();
break;
case SFX_ITEM_PRESENTATION_COMPLETE:
rText = ScGlobal::GetRscString(STR_PROTECTION); rText += aStrSep;
rText += (bProtection ? aStrYes : aStrNo); rText += aStrDelim;
rText += ScGlobal::GetRscString(STR_FORMULAS); rText += aStrSep;
rText += (!bHideFormula ? aStrYes : aStrNo); rText += aStrDelim;
rText += ScGlobal::GetRscString(STR_HIDE); rText += aStrSep;
rText += (bHideCell ? aStrYes : aStrNo); rText += aStrDelim;
rText += ScGlobal::GetRscString(STR_PRINT); rText += aStrSep;
rText += (!bHidePrint ? aStrYes : aStrNo);
break;
default:
ePres = SFX_ITEM_PRESENTATION_NONE;
}
return ePres;
}
//------------------------------------------------------------------------
int ScProtectionAttr::operator==( const SfxPoolItem& rItem ) const
{
DBG_ASSERT( Which() != rItem.Which() || Type() == rItem.Type(), "which ==, type !=" );
return (Which() == rItem.Which())
&& (bProtection == ((ScProtectionAttr&)rItem).bProtection)
&& (bHideFormula == ((ScProtectionAttr&)rItem).bHideFormula)
&& (bHideCell == ((ScProtectionAttr&)rItem).bHideCell)
&& (bHidePrint == ((ScProtectionAttr&)rItem).bHidePrint);
}
//------------------------------------------------------------------------
SfxPoolItem* ScProtectionAttr::Clone( SfxItemPool * ) const
{
return new ScProtectionAttr(*this);
}
//------------------------------------------------------------------------
SfxPoolItem* ScProtectionAttr::Create( SvStream& rStream, sal_uInt16 /* n */ ) const
{
sal_Bool bProtect;
sal_Bool bHFormula;
sal_Bool bHCell;
sal_Bool bHPrint;
rStream >> bProtect;
rStream >> bHFormula;
rStream >> bHCell;
rStream >> bHPrint;
return new ScProtectionAttr(bProtect,bHFormula,bHCell,bHPrint);
}
//------------------------------------------------------------------------
sal_Bool ScProtectionAttr::SetProtection( sal_Bool bProtect)
{
bProtection = bProtect;
return sal_True;
}
//------------------------------------------------------------------------
sal_Bool ScProtectionAttr::SetHideFormula( sal_Bool bHFormula)
{
bHideFormula = bHFormula;
return sal_True;
}
//------------------------------------------------------------------------
sal_Bool ScProtectionAttr::SetHideCell( sal_Bool bHCell)
{
bHideCell = bHCell;
return sal_True;
}
//------------------------------------------------------------------------
sal_Bool ScProtectionAttr::SetHidePrint( sal_Bool bHPrint)
{
bHidePrint = bHPrint;
return sal_True;
}
// -----------------------------------------------------------------------
// ScRangeItem - Tabellenbereich
// -----------------------------------------------------------------------
int ScRangeItem::operator==( const SfxPoolItem& rAttr ) const
{
DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unequal types" );
return ( aRange == ( (ScRangeItem&)rAttr ).aRange );
}
// -----------------------------------------------------------------------
SfxPoolItem* ScRangeItem::Clone( SfxItemPool* ) const
{
return new ScRangeItem( *this );
}
//------------------------------------------------------------------------
SfxItemPresentation ScRangeItem::GetPresentation
(
SfxItemPresentation ePres,
SfxMapUnit /* eCoreUnit */,
SfxMapUnit /* ePresUnit */,
String& rText,
const IntlWrapper* /* pIntl */
) const
{
rText.Erase();
switch ( ePres )
{
case SFX_ITEM_PRESENTATION_COMPLETE:
rText = ScGlobal::GetRscString(STR_AREA);
rText.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ": " ));
// break;// Durchfallen !!!
case SFX_ITEM_PRESENTATION_NAMELESS:
{
String aText;
/* Always use OOo:A1 format */
aRange.Format( aText );
rText += aText;
}
break;
default:
{
// added to avoid warnings
}
}
return ePres;
}
// -----------------------------------------------------------------------
// ScTableListItem - Liste von Tabellen(-nummern)
// -----------------------------------------------------------------------
ScTableListItem::ScTableListItem( const ScTableListItem& rCpy )
: SfxPoolItem ( rCpy.Which() ),
nCount ( rCpy.nCount )
{
if ( nCount > 0 )
{
pTabArr = new SCTAB [nCount];
for ( sal_uInt16 i=0; i<nCount; i++ )
pTabArr[i] = rCpy.pTabArr[i];
}
else
pTabArr = NULL;
}
// -----------------------------------------------------------------------
//UNUSED2008-05 ScTableListItem::ScTableListItem( const sal_uInt16 nWhichP, const List& rList )
//UNUSED2008-05 : SfxPoolItem ( nWhichP ),
//UNUSED2008-05 nCount ( 0 ),
//UNUSED2008-05 pTabArr ( NULL )
//UNUSED2008-05 {
//UNUSED2008-05 SetTableList( rList );
//UNUSED2008-05 }
// -----------------------------------------------------------------------
ScTableListItem::~ScTableListItem()
{
delete [] pTabArr;
}
// -----------------------------------------------------------------------
ScTableListItem& ScTableListItem::operator=( const ScTableListItem& rCpy )
{
delete [] pTabArr;
if ( rCpy.nCount > 0 )
{
pTabArr = new SCTAB [rCpy.nCount];
for ( sal_uInt16 i=0; i<rCpy.nCount; i++ )
pTabArr[i] = rCpy.pTabArr[i];
}
else
pTabArr = NULL;
nCount = rCpy.nCount;
return *this;
}
// -----------------------------------------------------------------------
int ScTableListItem::operator==( const SfxPoolItem& rAttr ) const
{
DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unequal types" );
ScTableListItem& rCmp = (ScTableListItem&)rAttr;
sal_Bool bEqual = (nCount == rCmp.nCount);
if ( nCount > 0 )
{
sal_uInt16 i=0;
bEqual = ( pTabArr && rCmp.pTabArr );
while ( bEqual && i<nCount )
{
bEqual = ( pTabArr[i] == rCmp.pTabArr[i] );
i++;
}
}
return bEqual;
}
// -----------------------------------------------------------------------
SfxPoolItem* ScTableListItem::Clone( SfxItemPool* ) const
{
return new ScTableListItem( *this );
}
//------------------------------------------------------------------------
SfxItemPresentation ScTableListItem::GetPresentation
(
SfxItemPresentation ePres,
SfxMapUnit /* eCoreUnit */,
SfxMapUnit /* ePresUnit */,
String& rText,
const IntlWrapper* /* pIntl */
) const
{
const sal_Unicode cDelim = ',';
switch ( ePres )
{
case SFX_ITEM_PRESENTATION_NONE:
rText.Erase();
return ePres;
case SFX_ITEM_PRESENTATION_NAMELESS:
{
rText = '(';
if ( nCount>0 && pTabArr )
for ( sal_uInt16 i=0; i<nCount; i++ )
{
rText += String::CreateFromInt32( pTabArr[i] );
if ( i<(nCount-1) )
rText += cDelim;
}
rText += ')';
}
return ePres;
case SFX_ITEM_PRESENTATION_COMPLETE:
rText.Erase();
return SFX_ITEM_PRESENTATION_NONE;
default:
{
// added to avoid warnings
}
}
return SFX_ITEM_PRESENTATION_NONE;
}
// -----------------------------------------------------------------------
//UNUSED2009-05 sal_Bool ScTableListItem::GetTableList( List& aList ) const
//UNUSED2009-05 {
//UNUSED2009-05 for ( sal_uInt16 i=0; i<nCount; i++ )
//UNUSED2009-05 aList.Insert( new SCTAB( pTabArr[i] ) );
//UNUSED2009-05
//UNUSED2009-05 return ( nCount > 0 );
//UNUSED2009-05 }
// -----------------------------------------------------------------------
//UNUSED2009-05 void ScTableListItem::SetTableList( const List& rList )
//UNUSED2009-05 {
//UNUSED2009-05 nCount = (sal_uInt16)rList.Count();
//UNUSED2009-05
//UNUSED2009-05 delete [] pTabArr;
//UNUSED2009-05
//UNUSED2009-05 if ( nCount > 0 )
//UNUSED2009-05 {
//UNUSED2009-05 pTabArr = new SCTAB [nCount];
//UNUSED2009-05
//UNUSED2009-05 for ( sal_uInt16 i=0; i<nCount; i++ )
//UNUSED2009-05 pTabArr[i] = *( (SCTAB*)rList.GetObject( i ) );
//UNUSED2009-05 }
//UNUSED2009-05 else
//UNUSED2009-05 pTabArr = NULL;
//UNUSED2009-05 }
// -----------------------------------------------------------------------
// ScPageHFItem - Daten der Kopf-/Fusszeilen
// -----------------------------------------------------------------------
ScPageHFItem::ScPageHFItem( sal_uInt16 nWhichP )
: SfxPoolItem ( nWhichP ),
pLeftArea ( NULL ),
pCenterArea ( NULL ),
pRightArea ( NULL )
{
}
//------------------------------------------------------------------------
ScPageHFItem::ScPageHFItem( const ScPageHFItem& rItem )
: SfxPoolItem ( rItem ),
pLeftArea ( NULL ),
pCenterArea ( NULL ),
pRightArea ( NULL )
{
if ( rItem.pLeftArea )
pLeftArea = rItem.pLeftArea->Clone();
if ( rItem.pCenterArea )
pCenterArea = rItem.pCenterArea->Clone();
if ( rItem.pRightArea )
pRightArea = rItem.pRightArea->Clone();
}
//------------------------------------------------------------------------
ScPageHFItem::~ScPageHFItem()
{
delete pLeftArea;
delete pCenterArea;
delete pRightArea;
}
//------------------------------------------------------------------------
sal_Bool ScPageHFItem::QueryValue( uno::Any& rVal, sal_uInt8 /* nMemberId */ ) const
{
uno::Reference<sheet::XHeaderFooterContent> xContent =
new ScHeaderFooterContentObj( pLeftArea, pCenterArea, pRightArea );
rVal <<= xContent;
return sal_True;
}
sal_Bool ScPageHFItem::PutValue( const uno::Any& rVal, sal_uInt8 /* nMemberId */ )
{
sal_Bool bRet = sal_False;
uno::Reference<sheet::XHeaderFooterContent> xContent;
if ( rVal >>= xContent )
{
if ( xContent.is() )
{
ScHeaderFooterContentObj* pImp =
ScHeaderFooterContentObj::getImplementation( xContent );
if (pImp)
{
const EditTextObject* pImpLeft = pImp->GetLeftEditObject();
delete pLeftArea;
pLeftArea = pImpLeft ? pImpLeft->Clone() : NULL;
const EditTextObject* pImpCenter = pImp->GetCenterEditObject();
delete pCenterArea;
pCenterArea = pImpCenter ? pImpCenter->Clone() : NULL;
const EditTextObject* pImpRight = pImp->GetRightEditObject();
delete pRightArea;
pRightArea = pImpRight ? pImpRight->Clone() : NULL;
if ( !pLeftArea || !pCenterArea || !pRightArea )
{
// keine Texte auf NULL stehen lassen
ScEditEngineDefaulter aEngine( EditEngine::CreatePool(), sal_True );
if (!pLeftArea)
pLeftArea = aEngine.CreateTextObject();
if (!pCenterArea)
pCenterArea = aEngine.CreateTextObject();
if (!pRightArea)
pRightArea = aEngine.CreateTextObject();
}
bRet = sal_True;
}
}
}
if (!bRet)
{
DBG_ERROR("exception - wrong argument");
}
return bRet;
}
//------------------------------------------------------------------------
String ScPageHFItem::GetValueText() const
{
return String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ScPageHFItem"));
}
//------------------------------------------------------------------------
int ScPageHFItem::operator==( const SfxPoolItem& rItem ) const
{
DBG_ASSERT( SfxPoolItem::operator==( rItem ), "unequal Which or Type" );
const ScPageHFItem& r = (const ScPageHFItem&)rItem;
return ScGlobal::EETextObjEqual(pLeftArea, r.pLeftArea)
&& ScGlobal::EETextObjEqual(pCenterArea, r.pCenterArea)
&& ScGlobal::EETextObjEqual(pRightArea, r.pRightArea);
}
//------------------------------------------------------------------------
SfxPoolItem* ScPageHFItem::Clone( SfxItemPool* ) const
{
return new ScPageHFItem( *this );
}
//------------------------------------------------------------------------
void lcl_SetSpace( String& rStr, const ESelection& rSel )
{
// Text durch ein Leerzeichen ersetzen, damit Positionen stimmen:
xub_StrLen nLen = rSel.nEndPos-rSel.nStartPos;
rStr.Erase( rSel.nStartPos, nLen-1 );
rStr.SetChar( rSel.nStartPos, ' ' );
}
sal_Bool lcl_ConvertFields(EditEngine& rEng, const String* pCommands)
{
sal_Bool bChange = sal_False;
sal_uInt16 nParCnt = rEng.GetParagraphCount();
for (sal_uInt16 nPar = 0; nPar<nParCnt; nPar++)
{
String aStr = rEng.GetText( nPar );
xub_StrLen nPos;
while ((nPos = aStr.Search(pCommands[0])) != STRING_NOTFOUND)
{
ESelection aSel( nPar,nPos, nPar,nPos+pCommands[0].Len() );
rEng.QuickInsertField( SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD), aSel );
lcl_SetSpace(aStr, aSel ); bChange = sal_True;
}
while ((nPos = aStr.Search(pCommands[1])) != STRING_NOTFOUND)
{
ESelection aSel( nPar,nPos, nPar,nPos+pCommands[1].Len() );
rEng.QuickInsertField( SvxFieldItem(SvxPagesField(), EE_FEATURE_FIELD), aSel );
lcl_SetSpace(aStr, aSel ); bChange = sal_True;
}
while ((nPos = aStr.Search(pCommands[2])) != STRING_NOTFOUND)
{
ESelection aSel( nPar,nPos, nPar,nPos+pCommands[2].Len() );
rEng.QuickInsertField( SvxFieldItem(SvxDateField(Date(),SVXDATETYPE_VAR), EE_FEATURE_FIELD), aSel );
lcl_SetSpace(aStr, aSel ); bChange = sal_True;
}
while ((nPos = aStr.Search(pCommands[3])) != STRING_NOTFOUND)
{
ESelection aSel( nPar,nPos, nPar,nPos+pCommands[3].Len() );
rEng.QuickInsertField( SvxFieldItem(SvxTimeField(), EE_FEATURE_FIELD ), aSel );
lcl_SetSpace(aStr, aSel ); bChange = sal_True;
}
while ((nPos = aStr.Search(pCommands[4])) != STRING_NOTFOUND)
{
ESelection aSel( nPar,nPos, nPar,nPos+pCommands[4].Len() );
rEng.QuickInsertField( SvxFieldItem(SvxFileField(), EE_FEATURE_FIELD), aSel );
lcl_SetSpace(aStr, aSel ); bChange = sal_True;
}
while ((nPos = aStr.Search(pCommands[5])) != STRING_NOTFOUND)
{
ESelection aSel( nPar,nPos, nPar,nPos+pCommands[5].Len() );
rEng.QuickInsertField( SvxFieldItem(SvxTableField(), EE_FEATURE_FIELD), aSel );
lcl_SetSpace(aStr, aSel ); bChange = sal_True;
}
}
return bChange;
}
#define SC_FIELD_COUNT 6
SfxPoolItem* ScPageHFItem::Create( SvStream& rStream, sal_uInt16 nVer ) const
{
EditTextObject* pLeft = EditTextObject::Create(rStream);
EditTextObject* pCenter = EditTextObject::Create(rStream);
EditTextObject* pRight = EditTextObject::Create(rStream);
DBG_ASSERT( pLeft && pCenter && pRight, "Error reading ScPageHFItem" );
if ( pLeft == NULL || pLeft->GetParagraphCount() == 0 ||
pCenter == NULL || pCenter->GetParagraphCount() == 0 ||
pRight == NULL || pRight->GetParagraphCount() == 0 )
{
// If successfully loaded, each object contains at least one paragraph.
// Excel import in 5.1 created broken TextObjects (#67442#) that are
// corrected here to avoid saving wrong files again (#90487#).
ScEditEngineDefaulter aEngine( EditEngine::CreatePool(), sal_True );
if ( pLeft == NULL || pLeft->GetParagraphCount() == 0 )
{
delete pLeft;
pLeft = aEngine.CreateTextObject();
}
if ( pCenter == NULL || pCenter->GetParagraphCount() == 0 )
{
delete pCenter;
pCenter = aEngine.CreateTextObject();
}
if ( pRight == NULL || pRight->GetParagraphCount() == 0 )
{
delete pRight;
pRight = aEngine.CreateTextObject();
}
}
if ( nVer < 1 ) // alte Feldbefehle umsetzen
{
sal_uInt16 i;
const String& rDel = ScGlobal::GetRscString( STR_HFCMD_DELIMITER );
String aCommands[SC_FIELD_COUNT];
for (i=0; i<SC_FIELD_COUNT; i++)
aCommands[i] = rDel;
aCommands[0] += ScGlobal::GetRscString(STR_HFCMD_PAGE);
aCommands[1] += ScGlobal::GetRscString(STR_HFCMD_PAGES);
aCommands[2] += ScGlobal::GetRscString(STR_HFCMD_DATE);
aCommands[3] += ScGlobal::GetRscString(STR_HFCMD_TIME);
aCommands[4] += ScGlobal::GetRscString(STR_HFCMD_FILE);
aCommands[5] += ScGlobal::GetRscString(STR_HFCMD_TABLE);
for (i=0; i<SC_FIELD_COUNT; i++)
aCommands[i] += rDel;
ScEditEngineDefaulter aEngine( EditEngine::CreatePool(), sal_True );
aEngine.SetText(*pLeft);
if (lcl_ConvertFields(aEngine,aCommands))
{
delete pLeft;
pLeft = aEngine.CreateTextObject();
}
aEngine.SetText(*pCenter);
if (lcl_ConvertFields(aEngine,aCommands))
{
delete pCenter;
pCenter = aEngine.CreateTextObject();
}
aEngine.SetText(*pRight);
if (lcl_ConvertFields(aEngine,aCommands))
{
delete pRight;
pRight = aEngine.CreateTextObject();
}
}
else if ( nVer < 2 )
{ // nichts tun, SvxFileField nicht gegen SvxExtFileField austauschen
}
ScPageHFItem* pItem = new ScPageHFItem( Which() );
pItem->SetArea( pLeft, SC_HF_LEFTAREA );
pItem->SetArea( pCenter, SC_HF_CENTERAREA );
pItem->SetArea( pRight, SC_HF_RIGHTAREA );
return pItem;
}
//------------------------------------------------------------------------
//UNUSED2009-05 class ScFieldChangerEditEngine : public ScEditEngineDefaulter
//UNUSED2009-05 {
//UNUSED2009-05 TypeId aExtFileId;
//UNUSED2009-05 sal_uInt16 nConvPara;
//UNUSED2009-05 xub_StrLen nConvPos;
//UNUSED2009-05 sal_Bool bConvert;
//UNUSED2009-05
//UNUSED2009-05 public:
//UNUSED2009-05 ScFieldChangerEditEngine( SfxItemPool* pEnginePool, sal_Bool bDeleteEnginePool );
//UNUSED2009-05 virtual ~ScFieldChangerEditEngine() {}
//UNUSED2009-05
//UNUSED2009-05 virtual String CalcFieldValue( const SvxFieldItem& rField, sal_uInt16 nPara,
//UNUSED2009-05 sal_uInt16 nPos, Color*& rTxtColor,
//UNUSED2009-05 Color*& rFldColor );
//UNUSED2009-05
//UNUSED2009-05 sal_Bool ConvertFields();
//UNUSED2009-05 };
//UNUSED2009-05
//UNUSED2009-05 ScFieldChangerEditEngine::ScFieldChangerEditEngine( SfxItemPool* pEnginePoolP,
//UNUSED2009-05 sal_Bool bDeleteEnginePoolP ) :
//UNUSED2009-05 ScEditEngineDefaulter( pEnginePoolP, bDeleteEnginePoolP ),
//UNUSED2009-05 aExtFileId( TYPE( SvxExtFileField ) ),
//UNUSED2009-05 nConvPara( 0 ),
//UNUSED2009-05 nConvPos( 0 ),
//UNUSED2009-05 bConvert( sal_False )
//UNUSED2009-05 {
//UNUSED2009-05 }
//UNUSED2009-05
//UNUSED2009-05 String ScFieldChangerEditEngine::CalcFieldValue( const SvxFieldItem& rField,
//UNUSED2009-05 sal_uInt16 nPara, sal_uInt16 nPos, Color*& /* rTxtColor */, Color*& /* rFldColor */ )
//UNUSED2009-05 {
//UNUSED2009-05 const SvxFieldData* pFieldData = rField.GetField();
//UNUSED2009-05 if ( pFieldData && pFieldData->Type() == aExtFileId )
//UNUSED2009-05 {
//UNUSED2009-05 bConvert = sal_True;
//UNUSED2009-05 nConvPara = nPara;
//UNUSED2009-05 nConvPos = nPos;
//UNUSED2009-05 }
//UNUSED2009-05 return EMPTY_STRING;
//UNUSED2009-05 }
//UNUSED2009-05
//UNUSED2009-05 sal_Bool ScFieldChangerEditEngine::ConvertFields()
//UNUSED2009-05 {
//UNUSED2009-05 sal_Bool bConverted = sal_False;
//UNUSED2009-05 do
//UNUSED2009-05 {
//UNUSED2009-05 bConvert = sal_False;
//UNUSED2009-05 UpdateFields();
//UNUSED2009-05 if ( bConvert )
//UNUSED2009-05 {
//UNUSED2009-05 ESelection aSel( nConvPara, nConvPos, nConvPara, nConvPos+1 );
//UNUSED2009-05 QuickInsertField( SvxFieldItem( SvxFileField(), EE_FEATURE_FIELD), aSel );
//UNUSED2009-05 bConverted = sal_True;
//UNUSED2009-05 }
//UNUSED2009-05 } while ( bConvert );
//UNUSED2009-05 return bConverted;
//UNUSED2009-05 }
void ScPageHFItem::SetLeftArea( const EditTextObject& rNew )
{
delete pLeftArea;
pLeftArea = rNew.Clone();
}
//------------------------------------------------------------------------
void ScPageHFItem::SetCenterArea( const EditTextObject& rNew )
{
delete pCenterArea;
pCenterArea = rNew.Clone();
}
//------------------------------------------------------------------------
void ScPageHFItem::SetRightArea( const EditTextObject& rNew )
{
delete pRightArea;
pRightArea = rNew.Clone();
}
void ScPageHFItem::SetArea( EditTextObject *pNew, int nArea )
{
switch ( nArea )
{
case SC_HF_LEFTAREA: delete pLeftArea; pLeftArea = pNew; break;
case SC_HF_CENTERAREA: delete pCenterArea; pCenterArea = pNew; break;
case SC_HF_RIGHTAREA: delete pRightArea; pRightArea = pNew; break;
default:
DBG_ERROR( "New Area?" );
}
}
//-----------------------------------------------------------------------
// ScViewObjectModeItem - Darstellungsmodus von ViewObjekten
//-----------------------------------------------------------------------
ScViewObjectModeItem::ScViewObjectModeItem( sal_uInt16 nWhichP )
: SfxEnumItem( nWhichP, VOBJ_MODE_SHOW )
{
}
//------------------------------------------------------------------------
ScViewObjectModeItem::ScViewObjectModeItem( sal_uInt16 nWhichP, ScVObjMode eMode )
: SfxEnumItem( nWhichP, sal::static_int_cast<sal_uInt16>(eMode) )
{
}
//------------------------------------------------------------------------
ScViewObjectModeItem::~ScViewObjectModeItem()
{
}
//------------------------------------------------------------------------
SfxItemPresentation ScViewObjectModeItem::GetPresentation
(
SfxItemPresentation ePres,
SfxMapUnit /* eCoreUnit */,
SfxMapUnit /* ePresUnit */,
String& rText,
const IntlWrapper* /* pIntl */
) const
{
String aDel = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(": "));
rText.Erase();
switch ( ePres )
{
case SFX_ITEM_PRESENTATION_COMPLETE:
switch( Which() )
{
case SID_SCATTR_PAGE_CHARTS:
rText = ScGlobal::GetRscString(STR_VOBJ_CHART);
rText += aDel;
break;
case SID_SCATTR_PAGE_OBJECTS:
rText = ScGlobal::GetRscString(STR_VOBJ_OBJECT);
rText += aDel;
break;
case SID_SCATTR_PAGE_DRAWINGS:
rText = ScGlobal::GetRscString(STR_VOBJ_DRAWINGS);
rText += aDel;
break;
default:
ePres = SFX_ITEM_PRESENTATION_NAMELESS;//das geht immer!
break;
}
// break; // DURCHFALLEN!!!
case SFX_ITEM_PRESENTATION_NAMELESS:
rText += ScGlobal::GetRscString(STR_VOBJ_MODE_SHOW+GetValue());
break;
default:
{
// added to avoid warnings
}
}
return ePres;
}
//------------------------------------------------------------------------
String ScViewObjectModeItem::GetValueText( sal_uInt16 nVal ) const
{
DBG_ASSERT( nVal <= VOBJ_MODE_HIDE, "enum overflow!" );
return ScGlobal::GetRscString( STR_VOBJ_MODE_SHOW + (nVal % 2));
}
//------------------------------------------------------------------------
sal_uInt16 ScViewObjectModeItem::GetValueCount() const
{
return 2;
}
//------------------------------------------------------------------------
SfxPoolItem* ScViewObjectModeItem::Clone( SfxItemPool* ) const
{
return new ScViewObjectModeItem( *this );
}
//------------------------------------------------------------------------
sal_uInt16 ScViewObjectModeItem::GetVersion( sal_uInt16 /* nFileVersion */ ) const
{
return 1;
}
//------------------------------------------------------------------------
SfxPoolItem* ScViewObjectModeItem::Create(
SvStream& rStream,
sal_uInt16 nVersion ) const
{
if ( nVersion == 0 )
{
// alte Version mit AllEnumItem -> mit Mode "Show" erzeugen
return new ScViewObjectModeItem( Which() );
}
else
{
sal_uInt16 nVal;
rStream >> nVal;
//#i80528# adapt to new range eventually
if((sal_uInt16)VOBJ_MODE_HIDE < nVal) nVal = (sal_uInt16)VOBJ_MODE_SHOW;
return new ScViewObjectModeItem( Which(), (ScVObjMode)nVal);
}
}
// -----------------------------------------------------------------------
// double
// -----------------------------------------------------------------------
ScDoubleItem::ScDoubleItem( sal_uInt16 nWhichP, double nVal )
: SfxPoolItem ( nWhichP ),
nValue ( nVal )
{
}
//------------------------------------------------------------------------
ScDoubleItem::ScDoubleItem( const ScDoubleItem& rItem )
: SfxPoolItem ( rItem )
{
nValue = rItem.nValue;
}
//------------------------------------------------------------------------
String ScDoubleItem::GetValueText() const
{
return String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ScDoubleItem"));
}
//------------------------------------------------------------------------
int ScDoubleItem::operator==( const SfxPoolItem& rItem ) const
{
DBG_ASSERT( SfxPoolItem::operator==( rItem ), "unequal Which or Type" );
const ScDoubleItem& _rItem = (const ScDoubleItem&)rItem;
return int(nValue == _rItem.nValue);
//int(nValue == ((const ScDoubleItem&)rItem).nValue);
}
//------------------------------------------------------------------------
SfxPoolItem* ScDoubleItem::Clone( SfxItemPool* ) const
{
return new ScDoubleItem( *this );
}
//------------------------------------------------------------------------
SfxPoolItem* ScDoubleItem::Create( SvStream& rStream, sal_uInt16 /* nVer */ ) const
{
double nTmp=0;
rStream >> nTmp;
ScDoubleItem* pItem = new ScDoubleItem( Which(), nTmp );
return pItem;
}
//------------------------------------------------------------------------
ScDoubleItem::~ScDoubleItem()
{
}
// ============================================================================
ScPageScaleToItem::ScPageScaleToItem() :
SfxPoolItem( ATTR_PAGE_SCALETO ),
mnWidth( 0 ),
mnHeight( 0 )
{
}
ScPageScaleToItem::ScPageScaleToItem( sal_uInt16 nWidth, sal_uInt16 nHeight ) :
SfxPoolItem( ATTR_PAGE_SCALETO ),
mnWidth( nWidth ),
mnHeight( nHeight )
{
}
ScPageScaleToItem::~ScPageScaleToItem()
{
}
ScPageScaleToItem* ScPageScaleToItem::Clone( SfxItemPool* ) const
{
return new ScPageScaleToItem( *this );
}
int ScPageScaleToItem::operator==( const SfxPoolItem& rCmp ) const
{
DBG_ASSERT( SfxPoolItem::operator==( rCmp ), "ScPageScaleToItem::operator== - unequal wid or type" );
const ScPageScaleToItem& rPageCmp = static_cast< const ScPageScaleToItem& >( rCmp );
return ((mnWidth == rPageCmp.mnWidth) && (mnHeight == rPageCmp.mnHeight)) ? 1 : 0;
}
namespace {
void lclAppendScalePageCount( String& rText, sal_uInt16 nPages )
{
rText.AppendAscii( ": " );
if( nPages )
{
String aPages( ScGlobal::GetRscString( STR_SCATTR_PAGE_SCALE_PAGES ) );
aPages.SearchAndReplaceAscii( "%1", String::CreateFromInt32( nPages ) );
rText.Append( aPages );
}
else
rText.Append( ScGlobal::GetRscString( STR_SCATTR_PAGE_SCALE_AUTO ) );
}
} // namespace
SfxItemPresentation ScPageScaleToItem::GetPresentation(
SfxItemPresentation ePres, SfxMapUnit, SfxMapUnit, XubString& rText, const IntlWrapper* ) const
{
rText.Erase();
if( !IsValid() || (ePres == SFX_ITEM_PRESENTATION_NONE) )
return SFX_ITEM_PRESENTATION_NONE;
String aName( ScGlobal::GetRscString( STR_SCATTR_PAGE_SCALETO ) );
String aValue( ScGlobal::GetRscString( STR_SCATTR_PAGE_SCALE_WIDTH ) );
lclAppendScalePageCount( aValue, mnWidth );
aValue.AppendAscii( ", " ).Append( ScGlobal::GetRscString( STR_SCATTR_PAGE_SCALE_HEIGHT ) );
lclAppendScalePageCount( aValue, mnHeight );
switch( ePres )
{
case SFX_ITEM_PRESENTATION_NONE:
break;
case SFX_ITEM_PRESENTATION_NAMEONLY:
rText = aName;
break;
case SFX_ITEM_PRESENTATION_NAMELESS:
rText = aValue;
break;
case SFX_ITEM_PRESENTATION_COMPLETE:
rText.Assign( aName ).AppendAscii( " (" ).Append( aValue ).Append( ')' );
break;
default:
DBG_ERRORFILE( "ScPageScaleToItem::GetPresentation - unknown presentation mode" );
ePres = SFX_ITEM_PRESENTATION_NONE;
}
return ePres;
}
sal_Bool ScPageScaleToItem::QueryValue( uno::Any& rAny, sal_uInt8 nMemberId ) const
{
sal_Bool bRet = sal_True;
switch( nMemberId )
{
case SC_MID_PAGE_SCALETO_WIDTH: rAny <<= mnWidth; break;
case SC_MID_PAGE_SCALETO_HEIGHT: rAny <<= mnHeight; break;
default:
DBG_ERRORFILE( "ScPageScaleToItem::QueryValue - unknown member ID" );
bRet = sal_False;
}
return bRet;
}
sal_Bool ScPageScaleToItem::PutValue( const uno::Any& rAny, sal_uInt8 nMemberId )
{
sal_Bool bRet = sal_False;
switch( nMemberId )
{
case SC_MID_PAGE_SCALETO_WIDTH: bRet = rAny >>= mnWidth; break;
case SC_MID_PAGE_SCALETO_HEIGHT: bRet = rAny >>= mnHeight; break;
default:
DBG_ERRORFILE( "ScPageScaleToItem::PutValue - unknown member ID" );
}
return bRet;
}
// ============================================================================