summaryrefslogtreecommitdiff
path: root/patches/dev300/maths_baseline_fix.diff
diff options
context:
space:
mode:
Diffstat (limited to 'patches/dev300/maths_baseline_fix.diff')
-rw-r--r--patches/dev300/maths_baseline_fix.diff832
1 files changed, 0 insertions, 832 deletions
diff --git a/patches/dev300/maths_baseline_fix.diff b/patches/dev300/maths_baseline_fix.diff
deleted file mode 100644
index 9a5873665..000000000
--- a/patches/dev300/maths_baseline_fix.diff
+++ /dev/null
@@ -1,832 +0,0 @@
-diff --git a/sfx2/inc/sfx2/ipclient.hxx b/sfx2/inc/sfx2/ipclient.hxx
-index 141de70..2471323 100644
---- sfx2/inc/sfx2/ipclient.hxx
-+++ sfx2/inc/sfx2/ipclient.hxx
-@@ -101,6 +101,7 @@ public:
- // used in Writer
- // Rectangle PixelObjVisAreaToLogic( const Rectangle & rObjRect ) const;
- // Rectangle LogicObjAreaToPixel( const Rectangle & rRect ) const;
-+ virtual void FormatChanged(); // object format was changed (used for StarMath formulas aligning)
- };
-
- #endif
-diff --git a/sfx2/source/view/ipclient.cxx b/sfx2/source/view/ipclient.cxx
-index a0cd213..a486bc0 100644
---- sfx2/source/view/ipclient.cxx
-+++ sfx2/source/view/ipclient.cxx
-@@ -214,6 +214,7 @@ void SAL_CALL SfxInPlaceClient_Impl::notifyEvent( const document::EventObject& a
-
- if ( m_pClient && aEvent.EventName.equalsAscii("OnVisAreaChanged") && m_nAspect != embed::Aspects::MSOLE_ICON )
- {
-+ m_pClient->FormatChanged(); // for Writer when format of the object is changed with the area
- m_pClient->ViewChanged();
- m_pClient->Invalidate();
- }
-@@ -1074,6 +1075,11 @@ void SfxInPlaceClient::MakeVisible()
- // dummy implementation
- }
-
-+void SfxInPlaceClient::FormatChanged()
-+{
-+ // dummy implementation
-+}
-+
- void SfxInPlaceClient::DeactivateObject()
- {
- if ( GetObject().is() )
-diff --git a/starmath/inc/node.hxx b/starmath/inc/node.hxx
-index dabb503..cfa8b2b 100644
---- starmath/inc/node.hxx
-+++ starmath/inc/node.hxx
-@@ -180,6 +180,9 @@ public:
-
- const SmNode * FindTokenAt(USHORT nRow, USHORT nCol) const;
- const SmNode * FindRectClosestTo(const Point &rPoint) const;
-+ // --> 4.7.2010 #i972#
-+ virtual long GetFormulaBaseline() const { return (long)0; } //dummy, used in SmTableNode
-+ // <--
- };
-
-
-@@ -467,6 +470,9 @@ public:
-
- class SmTableNode : public SmStructureNode
- {
-+ // --> 4.7.2010 #i972#
-+ long nFormulaBaseline;
-+ // <--
- public:
- SmTableNode(const SmToken &rNodeToken)
- : SmStructureNode(NTABLE, rNodeToken)
-@@ -476,6 +482,7 @@ public:
- virtual SmNode * GetLeftMost();
-
- virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
-+ long GetFormulaBaseline() const { return nFormulaBaseline; }
- };
-
-
-diff --git a/starmath/source/node.cxx b/starmath/source/node.cxx
-index b243ced..415a8c0 100644
---- starmath/source/node.cxx
-+++ starmath/source/node.cxx
-@@ -758,7 +758,7 @@ void SmTableNode::Arrange(const OutputDevice &rDev, const SmFormat &rFormat)
- }
-
- Point aPos;
-- SmRect::operator = (SmRect(nMaxWidth, 0));
-+ SmRect::operator = (SmRect(nMaxWidth, 1));
- for (i = 0; i < nSize; i++)
- { if (NULL != (pNode = GetSubNode(i)))
- { const SmRect &rNodeRect = pNode->GetRect();
-@@ -774,6 +774,22 @@ void SmTableNode::Arrange(const OutputDevice &rDev, const SmFormat &rFormat)
- ExtendBy(rNodeRect, nSize > 1 ? RCP_NONE : RCP_ARG);
- }
- }
-+ // --> 4.7.2010 #i972#
-+ if (HasBaseline())
-+ nFormulaBaseline = GetBaseline();
-+ else
-+ {
-+ SmTmpDevice aTmpDev ((OutputDevice &) rDev, TRUE);
-+ aTmpDev.SetFont(GetFont());
-+
-+ SmRect aRect = (SmRect(aTmpDev, &rFormat, C2S("a"),
-+ GetFont().GetBorderWidth()));
-+ nFormulaBaseline = GetAlignM();
-+ // move from middle position by constant - distance
-+ // between middle and baseline for single letter
-+ nFormulaBaseline+= aRect.GetBaseline() - aRect.GetAlignM();
-+ }
-+ // <--
- }
-
-
-@@ -813,20 +831,21 @@
- SmTmpDevice aTmpDev ((OutputDevice &) rDev, TRUE);
- aTmpDev.SetFont(GetFont());
-
-- // provide an empty rectangle with alignment parameters for the "current"
-- // font (in order to make "a^1 {}_2^3 a_4" work correct, that is, have the
-- // same sub-/supscript positions.)
-- //! be sure to use a character that has explicitly defined HiAttribut
-- //! line in rect.cxx such as 'a' in order to make 'vec a' look same to
-- //! 'vec {a}'.
-- SmRect::operator = (SmRect(aTmpDev, &rFormat, C2S("a"),
-- GetFont().GetBorderWidth()));
-- // make sure that the rectangle occupies (almost) no space
-- SetWidth(1);
-- SetItalicSpaces(0, 0);
--
- if (nSize < 1)
-+ {
-+ // provide an empty rectangle with alignment parameters for the "current"
-+ // font (in order to make "a^1 {}_2^3 a_4" work correct, that is, have the
-+ // same sub-/supscript positions.)
-+ //! be sure to use a character that has explicitly defined HiAttribut
-+ //! line in rect.cxx such as 'a' in order to make 'vec a' look same to
-+ //! 'vec {a}'.
-+ SmRect::operator = (SmRect(aTmpDev, &rFormat, C2S("a"),
-+ GetFont().GetBorderWidth()));
-+ // make sure that the rectangle occupies (almost) no space
-+ SetWidth(1);
-+ SetItalicSpaces(0, 0);
- return;
-+ }
-
- // make distance depend on font size
- long nDist = (rFormat.GetDistance(DIS_HORIZONTAL) * GetFont().GetSize().Height()) / 100L;
-@@ -834,7 +836,11 @@
- nDist = 0;
-
- Point aPos;
-- for (i = 0; i < nSize; i++)
-+ // copy the first node into LineNode and extend by the others
-+ if (NULL != (pNode = GetSubNode(0)))
-+ SmRect::operator = (pNode->GetRect());
-+
-+ for (i = 1; i < nSize; i++)
- if (NULL != (pNode = GetSubNode(i)))
- {
- aPos = pNode->AlignTo(*this, RP_RIGHT, RHA_CENTER, RVA_BASELINE);
-diff --git a/starmath/source/unomodel.cxx b/starmath/source/unomodel.cxx
-index ea2bcb4..6e49687 100644
---- starmath/source/unomodel.cxx
-+++ starmath/source/unomodel.cxx
-@@ -146,7 +146,8 @@ enum SmModelPropertyHandles
- // --> PB 2004-08-25 #i33095# Security Options
- HANDLE_LOAD_READONLY,
- // <--
-- HANDLE_DIALOG_LIBRARIES // #i73329#
-+ HANDLE_DIALOG_LIBRARIES, // #i73329#
-+ HANDLE_BASELINE // 3.7.2010 #i972#
- };
-
- PropertySetInfo * lcl_createModelPropertyInfo ()
-@@ -217,6 +218,9 @@ PropertySetInfo * lcl_createModelPropertyInfo ()
- // --> PB 2004-08-25 #i33095# Security Options
- { RTL_CONSTASCII_STRINGPARAM( "LoadReadonly" ), HANDLE_LOAD_READONLY, &::getBooleanCppuType(), PROPERTY_NONE, 0 },
- // <--
-+ // --> 3.7.2010 #i972#
-+ { RTL_CONSTASCII_STRINGPARAM( "BaseLine"), HANDLE_BASELINE, &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, 0},
-+ // <--
- { NULL, 0, 0, NULL, 0, 0 }
- };
- PropertySetInfo *pInfo = new PropertySetInfo ( aModelPropertyInfoMap );
-@@ -844,6 +848,21 @@ void SmModel::_getPropertyValues( const PropertyMapEntry **ppEntries, Any *pValu
- break;
- }
- // <--
-+ // --> 3.7.2010 #i972#
-+ case HANDLE_BASELINE:
-+ {
-+ if ( !pDocSh->pTree )
-+ pDocSh->Parse();
-+ if ( pDocSh->pTree )
-+ {
-+ if ( !pDocSh->IsFormulaArranged() )
-+ pDocSh->ArrangeFormula();
-+
-+ *pValue <<= static_cast<sal_Int32>( pDocSh->pTree->GetFormulaBaseline() );
-+ }
-+ }
-+ break;
-+ // <--
- }
- }
- }
-diff --git a/sw/inc/editsh.hxx b/sw/inc/editsh.hxx
-index c352cc7..29542a6 100644
---- sw/inc/editsh.hxx
-+++ sw/inc/editsh.hxx
-@@ -933,6 +933,9 @@ public:
- // character attribut dialog.
- USHORT GetScalingOfSelectedText() const;
-
-+ // changes height of formulas in selection (used when height of text is changed)
-+ void ChangeFormulaInSelFontSize( const SvxFontHeightItem *pHItem ) const;
-+
- // ctor/dtor
- SwEditShell( SwDoc&, Window*, const SwViewOption *pOpt = 0 );
- // verkleideter Copy-Constructor
-diff --git a/sw/inc/fesh.hxx b/sw/inc/fesh.hxx
-index 0318f99..7fafbca 100644
---- sw/inc/fesh.hxx
-+++ sw/inc/fesh.hxx
-@@ -543,6 +543,18 @@ public:
-
- BOOL ReplaceSdrObj( const String& rGrfName, const String& rFltName,
- const Graphic* pGrf = 0 );
-+ // --> #i972#
-+ // Sets the format of the object to be aligned baseline to baseline
-+ // for starmath formulas aligned as character.
-+ // only set the SwFrmFmt if SwFlyFrm for the object doesn't exist yet
-+ void AlignFormula( const ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject >& xObj , SwFrmFmt* pFrmFmt = 0 );
-+ // bSetAnchor determines whether the anchor is to be set to 'as char'
-+ // then for starmath formulas anchored 'as char' it alignes it baseline to baseline
-+ // changing the previous vertical orientation
-+ void AlignFormulaToBaseline( const ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject >& xObj , bool bSetAnchor = FALSE );
-+ // aligns all formulas with anchor 'as char' to baseline
-+ void AlignAllFormulasToBaseline();
-+ // <--
-
- //------------------------------------------
-
-diff --git a/sw/inc/ndole.hxx b/sw/inc/ndole.hxx
-index e3074e4..9ff19de 100644
---- sw/inc/ndole.hxx
-+++ sw/inc/ndole.hxx
-@@ -149,7 +149,8 @@ public:
- // --> OD 2009-03-05 #i99665#
- bool IsChart() const;
- // <--
--
-+ //Gets the position of Ole Object in the text node it lies in
-+ const SwPosition* GetOlePosInTxtNode() const;
- #ifndef _FESHVIEW_ONLY_INLINE_NEEDED
- const String& GetChartTblName() const { return sChartTblName; }
- void SetChartTblName( const String& rNm ) { sChartTblName = rNm; }
-diff --git a/sw/inc/pam.hxx b/sw/inc/pam.hxx
-index 3227b89..4e71ccb 100644
---- sw/inc/pam.hxx
-+++ sw/inc/pam.hxx
-@@ -259,7 +259,7 @@ public:
- // etwas geschuetztes.
- BOOL HasReadonlySel( bool bFormView ) const;
-
-- BOOL ContainsPosition(const SwPosition & rPos)
-+ BOOL ContainsPosition(const SwPosition & rPos) const
- { return *Start() <= rPos && rPos <= *End(); }
-
- static BOOL Overlap(const SwPaM & a, const SwPaM & b);
-diff --git a/sw/inc/swcli.hxx b/sw/inc/swcli.hxx
-index d4fe338..23fa501 100644
---- sw/inc/swcli.hxx
-+++ sw/inc/swcli.hxx
-@@ -53,6 +53,8 @@ public:
- void SetInDoVerb( BOOL bFlag ) { bInDoVerb = bFlag; }
-
- BOOL IsCheckForOLEInCaption() const { return bOldCheckForOLEInCaption; }
-+
-+ virtual void FormatChanged();
- };
-
- #endif
-diff --git a/sw/source/core/doc/poolfmt.cxx b/sw/source/core/doc/poolfmt.cxx
-index 5c85192..8032913 100644
---- sw/source/core/doc/poolfmt.cxx
-+++ sw/source/core/doc/poolfmt.cxx
-@@ -1336,7 +1336,7 @@ SwFmt* SwDoc::GetFmtFromPool( USHORT nId )
- case RES_POOLFRM_FORMEL:
- {
- aSet.Put( SwFmtAnchor( FLY_AS_CHAR ) );
-- aSet.Put( SwFmtVertOrient( 0, text::VertOrientation::CHAR_CENTER, text::RelOrientation::FRAME ) );
-+ aSet.Put( SwFmtVertOrient( 0, text::VertOrientation::NONE, text::RelOrientation::FRAME ) );
- aSet.Put( SvxLRSpaceItem( 114, 114, 0, 0, RES_LR_SPACE ) );
- }
- break;
-diff --git a/sw/source/core/edit/edatmisc.cxx b/sw/source/core/edit/edatmisc.cxx
-index ce48d9f..3d3db79 100644
---- sw/source/core/edit/edatmisc.cxx
-+++ sw/source/core/edit/edatmisc.cxx
-@@ -36,7 +36,12 @@
- #include <swundo.hxx> // fuer die UndoIds
- #include <ndtxt.hxx> // fuer Get-/ChgFmt Set-/GetAttrXXX
-
-+#include <svx/fhgtitem.hxx>
-+#include <hintids.hxx>
-+#include <ndole.hxx>
-+#include <com/sun/star/beans/XPropertySet.hpp>
-
-+using namespace com::sun::star;
-
- /*************************************
- * harte Formatierung (Attribute)
-@@ -159,6 +164,15 @@ void SwEditShell::SetAttr( const SfxItemSet& rSet, USHORT nFlags )
- {
- SET_CURR_SHELL( this );
- StartAllAction();
-+ // -->
-+ //when changing text font-size, Math formulas should be informed
-+ USHORT nWhich = RES_CHRATR_FONTSIZE;
-+ if ( rSet.GetItemState( nWhich ) == SFX_ITEM_SET )
-+ {
-+ const SvxFontHeightItem *pItem = dynamic_cast< const SvxFontHeightItem* >( &rSet.Get( nWhich ));
-+ ChangeFormulaInSelFontSize( pItem );
-+ }
-+ // <--
- SwPaM* pCrsr = GetCrsr();
- if( pCrsr->GetNext() != pCrsr ) // Ring von Cursorn
- {
-@@ -184,6 +198,50 @@ void SwEditShell::SetAttr( const SfxItemSet& rSet, USHORT nFlags )
- EndAllAction();
- }
-
-+void SwEditShell::ChangeFormulaInSelFontSize( const SvxFontHeightItem *pHItem ) const
-+{
-+ if ( !pHItem )
-+ return;
-+ sal_Int32 nHeight = pHItem->GetHeight();
-+ SwStartNode *pStNd;
-+ SwNodeIndex aIdx( *GetNodes().GetEndOfAutotext().StartOfSectionNode(), 1 );
-+ const SwPosition* pPos;
-+
-+ while ( 0 != (pStNd = aIdx.GetNode().GetStartNode()) )
-+ {
-+ aIdx++;
-+ SwNode& rNd = aIdx.GetNode();
-+ if( rNd.IsOLENode() )
-+ {
-+ pPos = (dynamic_cast<SwOLENode&>(rNd)).GetOlePosInTxtNode();
-+ bool bInSelection = false;
-
-+ FOREACHPAM_START( this )
-+ if ( PCURCRSR && PCURCRSR->ContainsPosition( *pPos ) )
-+ bInSelection = true;
-+ FOREACHPAM_END()
-
-+ if( bInSelection )
-+ {
-+ uno::Reference < embed::XEmbeddedObject > xObj = (dynamic_cast<SwOLENode&>(rNd)).GetOLEObj().GetOleRef();
-+ if ( xObj.is() && svt::EmbeddedObjectRef::TryRunningState( xObj ) )
-+ {
-+ uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY );
-+ if ( xSet.is() )
-+ {
-+ try
-+ {
-+ sal_Int16 nVal = nHeight / 20; //was in twips SmModel::_setPropertyValue changes it back
-+ xSet->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("BaseFontHeight") ), uno::makeAny( nVal ) );
-+ }
-+ catch ( uno::Exception& )
-+ {
-+ }
-+ }
-+ }
-+ }
-+ }
-+ aIdx.Assign( *pStNd->EndOfSectionNode(), + 1 );
-+ }
-+}
-
-diff --git a/sw/source/core/edit/makefile.mk b/sw/source/core/edit/makefile.mk
-index 07904b7..828b1d1 100644
---- sw/source/core/edit/makefile.mk
-+++ sw/source/core/edit/makefile.mk
-@@ -44,13 +44,13 @@ EXCEPTIONSFILES=\
- $(SLO)$/eddel.obj \
- $(SLO)$/edlingu.obj \
- $(SLO)$/edfldexp.obj \
-+ $(SLO)$/edatmisc.obj \
- $(SLO)$/edtab.obj
-
- SLOFILES = \
- $(EXCEPTIONSFILES)\
- $(SLO)$/acorrect.obj \
- $(SLO)$/autofmt.obj \
-- $(SLO)$/edatmisc.obj \
- $(SLO)$/edattr.obj \
- $(SLO)$/edfcol.obj \
- $(SLO)$/edfld.obj \
-diff --git a/sw/source/core/frmedt/fefly1.cxx b/sw/source/core/frmedt/fefly1.cxx
-index 1458463..ed859cf 100644
---- sw/source/core/frmedt/fefly1.cxx
-+++ sw/source/core/frmedt/fefly1.cxx
-@@ -72,6 +72,9 @@
- #include <fmtsrnd.hxx>
- #include <editeng/opaqitem.hxx>
- // <--
-+// --> #i972#
-+#include <ndole.hxx>
-+// <--
-
- using ::rtl::OUString;
- using namespace ::com::sun::star;
-@@ -1523,6 +1524,9 @@ Size SwFEShell::RequestObjectResize( const SwRect &rRect, const uno::Reference <
- pFly->ChgRelPos( aTmp );
- }
- }
-+
-+ pFly->SetLastFlyFrmPrtRectPos( pFly->Prt().Pos() ); //stores the value of last Prt rect
-+
- EndAllAction();
-
- return aResult;
-@@ -2161,3 +2165,137 @@ void SwFEShell::SetObjDescription( const String& rDescription )
- }
- }
- // <--
-+// --> 8.7.2010 #i972#
-+void SwFEShell::AlignFormula( const uno::Reference < embed::XEmbeddedObject >& xObj , SwFrmFmt* pFrmFmt )
-+{
-+ SvGlobalName aCLSID( xObj->getClassID() );
-+ BOOL bStarMath = ( SotExchange::IsMath( aCLSID ) != 0 );
-+
-+ if (bStarMath) //check the object is formula
-+ {
-+ SwFlyFrm *pFly = 0;
-+
-+ if ( !pFrmFmt ) //find format if it was not given
-+ {
-+ pFly = FindFlyFrm( xObj );
-+ if ( !pFly )
-+ {
-+ ASSERT( pFly , "No fly frame!" );
-+ return;
-+ }
-+ pFrmFmt = pFly->GetFmt();
-+ }
-+
-+ if (pFrmFmt)
-+ {
-+ if (FLY_IN_CNTNT == pFrmFmt->GetAnchor().GetAnchorId()) // check the anchor is AsChar
-+ {
-+ uno::Any aBaseline;
-+
-+ if( svt::EmbeddedObjectRef::TryRunningState( xObj ) )
-+ {
-+ uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY );
-+ if ( xSet.is() )
-+ {
-+ try
-+ {
-+ aBaseline = xSet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("BaseLine") ) );
-+ }
-+ catch ( uno::Exception& )
-+ {
-+ ASSERT( FALSE , "Baseline could not be retrieved from Starmath!" );
-+ }
-+ }
-+ }
-+
-+ sal_Int32 nBaseline = ::comphelper::getINT32(aBaseline);
-+ const MapMode aSourceMapMode( MAP_100TH_MM );
-+ const MapMode aTargetMapMode( MAP_TWIP );
-+ nBaseline = OutputDevice::LogicToLogic( nBaseline, aSourceMapMode.GetMapUnit(), aTargetMapMode.GetMapUnit() );
-+
-+ ASSERT( (nBaseline > 0) , "Wrong value of Baseline while retrieving from Starmath!" );
-+ //nBaseline must be moved by aPrt position
-+ if ( pFly )
-+ nBaseline += pFly->GetLastFlyFrmPrtRectPos().Y();
-+
-+ const SwFmtVertOrient &rVert = pFrmFmt->GetVertOrient();
-+ SwFmtVertOrient aVert( rVert );
-+ aVert.SetPos( -nBaseline );
-+
-+ pFrmFmt->LockModify();
-+ pFrmFmt->SetFmtAttr( aVert );
-+ pFrmFmt->UnlockModify();
-+ if ( pFly )
-+ pFly->InvalidatePos();
-+ }
-+ }
-+ }
-+}
-+
-+void SwFEShell::AlignFormulaToBaseline( const uno::Reference < embed::XEmbeddedObject >& xObj , bool bSetAnchor )
-+{
-+ SvGlobalName aCLSID( xObj->getClassID() );
-+ BOOL bStarMath = ( SotExchange::IsMath( aCLSID ) != 0 );
-+
-+ if ( bStarMath )
-+ {
-+ SwFlyFrm *pFly = FindFlyFrm( xObj );
-+ if ( !pFly )
-+ {
-+ ASSERT( pFly , "No fly frame!" );
-+ return;
-+ }
-+
-+ SwFrmFmt *pFmt = pFly->GetFmt();
-+ if ( pFmt )
-+ {
-+ if ( bSetAnchor )
-+ {
-+ const SwFmtAnchor &rAnchor = pFmt->GetAnchor();
-+ SwFmtAnchor aAnchor( rAnchor );
-+ aAnchor.SetType( FLY_IN_CNTNT );
-+ pFmt->LockModify();
-+ pFmt->SetFmtAttr( aAnchor );
-+ pFmt->UnlockModify();
-+ }
-+
-+ if ( FLY_IN_CNTNT == pFmt->GetAnchor().GetAnchorId() )
-+ {
-+ const SwFmtVertOrient &rVert = pFmt->GetVertOrient();
-+ SwFmtVertOrient aVert( rVert );
-+ aVert.SetVertOrient( com::sun::star::text::VertOrientation::NONE );
-+ pFmt->LockModify();
-+ pFmt->SetFmtAttr( aVert );
-+ pFmt->UnlockModify();
-+
-+ AlignFormula( xObj );
-+ }
-+ }
-+ }
-+}
-+
-+void SwFEShell::AlignAllFormulasToBaseline()
-+{
-+ StartAllAction();
-+
-+ SwStartNode *pStNd;
-+ SwNodeIndex aIdx( *GetNodes().GetEndOfAutotext().StartOfSectionNode(), 1 );
-+ while ( 0 != (pStNd = aIdx.GetNode().GetStartNode()) )
-+ {
-+ aIdx++;
-+ SwNode& rNd = aIdx.GetNode();
-+ if( rNd.IsOLENode() )
-+ {
-+ const uno::Reference < embed::XEmbeddedObject >& xObj = (dynamic_cast<SwOLENode&>(rNd)).GetOLEObj().GetOleRef();
-+ SvGlobalName aCLSID( xObj->getClassID() );
-+ if ( SotExchange::IsMath( aCLSID ) )
-+ AlignFormulaToBaseline( xObj );
-+ }
-+
-+ aIdx.Assign( *pStNd->EndOfSectionNode(), + 1 );
-+ }
-+
-+ EndAllAction();
-+}
-+//<--
-+
-diff --git a/sw/source/core/inc/flyfrm.hxx b/sw/source/core/inc/flyfrm.hxx
-index f698ff4..0402344 100644
---- sw/source/core/inc/flyfrm.hxx
-+++ sw/source/core/inc/flyfrm.hxx
-@@ -77,6 +77,9 @@ protected:
-
- // OD 2004-05-27 #i26791# - moved to <SwAnchoredObject>
- // Point aRelPos; //Die Relative Position zum Master
-+ Point aLastFlyFrmPrtRectPos; // it stores the previous position of Prt rectangle from RequestObjectResize
-+ // so it can be used to move frames of non-resizable objects to align them correctly
-+ // when they get borders (this is done in SwWrtShell::CalcAndGetScale)
-
- private:
- BOOL bLocked :1; //Cntnt-gebundene Flys muessen derart blockiert werden
-@@ -283,5 +286,9 @@ public:
- @author OD
- */
- virtual bool IsFormatPossible() const;
-+
-+ const Point GetLastFlyFrmPrtRectPos() const { return aLastFlyFrmPrtRectPos; }
-+ void SetLastFlyFrmPrtRectPos( Point aPoint ) { aLastFlyFrmPrtRectPos = aPoint; }
-+
- };
- #endif
-diff --git a/sw/source/core/inc/flyfrms.hxx b/sw/source/core/inc/flyfrms.hxx
-index 10791a4..6c3d18f 100644
---- sw/source/core/inc/flyfrms.hxx
-+++ sw/source/core/inc/flyfrms.hxx
-@@ -188,6 +188,7 @@ class SwFlyInCntFrm : public SwFlyFrm
-
- BOOL bInvalidLayout :1;
- BOOL bInvalidCntnt :1;
-+ bool bPosCalculated :1;
-
- protected:
- virtual void NotifyBackground( SwPageFrm *pPage,
-@@ -237,6 +238,8 @@ public:
- // format of the anchor frame
- virtual void _ActionOnInvalidation( const InvalidationType _nInvalid );
- // <--
-+
-+ void SetPosCalculated( bool bNew ) { bPosCalculated = bNew; }
- };
-
- inline void SwFlyInCntFrm::InvalidateLayout() const
-diff --git a/sw/source/core/layout/fly.cxx b/sw/source/core/layout/fly.cxx
-index 127bc24..ac192d1 100644
---- sw/source/core/layout/fly.cxx
-+++ sw/source/core/layout/fly.cxx
-@@ -121,6 +121,7 @@ SwFlyFrm::SwFlyFrm( SwFlyFrmFmt *pFmt, SwFrm *pAnch ) :
- // aRelPos(),
- pPrevLink( 0 ),
- pNextLink( 0 ),
-+ aLastFlyFrmPrtRectPos( Point(0,0) ),
- bInCnt( FALSE ),
- bAtCnt( FALSE ),
- bLayout( FALSE ),
-diff --git a/sw/source/core/layout/flyincnt.cxx b/sw/source/core/layout/flyincnt.cxx
-index c724779..26a4252 100644
---- sw/source/core/layout/flyincnt.cxx
-+++ sw/source/core/layout/flyincnt.cxx
-@@ -56,6 +56,7 @@ SwFlyInCntFrm::SwFlyInCntFrm( SwFlyFrmFmt *pFmt, SwFrm *pAnch ) :
- SwFlyFrm( pFmt, pAnch )
- {
- bInCnt = bInvalidLayout = bInvalidCntnt = TRUE;
-+ bPosCalculated = FALSE;
- SwTwips nRel = pFmt->GetVertOrient().GetPos();
- // OD 2004-05-27 #i26791# - member <aRelPos> moved to <SwAnchoredObject>
- Point aRelPos;
-@@ -203,6 +204,11 @@ void SwFlyInCntFrm::MakeObjPos()
- if ( !bValidPos )
- {
- bValidPos = TRUE;
-+ // --> let the position be set, only if it was calculated in
-+ // SwAsCharAnchoredObjectPosition::CalcPosition
-+ if ( !bPosCalculated )
-+ return;
-+ // <--
- SwFlyFrmFmt *pFmt = (SwFlyFrmFmt*)GetFmt();
- const SwFmtVertOrient &rVert = pFmt->GetVertOrient();
- //Und ggf. noch die aktuellen Werte im Format updaten, dabei darf
-diff --git a/sw/source/core/objectpositioning/ascharanchoredobjectposition.cxx b/sw/source/core/objectpositioning/ascharanchoredobjectposition.cxx
-index 835ff3b..1ae7981 100644
---- sw/source/core/objectpositioning/ascharanchoredobjectposition.cxx
-+++ sw/source/core/objectpositioning/ascharanchoredobjectposition.cxx
-@@ -328,7 +328,11 @@ void SwAsCharAnchoredObjectPosition::CalcPosition()
- {
- // set new anchor position and relative position
- SwFlyInCntFrm* pFlyInCntFrm = &(const_cast<SwFlyInCntFrm&>(rFlyInCntFrm));
-+ // --> let SwFlyInCnt::MakeObjPos set position only at this place using bPosCalculated
-+ pFlyInCntFrm->SetPosCalculated( TRUE );
- pFlyInCntFrm->SetRefPoint( aAnchorPos, aRelAttr, aRelPos );
-+ pFlyInCntFrm->SetPosCalculated( FALSE );
-+ // <--
- if( nObjWidth != (pFlyInCntFrm->Frm().*fnRect->fnGetWidth)() )
- {
- // recalculate object bound rectangle, if object width has changed.
-diff --git a/sw/source/core/ole/ndole.cxx b/sw/source/core/ole/ndole.cxx
-index ccb2d9e..64961db 100644
---- sw/source/core/ole/ndole.cxx
-+++ sw/source/core/ole/ndole.cxx
-@@ -71,6 +71,7 @@
- #ifndef _COMCORE_HRC
- #include <comcore.hrc>
- #endif
-+#include <layfrm.hxx>
-
- using rtl::OUString;
- using namespace utl;
-@@ -657,6 +658,24 @@ bool SwOLENode::IsChart() const
- }
- // <--
-
-+const SwPosition* SwOLENode::GetOlePosInTxtNode() const
-+{
-+ const SwCntntFrm* pCntntFrm = GetFrm();
-+ if ( pCntntFrm )
-+ {
-+ const SwLayoutFrm *pLayoutFrm = pCntntFrm->GetUpper();
-+ if ( pLayoutFrm )
-+ {
-+ const SwFrmFmt *pFrmFmt = pLayoutFrm->GetFmt();
-+ if ( pFrmFmt )
-+ {
-+ return ( pFrmFmt->GetAnchor().GetCntntAnchor() );
-+ }
-+ }
-+ }
-+ return 0;
-+}
-+
- SwOLEObj::SwOLEObj( const svt::EmbeddedObjectRef& xObj ) :
- pOLENd( 0 ),
- pListener( 0 ),
-diff --git a/sw/source/ui/uiview/swcli.cxx b/sw/source/ui/uiview/swcli.cxx
-index f6415e4..b6890fd 100644
---- sw/source/ui/uiview/swcli.cxx
-+++ sw/source/ui/uiview/swcli.cxx
-@@ -169,3 +169,17 @@ void SwOleClient::MakeVisible()
- const SwWrtShell &rSh = ((SwView*)GetViewShell())->GetWrtShell();
- rSh.MakeObjVisible( GetObject() );
- }
-+
-+void SwOleClient::FormatChanged()
-+{
-+ // --> #i972#
-+ const uno::Reference < embed::XEmbeddedObject >& xObj = GetObject();
-+
-+ SvGlobalName aCLSID( xObj->getClassID() );
-+ if ( SotExchange::IsMath( aCLSID ) )
-+ {
-+ SwWrtShell &rSh = ( dynamic_cast<SwView*>( GetViewShell() ) )->GetWrtShell();
-+ rSh.AlignFormula( xObj );
-+ }
-+ // <--
-+}
-diff --git a/sw/source/ui/wrtsh/makefile.mk b/sw/source/ui/wrtsh/makefile.mk
-index 66de5cb..7a79ed2 100644
---- sw/source/ui/wrtsh/makefile.mk
-+++ sw/source/ui/wrtsh/makefile.mk
-@@ -36,6 +36,8 @@ TARGET=wrtsh
- .INCLUDE : settings.mk
- .INCLUDE : $(PRJ)$/inc$/sw.mk
-
-+INCPRE+=$(PRJ)$/source$/core$/inc
-+
- # --- Files --------------------------------------------------------
-
- SRS1NAME=$(TARGET)
-diff --git a/sw/source/ui/wrtsh/wrtsh1.cxx b/sw/source/ui/wrtsh/wrtsh1.cxx
-index a7cd77a..d1f8514 100644
---- sw/source/ui/wrtsh/wrtsh1.cxx
-+++ sw/source/ui/wrtsh/wrtsh1.cxx
-@@ -124,6 +124,10 @@
-
- #include "PostItMgr.hxx"
-
-+#include <flyfrm.hxx>
-+#include <svx/fhgtitem.hxx>
-+#include <ndole.hxx>
-+
- using namespace sw::mark;
- using namespace com::sun::star;
-
-@@ -493,7 +497,8 @@ void SwWrtShell::InsertObject( const svt::EmbeddedObjectRef& xRef, SvGlobalName
-
- if ( xObj.is() )
- {
-- if( InsertOleObject( xObj ) && bActivate && bDoVerb )
-+ BOOL bActivate2 = InsertOleObject( xObj );
-+ if( bActivate && bDoVerb )
- {
- SfxInPlaceClient* pClient = GetView().FindIPClient( xObj.GetObject(), &GetView().GetEditWin() );
- if ( !pClient )
-@@ -517,7 +522,8 @@ void SwWrtShell::InsertObject( const svt::EmbeddedObjectRef& xRef, SvGlobalName
-
- //#50270# Error brauchen wir nicht handeln, das erledigt das
- //DoVerb in der SfxViewShell
-- pClient->DoVerb( SVVERB_SHOW );
-+ if ( bActivate2 )
-+ pClient->DoVerb( SVVERB_SHOW );
-
- // TODO/LATER: set document name - should be done in Client
- //if ( !ERRCODE_TOERROR( nErr ) )
-@@ -614,6 +620,44 @@ BOOL SwWrtShell::InsertOleObject( const svt::EmbeddedObjectRef& xRef, SwFlyFrmFm
- aFrmMgr.SetSize( aSz );
- SwFlyFrmFmt *pFmt = SwFEShell::InsertObject( xRef, &aFrmMgr.GetAttrSet() );
-
-+ // --> #i972#
-+ if ( bStarMath ) //sets font-hight and baseline
-+ {
-+ const SwNode &rNd = *GetCrsr()->GetNode();
-+ if ( rNd.IsOLENode() )
-+ {
-+ const SwPosition *pPos = (dynamic_cast<const SwOLENode&>(rNd)).GetOlePosInTxtNode();
-+ const SwNode &rNode = pPos->nNode.GetNode();
-+ const SwIndex &rIdx = pPos->nContent;
-+ if( rNode.IsTxtNode() )
-+ {
-+ SfxItemSet aSet( pDoc->GetAttrPool() , RES_CHRATR_BEGIN, RES_CHRATR_END );
-+ if ( ((SwTxtNode&)rNode).GetAttr(aSet, rIdx.GetIndex(), rIdx.GetIndex()) )
-+ {
-+ sal_Int32 nHeight = ( dynamic_cast<const SvxFontHeightItem&>( aSet.Get( RES_CHRATR_FONTSIZE) ) ).GetHeight();
-+ uno::Reference < embed::XEmbeddedObject > xObj = xRef.GetObject();
-+ if ( xObj.is() && svt::EmbeddedObjectRef::TryRunningState( xObj ) )
-+ {
-+ uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY );
-+ if ( xSet.is() )
-+ {
-+ try
-+ {
-+ sal_Int16 nVal = nHeight / 20;
-+ xSet->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("BaseFontHeight") ), uno::makeAny( nVal ) );
-+ }
-+ catch ( uno::Exception& )
-+ {
-+ }
-+ }
-+ }
-+ }
-+ }
-+ }
-+ AlignFormula( xRef.GetObject() , pFmt );
-+ }
-+ // <--
-+
- if (pFlyFrmFmt)
- *pFlyFrmFmt = pFmt;
-
-@@ -774,6 +818,8 @@ void SwWrtShell::CalcAndSetScale( svt::EmbeddedObjectRef& xObj,
- if ( (embed::EmbedMisc::EMBED_ACTIVATEIMMEDIATELY & nMisc) || bLinkingChart
- // TODO/LATER: ResizeOnPrinterChange
- //|| SVOBJ_MISCSTATUS_RESIZEONPRINTERCHANGE & xObj->GetMiscStatus()
-+ || nMisc & embed::EmbedMisc::EMBED_NEVERRESIZE // non-resizable objects need to be
-+ // set the size back by this method
- )
- {
- pCli = new SwOleClient( &GetView(), &GetView().GetEditWin(), xObj );
-@@ -884,6 +930,21 @@ void SwWrtShell::CalcAndSetScale( svt::EmbeddedObjectRef& xObj,
-
- if ( bUseObjectSize )
- {
-+ // --> this moves non-resizable object so that when adding borders the baseline remains the same
-+ const SwFlyFrm *pFly = GetCurrFlyFrm();
-+ if ( pFly )
-+ {
-+ const Point aPoint = pFly->GetLastFlyFrmPrtRectPos();
-+ SwRect aRect( pFlyPrtRect ? *pFlyPrtRect
-+ : GetAnyCurRect( RECT_FLY_PRT_EMBEDDED, 0, xObj.GetObject() ));
-+ aArea += aPoint - aRect.Pos();
-+ }
-+ else
-+ {
-+ ASSERT( false , "Could not find fly frame." );
-+ }
-+ // <--
-+
- aArea.Width ( _aVisArea.Width() );
- aArea.Height( _aVisArea.Height() );
- RequestObjectResize( aArea, xObj.GetObject() );