summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens-Heiner Rechtien <hr@openoffice.org>2009-03-16 12:55:29 +0000
committerJens-Heiner Rechtien <hr@openoffice.org>2009-03-16 12:55:29 +0000
commit6babb44bc4867fab342516ea15d140010290e4b6 (patch)
tree98454cecbb56d4d388faee851473e346542effc2
parentd00bedc000cc04bb4ab0f24c79a76da6a6474292 (diff)
CWS-TOOLING: integrate CWS calc31stopper3
2009-03-12 17:41:49 +0100 er r269429 : #i100135# reference (position and size) never changes for external references when inserting/deleting/moving cells 2009-03-12 15:29:31 +0100 dr r269424 : #i10000# missing parentheses 2009-03-12 15:15:11 +0100 dr r269422 : #i100148# handle empty text shapes
-rw-r--r--sc/inc/token.hxx4
-rw-r--r--sc/source/core/tool/compiler.cxx62
-rw-r--r--sc/source/core/tool/token.cxx20
-rw-r--r--sc/source/filter/excel/xiescher.cxx69
-rw-r--r--sc/source/filter/xcl97/xcl97rec.cxx3
5 files changed, 101 insertions, 57 deletions
diff --git a/sc/inc/token.hxx b/sc/inc/token.hxx
index bf804bd02..ab6a83c2c 100644
--- a/sc/inc/token.hxx
+++ b/sc/inc/token.hxx
@@ -205,6 +205,8 @@ public:
virtual const String& GetString() const;
virtual const ScSingleRefData& GetSingleRef() const;
virtual ScSingleRefData& GetSingleRef();
+ virtual void CalcAbsIfRel( const ScAddress& );
+ virtual void CalcRelFromAbs( const ScAddress& );
virtual BOOL operator==( const formula::FormulaToken& rToken ) const;
virtual FormulaToken* Clone() const { return new ScExternalSingleRefToken(*this); }
};
@@ -231,6 +233,8 @@ public:
virtual ScSingleRefData& GetSingleRef2();
virtual const ScComplexRefData& GetDoubleRef() const;
virtual ScComplexRefData& GetDoubleRef();
+ virtual void CalcAbsIfRel( const ScAddress& );
+ virtual void CalcRelFromAbs( const ScAddress& );
virtual BOOL operator==( const formula::FormulaToken& rToken ) const;
virtual FormulaToken* Clone() const { return new ScExternalDoubleRefToken(*this); }
};
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index 6b66d8ea8..08eceeb83 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -4088,32 +4088,44 @@ ScRangeData* ScCompiler::UpdateReference(UpdateRefMode eUpdateRefMode,
else if( t->GetType() != svIndex ) // it may be a DB area!!!
{
t->CalcAbsIfRel( rOldPos );
- if ( t->GetType() == svSingleRef || t->GetType() == svExternalSingleRef )
+ switch (t->GetType())
{
- if ( ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos,
- r, nDx, nDy, nDz,
- SingleDoubleRefModifier( t->GetSingleRef() ).Ref() )
- != UR_NOTHING
- )
- rChanged = TRUE;
- }
- else
- {
- ScComplexRefData& rRef = t->GetDoubleRef();
- SCCOL nCols = rRef.Ref2.nCol - rRef.Ref1.nCol;
- SCROW nRows = rRef.Ref2.nRow - rRef.Ref1.nRow;
- SCTAB nTabs = rRef.Ref2.nTab - rRef.Ref1.nTab;
- if ( ScRefUpdate::Update( pDoc, eUpdateRefMode, aPos,
- r, nDx, nDy, nDz, t->GetDoubleRef() )
- != UR_NOTHING
- )
- {
- rChanged = TRUE;
- if (rRef.Ref2.nCol - rRef.Ref1.nCol != nCols ||
- rRef.Ref2.nRow - rRef.Ref1.nRow != nRows ||
- rRef.Ref2.nTab - rRef.Ref1.nTab != nTabs)
- rRefSizeChanged = TRUE;
- }
+ case svExternalSingleRef:
+ case svExternalDoubleRef:
+ // External references never change their positioning
+ // nor point to parts that will be removed or expanded.
+ // In fact, calling ScRefUpdate::Update() for URM_MOVE
+ // may have negative side effects. Simply adapt
+ // relative references to the new position.
+ t->CalcRelFromAbs( aPos);
+ break;
+ case svSingleRef:
+ {
+ if ( ScRefUpdate::Update( pDoc, eUpdateRefMode,
+ aPos, r, nDx, nDy, nDz,
+ SingleDoubleRefModifier(
+ t->GetSingleRef()).Ref())
+ != UR_NOTHING)
+ rChanged = TRUE;
+ }
+ break;
+ default:
+ {
+ ScComplexRefData& rRef = t->GetDoubleRef();
+ SCCOL nCols = rRef.Ref2.nCol - rRef.Ref1.nCol;
+ SCROW nRows = rRef.Ref2.nRow - rRef.Ref1.nRow;
+ SCTAB nTabs = rRef.Ref2.nTab - rRef.Ref1.nTab;
+ if ( ScRefUpdate::Update( pDoc, eUpdateRefMode,
+ aPos, r, nDx, nDy, nDz,
+ t->GetDoubleRef()) != UR_NOTHING)
+ {
+ rChanged = TRUE;
+ if (rRef.Ref2.nCol - rRef.Ref1.nCol != nCols ||
+ rRef.Ref2.nRow - rRef.Ref1.nRow != nRows ||
+ rRef.Ref2.nTab - rRef.Ref1.nTab != nTabs)
+ rRefSizeChanged = TRUE;
+ }
+ }
}
}
}
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index 8d25fa72b..e13d8555d 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -883,6 +883,16 @@ ScSingleRefData& ScExternalSingleRefToken::GetSingleRef()
return maSingleRef;
}
+void ScExternalSingleRefToken::CalcAbsIfRel( const ScAddress& rPos )
+{
+ maSingleRef.CalcAbsIfRel( rPos );
+}
+
+void ScExternalSingleRefToken::CalcRelFromAbs( const ScAddress& rPos )
+{
+ maSingleRef.CalcRelFromAbs( rPos );
+}
+
BOOL ScExternalSingleRefToken::operator ==( const FormulaToken& r ) const
{
if (!FormulaToken::operator==(r))
@@ -959,6 +969,16 @@ ScComplexRefData& ScExternalDoubleRefToken::GetDoubleRef()
return maDoubleRef;
}
+void ScExternalDoubleRefToken::CalcAbsIfRel( const ScAddress& rPos )
+{
+ maDoubleRef.CalcAbsIfRel( rPos );
+}
+
+void ScExternalDoubleRefToken::CalcRelFromAbs( const ScAddress& rPos )
+{
+ maDoubleRef.CalcRelFromAbs( rPos );
+}
+
BOOL ScExternalDoubleRefToken::operator ==( const FormulaToken& r ) const
{
if (!ScToken::operator==(r))
diff --git a/sc/source/filter/excel/xiescher.cxx b/sc/source/filter/excel/xiescher.cxx
index c1fc0d14b..0e1b251f4 100644
--- a/sc/source/filter/excel/xiescher.cxx
+++ b/sc/source/filter/excel/xiescher.cxx
@@ -1414,41 +1414,48 @@ void XclImpTextObj::DoProcessSdrObj( SdrObject& rSdrObj ) const
// plain text
pTextObj->NbcSetText( maTextData.mxString->GetText() );
}
- }
- // horizontal text alignment
- SvxAdjust eHorAlign = SVX_ADJUST_LEFT;
- switch( maTextData.maData.GetHorAlign() )
- {
- case EXC_OBJ_HOR_LEFT: eHorAlign = SVX_ADJUST_LEFT; break;
- case EXC_OBJ_HOR_CENTER: eHorAlign = SVX_ADJUST_CENTER; break;
- case EXC_OBJ_HOR_RIGHT: eHorAlign = SVX_ADJUST_RIGHT; break;
- case EXC_OBJ_HOR_JUSTIFY: eHorAlign = SVX_ADJUST_BLOCK; break;
- }
- rSdrObj.SetMergedItem( SvxAdjustItem( eHorAlign, EE_PARA_JUST ) );
+ /* #i96858# Do not apply any formatting if there is no text.
+ SdrObjCustomShape::SetVerticalWriting (initiated from
+ SetMergedItem) calls SdrTextObj::ForceOutlinerParaObject which
+ ensures that we can erroneously write a ClientTextbox record
+ (with no content) while exporting to XLS, which can cause a
+ corrupted exported document. */
- // vertical text alignment
- SdrTextVertAdjust eVerAlign = SDRTEXTVERTADJUST_TOP;
- switch( maTextData.maData.GetVerAlign() )
- {
- case EXC_OBJ_VER_TOP: eVerAlign = SDRTEXTVERTADJUST_TOP; break;
- case EXC_OBJ_VER_CENTER: eVerAlign = SDRTEXTVERTADJUST_CENTER; break;
- case EXC_OBJ_VER_BOTTOM: eVerAlign = SDRTEXTVERTADJUST_BOTTOM; break;
- case EXC_OBJ_VER_JUSTIFY: eVerAlign = SDRTEXTVERTADJUST_BLOCK; break;
- }
- rSdrObj.SetMergedItem( SdrTextVertAdjustItem( eVerAlign ) );
+ // horizontal text alignment
+ SvxAdjust eHorAlign = SVX_ADJUST_LEFT;
+ switch( maTextData.maData.GetHorAlign() )
+ {
+ case EXC_OBJ_HOR_LEFT: eHorAlign = SVX_ADJUST_LEFT; break;
+ case EXC_OBJ_HOR_CENTER: eHorAlign = SVX_ADJUST_CENTER; break;
+ case EXC_OBJ_HOR_RIGHT: eHorAlign = SVX_ADJUST_RIGHT; break;
+ case EXC_OBJ_HOR_JUSTIFY: eHorAlign = SVX_ADJUST_BLOCK; break;
+ }
+ rSdrObj.SetMergedItem( SvxAdjustItem( eHorAlign, EE_PARA_JUST ) );
- // orientation (this is only a fake, drawing does not support real text orientation)
- namespace csst = ::com::sun::star::text;
- csst::WritingMode eWriteMode = csst::WritingMode_LR_TB;
- switch( maTextData.maData.mnOrient )
- {
- case EXC_OBJ_ORIENT_NONE: eWriteMode = csst::WritingMode_LR_TB; break;
- case EXC_OBJ_ORIENT_STACKED: eWriteMode = csst::WritingMode_TB_RL; break;
- case EXC_OBJ_ORIENT_90CCW: eWriteMode = csst::WritingMode_TB_RL; break;
- case EXC_OBJ_ORIENT_90CW: eWriteMode = csst::WritingMode_TB_RL; break;
+ // vertical text alignment
+ SdrTextVertAdjust eVerAlign = SDRTEXTVERTADJUST_TOP;
+ switch( maTextData.maData.GetVerAlign() )
+ {
+ case EXC_OBJ_VER_TOP: eVerAlign = SDRTEXTVERTADJUST_TOP; break;
+ case EXC_OBJ_VER_CENTER: eVerAlign = SDRTEXTVERTADJUST_CENTER; break;
+ case EXC_OBJ_VER_BOTTOM: eVerAlign = SDRTEXTVERTADJUST_BOTTOM; break;
+ case EXC_OBJ_VER_JUSTIFY: eVerAlign = SDRTEXTVERTADJUST_BLOCK; break;
+ }
+ rSdrObj.SetMergedItem( SdrTextVertAdjustItem( eVerAlign ) );
+
+ // orientation (this is only a fake, drawing does not support real text orientation)
+ namespace csst = ::com::sun::star::text;
+ csst::WritingMode eWriteMode = csst::WritingMode_LR_TB;
+ switch( maTextData.maData.mnOrient )
+ {
+ case EXC_OBJ_ORIENT_NONE: eWriteMode = csst::WritingMode_LR_TB; break;
+ case EXC_OBJ_ORIENT_STACKED: eWriteMode = csst::WritingMode_TB_RL; break;
+ case EXC_OBJ_ORIENT_90CCW: eWriteMode = csst::WritingMode_TB_RL; break;
+ case EXC_OBJ_ORIENT_90CW: eWriteMode = csst::WritingMode_TB_RL; break;
+ }
+ rSdrObj.SetMergedItem( SvxWritingModeItem( eWriteMode, SDRATTR_TEXTDIRECTION ) );
}
- rSdrObj.SetMergedItem( SvxWritingModeItem( eWriteMode, SDRATTR_TEXTDIRECTION ) );
}
// base class processing
XclImpRectObj::DoProcessSdrObj( rSdrObj );
diff --git a/sc/source/filter/xcl97/xcl97rec.cxx b/sc/source/filter/xcl97/xcl97rec.cxx
index a89d8739a..1291998b2 100644
--- a/sc/source/filter/xcl97/xcl97rec.cxx
+++ b/sc/source/filter/xcl97/xcl97rec.cxx
@@ -705,7 +705,8 @@ void XclTxo::SaveCont( XclExpStream& rStrm )
{
DBG_ASSERT( mpString.get(), "XclTxo::SaveCont - missing string" );
- sal_uInt16 nRunLen = 8 * mpString->GetFormatsCount();
+ // #i96858# do not save existing string formatting if text is empty
+ sal_uInt16 nRunLen = mpString->IsEmpty() ? 0 : (8 * mpString->GetFormatsCount());
// alignment
sal_uInt16 nFlags = 0;
::insert_value( nFlags, mnHorAlign, 1, 3 );