blob: edc112de2e1093fba254199251fc0743df355760 [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 <cmdid.h>
#include <vos/mutex.hxx>
#include <vcl/svapp.hxx>
#include <svl/itemprop.hxx>
#include <unocrsrhelper.hxx>
#include <unoport.hxx>
#include <unoparaframeenum.hxx>
#include <unotextrange.hxx>
#include <unomap.hxx>
#include <unoprnms.hxx>
#include <unomid.h>
#include <txtatr.hxx>
#include <txtfld.hxx>
#include <ndtxt.hxx>
#include <doc.hxx>
#include <fmtflcnt.hxx>
#include <fmtfld.hxx>
#include <frmfmt.hxx>
#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <com/sun/star/beans/SetPropertyTolerantFailed.hpp>
#include <com/sun/star/beans/GetPropertyTolerantResult.hpp>
#include <com/sun/star/beans/TolerantPropertySetResultType.hpp>
using namespace ::com::sun::star;
using ::rtl::OUString;
/******************************************************************
* SwXTextPortion
******************************************************************/
void SwXTextPortion::init(const SwUnoCrsr* pPortionCursor)
{
SwUnoCrsr* pUnoCursor =
pPortionCursor->GetDoc()->CreateUnoCrsr(*pPortionCursor->GetPoint());
if (pPortionCursor->HasMark())
{
pUnoCursor->SetMark();
*pUnoCursor->GetMark() = *pPortionCursor->GetMark();
}
pUnoCursor->Add(this);
}
/*-- 11.12.98 09:56:55---------------------------------------------------
-----------------------------------------------------------------------*/
SwXTextPortion::SwXTextPortion(
const SwUnoCrsr* pPortionCrsr,
uno::Reference< text::XText > const& rParent,
SwTextPortionType eType )
: m_ListenerContainer( static_cast<text::XTextRange*>(this) )
, m_pPropSet(aSwMapProvider.GetPropertySet(
(PORTION_REDLINE_START == eType ||
PORTION_REDLINE_END == eType)
? PROPERTY_MAP_REDLINE_PORTION
: PROPERTY_MAP_TEXTPORTION_EXTENSIONS))
, m_xParentText(rParent)
, m_pRubyText(0)
, m_pRubyStyle(0)
, m_pRubyAdjust(0)
, m_pRubyIsAbove(0)
, m_FrameDepend(this, 0)
, m_pFrameFmt(0)
, m_ePortionType(eType)
, m_bIsCollapsed(false)
{
init( pPortionCrsr);
}
/* -----------------24.03.99 16:30-------------------
*
* --------------------------------------------------*/
SwXTextPortion::SwXTextPortion(
const SwUnoCrsr* pPortionCrsr,
uno::Reference< text::XText > const& rParent,
SwFrmFmt& rFmt )
: m_ListenerContainer( static_cast<text::XTextRange*>(this) )
, m_pPropSet(aSwMapProvider.GetPropertySet(
PROPERTY_MAP_TEXTPORTION_EXTENSIONS))
, m_xParentText(rParent)
, m_pRubyText(0)
, m_pRubyStyle(0)
, m_pRubyAdjust(0)
, m_pRubyIsAbove(0)
, m_FrameDepend(this, &rFmt)
, m_pFrameFmt(&rFmt)
, m_ePortionType(PORTION_FRAME)
, m_bIsCollapsed(false)
{
init( pPortionCrsr);
}
/* -----------------------------19.02.01 10:52--------------------------------
---------------------------------------------------------------------------*/
SwXTextPortion::SwXTextPortion(
const SwUnoCrsr* pPortionCrsr,
SwTxtRuby const& rAttr,
uno::Reference< text::XText > const& xParent,
sal_Bool bIsEnd )
: m_ListenerContainer( static_cast<text::XTextRange*>(this) )
, m_pPropSet(aSwMapProvider.GetPropertySet(
PROPERTY_MAP_TEXTPORTION_EXTENSIONS))
, m_xParentText(xParent)
, m_pRubyText ( bIsEnd ? 0 : new uno::Any )
, m_pRubyStyle ( bIsEnd ? 0 : new uno::Any )
, m_pRubyAdjust ( bIsEnd ? 0 : new uno::Any )
, m_pRubyIsAbove( bIsEnd ? 0 : new uno::Any )
, m_FrameDepend(this, 0)
, m_pFrameFmt(0)
, m_ePortionType( bIsEnd ? PORTION_RUBY_END : PORTION_RUBY_START )
, m_bIsCollapsed(false)
{
init( pPortionCrsr);
if (!bIsEnd)
{
const SfxPoolItem& rItem = rAttr.GetAttr();
rItem.QueryValue(*m_pRubyText, MID_RUBY_TEXT);
rItem.QueryValue(*m_pRubyStyle, MID_RUBY_CHARSTYLE);
rItem.QueryValue(*m_pRubyAdjust, MID_RUBY_ADJUST);
rItem.QueryValue(*m_pRubyIsAbove, MID_RUBY_ABOVE);
}
}
/*-- 11.12.98 09:56:55---------------------------------------------------
-----------------------------------------------------------------------*/
SwXTextPortion::~SwXTextPortion()
{
vos::OGuard aGuard(Application::GetSolarMutex());
SwUnoCrsr* pUnoCrsr = GetCursor();
delete pUnoCrsr;
}
/*-- 11.12.98 09:56:56---------------------------------------------------
-----------------------------------------------------------------------*/
uno::Reference< text::XText > SwXTextPortion::getText()
throw( uno::RuntimeException )
{
return m_xParentText;
}
/*-- 11.12.98 09:56:56---------------------------------------------------
-----------------------------------------------------------------------*/
uno::Reference< text::XTextRange > SwXTextPortion::getStart()
throw( uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
uno::Reference< text::XTextRange > xRet;
SwUnoCrsr* pUnoCrsr = GetCursor();
if (!pUnoCrsr)
throw uno::RuntimeException();
SwPaM aPam(*pUnoCrsr->Start());
uno::Reference< text::XText > xParent = getText();
xRet = new SwXTextRange(aPam, xParent);
return xRet;
}
/*-- 11.12.98 09:56:57---------------------------------------------------
-----------------------------------------------------------------------*/
uno::Reference< text::XTextRange > SwXTextPortion::getEnd()
throw( uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
uno::Reference< text::XTextRange > xRet;
SwUnoCrsr* pUnoCrsr = GetCursor();
if (!pUnoCrsr)
throw uno::RuntimeException();
SwPaM aPam(*pUnoCrsr->End());
uno::Reference< text::XText > xParent = getText();
xRet = new SwXTextRange(aPam, xParent);
return xRet;
}
/*-- 11.12.98 09:56:57---------------------------------------------------
-----------------------------------------------------------------------*/
OUString SwXTextPortion::getString()
throw( uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
OUString aTxt;
SwUnoCrsr* pUnoCrsr = GetCursor();
if (!pUnoCrsr)
throw uno::RuntimeException();
// TextPortions are always within a paragraph
SwTxtNode* pTxtNd = pUnoCrsr->GetNode()->GetTxtNode();
if ( pTxtNd )
{
xub_StrLen nStt = pUnoCrsr->Start()->nContent.GetIndex();
aTxt = pTxtNd->GetExpandTxt( nStt,
pUnoCrsr->End()->nContent.GetIndex() - nStt );
}
return aTxt;
}
/*-- 11.12.98 09:56:57---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextPortion::setString(const OUString& aString) throw( uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
SwUnoCrsr* pUnoCrsr = GetCursor();
if (!pUnoCrsr)
throw uno::RuntimeException();
SwUnoCursorHelper::SetString(*pUnoCrsr, aString);
}
/*-- 11.12.98 09:56:57---------------------------------------------------
-----------------------------------------------------------------------*/
uno::Reference< beans::XPropertySetInfo > SwXTextPortion::getPropertySetInfo()
throw( uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
//! PropertySetInfo for text portion extensions
static uno::Reference< beans::XPropertySetInfo >
xTxtPorExtRef = aSwMapProvider.GetPropertySet(
PROPERTY_MAP_TEXTPORTION_EXTENSIONS)->getPropertySetInfo();
//! PropertySetInfo for redline portions
static uno::Reference< beans::XPropertySetInfo >
xRedlPorRef = aSwMapProvider.GetPropertySet(
PROPERTY_MAP_REDLINE_PORTION)->getPropertySetInfo();
return (PORTION_REDLINE_START == m_ePortionType ||
PORTION_REDLINE_END == m_ePortionType) ? xRedlPorRef : xTxtPorExtRef;
}
/*-- 11.12.98 09:56:57---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextPortion::setPropertyValue(const OUString& rPropertyName,
const uno::Any& aValue)
throw( beans::UnknownPropertyException,
beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
SwUnoCrsr* pUnoCrsr = GetCursor();
if (!pUnoCrsr)
throw uno::RuntimeException();
SwUnoCursorHelper::SetPropertyValue(*pUnoCrsr, *m_pPropSet,
rPropertyName, aValue);
}
/*-- 04.11.03 09:56:58---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextPortion::GetPropertyValue(
uno::Any &rVal,
const SfxItemPropertySimpleEntry& rEntry,
SwUnoCrsr *pUnoCrsr,
SfxItemSet *&pSet )
{
DBG_ASSERT( pUnoCrsr, "UNO cursor missing" );
if (!pUnoCrsr)
return;
if(pUnoCrsr)
{
switch(rEntry.nWID)
{
case FN_UNO_TEXT_PORTION_TYPE:
{
const char* pRet;
switch (m_ePortionType)
{
case PORTION_TEXT: pRet = "Text";break;
case PORTION_FIELD: pRet = "TextField";break;
case PORTION_FRAME: pRet = "Frame";break;
case PORTION_FOOTNOTE: pRet = "Footnote";break;
case PORTION_REFMARK_START:
case PORTION_REFMARK_END: pRet = SW_PROP_NAME_STR(UNO_NAME_REFERENCE_MARK);break;
case PORTION_TOXMARK_START:
case PORTION_TOXMARK_END: pRet = SW_PROP_NAME_STR(UNO_NAME_DOCUMENT_INDEX_MARK);break;
case PORTION_BOOKMARK_START :
case PORTION_BOOKMARK_END : pRet = SW_PROP_NAME_STR(UNO_NAME_BOOKMARK);break;
case PORTION_REDLINE_START:
case PORTION_REDLINE_END: pRet = "Redline";break;
case PORTION_RUBY_START:
case PORTION_RUBY_END: pRet = "Ruby";break;
case PORTION_SOFT_PAGEBREAK:pRet = "SoftPageBreak";break;
case PORTION_META: pRet = SW_PROP_NAME_STR(UNO_NAME_META); break;
case PORTION_FIELD_START:pRet = "TextFieldStart";break;
case PORTION_FIELD_END:pRet = "TextFieldEnd";break;
case PORTION_FIELD_START_END:pRet = "TextFieldStartEnd";break;
case PORTION_ANNOTATION:
pRet = "Annotation";
break;
case PORTION_ANNOTATION_END:
pRet = "AnnotationEnd";
break;
default:
pRet = 0;
}
OUString sRet;
if( pRet )
sRet = C2U( pRet );
rVal <<= sRet;
}
break;
case FN_UNO_CONTROL_CHARACTER: // obsolete!
break;
case FN_UNO_DOCUMENT_INDEX_MARK:
rVal <<= m_xTOXMark;
break;
case FN_UNO_REFERENCE_MARK:
rVal <<= m_xRefMark;
break;
case FN_UNO_BOOKMARK:
rVal <<= m_xBookmark;
break;
case FN_UNO_FOOTNOTE:
rVal <<= m_xFootnote;
break;
case FN_UNO_TEXT_FIELD:
rVal <<= m_xTextField;
break;
case FN_UNO_META:
rVal <<= m_xMeta;
break;
case FN_UNO_IS_COLLAPSED:
{
switch (m_ePortionType)
{
case PORTION_REFMARK_START:
case PORTION_BOOKMARK_START :
case PORTION_TOXMARK_START:
case PORTION_REFMARK_END:
case PORTION_TOXMARK_END:
case PORTION_BOOKMARK_END :
case PORTION_REDLINE_START :
case PORTION_REDLINE_END :
case PORTION_RUBY_START:
case PORTION_RUBY_END:
case PORTION_FIELD_START:
case PORTION_FIELD_END:
rVal.setValue(&m_bIsCollapsed, ::getBooleanCppuType());
break;
default:
break;
}
}
break;
case FN_UNO_IS_START:
{
sal_Bool bStart = sal_True, bPut = sal_True;
switch (m_ePortionType)
{
case PORTION_REFMARK_START:
case PORTION_BOOKMARK_START:
case PORTION_TOXMARK_START:
case PORTION_REDLINE_START:
case PORTION_RUBY_START:
case PORTION_FIELD_START:
break;
case PORTION_REFMARK_END:
case PORTION_TOXMARK_END:
case PORTION_BOOKMARK_END:
case PORTION_REDLINE_END:
case PORTION_RUBY_END:
case PORTION_FIELD_END:
bStart = sal_False;
break;
default:
bPut = sal_False;
}
if(bPut)
rVal.setValue(&bStart, ::getBooleanCppuType());
}
break;
case RES_TXTATR_CJK_RUBY:
{
const uno::Any* pToSet = 0;
switch(rEntry.nMemberId)
{
case MID_RUBY_TEXT : pToSet = m_pRubyText.get(); break;
case MID_RUBY_ADJUST : pToSet = m_pRubyAdjust.get(); break;
case MID_RUBY_CHARSTYLE:pToSet = m_pRubyStyle.get(); break;
case MID_RUBY_ABOVE : pToSet = m_pRubyIsAbove.get();break;
}
if(pToSet)
rVal = *pToSet;
}
break;
default:
beans::PropertyState eTemp;
sal_Bool bDone = SwUnoCursorHelper::getCrsrPropertyValue(
rEntry, *pUnoCrsr, &(rVal), eTemp );
if(!bDone)
{
if(!pSet)
{
pSet = new SfxItemSet(pUnoCrsr->GetDoc()->GetAttrPool(),
RES_CHRATR_BEGIN, RES_FRMATR_END - 1,
RES_UNKNOWNATR_CONTAINER, RES_UNKNOWNATR_CONTAINER,
RES_TXTATR_UNKNOWN_CONTAINER, RES_TXTATR_UNKNOWN_CONTAINER,
0L);
SwUnoCursorHelper::GetCrsrAttr(*pUnoCrsr, *pSet);
}
m_pPropSet->getPropertyValue(rEntry, *pSet, rVal);
}
}
}
}
uno::Sequence< uno::Any > SAL_CALL SwXTextPortion::GetPropertyValues_Impl(
const uno::Sequence< OUString >& rPropertyNames )
throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
sal_Int32 nLength = rPropertyNames.getLength();
const OUString *pPropertyNames = rPropertyNames.getConstArray();
uno::Sequence< uno::Any > aValues(rPropertyNames.getLength());
uno::Any *pValues = aValues.getArray();
SwUnoCrsr* pUnoCrsr = GetCursor();
if (!pUnoCrsr)
throw uno::RuntimeException();
{
SfxItemSet *pSet = 0;
// get startting pount fo the look-up, either the provided one or else
// from the beginning of the map
const SfxItemPropertyMap* pMap = m_pPropSet->getPropertyMap();
for(sal_Int32 nProp = 0; nProp < nLength; nProp++)
{
const SfxItemPropertySimpleEntry* pEntry = pMap->getByName(pPropertyNames[nProp]);
if(pEntry)
{
GetPropertyValue( pValues[nProp], *pEntry, pUnoCrsr, pSet );
}
else
throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + pPropertyNames[nProp], static_cast < cppu::OWeakObject * > ( this ) );
}
delete pSet;
}
return aValues;
}
/*-- 11.12.98 09:56:58---------------------------------------------------
-----------------------------------------------------------------------*/
uno::Any SwXTextPortion::getPropertyValue(
const OUString& rPropertyName)
throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
uno::Sequence< ::rtl::OUString > aPropertyNames(1);
aPropertyNames.getArray()[0] = rPropertyName;
return GetPropertyValues_Impl(aPropertyNames).getConstArray()[0];
}
/* -----------------------------02.04.01 11:44--------------------------------
---------------------------------------------------------------------------*/
void SAL_CALL SwXTextPortion::SetPropertyValues_Impl(
const uno::Sequence< OUString >& rPropertyNames,
const uno::Sequence< uno::Any >& rValues )
throw( beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException,
lang::WrappedTargetException, uno::RuntimeException)
{
SwUnoCrsr* pUnoCrsr = GetCursor();
if (!pUnoCrsr)
throw uno::RuntimeException();
{
const OUString* pPropertyNames = rPropertyNames.getConstArray();
const uno::Any* pValues = rValues.getConstArray();
const SfxItemPropertyMap* pMap = m_pPropSet->getPropertyMap();
for(sal_Int32 nProp = 0; nProp < rPropertyNames.getLength(); nProp++)
{
const SfxItemPropertySimpleEntry* pEntry = pMap->getByName(pPropertyNames[nProp]);
if (!pEntry)
throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + pPropertyNames[nProp], static_cast < cppu::OWeakObject * > ( this ) );
if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
throw beans::PropertyVetoException ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Property is read-only: " ) ) + pPropertyNames[nProp], static_cast < cppu::OWeakObject * > ( this ) );
SwUnoCursorHelper::SetPropertyValue( *pUnoCrsr, *m_pPropSet,
pPropertyNames[nProp], pValues[nProp]);
}
}
}
void SwXTextPortion::setPropertyValues(
const uno::Sequence< OUString >& rPropertyNames,
const uno::Sequence< uno::Any >& rValues )
throw(beans::PropertyVetoException, lang::IllegalArgumentException,
lang::WrappedTargetException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
// workaround for bad designed API
try
{
SetPropertyValues_Impl( rPropertyNames, rValues );
}
catch (beans::UnknownPropertyException &rException)
{
// wrap the original (here not allowed) exception in
// a lang::WrappedTargetException that gets thrown instead.
lang::WrappedTargetException aWExc;
aWExc.TargetException <<= rException;
throw aWExc;
}
}
/* -----------------------------02.04.01 11:44--------------------------------
---------------------------------------------------------------------------*/
uno::Sequence< uno::Any > SwXTextPortion::getPropertyValues(
const uno::Sequence< OUString >& rPropertyNames )
throw(uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
uno::Sequence< uno::Any > aValues;
// workaround for bad designed API
try
{
aValues = GetPropertyValues_Impl( rPropertyNames );
}
catch (beans::UnknownPropertyException &)
{
throw uno::RuntimeException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property exception caught" ) ), static_cast < cppu::OWeakObject * > ( this ) );
}
catch (lang::WrappedTargetException &)
{
throw uno::RuntimeException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "WrappedTargetException caught" ) ), static_cast < cppu::OWeakObject * > ( this ) );
}
return aValues;
}
/* -----------------------------29.09.03 11:44--------------------------------
---------------------------------------------------------------------------*/
/* disabled for #i46921# */
uno::Sequence< beans::SetPropertyTolerantFailed > SAL_CALL SwXTextPortion::setPropertyValuesTolerant(
const uno::Sequence< OUString >& rPropertyNames,
const uno::Sequence< uno::Any >& rValues )
throw (lang::IllegalArgumentException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
if (rPropertyNames.getLength() != rValues.getLength())
throw lang::IllegalArgumentException();
SwUnoCrsr* pUnoCrsr = this->GetCursor();
if (!pUnoCrsr)
throw uno::RuntimeException();
sal_Int32 nProps = rPropertyNames.getLength();
const OUString *pProp = rPropertyNames.getConstArray();
//sal_Int32 nVals = rValues.getLength();
const uno::Any *pValue = rValues.getConstArray();
sal_Int32 nFailed = 0;
uno::Sequence< beans::SetPropertyTolerantFailed > aFailed( nProps );
beans::SetPropertyTolerantFailed *pFailed = aFailed.getArray();
const SfxItemPropertyMap* pPropMap = m_pPropSet->getPropertyMap();
OUString sTmp;
for (sal_Int32 i = 0; i < nProps; ++i)
{
try
{
pFailed[ nFailed ].Name = pProp[i];
const SfxItemPropertySimpleEntry* pEntry = pPropMap->getByName( pProp[i] );
if (!pEntry)
pFailed[ nFailed++ ].Result = beans::TolerantPropertySetResultType::UNKNOWN_PROPERTY;
else
{
// set property value
// (compare to SwXTextPortion::setPropertyValues)
if (pEntry->nFlags & beans::PropertyAttribute::READONLY)
pFailed[ nFailed++ ].Result = beans::TolerantPropertySetResultType::PROPERTY_VETO;
else
{
SwUnoCursorHelper::SetPropertyValue(
*pUnoCrsr, *m_pPropSet, pProp[i], pValue[i] );
}
}
}
catch (beans::UnknownPropertyException &)
{
// should not occur because property was searched for before
DBG_ERROR( "unexpected exception catched" );
pFailed[ nFailed++ ].Result = beans::TolerantPropertySetResultType::UNKNOWN_PROPERTY;
}
catch (lang::IllegalArgumentException &)
{
pFailed[ nFailed++ ].Result = beans::TolerantPropertySetResultType::ILLEGAL_ARGUMENT;
}
catch (beans::PropertyVetoException &)
{
pFailed[ nFailed++ ].Result = beans::TolerantPropertySetResultType::PROPERTY_VETO;
}
catch (lang::WrappedTargetException &)
{
pFailed[ nFailed++ ].Result = beans::TolerantPropertySetResultType::WRAPPED_TARGET;
}
}
aFailed.realloc( nFailed );
return aFailed;
}
uno::Sequence< beans::GetPropertyTolerantResult > SAL_CALL SwXTextPortion::getPropertyValuesTolerant(
const uno::Sequence< OUString >& rPropertyNames )
throw (uno::RuntimeException)
{
vos::OGuard aGuard( Application::GetSolarMutex() );
uno::Sequence< beans::GetDirectPropertyTolerantResult > aTmpRes(
GetPropertyValuesTolerant_Impl( rPropertyNames, sal_False ) );
const beans::GetDirectPropertyTolerantResult *pTmpRes = aTmpRes.getConstArray();
// copy temporary result to final result type
sal_Int32 nLen = aTmpRes.getLength();
uno::Sequence< beans::GetPropertyTolerantResult > aRes( nLen );
beans::GetPropertyTolerantResult *pRes = aRes.getArray();
for (sal_Int32 i = 0; i < nLen; i++)
*pRes++ = *pTmpRes++;
return aRes;
}
uno::Sequence< beans::GetDirectPropertyTolerantResult > SAL_CALL SwXTextPortion::getDirectPropertyValuesTolerant(
const uno::Sequence< OUString >& rPropertyNames )
throw (uno::RuntimeException)
{
vos::OGuard aGuard( Application::GetSolarMutex() );
return GetPropertyValuesTolerant_Impl( rPropertyNames, sal_True );
}
uno::Sequence< beans::GetDirectPropertyTolerantResult > SAL_CALL SwXTextPortion::GetPropertyValuesTolerant_Impl(
const uno::Sequence< OUString >& rPropertyNames,
sal_Bool bDirectValuesOnly )
throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
SwUnoCrsr* pUnoCrsr = this->GetCursor();
if(!pUnoCrsr)
throw uno::RuntimeException();
sal_Int32 nProps = rPropertyNames.getLength();
const OUString *pProp = rPropertyNames.getConstArray();
SfxItemSet *pSet = 0;
const SfxItemPropertyMap* pPropMap = m_pPropSet->getPropertyMap();
uno::Sequence< beans::PropertyState > aPropertyStates =
SwUnoCursorHelper::GetPropertyStates(
*pUnoCrsr, *m_pPropSet,
rPropertyNames,
SW_PROPERTY_STATE_CALLER_SWX_TEXT_PORTION_TOLERANT );
const beans::PropertyState* pPropertyStates = aPropertyStates.getConstArray();
std::vector< beans::GetDirectPropertyTolerantResult > aResultVector;
for (sal_Int32 i = 0; i < nProps; ++i)
{
beans::GetDirectPropertyTolerantResult aResult;
try
{
aResult.Name = pProp[i];
if(pPropertyStates[i] == beans::PropertyState_MAKE_FIXED_SIZE) // property unknown?
{
if( bDirectValuesOnly )
continue;
else
aResult.Result = beans::TolerantPropertySetResultType::UNKNOWN_PROPERTY;
}
else
{
const SfxItemPropertySimpleEntry* pEntry = pPropMap->getByName( pProp[i] );
aResult.State = pPropertyStates[i];
aResult.Result = beans::TolerantPropertySetResultType::UNKNOWN_FAILURE;
//#i104499# ruby portion attributes need special handling:
if( pEntry->nWID == RES_TXTATR_CJK_RUBY &&
m_ePortionType == PORTION_RUBY_START )
{
aResult.State = beans::PropertyState_DIRECT_VALUE;
}
if (!bDirectValuesOnly || beans::PropertyState_DIRECT_VALUE == aResult.State)
{
// get property value
// (compare to SwXTextPortion::getPropertyValue(s))
GetPropertyValue( aResult.Value, *pEntry, pUnoCrsr, pSet );
aResult.Result = beans::TolerantPropertySetResultType::SUCCESS;
aResultVector.push_back( aResult );
}
}
}
catch (beans::UnknownPropertyException &)
{
// should not occur because property was searched for before
DBG_ERROR( "unexpected exception catched" );
aResult.Result = beans::TolerantPropertySetResultType::UNKNOWN_PROPERTY;
}
catch (lang::IllegalArgumentException &)
{
aResult.Result = beans::TolerantPropertySetResultType::ILLEGAL_ARGUMENT;
}
catch (beans::PropertyVetoException &)
{
aResult.Result = beans::TolerantPropertySetResultType::PROPERTY_VETO;
}
catch (lang::WrappedTargetException &)
{
aResult.Result = beans::TolerantPropertySetResultType::WRAPPED_TARGET;
}
}
delete pSet;
uno::Sequence< beans::GetDirectPropertyTolerantResult > aResult( aResultVector.size() );
std::vector< beans::GetDirectPropertyTolerantResult >::const_iterator aIt = aResultVector.begin();
beans::GetDirectPropertyTolerantResult *pResult = aResult.getArray();
for( sal_Int32 nResult = 0; nResult < aResult.getLength(); ++nResult )
{
pResult[nResult] = *aIt;
++aIt;
}
return aResult;
}
/* -----------------------------02.04.01 11:44--------------------------------
---------------------------------------------------------------------------*/
void SwXTextPortion::addPropertiesChangeListener(
const uno::Sequence< OUString >& /*aPropertyNames*/,
const uno::Reference< beans::XPropertiesChangeListener >& /*xListener*/ )
throw(uno::RuntimeException)
{}
/* -----------------------------02.04.01 11:44--------------------------------
---------------------------------------------------------------------------*/
void SwXTextPortion::removePropertiesChangeListener(
const uno::Reference< beans::XPropertiesChangeListener >& /*xListener*/ )
throw(uno::RuntimeException)
{}
/* -----------------------------02.04.01 11:44--------------------------------
---------------------------------------------------------------------------*/
void SwXTextPortion::firePropertiesChangeEvent(
const uno::Sequence< OUString >& /*aPropertyNames*/,
const uno::Reference< beans::XPropertiesChangeListener >& /*xListener*/ )
throw(uno::RuntimeException)
{}
/*-- 11.12.98 09:56:58---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextPortion::addPropertyChangeListener(
const OUString& /*PropertyName*/,
const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/)
throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
DBG_WARNING("not implemented");
}
/*-- 11.12.98 09:56:58---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextPortion::removePropertyChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
DBG_WARNING("not implemented");
}
/*-- 11.12.98 09:56:58---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextPortion::addVetoableChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
DBG_WARNING("not implemented");
}
/*-- 11.12.98 09:56:59---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextPortion::removeVetoableChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
DBG_WARNING("not implemented");
}
/*-- 08.03.99 09:41:43---------------------------------------------------
-----------------------------------------------------------------------*/
beans::PropertyState SwXTextPortion::getPropertyState(const OUString& rPropertyName)
throw( beans::UnknownPropertyException, uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
beans::PropertyState eRet = beans::PropertyState_DEFAULT_VALUE;
SwUnoCrsr* pUnoCrsr = GetCursor();
if (!pUnoCrsr)
throw uno::RuntimeException();
if (GetTextPortionType() == PORTION_RUBY_START &&
!rPropertyName.compareToAscii( RTL_CONSTASCII_STRINGPARAM("Ruby") ))
{
eRet = beans::PropertyState_DIRECT_VALUE;
}
else
{
eRet = SwUnoCursorHelper::GetPropertyState(*pUnoCrsr, *m_pPropSet,
rPropertyName);
}
return eRet;
}
/*-- 08.03.99 09:41:47---------------------------------------------------
-----------------------------------------------------------------------*/
uno::Sequence< beans::PropertyState > SwXTextPortion::getPropertyStates(
const uno::Sequence< OUString >& rPropertyNames)
throw( beans::UnknownPropertyException, uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
SwUnoCrsr* pUnoCrsr = GetCursor();
if(!pUnoCrsr)
throw uno::RuntimeException();
uno::Sequence< beans::PropertyState > aRet =
SwUnoCursorHelper::GetPropertyStates(*pUnoCrsr, *m_pPropSet,
rPropertyNames, SW_PROPERTY_STATE_CALLER_SWX_TEXT_PORTION);
if(GetTextPortionType() == PORTION_RUBY_START)
{
const OUString* pNames = rPropertyNames.getConstArray();
beans::PropertyState* pStates = aRet.getArray();
for(sal_Int32 nProp = 0; nProp < rPropertyNames.getLength();nProp++)
{
if(!pNames[nProp].compareToAscii( RTL_CONSTASCII_STRINGPARAM("Ruby") ))
pStates[nProp] = beans::PropertyState_DIRECT_VALUE;
}
}
return aRet;
}
/*-- 08.03.99 09:41:47---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextPortion::setPropertyToDefault(const OUString& rPropertyName)
throw( beans::UnknownPropertyException, uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
SwUnoCrsr* pUnoCrsr = GetCursor();
if (!pUnoCrsr)
throw uno::RuntimeException();
SwUnoCursorHelper::SetPropertyToDefault(
*pUnoCrsr, *m_pPropSet, rPropertyName);
}
/*-- 08.03.99 09:41:48---------------------------------------------------
-----------------------------------------------------------------------*/
uno::Any SwXTextPortion::getPropertyDefault(const OUString& rPropertyName)
throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
uno::Any aRet;
SwUnoCrsr* pUnoCrsr = GetCursor();
if (!pUnoCrsr)
throw uno::RuntimeException();
aRet = SwUnoCursorHelper::GetPropertyDefault(*pUnoCrsr, *m_pPropSet,
rPropertyName);
return aRet;
}
/*-- 11.12.98 09:56:59---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextPortion::attach(const uno::Reference< text::XTextRange > & /*xTextRange*/)
throw( lang::IllegalArgumentException, uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
// SwXTextPortion cannot be created at the factory therefore
// they cannot be attached
throw uno::RuntimeException();
}
/*-- 11.12.98 09:57:00---------------------------------------------------
-----------------------------------------------------------------------*/
uno::Reference< text::XTextRange > SwXTextPortion::getAnchor()
throw( uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
uno::Reference< text::XTextRange > aRet;
SwUnoCrsr* pUnoCrsr = GetCursor();
if (!pUnoCrsr)
throw uno::RuntimeException();
aRet = new SwXTextRange(*pUnoCrsr, m_xParentText);
return aRet;
}
/*-- 11.12.98 09:57:00---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextPortion::dispose()
throw( uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
SwUnoCrsr* pUnoCrsr = GetCursor();
if (!pUnoCrsr)
throw uno::RuntimeException();
setString(aEmptyStr);
pUnoCrsr->Remove(this);
}
/*-- 11.12.98 09:57:00---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextPortion::addEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
if(!GetRegisteredIn())
throw uno::RuntimeException();
m_ListenerContainer.AddListener(aListener);
}
/*-- 11.12.98 09:57:01---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextPortion::removeEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
if (!GetRegisteredIn() || !m_ListenerContainer.RemoveListener(aListener))
throw uno::RuntimeException();
}
/* -----------------24.03.99 13:30-------------------
*
* --------------------------------------------------*/
uno::Reference< container::XEnumeration > SwXTextPortion::createContentEnumeration(const OUString& /*aServiceName*/)
throw( uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
SwUnoCrsr* pUnoCrsr = GetCursor();
if(!pUnoCrsr)
throw uno::RuntimeException();
uno::Reference< container::XEnumeration > xRet =
new SwXParaFrameEnumeration(*pUnoCrsr, PARAFRAME_PORTION_CHAR,
m_pFrameFmt);
return xRet;
}
/* -----------------------------04.07.01 08:52--------------------------------
---------------------------------------------------------------------------*/
const uno::Sequence< sal_Int8 > & SwXTextPortion::getUnoTunnelId()
{
static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
return aSeq;
}
/* -----------------------------04.07.01 08:52--------------------------------
---------------------------------------------------------------------------*/
sal_Int64 SwXTextPortion::getSomething( const uno::Sequence< sal_Int8 >& rId )
throw(uno::RuntimeException)
{
if( rId.getLength() == 16
&& 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
rId.getConstArray(), 16 ) )
{
return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(this) );
}
return 0;
}
/* -----------------24.03.99 13:30-------------------
*
* --------------------------------------------------*/
uno::Sequence< OUString > SwXTextPortion::getAvailableServiceNames()
throw( uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
uno::Sequence< OUString > aRet(1);
OUString* pArray = aRet.getArray();
pArray[0] = C2U("com.sun.star.text.TextContent");
return aRet;
}
/* -----------------25.03.99 10:30-------------------
*
* --------------------------------------------------*/
OUString SwXTextPortion::getImplementationName()
throw( uno::RuntimeException )
{
return C2U("SwXTextPortion");
}
/* -----------------25.03.99 10:30-------------------
*
* --------------------------------------------------*/
sal_Bool SwXTextPortion::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
SwUnoCrsr* pUnoCrsr = GetCursor();
if(!pUnoCrsr)
throw uno::RuntimeException();
sal_Bool bRet = sal_False;
if(!rServiceName.compareToAscii("com.sun.star.text.TextPortion") ||
!rServiceName.compareToAscii("com.sun.star.style.CharacterProperties") ||
!rServiceName.compareToAscii("com.sun.star.style.CharacterPropertiesAsian") ||
!rServiceName.compareToAscii("com.sun.star.style.CharacterPropertiesComplex") ||
!rServiceName.compareToAscii("com.sun.star.style.ParagraphProperties") ||
!rServiceName.compareToAscii("com.sun.star.style.ParagraphPropertiesAsian") ||
!rServiceName.compareToAscii("com.sun.star.style.ParagraphPropertiesComplex"))
{
bRet = sal_True;
}
return bRet;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
uno::Sequence< OUString > SwXTextPortion::getSupportedServiceNames()
throw( uno::RuntimeException )
{
vos::OGuard aGuard(Application::GetSolarMutex());
SwUnoCrsr* pUnoCrsr = GetCursor();
if (!pUnoCrsr)
throw uno::RuntimeException();
uno::Sequence< OUString > aRet(7);
OUString* pArray = aRet.getArray();
pArray[0] = C2U("com.sun.star.text.TextPortion");
pArray[1] = C2U("com.sun.star.style.CharacterProperties");
pArray[2] = C2U("com.sun.star.style.CharacterPropertiesAsian");
pArray[3] = C2U("com.sun.star.style.CharacterPropertiesComplex");
pArray[4] = C2U("com.sun.star.style.ParagraphProperties");
pArray[5] = C2U("com.sun.star.style.ParagraphPropertiesAsian");
pArray[6] = C2U("com.sun.star.style.ParagraphPropertiesComplex");
return aRet;
}
/*-- 11.12.98 09:57:01---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextPortion::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
{
ClientModify(this, pOld, pNew);
if (!m_FrameDepend.GetRegisteredIn())
{
m_pFrameFmt = 0;
}
}