Related: #i78498# improvements/corrections regarding outline level & Co
- import outline level attribute at Paragraph Styles - import outline level attribute at paragraphs - refactor code to apply list level properties to Outline Style -- only consider WW8 list styles applied to WW8 Built-in Heading Styles -- only assign our counterparts of WW8 Built-in Heading Styles to Outline Style (cherry picked from commit 9032e17b9989d4fc8faefe7717d2ea14d124e653) (cherry picked from commit c3a35e3885334cb37b2b569daaf536a8cc26031d) Conflicts: sw/source/filter/rtf/swparrtf.cxx sw/source/filter/ww8/ww8par.cxx sw/source/filter/ww8/ww8par.hxx sw/source/filter/ww8/ww8par2.cxx sw/source/filter/ww8/ww8par2.hxx sw/source/filter/ww8/ww8par3.cxx sw/source/filter/ww8/ww8par5.cxx sw/source/filter/ww8/ww8par6.cxx sw/source/filter/xml/swxml.cxx Change-Id: Ia70920f91300fa47236533f59356abb546a94fb3
This commit is contained in:
committed by
Caolán McNamara
parent
679b1ed865
commit
c99f264be5
@@ -4116,7 +4116,6 @@ SwWW8ImplReader::SwWW8ImplReader(sal_uInt8 nVersionPara, SvStorage* pStorage,
|
||||
, maGrfNameGenerator(bNewDoc, OUString('G'))
|
||||
, maParaStyleMapper(rD)
|
||||
, maCharStyleMapper(rD)
|
||||
, mpChosenOutlineNumRule(0)
|
||||
, pFormImpl(0)
|
||||
, pFlyFmtOfJustInsertedGraphic(0)
|
||||
, pFmtOfJustInsertedApo(0)
|
||||
@@ -4983,7 +4982,7 @@ sal_uLong SwWW8ImplReader::CoreLoad(WW8Glossary *pGloss, const SwPosition &rPos)
|
||||
pStyles->PostProcessStyles();
|
||||
|
||||
if (!vColl.empty())
|
||||
SetOutLineStyles();
|
||||
SetOutlineStyles();
|
||||
|
||||
pSBase = new WW8ScannerBase(pStrm,pTableStream,pDataStream,pWwFib);
|
||||
|
||||
@@ -5737,178 +5736,148 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
void SwWW8ImplReader::SetOutLineStyles()
|
||||
void SwWW8ImplReader::SetOutlineStyles()
|
||||
{
|
||||
/*
|
||||
#i3674# - Load new document and insert document cases.
|
||||
*/
|
||||
SwNumRule aOutlineRule(*rDoc.GetOutlineNumRule());
|
||||
// #i53044,i53213#
|
||||
// <mpChosenOutlineNumRule> has to be set to point to local variable
|
||||
// <aOutlineRule>, because its used below to be compared this <&aOutlineRule>.
|
||||
// But at the end of the method <mpChosenOutlineNumRule> has to be set to
|
||||
// <rDoc.GetOutlineNumRule()>, because <aOutlineRule> will be destroyed.
|
||||
mpChosenOutlineNumRule = &aOutlineRule;
|
||||
|
||||
sw::ParaStyles aOutLined(sw::util::GetParaStyles(rDoc));
|
||||
// #i98791# - sorting algorithm adjusted
|
||||
sw::util::SortByAssignedOutlineStyleListLevel(aOutLined);
|
||||
|
||||
typedef sw::ParaStyleIter myParaStyleIter;
|
||||
/*
|
||||
If we are inserted into a document then don't clobber existing existing
|
||||
levels.
|
||||
*/
|
||||
sal_uInt16 nFlagsStyleOutlLevel = 0;
|
||||
// If we are inserted into a document then don't clobber existing outline
|
||||
// levels.
|
||||
sal_uInt16 nOutlineStyleListLevelWithAssignment = 0;
|
||||
if (!mbNewDoc)
|
||||
{
|
||||
// #i70748# - backward iteration needed due to the outline level attribute
|
||||
sw::ParaStyles aOutLined(sw::util::GetParaStyles(rDoc));
|
||||
sw::util::SortByAssignedOutlineStyleListLevel(aOutLined);
|
||||
sw::ParaStyles::reverse_iterator aEnd = aOutLined.rend();
|
||||
for ( sw::ParaStyles::reverse_iterator aIter = aOutLined.rbegin(); aIter < aEnd; ++aIter)
|
||||
{
|
||||
if ((*aIter)->IsAssignedToListLevelOfOutlineStyle())
|
||||
nFlagsStyleOutlLevel |= 1 << (*aIter)->GetAssignedOutlineStyleLevel();
|
||||
nOutlineStyleListLevelWithAssignment |= 1 << (*aIter)->GetAssignedOutlineStyleLevel();
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
// Check applied WW8 list styles at WW8 Built-In Heading Styles
|
||||
// - Choose the list style which occurs most often as the one which provides
|
||||
// the list level properties for the Outline Style.
|
||||
// - Populate temporary list of WW8 Built-In Heading Styles for further
|
||||
// iteration
|
||||
std::vector<SwWW8StyInf*> aWW8BuiltInHeadingStyles;
|
||||
const SwNumRule* pChosenWW8ListStyle = NULL;
|
||||
{
|
||||
/*
|
||||
Only import *one* of the possible multiple outline numbering rules, so
|
||||
pick the one that affects most styles. If we're not importing a new
|
||||
document, we got to stick with what is already there.
|
||||
*/
|
||||
// use index in text format collection array <vColl>
|
||||
// as key of the outline numbering map <aRuleMap>
|
||||
// instead of the memory pointer of the outline numbering rule
|
||||
// to assure that, if two outline numbering rule affect the same
|
||||
// count of text formats, always the same outline numbering rule is chosen.
|
||||
std::map<sal_uInt16, int>aRuleMap;
|
||||
typedef std::map<sal_uInt16, int>::iterator myIter;
|
||||
std::map<const SwNumRule*, int> aWW8ListStyleCounts;
|
||||
for (sal_uInt16 nI = 0; nI < vColl.size(); ++nI)
|
||||
{
|
||||
SwWW8StyInf& rSI = vColl[ nI ];
|
||||
if (
|
||||
(MAXLEVEL > rSI.nOutlineLevel) && rSI.pOutlineNumrule &&
|
||||
rSI.pFmt
|
||||
)
|
||||
SwWW8StyInf& rSI = vColl[nI];
|
||||
|
||||
if (!rSI.IsWW8BuiltInHeadingStyle() || !rSI.HasWW8OutlineLevel())
|
||||
{
|
||||
myIter aIter = aRuleMap.find(nI);
|
||||
if (aIter == aRuleMap.end())
|
||||
continue;
|
||||
}
|
||||
|
||||
aWW8BuiltInHeadingStyles.push_back(&rSI);
|
||||
|
||||
const SwNumRule* pWW8ListStyle = rSI.GetOutlineNumrule();
|
||||
if (pWW8ListStyle != NULL)
|
||||
{
|
||||
std::map<const SwNumRule*, int>::iterator aCountIter
|
||||
= aWW8ListStyleCounts.find(pWW8ListStyle);
|
||||
if (aCountIter == aWW8ListStyleCounts.end())
|
||||
{
|
||||
aRuleMap[nI] = 1;
|
||||
aWW8ListStyleCounts[pWW8ListStyle] = 1;
|
||||
}
|
||||
else
|
||||
++(aIter->second);
|
||||
{
|
||||
++(aCountIter->second);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int nMax = 0;
|
||||
myIter aEnd2 = aRuleMap.end();
|
||||
for (myIter aIter = aRuleMap.begin(); aIter != aEnd2; ++aIter)
|
||||
int nCurrentMaxCount = 0;
|
||||
std::map<const SwNumRule*, int>::iterator aCountIterEnd
|
||||
= aWW8ListStyleCounts.end();
|
||||
for (std::map<const SwNumRule*, int>::iterator aIter
|
||||
= aWW8ListStyleCounts.begin();
|
||||
aIter != aCountIterEnd; ++aIter)
|
||||
{
|
||||
if (aIter->second > nMax)
|
||||
if (aIter->second > nCurrentMaxCount)
|
||||
{
|
||||
nMax = aIter->second;
|
||||
if(aIter->first < vColl.size())
|
||||
mpChosenOutlineNumRule = vColl[ aIter->first ].pOutlineNumrule;
|
||||
else
|
||||
mpChosenOutlineNumRule = 0; //TODO make sure this is what we want
|
||||
}
|
||||
}
|
||||
|
||||
OSL_ENSURE(mpChosenOutlineNumRule, "Impossible");
|
||||
if (mpChosenOutlineNumRule)
|
||||
aOutlineRule = *mpChosenOutlineNumRule;
|
||||
|
||||
if (mpChosenOutlineNumRule != &aOutlineRule)
|
||||
{
|
||||
// #i70748# - backward iteration needed due to the outline level attribute
|
||||
sw::ParaStyles::reverse_iterator aEnd = aOutLined.rend();
|
||||
for ( sw::ParaStyles::reverse_iterator aIter = aOutLined.rbegin(); aIter < aEnd; ++aIter)
|
||||
{
|
||||
if((*aIter)->IsAssignedToListLevelOfOutlineStyle())
|
||||
(*aIter)->DeleteAssignmentToListLevelOfOutlineStyle();
|
||||
|
||||
else
|
||||
break;
|
||||
nCurrentMaxCount = aIter->second;
|
||||
pChosenWW8ListStyle = aIter->first;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sal_uInt16 nOldFlags = nFlagsStyleOutlLevel;
|
||||
|
||||
for (sal_uInt16 nI = 0; nI < vColl.size(); ++nI)
|
||||
if (pChosenWW8ListStyle == NULL)
|
||||
{
|
||||
SwWW8StyInf& rSI = vColl[nI];
|
||||
// no WW8 list style for Outline Style found --> nothing to do
|
||||
return;
|
||||
}
|
||||
|
||||
if (rSI.IsOutlineNumbered())
|
||||
// - set list level properties of Outline Style - ODF's list style applied
|
||||
// by default to headings
|
||||
// - assign corresponding Heading Paragraph Styles to the Outline Style
|
||||
// - If a heading Paragraph Styles is not applying the WW8 list style which
|
||||
// had been chosen as
|
||||
// the one which provides the list level properties for the Outline Style,
|
||||
// its assignment to
|
||||
// the Outline Style is removed and a potential applied WW8 list style is
|
||||
// assigned directly.
|
||||
SwNumRule aOutlineRule(*rDoc.GetOutlineNumRule());
|
||||
bool bAppliedChangedOutlineStyle = false;
|
||||
std::vector<SwWW8StyInf*>::iterator aStylesIterEnd
|
||||
= aWW8BuiltInHeadingStyles.end();
|
||||
for (std::vector<SwWW8StyInf*>::iterator aStyleIter
|
||||
= aWW8BuiltInHeadingStyles.begin();
|
||||
aStyleIter != aStylesIterEnd; ++aStyleIter)
|
||||
{
|
||||
SwWW8StyInf* pStyleInf = (*aStyleIter);
|
||||
|
||||
const sal_uInt16 nOutlineStyleListLevelOfWW8BuiltInHeadingStyle
|
||||
= 1 << pStyleInf->mnWW8OutlineLevel;
|
||||
if (nOutlineStyleListLevelOfWW8BuiltInHeadingStyle
|
||||
& nOutlineStyleListLevelWithAssignment)
|
||||
{
|
||||
sal_uInt16 nAktFlags = 1 << rSI.nOutlineLevel;
|
||||
if (
|
||||
(nAktFlags & nFlagsStyleOutlLevel) ||
|
||||
(rSI.pOutlineNumrule != mpChosenOutlineNumRule)
|
||||
)
|
||||
{
|
||||
/*
|
||||
If our spot is already taken by something we can't replace
|
||||
then don't insert and remove our outline level.
|
||||
*/
|
||||
rSI.pFmt->SetFmtAttr(
|
||||
SwNumRuleItem( rSI.pOutlineNumrule->GetName() ) );
|
||||
((SwTxtFmtColl*)rSI.pFmt)->DeleteAssignmentToListLevelOfOutlineStyle(); // #outline level
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
If there is a style already set for this outline
|
||||
numbering level and its not a style set by us already
|
||||
then we can remove it outline numbering.
|
||||
(its one of the default headings in a new document
|
||||
so we can clobber it)
|
||||
Of course if we are being inserted into a document that
|
||||
already has some set we can't do this, thats covered by
|
||||
the list of level in nFlagsStyleOutlLevel to ignore.
|
||||
*/
|
||||
outlineeq aCmp(rSI.nOutlineLevel);
|
||||
myParaStyleIter aResult = std::find_if(aOutLined.begin(),
|
||||
aOutLined.end(), aCmp);
|
||||
continue;
|
||||
}
|
||||
|
||||
myParaStyleIter aEnd = aOutLined.end();
|
||||
while (aResult != aEnd && aCmp(*aResult))
|
||||
{
|
||||
(*aResult)->DeleteAssignmentToListLevelOfOutlineStyle();
|
||||
++aResult;
|
||||
}
|
||||
#if OSL_DEBUG_LEVEL > 1
|
||||
OSL_ENSURE(pStyleInf->mnWW8OutlineLevel == pStyleInf->nListLevel,
|
||||
"WW8 import - <SwWW8ImplReader::SetOutlineStyles()> - it is not "
|
||||
"expected that WW8 Built-In Heading styles have different "
|
||||
"outline level and list level");
|
||||
#endif
|
||||
const SwNumFmt& rRule
|
||||
= pChosenWW8ListStyle->Get(pStyleInf->mnWW8OutlineLevel);
|
||||
aOutlineRule.Set(pStyleInf->mnWW8OutlineLevel, rRule);
|
||||
bAppliedChangedOutlineStyle = true;
|
||||
// in case that there are more styles on this level ignore them
|
||||
nOutlineStyleListLevelWithAssignment
|
||||
|= nOutlineStyleListLevelOfWW8BuiltInHeadingStyle;
|
||||
|
||||
/*
|
||||
#i1886#
|
||||
I believe that when a list is registered onto a winword
|
||||
style which is an outline numbering style (i.e.
|
||||
nOutlineLevel is set) that the style of numbering is for
|
||||
the level is indexed by the *list* level that was
|
||||
registered on that style, and not the outlinenumbering
|
||||
level, which is probably a logical sequencing, and not a
|
||||
physical mapping into the list style reged on that outline
|
||||
style.
|
||||
*/
|
||||
sal_uInt8 nFromLevel = rSI.nListLevel;
|
||||
sal_uInt8 nToLevel = rSI.nOutlineLevel;
|
||||
const SwNumFmt& rRule=rSI.pOutlineNumrule->Get(nFromLevel);
|
||||
aOutlineRule.Set(nToLevel, rRule);
|
||||
((SwTxtFmtColl*)rSI.pFmt)->AssignToListLevelOfOutlineStyle(nToLevel);
|
||||
// If there are more styles on this level ignore them
|
||||
nFlagsStyleOutlLevel |= nAktFlags;
|
||||
SwTxtFmtColl* pTxtFmtColl = static_cast<SwTxtFmtColl*>(pStyleInf->pFmt);
|
||||
if (pStyleInf->GetOutlineNumrule() != pChosenWW8ListStyle)
|
||||
{
|
||||
// WW8 Built-In Heading Style does not apply the chosen one.
|
||||
// --> delete assignment to OutlineStyle, but keep its current
|
||||
// outline level
|
||||
pTxtFmtColl->DeleteAssignmentToListLevelOfOutlineStyle(false);
|
||||
// Apply existing WW8 list style a normal list style at the
|
||||
// Paragraph Style
|
||||
if (pStyleInf->GetOutlineNumrule() != NULL)
|
||||
{
|
||||
pTxtFmtColl->SetFmtAttr(
|
||||
SwNumRuleItem(pStyleInf->GetOutlineNumrule()->GetName()));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pTxtFmtColl->AssignToListLevelOfOutlineStyle(
|
||||
pStyleInf->mnWW8OutlineLevel);
|
||||
}
|
||||
}
|
||||
if (nOldFlags != nFlagsStyleOutlLevel)
|
||||
|
||||
if (bAppliedChangedOutlineStyle)
|
||||
{
|
||||
rDoc.SetOutlineNumRule(aOutlineRule);
|
||||
// #i53044,i53213#
|
||||
if ( mpChosenOutlineNumRule == &aOutlineRule )
|
||||
{
|
||||
mpChosenOutlineNumRule = rDoc.GetOutlineNumRule();
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -236,7 +236,15 @@ public:
|
||||
sal_uInt16 nFollow;
|
||||
sal_uInt16 nLFOIndex;
|
||||
sal_uInt8 nListLevel;
|
||||
sal_uInt8 nOutlineLevel; // falls Gliederungs-Style
|
||||
|
||||
// WW8 outline level is zero-based:
|
||||
// 0: outline level 1
|
||||
// 1: outline level 2
|
||||
// ...
|
||||
// 8: outline level 9
|
||||
// 9: body text
|
||||
sal_uInt8 mnWW8OutlineLevel;
|
||||
|
||||
sal_uInt16 n81Flags; // Fuer Bold, Italic, ...
|
||||
sal_uInt16 n81BiDiFlags; // Fuer Bold, Italic, ...
|
||||
SvxLRSpaceItem maWordLR;
|
||||
@@ -268,7 +276,7 @@ public:
|
||||
nFollow( 0 ),
|
||||
nLFOIndex( USHRT_MAX ),
|
||||
nListLevel(WW8ListManager::nMaxLevel),
|
||||
nOutlineLevel( MAXLEVEL ),
|
||||
mnWW8OutlineLevel( MAXLEVEL ),
|
||||
n81Flags( 0 ),
|
||||
n81BiDiFlags(0),
|
||||
maWordLR( RES_LR_SPACE ),
|
||||
@@ -294,25 +302,60 @@ public:
|
||||
sWWStyleName = rName;
|
||||
nWWStyleId = nId;
|
||||
}
|
||||
sal_uInt16 GetWWStyleId() const { return nWWStyleId; }
|
||||
const OUString& GetOrgWWName() const
|
||||
{
|
||||
return sWWStyleName;
|
||||
}
|
||||
bool IsOutline() const
|
||||
|
||||
bool HasWW8OutlineLevel() const
|
||||
{
|
||||
return (pFmt && (MAXLEVEL > nOutlineLevel));
|
||||
return (pFmt != NULL && (MAXLEVEL > mnWW8OutlineLevel));
|
||||
}
|
||||
|
||||
bool IsOutlineNumbered() const
|
||||
{
|
||||
return pOutlineNumrule && IsOutline();
|
||||
return pOutlineNumrule && HasWW8OutlineLevel();
|
||||
}
|
||||
|
||||
const SwNumRule* GetOutlineNumrule() const
|
||||
{
|
||||
return pOutlineNumrule;
|
||||
}
|
||||
rtl_TextEncoding GetCharSet() const;
|
||||
rtl_TextEncoding GetCJKCharSet() const;
|
||||
|
||||
sal_uInt16 GetWWStyleId() const
|
||||
{
|
||||
return nWWStyleId;
|
||||
}
|
||||
|
||||
bool IsWW8BuiltInHeadingStyle() const
|
||||
{
|
||||
return GetWWStyleId() >= 1 && GetWWStyleId() <= 9;
|
||||
}
|
||||
|
||||
bool IsWW8BuiltInDefaultStyle() const
|
||||
{
|
||||
return GetWWStyleId() == 0;
|
||||
}
|
||||
|
||||
static sal_uInt8
|
||||
WW8OutlineLevelToOutlinelevel(const sal_uInt8 nWW8OutlineLevel)
|
||||
{
|
||||
if (nWW8OutlineLevel < MAXLEVEL)
|
||||
{
|
||||
if (nWW8OutlineLevel == 9)
|
||||
{
|
||||
return 0; // no outline level --> body text
|
||||
}
|
||||
else
|
||||
{
|
||||
return nWW8OutlineLevel + 1; // outline level 1..9
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
// Stack
|
||||
@@ -1158,14 +1201,6 @@ private:
|
||||
std::stack<rtl_TextEncoding> maFontSrcCharSets;
|
||||
std::stack<rtl_TextEncoding> maFontSrcCJKCharSets;
|
||||
|
||||
/*
|
||||
Winword numbering gets imported as SwNumRules, there is a problem that
|
||||
winword can have multiple outline numberings, only one gets chosen as
|
||||
the writer outline numbering rule. The one that gets chosen is set here
|
||||
as mpChosenOutlineNumRule
|
||||
*/
|
||||
SwNumRule *mpChosenOutlineNumRule;
|
||||
|
||||
SwMSConvertControls *pFormImpl; // Control-Implementierung
|
||||
|
||||
SwFlyFrmFmt* pFlyFmtOfJustInsertedGraphic;
|
||||
@@ -1616,7 +1651,8 @@ private:
|
||||
// Ver8-Listen
|
||||
|
||||
void RegisterNumFmtOnTxtNode(sal_uInt16 nActLFO, sal_uInt8 nActLevel,
|
||||
bool bSetAttr = true);
|
||||
const bool bSetAttr = true);
|
||||
|
||||
void RegisterNumFmtOnStyle(sal_uInt16 nStyle);
|
||||
void SetStylesList(sal_uInt16 nStyle, sal_uInt16 nActLFO,
|
||||
sal_uInt8 nActLevel);
|
||||
@@ -1657,7 +1693,7 @@ private:
|
||||
SwTwips MoveOutsideFly(SwFrmFmt *pFlyFmt, const SwPosition &rPos,
|
||||
bool bTableJoin = true);
|
||||
|
||||
void SetOutLineStyles();
|
||||
void SetOutlineStyles();
|
||||
|
||||
bool SetSpacing(SwPaM &rMyPam, int nSpace, bool bIsUpper);
|
||||
bool SetUpperSpacing(SwPaM &pMyPam, int nSpace);
|
||||
@@ -1826,7 +1862,6 @@ public: // eigentlich private, geht aber leider nur public
|
||||
eF_ResT Read_F_NoteReference( WW8FieldDesc* pF, OUString& rStr );
|
||||
|
||||
eF_ResT Read_F_Tox( WW8FieldDesc* pF, OUString& rStr );
|
||||
bool AddExtraOutlinesAsExtraStyles(SwTOXBase& rBase);
|
||||
eF_ResT Read_F_Symbol( WW8FieldDesc*, OUString& rStr );
|
||||
eF_ResT Read_F_Embedd( WW8FieldDesc*, OUString& rStr );
|
||||
eF_ResT Read_F_FormTextBox( WW8FieldDesc* pF, OUString& rStr);
|
||||
|
@@ -3745,7 +3745,7 @@ bool WW8RStyle::PrepareStyle(SwWW8StyInf &rSI, ww::sti eSti, sal_uInt16 nThisSty
|
||||
rSI.eCJKFontSrcCharSet = pj->eCJKFontSrcCharSet;
|
||||
rSI.n81Flags = pj->n81Flags;
|
||||
rSI.n81BiDiFlags = pj->n81BiDiFlags;
|
||||
rSI.nOutlineLevel = pj->nOutlineLevel;
|
||||
rSI.mnWW8OutlineLevel = pj->mnWW8OutlineLevel;
|
||||
rSI.bParaAutoBefore = pj->bParaAutoBefore;
|
||||
rSI.bParaAutoAfter = pj->bParaAutoAfter;
|
||||
|
||||
|
@@ -1631,19 +1631,21 @@ bool SwWW8ImplReader::SetTxtFmtCollAndListLevel(const SwPaM& rRg,
|
||||
bRes = rDoc.SetTxtFmtColl(rRg, (SwTxtFmtColl*)rStyleInfo.pFmt);
|
||||
SwTxtNode* pTxtNode = pPaM->GetNode().GetTxtNode();
|
||||
OSL_ENSURE( pTxtNode, "No Text-Node at PaM-Position" );
|
||||
// make code robust
|
||||
if ( !pTxtNode )
|
||||
{
|
||||
// make code robust
|
||||
return bRes;
|
||||
}
|
||||
|
||||
SwNumRule * pNumRule = pTxtNode->GetNumRule(); // #i27610#
|
||||
const SwNumRule * pNumRule = pTxtNode->GetNumRule(); // #i27610#
|
||||
|
||||
if( !IsInvalidOrToBeMergedTabCell() &&
|
||||
! (pNumRule && pNumRule->IsOutlineRule()) ) // #i27610#
|
||||
{
|
||||
pTxtNode->ResetAttr( RES_PARATR_NUMRULE );
|
||||
}
|
||||
|
||||
if( !rStyleInfo.pOutlineNumrule )
|
||||
if (rStyleInfo.GetOutlineNumrule() == NULL)
|
||||
{
|
||||
if (
|
||||
(USHRT_MAX > rStyleInfo.nLFOIndex) &&
|
||||
@@ -1654,15 +1656,6 @@ bool SwWW8ImplReader::SetTxtFmtCollAndListLevel(const SwPaM& rRg,
|
||||
rStyleInfo.nListLevel, false);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Use outline level set at the style info <rStyleInfo> instead of
|
||||
// the outline level at the text format, because the WW8 document
|
||||
// could contain more than one outline numbering rule and the one
|
||||
// of the text format isn't the one, which a chosen as the Writer
|
||||
// outline rule.
|
||||
pTxtNode->SetAttrListLevel( rStyleInfo.nOutlineLevel );
|
||||
}
|
||||
}
|
||||
return bRes;
|
||||
}
|
||||
@@ -1756,8 +1749,8 @@ void SwWW8ImplReader::RegisterNumFmtOnStyle(sal_uInt16 nStyle)
|
||||
|
||||
// Phase 2: aktualisieren der StyleDef nach einlesen aller Listen
|
||||
SwNumRule* pNmRule = 0;
|
||||
sal_uInt16 nLFO = rStyleInf.nLFOIndex;
|
||||
sal_uInt8 nLevel = rStyleInf.nListLevel;
|
||||
const sal_uInt16 nLFO = rStyleInf.nLFOIndex;
|
||||
const sal_uInt8 nLevel = rStyleInf.nListLevel;
|
||||
if (
|
||||
(USHRT_MAX > nLFO) &&
|
||||
(WW8ListManager::nMaxLevel > nLevel)
|
||||
@@ -1767,13 +1760,19 @@ void SwWW8ImplReader::RegisterNumFmtOnStyle(sal_uInt16 nStyle)
|
||||
pNmRule = pLstManager->GetNumRuleForActivation(nLFO, nLevel,
|
||||
aParaSprms);
|
||||
|
||||
if (pNmRule)
|
||||
if (pNmRule != NULL)
|
||||
{
|
||||
if( MAXLEVEL > rStyleInf.nOutlineLevel )
|
||||
if (rStyleInf.IsWW8BuiltInHeadingStyle()
|
||||
&& rStyleInf.HasWW8OutlineLevel())
|
||||
{
|
||||
rStyleInf.pOutlineNumrule = pNmRule;
|
||||
rStyleInf.pFmt->SetFmtAttr(
|
||||
SwNumRuleItem( pNmRule->GetName() ) );
|
||||
rStyleInf.bHasStyNumRule = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
rStyleInf.pFmt->SetFmtAttr(
|
||||
SwNumRuleItem(pNmRule->GetName()));
|
||||
rStyleInf.bHasStyNumRule = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1783,7 +1782,8 @@ void SwWW8ImplReader::RegisterNumFmtOnStyle(sal_uInt16 nStyle)
|
||||
}
|
||||
|
||||
void SwWW8ImplReader::RegisterNumFmtOnTxtNode(sal_uInt16 nActLFO,
|
||||
sal_uInt8 nActLevel, bool bSetAttr)
|
||||
sal_uInt8 nActLevel,
|
||||
const bool bSetAttr)
|
||||
{
|
||||
// beachte: die Methode haengt die NumRule an den Text Node, falls
|
||||
// bSetAttr (dann muessen natuerlich vorher die Listen gelesen sein)
|
||||
@@ -1802,7 +1802,7 @@ void SwWW8ImplReader::RegisterNumFmtOnTxtNode(sal_uInt16 nActLFO,
|
||||
pLstManager->GetNumRuleForActivation( nActLFO, nActLevel,
|
||||
aParaSprms, pTxtNd) : 0;
|
||||
|
||||
if (pRule || !bSetAttr)
|
||||
if (pRule != NULL || !bSetAttr)
|
||||
{
|
||||
//#i24136# old is the same as new, and its the outline numbering,
|
||||
//then we don't set the numrule again, and we just take the num node
|
||||
@@ -1814,9 +1814,7 @@ void SwWW8ImplReader::RegisterNumFmtOnTxtNode(sal_uInt16 nActLFO,
|
||||
is the one that was chosen to be the outline numbering then all
|
||||
is unchanged
|
||||
*/
|
||||
// correct condition according to the above given comment.
|
||||
if ( pTxtNd->GetNumRule() == rDoc.GetOutlineNumRule() &&
|
||||
pRule == mpChosenOutlineNumRule )
|
||||
if (pTxtNd->GetNumRule() == rDoc.GetOutlineNumRule())
|
||||
{
|
||||
bUnchangedOutlineNumbering = true;
|
||||
}
|
||||
|
@@ -2666,38 +2666,6 @@ static void lcl_toxMatchACSwitch( SwWW8ImplReader& /*rReader*/,
|
||||
}
|
||||
}
|
||||
|
||||
//For all outline styles that are not in the outline numbering add them here as
|
||||
//custom extra styles
|
||||
bool SwWW8ImplReader::AddExtraOutlinesAsExtraStyles(SwTOXBase& rBase)
|
||||
{
|
||||
bool bExtras = false;
|
||||
//This is the case if the winword outline numbering is set while the
|
||||
//writer one is not
|
||||
for (sal_uInt16 nI = 0; nI < vColl.size(); ++nI)
|
||||
{
|
||||
SwWW8StyInf& rSI = vColl[nI];
|
||||
if (rSI.IsOutline())
|
||||
{
|
||||
const SwTxtFmtColl *pFmt = (const SwTxtFmtColl*)(rSI.pFmt);
|
||||
sal_uInt16 nStyleLevel = rSI.nOutlineLevel;
|
||||
sal_uInt16 nMaxLevel = rBase.GetLevel();
|
||||
if (
|
||||
nStyleLevel != (pFmt->GetAttrOutlineLevel()-1) &&
|
||||
nStyleLevel < nMaxLevel
|
||||
)
|
||||
{
|
||||
OUString sStyles(rBase.GetStyleNames(rSI.nOutlineLevel));
|
||||
if ( !sStyles.isEmpty())
|
||||
sStyles += OUString(TOX_STYLE_DELIMITER);
|
||||
sStyles += pFmt->GetName();
|
||||
rBase.SetStyleNames(sStyles, rSI.nOutlineLevel);
|
||||
bExtras = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return bExtras;
|
||||
}
|
||||
|
||||
static void EnsureMaxLevelForTemplates(SwTOXBase& rBase)
|
||||
{
|
||||
//If the TOC contains Template entries at levels > the evaluation level
|
||||
@@ -3180,9 +3148,6 @@ eF_ResT SwWW8ImplReader::Read_F_Tox( WW8FieldDesc* pF, OUString& rStr )
|
||||
sal_uInt16 eEffectivelyFrom = eCreateFrom ? eCreateFrom : nsSwTOXElement::TOX_OUTLINELEVEL;
|
||||
if (eEffectivelyFrom & nsSwTOXElement::TOX_OUTLINELEVEL)
|
||||
{
|
||||
if (AddExtraOutlinesAsExtraStyles(*pBase))
|
||||
eCreateFrom |= (nsSwTOXElement::TOX_TEMPLATE | nsSwTOXElement::TOX_OUTLINELEVEL);
|
||||
|
||||
// #i19683# Insert a text token " " between the number and entry token.
|
||||
// In an ideal world we could handle the tab stop between the number and
|
||||
// the entry correctly, but I currently have no clue how to obtain
|
||||
@@ -3193,7 +3158,7 @@ eF_ResT SwWW8ImplReader::Read_F_Tox( WW8FieldDesc* pF, OUString& rStr )
|
||||
const SwWW8StyInf& rSI = vColl[nI];
|
||||
if (rSI.IsOutlineNumbered())
|
||||
{
|
||||
sal_uInt16 nStyleLevel = rSI.nOutlineLevel;
|
||||
sal_uInt16 nStyleLevel = rSI.mnWW8OutlineLevel;
|
||||
const SwNumFmt& rFmt = rSI.GetOutlineNumrule()->Get( nStyleLevel );
|
||||
if ( SVX_NUM_NUMBER_NONE != rFmt.GetNumberingType() )
|
||||
{
|
||||
|
@@ -270,7 +270,7 @@ void SwWW8ImplReader::SetDocumentGrid(SwFrmFmt &rFmt, const wwSection &rSection)
|
||||
for (sal_uInt16 nI = 0; nI < pStyles->GetCount(); ++nI)
|
||||
{
|
||||
if (vColl[nI].bValid && vColl[nI].pFmt &&
|
||||
vColl[nI].GetWWStyleId() == 0)
|
||||
vColl[nI].IsWW8BuiltInDefaultStyle())
|
||||
{
|
||||
nCharWidth = ItemGet<SvxFontHeightItem>(*(vColl[nI].pFmt),
|
||||
RES_CHRATR_CJK_FONTSIZE).GetHeight();
|
||||
@@ -2698,16 +2698,29 @@ void SwWW8ImplReader::Read_PicLoc(sal_uInt16 , const sal_uInt8* pData, short nLe
|
||||
|
||||
void SwWW8ImplReader::Read_POutLvl(sal_uInt16, const sal_uInt8* pData, short nLen )
|
||||
{
|
||||
if (pAktColl && (0 < nLen))
|
||||
if (nLen < 0)
|
||||
{
|
||||
if (SwWW8StyInf* pSI = GetStyle(nAktColl))
|
||||
pCtrlStck->SetAttr(*pPaM->GetPoint(), RES_PARATR_OUTLINELEVEL);
|
||||
return;
|
||||
}
|
||||
|
||||
if (pAktColl != NULL)
|
||||
{
|
||||
SwWW8StyInf* pSI = GetStyle(nAktColl);
|
||||
if (pSI != NULL)
|
||||
{
|
||||
pSI->nOutlineLevel = static_cast< sal_uInt8 >(
|
||||
( (1 <= pSI->GetWWStyleId()) && (9 >= pSI->GetWWStyleId()) )
|
||||
? pSI->GetWWStyleId()-1
|
||||
: (pData ? *pData : 0) );
|
||||
pSI->mnWW8OutlineLevel =
|
||||
static_cast< sal_uInt8 >( ( pData ? *pData : 0 ) );
|
||||
NewAttr( SfxUInt16Item( RES_PARATR_OUTLINELEVEL, SwWW8StyInf::WW8OutlineLevelToOutlinelevel( pSI->mnWW8OutlineLevel ) ) );
|
||||
}
|
||||
}
|
||||
else if (pPaM != NULL)
|
||||
{
|
||||
const sal_uInt8 nOutlineLevel
|
||||
= SwWW8StyInf::WW8OutlineLevelToOutlinelevel(
|
||||
static_cast<sal_uInt8>((pData ? *pData : 0)));
|
||||
NewAttr(SfxUInt16Item(RES_PARATR_OUTLINELEVEL, nOutlineLevel));
|
||||
}
|
||||
}
|
||||
|
||||
void SwWW8ImplReader::Read_Symbol(sal_uInt16, const sal_uInt8* pData, short nLen )
|
||||
|
@@ -367,7 +367,7 @@ sal_Int32 ReadThroughComponent(
|
||||
}
|
||||
|
||||
// #i44177#
|
||||
static void lcl_AdjustOutlineStylesForOOo( SwDoc& _rDoc )
|
||||
static void lcl_AdjustOutlineStylesForOOo(SwDoc& _rDoc)
|
||||
{
|
||||
// array containing the names of the default outline styles ('Heading 1',
|
||||
// 'Heading 2', ..., 'Heading 10')
|
||||
@@ -445,7 +445,7 @@ static void lcl_AdjustOutlineStylesForOOo( SwDoc& _rDoc )
|
||||
}
|
||||
}
|
||||
|
||||
static void lcl_ConvertSdrOle2ObjsToSdrGrafObjs( SwDoc& _rDoc )
|
||||
static void lcl_ConvertSdrOle2ObjsToSdrGrafObjs(SwDoc& _rDoc)
|
||||
{
|
||||
if ( _rDoc.getIDocumentDrawModelAccess().GetDrawModel() &&
|
||||
_rDoc.getIDocumentDrawModelAccess().GetDrawModel()->GetPage( 0 ) )
|
||||
|
Reference in New Issue
Block a user