Hi, I have submitted a patch for review:
https://gerrit.libreoffice.org/2133 To pull it, you can do: git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/33/2133/1 fdo#43105: apply old sw-nested-positionned-tables-ww8-import-fix.diff - replaced the really ugly goto hack though Change-Id: I14dfbe414dc16b634fbaca0a365e2e9ec37ab08e --- M sw/source/filter/ww8/ww8par.cxx 1 file changed, 107 insertions(+), 103 deletions(-) diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx index e71b6c0..fb93ac5 100644 --- a/sw/source/filter/ww8/ww8par.cxx +++ b/sw/source/filter/ww8/ww8par.cxx @@ -2196,113 +2196,117 @@ if (!nCellLevel) nCellLevel = 0 != pPlcxMan->HasParaSprm(0x244B); } - - WW8_TablePos *pTabPos=0; - WW8_TablePos aTabPos; - if (nCellLevel && !bVer67) + do { - WW8PLCFxSave1 aSave; - pPlcxMan->GetPap()->Save( aSave ); - rbReSync = true; - WW8PLCFx_Cp_FKP* pPap = pPlcxMan->GetPapPLCF(); - WW8_CP nMyStartCp=nStartCp; - - if (const sal_uInt8 *pLevel = pPlcxMan->HasParaSprm(0x6649)) - nCellLevel = *pLevel; - - bool bHasRowEnd = SearchRowEnd(pPap, nMyStartCp, nCellLevel-1); - - //Bad Table, remain unchanged in level, e.g. #i19667# - if (!bHasRowEnd) - nCellLevel = static_cast< sal_uInt8 >(nInTable); - - if (bHasRowEnd && ParseTabPos(&aTabPos,pPap)) - pTabPos = &aTabPos; - - pPlcxMan->GetPap()->Restore( aSave ); - } - -// then look if we are in an Apo - - ApoTestResults aApo = TestApo(nCellLevel, bTableRowEnd, pTabPos); - - //look to see if we are in a Table, but Table in foot/end note not allowed - bool bStartTab = (nInTable < nCellLevel) && !bFtnEdn; - - bool bStopTab = bWasTabRowEnd && (nInTable > nCellLevel) && !bFtnEdn; - - bWasTabRowEnd = false; // must be deactivated right here to prevent next - // WW8TabDesc::TableCellEnd() from making nonsense - - if (nInTable && !bTableRowEnd && !bStopTab && (nInTable == nCellLevel && aApo.HasStartStop())) - bStopTab = bStartTab = true; // Required to stop and start table - -// Dann auf Anl (Nummerierung) testen -// und dann alle Ereignisse in der richtigen Reihenfolge bearbeiten - - if( bAnl && !bTableRowEnd ) - { - const sal_uInt8* pSprm13 = pPlcxMan->HasParaSprm( 13 ); - if( pSprm13 ) - { // Noch Anl ? - sal_uInt8 nT = static_cast< sal_uInt8 >(GetNumType( *pSprm13 )); - if( ( nT != WW8_Pause && nT != nWwNumType ) // Anl-Wechsel - || aApo.HasStartStop() // erzwungenes Anl-Ende - || bStopTab || bStartTab ) - { - StopAnlToRestart(nT); // Anl-Restart ( = Wechsel ) ueber sprms - } - else - { - NextAnlLine( pSprm13 ); // naechste Anl-Zeile - } - } - else - { // Anl normal zuende - StopAllAnl(); // Wirkliches Ende - } - } - if (bStopTab) - { - StopTable(); - maApos.pop_back(); - --nInTable; - } - if (aApo.mbStopApo) - { - StopApo(); - maApos[nInTable] = false; - } - - if (aApo.mbStartApo) - { - maApos[nInTable] = StartApo(aApo, pTabPos); - // nach StartApo ist ein ReSync noetig ( eigentlich nur, falls die Apo - // ueber eine FKP-Grenze geht - rbReSync = true; - } - if (bStartTab) - { - WW8PLCFxSave1 aSave; - pPlcxMan->GetPap()->Save( aSave ); - - if (bAnl) // Nummerierung ueber Zellengrenzen - StopAllAnl(); // fuehrt zu Absturz -> keine Anls - // in Tabellen - while (nInTable < nCellLevel) + WW8_TablePos *pTabPos=0; + WW8_TablePos aTabPos; + if(nCellLevel && !bVer67) { - if (StartTable(nStartCp)) - ++nInTable; - else - break; + WW8PLCFxSave1 aSave; + pPlcxMan->GetPap()->Save( aSave ); + rbReSync = true; + WW8PLCFx_Cp_FKP* pPap = pPlcxMan->GetPapPLCF(); + WW8_CP nMyStartCp=nStartCp; - maApos.push_back(false); + if (const sal_uInt8 *pLevel = pPlcxMan->HasParaSprm(0x6649)) + nCellLevel = *pLevel; + + bool bHasRowEnd = SearchRowEnd(pPap, nMyStartCp, (nInTable<nCellLevel?nInTable:nCellLevel-1)); + + //Bad Table, remain unchanged in level, e.g. #i19667# + if (!bHasRowEnd) + nCellLevel = static_cast< sal_uInt8 >(nInTable); + + if (bHasRowEnd && ParseTabPos(&aTabPos,pPap)) + pTabPos = &aTabPos; + + pPlcxMan->GetPap()->Restore( aSave ); } - // nach StartTable ist ein ReSync noetig ( eigentlich nur, falls die - // Tabelle ueber eine FKP-Grenze geht - rbReSync = true; - pPlcxMan->GetPap()->Restore( aSave ); - } + + // then look if we are in an Apo + + ApoTestResults aApo = TestApo(nCellLevel, bTableRowEnd, pTabPos); + + //look to see if we are in a Table, but Table in foot/end note not allowed + bool bStartTab = (nInTable < nCellLevel) && !bFtnEdn; + + bool bStopTab = bWasTabRowEnd && (nInTable > nCellLevel) && !bFtnEdn; + + bWasTabRowEnd = false; // must be deactivated right here to prevent next + // WW8TabDesc::TableCellEnd() from making nonsense + + if (nInTable && !bTableRowEnd && !bStopTab && (nInTable == nCellLevel && aApo.HasStartStop())) + bStopTab = bStartTab = true; // Required to stop and start table + + // Dann auf Anl (Nummerierung) testen + // und dann alle Ereignisse in der richtigen Reihenfolge bearbeiten + + if( bAnl && !bTableRowEnd ) + { + const sal_uInt8* pSprm13 = pPlcxMan->HasParaSprm( 13 ); + if( pSprm13 ) + { // Noch Anl ? + sal_uInt8 nT = static_cast< sal_uInt8 >(GetNumType( *pSprm13 )); + if( ( nT != WW8_Pause && nT != nWwNumType ) // Anl-Wechsel + || aApo.HasStartStop() // erzwungenes Anl-Ende + || bStopTab || bStartTab ) + { + StopAnlToRestart(nT); // Anl-Restart ( = Wechsel ) ueber sprms + } + else + { + NextAnlLine( pSprm13 ); // naechste Anl-Zeile + } + } + else + { // Anl normal zuende + StopAllAnl(); // Wirkliches Ende + } + } + if (bStopTab) + { + StopTable(); + maApos.pop_back(); + --nInTable; + } + if (aApo.mbStopApo) + { + StopApo(); + maApos[nInTable] = false; + } + + if (aApo.mbStartApo) + { + maApos[nInTable] = StartApo(aApo, pTabPos); + // nach StartApo ist ein ReSync noetig ( eigentlich nur, falls die Apo + // ueber eine FKP-Grenze geht + rbReSync = true; + } + if (bStartTab) + { + WW8PLCFxSave1 aSave; + pPlcxMan->GetPap()->Save( aSave ); + + if (bAnl) // Nummerierung ueber Zellengrenzen + StopAllAnl(); // fuehrt zu Absturz -> keine Anls + // in Tabellen + if(nInTable < nCellLevel) + { + if (StartTable(nStartCp)) + ++nInTable; + else + break; + maApos.push_back(false); + } + if(nInTable >= nCellLevel) + { + // nach StartTable ist ein ReSync noetig ( eigentlich nur, falls die + // Tabelle ueber eine FKP-Grenze geht + rbReSync = true; + pPlcxMan->GetPap()->Restore( aSave ); + } + } + } while (nInTable < nCellLevel); return bTableRowEnd; } -- To view, visit https://gerrit.libreoffice.org/2133 To unsubscribe, visit https://gerrit.libreoffice.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I14dfbe414dc16b634fbaca0a365e2e9ec37ab08e Gerrit-PatchSet: 1 Gerrit-Project: core Gerrit-Branch: master Gerrit-Owner: Björn Michaelsen <bjoern.michael...@canonical.com> _______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice