blob: 6a8a610da7cbb2c90e2a9817ca58eeea9b9b13f9 [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 <svx/svxids.hrc>
#include <map>
#include <com/sun/star/text/XTextSection.hpp>
#include <cmdid.h>
#include <unocrsrhelper.hxx>
#include <unofootnote.hxx>
#include <unorefmark.hxx>
#include <unostyle.hxx>
#include <unoidx.hxx>
#include <unofield.hxx>
#include <unotbl.hxx>
#include <unosett.hxx>
#include <unoframe.hxx>
#include <unocrsr.hxx>
#include <doc.hxx>
#include <IDocumentUndoRedo.hxx>
#include <IDocumentRedlineAccess.hxx>
#include <fmtftn.hxx>
#include <fmtpdsc.hxx>
#include <charfmt.hxx>
#include <pagedesc.hxx>
#include <docstyle.hxx>
#include <ndtxt.hxx>
#include <txtrfmrk.hxx>
#include <fmtfld.hxx>
#include <txtfld.hxx>
#include <docsh.hxx>
#include <section.hxx>
#include <shellio.hxx>
#include <edimp.hxx>
#include <swundo.hxx>
#include <cntfrm.hxx>
#include <pagefrm.hxx>
#include <svl/eitem.hxx>
#include <tools/urlobj.hxx>
#include <docary.hxx>
#include <swtable.hxx>
#include <tox.hxx>
#include <doctxm.hxx>
#include <fchrfmt.hxx>
#include <editeng/flstitem.hxx>
#include <vcl/metric.hxx>
#include <svtools/ctrltool.hxx>
#define _SVSTDARR_USHORTS
#define _SVSTDARR_USHORTSSORT
#include <svl/svstdarr.hxx>
#include <sfx2/docfilt.hxx>
#include <sfx2/docfile.hxx>
#include <sfx2/fcontnr.hxx>
#include <svl/stritem.hxx>
#include <com/sun/star/beans/PropertyState.hpp>
#include <SwStyleNameMapper.hxx>
#include <redline.hxx>
#include <numrule.hxx>
#include <comphelper/storagehelper.hxx>
#include <comphelper/mediadescriptor.hxx>
#include <comphelper/sequenceashashmap.hxx>
#include <com/sun/star/embed/ElementModes.hpp>
#include <com/sun/star/embed/XStorage.hpp>
// --> OD 2008-11-26 #158694#
#include <SwNodeNum.hxx>
// <--
#include <fmtmeta.hxx>
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::text;
using namespace ::com::sun::star::table;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::lang;
using ::rtl::OUString;
namespace SwUnoCursorHelper
{
uno::Reference<text::XTextContent>
GetNestedTextContent(SwTxtNode & rTextNode, xub_StrLen const nIndex,
bool const bParent)
{
// these should be unambiguous because of the dummy character
SwTxtNode::GetTxtAttrMode const eMode( (bParent)
? SwTxtNode::PARENT : SwTxtNode::EXPAND );
SwTxtAttr *const pMetaTxtAttr =
rTextNode.GetTxtAttrAt(nIndex, RES_TXTATR_META, eMode);
SwTxtAttr *const pMetaFieldTxtAttr =
rTextNode.GetTxtAttrAt(nIndex, RES_TXTATR_METAFIELD, eMode);
// which is innermost?
SwTxtAttr *const pTxtAttr = (pMetaTxtAttr)
? ((pMetaFieldTxtAttr)
? ((*pMetaFieldTxtAttr->GetStart() >
*pMetaTxtAttr->GetStart())
? pMetaFieldTxtAttr : pMetaTxtAttr)
: pMetaTxtAttr)
: pMetaFieldTxtAttr;
uno::Reference<XTextContent> xRet;
if (pTxtAttr)
{
::sw::Meta *const pMeta(
static_cast<SwFmtMeta &>(pTxtAttr->GetAttr()).GetMeta());
OSL_ASSERT(pMeta);
xRet.set(pMeta->MakeUnoObject(), uno::UNO_QUERY);
}
return xRet;
}
/* -----------------16.09.98 12:27-------------------
* Lesen spezieller Properties am Cursor
* --------------------------------------------------*/
sal_Bool getCrsrPropertyValue(
const SfxItemPropertySimpleEntry& rEntry,
SwPaM& rPam,
Any *pAny,
PropertyState& eState,
const SwTxtNode* pNode )
{
PropertyState eNewState = PropertyState_DIRECT_VALUE;
// PropertyState_DEFAULT_VALUE
// PropertyState_AMBIGUOUS_VALUE
sal_Bool bDone = sal_True;
switch(rEntry.nWID)
{
case FN_UNO_PARA_CONT_PREV_SUBTREE:
if (pAny)
{
const SwTxtNode * pTmpNode = pNode;
if (!pTmpNode)
pTmpNode = rPam.GetNode()->GetTxtNode();
bool bRet = false;
if ( pTmpNode &&
pTmpNode->GetNum() &&
pTmpNode->GetNum()->IsContinueingPreviousSubTree() )
{
bRet = true;
}
*pAny <<= bRet;
}
break;
case FN_UNO_PARA_NUM_STRING:
if (pAny)
{
const SwTxtNode * pTmpNode = pNode;
if (!pTmpNode)
pTmpNode = rPam.GetNode()->GetTxtNode();
String sRet;
if ( pTmpNode && pTmpNode->GetNum() )
{
sRet = pTmpNode->GetNumString();
}
*pAny <<= OUString(sRet);
}
break;
case RES_PARATR_OUTLINELEVEL: //#outlinelevel added by zhaojianwei
if (pAny)
{
const SwTxtNode * pTmpNode = pNode;
if (!pTmpNode)
pTmpNode = rPam.GetNode()->GetTxtNode();
sal_Int16 nRet = -1;
if ( pTmpNode )
nRet = sal::static_int_cast< sal_Int16 >( pTmpNode->GetAttrOutlineLevel() );
*pAny <<= nRet;
}
break; //<-end,zhaojianwei
case FN_UNO_PARA_CONDITIONAL_STYLE_NAME:
case FN_UNO_PARA_STYLE :
{
SwFmtColl* pFmt = 0;
if(pNode)
pFmt = FN_UNO_PARA_CONDITIONAL_STYLE_NAME == rEntry.nWID
? pNode->GetFmtColl() : &pNode->GetAnyFmtColl();
else
{
pFmt = SwUnoCursorHelper::GetCurTxtFmtColl(rPam,
FN_UNO_PARA_CONDITIONAL_STYLE_NAME == rEntry.nWID);
}
if(pFmt)
{
if( pAny )
{
String sVal;
SwStyleNameMapper::FillProgName(pFmt->GetName(), sVal, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, sal_True );
*pAny <<= OUString(sVal);
}
}
else
eNewState = PropertyState_AMBIGUOUS_VALUE;
}
break;
case FN_UNO_PAGE_STYLE :
{
String sVal;
GetCurPageStyle(rPam, sVal);
if( pAny )
*pAny <<= OUString(sVal);
if(!sVal.Len())
eNewState = PropertyState_AMBIGUOUS_VALUE;
}
break;
case FN_UNO_NUM_START_VALUE :
if( pAny )
{
sal_Int16 nValue = IsNodeNumStart(rPam, eNewState);
*pAny <<= nValue;
}
break;
case FN_UNO_NUM_LEVEL :
case FN_UNO_IS_NUMBER :
case FN_UNO_LIST_ID:
case FN_NUMBER_NEWSTART:
{
// a multi selection is not considered
const SwTxtNode* pTxtNd = rPam.GetNode()->GetTxtNode();
if ( pTxtNd && pTxtNd->IsInList() )
{
if( pAny )
{
if(rEntry.nWID == FN_UNO_NUM_LEVEL)
*pAny <<= (sal_Int16)(pTxtNd->GetActualListLevel());
else if(rEntry.nWID == FN_UNO_IS_NUMBER)
{
sal_Bool bIsNumber = pTxtNd->IsCountedInList();
pAny->setValue(&bIsNumber, ::getBooleanCppuType());
}
else if ( rEntry.nWID == FN_UNO_LIST_ID )
{
const String sListId = pTxtNd->GetListId();
*pAny <<= OUString(sListId);
}
else /*if(rEntry.nWID == UNO_NAME_PARA_IS_NUMBERING_RESTART)*/
{
sal_Bool bIsRestart = pTxtNd->IsListRestart();
pAny->setValue(&bIsRestart, ::getBooleanCppuType());
}
}
}
else
{
eNewState = PropertyState_DEFAULT_VALUE;
if( pAny )
{
// #i30838# set default values for default properties
if(rEntry.nWID == FN_UNO_NUM_LEVEL)
*pAny <<= static_cast<sal_Int16>( 0 );
else if(rEntry.nWID == FN_UNO_IS_NUMBER)
*pAny <<= false;
// --> OD 2008-07-14 #i91601#
else if ( rEntry.nWID == FN_UNO_LIST_ID )
{
*pAny <<= OUString();
}
// <--
else /*if(rEntry.nWID == UNO_NAME_PARA_IS_NUMBERING_RESTART)*/
*pAny <<= false;
}
}
//PROPERTY_MAYBEVOID!
}
break;
case FN_UNO_NUM_RULES :
if( pAny )
getNumberingProperty(rPam, eNewState, pAny);
else
{
if( !rPam.GetDoc()->GetCurrNumRule( *rPam.GetPoint() ) )
eNewState = PropertyState_DEFAULT_VALUE;
}
break;
case FN_UNO_DOCUMENT_INDEX_MARK:
{
::std::vector<SwTxtAttr *> const marks(
rPam.GetNode()->GetTxtNode()->GetTxtAttrsAt(
rPam.GetPoint()->nContent.GetIndex(), RES_TXTATR_TOXMARK));
if (marks.size())
{
if( pAny )
{ // hmm... can only return 1 here
SwTOXMark & rMark =
static_cast<SwTOXMark &>((*marks.begin())->GetAttr());
const uno::Reference< text::XDocumentIndexMark > xRef =
SwXDocumentIndexMark::CreateXDocumentIndexMark(
*rPam.GetDoc(),
*const_cast<SwTOXType*>(rMark.GetTOXType()), rMark);
(*pAny) <<= xRef;
}
}
else
//auch hier - nicht zu unterscheiden
eNewState = PropertyState_DEFAULT_VALUE;
}
break;
case FN_UNO_DOCUMENT_INDEX:
{
const SwTOXBase* pBase = rPam.GetDoc()->GetCurTOX(
*rPam.Start() );
if( pBase )
{
if( pAny )
{
const uno::Reference< text::XDocumentIndex > xRef =
SwXDocumentIndex::CreateXDocumentIndex(*rPam.GetDoc(),
*static_cast<SwTOXBaseSection const*>(pBase));
(*pAny) <<= xRef;
}
}
else
eNewState = PropertyState_DEFAULT_VALUE;
}
break;
case FN_UNO_TEXT_FIELD:
{
const SwPosition *pPos = rPam.Start();
const SwTxtNode *pTxtNd =
rPam.GetDoc()->GetNodes()[pPos->nNode.GetIndex()]->GetTxtNode();
const SwTxtAttr* pTxtAttr = (pTxtNd)
? pTxtNd->GetFldTxtAttrAt( pPos->nContent.GetIndex(), true )
: 0;
if ( pTxtAttr != NULL )
{
if( pAny )
{
SwXTextField* pField =
SwXTextField::CreateSwXTextField( *rPam.GetDoc(),pTxtAttr->GetFmtFld() );
*pAny <<= uno::Reference< XTextField >( pField );
}
}
else
eNewState = PropertyState_DEFAULT_VALUE;
}
break;
case FN_UNO_TEXT_TABLE:
case FN_UNO_CELL:
{
SwStartNode* pSttNode = rPam.GetNode()->StartOfSectionNode();
SwStartNodeType eType = pSttNode->GetStartNodeType();
if(SwTableBoxStartNode == eType)
{
if( pAny )
{
const SwTableNode* pTblNode = pSttNode->FindTableNode();
SwFrmFmt* pTableFmt = (SwFrmFmt*)pTblNode->GetTable().GetFrmFmt();
//SwTable& rTable = ((SwTableNode*)pSttNode)->GetTable();
if(FN_UNO_TEXT_TABLE == rEntry.nWID)
{
uno::Reference< XTextTable > xTable = SwXTextTables::GetObject(*pTableFmt);
pAny->setValue(&xTable, ::getCppuType((uno::Reference<XTextTable>*)0));
}
else
{
SwTableBox* pBox = pSttNode->GetTblBox();
uno::Reference< XCell > xCell = SwXCell::CreateXCell(pTableFmt, pBox);
pAny->setValue(&xCell, ::getCppuType((uno::Reference<XCell>*)0));
}
}
}
else
eNewState = PropertyState_DEFAULT_VALUE;
}
break;
case FN_UNO_TEXT_FRAME:
{
SwStartNode* pSttNode = rPam.GetNode()->StartOfSectionNode();
SwStartNodeType eType = pSttNode->GetStartNodeType();
SwFrmFmt* pFmt;
if(eType == SwFlyStartNode && 0 != (pFmt = pSttNode->GetFlyFmt()))
{
if( pAny )
{
uno::Reference< XTextFrame > xFrm = (SwXTextFrame*) SwXFrames::GetObject(*pFmt, FLYCNTTYPE_FRM);
pAny->setValue(&xFrm, ::getCppuType((uno::Reference<XTextFrame>*)0));
}
}
else
eNewState = PropertyState_DEFAULT_VALUE;
}
break;
case FN_UNO_TEXT_SECTION:
{
SwSection* pSect = rPam.GetDoc()->GetCurrSection(*rPam.GetPoint());
if(pSect)
{
if( pAny )
{
uno::Reference< XTextSection > xSect = SwXTextSections::GetObject( *pSect->GetFmt() );
pAny->setValue(&xSect, ::getCppuType((uno::Reference<XTextSection>*)0) );
}
}
else
eNewState = PropertyState_DEFAULT_VALUE;
}
break;
case FN_UNO_ENDNOTE:
case FN_UNO_FOOTNOTE:
{
SwTxtAttr *const pTxtAttr =
rPam.GetNode()->GetTxtNode()->GetTxtAttrForCharAt(
rPam.GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN);
if(pTxtAttr)
{
const SwFmtFtn& rFtn = pTxtAttr->GetFtn();
if(rFtn.IsEndNote() == (FN_UNO_ENDNOTE == rEntry.nWID))
{
if( pAny )
{
const uno::Reference< text::XFootnote > xFootnote =
SwXFootnote::CreateXFootnote(*rPam.GetDoc(), rFtn);
*pAny <<= xFootnote;
}
}
else
eNewState = PropertyState_DEFAULT_VALUE;
}
else
eNewState = PropertyState_DEFAULT_VALUE;
}
break;
case FN_UNO_REFERENCE_MARK:
{
::std::vector<SwTxtAttr *> const marks(
rPam.GetNode()->GetTxtNode()->GetTxtAttrsAt(
rPam.GetPoint()->nContent.GetIndex(), RES_TXTATR_REFMARK));
if (marks.size())
{
if( pAny )
{ // hmm... can only return 1 here
const SwFmtRefMark& rRef = (*marks.begin())->GetRefMark();
uno::Reference< XTextContent > xRef = SwXReferenceMarks::GetObject( rPam.GetDoc(), &rRef );
pAny->setValue(&xRef, ::getCppuType((uno::Reference<XTextContent>*)0));
}
}
else
eNewState = PropertyState_DEFAULT_VALUE;
}
break;
case FN_UNO_NESTED_TEXT_CONTENT:
{
uno::Reference<XTextContent> const xRet(
GetNestedTextContent(*rPam.GetNode()->GetTxtNode(),
rPam.GetPoint()->nContent.GetIndex(), false));
if (xRet.is())
{
if (pAny)
{
(*pAny) <<= xRet;
}
}
else
{
eNewState = PropertyState_DEFAULT_VALUE;
}
}
break;
case FN_UNO_CHARFMT_SEQUENCE:
{
SwTxtNode* pTxtNode;
if((pTxtNode = (SwTxtNode*)rPam.GetNode( sal_True )) == rPam.GetNode(sal_False) &&
pTxtNode->GetpSwpHints())
{
sal_uInt16 nPaMStart = rPam.GetPoint()->nContent.GetIndex();
sal_uInt16 nPaMEnd = rPam.GetMark() ? rPam.GetMark()->nContent.GetIndex() : nPaMStart;
if(nPaMStart > nPaMEnd)
{
sal_uInt16 nTmp = nPaMStart;
nPaMStart = nPaMEnd;
nPaMEnd = nTmp;
}
Sequence< ::rtl::OUString> aCharStyles;
SwpHints* pHints = pTxtNode->GetpSwpHints();
for(sal_uInt16 nAttr = 0; nAttr < pHints->GetStartCount(); nAttr++ )
{
SwTxtAttr* pAttr = pHints->GetStart( nAttr );
if(pAttr->Which() != RES_TXTATR_CHARFMT)
continue;
sal_uInt16 nAttrStart = *pAttr->GetStart();
sal_uInt16 nAttrEnd = *pAttr->GetEnd();
//check if the attribute touches the selection
if( ( nAttrEnd > nPaMStart && nAttrStart < nPaMEnd ) ||
( !nAttrStart && !nAttrEnd && !nPaMStart && !nPaMEnd ) )
{
//check for overlapping
if(nAttrStart > nPaMStart ||
nAttrEnd < nPaMEnd)
{
aCharStyles.realloc(0);
eNewState = PropertyState_AMBIGUOUS_VALUE;
break;
}
else
{
//now the attribute should start before or at the selection
//and it should end at the end of the selection or behind
DBG_ASSERT(nAttrStart <= nPaMStart && nAttrEnd >=nPaMEnd,
"attribute overlaps or is outside");
//now the name of the style has to be added to the sequence
aCharStyles.realloc(aCharStyles.getLength() + 1);
DBG_ASSERT(pAttr->GetCharFmt().GetCharFmt(), "no character format set");
aCharStyles.getArray()[aCharStyles.getLength() - 1] =
SwStyleNameMapper::GetProgName(
pAttr->GetCharFmt().GetCharFmt()->GetName(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT);
}
}
}
eNewState =
aCharStyles.getLength() ?
PropertyState_DIRECT_VALUE : PropertyState_DEFAULT_VALUE;;
if(pAny)
(*pAny) <<= aCharStyles;
}
else
eNewState = PropertyState_DEFAULT_VALUE;
}
break;
case RES_TXTATR_CHARFMT:
// kein break hier!
default: bDone = sal_False;
}
if( bDone )
eState = eNewState;
return bDone;
};
/* -----------------30.06.98 10:30-------------------
*
* --------------------------------------------------*/
sal_Int16 IsNodeNumStart(SwPaM& rPam, PropertyState& eState)
{
const SwTxtNode* pTxtNd = rPam.GetNode()->GetTxtNode();
// --> OD 2008-02-28 #refactorlists#
// correction: check, if restart value is set at the text node and use
// new method <SwTxtNode::GetAttrListRestartValue()> to retrieve the value
if ( pTxtNd && pTxtNd->GetNumRule() && pTxtNd->IsListRestart() &&
pTxtNd->HasAttrListRestartValue() )
{
eState = PropertyState_DIRECT_VALUE;
sal_Int16 nTmp = sal::static_int_cast< sal_Int16 >(pTxtNd->GetAttrListRestartValue());
return nTmp;
}
// <--
eState = PropertyState_DEFAULT_VALUE;
return -1;
}
/* -----------------25.05.98 11:41-------------------
*
* --------------------------------------------------*/
void setNumberingProperty(const Any& rValue, SwPaM& rPam)
{
uno::Reference<XIndexReplace> xIndexReplace;
if(rValue >>= xIndexReplace)
{
SwXNumberingRules* pSwNum = 0;
uno::Reference<XUnoTunnel> xNumTunnel(xIndexReplace, UNO_QUERY);
if(xNumTunnel.is())
{
pSwNum = reinterpret_cast< SwXNumberingRules * >(
sal::static_int_cast< sal_IntPtr >( xNumTunnel->getSomething( SwXNumberingRules::getUnoTunnelId() )));
}
if(pSwNum)
{
SwDoc* pDoc = rPam.GetDoc();
if(pSwNum->GetNumRule())
{
SwNumRule aRule(*pSwNum->GetNumRule());
const String* pNewCharStyles = pSwNum->GetNewCharStyleNames();
const String* pBulletFontNames = pSwNum->GetBulletFontNames();
for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
{
SwNumFmt aFmt(aRule.Get( i ));
if( pNewCharStyles[i].Len() &&
pNewCharStyles[i] != SwXNumberingRules::GetInvalidStyle() &&
(!aFmt.GetCharFmt() || pNewCharStyles[i] != aFmt.GetCharFmt()->GetName()))
{
if(!pNewCharStyles[i].Len())
aFmt.SetCharFmt(0);
else
{
// CharStyle besorgen und an der Rule setzen
sal_uInt16 nChCount = pDoc->GetCharFmts()->Count();
SwCharFmt* pCharFmt = 0;
for(sal_uInt16 nCharFmt = 0; nCharFmt < nChCount; nCharFmt++)
{
SwCharFmt& rChFmt = *((*(pDoc->GetCharFmts()))[nCharFmt]);;
if(rChFmt.GetName() == pNewCharStyles[i])
{
pCharFmt = &rChFmt;
break;
}
}
if(!pCharFmt)
{
SfxStyleSheetBasePool* pPool = pDoc->GetDocShell()->GetStyleSheetPool();
SfxStyleSheetBase* pBase;
pBase = pPool->Find(pNewCharStyles[i], SFX_STYLE_FAMILY_CHAR);
// soll das wirklich erzeugt werden?
if(!pBase)
pBase = &pPool->Make(pNewCharStyles[i], SFX_STYLE_FAMILY_PAGE);
pCharFmt = ((SwDocStyleSheet*)pBase)->GetCharFmt();
}
if(pCharFmt)
aFmt.SetCharFmt(pCharFmt);
}
}
//jetzt nochmal fuer Fonts
if(
pBulletFontNames[i] != SwXNumberingRules::GetInvalidStyle() &&
(
(pBulletFontNames[i].Len() && !aFmt.GetBulletFont()) ||
(pBulletFontNames[i].Len() &&
aFmt.GetBulletFont()->GetName() != pBulletFontNames[i])
)
)
{
const SvxFontListItem* pFontListItem =
(const SvxFontListItem* )pDoc->GetDocShell()
->GetItem( SID_ATTR_CHAR_FONTLIST );
const FontList* pList = pFontListItem->GetFontList();
FontInfo aInfo = pList->Get(
pBulletFontNames[i],WEIGHT_NORMAL, ITALIC_NONE);
Font aFont(aInfo);
aFmt.SetBulletFont(&aFont);
}
aRule.Set( i, aFmt );
}
UnoActionContext aAction(pDoc);
if( rPam.GetNext() != &rPam ) // Mehrfachselektion ?
{
pDoc->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
SwPamRanges aRangeArr( rPam );
SwPaM aPam( *rPam.GetPoint() );
for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
{
// --> OD 2008-03-17 #refactorlists#
// no start of a new list
pDoc->SetNumRule( aRangeArr.SetPam( n, aPam ), aRule, false );
// <--
}
pDoc->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
}
else
{
// --> OD 2008-03-17 #refactorlists#
// no start of a new list
pDoc->SetNumRule( rPam, aRule, false );
// <--
}
}
else if(pSwNum->GetCreatedNumRuleName().Len())
{
UnoActionContext aAction(pDoc);
SwNumRule* pRule = pDoc->FindNumRulePtr( pSwNum->GetCreatedNumRuleName() );
if(!pRule)
throw RuntimeException();
// --> OD 2008-03-17 #refactorlists#
// no start of a new list
pDoc->SetNumRule( rPam, *pRule, false );
// <--
}
// --> OD 2009-08-18 #i103817#
// outline numbering
else
{
UnoActionContext aAction(pDoc);
SwNumRule* pRule = pDoc->GetOutlineNumRule();
if(!pRule)
throw RuntimeException();
pDoc->SetNumRule( rPam, *pRule, false );
}
// <--
}
}
else if(rValue.getValueType() == ::getVoidCppuType())
{
rPam.GetDoc()->DelNumRules(rPam);
}
}
/* -----------------25.05.98 11:40-------------------
*
* --------------------------------------------------*/
void getNumberingProperty(SwPaM& rPam, PropertyState& eState, Any * pAny )
{
const SwNumRule* pNumRule = rPam.GetDoc()->GetCurrNumRule( *rPam.GetPoint() );
if(pNumRule)
{
uno::Reference< XIndexReplace > xNum = new SwXNumberingRules(*pNumRule);
if ( pAny )
pAny->setValue(&xNum, ::getCppuType((const uno::Reference<XIndexReplace>*)0));
eState = PropertyState_DIRECT_VALUE;
}
else
eState = PropertyState_DEFAULT_VALUE;
}
/* -----------------04.07.98 15:15-------------------
*
* --------------------------------------------------*/
void GetCurPageStyle(SwPaM& rPaM, String &rString)
{
const SwPageFrm* pPage = rPaM.GetCntntNode()->getLayoutFrm(rPaM.GetDoc()->GetCurrentLayout())->FindPageFrm();
if(pPage)
SwStyleNameMapper::FillProgName( pPage->GetPageDesc()->GetName(), rString, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC, sal_True );
}
/* -----------------30.03.99 10:52-------------------
* spezielle Properties am Cursor zuruecksetzen
* --------------------------------------------------*/
void resetCrsrPropertyValue(const SfxItemPropertySimpleEntry& rEntry, SwPaM& rPam)
{
SwDoc* pDoc = rPam.GetDoc();
switch(rEntry.nWID)
{
case FN_UNO_PARA_STYLE :
// lcl_SetTxtFmtColl(aValue, pUnoCrsr);
break;
case FN_UNO_PAGE_STYLE :
break;
case FN_UNO_NUM_START_VALUE :
{
UnoActionContext aAction(pDoc);
if( rPam.GetNext() != &rPam ) // Mehrfachselektion ?
{
pDoc->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
SwPamRanges aRangeArr( rPam );
SwPaM aPam( *rPam.GetPoint() );
for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
pDoc->SetNodeNumStart( *aRangeArr.SetPam( n, aPam ).GetPoint(), 1 );
pDoc->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
}
else
pDoc->SetNodeNumStart( *rPam.GetPoint(), 0 );
}
break;
case FN_UNO_NUM_LEVEL :
break;
case FN_UNO_NUM_RULES:
// lcl_setNumberingProperty(aValue, pUnoCrsr);
break;
case FN_UNO_CHARFMT_SEQUENCE:
{
SvUShortsSort aWhichIds;
aWhichIds.Insert(RES_TXTATR_CHARFMT);
pDoc->ResetAttrs(rPam, sal_True, &aWhichIds);
}
break;
}
}
/* -----------------21.07.98 11:36-------------------
*
* --------------------------------------------------*/
void InsertFile(SwUnoCrsr* pUnoCrsr,
const String& rURL,
const uno::Sequence< beans::PropertyValue >& rOptions
) throw( lang::IllegalArgumentException, io::IOException, uno::RuntimeException )
{
SfxMedium* pMed = 0;
SwDoc* pDoc = pUnoCrsr->GetDoc();
SwDocShell* pDocSh = pDoc->GetDocShell();
comphelper::MediaDescriptor aMediaDescriptor( rOptions );
::rtl::OUString sFileName = rURL;
::rtl::OUString sFilterName, sFilterOptions, sPassword, sBaseURL;
uno::Reference < io::XStream > xStream;
uno::Reference < io::XInputStream > xInputStream;
if( !sFileName.getLength() )
aMediaDescriptor[comphelper::MediaDescriptor::PROP_URL()] >>= sFileName;
if( !sFileName.getLength() )
aMediaDescriptor[comphelper::MediaDescriptor::PROP_FILENAME()] >>= sFileName;
aMediaDescriptor[comphelper::MediaDescriptor::PROP_INPUTSTREAM()] >>= xInputStream;
aMediaDescriptor[comphelper::MediaDescriptor::PROP_STREAM()] >>= xStream;
aMediaDescriptor[comphelper::MediaDescriptor::PROP_INPUTSTREAM()] >>= xInputStream;
aMediaDescriptor[comphelper::MediaDescriptor::PROP_FILTERNAME()] >>= sFilterName;
aMediaDescriptor[comphelper::MediaDescriptor::PROP_FILTEROPTIONS()] >>= sFilterOptions;
aMediaDescriptor[comphelper::MediaDescriptor::PROP_PASSWORD()] >>= sPassword;
aMediaDescriptor[comphelper::MediaDescriptor::PROP_DOCUMENTBASEURL() ] >>= sBaseURL;
if ( !xInputStream.is() && xStream.is() )
xInputStream = xStream->getInputStream();
if(!pDocSh || (!sFileName.getLength() && !xInputStream.is()))
return;
SfxObjectFactory& rFact = pDocSh->GetFactory();
const SfxFilter* pFilter = rFact.GetFilterContainer()->GetFilter4FilterName( sFilterName );
uno::Reference < embed::XStorage > xReadStorage;
if( xInputStream.is() )
{
uno::Sequence< uno::Any > aArgs( 2 );
aArgs[0] <<= xInputStream;
aArgs[1] <<= embed::ElementModes::READ;
try
{
xReadStorage = uno::Reference< embed::XStorage >(
::comphelper::OStorageHelper::GetStorageFactory()->createInstanceWithArguments( aArgs ),
uno::UNO_QUERY );
}
catch( const io::IOException& rEx)
{
(void)rEx;
}
}
if ( !pFilter )
{
if( xInputStream.is() && !xReadStorage.is())
{
pMed = new SfxMedium;
pMed->setStreamToLoadFrom(xInputStream, sal_True );
}
else
pMed = xReadStorage.is() ?
new SfxMedium(xReadStorage, sBaseURL, 0 ) :
new SfxMedium(sFileName, STREAM_READ, sal_True, 0, 0 );
if( sBaseURL.getLength() )
pMed->GetItemSet()->Put( SfxStringItem( SID_DOC_BASEURL, sBaseURL ) );
SfxFilterMatcher aMatcher( rFact.GetFilterContainer()->GetName() );
ErrCode nErr = aMatcher.GuessFilter( *pMed, &pFilter, sal_False );
if ( nErr || !pFilter)
DELETEZ(pMed);
else
pMed->SetFilter( pFilter );
}
else
{
if(!pMed)
{
if( xInputStream.is() && !xReadStorage.is())
{
pMed = new SfxMedium;
pMed->setStreamToLoadFrom(xInputStream, sal_True );
pMed->SetFilter( pFilter );
}
else
{
if( xReadStorage.is() )
{
pMed = new SfxMedium(xReadStorage, sBaseURL, 0 );
pMed->SetFilter( pFilter );
}
else
pMed = new SfxMedium(sFileName, STREAM_READ, sal_True, pFilter, 0);
}
}
if(sFilterOptions.getLength())
pMed->GetItemSet()->Put( SfxStringItem( SID_FILE_FILTEROPTIONS, sFilterOptions ) );
if( sBaseURL.getLength())
pMed->GetItemSet()->Put( SfxStringItem( SID_DOC_BASEURL, sBaseURL ) );
}
if( !pMed )
return;
// this sourcecode is not responsible for the lifetime of the shell, SfxObjectShellLock should not be used
SfxObjectShellRef aRef( pDocSh );
pDocSh->RegisterTransfer( *pMed );
pMed->DownLoad(); // ggfs. den DownLoad anstossen
if( aRef.Is() && 1 < aRef->GetRefCount() ) // noch gueltige Ref?
{
SwReader* pRdr;
SfxItemSet* pSet = pMed->GetItemSet();
pSet->Put(SfxBoolItem(FN_API_CALL, sal_True));
if(sPassword.getLength())
pSet->Put(SfxStringItem(SID_PASSWORD, sPassword));
Reader *pRead = pDocSh->StartConvertFrom( *pMed, &pRdr, 0, pUnoCrsr);
if( pRead )
{
UnoActionContext aContext(pDoc);
if(pUnoCrsr->HasMark())
pDoc->DeleteAndJoin(*pUnoCrsr);
SwNodeIndex aSave( pUnoCrsr->GetPoint()->nNode, -1 );
xub_StrLen nCntnt = pUnoCrsr->GetPoint()->nContent.GetIndex();
sal_uInt32 nErrno = pRdr->Read( *pRead ); // und Dokument einfuegen
if(!nErrno)
{
aSave++;
pUnoCrsr->SetMark();
pUnoCrsr->GetMark()->nNode = aSave;
SwCntntNode* pCntNode = aSave.GetNode().GetCntntNode();
if( !pCntNode )
nCntnt = 0;
pUnoCrsr->GetMark()->nContent.Assign( pCntNode, nCntnt );
}
delete pRdr;
// ggfs. alle Verzeichnisse updaten:
/* if( pWrtShell->IsUpdateTOX() )
{
SfxRequest aReq( *this, FN_UPDATE_TOX );
Execute( aReq );
pWrtShell->SetUpdateTOX( sal_False ); // wieder zurueck setzen
}*/
}
}
delete pMed;
}
/* -----------------14.07.04 ------------------------
*
* --------------------------------------------------*/
// insert text and scan for CR characters in order to insert
// paragraph breaks at those positions by calling SplitNode
sal_Bool DocInsertStringSplitCR(
SwDoc &rDoc,
const SwPaM &rNewCursor, const String &rText,
const bool bForceExpandHints )
{
sal_Bool bOK = sal_True;
const enum IDocumentContentOperations::InsertFlags nInsertFlags =
(bForceExpandHints)
? static_cast<IDocumentContentOperations::InsertFlags>(
IDocumentContentOperations::INS_FORCEHINTEXPAND |
IDocumentContentOperations::INS_EMPTYEXPAND)
: IDocumentContentOperations::INS_EMPTYEXPAND;
// grouping done in InsertString is intended for typing, not API calls
::sw::GroupUndoGuard const undoGuard(rDoc.GetIDocumentUndoRedo());
OUString aTxt;
xub_StrLen nStartIdx = 0;
SwTxtNode* const pTxtNd =
rNewCursor.GetPoint()->nNode.GetNode().GetTxtNode();
const xub_StrLen nMaxLength = ( pTxtNd )
? STRING_LEN - pTxtNd->GetTxt().Len()
: STRING_LEN;
xub_StrLen nIdx = rText.Search( '\r', nStartIdx );
if( ( nIdx == STRING_NOTFOUND && nMaxLength < rText.Len() ) ||
( nIdx != STRING_NOTFOUND && nMaxLength < nIdx ) )
{
nIdx = nMaxLength;
}
while (nIdx != STRING_NOTFOUND )
{
DBG_ASSERT( nIdx - nStartIdx >= 0, "index negative!" );
aTxt = rText.Copy( nStartIdx, nIdx - nStartIdx );
if (aTxt.getLength() &&
!rDoc.InsertString( rNewCursor, aTxt, nInsertFlags ))
{
DBG_ERROR( "Doc->Insert(Str) failed." );
bOK = sal_False;
}
if (!rDoc.SplitNode( *rNewCursor.GetPoint(), false ) )
{
DBG_ERROR( "SplitNode failed" );
bOK = sal_False;
}
nStartIdx = nIdx + 1;
nIdx = rText.Search( '\r', nStartIdx );
}
aTxt = rText.Copy( nStartIdx );
if (aTxt.getLength() &&
!rDoc.InsertString( rNewCursor, aTxt, nInsertFlags ))
{
DBG_ERROR( "Doc->Insert(Str) failed." );
bOK = sal_False;
}
return bOK;
}
/*-- 10.03.2008 09:58:47---------------------------------------------------
-----------------------------------------------------------------------*/
void makeRedline( SwPaM& rPaM,
const ::rtl::OUString& rRedlineType,
const uno::Sequence< beans::PropertyValue >& rRedlineProperties )
throw (lang::IllegalArgumentException, uno::RuntimeException)
{
IDocumentRedlineAccess* pRedlineAccess = rPaM.GetDoc();
RedlineType_t eType = nsRedlineType_t::REDLINE_INSERT;
if( rRedlineType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "Delete" ) ))
eType = nsRedlineType_t::REDLINE_DELETE;
else if( rRedlineType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "Format" ) ))
eType = nsRedlineType_t::REDLINE_FORMAT;
else if( rRedlineType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "TextTable" ) ))
eType = nsRedlineType_t::REDLINE_TABLE;
else if( !rRedlineType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "Insert" ) ))
throw lang::IllegalArgumentException();
//todo: what about REDLINE_FMTCOLL?
comphelper::SequenceAsHashMap aPropMap( rRedlineProperties );
uno::Any aAuthorValue;
aAuthorValue = aPropMap.getUnpackedValueOrDefault( ::rtl::OUString::createFromAscii("RedlineAuthor"), aAuthorValue);
sal_uInt16 nAuthor = 0;
::rtl::OUString sAuthor;
if( aAuthorValue >>= sAuthor )
nAuthor = pRedlineAccess->InsertRedlineAuthor(sAuthor);
::rtl::OUString sComment;
uno::Any aCommentValue;
aCommentValue = aPropMap.getUnpackedValueOrDefault( ::rtl::OUString::createFromAscii("RedlineComment"), aCommentValue);
SwRedlineData aRedlineData( eType, nAuthor );
if( aCommentValue >>= sComment )
aRedlineData.SetComment( sComment );
::util::DateTime aStamp;
uno::Any aDateTimeValue;
aDateTimeValue = aPropMap.getUnpackedValueOrDefault( ::rtl::OUString::createFromAscii("RedlineDateTime"), aDateTimeValue);
if( aDateTimeValue >>= aStamp )
{
aRedlineData.SetTimeStamp(
DateTime( Date( aStamp.Day, aStamp.Month, aStamp.Year ), Time( aStamp.Hours, aStamp.Minutes, aStamp.Seconds ) ) );
}
SwRedline* pRedline = new SwRedline( aRedlineData, rPaM );
RedlineMode_t nPrevMode = pRedlineAccess->GetRedlineMode( );
pRedlineAccess->SetRedlineMode_intern(nsRedlineMode_t::REDLINE_ON);
bool bRet = pRedlineAccess->AppendRedline( pRedline, false );
pRedlineAccess->SetRedlineMode_intern( nPrevMode );
if( !bRet )
throw lang::IllegalArgumentException();
}
/*-- 19.02.2009 09:27:26---------------------------------------------------
-----------------------------------------------------------------------*/
SwAnyMapHelper::~SwAnyMapHelper()
{
AnyMapHelper_t::iterator aIt = begin();
while( aIt != end() )
{
delete ( aIt->second );
++aIt;
}
}
/*-- 19.02.2009 09:27:26---------------------------------------------------
-----------------------------------------------------------------------*/
void SwAnyMapHelper::SetValue( sal_uInt16 nWhichId, sal_uInt16 nMemberId, const uno::Any& rAny )
{
sal_uInt32 nKey = (nWhichId << 16) + nMemberId;
AnyMapHelper_t::iterator aIt = find( nKey );
if( aIt != end() )
{
*(aIt->second) = rAny;
}
else
insert( value_type(nKey, new uno::Any( rAny )) );
}
/*-- 19.02.2009 09:27:26---------------------------------------------------
-----------------------------------------------------------------------*/
bool SwAnyMapHelper::FillValue( sal_uInt16 nWhichId, sal_uInt16 nMemberId, const uno::Any*& pAny )
{
bool bRet = false;
sal_uInt32 nKey = (nWhichId << 16) + nMemberId;
AnyMapHelper_t::iterator aIt = find( nKey );
if( aIt != end() )
{
pAny = aIt->second;
bRet = true;
}
return bRet;
}
}//namespace SwUnoCursorHelper