blob: fcb1c7da5873fe65aa3a248f8d96a0cbbbc3851d [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_sw.hxx"
#include <com/sun/star/util/DateTime.hpp>
#include <com/sun/star/text/XTextTable.hpp>
#include <rtl/ustrbuf.hxx>
#include <vos/mutex.hxx>
#include <vcl/svapp.hxx>
#include <pagedesc.hxx>
#include "poolfmt.hxx"
#include <redline.hxx>
#include <section.hxx>
#include <unoprnms.hxx>
#include <unomid.h>
#include <unotextrange.hxx>
#include <unotextcursor.hxx>
#include <unoparagraph.hxx>
#include <unocoll.hxx>
#include <unomap.hxx>
#include <unocrsr.hxx>
#include <unoredline.hxx>
#include <doc.hxx>
#include <docary.hxx>
using namespace ::com::sun::star;
using ::rtl::OUString;
using ::rtl::OUStringBuffer;
SwXRedlineText::SwXRedlineText(SwDoc* _pDoc, SwNodeIndex aIndex) :
SwXText(_pDoc, CURSOR_REDLINE),
aNodeIndex(aIndex)
{
}
const SwStartNode* SwXRedlineText::GetStartNode() const
{
return aNodeIndex.GetNode().GetStartNode();
}
uno::Any SwXRedlineText::queryInterface( const uno::Type& rType )
throw(uno::RuntimeException)
{
uno::Any aRet;
if (::getCppuType((uno::Reference<container::XEnumerationAccess> *)0) == rType)
{
uno::Reference<container::XEnumerationAccess> aAccess = this;
aRet <<= aAccess;
}
else
{
// delegate to SwXText and OWeakObject
aRet = SwXText::queryInterface(rType);
if(!aRet.hasValue())
{
aRet = OWeakObject::queryInterface(rType);
}
}
return aRet;
}
uno::Sequence<uno::Type> SwXRedlineText::getTypes()
throw(uno::RuntimeException)
{
// SwXText::getTypes()
uno::Sequence<uno::Type> aTypes = SwXText::getTypes();
// add container::XEnumerationAccess
sal_Int32 nLength = aTypes.getLength();
aTypes.realloc(nLength + 1);
aTypes[nLength] = ::getCppuType((uno::Reference<container::XEnumerationAccess> *)0);
return aTypes;
}
uno::Sequence<sal_Int8> SwXRedlineText::getImplementationId()
throw(uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
static uno::Sequence< sal_Int8 > aId( 16 );
static sal_Bool bInit = sal_False;
if(!bInit)
{
rtl_createUuid( (sal_uInt8 *)(aId.getArray() ), 0, sal_True );
bInit = sal_True;
}
return aId;
}
uno::Reference<text::XTextCursor> SwXRedlineText::createTextCursor(void)
throw( uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
SwPosition aPos(aNodeIndex);
SwXTextCursor *const pXCursor =
new SwXTextCursor(*GetDoc(), this, CURSOR_REDLINE, aPos);
SwUnoCrsr *const pUnoCursor = pXCursor->GetCursor();
pUnoCursor->Move(fnMoveForward, fnGoNode);
// #101929# prevent a newly created text cursor from running inside a table
// because table cells have their own XText.
// Patterned after SwXTextFrame::createTextCursor(void).
// skip all tables at the beginning
SwTableNode* pTableNode = pUnoCursor->GetNode()->FindTableNode();
SwCntntNode* pContentNode = NULL;
bool bTable = pTableNode != NULL;
while( pTableNode != NULL )
{
pUnoCursor->GetPoint()->nNode = *(pTableNode->EndOfSectionNode());
pContentNode = GetDoc()->GetNodes().GoNext(&pUnoCursor->GetPoint()->nNode);
pTableNode = pContentNode->FindTableNode();
}
if( pContentNode != NULL )
pUnoCursor->GetPoint()->nContent.Assign( pContentNode, 0 );
if( bTable && pUnoCursor->GetNode()->FindSttNodeByType( SwNormalStartNode )
!= GetStartNode() )
{
// We have gone too far and have left our own redline. This means that
// no content node outside of a table could be found, and therefore we
// except.
uno::RuntimeException aExcept;
aExcept.Message = OUString( RTL_CONSTASCII_USTRINGPARAM(
"No content node found that is inside this change section "
"but outside of a table" ) );
throw aExcept;
}
return static_cast<text::XWordCursor*>(pXCursor);
}
uno::Reference<text::XTextCursor> SwXRedlineText::createTextCursorByRange(
const uno::Reference<text::XTextRange> & aTextRange)
throw( uno::RuntimeException )
{
uno::Reference<text::XTextCursor> xCursor = createTextCursor();
xCursor->gotoRange(aTextRange->getStart(), sal_False);
xCursor->gotoRange(aTextRange->getEnd(), sal_True);
return xCursor;
}
uno::Reference<container::XEnumeration> SwXRedlineText::createEnumeration(void)
throw( uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
SwPaM aPam(aNodeIndex);
aPam.Move(fnMoveForward, fnGoNode);
::std::auto_ptr<SwUnoCrsr> pUnoCursor(
GetDoc()->CreateUnoCrsr(*aPam.Start(), sal_False));
return new SwXParagraphEnumeration(this, pUnoCursor, CURSOR_REDLINE);
}
uno::Type SwXRedlineText::getElementType( ) throw(uno::RuntimeException)
{
return ::getCppuType((uno::Reference<text::XTextRange>*)0);
}
sal_Bool SwXRedlineText::hasElements( ) throw(uno::RuntimeException)
{
return sal_True; // we always have a content index
}
SwXRedlinePortion::SwXRedlinePortion( const SwRedline* pRed,
const SwUnoCrsr* pPortionCrsr,
uno::Reference< text::XText > xParent, sal_Bool bStart) :
SwXTextPortion(pPortionCrsr, xParent, bStart ? PORTION_REDLINE_START : PORTION_REDLINE_END),
// SwXText(pPortionCrsr->GetDoc(), CURSOR_REDLINE),
// SwXRedlineText(pPortionCrsr->GetDoc(), *pRed->GetContentIdx()),
pRedline(pRed)
{
SetCollapsed(!pRedline->HasMark());
}
SwXRedlinePortion::~SwXRedlinePortion()
{
}
static util::DateTime lcl_DateTimeToUno(const DateTime& rDT)
{
util::DateTime aRetDT;
aRetDT.Year = rDT.GetYear();
aRetDT.Month= rDT.GetMonth();
aRetDT.Day = rDT.GetDay();
aRetDT.Hours = rDT.GetHour();
aRetDT.Minutes = rDT.GetMin();
aRetDT.Seconds = rDT.GetSec();
aRetDT.HundredthSeconds = rDT.Get100Sec();
return aRetDT;
}
// ---------------------------------------------------------------------------
static OUString lcl_RedlineTypeToOUString(RedlineType_t eType)
{
OUString sRet;
switch(eType & nsRedlineType_t::REDLINE_NO_FLAG_MASK)
{
case nsRedlineType_t::REDLINE_INSERT: sRet = C2U("Insert"); break;
case nsRedlineType_t::REDLINE_DELETE: sRet = C2U("Delete"); break;
case nsRedlineType_t::REDLINE_FORMAT: sRet = C2U("Format"); break;
case nsRedlineType_t::REDLINE_TABLE: sRet = C2U("TextTable"); break;
case nsRedlineType_t::REDLINE_FMTCOLL:sRet = C2U("Style"); break;
}
return sRet;
}
// ---------------------------------------------------------------------------
static uno::Sequence<beans::PropertyValue> lcl_GetSuccessorProperties(const SwRedline& rRedline)
{
uno::Sequence<beans::PropertyValue> aValues(4);
const SwRedlineData* pNext = rRedline.GetRedlineData().Next();
if(pNext)
{
beans::PropertyValue* pValues = aValues.getArray();
pValues[0].Name = C2U(SW_PROP_NAME_STR(UNO_NAME_REDLINE_AUTHOR));
// GetAuthorString(n) walks the SwRedlineData* chain;
// here we always need element 1
pValues[0].Value <<= OUString(rRedline.GetAuthorString(1));
pValues[1].Name = C2U(SW_PROP_NAME_STR(UNO_NAME_REDLINE_DATE_TIME));
pValues[1].Value <<= lcl_DateTimeToUno(pNext->GetTimeStamp());
pValues[2].Name = C2U(SW_PROP_NAME_STR(UNO_NAME_REDLINE_COMMENT));
pValues[2].Value <<= OUString(pNext->GetComment());
pValues[3].Name = C2U(SW_PROP_NAME_STR(UNO_NAME_REDLINE_TYPE));
pValues[3].Value <<= lcl_RedlineTypeToOUString(pNext->GetType());
}
return aValues;
}
// ---------------------------------------------------------------------------
uno::Any SwXRedlinePortion::getPropertyValue( const OUString& rPropertyName )
throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
Validate();
uno::Any aRet;
if(rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_REDLINE_TEXT)))
{
SwNodeIndex* pNodeIdx = pRedline->GetContentIdx();
if(pNodeIdx )
{
if ( 1 < ( pNodeIdx->GetNode().EndOfSectionIndex() - pNodeIdx->GetNode().GetIndex() ) )
{
SwUnoCrsr* pUnoCrsr = GetCursor();
uno::Reference<text::XText> xRet = new SwXRedlineText(pUnoCrsr->GetDoc(), *pNodeIdx);
aRet <<= xRet;
}
else {
DBG_ASSERT(0, "Empty section in redline portion! (end node immediately follows start node)");
}
}
}
else
{
aRet = GetPropertyValue( rPropertyName, *pRedline);
if(!aRet.hasValue() &&
! rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_REDLINE_SUCCESSOR_DATA)))
aRet = SwXTextPortion::getPropertyValue(rPropertyName);
}
return aRet;
}
void SwXRedlinePortion::Validate() throw( uno::RuntimeException )
{
SwUnoCrsr* pUnoCrsr = GetCursor();
if(!pUnoCrsr)
throw uno::RuntimeException();
//search for the redline
SwDoc* pDoc = pUnoCrsr->GetDoc();
const SwRedlineTbl& rRedTbl = pDoc->GetRedlineTbl();
sal_Bool bFound = sal_False;
for(sal_uInt16 nRed = 0; nRed < rRedTbl.Count() && !bFound; nRed++)
bFound = pRedline == rRedTbl[nRed];
if(!bFound)
throw uno::RuntimeException();
}
uno::Sequence< sal_Int8 > SAL_CALL SwXRedlinePortion::getImplementationId( ) throw(uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
static uno::Sequence< sal_Int8 > aId( 16 );
static sal_Bool bInit = sal_False;
if(!bInit)
{
rtl_createUuid( (sal_uInt8 *)(aId.getArray() ), 0, sal_True );
bInit = sal_True;
}
return aId;
}
uno::Any SwXRedlinePortion::GetPropertyValue( const OUString& rPropertyName, const SwRedline& rRedline ) throw()
{
uno::Any aRet;
if(rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_REDLINE_AUTHOR)))
aRet <<= OUString(rRedline.GetAuthorString());
else if(rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_REDLINE_DATE_TIME)))
{
aRet <<= lcl_DateTimeToUno(rRedline.GetTimeStamp());
}
else if(rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_REDLINE_COMMENT)))
aRet <<= OUString(rRedline.GetComment());
else if(rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_REDLINE_TYPE)))
{
aRet <<= lcl_RedlineTypeToOUString(rRedline.GetType());
}
else if(rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_REDLINE_SUCCESSOR_DATA)))
{
if(rRedline.GetRedlineData().Next())
aRet <<= lcl_GetSuccessorProperties(rRedline);
}
else if (rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_REDLINE_IDENTIFIER)))
{
OUStringBuffer sBuf;
sBuf.append( sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(&rRedline) ) );
aRet <<= sBuf.makeStringAndClear();
}
else if (rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_IS_IN_HEADER_FOOTER)))
{
sal_Bool bRet =
rRedline.GetDoc()->IsInHeaderFooter( rRedline.GetPoint()->nNode );
aRet.setValue(&bRet, ::getBooleanCppuType());
}
else if (rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_MERGE_LAST_PARA)))
{
sal_Bool bRet = !rRedline.IsDelLastPara();
aRet.setValue( &bRet, ::getBooleanCppuType() );
}
return aRet;
}
uno::Sequence< beans::PropertyValue > SwXRedlinePortion::CreateRedlineProperties(
const SwRedline& rRedline, sal_Bool bIsStart ) throw()
{
uno::Sequence< beans::PropertyValue > aRet(11);
const SwRedlineData* pNext = rRedline.GetRedlineData().Next();
beans::PropertyValue* pRet = aRet.getArray();
OUStringBuffer sRedlineIdBuf;
sRedlineIdBuf.append( sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(&rRedline) ) );
sal_Int32 nPropIdx = 0;
pRet[nPropIdx].Name = C2U(SW_PROP_NAME_STR(UNO_NAME_REDLINE_AUTHOR));
pRet[nPropIdx++].Value <<= OUString(rRedline.GetAuthorString());
pRet[nPropIdx].Name = C2U(SW_PROP_NAME_STR(UNO_NAME_REDLINE_DATE_TIME));
pRet[nPropIdx++].Value <<= lcl_DateTimeToUno(rRedline.GetTimeStamp());
pRet[nPropIdx].Name = C2U(SW_PROP_NAME_STR(UNO_NAME_REDLINE_COMMENT));
pRet[nPropIdx++].Value <<= OUString(rRedline.GetComment());
pRet[nPropIdx].Name = C2U(SW_PROP_NAME_STR(UNO_NAME_REDLINE_TYPE));
pRet[nPropIdx++].Value <<= lcl_RedlineTypeToOUString(rRedline.GetType());
pRet[nPropIdx].Name = C2U(SW_PROP_NAME_STR(UNO_NAME_REDLINE_IDENTIFIER));
pRet[nPropIdx++].Value <<= sRedlineIdBuf.makeStringAndClear();
pRet[nPropIdx].Name = C2U(SW_PROP_NAME_STR(UNO_NAME_IS_COLLAPSED));
sal_Bool bTmp = !rRedline.HasMark();
pRet[nPropIdx++].Value.setValue(&bTmp, ::getBooleanCppuType()) ;
pRet[nPropIdx].Name = C2U(SW_PROP_NAME_STR(UNO_NAME_IS_START));
pRet[nPropIdx++].Value.setValue(&bIsStart, ::getBooleanCppuType()) ;
bTmp = !rRedline.IsDelLastPara();
pRet[nPropIdx].Name = C2U(SW_PROP_NAME_STR(UNO_NAME_MERGE_LAST_PARA));
pRet[nPropIdx++].Value.setValue(&bTmp, ::getBooleanCppuType()) ;
SwNodeIndex* pNodeIdx = rRedline.GetContentIdx();
if(pNodeIdx )
{
if ( 1 < ( pNodeIdx->GetNode().EndOfSectionIndex() - pNodeIdx->GetNode().GetIndex() ) )
{
uno::Reference<text::XText> xRet = new SwXRedlineText(rRedline.GetDoc(), *pNodeIdx);
pRet[nPropIdx].Name = C2U(SW_PROP_NAME_STR(UNO_NAME_REDLINE_TEXT));
pRet[nPropIdx++].Value <<= xRet;
}
else {
DBG_ASSERT(0, "Empty section in redline portion! (end node immediately follows start node)");
}
}
if(pNext)
{
pRet[nPropIdx].Name = C2U(SW_PROP_NAME_STR(UNO_NAME_REDLINE_SUCCESSOR_DATA));
pRet[nPropIdx++].Value <<= lcl_GetSuccessorProperties(rRedline);
}
aRet.realloc(nPropIdx);
return aRet;
}
TYPEINIT1(SwXRedline, SwClient);
SwXRedline::SwXRedline(SwRedline& rRedline, SwDoc& rDoc) :
SwXText(&rDoc, CURSOR_REDLINE),
pDoc(&rDoc),
pRedline(&rRedline)
{
pDoc->GetPageDescFromPool(RES_POOLPAGE_STANDARD)->Add(this);
}
SwXRedline::~SwXRedline()
{
}
uno::Reference< beans::XPropertySetInfo > SwXRedline::getPropertySetInfo( ) throw(uno::RuntimeException)
{
static uno::Reference< beans::XPropertySetInfo > xRef =
aSwMapProvider.GetPropertySet(PROPERTY_MAP_REDLINE)->getPropertySetInfo();
return xRef;
}
void SwXRedline::setPropertyValue( const OUString& rPropertyName, const uno::Any& aValue )
throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException,
lang::WrappedTargetException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
if(!pDoc)
throw uno::RuntimeException();
if(rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_REDLINE_AUTHOR)))
{
DBG_ERROR("currently not available");
}
else if(rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_REDLINE_DATE_TIME)))
{
DBG_ERROR("currently not available");
// util::DateTime aDT;
// if(aValue >>= aDT)
// pRedline->SetTimeStamp(lcl_DateTimeFromUno(aDT));
}
else if(rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_REDLINE_COMMENT)))
{
OUString sTmp; aValue >>= sTmp;
pRedline->SetComment(sTmp);
}
else if(rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_REDLINE_TYPE)))
{
DBG_ERROR("currently not available");
OUString sTmp; aValue >>= sTmp;
if(!sTmp.getLength())
throw lang::IllegalArgumentException();
// pRedline->SetType(lcl_OUStringToRedlineType(sTmp));
}
else if(rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_REDLINE_SUCCESSOR_DATA)))
{
DBG_ERROR("currently not available");
/* SwRedlineData* pNext = pRedline->GetRedlineData().Next();
uno::Sequence<beans::PropertyValue> aValues;
if(!(aValue =>> aValues) || !pNext)
throw lang::IllegalArgumentException();
const beans::PropertyValue* pValues = aValues.getConstArray();
for(sal_Int32 nValue = 0; nValue < aValues.getLength(); nValue++)
{
if(pValues[nValue].Name.equalsAscii(UNO_NAME_REDLINE_AUTHOR.pName)
{
DBG_ERROR("currently not available");
}
else if(pValues[nValue].Name.equalsAscii(UNO_NAME_REDLINE_DATE_TIME.pName))
{
util::DateTime aDT;
if(pValues[nValue].Value >>= aDT)
pNext->SetTimeStamp(lcl_DateTimeFromUno(aDT));
}
else if(pValues[nValue].Name.equalsAscii(UNO_NAME_REDLINE_COMMENT.pName))
{
OUString sTmp; pValues[nValue].Value >>= sTmp;
pNext->SetComment(sTmp);
}
else if(pValues[nValue].Name.equalsAscii(UNO_NAME_REDLINE_TYPE.pName))
{
OUString sTmp; pValues[nValue].Value >>= sTmp;
pNext->SetType(lcl_OUStringToRedlineType(sTmp);
}
}
*/ }
else
{
throw lang::IllegalArgumentException();
}
}
uno::Any SwXRedline::getPropertyValue( const OUString& rPropertyName )
throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
if(!pDoc)
throw uno::RuntimeException();
uno::Any aRet;
sal_Bool bStart = rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_REDLINE_START));
if(bStart ||
rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_REDLINE_END)))
{
uno::Reference<XInterface> xRet;
SwNode* pNode = pRedline->GetNode();
if(!bStart && pRedline->HasMark())
pNode = pRedline->GetNode(sal_False);
switch(pNode->GetNodeType())
{
case ND_SECTIONNODE:
{
SwSectionNode* pSectNode = pNode->GetSectionNode();
DBG_ASSERT(pSectNode, "No section node!");
xRet = SwXTextSections::GetObject( *pSectNode->GetSection().GetFmt() );
}
break;
case ND_TABLENODE :
{
SwTableNode* pTblNode = pNode->GetTableNode();
DBG_ASSERT(pTblNode, "No table node!");
SwTable& rTbl = pTblNode->GetTable();
SwFrmFmt* pTblFmt = rTbl.GetFrmFmt();
xRet = SwXTextTables::GetObject( *pTblFmt );
}
break;
case ND_TEXTNODE :
{
SwPosition* pPoint = 0;
if(bStart || !pRedline->HasMark())
pPoint = pRedline->GetPoint();
else
pPoint = pRedline->GetMark();
const uno::Reference<text::XTextRange> xRange =
SwXTextRange::CreateXTextRange(*pDoc, *pPoint, 0);
xRet = xRange.get();
}
break;
default:
DBG_ERROR("illegal node type");
}
aRet <<= xRet;
}
else if(rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_REDLINE_TEXT)))
{
SwNodeIndex* pNodeIdx = pRedline->GetContentIdx();
if( pNodeIdx )
{
if ( 1 < ( pNodeIdx->GetNode().EndOfSectionIndex() - pNodeIdx->GetNode().GetIndex() ) )
{
uno::Reference<text::XText> xRet = new SwXRedlineText(pDoc, *pNodeIdx);
aRet <<= xRet;
}
else {
DBG_ASSERT(0, "Empty section in redline portion! (end node immediately follows start node)");
}
}
}
else
aRet = SwXRedlinePortion::GetPropertyValue(rPropertyName, *pRedline);
return aRet;
}
void SwXRedline::addPropertyChangeListener(
const OUString& /*aPropertyName*/,
const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/ )
throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
{
}
void SwXRedline::removePropertyChangeListener(
const OUString& /*aPropertyName*/, const uno::Reference< beans::XPropertyChangeListener >& /*aListener*/ )
throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
{
}
void SwXRedline::addVetoableChangeListener(
const OUString& /*PropertyName*/, const uno::Reference< beans::XVetoableChangeListener >& /*aListener*/ )
throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
{
}
void SwXRedline::removeVetoableChangeListener(
const OUString& /*PropertyName*/, const uno::Reference< beans::XVetoableChangeListener >& /*aListener*/ )
throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
{
}
void SwXRedline::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
{
ClientModify(this, pOld, pNew);
if(!GetRegisteredIn())
{
pDoc = 0;
pRedline = 0;
}
}
uno::Reference< container::XEnumeration > SwXRedline::createEnumeration(void) throw( uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
uno::Reference< container::XEnumeration > xRet;
if(!pDoc)
throw uno::RuntimeException();
SwNodeIndex* pNodeIndex = pRedline->GetContentIdx();
if(pNodeIndex)
{
SwPaM aPam(*pNodeIndex);
aPam.Move(fnMoveForward, fnGoNode);
::std::auto_ptr<SwUnoCrsr> pUnoCursor(
GetDoc()->CreateUnoCrsr(*aPam.Start(), sal_False));
xRet = new SwXParagraphEnumeration(this, pUnoCursor, CURSOR_REDLINE);
}
return xRet;
}
uno::Type SwXRedline::getElementType( ) throw(uno::RuntimeException)
{
return ::getCppuType((uno::Reference<text::XTextRange>*)0);
}
sal_Bool SwXRedline::hasElements( ) throw(uno::RuntimeException)
{
if(!pDoc)
throw uno::RuntimeException();
return 0 != pRedline->GetContentIdx();
}
uno::Reference< text::XTextCursor > SwXRedline::createTextCursor(void) throw( uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
if(!pDoc)
throw uno::RuntimeException();
uno::Reference< text::XTextCursor > xRet;
SwNodeIndex* pNodeIndex = pRedline->GetContentIdx();
if(pNodeIndex)
{
SwPosition aPos(*pNodeIndex);
SwXTextCursor *const pXCursor =
new SwXTextCursor(*pDoc, this, CURSOR_REDLINE, aPos);
SwUnoCrsr *const pUnoCrsr = pXCursor->GetCursor();
pUnoCrsr->Move(fnMoveForward, fnGoNode);
//steht hier eine Tabelle?
SwTableNode* pTblNode = pUnoCrsr->GetNode()->FindTableNode();
SwCntntNode* pCont = 0;
while( pTblNode )
{
pUnoCrsr->GetPoint()->nNode = *pTblNode->EndOfSectionNode();
pCont = GetDoc()->GetNodes().GoNext(&pUnoCrsr->GetPoint()->nNode);
pTblNode = pCont->FindTableNode();
}
if(pCont)
pUnoCrsr->GetPoint()->nContent.Assign(pCont, 0);
xRet = static_cast<text::XWordCursor*>(pXCursor);
}
else
{
throw uno::RuntimeException();
}
return xRet;
}
uno::Reference< text::XTextCursor > SwXRedline::createTextCursorByRange(
const uno::Reference< text::XTextRange > & /*aTextPosition*/)
throw( uno::RuntimeException )
{
throw uno::RuntimeException();
}
uno::Any SwXRedline::queryInterface( const uno::Type& rType )
throw(uno::RuntimeException)
{
uno::Any aRet = SwXText::queryInterface(rType);
if(!aRet.hasValue())
{
aRet = SwXRedlineBaseClass::queryInterface(rType);
}
return aRet;
}
uno::Sequence<uno::Type> SwXRedline::getTypes()
throw(uno::RuntimeException)
{
uno::Sequence<uno::Type> aTypes = SwXText::getTypes();
uno::Sequence<uno::Type> aBaseTypes = SwXRedlineBaseClass::getTypes();
const uno::Type* pBaseTypes = aBaseTypes.getConstArray();
sal_Int32 nCurType = aTypes.getLength();
aTypes.realloc(aTypes.getLength() + aBaseTypes.getLength());
uno::Type* pTypes = aTypes.getArray();
for(sal_Int32 nType = 0; nType < aBaseTypes.getLength(); nType++)
pTypes[nCurType++] = pBaseTypes[nType];
return aTypes;
}
uno::Sequence<sal_Int8> SwXRedline::getImplementationId()
throw(uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
static uno::Sequence< sal_Int8 > aId( 16 );
static sal_Bool bInit = sal_False;
if(!bInit)
{
rtl_createUuid( (sal_uInt8 *)(aId.getArray() ), 0, sal_True );
bInit = sal_True;
}
return aId;
}