Files
libreoffice/sw/source/core/txtnode/fmtatr2.cxx
Vladimir Glazounov 5a7832e553 INTEGRATION: CWS os8 (1.19.140); FILE MERGED
2003/04/07 22:09:46 os 1.19.140.2: RESYNC: (1.19-1.20); FILE MERGED
2003/04/03 07:11:55 os 1.19.140.1: #108583# precompiled headers removed
2003-04-17 13:34:26 +00:00

590 lines
16 KiB
C++

/*************************************************************************
*
* $RCSfile: fmtatr2.cxx,v $
*
* $Revision: 1.21 $
*
* last change: $Author: vg $ $Date: 2003-04-17 14:34:26 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library 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 for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (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.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
#pragma hdrstop
#include "hintids.hxx"
#include "unomid.h"
#ifndef __SBX_SBXVARIABLE_HXX //autogen
#include <svtools/sbxvar.hxx>
#endif
#ifndef _SFXMACITEM_HXX //autogen
#include <svtools/macitem.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _FCHRFMT_HXX //autogen
#include <fchrfmt.hxx>
#endif
#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#ifndef _TXTATR_HXX //autogen
#include <txtatr.hxx>
#endif
#ifndef _FMTRUBY_HXX
#include <fmtruby.hxx>
#endif
#ifndef _CHARFMT_HXX
#include <charfmt.hxx>
#endif
#ifndef _HINTS_HXX
#include <hints.hxx> // SwUpdateAttr
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _UNOSTYLE_HXX
#include <unostyle.hxx>
#endif
#ifndef _UNOEVENT_HXX
#include <unoevent.hxx> // SwHyperlinkEventDescriptor
#endif
#ifndef _COM_SUN_STAR_TEXT_RUBYADJUST_HDL_
#include <com/sun/star/text/RubyAdjust.hdl>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _COM_SUN_STAR_UNO_ANY_H_
#include <com/sun/star/uno/Any.h>
#endif
#ifndef _SWSTYLENAMEMAPPER_HXX
#include <SwStyleNameMapper.hxx>
#endif
using namespace ::com::sun::star;
using namespace ::rtl;
/*************************************************************************
|*
|* class SwFmtCharFmt
|* Beschreibung
|* Ersterstellung JP 23.11.90
|* Letzte Aenderung JP 09.08.94
|*
*************************************************************************/
TYPEINIT1_AUTOFACTORY(SwFmtINetFmt, SfxPoolItem);
SwFmtCharFmt::SwFmtCharFmt( SwCharFmt *pFmt )
: SfxPoolItem( RES_TXTATR_CHARFMT ),
SwClient(pFmt),
pTxtAttr( 0 )
{
}
SwFmtCharFmt::SwFmtCharFmt( const SwFmtCharFmt& rAttr )
: SfxPoolItem( RES_TXTATR_CHARFMT ),
SwClient( rAttr.GetCharFmt() ),
pTxtAttr( 0 )
{
}
SwFmtCharFmt::~SwFmtCharFmt() {}
int SwFmtCharFmt::operator==( const SfxPoolItem& rAttr ) const
{
ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
return GetCharFmt() == ((SwFmtCharFmt&)rAttr).GetCharFmt();
}
SfxPoolItem* SwFmtCharFmt::Clone( SfxItemPool* ) const
{
return new SwFmtCharFmt( *this );
}
// weiterleiten an das TextAttribut
void SwFmtCharFmt::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew )
{
if( pTxtAttr )
pTxtAttr->Modify( pOld, pNew );
}
// weiterleiten an das TextAttribut
BOOL SwFmtCharFmt::GetInfo( SfxPoolItem& rInfo ) const
{
return pTxtAttr ? pTxtAttr->GetInfo( rInfo ) : FALSE;
}
BOOL SwFmtCharFmt::QueryValue( uno::Any& rVal, BYTE nMemberId ) const
{
String sCharFmtName;
if(GetCharFmt())
SwStyleNameMapper::FillProgName(GetCharFmt()->GetName(), sCharFmtName, GET_POOLID_CHRFMT, sal_True );
rVal <<= OUString( sCharFmtName );
return TRUE;
}
BOOL SwFmtCharFmt::PutValue( const uno::Any& rVal, BYTE nMemberId )
{
DBG_ERROR("Zeichenvorlage kann mit PutValue nicht gesetzt werden!")
return FALSE;
}
/*************************************************************************
|*
|* class SwFmtINetFmt
|* Beschreibung
|* Ersterstellung AMA 02.08.96
|* Letzte Aenderung AMA 02.08.96
|*
*************************************************************************/
SwFmtINetFmt::SwFmtINetFmt()
: SfxPoolItem( RES_TXTATR_INETFMT ),
pTxtAttr( 0 ),
pMacroTbl( 0 ),
nINetId( 0 ),
nVisitedId( 0 )
{}
SwFmtINetFmt::SwFmtINetFmt( const XubString& rURL, const XubString& rTarget )
: SfxPoolItem( RES_TXTATR_INETFMT ),
aURL( rURL ),
aTargetFrame( rTarget ),
pTxtAttr( 0 ),
pMacroTbl( 0 ),
nINetId( 0 ),
nVisitedId( 0 )
{
}
SwFmtINetFmt::SwFmtINetFmt( const SwFmtINetFmt& rAttr )
: SfxPoolItem( RES_TXTATR_INETFMT ),
aURL( rAttr.GetValue() ),
aName( rAttr.aName ),
aTargetFrame( rAttr.aTargetFrame ),
aINetFmt( rAttr.aINetFmt ),
aVisitedFmt( rAttr.aVisitedFmt ),
pTxtAttr( 0 ),
pMacroTbl( 0 ),
nINetId( rAttr.nINetId ),
nVisitedId( rAttr.nVisitedId )
{
if( rAttr.GetMacroTbl() )
pMacroTbl = new SvxMacroTableDtor( *rAttr.GetMacroTbl() );
}
SwFmtINetFmt::~SwFmtINetFmt()
{
delete pMacroTbl;
}
int SwFmtINetFmt::operator==( const SfxPoolItem& rAttr ) const
{
ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
BOOL bRet = SfxPoolItem::operator==( (SfxPoolItem&) rAttr )
&& aURL == ((SwFmtINetFmt&)rAttr).aURL
&& aName == ((SwFmtINetFmt&)rAttr).aName
&& aTargetFrame == ((SwFmtINetFmt&)rAttr).aTargetFrame
&& aINetFmt == ((SwFmtINetFmt&)rAttr).aINetFmt
&& aVisitedFmt == ((SwFmtINetFmt&)rAttr).aVisitedFmt
&& nINetId == ((SwFmtINetFmt&)rAttr).nINetId
&& nVisitedId == ((SwFmtINetFmt&)rAttr).nVisitedId;
if( !bRet )
return FALSE;
const SvxMacroTableDtor* pOther = ((SwFmtINetFmt&)rAttr).pMacroTbl;
if( !pMacroTbl )
return ( !pOther || !pOther->Count() );
if( !pOther )
return 0 == pMacroTbl->Count();
const SvxMacroTableDtor& rOwn = *pMacroTbl;
const SvxMacroTableDtor& rOther = *pOther;
// Anzahl unterschiedlich => auf jeden Fall ungleich
if( rOwn.Count() != rOther.Count() )
return FALSE;
// einzeln vergleichen; wegen Performance ist die Reihenfolge wichtig
for( USHORT nNo = 0; nNo < rOwn.Count(); ++nNo )
{
const SvxMacro *pOwnMac = rOwn.GetObject(nNo);
const SvxMacro *pOtherMac = rOther.GetObject(nNo);
if ( rOwn.GetKey(pOwnMac) != rOther.GetKey(pOtherMac) ||
pOwnMac->GetLibName() != pOtherMac->GetLibName() ||
pOwnMac->GetMacName() != pOtherMac->GetMacName() )
return FALSE;
}
return TRUE;
}
SfxPoolItem* SwFmtINetFmt::Clone( SfxItemPool* ) const
{
return new SwFmtINetFmt( *this );
}
void SwFmtINetFmt::SetMacroTbl( const SvxMacroTableDtor* pNewTbl )
{
if( pNewTbl )
{
if( pMacroTbl )
*pMacroTbl = *pNewTbl;
else
pMacroTbl = new SvxMacroTableDtor( *pNewTbl );
}
else if( pMacroTbl )
delete pMacroTbl, pMacroTbl = 0;
}
void SwFmtINetFmt::SetMacro( USHORT nEvent, const SvxMacro& rMacro )
{
if( !pMacroTbl )
pMacroTbl = new SvxMacroTableDtor;
SvxMacro *pOldMacro;
if( 0 != ( pOldMacro = pMacroTbl->Get( nEvent )) )
{
delete pOldMacro;
pMacroTbl->Replace( nEvent, new SvxMacro( rMacro ) );
}
else
pMacroTbl->Insert( nEvent, new SvxMacro( rMacro ) );
}
const SvxMacro* SwFmtINetFmt::GetMacro( USHORT nEvent ) const
{
const SvxMacro* pRet = 0;
if( pMacroTbl && pMacroTbl->IsKeyValid( nEvent ) )
pRet = pMacroTbl->Get( nEvent );
return pRet;
}
BOOL SwFmtINetFmt::QueryValue( uno::Any& rVal, BYTE nMemberId ) const
{
BOOL bRet = TRUE;
XubString sVal;
nMemberId &= ~CONVERT_TWIPS;
switch(nMemberId)
{
case MID_URL_URL:
sVal = aURL;
break;
case MID_URL_TARGET:
sVal = aTargetFrame;
break;
case MID_URL_HYPERLINKNAME:
sVal = aName;
break;
case MID_URL_VISITED_FMT:
sVal = aVisitedFmt;
if( !sVal.Len() && nVisitedId != 0 )
SwStyleNameMapper::FillUIName( nVisitedId, sVal );
if( sVal.Len() )
SwStyleNameMapper::FillProgName( sVal, sVal, GET_POOLID_CHRFMT, sal_True );
break;
case MID_URL_UNVISITED_FMT:
sVal = aINetFmt;
if( !sVal.Len() && nINetId != 0 )
SwStyleNameMapper::FillUIName( nINetId, sVal );
if( sVal.Len() )
SwStyleNameMapper::FillProgName( sVal, sVal, GET_POOLID_CHRFMT, sal_True );
break;
case MID_URL_HYPERLINKEVENTS:
{
// create (and return) event descriptor
SwHyperlinkEventDescriptor* pEvents =
new SwHyperlinkEventDescriptor();
pEvents->copyMacrosFromINetFmt(*this);
uno::Reference<container::XNameReplace> xNameReplace(pEvents);
// all others return a string; so we just set rVal here and exit
rVal <<= xNameReplace;
return bRet;
}
break;
default:
bRet = FALSE;
}
rVal <<= OUString(sVal);
return bRet;
}
BOOL SwFmtINetFmt::PutValue( const uno::Any& rVal, BYTE nMemberId )
{
BOOL bRet = TRUE;
nMemberId &= ~CONVERT_TWIPS;
// all properties except HyperlinkEvents are of type string, hence
// we treat HyperlinkEvents specially
if (MID_URL_HYPERLINKEVENTS == nMemberId)
{
uno::Reference<container::XNameReplace> xReplace;
rVal >>= xReplace;
if (xReplace.is())
{
// Create hyperlink event descriptor. Then copy events
// from argument into descriptor. Then copy events from
// the descriptor into the format.
SwHyperlinkEventDescriptor* pEvents = new SwHyperlinkEventDescriptor();
uno::Reference< ::com::sun::star::lang::XServiceInfo> xHold = pEvents;
pEvents->copyMacrosFromNameReplace(xReplace);
pEvents->copyMacrosIntoINetFmt(*this);
}
else
{
// wrong type!
bRet = FALSE;
}
}
else
{
// all string properties:
if(rVal.getValueType() != ::getCppuType((rtl::OUString*)0))
return FALSE;
XubString sVal = *(rtl::OUString*)rVal.getValue();
switch(nMemberId)
{
case MID_URL_URL:
aURL = sVal;
break;
case MID_URL_TARGET:
aTargetFrame = sVal;
break;
case MID_URL_HYPERLINKNAME:
aName = sVal;
break;
case MID_URL_VISITED_FMT:
{
String aString;
SwStyleNameMapper::FillUIName( sVal, aString, GET_POOLID_CHRFMT, sal_True );
aVisitedFmt = OUString ( aString );
nVisitedId = SwStyleNameMapper::GetPoolIdFromUIName( aVisitedFmt,
GET_POOLID_CHRFMT );
}
break;
case MID_URL_UNVISITED_FMT:
{
String aString;
SwStyleNameMapper::FillUIName( sVal, aString, GET_POOLID_CHRFMT, sal_True );
aINetFmt = OUString ( aString );
nINetId = SwStyleNameMapper::GetPoolIdFromUIName( aINetFmt, GET_POOLID_CHRFMT );
}
break;
default:
bRet = FALSE;
}
}
return bRet;
}
/*************************************************************************
|* class SwFmtRuby
*************************************************************************/
SwFmtRuby::SwFmtRuby( const String& rRubyTxt )
: SfxPoolItem( RES_TXTATR_CJK_RUBY ),
sRubyTxt( rRubyTxt ),
nCharFmtId( 0 ),
nPosition( 0 ), nAdjustment( 0 ),
pTxtAttr( 0 )
{
}
SwFmtRuby::SwFmtRuby( const SwFmtRuby& rAttr )
: SfxPoolItem( RES_TXTATR_CJK_RUBY ),
sRubyTxt( rAttr.sRubyTxt ),
sCharFmtName( rAttr.sCharFmtName ),
nCharFmtId( rAttr.nCharFmtId),
nPosition( rAttr.nPosition ), nAdjustment( rAttr.nAdjustment ),
pTxtAttr( 0 )
{
}
SwFmtRuby::~SwFmtRuby()
{
}
SwFmtRuby& SwFmtRuby::operator=( const SwFmtRuby& rAttr )
{
sRubyTxt = rAttr.sRubyTxt;
sCharFmtName = rAttr.sCharFmtName;
nCharFmtId = rAttr.nCharFmtId;
nPosition = rAttr.nPosition;
nAdjustment = rAttr.nAdjustment;
pTxtAttr = 0;
return *this;
}
int SwFmtRuby::operator==( const SfxPoolItem& rAttr ) const
{
ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
return sRubyTxt == ((SwFmtRuby&)rAttr).sRubyTxt &&
sCharFmtName == ((SwFmtRuby&)rAttr).sCharFmtName &&
nCharFmtId == ((SwFmtRuby&)rAttr).nCharFmtId &&
nPosition == ((SwFmtRuby&)rAttr).nPosition &&
nAdjustment == ((SwFmtRuby&)rAttr).nAdjustment;
}
SfxPoolItem* SwFmtRuby::Clone( SfxItemPool* ) const
{
return new SwFmtRuby( *this );
}
BOOL SwFmtRuby::QueryValue( com::sun::star::uno::Any& rVal,
BYTE nMemberId ) const
{
BOOL bRet = TRUE;
nMemberId &= ~CONVERT_TWIPS;
switch( nMemberId )
{
case MID_RUBY_TEXT: rVal <<= (OUString)sRubyTxt; break;
case MID_RUBY_ADJUST: rVal <<= (sal_Int16)nAdjustment; break;
case MID_RUBY_CHARSTYLE:
{
String aString;
SwStyleNameMapper::FillProgName(sCharFmtName, aString, GET_POOLID_CHRFMT, sal_True );
rVal <<= OUString ( aString );
}
break;
case MID_RUBY_ABOVE:
{
sal_Bool bAbove = !nPosition;
rVal.setValue(&bAbove, ::getBooleanCppuType());
}
break;
default:
bRet = FALSE;
}
return bRet;
}
BOOL SwFmtRuby::PutValue( const com::sun::star::uno::Any& rVal,
BYTE nMemberId )
{
BOOL bRet = TRUE;
nMemberId &= ~CONVERT_TWIPS;
switch( nMemberId )
{
case MID_RUBY_TEXT:
{
OUString sTmp;
bRet = rVal >>= sTmp;
sRubyTxt = sTmp;
}
break;
case MID_RUBY_ADJUST:
{
sal_Int16 nSet; rVal >>= nSet;
if(nSet >= 0 && nSet <= com::sun::star::text::RubyAdjust_INDENT_BLOCK)
nAdjustment = nSet;
else
bRet = sal_False;
}
break;
case MID_RUBY_ABOVE:
{
const uno::Type& rType = ::getBooleanCppuType();
if(rVal.hasValue() && rVal.getValueType() == rType)
{
sal_Bool bAbove = *(sal_Bool*)rVal.getValue();
nPosition = bAbove ? 0 : 1;
}
}
break;
case MID_RUBY_CHARSTYLE:
{
OUString sTmp;
bRet = rVal >>= sTmp;
if(bRet)
sCharFmtName = SwStyleNameMapper::GetUIName(sTmp, GET_POOLID_CHRFMT );
}
break;
default:
bRet = FALSE;
}
return bRet;
}