n#693238: fixed docx import of tabs set after the end margin

Added a new compatibility option to keep the previous behavior, but
changed the default to avoid lines insertion for tabs when there are tab
stops set beyond the end margin
This commit is contained in:
Cédric Bosdonnat
2011-10-31 17:39:16 +01:00
committed by Cédric Bosdonnat
parent b2e0b5f3f5
commit fd886cdc6a
12 changed files with 63 additions and 12 deletions

View File

@@ -79,9 +79,10 @@ namespace com { namespace sun { namespace star { namespace i18n { struct Forbidd
PROTECT_FORM,
// #i89181#
TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST,
INVERT_BORDER_SPACING,
INVERT_BORDER_SPACING,
COLLAPSE_EMPTY_CELL_PARA,
SMALL_CAPS_PERCENTAGE_66,
TAB_OVERFLOW,
// COMPATIBILITY FLAGS END
BROWSE_MODE,

View File

@@ -579,6 +579,7 @@ private:
bool mbCollapseEmptyCellPara : 1;
bool mbTabAtLeftIndentForParagraphsInList; // #i89181# - see above
bool mbSmallCapsPercentage66;
bool mbTabOverflow;
bool mbLastBrowseMode : 1;

View File

@@ -202,6 +202,7 @@ bool SwDoc::get(/*[in]*/ DocumentSettingId id) const
case INVERT_BORDER_SPACING: return mbInvertBorderSpacing;
case COLLAPSE_EMPTY_CELL_PARA: return mbCollapseEmptyCellPara;
case SMALL_CAPS_PERCENTAGE_66: return mbSmallCapsPercentage66;
case TAB_OVERFLOW: return mbTabOverflow;
case BROWSE_MODE: return mbLastBrowseMode; // Attention: normally the ViewShell has to be asked!
case HTML_MODE: return mbHTMLMode;
@@ -336,6 +337,10 @@ void SwDoc::set(/*[in]*/ DocumentSettingId id, /*[in]*/ bool value)
case SMALL_CAPS_PERCENTAGE_66:
mbSmallCapsPercentage66 = value;
break;
case TAB_OVERFLOW:
mbTabOverflow = value;
break;
// COMPATIBILITY FLAGS END
case BROWSE_MODE: //can be used temporary (load/save) when no ViewShell is avaiable

View File

@@ -357,6 +357,7 @@ SwDoc::SwDoc()
mbInvertBorderSpacing = false; // hidden
mbCollapseEmptyCellPara = true; // hidden
mbSmallCapsPercentage66 = false; // hidden
mbTabOverflow = true;
//
// COMPATIBILITY FLAGS END

View File

@@ -1459,7 +1459,7 @@ void SwTxtFormatInfo::Init()
// Nicht initialisieren: pRest, nLeft, nRight, nFirst, nRealWidth
X(0);
bArrowDone = bFull = bFtnDone = bErgoDone = bNumDone = bNoEndHyph =
bNoMidHyph = bStop = bNewLine = bUnderFlow = sal_False;
bNoMidHyph = bStop = bNewLine = bUnderFlow = bTabOverflow = sal_False;
// generally we do not allow number portions in follows, except...
if ( GetTxtFrm()->IsFollow() )
@@ -1501,7 +1501,8 @@ void SwTxtFormatInfo::Init()
* --------------------------------------------------*/
SwTxtFormatInfo::SwTxtFormatInfo( const SwTxtFormatInfo& rInf,
SwLineLayout& rLay, SwTwips nActWidth ) : SwTxtPaintInfo( rInf )
SwLineLayout& rLay, SwTwips nActWidth ) : SwTxtPaintInfo( rInf ),
bTabOverflow( sal_False )
{
pRoot = &rLay;
pLast = &rLay;

View File

@@ -565,6 +565,7 @@ class SwTxtFormatInfo : public SwTxtPaintInfo
sal_Bool bFakeLineStart: 1; // String has been replaced by field portion
// info structure only pretends that we are at
// the beginning of a line
sal_Bool bTabOverflow; // Tabs are expanding after the end margin
xub_Unicode cTabDecimal; // das _aktuelle_ Dezimalzeichen
xub_Unicode cHookChar; // fuer Tabs in Feldern etc.
@@ -734,6 +735,9 @@ public:
// friend ostream &operator<<( ostream &rOS, const SwTxtFormatInfo &rInf );
friend SvStream &operator<<( SvStream &rOS, const SwTxtFormatInfo &rInf );
inline void SetTabOverflow( sal_Bool bOverflow ) { bTabOverflow = bOverflow; }
inline sal_Bool IsTabOverflow( ) { return bTabOverflow; }
};
/*************************************************************************

View File

@@ -738,6 +738,9 @@ void SwTxtFormatter::BuildPortions( SwTxtFormatInfo &rInf )
// 3260, 3860: Fly auf jeden Fall loeschen!
ClearFly( rInf );
// Reinit the tab overflow flag after the line
rInf.SetTabOverflow( sal_False );
}
/*************************************************************************

View File

@@ -38,17 +38,19 @@ class SwTabPortion : public SwFixPortion
{
const KSHORT nTabPos;
const xub_Unicode cFill;
const bool bAutoTabStop;
// Das Format() verzweigt entweder in Pre- oder PostFormat()
sal_Bool PreFormat( SwTxtFormatInfo &rInf );
public:
SwTabPortion( const KSHORT nTabPos, const xub_Unicode cFill = '\0' );
SwTabPortion( const KSHORT nTabPos, const xub_Unicode cFill = '\0', const bool bAutoTab = true );
virtual void Paint( const SwTxtPaintInfo &rInf ) const;
virtual sal_Bool Format( SwTxtFormatInfo &rInf );
virtual void FormatEOL( SwTxtFormatInfo &rInf );
sal_Bool PostFormat( SwTxtFormatInfo &rInf );
inline sal_Bool IsFilled() const { return 0 != cFill; }
inline KSHORT GetTabPos() const { return nTabPos; }
inline sal_Bool IsAutoTabStop() const { return bAutoTabStop; }
// Accessibility: pass information about this portion to the PortionHandler
virtual void HandlePortion( SwPortionHandler& rPH ) const;
@@ -63,8 +65,8 @@ public:
class SwTabLeftPortion : public SwTabPortion
{
public:
inline SwTabLeftPortion( const KSHORT nTabPosVal, const xub_Unicode cFillChar='\0' )
: SwTabPortion( nTabPosVal, cFillChar )
inline SwTabLeftPortion( const KSHORT nTabPosVal, const xub_Unicode cFillChar='\0', bool bAutoTab = true )
: SwTabPortion( nTabPosVal, cFillChar, bAutoTab )
{ SetWhichPor( POR_TABLEFT ); }
OUTPUT_OPERATOR
};

View File

@@ -94,6 +94,7 @@ SwTabPortion *SwTxtFormatter::NewTabPortion( SwTxtFormatInfo &rInf, bool bAuto )
SvxTabAdjust eAdj;
KSHORT nNewTabPos;
bool bAutoTabStop = true;
{
const bool bRTL = pFrm->IsRightToLeft();
// #i24363# tab stops relative to indent
@@ -177,6 +178,7 @@ SwTabPortion *SwTxtFormatter::NewTabPortion( SwTxtFormatInfo &rInf, bool bAuto )
//calculate default tab position of default tabs in negative indent
nNextPos = ( nSearchPos / nNextPos ) * nNextPos;
}
bAutoTabStop = false;
}
else
{
@@ -312,7 +314,7 @@ SwTabPortion *SwTxtFormatter::NewTabPortion( SwTxtFormatInfo &rInf, bool bAuto )
{
OSL_ENSURE( SVX_TAB_ADJUST_LEFT == eAdj || SVX_TAB_ADJUST_DEFAULT == eAdj,
"+SwTxtFormatter::NewTabPortion: unknown adjustment" );
pTabPor = new SwTabLeftPortion( nNewTabPos, cFill );
pTabPor = new SwTabLeftPortion( nNewTabPos, cFill, bAutoTabStop );
break;
}
}
@@ -333,8 +335,8 @@ SwTabPortion *SwTxtFormatter::NewTabPortion( SwTxtFormatInfo &rInf, bool bAuto )
// Die Basisklasse wird erstmal ohne alles initialisiert.
SwTabPortion::SwTabPortion( const KSHORT nTabPosition, const xub_Unicode cFillChar )
: SwFixPortion( 0, 0 ), nTabPos(nTabPosition), cFill(cFillChar)
SwTabPortion::SwTabPortion( const KSHORT nTabPosition, const xub_Unicode cFillChar, const bool bAutoTab )
: SwFixPortion( 0, 0 ), nTabPos(nTabPosition), cFill(cFillChar), bAutoTabStop( bAutoTab )
{
nLineLength = 1;
#if OSL_DEBUG_LEVEL > 1
@@ -388,6 +390,7 @@ sal_Bool SwTabPortion::PreFormat( SwTxtFormatInfo &rInf )
Fix( static_cast<sal_uInt16>(rInf.X()) );
const bool bTabCompat = rInf.GetTxtFrm()->GetTxtNode()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::TAB_COMPAT);
const bool bTabOverflow = rInf.GetTxtFrm()->GetTxtNode()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::TAB_OVERFLOW);
// Die Mindestbreite eines Tabs ist immer mindestens ein Blank
// #i37686# In compatibility mode, the minimum width
@@ -419,7 +422,7 @@ sal_Bool SwTabPortion::PreFormat( SwTxtFormatInfo &rInf )
// 1. Minmal width does not fit to line anymore.
// 2. An underflow event was called for the tab portion.
sal_Bool bFull = ( bTabCompat && rInf.IsUnderFlow() ) ||
rInf.Width() <= rInf.X() + PrtWidth();
( rInf.Width() <= rInf.X() + PrtWidth() && rInf.X() <= rInf.Width() ) ;
// #95477# Rotated tab stops get the width of one blank
const sal_uInt16 nDir = rInf.GetFont()->GetOrientation( rInf.GetTxtFrm()->IsVertical() );
@@ -447,10 +450,15 @@ sal_Bool SwTabPortion::PreFormat( SwTxtFormatInfo &rInf )
// In tabulator compatibility mode, we reset the bFull flag
// if the tabulator is at the end of the paragraph and the
// tab stop position is outside the frame:
bool bAtParaEnd = rInf.GetIdx() + GetLen() == rInf.GetTxt().Len();
if ( bFull && bTabCompat &&
rInf.GetIdx() + GetLen() == rInf.GetTxt().Len() &&
( bTabOverflow && ( rInf.IsTabOverflow() || !IsAutoTabStop() ) || bAtParaEnd ) &&
GetTabPos() >= rInf.GetTxtFrm()->Frm().Width() )
{
bFull = sal_False;
if ( bTabOverflow && !IsAutoTabStop() )
rInf.SetTabOverflow( sal_True );
}
break;
}

View File

@@ -1579,6 +1579,7 @@ void SwWW8ImplReader::ImportDop()
rDoc.set(IDocumentSettingAccess::INVERT_BORDER_SPACING, true);
rDoc.set(IDocumentSettingAccess::COLLAPSE_EMPTY_CELL_PARA, true);
rDoc.set(IDocumentSettingAccess::TAB_OVERFLOW, true);
//
// COMPATIBILITY FLAGS END

View File

@@ -1191,6 +1191,7 @@ void SwXMLImport::SetConfigurationSettings(const Sequence < PropertyValue > & aC
aSet.insert(String("PrinterIndependentLayout", RTL_TEXTENCODING_ASCII_US));
aSet.insert(String("PrintEmptyPages", RTL_TEXTENCODING_ASCII_US));
aSet.insert(String("SmallCapsPercentage66", RTL_TEXTENCODING_ASCII_US));
aSet.insert(String("TabOverflow", RTL_TEXTENCODING_ASCII_US));
sal_Int32 nCount = aConfigProps.getLength();
const PropertyValue* pValues = aConfigProps.getConstArray();
@@ -1220,6 +1221,7 @@ void SwXMLImport::SetConfigurationSettings(const Sequence < PropertyValue > & aC
bool bUnixForceZeroExtLeading = false;
bool bUseOldPrinterMetrics = false;
bool bSmallCapsPercentage66 = false;
bool bTabOverflow = false;
OUString sRedlineProtectionKey( RTL_CONSTASCII_USTRINGPARAM( "RedlineProtectionKey" ) );
@@ -1289,6 +1291,8 @@ void SwXMLImport::SetConfigurationSettings(const Sequence < PropertyValue > & aC
bUseOldPrinterMetrics = true;
else if( pValues->Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("SmallCapsPercentage66")) )
bSmallCapsPercentage66 = true;
else if( pValues->Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("TabOverflow")) )
bTabOverflow = true;
}
catch( Exception& )
{
@@ -1442,6 +1446,12 @@ void SwXMLImport::SetConfigurationSettings(const Sequence < PropertyValue > & aC
OUString( RTL_CONSTASCII_USTRINGPARAM("SmallCapsPercentage66") ), makeAny( true ) );
}
if ( !bTabOverflow )
{
xProps->setPropertyValue(
OUString( RTL_CONSTASCII_USTRINGPARAM("TabOverflow") ), makeAny( false ) );
}
Reference < XTextDocument > xTextDoc( GetModel(), UNO_QUERY );
Reference < XText > xText = xTextDoc->getText();
Reference<XUnoTunnel> xTextTunnel( xText, UNO_QUERY);

View File

@@ -123,7 +123,8 @@ enum SwDocumentSettingsPropertyHandles
HANDLE_MATH_BASELINE_ALIGNMENT,
HANDLE_INVERT_BORDER_SPACING,
HANDLE_COLLAPSE_EMPTY_CELL_PARA,
HANDLE_SMALL_CAPS_PERCENTAGE_66
HANDLE_SMALL_CAPS_PERCENTAGE_66,
HANDLE_TAB_OVERFLOW
};
MasterPropertySetInfo * lcl_createSettingsInfo()
@@ -182,6 +183,7 @@ MasterPropertySetInfo * lcl_createSettingsInfo()
{ RTL_CONSTASCII_STRINGPARAM("InvertBorderSpacing"), HANDLE_INVERT_BORDER_SPACING, CPPUTYPE_BOOLEAN, 0, 0},
{ RTL_CONSTASCII_STRINGPARAM("CollapseEmptyCellPara"), HANDLE_COLLAPSE_EMPTY_CELL_PARA, CPPUTYPE_BOOLEAN, 0, 0},
{ RTL_CONSTASCII_STRINGPARAM("SmallCapsPercentage66"), HANDLE_SMALL_CAPS_PERCENTAGE_66, CPPUTYPE_BOOLEAN, 0, 0},
{ RTL_CONSTASCII_STRINGPARAM("TabOverflow"), HANDLE_TAB_OVERFLOW, CPPUTYPE_BOOLEAN, 0, 0},
/*
* As OS said, we don't have a view when we need to set this, so I have to
* find another solution before adding them to this property set - MTG
@@ -709,6 +711,12 @@ void SwXDocumentSettings::_setSingleValue( const comphelper::PropertyInfo & rInf
mpDoc->set(IDocumentSettingAccess::SMALL_CAPS_PERCENTAGE_66, bTmp);
}
break;
case HANDLE_TAB_OVERFLOW:
{
sal_Bool bTmp = *(sal_Bool*)rValue.getValue();
mpDoc->set(IDocumentSettingAccess::TAB_OVERFLOW, bTmp);
}
break;
default:
throw UnknownPropertyException();
}
@@ -1059,6 +1067,12 @@ void SwXDocumentSettings::_getSingleValue( const comphelper::PropertyInfo & rInf
rValue.setValue( &bTmp, ::getBooleanCppuType() );
}
break;
case HANDLE_TAB_OVERFLOW:
{
sal_Bool bTmp = mpDoc->get( IDocumentSettingAccess::TAB_OVERFLOW );
rValue.setValue( &bTmp, ::getBooleanCppuType() );
}
break;
default:
throw UnknownPropertyException();
}