/************************************************************** * * 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" /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ #include #include # include "writerhelper.hxx" # include #include #include #include //std::swap #include //std::binary_function # include //SfxItemIter # include //SdrObject # include //SdrOle2Obj # include //FmFormInventor # include //SvxFmtBreakItem # include //SvxTabStopItem # include //SwTxtNode # include //SwNoTxtNode # include //SwFmtCntnt # include //SwTable # include //SwFrmFmt # include //SwPosFlyFrms # include //SwFmtAnchor # include //SwGrfNode # include //SwFmtFrmSize # include //SwStyleNameMapper # include //SwCharFmts # include //SwCharFmt # include //SwFmtCharFmt #ifndef _UNOTOOLS_STREAMWRAP_HXX # include #endif #include #ifndef _SV_SVAPP_HXX #include //For i120928 #endif #ifdef DEBUGDUMP # include # ifndef _TOOLS_URLOBJ_HXX # include # endif # ifndef _UNOTOOLS_UCBSTREAMHELPER_HXX # include # endif # include #endif using namespace com::sun::star; using namespace nsSwGetPoolIdFromName; namespace { /* Stroustroup forgets copy_if, See C++ Programming language Chp 18, pg 530 */ template Out my_copy_if(In first, In last, Out res, Pred p) { while (first != last) { if (p(*first)) *res = *first; ++first; } return res; } // --> OD 2009-02-04 #i98791# - adjust sorting //Utility to sort SwTxtFmtColl's by their assigned outline style list level class outlinecmp : public std::binary_function { public: bool operator()(const SwTxtFmtColl *pA, const SwTxtFmtColl *pB) const { // --> OD 2009-02-04 #i98791# // return pA->GetAttrOutlineLevel() < pB->GetAttrOutlineLevel(); //<-end,zhaojianwei bool bResult( false ); const bool bIsAAssignedToOutlineStyle( pA->IsAssignedToListLevelOfOutlineStyle() ); const bool bIsBAssignedToOutlineStyle( pB->IsAssignedToListLevelOfOutlineStyle() ); if ( bIsAAssignedToOutlineStyle != bIsBAssignedToOutlineStyle ) { bResult = bIsBAssignedToOutlineStyle; } else if ( !bIsAAssignedToOutlineStyle ) { // pA and pB are equal regarding the sorting criteria. // Thus return value does not matter. bResult = false; } else { bResult = pA->GetAssignedOutlineStyleLevel() < pB->GetAssignedOutlineStyleLevel(); } return bResult; // <-- } }; // <-- bool IsValidSlotWhich(sal_uInt16 nSlotId, sal_uInt16 nWhichId) { return (nSlotId != 0 && nWhichId != 0 && nSlotId != nWhichId); } /* Utility to convert a SwPosFlyFrms into a simple vector of sw::Frames The crucial thing is that a sw::Frame always has an anchor which points to some content in the document. This is a requirement of exporting to Word */ sw::Frames SwPosFlyFrmsToFrames(const SwPosFlyFrms &rFlys) { sw::Frames aRet; for(SwPosFlyFrms::const_iterator aIter(rFlys.begin()); aIter != rFlys.end(); aIter++) { const SwFrmFmt &rEntry = (*aIter)->GetFmt(); if (const SwPosition* pAnchor = rEntry.GetAnchor().GetCntntAnchor()) { aRet.push_back(sw::Frame(rEntry, *pAnchor)); } else { SwPosition aPos((*aIter)->GetNdIndex()); if (SwTxtNode* pTxtNd = aPos.nNode.GetNode().GetTxtNode()) { aPos.nContent.Assign(pTxtNd, 0); } aRet.push_back(sw::Frame(rEntry, aPos)); } } return aRet; } //Utility to test if a frame is anchored at a given node index class anchoredto: public std::unary_function { private: sal_uLong mnNode; public: anchoredto(sal_uLong nNode) : mnNode(nNode) {} bool operator()(const sw::Frame &rFrame) const { return (mnNode == rFrame.GetPosition().nNode.GetNode().GetIndex()); } }; } namespace sw { //For i120928,size conversion before exporting graphic of bullet Frame::Frame(const Graphic&rGrf, const SwPosition &rPos) :mpFlyFrm(NULL), maPos(rPos), maSize(), maLayoutSize(), meWriterType(eBulletGrf), mpStartFrameContent(0), mbIsInline(true), mbForBullet(true), maGrf(rGrf) { const MapMode aMap100mm( MAP_100TH_MM ); Size aSize( rGrf.GetPrefSize() ); if ( MAP_PIXEL == rGrf.GetPrefMapMode().GetMapUnit() ) { aSize = Application::GetDefaultDevice()->PixelToLogic(aSize, aMap100mm ); } else { aSize = OutputDevice::LogicToLogic( aSize,rGrf.GetPrefMapMode(), aMap100mm ); } maSize = aSize; maLayoutSize = maSize; } Frame::Frame(const SwFrmFmt &rFmt, const SwPosition &rPos) : mpFlyFrm(&rFmt), maPos(rPos), maSize(), // --> OD 2007-04-19 #i43447# maLayoutSize(), // <-- meWriterType(eTxtBox), mpStartFrameContent(0), // --> OD 2007-04-19 #i43447# - move to initialization list mbIsInline( (rFmt.GetAnchor().GetAnchorId() == FLY_AS_CHAR) ) // <-- //For i120928,handle graphic of bullet within existing implementation ,mbForBullet(false) ,maGrf() { switch (rFmt.Which()) { case RES_FLYFRMFMT: if (const SwNodeIndex* pIdx = rFmt.GetCntnt().GetCntntIdx()) { SwNodeIndex aIdx(*pIdx, 1); const SwNode &rNd = aIdx.GetNode(); using sw::util::GetSwappedInSize; // --> OD 2007-04-19 #i43447# - determine layout size { SwRect aLayRect( rFmt.FindLayoutRect() ); Rectangle aRect( aLayRect.SVRect() ); // The Object is not rendered (e.g. something in unused // header/footer) - thus, get the values from the format. if ( aLayRect.IsEmpty() ) { aRect.SetSize( rFmt.GetFrmSize().GetSize() ); } maLayoutSize = aRect.GetSize(); } // <-- switch (rNd.GetNodeType()) { case ND_GRFNODE: meWriterType = eGraphic; maSize = GetSwappedInSize(*rNd.GetNoTxtNode()); break; case ND_OLENODE: meWriterType = eOle; maSize = GetSwappedInSize(*rNd.GetNoTxtNode()); break; default: meWriterType = eTxtBox; // --> OD 2007-04-19 #i43447# // Size equals layout size for text boxes maSize = maLayoutSize; // <-- break; } mpStartFrameContent = &rNd; } else { ASSERT(sal_False, "Impossible"); meWriterType = eTxtBox; } break; default: if (const SdrObject* pObj = rFmt.FindRealSdrObject()) { if (pObj->GetObjInventor() == FmFormInventor) meWriterType = eFormControl; else meWriterType = eDrawing; maSize = pObj->GetSnapRect().GetSize(); } else { ASSERT(sal_False, "Impossible"); meWriterType = eDrawing; } break; } } bool Frame::IsInline() const { return mbIsInline; } void Frame::ForceTreatAsInline() { mbIsInline = true; } namespace hack { sal_uInt16 TransformWhichBetweenPools(const SfxItemPool &rDestPool, const SfxItemPool &rSrcPool, sal_uInt16 nWhich) { sal_uInt16 nSlotId = rSrcPool.GetSlotId(nWhich); if (IsValidSlotWhich(nSlotId, nWhich)) nWhich = rDestPool.GetWhich(nSlotId); else nWhich = 0; return nWhich; } sal_uInt16 GetSetWhichFromSwDocWhich(const SfxItemSet &rSet, const SwDoc &rDoc, sal_uInt16 nWhich) { if (RES_WHICHHINT_END < *(rSet.GetRanges())) { nWhich = TransformWhichBetweenPools(*rSet.GetPool(), rDoc.GetAttrPool(), nWhich); } return nWhich; } DrawingOLEAdaptor::DrawingOLEAdaptor(SdrOle2Obj &rObj, SfxObjectShell &rPers) : msOrigPersistName(rObj.GetPersistName()), mxIPRef(rObj.GetObjRef()), mrPers(rPers), mpGraphic( rObj.GetGraphic() ) { //rObj.SetPersistName(String()); //rObj.SetObjRef(0); rObj.AbandonObject(); } bool DrawingOLEAdaptor::TransferToDoc( ::rtl::OUString &rName ) { ASSERT(mxIPRef.is(), "Transferring invalid object to doc"); if (!mxIPRef.is()) return false; uno::Reference < container::XChild > xChild( mxIPRef, uno::UNO_QUERY ); if ( xChild.is() ) xChild->setParent( mrPers.GetModel() ); bool bSuccess = mrPers.GetEmbeddedObjectContainer().InsertEmbeddedObject( mxIPRef, rName ); if (bSuccess) { if ( mpGraphic ) ::svt::EmbeddedObjectRef::SetGraphicToContainer( *mpGraphic, mrPers.GetEmbeddedObjectContainer(), rName, ::rtl::OUString() ); //mxIPRef->changeState( embed::EmbedStates::LOADED ); mxIPRef = 0; } return bSuccess; } DrawingOLEAdaptor::~DrawingOLEAdaptor() { if (mxIPRef.is()) { DBG_ASSERT( !mrPers.GetEmbeddedObjectContainer().HasEmbeddedObject( mxIPRef ), "Object in adaptor is inserted?!" ); try { uno::Reference < com::sun::star::util::XCloseable > xClose( mxIPRef, uno::UNO_QUERY ); if ( xClose.is() ) xClose->close(sal_True); } catch ( com::sun::star::util::CloseVetoException& ) { } mxIPRef = 0; } } #ifdef DEBUGDUMP SvStream *CreateDebuggingStream(const String &rSuffix) { SvStream* pDbgOut = 0; static sal_Int32 nCount; String aFileName(String(RTL_CONSTASCII_STRINGPARAM("wwdbg"))); aFileName.Append(String::CreateFromInt32(++nCount)); aFileName.Append(rSuffix); String aURLStr; if (::utl::LocalFileHelper::ConvertPhysicalNameToURL( Application::GetAppFileName(), aURLStr)) { INetURLObject aURL(aURLStr); aURL.removeSegment(); aURL.removeFinalSlash(); aURL.Append(aFileName); pDbgOut = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL(INetURLObject::NO_DECODE), STREAM_TRUNC | STREAM_WRITE); } return pDbgOut; } void DumpStream(const SvStream &rSrc, SvStream &rDest, sal_uInt32 nLen) { SvStream &rSource = const_cast(rSrc); sal_uLong nOrigPos = rSource.Tell(); if (nLen == STREAM_SEEK_TO_END) { rSource.Seek(STREAM_SEEK_TO_END); nLen = rSource.Tell(); } if (nLen - nOrigPos) { rSource.Seek(nOrigPos); sal_Char* pDat = new sal_Char[nLen]; rSource.Read(pDat, nLen); rDest.Write(pDat, nLen); delete[] pDat; rSource.Seek(nOrigPos); } } #endif } namespace util { SV_IMPL_OP_PTRARR_SORT(AuthorInfos, AuthorInfo_Ptr) SwTwips MakeSafePositioningValue(SwTwips nIn) { if (nIn > SHRT_MAX) nIn = SHRT_MAX; else if (nIn < SHRT_MIN) nIn = SHRT_MIN; return nIn; } void SetLayer::SendObjectToHell(SdrObject &rObject) const { SetObjectLayer(rObject, eHell); } void SetLayer::SendObjectToHeaven(SdrObject &rObject) const { SetObjectLayer(rObject, eHeaven); } void SetLayer::SetObjectLayer(SdrObject &rObject, Layer eLayer) const { if (FmFormInventor == rObject.GetObjInventor()) rObject.SetLayer(mnFormLayer); else { switch (eLayer) { case eHeaven: rObject.SetLayer(mnHeavenLayer); break; case eHell: rObject.SetLayer(mnHellLayer); break; } } } //SetLayer boilerplate begin void SetLayer::Swap(SetLayer& rOther) throw() { std::swap(mnHeavenLayer, rOther.mnHeavenLayer); std::swap(mnHellLayer, rOther.mnHellLayer); std::swap(mnFormLayer, rOther.mnFormLayer); } // --> OD 2004-12-13 #i38889# - by default put objects into the invisible // layers. SetLayer::SetLayer(const SwDoc &rDoc) : mnHeavenLayer(rDoc.GetInvisibleHeavenId()), mnHellLayer(rDoc.GetInvisibleHellId()), mnFormLayer(rDoc.GetInvisibleControlsId()) { } // <-- SetLayer::SetLayer(const SetLayer& rOther) throw() : mnHeavenLayer(rOther.mnHeavenLayer), mnHellLayer(rOther.mnHellLayer), mnFormLayer(rOther.mnFormLayer) { } SetLayer& SetLayer::operator=(const SetLayer& rOther) throw() { SetLayer aTemp(rOther); Swap(aTemp); return *this; } //SetLayer boilerplate end void GetPoolItems(const SfxItemSet &rSet, PoolItems &rItems, bool bExportParentItemSet ) { if( bExportParentItemSet ) { sal_uInt16 nTotal = rSet.TotalCount(); for( sal_uInt16 nItem =0; nItem < nTotal; ++nItem ) { const SfxPoolItem* pItem = 0; if( SFX_ITEM_SET == rSet.GetItemState( rSet.GetWhichByPos( nItem ), true, &pItem ) ) { rItems[pItem->Which()] = pItem; } } } else if( rSet.Count()) { SfxItemIter aIter(rSet); if (const SfxPoolItem *pItem = aIter.GetCurItem()) { do rItems[pItem->Which()] = pItem; while (!aIter.IsAtEnd() && 0 != (pItem = aIter.NextItem())); } } } const SfxPoolItem *SearchPoolItems(const PoolItems &rItems, sal_uInt16 eType) { sw::cPoolItemIter aIter = rItems.find(eType); if (aIter != rItems.end()) return aIter->second; return 0; } void ClearOverridesFromSet(const SwFmtCharFmt &rFmt, SfxItemSet &rSet) { if (const SwCharFmt* pCharFmt = rFmt.GetCharFmt()) { if (pCharFmt->GetAttrSet().Count()) { SfxItemIter aIter(pCharFmt->GetAttrSet()); const SfxPoolItem *pItem = aIter.GetCurItem(); do rSet.ClearItem(pItem->Which()); while (!aIter.IsAtEnd() && 0 != (pItem = aIter.NextItem())); } } } ParaStyles GetParaStyles(const SwDoc &rDoc) { ParaStyles aStyles; typedef ParaStyles::size_type mysizet; const SwTxtFmtColls *pColls = rDoc.GetTxtFmtColls(); mysizet nCount = pColls ? pColls->Count() : 0; aStyles.reserve(nCount); for (mysizet nI = 0; nI < nCount; ++nI) aStyles.push_back((*pColls)[ static_cast< sal_uInt16 >(nI) ]); return aStyles; } SwTxtFmtColl* GetParaStyle(SwDoc &rDoc, const String& rName) { // Search first in the Doc-Styles SwTxtFmtColl* pColl = rDoc.FindTxtFmtCollByName(rName); if (!pColl) { // Collection not found, try in Pool ? sal_uInt16 n = SwStyleNameMapper::GetPoolIdFromUIName(rName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL); if (n != SAL_MAX_UINT16) // found or standard pColl = rDoc.GetTxtCollFromPool(n, false); } return pColl; } SwCharFmt* GetCharStyle(SwDoc &rDoc, const String& rName) { SwCharFmt *pFmt = rDoc.FindCharFmtByName(rName); if (!pFmt) { // Collection not found, try in Pool ? sal_uInt16 n = SwStyleNameMapper::GetPoolIdFromUIName(rName, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT); if (n != SAL_MAX_UINT16) // found or standard pFmt = rDoc.GetCharFmtFromPool(n); } return pFmt; } // --> OD 2009-02-04 #i98791# - adjust sorting algorithm void SortByAssignedOutlineStyleListLevel(ParaStyles &rStyles) { std::sort(rStyles.begin(), rStyles.end(), outlinecmp()); } // <-- /* Utility to extract flyfmts from a document, potentially from a selection. */ Frames GetFrames(const SwDoc &rDoc, SwPaM *pPaM /*, bool bAll*/) { SwPosFlyFrms aFlys(rDoc.GetAllFlyFmts(pPaM, true)); sw::Frames aRet(SwPosFlyFrmsToFrames(aFlys)); return aRet; } #if 0 Frames GetFramesBetweenNodes(const Frames &rFrames, const SwNode &rStart, const SwNode &rEnd) { Frames aRet; sal_uLong nEnd = rEnd.GetIndex(); for (sal_uLong nI = rStart.GetIndex(); nI < nEnd; ++nI) { my_copy_if(rFrames.begin(), rFrames.end(), std::back_inserter(aRet), anchoredto(nI)); } return aRet; } #endif Frames GetFramesInNode(const Frames &rFrames, const SwNode &rNode) { Frames aRet; my_copy_if(rFrames.begin(), rFrames.end(), std::back_inserter(aRet), anchoredto(rNode.GetIndex())); return aRet; } const SwNumFmt* GetNumFmtFromTxtNode(const SwTxtNode &rTxtNode) { const SwNumRule *pRule = 0; if ( rTxtNode.IsNumbered() && rTxtNode.IsCountedInList() && 0 != (pRule = rTxtNode.GetNumRule()) ) { return &(pRule->Get( static_cast< sal_uInt16 >(rTxtNode.GetActualListLevel()) )); } ASSERT(rTxtNode.GetDoc(), "No document for node?, suspicious"); if (!rTxtNode.GetDoc()) return 0; if ( rTxtNode.IsNumbered() && rTxtNode.IsCountedInList() && 0 != (pRule = rTxtNode.GetDoc()->GetOutlineNumRule()) ) { return &(pRule->Get( static_cast< sal_uInt16 >(rTxtNode.GetActualListLevel()) )); } return 0; } const SwNumRule* GetNumRuleFromTxtNode(const SwTxtNode &rTxtNode) { return GetNormalNumRuleFromTxtNode(rTxtNode); } const SwNumRule* GetNormalNumRuleFromTxtNode(const SwTxtNode &rTxtNode) { const SwNumRule *pRule = 0; if ( rTxtNode.IsNumbered() && rTxtNode.IsCountedInList() && 0 != (pRule = rTxtNode.GetNumRule()) ) { return pRule; } return 0; } SwNoTxtNode *GetNoTxtNodeFromSwFrmFmt(const SwFrmFmt &rFmt) { const SwNodeIndex *pIndex = rFmt.GetCntnt().GetCntntIdx(); ASSERT(pIndex, "No NodeIndex in SwFrmFmt ?, suspicious"); if (!pIndex) return 0; SwNodeIndex aIdx(*pIndex, 1); return aIdx.GetNode().GetNoTxtNode(); } bool HasPageBreak(const SwNode &rNd) { const SvxFmtBreakItem *pBreak = 0; if (rNd.IsTableNode() && rNd.GetTableNode()) { const SwTable& rTable = rNd.GetTableNode()->GetTable(); const SwFrmFmt* pApply = rTable.GetFrmFmt(); ASSERT(pApply, "impossible"); if (pApply) pBreak = &(ItemGet(*pApply, RES_BREAK)); } else if (const SwCntntNode *pNd = rNd.GetCntntNode()) pBreak = &(ItemGet(*pNd, RES_BREAK)); if (pBreak && pBreak->GetBreak() == SVX_BREAK_PAGE_BEFORE) return true; return false; } Polygon PolygonFromPolyPolygon(const PolyPolygon &rPolyPoly) { if(1 == rPolyPoly.Count()) { return rPolyPoly[0]; } else { // This method will now just concatenate the polygons contained // in the given PolyPolygon. Anything else which might be thought of // for reducing to a single polygon will just need nore power and // cannot create more correct results. sal_uInt32 nPointCount(0L); sal_uInt16 a; for(a = 0; a < rPolyPoly.Count(); a++) { nPointCount += (sal_uInt32)rPolyPoly[a].GetSize(); } if(nPointCount > 0x0000ffff) { DBG_ERROR("PolygonFromPolyPolygon: too many points for a single polygon (!)"); nPointCount = 0x0000ffff; } Polygon aRetval((sal_uInt16)nPointCount); sal_uInt32 nAppendIndex(0L); for(a = 0; a < rPolyPoly.Count(); a++) { const Polygon& rCandidate = rPolyPoly[a]; for(sal_uInt16 b(0); nAppendIndex <= nPointCount && b < rCandidate.GetSize(); b++) { aRetval[(sal_uInt16)nAppendIndex++] = rCandidate[b]; } } return aRetval; } } bool IsStarSymbol(const String &rFontName) { String sFamilyNm(GetFontToken(rFontName, 0)); return (sFamilyNm.EqualsIgnoreCaseAscii("starsymbol") || sFamilyNm.EqualsIgnoreCaseAscii("opensymbol")); } Size GetSwappedInSize(const SwNoTxtNode& rNd) { Size aGrTwipSz(rNd.GetTwipSize()); if ((!aGrTwipSz.Width() || !aGrTwipSz.Height())) { SwGrfNode *pGrfNode = const_cast(rNd.GetGrfNode()); if (pGrfNode && (GRAPHIC_NONE != pGrfNode->GetGrf().GetType())) { bool bWasSwappedOut = pGrfNode->GetGrfObj().IsSwappedOut(); pGrfNode->SwapIn(); aGrTwipSz = pGrfNode->GetTwipSize(); if (bWasSwappedOut) pGrfNode->SwapOut(); } } ASSERT(aGrTwipSz.Width() && aGrTwipSz.Height(), "0 x 0 graphic ?"); return aGrTwipSz; } void RedlineStack::open(const SwPosition& rPos, const SfxPoolItem& rAttr) { ASSERT(rAttr.Which() == RES_FLTR_REDLINE, "not a redline"); maStack.push_back(new SwFltStackEntry(rPos,rAttr.Clone())); } class SameOpenRedlineType : public std::unary_function { private: RedlineType_t meType; public: SameOpenRedlineType(RedlineType_t eType) : meType(eType) {} bool operator()(const SwFltStackEntry *pEntry) const { const SwFltRedline *pTest = static_cast (pEntry->pAttr); return (pEntry->bLocked && (pTest->eType == meType)); } }; bool RedlineStack::close(const SwPosition& rPos, RedlineType_t eType) { //Search from end for same type myriter aResult = std::find_if(maStack.rbegin(), maStack.rend(), SameOpenRedlineType(eType)); if (aResult != maStack.rend()) { (*aResult)->SetEndPos(rPos); return true; } return false; } void RedlineStack::closeall(const SwPosition& rPos) { std::for_each(maStack.begin(), maStack.end(), CloseIfOpen(rPos)); } void SetInDocAndDelete::operator()(SwFltStackEntry *pEntry) { SwPaM aRegion(pEntry->nMkNode); if ( pEntry->MakeRegion(&mrDoc, aRegion, true) && (*aRegion.GetPoint() != *aRegion.GetMark()) ) { mrDoc.SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE)); const SwFltRedline *pFltRedline = static_cast (pEntry->pAttr); if (USHRT_MAX != pFltRedline->nAutorNoPrev) { SwRedlineData aData(pFltRedline->eTypePrev, pFltRedline->nAutorNoPrev, pFltRedline->aStampPrev, aEmptyStr, 0); mrDoc.AppendRedline(new SwRedline(aData, aRegion), true); } SwRedlineData aData(pFltRedline->eType, pFltRedline->nAutorNo, pFltRedline->aStamp, aEmptyStr, 0); mrDoc.AppendRedline(new SwRedline(aData, aRegion), true); mrDoc.SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_NONE | nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE )); } delete pEntry; } bool CompareRedlines::operator()(const SwFltStackEntry *pOneE, const SwFltStackEntry *pTwoE) const { const SwFltRedline *pOne= static_cast (pOneE->pAttr); const SwFltRedline *pTwo= static_cast (pTwoE->pAttr); //Return the earlier time, if two have the same time, prioritize //inserts over deletes if (pOne->aStamp == pTwo->aStamp) return (pOne->eType == nsRedlineType_t::REDLINE_INSERT && pTwo->eType != nsRedlineType_t::REDLINE_INSERT); else return (pOne->aStamp < pTwo->aStamp) ? true : false; } RedlineStack::~RedlineStack() { std::sort(maStack.begin(), maStack.end(), CompareRedlines()); std::for_each(maStack.begin(), maStack.end(), SetInDocAndDelete(mrDoc)); } sal_uInt16 WrtRedlineAuthor::AddName( const String& rNm ) { sal_uInt16 nRet; typedef std::vector::iterator myiter; myiter aIter = std::find(maAuthors.begin(), maAuthors.end(), rNm); if (aIter != maAuthors.end()) nRet = static_cast< sal_uInt16 >(aIter - maAuthors.begin()); else { nRet = static_cast< sal_uInt16 >(maAuthors.size()); maAuthors.push_back(rNm); } return nRet; } /* std::vector WrtRedlineAuthor::GetNames() { return maAuthors; } */ } } /* vi:set tabstop=4 shiftwidth=4 expandtab: */