libreoffice/openoffice.org-3.1.0.ooo102061.sc.cellanchoring.patch

1765 lines
77 KiB
Diff

diff -ru sc.orig/inc/document.hxx sc/inc/document.hxx
--- sc.orig/inc/document.hxx 2009-06-04 12:39:48.000000000 +0100
+++ sc/inc/document.hxx 2009-06-04 12:40:23.000000000 +0100
@@ -1319,8 +1319,8 @@
void RestorePrintRanges( const ScPrintRangeSaver& rSaver );
SC_DLLPUBLIC Rectangle GetMMRect( SCCOL nStartCol, SCROW nStartRow,
- SCCOL nEndCol, SCROW nEndRow, SCTAB nTab );
- SC_DLLPUBLIC ScRange GetRange( SCTAB nTab, const Rectangle& rMMRect );
+ SCCOL nEndCol, SCROW nEndRow, SCTAB nTab ) const;
+ SC_DLLPUBLIC ScRange GetRange( SCTAB nTab, const Rectangle& rMMRect ) const;
void UpdStlShtPtrsFrmNms();
void StylesToNames();
diff -ru sc.orig/inc/drwlayer.hxx sc/inc/drwlayer.hxx
--- sc.orig/inc/drwlayer.hxx 2009-06-04 12:39:49.000000000 +0100
+++ sc/inc/drwlayer.hxx 2009-06-04 12:40:23.000000000 +0100
@@ -107,12 +107,10 @@
BOOL bHyphenatorSet;
private:
- void MoveAreaTwips( SCTAB nTab, const Rectangle& rArea, const Point& rMove,
- const Point& rTopLeft );
void MoveCells( SCTAB nTab, SCCOL nCol1,SCROW nRow1, SCCOL nCol2,SCROW nRow2,
SCsCOL nDx,SCsROW nDy, bool bUpdateNoteCaptionPos );
- void RecalcPos( SdrObject* pObj, const ScDrawObjData& rData, bool bNegativePage, bool bUpdateNoteCaptionPos );
+ void RecalcPos( SdrObject* pObj, ScDrawObjData& rData, bool bNegativePage, bool bUpdateNoteCaptionPos );
public:
ScDrawLayer( ScDocument* pDocument, const String& rName );
@@ -194,8 +192,11 @@
void EnsureGraphicNames();
// Verankerung setzen und ermitteln
- static void SetAnchor( SdrObject*, ScAnchorType );
- static ScAnchorType GetAnchor( const SdrObject* );
+ static void SetPageAnchored( SdrObject& );
+ static void SetCellAnchored( SdrObject&, const ScDrawObjData &rAnchor );
+ static void SetCellAnchoredFromPosition( SdrObject &rObj, const ScDocument &rDoc, SCTAB nTab );
+ static void UpdateCellAnchorFromPositionEnd( SdrObject &rObj, const ScDocument &rDoc, SCTAB nTab );
+ static ScAnchorType GetAnchorType( const SdrObject& );
// Positionen fuer Detektivlinien
static ScDrawObjData* GetObjData( SdrObject* pObj, BOOL bCreate=FALSE );
diff -ru sc.orig/inc/userdat.hxx sc/inc/userdat.hxx
--- sc.orig/inc/userdat.hxx 2009-06-04 12:39:49.000000000 +0100
+++ sc/inc/userdat.hxx 2009-06-04 12:40:23.000000000 +0100
@@ -63,12 +63,15 @@
public:
ScAddress maStart;
ScAddress maEnd;
+ Point maStartOffset;
+ Point maEndOffset;
bool mbNote;
+ Rectangle maLastRect;
explicit ScDrawObjData();
private:
- virtual ScDrawObjData* Clone( SdrObject* pObj ) const;
+ virtual ScDrawObjData* Clone( SdrObject* pObj ) const;
};
//-------------------------------------------------------------------------
diff -ru sc.orig/source/core/data/documen3.cxx sc/source/core/data/documen3.cxx
--- sc.orig/source/core/data/documen3.cxx 2009-06-04 12:39:09.000000000 +0100
+++ sc/source/core/data/documen3.cxx 2009-06-04 12:40:23.000000000 +0100
@@ -1605,7 +1605,7 @@
return bAdded;
}
-ScRange ScDocument::GetRange( SCTAB nTab, const Rectangle& rMMRect )
+ScRange ScDocument::GetRange( SCTAB nTab, const Rectangle& rMMRect ) const
{
ScTable* pTable = pTab[nTab];
if (!pTable)
@@ -1879,7 +1879,7 @@
}
Rectangle ScDocument::GetMMRect( SCCOL nStartCol, SCROW nStartRow,
- SCCOL nEndCol, SCROW nEndRow, SCTAB nTab )
+ SCCOL nEndCol, SCROW nEndRow, SCTAB nTab ) const
{
if (!ValidTab(nTab) || !pTab[nTab])
{
diff -ru sc.orig/source/core/data/drwlayer.cxx sc/source/core/data/drwlayer.cxx
--- sc.orig/source/core/data/drwlayer.cxx 2009-06-04 12:39:09.000000000 +0100
+++ sc/source/core/data/drwlayer.cxx 2009-06-05 12:28:12.000000000 +0100
@@ -69,6 +69,9 @@
#include <vcl/svapp.hxx>
#include <unotools/ucbstreamhelper.hxx>
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
+
#include "drwlayer.hxx"
#include "drawpage.hxx"
#include "global.hxx"
@@ -539,7 +542,41 @@
}
}
-void ScDrawLayer::RecalcPos( SdrObject* pObj, const ScDrawObjData& rData, bool bNegativePage, bool bUpdateNoteCaptionPos )
+namespace
+{
+ //Can't have a zero width dimension
+ Rectangle lcl_makeSafeRectangle(const Rectangle &rNew)
+ {
+ Rectangle aRect = rNew;
+ if (aRect.Bottom() == aRect.Top())
+ aRect.Bottom() = aRect.Top()+1;
+ if (aRect.Right() == aRect.Left())
+ aRect.Right() = aRect.Left()+1;
+ return aRect;
+ }
+
+ Point lcl_calcAvailableDiff(ScDocument &rDoc, SCCOL nCol, SCROW nRow, SCTAB nTab, const Point &aWantedDiff)
+ {
+ Point aAvailableDiff(aWantedDiff);
+ long nHeight = rDoc.GetRowHeight( nRow, nTab ) * HMM_PER_TWIPS;
+ long nWidth = rDoc.GetColWidth( nCol, nTab ) * HMM_PER_TWIPS;
+ if (aAvailableDiff.Y() > nHeight)
+ aAvailableDiff.Y() = nHeight;
+ if (aAvailableDiff.X() > nWidth)
+ aAvailableDiff.X() = nWidth;
+ return aAvailableDiff;
+ }
+
+ Rectangle lcl_UpdateCalcPoly(basegfx::B2DPolygon &rCalcPoly, int nWhichPoint, const Point &rPos)
+ {
+ rCalcPoly.setB2DPoint(nWhichPoint, basegfx::B2DPoint(rPos.X(), rPos.Y()));
+ basegfx::B2DRange aRange(basegfx::tools::getRange(rCalcPoly));
+ return Rectangle(aRange.getMinX(), aRange.getMinY(),
+ aRange.getMaxX(), aRange.getMaxY());
+ }
+}
+
+void ScDrawLayer::RecalcPos( SdrObject* pObj, ScDrawObjData& rData, bool bNegativePage, bool bUpdateNoteCaptionPos )
{
DBG_ASSERT( pDoc, "ScDrawLayer::RecalcPos - missing document" );
if( !pDoc )
@@ -578,6 +615,8 @@
if( bCircle )
{
+ rData.maLastRect = pObj->GetLogicRect();
+
Point aPos( pDoc->GetColOffset( nCol1, nTab1 ), pDoc->GetRowOffset( nRow1, nTab1 ) );
TwipsToMM( aPos.X() );
TwipsToMM( aPos.Y() );
@@ -598,11 +637,18 @@
{
if (bRecording)
AddCalcUndo( new SdrUndoGeoObj( *pObj ) );
- pObj->SetLogicRect(aRect);
+ rData.maLastRect = lcl_makeSafeRectangle(aRect);
+ pObj->SetLogicRect(rData.maLastRect);
}
}
else if( bArrow )
{
+ rData.maLastRect = pObj->GetLogicRect();
+ basegfx::B2DPolygon aCalcPoly;
+ Point aOrigStartPos(pObj->GetPoint(0));
+ Point aOrigEndPos(pObj->GetPoint(1));
+ aCalcPoly.append(basegfx::B2DPoint(aOrigStartPos.X(), aOrigStartPos.Y()));
+ aCalcPoly.append(basegfx::B2DPoint(aOrigEndPos.X(), aOrigEndPos.Y()));
//! nicht mehrere Undos fuer ein Objekt erzeugen (hinteres kann dann weggelassen werden)
SCCOL nLastCol;
@@ -623,6 +669,8 @@
{
if (bRecording)
AddCalcUndo( new SdrUndoGeoObj( *pObj ) );
+
+ rData.maLastRect = lcl_UpdateCalcPoly(aCalcPoly, 0, aStartPos);
pObj->SetPoint( aStartPos, 0 );
}
@@ -637,6 +685,8 @@
{
if (bRecording)
AddCalcUndo( new SdrUndoGeoObj( *pObj ) );
+
+ rData.maLastRect = lcl_UpdateCalcPoly(aCalcPoly, 1, aEndPos);
pObj->SetPoint( aEndPos, 1 );
}
}
@@ -657,6 +707,8 @@
{
if (bRecording)
AddCalcUndo( new SdrUndoGeoObj( *pObj ) );
+
+ rData.maLastRect = lcl_UpdateCalcPoly(aCalcPoly, 1, aEndPos);
pObj->SetPoint( aEndPos, 1 );
}
@@ -673,45 +725,68 @@
{
if (bRecording)
AddCalcUndo( new SdrUndoGeoObj( *pObj ) );
+
+ rData.maLastRect = lcl_UpdateCalcPoly(aCalcPoly, 0, aStartPos);
pObj->SetPoint( aStartPos, 0 );
}
}
}
}
- else // Referenz-Rahmen
+ else
{
+ bool bCanResize = bValid2 && !pObj->IsResizeProtect();
+
+ //First time positioning, must be able to at least move it
+ if (rData.maLastRect.IsEmpty())
+ rData.maLastRect = pObj->GetLogicRect();
+
DBG_ASSERT( bValid1, "ScDrawLayer::RecalcPos - invalid start position" );
Point aPos( pDoc->GetColOffset( nCol1, nTab1 ), pDoc->GetRowOffset( nRow1, nTab1 ) );
TwipsToMM( aPos.X() );
TwipsToMM( aPos.Y() );
+ aPos += lcl_calcAvailableDiff(*pDoc, nCol1, nRow1, nTab1, rData.maStartOffset);
- if( bValid2 )
+ if( bCanResize )
{
- Point aEnd( pDoc->GetColOffset( nCol2 + 1, nTab2 ), pDoc->GetRowOffset( nRow2 + 1, nTab2 ) );
+ Point aEnd( pDoc->GetColOffset( nCol2, nTab2 ), pDoc->GetRowOffset( nRow2, nTab2 ) );
TwipsToMM( aEnd.X() );
TwipsToMM( aEnd.Y() );
+ aEnd += lcl_calcAvailableDiff(*pDoc, nCol2, nRow2, nTab2, rData.maEndOffset);
Rectangle aNew( aPos, aEnd );
if ( bNegativePage )
MirrorRectRTL( aNew );
if ( pObj->GetLogicRect() != aNew )
{
+ Rectangle aOld(pObj->GetLogicRect());
+
if (bRecording)
AddCalcUndo( new SdrUndoGeoObj( *pObj ) );
- pObj->SetLogicRect(aNew);
+ rData.maLastRect = lcl_makeSafeRectangle(aNew);
+ pObj->SetLogicRect(rData.maLastRect);
}
}
else
{
if ( bNegativePage )
- aPos.X() = -aPos.X();
+ aPos.X() = -aPos.X() - rData.maLastRect.GetWidth();
if ( pObj->GetRelativePos() != aPos )
{
if (bRecording)
AddCalcUndo( new SdrUndoGeoObj( *pObj ) );
+ rData.maLastRect.SetPos( aPos );
pObj->SetRelativePos( aPos );
}
}
+
+ /*
+ * If we were not allowed resize the object, then the end cell anchor
+ * is possibly incorrect now, and if the object has no end-cell (e.g.
+ * missing in original .xml) we are also forced to generate one
+ */
+ bool bEndAnchorIsBad = !bValid2 || pObj->IsResizeProtect();
+ if (bEndAnchorIsBad)
+ ScDrawLayer::UpdateCellAnchorFromPositionEnd(*pObj, *pDoc, nTab1);
}
}
@@ -886,151 +961,6 @@
return pRet;
}
-// MoveAreaTwips: all measures are kept in twips
-void ScDrawLayer::MoveAreaTwips( SCTAB nTab, const Rectangle& rArea,
- const Point& rMove, const Point& rTopLeft )
-{
- if (!rMove.X() && !rMove.Y())
- return; // nix
-
- SdrPage* pPage = GetPage(static_cast<sal_uInt16>(nTab));
- DBG_ASSERT(pPage,"Page nicht gefunden");
- if (!pPage)
- return;
-
- BOOL bNegativePage = pDoc && pDoc->IsNegativePage( nTab );
-
- // fuer Shrinking!
- Rectangle aNew( rArea );
- BOOL bShrink = FALSE;
- if ( rMove.X() < 0 || rMove.Y() < 0 ) // verkleinern
- {
- if ( rTopLeft != rArea.TopLeft() ) // sind gleich beim Verschieben von Zellen
- {
- bShrink = TRUE;
- aNew.Left() = rTopLeft.X();
- aNew.Top() = rTopLeft.Y();
- }
- }
- SdrObjListIter aIter( *pPage, IM_FLAT );
- SdrObject* pObject = aIter.Next();
- while (pObject)
- {
- if( GetAnchor( pObject ) == SCA_CELL )
- {
- if ( GetObjData( pObject ) ) // Detektiv-Pfeil ?
- {
- // hier nichts
- }
- else if ( pObject->ISA( SdrEdgeObj ) ) // Verbinder?
- {
- // hier auch nichts
- //! nicht verbundene Enden wie bei Linien (s.u.) behandeln?
- }
- else if ( pObject->IsPolyObj() && pObject->GetPointCount()==2 )
- {
- for (USHORT i=0; i<2; i++)
- {
- BOOL bMoved = FALSE;
- Point aPoint = pObject->GetPoint(i);
- lcl_ReverseTwipsToMM( aPoint );
- if (rArea.IsInside(aPoint))
- {
- aPoint += rMove; bMoved = TRUE;
- }
- else if (bShrink && aNew.IsInside(aPoint))
- {
- // Punkt ist in betroffener Zelle - Test auf geloeschten Bereich
- if ( rMove.X() && aPoint.X() >= rArea.Left() + rMove.X() )
- {
- aPoint.X() = rArea.Left() + rMove.X() - SHRINK_DIST_TWIPS;
- if ( aPoint.X() < 0 ) aPoint.X() = 0;
- bMoved = TRUE;
- }
- if ( rMove.Y() && aPoint.Y() >= rArea.Top() + rMove.Y() )
- {
- aPoint.Y() = rArea.Top() + rMove.Y() - SHRINK_DIST_TWIPS;
- if ( aPoint.Y() < 0 ) aPoint.Y() = 0;
- bMoved = TRUE;
- }
- }
- if( bMoved )
- {
- AddCalcUndo( new SdrUndoGeoObj( *pObject ) );
- lcl_TwipsToMM( aPoint );
- pObject->SetPoint( aPoint, i );
- }
- }
- }
- else
- {
- Rectangle aObjRect = pObject->GetLogicRect();
- // aOldMMPos: not converted, millimeters
- Point aOldMMPos = bNegativePage ? aObjRect.TopRight() : aObjRect.TopLeft();
- lcl_ReverseTwipsToMM( aObjRect );
- Point aTopLeft = bNegativePage ? aObjRect.TopRight() : aObjRect.TopLeft(); // logical left
- Size aMoveSize;
- BOOL bDoMove = FALSE;
- if (rArea.IsInside(aTopLeft))
- {
- aMoveSize = Size(rMove.X(),rMove.Y());
- bDoMove = TRUE;
- }
- else if (bShrink && aNew.IsInside(aTopLeft))
- {
- // Position ist in betroffener Zelle - Test auf geloeschten Bereich
- if ( rMove.X() && aTopLeft.X() >= rArea.Left() + rMove.X() )
- {
- aMoveSize.Width() = rArea.Left() + rMove.X() - SHRINK_DIST - aTopLeft.X();
- bDoMove = TRUE;
- }
- if ( rMove.Y() && aTopLeft.Y() >= rArea.Top() + rMove.Y() )
- {
- aMoveSize.Height() = rArea.Top() + rMove.Y() - SHRINK_DIST - aTopLeft.Y();
- bDoMove = TRUE;
- }
- }
- if ( bDoMove )
- {
- if ( bNegativePage )
- {
- if ( aTopLeft.X() + aMoveSize.Width() > 0 )
- aMoveSize.Width() = -aTopLeft.X();
- }
- else
- {
- if ( aTopLeft.X() + aMoveSize.Width() < 0 )
- aMoveSize.Width() = -aTopLeft.X();
- }
- if ( aTopLeft.Y() + aMoveSize.Height() < 0 )
- aMoveSize.Height() = -aTopLeft.Y();
-
- // get corresponding move size in millimeters:
- Point aNewPos( aTopLeft.X() + aMoveSize.Width(), aTopLeft.Y() + aMoveSize.Height() );
- lcl_TwipsToMM( aNewPos );
- aMoveSize = Size( aNewPos.X() - aOldMMPos.X(), aNewPos.Y() - aOldMMPos.Y() ); // millimeters
-
- AddCalcUndo( new SdrUndoMoveObj( *pObject, aMoveSize ) );
- pObject->Move( aMoveSize );
- }
- else if ( rArea.IsInside( bNegativePage ? aObjRect.BottomLeft() : aObjRect.BottomRight() ) &&
- !pObject->IsResizeProtect() )
- {
- // geschuetzte Groessen werden nicht veraendert
- // (Positionen schon, weil sie ja an der Zelle "verankert" sind)
- AddCalcUndo( new SdrUndoGeoObj( *pObject ) );
- long nOldSizeX = aObjRect.Right() - aObjRect.Left() + 1;
- long nOldSizeY = aObjRect.Bottom() - aObjRect.Top() + 1;
- long nLogMoveX = rMove.X() * ( bNegativePage ? -1 : 1 ); // logical direction
- pObject->Resize( aOldMMPos, Fraction( nOldSizeX+nLogMoveX, nOldSizeX ),
- Fraction( nOldSizeY+rMove.Y(), nOldSizeY ) );
- }
- }
- }
- pObject = aIter.Next();
- }
-}
-
void ScDrawLayer::MoveArea( SCTAB nTab, SCCOL nCol1,SCROW nRow1, SCCOL nCol2,SCROW nRow2,
SCsCOL nDx,SCsROW nDy, BOOL bInsDel, bool bUpdateNoteCaptionPos )
{
@@ -1072,11 +1002,6 @@
aTopLeft.Y() += aMove.Y();
}
- // drawing objects are now directly included in cut&paste
- // -> only update references when inserting/deleting (or changing widths or heights)
- if ( bInsDel )
- MoveAreaTwips( nTab, aRect, aMove, aTopLeft );
-
//
// Detektiv-Pfeile: Zellpositionen anpassen
//
@@ -1114,8 +1039,6 @@
aTopLeft.X() = -aTopLeft.X();
nDifTwips = -nDifTwips;
}
-
- MoveAreaTwips( nTab, aRect, Point( nDifTwips,0 ), aTopLeft );
}
void ScDrawLayer::HeightChanged( SCTAB nTab, SCROW nRow, long nDifTwips )
@@ -1146,8 +1069,6 @@
MirrorRectRTL( aRect );
aTopLeft.X() = -aTopLeft.X();
}
-
- MoveAreaTwips( nTab, aRect, Point( 0,nDifTwips ), aTopLeft );
}
BOOL ScDrawLayer::HasObjectsInRows( SCTAB nTab, SCROW nStartRow, SCROW nEndRow )
@@ -1821,35 +1742,105 @@
}
}
-void ScDrawLayer::SetAnchor( SdrObject* pObj, ScAnchorType eType )
+namespace
+{
+ SdrObjUserData* GetFirstUserDataOfType(const SdrObject *pObj, UINT16 nId)
+ {
+ USHORT nCount = pObj ? pObj->GetUserDataCount() : 0;
+ for( USHORT i = 0; i < nCount; i++ )
+ {
+ SdrObjUserData* pData = pObj->GetUserData( i );
+ if( pData && pData->GetInventor() == SC_DRAWLAYER && pData->GetId() == nId )
+ return pData;
+ }
+ return NULL;
+ }
+
+ void DeleteFirstUserDataOfType(SdrObject *pObj, UINT16 nId)
+ {
+ USHORT nCount = pObj ? pObj->GetUserDataCount() : 0;
+ for( USHORT i = nCount; i > 0; i-- )
+ {
+ SdrObjUserData* pData = pObj->GetUserData( i-1 );
+ if( pData && pData->GetInventor() == SC_DRAWLAYER && pData->GetId() == nId )
+ pObj->DeleteUserData(i-1);
+ }
+ }
+}
+
+void ScDrawLayer::SetCellAnchored( SdrObject &rObj, const ScDrawObjData &rAnchor )
{
- ScAnchorType eOldAnchorType = GetAnchor( pObj );
+ ScDrawObjData* pAnchor = GetObjData( &rObj, true );
+ pAnchor->maStart = rAnchor.maStart;
+ pAnchor->maEnd = rAnchor.maEnd;
+ pAnchor->maStartOffset = rAnchor.maStartOffset;
+ pAnchor->maEndOffset = rAnchor.maEndOffset;
+}
+
+void ScDrawLayer::SetCellAnchoredFromPosition( SdrObject &rObj, const ScDocument &rDoc, SCTAB nTab )
+{
+ Rectangle aObjRect(rObj.GetLogicRect());
+ ScRange aRange = rDoc.GetRange( nTab, aObjRect );
+
+ Rectangle aCellRect;
+
+ ScDrawObjData aAnchor;
+ aAnchor.maStart = aRange.aStart;
+ aCellRect = rDoc.GetMMRect( aRange.aStart.Col(), aRange.aStart.Row(),
+ aRange.aStart.Col(), aRange.aStart.Row(), aRange.aStart.Tab() );
+ aAnchor.maStartOffset.Y() = aObjRect.Top()-aCellRect.Top();
+ if (!rDoc.IsNegativePage(nTab))
+ aAnchor.maStartOffset.X() = aObjRect.Left()-aCellRect.Left();
+ else
+ aAnchor.maStartOffset.X() = aCellRect.Right()-aObjRect.Right();
- // Ein an der Seite verankertes Objekt zeichnet sich durch eine Anker-Pos
- // von (0,1) aus. Das ist ein shabby Trick, der aber funktioniert!
- Point aAnchor( 0, eType == SCA_PAGE ? 1 : 0 );
- pObj->SetAnchorPos( aAnchor );
+ aAnchor.maEnd = aRange.aEnd;
+ aCellRect = rDoc.GetMMRect( aRange.aEnd.Col(), aRange.aEnd.Row(),
+ aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aEnd.Tab() );
+ aAnchor.maEndOffset.Y() = aObjRect.Bottom()-aCellRect.Top();
+ if (!rDoc.IsNegativePage(nTab))
+ aAnchor.maEndOffset.X() = aObjRect.Right()-aCellRect.Left();
+ else
+ aAnchor.maEndOffset.X() = aCellRect.Right()-aObjRect.Left();
- if ( eOldAnchorType != eType )
- pObj->notifyShapePropertyChange( ::svx::eSpreadsheetAnchor );
+ SetCellAnchored( rObj, aAnchor );
}
-ScAnchorType ScDrawLayer::GetAnchor( const SdrObject* pObj )
+void ScDrawLayer::UpdateCellAnchorFromPositionEnd( SdrObject &rObj, const ScDocument &rDoc, SCTAB nTab )
{
- Point aAnchor( pObj->GetAnchorPos() );
- return ( aAnchor.Y() != 0 ) ? SCA_PAGE : SCA_CELL;
+ Rectangle aObjRect(rObj.GetLogicRect());
+ ScRange aRange = rDoc.GetRange( nTab, aObjRect );
+
+ ScDrawObjData* pAnchor = GetObjData( &rObj, true );
+ pAnchor->maEnd = aRange.aEnd;
+
+ Rectangle aCellRect;
+ aCellRect = rDoc.GetMMRect( aRange.aEnd.Col(), aRange.aEnd.Row(),
+ aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aEnd.Tab() );
+ pAnchor->maEndOffset.Y() = aObjRect.Bottom()-aCellRect.Top();
+ if (!rDoc.IsNegativePage(nTab))
+ pAnchor->maEndOffset.X() = aObjRect.Right()-aCellRect.Left();
+ else
+ pAnchor->maEndOffset.X() = aCellRect.Right()-aObjRect.Left();
+}
+
+void ScDrawLayer::SetPageAnchored( SdrObject &rObj )
+{
+ DeleteFirstUserDataOfType(&rObj, SC_UD_OBJDATA);
+}
+
+ScAnchorType ScDrawLayer::GetAnchorType( const SdrObject &rObj )
+{
+ //If this object has a cell anchor associated with it
+ //then its cell-anchored, otherwise its page-anchored
+ return ScDrawLayer::GetObjData(const_cast<SdrObject*>(&rObj)) ? SCA_CELL : SCA_PAGE;
}
ScDrawObjData* ScDrawLayer::GetObjData( SdrObject* pObj, BOOL bCreate ) // static
{
- USHORT nCount = pObj ? pObj->GetUserDataCount() : 0;
- for( USHORT i = 0; i < nCount; i++ )
- {
- SdrObjUserData* pData = pObj->GetUserData( i );
- if( pData && pData->GetInventor() == SC_DRAWLAYER
- && pData->GetId() == SC_UD_OBJDATA )
- return (ScDrawObjData*) pData;
- }
+ if (SdrObjUserData *pData = GetFirstUserDataOfType(pObj, SC_UD_OBJDATA))
+ return (ScDrawObjData*) pData;
+
if( pObj && bCreate )
{
ScDrawObjData* pData = new ScDrawObjData;
@@ -1886,15 +1877,7 @@
ScIMapInfo* ScDrawLayer::GetIMapInfo( SdrObject* pObj ) // static
{
- USHORT nCount = pObj->GetUserDataCount();
- for( USHORT i = 0; i < nCount; i++ )
- {
- SdrObjUserData* pData = pObj->GetUserData( i );
- if( pData && pData->GetInventor() == SC_DRAWLAYER
- && pData->GetId() == SC_UD_IMAPDATA )
- return (ScIMapInfo*) pData;
- }
- return NULL;
+ return (ScIMapInfo*)GetFirstUserDataOfType(pObj, SC_UD_IMAPDATA);
}
// static:
@@ -1947,7 +1930,7 @@
else if ( pObj->ISA( SdrOle2Obj ) ) // OLE-Objekt
{
// TODO/LEAN: working with visual area needs running state
- aGraphSize = ((SdrOle2Obj*)pObj)->GetOrigObjSize();
+ aGraphSize = ((const SdrOle2Obj*)pObj)->GetOrigObjSize();
bObjSupported = TRUE;
}
@@ -1965,14 +1948,9 @@
ScMacroInfo* ScDrawLayer::GetMacroInfo( SdrObject* pObj, BOOL bCreate ) // static
{
- USHORT nCount = pObj->GetUserDataCount();
- for( USHORT i = 0; i < nCount; i++ )
- {
- SdrObjUserData* pData = pObj->GetUserData( i );
- if( pData && pData->GetInventor() == SC_DRAWLAYER
- && pData->GetId() == SC_UD_MACRODATA )
- return (ScMacroInfo*) pData;
- }
+ if (SdrObjUserData *pData = GetFirstUserDataOfType(pObj, SC_UD_MACRODATA))
+ return (ScMacroInfo*) pData;
+
if ( bCreate )
{
ScMacroInfo* pData = new ScMacroInfo;
diff -ru sc.orig/source/core/data/postit.cxx sc/source/core/data/postit.cxx
--- sc.orig/source/core/data/postit.cxx 2009-06-04 12:39:10.000000000 +0100
+++ sc/source/core/data/postit.cxx 2009-06-04 12:40:23.000000000 +0100
@@ -102,7 +102,6 @@
void ScCaptionUtil::SetBasicCaptionSettings( SdrCaptionObj& rCaption, bool bShown )
{
- ScDrawLayer::SetAnchor( &rCaption, SCA_PAGE );
SetCaptionLayer( rCaption, bShown );
rCaption.SetFixedTail();
rCaption.SetSpecialTextBoxShadow();
diff -ru sc.orig/source/core/tool/detfunc.cxx sc/source/core/tool/detfunc.cxx
--- sc.orig/source/core/tool/detfunc.cxx 2009-06-04 12:39:11.000000000 +0100
+++ sc/source/core/tool/detfunc.cxx 2009-06-04 12:40:23.000000000 +0100
@@ -492,7 +492,6 @@
pBox->SetMergedItemSetAndBroadcast(rData.GetBoxSet());
- ScDrawLayer::SetAnchor( pBox, SCA_CELL );
pBox->SetLayer( SC_LAYER_INTERN );
pPage->InsertObject( pBox );
pModel->AddCalcUndo( new SdrUndoInsertObj( *pBox ) );
@@ -534,7 +533,6 @@
pArrow->NbcSetLogicRect(Rectangle(aStartPos,aEndPos)); //! noetig ???
pArrow->SetMergedItemSetAndBroadcast(rAttrSet);
- ScDrawLayer::SetAnchor( pArrow, SCA_CELL );
pArrow->SetLayer( SC_LAYER_INTERN );
pPage->InsertObject( pArrow );
pModel->AddCalcUndo( new SdrUndoInsertObj( *pArrow ) );
@@ -565,7 +563,6 @@
pBox->SetMergedItemSetAndBroadcast(rData.GetBoxSet());
- ScDrawLayer::SetAnchor( pBox, SCA_CELL );
pBox->SetLayer( SC_LAYER_INTERN );
pPage->InsertObject( pBox );
pModel->AddCalcUndo( new SdrUndoInsertObj( *pBox ) );
@@ -600,7 +597,6 @@
pArrow->SetMergedItemSetAndBroadcast(rAttrSet);
- ScDrawLayer::SetAnchor( pArrow, SCA_CELL );
pArrow->SetLayer( SC_LAYER_INTERN );
pPage->InsertObject( pArrow );
pModel->AddCalcUndo( new SdrUndoInsertObj( *pArrow ) );
@@ -668,7 +664,6 @@
pCircle->SetMergedItemSetAndBroadcast(rAttrSet);
- ScDrawLayer::SetAnchor( pCircle, SCA_CELL );
pCircle->SetLayer( SC_LAYER_INTERN );
pPage->InsertObject( pCircle );
pModel->AddCalcUndo( new SdrUndoInsertObj( *pCircle ) );
diff -ru sc.orig/source/filter/xml/XMLExportIterator.hxx sc/source/filter/xml/XMLExportIterator.hxx
--- sc.orig/source/filter/xml/XMLExportIterator.hxx 2009-06-04 12:39:13.000000000 +0100
+++ sc/source/filter/xml/XMLExportIterator.hxx 2009-06-04 12:40:23.000000000 +0100
@@ -72,6 +72,8 @@
{
ScAddress aAddress;
ScAddress aEndAddress;
+ sal_Int32 nEndX;
+ sal_Int32 nEndY;
com::sun::star::uno::Reference<com::sun::star::drawing::XShape> xShape;
sal_Bool operator<(const ScMyShape& aShape) const;
diff -ru sc.orig/source/filter/xml/xmlexprt.cxx sc/source/filter/xml/xmlexprt.cxx
--- sc.orig/source/filter/xml/xmlexprt.cxx 2009-06-04 12:39:13.000000000 +0100
+++ sc/source/filter/xml/xmlexprt.cxx 2009-06-04 12:51:46.000000000 +0100
@@ -599,39 +599,21 @@
else
{
++nShapesCount;
- SvxShape* pShapeImp(SvxShape::getImplementation(xShape));
- if (pShapeImp)
+ if (SvxShape* pShapeImp = SvxShape::getImplementation(xShape))
{
- SdrObject *pSdrObj(pShapeImp->GetSdrObject());
- if (pSdrObj)
+ if (SdrObject *pSdrObj = pShapeImp->GetSdrObject())
{
- if (ScDrawLayer::GetAnchor(pSdrObj) == SCA_CELL)
+ if (ScDrawObjData *pAnchor = ScDrawLayer::GetObjData( pSdrObj ))
{
- if (pDoc)
- {
-
- awt::Point aPoint(xShape->getPosition());
- awt::Size aSize(xShape->getSize());
- rtl::OUString sType(xShape->getShapeType());
- Rectangle aRectangle(aPoint.X, aPoint.Y, aPoint.X + aSize.Width, aPoint.Y + aSize.Height);
- if ( sType.equals(sCaptionShape) )
- {
- awt::Point aRelativeCaptionPoint;
- xShapeProp->getPropertyValue( sCaptionPoint ) >>= aRelativeCaptionPoint;
- Point aCoreRelativeCaptionPoint(aRelativeCaptionPoint.X, aRelativeCaptionPoint.Y);
- Point aCoreAbsoluteCaptionPoint(aPoint.X, aPoint.Y);
- aCoreAbsoluteCaptionPoint += aCoreRelativeCaptionPoint;
- aRectangle.Union(Rectangle(aCoreAbsoluteCaptionPoint, aCoreAbsoluteCaptionPoint));
- }
- ScRange aRange(pDoc->GetRange(static_cast<SCTAB>(nTable), aRectangle));
- ScMyShape aMyShape;
- aMyShape.aAddress = aRange.aStart;
- aMyShape.aEndAddress = aRange.aEnd;
- aMyShape.xShape = xShape;
- pSharedData->AddNewShape(aMyShape);
- pSharedData->SetLastColumn(nTable, aRange.aStart.Col());
- pSharedData->SetLastRow(nTable, aRange.aStart.Row());
- }
+ ScMyShape aMyShape;
+ aMyShape.aAddress = pAnchor->maStart;
+ aMyShape.aEndAddress = pAnchor->maEnd;
+ aMyShape.nEndX = pAnchor->maEndOffset.X();
+ aMyShape.nEndY = pAnchor->maEndOffset.Y();
+ aMyShape.xShape = xShape;
+ pSharedData->AddNewShape(aMyShape);
+ pSharedData->SetLastColumn(nTable, pAnchor->maStart.Col());
+ pSharedData->SetLastRow(nTable, pAnchor->maStart.Row());
}
else
pSharedData->AddTableShape(nTable, xShape);
@@ -2585,29 +2567,15 @@
aPoint.X = 2 * aItr->xShape->getPosition().X + aItr->xShape->getSize().Width - aPoint.X;
if ( !aItr->xShape->getShapeType().equals(sCaptionShape) )
{
- awt::Point aEndPoint;
Rectangle aEndRec(pDoc->GetMMRect(aItr->aEndAddress.Col(), aItr->aEndAddress.Row(),
aItr->aEndAddress.Col(), aItr->aEndAddress.Row(), aItr->aEndAddress.Tab()));
rtl::OUString sEndAddress;
ScRangeStringConverter::GetStringFromAddress(sEndAddress, aItr->aEndAddress, pDoc, FormulaGrammar::CONV_OOO);
AddAttribute(XML_NAMESPACE_TABLE, XML_END_CELL_ADDRESS, sEndAddress);
- if (bNegativePage)
- aEndPoint.X = -aEndRec.Right();
- else
- aEndPoint.X = aEndRec.Left();
- aEndPoint.Y = aEndRec.Top();
- awt::Point aStartPoint(aItr->xShape->getPosition());
- awt::Size aSize(aItr->xShape->getSize());
- sal_Int32 nEndX;
- if (bNegativePage)
- nEndX = -aStartPoint.X - aEndPoint.X;
- else
- nEndX = aStartPoint.X + aSize.Width - aEndPoint.X;
- sal_Int32 nEndY(aStartPoint.Y + aSize.Height - aEndPoint.Y);
rtl::OUStringBuffer sBuffer;
- GetMM100UnitConverter().convertMeasure(sBuffer, nEndX);
+ GetMM100UnitConverter().convertMeasure(sBuffer, aItr->nEndX);
AddAttribute(XML_NAMESPACE_TABLE, XML_END_X, sBuffer.makeStringAndClear());
- GetMM100UnitConverter().convertMeasure(sBuffer, nEndY);
+ GetMM100UnitConverter().convertMeasure(sBuffer, aItr->nEndY);
AddAttribute(XML_NAMESPACE_TABLE, XML_END_Y, sBuffer.makeStringAndClear());
}
ExportShape(aItr->xShape, &aPoint);
diff -ru sc.orig/source/filter/xml/xmlimprt.cxx sc/source/filter/xml/xmlimprt.cxx
--- sc.orig/source/filter/xml/xmlimprt.cxx 2009-06-04 12:39:13.000000000 +0100
+++ sc/source/filter/xml/xmlimprt.cxx 2009-06-04 15:23:47.000000000 +0100
@@ -2813,7 +2813,7 @@
}
aTables.UpdateRowHeights();
- aTables.ResizeShapes();
+ aTables.FixupOLEs();
}
if (GetModel().is())
{
diff -ru sc.orig/source/filter/xml/xmlsubti.cxx sc/source/filter/xml/xmlsubti.cxx
--- sc.orig/source/filter/xml/xmlsubti.cxx 2009-06-04 12:39:13.000000000 +0100
+++ sc/source/filter/xml/xmlsubti.cxx 2009-06-04 15:17:25.000000000 +0100
@@ -153,7 +153,7 @@
ScMyTables::ScMyTables(ScXMLImport& rTempImport)
: rImport(rTempImport),
- aResizeShapes(rTempImport),
+ aFixupOLEs(rTempImport),
nCurrentColStylePos(0),
nCurrentDrawPage( -1 ),
nCurrentXShapes( -1 ),
@@ -757,12 +757,10 @@
return !((nCurrentSheet != nCurrentXShapes) || !xShapes.is());
}
-void ScMyTables::AddShape(uno::Reference <drawing::XShape>& rShape,
- rtl::OUString* pRangeList,
- table::CellAddress& rStartAddress, table::CellAddress& rEndAddress,
- sal_Int32 nEndX, sal_Int32 nEndY)
+void ScMyTables::AddOLE(uno::Reference <drawing::XShape>& rShape,
+ const rtl::OUString &rRangeList)
{
- aResizeShapes.AddShape(rShape, pRangeList, rStartAddress, rEndAddress, nEndX, nEndY);
+ aFixupOLEs.AddOLE(rShape, rRangeList);
}
void ScMyTables::AddMatrixRange(
diff -ru sc.orig/source/filter/xml/xmlsubti.hxx sc/source/filter/xml/xmlsubti.hxx
--- sc.orig/source/filter/xml/xmlsubti.hxx 2009-06-04 12:39:13.000000000 +0100
+++ sc/source/filter/xml/xmlsubti.hxx 2009-06-04 15:23:00.000000000 +0100
@@ -114,7 +114,7 @@
ScXMLImport& rImport;
- ScMyShapeResizer aResizeShapes;
+ ScMyOLEFixer aFixupOLEs;
::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheet > xCurrentSheet;
::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange > xCurrentCellRange;
@@ -151,7 +151,9 @@
void AddColumn(sal_Bool bIsCovered);
void NewTable(sal_Int32 nTempSpannedCols);
void UpdateRowHeights();
- void ResizeShapes() { aResizeShapes.ResizeShapes(); }
+ void FixupOLEs() { aFixupOLEs.FixupOLEs(); }
+ sal_Bool IsOLE(com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& rShape) const
+ { return ScMyOLEFixer::IsOLE(rShape); }
void DeleteTable();
com::sun::star::table::CellAddress GetRealCellPos();
void AddColCount(sal_Int32 nTempColCount);
@@ -170,11 +172,8 @@
GetCurrentXShapes();
sal_Bool HasDrawPage();
sal_Bool HasXShapes();
- void AddShape(com::sun::star::uno::Reference <com::sun::star::drawing::XShape>& rShape,
- rtl::OUString* pRangeList,
- com::sun::star::table::CellAddress& rStartAddress,
- com::sun::star::table::CellAddress& rEndAddress,
- sal_Int32 nEndX, sal_Int32 nEndY);
+ void AddOLE(com::sun::star::uno::Reference <com::sun::star::drawing::XShape>& rShape,
+ const rtl::OUString &rRangeList);
void AddMatrixRange( sal_Int32 nStartColumn,
sal_Int32 nStartRow,
diff -ru sc.orig/source/filter/xml/XMLTableShapeImportHelper.cxx sc/source/filter/xml/XMLTableShapeImportHelper.cxx
--- sc.orig/source/filter/xml/XMLTableShapeImportHelper.cxx 2009-06-04 12:39:13.000000000 +0100
+++ sc/source/filter/xml/XMLTableShapeImportHelper.cxx 2009-06-04 15:17:38.000000000 +0100
@@ -36,6 +36,7 @@
#include "drwlayer.hxx"
#include "xmlannoi.hxx"
#include "rangeutl.hxx"
+#include "userdat.hxx"
#include "docuno.hxx"
#include "sheetdata.hxx"
#include <xmloff/nmspmap.hxx>
@@ -90,6 +91,11 @@
{
if (!pAnnotationContext)
{
+ ScDrawObjData aAnchor;
+ aAnchor.maStart = ScAddress(aStartCell.Column, aStartCell.Row, aStartCell.Sheet);
+ awt::Point aStartPoint(rShape->getPosition());
+ aAnchor.maStartOffset = Point(aStartPoint.X, aStartPoint.Y);
+
sal_Int32 nEndX(-1);
sal_Int32 nEndY(-1);
sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
@@ -111,11 +117,18 @@
{
sal_Int32 nOffset(0);
ScRangeStringConverter::GetAddressFromString(aEndCell, rValue, static_cast<ScXMLImport&>(mrImporter).GetDocument(), ::formula::FormulaGrammar::CONV_OOO, nOffset);
+ aAnchor.maEnd = ScAddress(aEndCell.Column, aEndCell.Row, aEndCell.Sheet);
}
else if (IsXMLToken(aLocalName, XML_END_X))
+ {
static_cast<ScXMLImport&>(mrImporter).GetMM100UnitConverter().convertMeasure(nEndX, rValue);
+ aAnchor.maEndOffset.X() = nEndX;
+ }
else if (IsXMLToken(aLocalName, XML_END_Y))
+ {
static_cast<ScXMLImport&>(mrImporter).GetMM100UnitConverter().convertMeasure(nEndY, rValue);
+ aAnchor.maEndOffset.Y() = nEndY;
+ }
else if (IsXMLToken(aLocalName, XML_TABLE_BACKGROUND))
if (IsXMLToken(rValue, XML_TRUE))
nLayerID = SC_LAYER_BACK;
@@ -128,39 +141,28 @@
}
SetLayer(rShape, nLayerID, rShape->getShapeType());
- if (!bOnTable)
+ if (SvxShape* pShapeImp = SvxShape::getImplementation(rShape))
{
- rTables.AddShape(rShape,
- pRangeList, aStartCell, aEndCell, nEndX, nEndY);
- SvxShape* pShapeImp = SvxShape::getImplementation(rShape);
- if (pShapeImp)
- {
- SdrObject *pSdrObj = pShapeImp->GetSdrObject();
- if (pSdrObj)
- ScDrawLayer::SetAnchor(pSdrObj, SCA_CELL);
- }
+ if (SdrObject *pSdrObj = pShapeImp->GetSdrObject())
+ {
+ if (!bOnTable)
+ ScDrawLayer::SetCellAnchored(*pSdrObj, aAnchor);
+ else
+ ScDrawLayer::SetPageAnchored(*pSdrObj);
+ }
}
- else
- {
- if ( pRangeList )
- {
- // #i78086# If there are notification ranges, the ChartListener must be created
- // also when anchored to the sheet
- // -> call AddShape with invalid cell position (checked in ScMyShapeResizer::ResizeShapes)
-
- table::CellAddress aInvalidPos( -1, -1, -1 );
- rTables.AddShape(rShape,
- pRangeList, aInvalidPos, aInvalidPos, 0, 0);
- }
- SvxShape* pShapeImp = SvxShape::getImplementation(rShape);
- if (pShapeImp)
- {
- SdrObject *pSdrObj = pShapeImp->GetSdrObject();
- if (pSdrObj)
- ScDrawLayer::SetAnchor(pSdrObj, SCA_PAGE);
- }
- }
+ if ( bOnTable && pRangeList )
+ {
+ // #i78086# If there are notification ranges, the ChartListener must be created
+ // also when anchored to the sheet
+ // -> call AddOLE with invalid cell position (checked in ScMyShapeResizer::ResizeShapes)
+
+ if (rTables.IsOLE(rShape))
+ rTables.AddOLE(rShape, *pRangeList);
+ }
+
+ delete pRangeList;
}
else // shape is annotation
{
diff -ru sc.orig/source/filter/xml/XMLTableShapeResizer.cxx sc/source/filter/xml/XMLTableShapeResizer.cxx
--- sc.orig/source/filter/xml/XMLTableShapeResizer.cxx 2009-06-04 12:39:13.000000000 +0100
+++ sc/source/filter/xml/XMLTableShapeResizer.cxx 2009-06-04 15:27:39.000000000 +0100
@@ -49,38 +49,38 @@
using ::std::vector;
using ::rtl::OUString;
-ScMyShapeResizer::ScMyShapeResizer(ScXMLImport& rTempImport)
+ScMyOLEFixer::ScMyOLEFixer(ScXMLImport& rTempImport)
: rImport(rTempImport),
aShapes(),
pCollection(NULL)
{
}
-ScMyShapeResizer::~ScMyShapeResizer()
+ScMyOLEFixer::~ScMyOLEFixer()
{
}
-sal_Bool ScMyShapeResizer::IsOLE(uno::Reference< drawing::XShape >& rShape) const
+sal_Bool ScMyOLEFixer::IsOLE(uno::Reference< drawing::XShape >& rShape)
{
return rShape->getShapeType().equals(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.OLE2Shape")));
}
-void ScMyShapeResizer::CreateChartListener(ScDocument* pDoc,
+void ScMyOLEFixer::CreateChartListener(ScDocument* pDoc,
const rtl::OUString& rName,
- const rtl::OUString* pRangeList)
+ const rtl::OUString& rRangeList)
{
- if (!pDoc || !pRangeList)
- // These are minimum required.
+ // This is the minimum required.
+ if (!pDoc)
return;
- if (!pRangeList->getLength())
+ if (!rRangeList.getLength())
{
pDoc->AddOLEObjectToCollection(rName);
return;
}
OUString aRangeStr;
- ScRangeStringConverter::GetStringFromXMLRangeString(aRangeStr, *pRangeList, pDoc);
+ ScRangeStringConverter::GetStringFromXMLRangeString(aRangeStr, rRangeList, pDoc);
if (!aRangeStr.getLength())
{
pDoc->AddOLEObjectToCollection(rName);
@@ -116,272 +116,45 @@
}
}
-void ScMyShapeResizer::AddShape(uno::Reference <drawing::XShape>& rShape,
- rtl::OUString* pRangeList,
- table::CellAddress& rStartAddress, table::CellAddress& rEndAddress,
- sal_Int32 nEndX, sal_Int32 nEndY)
+void ScMyOLEFixer::AddOLE(uno::Reference <drawing::XShape>& rShape,
+ const rtl::OUString &rRangeList)
{
- ScMyToResizeShape aShape;
- aShape.xShape.set(rShape);
- aShape.pRangeList = pRangeList;
- aShape.aEndCell = rEndAddress;
- aShape.aStartCell = rStartAddress;
- aShape.nEndY = nEndY;
- aShape.nEndX = nEndX;
- aShapes.push_back(aShape);
+ ScMyToFixupOLE aShape;
+ aShape.xShape.set(rShape);
+ aShape.sRangeList = rRangeList;
+ aShapes.push_back(aShape);
}
-void ScMyShapeResizer::GetNewShapeSizePos(ScDocument* pDoc, const Rectangle& rStartRect,
- const table::CellAddress& rEndCell,
- awt::Point& rPoint, awt::Size& rSize,
- sal_Int32& rEndX, sal_Int32& rEndY) const
-{
- awt::Point aRefPoint;
- BOOL bNegativePage(pDoc->IsNegativePage(rEndCell.Sheet));
- if (bNegativePage)
- aRefPoint.X = rStartRect.Right();
- else
- aRefPoint.X = rStartRect.Left();
- aRefPoint.Y = rStartRect.Top();
- Rectangle aRect(pDoc->GetMMRect(
- static_cast<SCCOL>(rEndCell.Column), static_cast<SCROW>(rEndCell.Row),
- static_cast<SCCOL>(rEndCell.Column), static_cast<SCROW>(rEndCell.Row), rEndCell.Sheet ));
- if (bNegativePage)
- rEndX = -rEndX + aRect.Right();
- else
- rEndX += aRect.Left();
- rEndY += aRect.Top();
- rPoint.X += aRefPoint.X;
- if (bNegativePage)
- {
- if (rPoint.X < rStartRect.Left())
- rPoint.X = rStartRect.Left() + 2; // increment by 2 100th_mm because the cellwidth is internal in twips
- }
- else
- {
- if (rPoint.X > rStartRect.Right())
- rPoint.X = rStartRect.Right() - 2; // decrement by 2 100th_mm because the cellwidth is internal in twips
- }
- rPoint.Y += aRefPoint.Y;
- if (rPoint.Y > rStartRect.Bottom())
- rPoint.Y = rStartRect.Bottom() - 2; // decrement by 2 100th_mm because the cellheight is internal in twips
- if (bNegativePage)
- {
- rSize.Width = -(rEndX - rPoint.X);
- }
- else
- rSize.Width = rEndX - rPoint.X;
- rSize.Height = rEndY - rPoint.Y;
-}
-
-void ScMyShapeResizer::ResizeShapes()
+void ScMyOLEFixer::FixupOLEs()
{
if (!aShapes.empty() && rImport.GetModel().is())
{
- rtl::OUString sRowHeight(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_CELLHGT));
rtl::OUString sPersistName (RTL_CONSTASCII_USTRINGPARAM("PersistName"));
- rtl::OUString sCaptionPoint( RTL_CONSTASCII_USTRINGPARAM( "CaptionPoint" ));
- rtl::OUString sConnectorShape( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.ConnectorShape") );
- rtl::OUString sCaptionShape( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.CaptionShape") );
- rtl::OUString sStartShape(RTL_CONSTASCII_USTRINGPARAM("StartShape"));
- rtl::OUString sEndShape(RTL_CONSTASCII_USTRINGPARAM("EndShape"));
- rtl::OUString sStartPosition(RTL_CONSTASCII_USTRINGPARAM("StartPosition"));
- rtl::OUString sEndPosition(RTL_CONSTASCII_USTRINGPARAM("EndPosition"));
- uno::Reference<table::XCellRange> xTableRow;
- uno::Reference<sheet::XSpreadsheet> xSheet;
- uno::Reference<table::XTableRows> xTableRows;
- sal_Int32 nOldRow(-1);
- sal_Int32 nOldSheet(-1);
- ScMyToResizeShapes::iterator aItr(aShapes.begin());
- ScMyToResizeShapes::iterator aEndItr(aShapes.end());
- uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( rImport.GetModel(), uno::UNO_QUERY );
- if ( xSpreadDoc.is() )
+ ScMyToFixupOLEs::iterator aItr(aShapes.begin());
+ ScMyToFixupOLEs::iterator aEndItr(aShapes.end());
+ ScDocument* pDoc(rImport.GetDocument());
+
+ rImport.LockSolarMutex();
+
+ while (aItr != aEndItr)
{
- uno::Reference<container::XIndexAccess> xIndex( xSpreadDoc->getSheets(), uno::UNO_QUERY );
- ScDocument* pDoc(rImport.GetDocument());
- if ( pDoc && xIndex.is() )
+ // #i78086# also call CreateChartListener for invalid position (anchored to sheet)
+ if (!IsOLE(aItr->xShape))
+ DBG_ERROR("Only OLEs should be in here now");
+
+ if (IsOLE(aItr->xShape))
{
- rImport.LockSolarMutex();
- while (aItr != aEndItr)
- {
- // #i78086# invalid cell position is used to call CreateChartListener only
- if ( aItr->aEndCell.Sheet >= 0 )
- {
- if ((nOldSheet != aItr->aEndCell.Sheet) || !xSheet.is())
- {
- nOldSheet = aItr->aEndCell.Sheet;
- xSheet.set(xIndex->getByIndex(nOldSheet), uno::UNO_QUERY);
- if (xSheet.is())
- {
- uno::Reference<table::XColumnRowRange> xColumnRowRange (xSheet, uno::UNO_QUERY);
- if (xColumnRowRange.is())
- xTableRows = xColumnRowRange->getRows();
- }
- }
- if (xTableRows.is())
- {
- if (nOldRow != aItr->aEndCell.Row || !xTableRow.is())
- {
- nOldRow = aItr->aEndCell.Row;
- xTableRows->getByIndex(nOldRow) >>= xTableRow;
- }
- if (xTableRow.is())
- {
- uno::Reference <beans::XPropertySet> xRowProperties(xTableRow, uno::UNO_QUERY);
- if (xRowProperties.is())
- {
- sal_Int32 nHeight;
- if (xRowProperties->getPropertyValue(sRowHeight) >>= nHeight)
- {
- Rectangle aRec = pDoc->GetMMRect(static_cast<SCCOL>(aItr->aStartCell.Column), static_cast<SCROW>(aItr->aStartCell.Row),
- static_cast<SCCOL>(aItr->aStartCell.Column), static_cast<SCROW>(aItr->aStartCell.Row), aItr->aStartCell.Sheet);
- awt::Point aPoint(aItr->xShape->getPosition());
- awt::Size aSize(aItr->xShape->getSize());
- if (pDoc->IsNegativePage(static_cast<SCTAB>(nOldSheet)))
- aPoint.X += aSize.Width;
- if (aItr->nEndY >= 0 && aItr->nEndX >= 0)
- {
- if (aItr->xShape->getShapeType().equals(sConnectorShape))
- {
- //#103122#; handle connected Connectorshapes
- uno::Reference<beans::XPropertySet> xShapeProps (aItr->xShape, uno::UNO_QUERY);
- if(xShapeProps.is())
- {
- uno::Reference<drawing::XShape> xStartShape(xShapeProps->getPropertyValue( sStartShape ), uno::UNO_QUERY);
- uno::Reference<drawing::XShape> xEndShape(xShapeProps->getPropertyValue( sEndShape ), uno::UNO_QUERY);
- if (!xStartShape.is() && !xEndShape.is())
- {
- awt::Size aOldSize(aSize);
- GetNewShapeSizePos(pDoc, aRec, aItr->aEndCell, aPoint, aSize, aItr->nEndX, aItr->nEndY);
- aItr->xShape->setPosition(aPoint);
- if( (aSize.Width != aOldSize.Width) ||
- (aSize.Height != aOldSize.Height) )
- aItr->xShape->setSize(aSize);
- }
- else if (xStartShape.is() && xEndShape.is())
- {
- // do nothing, because they are connected
- }
- else
- {
- // only one point is connected, the other should be moved
-
- rtl::OUString sProperty;
- if (xStartShape.is())
- {
- awt::Point aEndPoint;
- xShapeProps->getPropertyValue(sEndPosition) >>= aEndPoint;
- aPoint.X = aRec.Left() + aEndPoint.X;
- aPoint.Y = aRec.Top() + aEndPoint.Y;
- sProperty = sEndPosition;
- }
- else
- {
- awt::Point aStartPoint;
- xShapeProps->getPropertyValue(sStartPosition) >>= aStartPoint;
- aPoint.X = aRec.Left() + aStartPoint.X;
- aPoint.Y = aRec.Top() + aStartPoint.Y;
- sProperty = sStartPosition;
- }
- xShapeProps->setPropertyValue(sProperty, uno::makeAny(aPoint));
- }
- }
- }
- else
- {
- awt::Size aOldSize(aSize);
- GetNewShapeSizePos(pDoc, aRec, aItr->aEndCell, aPoint, aSize, aItr->nEndX, aItr->nEndY);
- if (pDoc->IsNegativePage(static_cast<SCTAB>(nOldSheet)))
- aPoint.X -= aSize.Width;
- aItr->xShape->setPosition(aPoint);
- if( (aSize.Width != aOldSize.Width) ||
- (aSize.Height != aOldSize.Height) )
- aItr->xShape->setSize(aSize);
- }
- }
- else
- {
- if (aItr->xShape->getShapeType().equals(sCaptionShape))
- {
- Rectangle aRectangle(aPoint.X, aPoint.Y, aPoint.X + aSize.Width, aPoint.Y + aSize.Height);
-
- awt::Point aCaptionPoint;
- uno::Reference< beans::XPropertySet > xShapeProps(aItr->xShape, uno::UNO_QUERY);
- if (xShapeProps.is())
- {
- try
- {
- xShapeProps->getPropertyValue( sCaptionPoint ) >>= aCaptionPoint;
- }
- catch ( uno::Exception& )
- {
- DBG_ERROR("This Captionshape has no CaptionPoint property.");
- }
- }
- Point aCorePoint(aPoint.X, aPoint.Y);
- Point aCoreCaptionPoint(aCaptionPoint.X, aCaptionPoint.Y);
- aCoreCaptionPoint += aCorePoint;
- aRectangle.Union(Rectangle(aCoreCaptionPoint, aCoreCaptionPoint));
-
- Point aBeforeRightBottomPoint(aRectangle.BottomRight());
-
- aRectangle += aRec.TopLeft();
- if (aRectangle.Left() > aRec.Right())
- aRectangle -= (Point(aRectangle.Left() - aRec.Right() + 2, 0));
- if (aRectangle.Top() > aRec.Bottom())
- aRectangle -= (Point(0, aRectangle.Top() - aRec.Bottom() + 2));
-
- Point aDifferencePoint(aRectangle.BottomRight() - aBeforeRightBottomPoint);
- aPoint.X += aDifferencePoint.X();
- aPoint.Y += aDifferencePoint.Y();
-
- aItr->xShape->setPosition(aPoint);
- }
- else
- {
- // #96159# it is possible, that shapes have a negative position
- // this is now handled here
- DBG_ERROR("no or negative end address of this shape");
- awt::Point aRefPoint;
- aRefPoint.X = aRec.Left();
- aRefPoint.Y = aRec.Top();
- aPoint.X += aRefPoint.X;
- if (aPoint.X > aRec.Right())
- aPoint.X = aRec.Right() - 2; // decrement by 2 100th_mm because the cellheight is internal in twips
- aPoint.Y += aRefPoint.Y;
- if (aPoint.Y > aRec.Bottom())
- aPoint.Y = aRec.Bottom() - 2; // decrement by 2 100th_mm because the cellheight is internal in twips
- aItr->xShape->setPosition(aPoint);
- }
- }
- }
- }
- }
- }
- else
- {
- DBG_ERROR("something wents wrong");
- }
- }
- // #i78086# call CreateChartListener also for invalid position (anchored to sheet)
- if (IsOLE(aItr->xShape))
- {
- uno::Reference < beans::XPropertySet > xShapeProps ( aItr->xShape, uno::UNO_QUERY );
- uno::Reference < beans::XPropertySetInfo > xShapeInfo(xShapeProps->getPropertySetInfo());
- rtl::OUString sName;
- if (xShapeProps.is() && xShapeInfo.is() && xShapeInfo->hasPropertyByName(sPersistName) &&
- (xShapeProps->getPropertyValue(sPersistName) >>= sName))
- CreateChartListener(pDoc, sName, aItr->pRangeList);
- }
- if (aItr->pRangeList)
- delete aItr->pRangeList;
- aItr = aShapes.erase(aItr);
- }
- rImport.UnlockSolarMutex();
-// if (pCollection)
-// pDoc->SetChartListenerCollection(pCollection);
+ uno::Reference < beans::XPropertySet > xShapeProps ( aItr->xShape, uno::UNO_QUERY );
+ uno::Reference < beans::XPropertySetInfo > xShapeInfo(xShapeProps->getPropertySetInfo());
+
+ rtl::OUString sName;
+ if (pDoc && xShapeProps.is() && xShapeInfo.is() && xShapeInfo->hasPropertyByName(sPersistName) &&
++ (xShapeProps->getPropertyValue(sPersistName) >>= sName))
+ CreateChartListener(pDoc, sName, aItr->sRangeList);
}
+ aItr = aShapes.erase(aItr);
}
+ rImport.UnlockSolarMutex();
}
}
diff -ru sc.orig/source/filter/xml/XMLTableShapeResizer.hxx sc/source/filter/xml/XMLTableShapeResizer.hxx
--- sc.orig/source/filter/xml/XMLTableShapeResizer.hxx 2009-06-04 12:39:13.000000000 +0100
+++ sc/source/filter/xml/XMLTableShapeResizer.hxx 2009-06-04 15:22:38.000000000 +0100
@@ -41,44 +41,31 @@
class ScDocument;
class Rectangle;
-struct ScMyToResizeShape
+struct ScMyToFixupOLE
{
com::sun::star::uno::Reference <com::sun::star::drawing::XShape> xShape;
- rtl::OUString* pRangeList;
- com::sun::star::table::CellAddress aEndCell;
- com::sun::star::table::CellAddress aStartCell;
- sal_Int32 nEndX;
- sal_Int32 nEndY;
-
- ScMyToResizeShape() : pRangeList(NULL) {}
+ rtl::OUString sRangeList;
};
-typedef std::list<ScMyToResizeShape> ScMyToResizeShapes;
+typedef std::list<ScMyToFixupOLE> ScMyToFixupOLEs;
-class ScMyShapeResizer
+class ScMyOLEFixer
{
ScXMLImport& rImport;
- ScMyToResizeShapes aShapes;
+ ScMyToFixupOLEs aShapes;
ScChartListenerCollection* pCollection;
- sal_Bool IsOLE(com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& rShape) const;
void CreateChartListener(ScDocument* pDoc,
const rtl::OUString& rName,
- const rtl::OUString* pRangeList);
- void GetNewShapeSizePos(ScDocument* pDoc, const Rectangle& rStartRect,
- const com::sun::star::table::CellAddress& rEndCell,
- com::sun::star::awt::Point& rPoint, com::sun::star::awt::Size& rSize,
- sal_Int32& rEndX, sal_Int32& rEndY) const;
+ const rtl::OUString& rRangeList);
public:
- ScMyShapeResizer(ScXMLImport& rImport);
- ~ScMyShapeResizer();
+ ScMyOLEFixer(ScXMLImport& rImport);
+ ~ScMyOLEFixer();
- void AddShape(com::sun::star::uno::Reference <com::sun::star::drawing::XShape>& rShape,
- rtl::OUString* pRangeList,
- com::sun::star::table::CellAddress& rStartAddress,
- com::sun::star::table::CellAddress& rEndAddress,
- sal_Int32 nEndX, sal_Int32 nEndY);
- void ResizeShapes();
+ static sal_Bool IsOLE(com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& rShape);
+ void AddOLE(com::sun::star::uno::Reference <com::sun::star::drawing::XShape>& rShape,
+ const rtl::OUString &rRangeList);
+ void FixupOLEs();
};
#endif
diff -ru sc.orig/source/ui/Accessibility/AccessibleDocument.cxx sc/source/ui/Accessibility/AccessibleDocument.cxx
--- sc.orig/source/ui/Accessibility/AccessibleDocument.cxx 2009-06-04 12:39:41.000000000 +0100
+++ sc/source/ui/Accessibility/AccessibleDocument.cxx 2009-06-04 12:40:23.000000000 +0100
@@ -41,6 +41,7 @@
#include "drawview.hxx"
#include "gridwin.hxx"
#include "AccessibleEditObject.hxx"
+#include "userdat.hxx"
#include "scresid.hxx"
#include "sc.hrc"
#include <com/sun/star/accessibility/AccessibleEventId.hpp>
@@ -977,35 +978,10 @@
uno::Reference<beans::XPropertySet> xShapeProp(xShape, uno::UNO_QUERY);
if (pShapeImp && xShapeProp.is())
{
- SdrObject *pSdrObj = pShapeImp->GetSdrObject();
- if (pSdrObj)
+ if (SdrObject *pSdrObj = pShapeImp->GetSdrObject())
{
- if (ScDrawLayer::GetAnchor(pSdrObj) == SCA_CELL)
- {
- ScDocument* pDoc = mpViewShell->GetViewData()->GetDocument();
- if (pDoc)
- {
- rtl::OUString sCaptionShape(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.CaptionShape"));
- awt::Point aPoint(xShape->getPosition());
- awt::Size aSize(xShape->getSize());
- rtl::OUString sType(xShape->getShapeType());
- Rectangle aRectangle(aPoint.X, aPoint.Y, aPoint.X + aSize.Width, aPoint.Y + aSize.Height);
- if ( sType.equals(sCaptionShape) )
- {
- awt::Point aRelativeCaptionPoint;
- rtl::OUString sCaptionPoint( RTL_CONSTASCII_USTRINGPARAM( "CaptionPoint" ));
- xShapeProp->getPropertyValue( sCaptionPoint ) >>= aRelativeCaptionPoint;
- Point aCoreRelativeCaptionPoint(aRelativeCaptionPoint.X, aRelativeCaptionPoint.Y);
- Point aCoreAbsoluteCaptionPoint(aPoint.X, aPoint.Y);
- aCoreAbsoluteCaptionPoint += aCoreRelativeCaptionPoint;
- aRectangle.Union(Rectangle(aCoreAbsoluteCaptionPoint, aCoreAbsoluteCaptionPoint));
- }
- ScRange aRange = pDoc->GetRange(mpAccessibleDocument->getVisibleTable(), aRectangle);
- pAddress = new ScAddress(aRange.aStart);
- }
- }
-// else
-// do nothing, because it is always a NULL Pointer
+ if (ScDrawObjData *pAnchor = ScDrawLayer::GetObjData(pSdrObj))
+ return new ScAddress(pAnchor->maStart);
}
}
}
diff -ru sc.orig/source/ui/drawfunc/drawsh2.cxx sc/source/ui/drawfunc/drawsh2.cxx
--- sc.orig/source/ui/drawfunc/drawsh2.cxx 2009-06-04 12:39:40.000000000 +0100
+++ sc/source/ui/drawfunc/drawsh2.cxx 2009-06-04 12:40:23.000000000 +0100
@@ -115,7 +115,7 @@
if ( !bDisableAnchor )
{
- switch( pView->GetAnchor() )
+ switch( pView->GetAnchorType() )
{
case SCA_PAGE:
rSet.Put( SfxBoolItem( SID_ANCHOR_PAGE, TRUE ) );
diff -ru sc.orig/source/ui/drawfunc/drawsh5.cxx sc/source/ui/drawfunc/drawsh5.cxx
--- sc.orig/source/ui/drawfunc/drawsh5.cxx 2009-06-04 12:39:40.000000000 +0100
+++ sc/source/ui/drawfunc/drawsh5.cxx 2009-06-04 12:40:23.000000000 +0100
@@ -397,26 +397,26 @@
break;
case SID_ANCHOR_PAGE:
- pView->SetAnchor( SCA_PAGE );
+ pView->SetPageAnchored();
rBindings.Invalidate( SID_ANCHOR_PAGE );
rBindings.Invalidate( SID_ANCHOR_CELL );
break;
case SID_ANCHOR_CELL:
- pView->SetAnchor( SCA_CELL );
+ pView->SetCellAnchored();
rBindings.Invalidate( SID_ANCHOR_PAGE );
rBindings.Invalidate( SID_ANCHOR_CELL );
break;
case SID_ANCHOR_TOGGLE:
{
- switch( pView->GetAnchor() )
+ switch( pView->GetAnchorType() )
{
case SCA_CELL:
- pView->SetAnchor( SCA_PAGE );
+ pView->SetPageAnchored();
break;
default:
- pView->SetAnchor( SCA_CELL );
+ pView->SetCellAnchored();
break;
}
}
diff -ru sc.orig/source/ui/inc/drawview.hxx sc/source/ui/inc/drawview.hxx
--- sc.orig/source/ui/inc/drawview.hxx 2009-06-04 12:39:46.000000000 +0100
+++ sc/source/ui/inc/drawview.hxx 2009-06-04 12:40:23.000000000 +0100
@@ -100,8 +100,9 @@
void CalcNormScale( Fraction& rFractX, Fraction& rFractY ) const;
- void SetAnchor( ScAnchorType );
- ScAnchorType GetAnchor() const;
+ void SetPageAnchored();
+ void SetCellAnchored();
+ ScAnchorType GetAnchorType() const;
void VCAddWin( Window* pWin );
void VCRemoveWin( Window* pWin );
diff -ru sc.orig/source/ui/unoobj/shapeuno.cxx sc/source/ui/unoobj/shapeuno.cxx
--- sc.orig/source/ui/unoobj/shapeuno.cxx 2009-06-04 12:39:29.000000000 +0100
+++ sc/source/ui/unoobj/shapeuno.cxx 2009-06-04 12:40:23.000000000 +0100
@@ -365,20 +365,9 @@
table::CellRangeAddress aAddress = xRangeAdd->getRangeAddress();
if (nTab == aAddress.Sheet)
{
- if (aAddress.StartRow != aAddress.EndRow) //should be a Spreadsheet
- {
- DBG_ASSERT(aAddress.StartRow == 0 && aAddress.EndRow == MAXROW &&
- aAddress.StartColumn == 0 && aAddress.EndColumn == MAXCOL, "here should be a XSpreadsheet");
- ScDrawLayer::SetAnchor(pObj, SCA_PAGE);
- }
- else
- {
- DBG_ASSERT(aAddress.StartRow == aAddress.EndRow &&
- aAddress.StartColumn == aAddress.EndColumn, "here should be a XCell");
- ScDrawLayer::SetAnchor(pObj, SCA_CELL);
- }
Rectangle aRect(pDoc->GetMMRect( static_cast<SCCOL>(aAddress.StartColumn), static_cast<SCROW>(aAddress.StartRow),
static_cast<SCCOL>(aAddress.EndColumn), static_cast<SCROW>(aAddress.EndRow), aAddress.Sheet ));
+ awt::Point aRelPoint;
uno::Reference<drawing::XShape> xShape( mxShapeAgg, uno::UNO_QUERY );
if (xShape.is())
{
@@ -397,7 +386,8 @@
awt::Size aUnoSize;
awt::Point aCaptionPoint;
ScRange aRange;
- awt::Point aUnoPoint(lcl_GetRelativePos( xShape, pDoc, nTab, aRange, aUnoSize, aCaptionPoint ));
+ aRelPoint = lcl_GetRelativePos( xShape, pDoc, nTab, aRange, aUnoSize, aCaptionPoint );
+ awt::Point aUnoPoint(aRelPoint);
aUnoPoint.X += aPoint.X();
aUnoPoint.Y += aPoint.Y();
@@ -426,6 +416,24 @@
xShape->setPosition(aUnoPoint);
pDocSh->SetModified();
}
+
+ if (aAddress.StartRow != aAddress.EndRow) //should be a Spreadsheet
+ {
+ DBG_ASSERT(aAddress.StartRow == 0 && aAddress.EndRow == MAXROW &&
+ aAddress.StartColumn == 0 && aAddress.EndColumn == MAXCOL, "here should be a XSpreadsheet");
+ ScDrawLayer::SetPageAnchored(*pObj);
+ }
+ else
+ {
+ DBG_ASSERT(aAddress.StartRow == aAddress.EndRow &&
+ aAddress.StartColumn == aAddress.EndColumn, "here should be a XCell");
+ ScDrawObjData aAnchor;
+ aAnchor.maStart = ScAddress(aAddress.StartColumn, aAddress.StartRow, aAddress.Sheet);
+ aAnchor.maStartOffset = Point(aRelPoint.X, aRelPoint.Y);
+ ScDrawLayer::SetCellAnchored(*pObj, aAnchor);
+ //Currently we've only got a start anchor, not an end-anchor, so generate that now
+ ScDrawLayer::UpdateCellAnchorFromPositionEnd(*pObj, *pDoc, aAddress.Sheet);
+ }
}
}
}
@@ -485,7 +493,7 @@
uno::Reference<drawing::XShape> xShape( mxShapeAgg, uno::UNO_QUERY );
if (xShape.is())
{
- if (ScDrawLayer::GetAnchor(pObj) == SCA_PAGE)
+ if (ScDrawLayer::GetAnchorType(*pObj) == SCA_PAGE)
{
awt::Point aPoint(xShape->getPosition());
awt::Size aSize(xShape->getSize());
@@ -512,7 +520,7 @@
xShape->setPosition(aPoint);
pDocSh->SetModified();
}
- else if (ScDrawLayer::GetAnchor(pObj) == SCA_CELL)
+ else if (ScDrawLayer::GetAnchorType(*pObj) == SCA_CELL)
{
awt::Size aUnoSize;
awt::Point aCaptionPoint;
@@ -583,7 +591,7 @@
uno::Reference<drawing::XShape> xShape( mxShapeAgg, uno::UNO_QUERY );
if (xShape.is())
{
- if (ScDrawLayer::GetAnchor(pObj) == SCA_PAGE)
+ if (ScDrawLayer::GetAnchorType(*pObj) == SCA_PAGE)
{
awt::Point aPoint = xShape->getPosition();
awt::Point aCaptionPoint;
@@ -596,7 +604,7 @@
xShape->setPosition(aPoint);
pDocSh->SetModified();
}
- else if (ScDrawLayer::GetAnchor(pObj) == SCA_CELL)
+ else if (ScDrawLayer::GetAnchorType(*pObj) == SCA_CELL)
{
awt::Size aUnoSize;
awt::Point aCaptionPoint;
@@ -663,23 +671,10 @@
{
ScDocShell* pDocSh = (ScDocShell*)pObjSh;
uno::Reference< uno::XInterface > xAnchor;
- if (ScDrawLayer::GetAnchor(pObj) == SCA_CELL)
- {
- uno::Reference<drawing::XShape> xShape( mxShapeAgg, uno::UNO_QUERY );
- if (xShape.is())
- {
- awt::Size aUnoSize;
- awt::Point aCaptionPoint;
- ScRange aRange;
- awt::Point aUnoPoint(lcl_GetRelativePos( xShape, pDoc, nTab, aRange, aUnoSize, aCaptionPoint ));
-
- xAnchor.set(static_cast<cppu::OWeakObject*>(new ScCellObj( pDocSh, aRange.aStart )));
- }
- }
+ if (ScDrawObjData *pAnchor = ScDrawLayer::GetObjDataTab(pObj, nTab))
+ xAnchor.set(static_cast<cppu::OWeakObject*>(new ScCellObj( pDocSh, pAnchor->maStart)));
else
- {
xAnchor.set(static_cast<cppu::OWeakObject*>(new ScTableSheetObj( pDocSh, nTab )));
- }
aAny <<= xAnchor;
}
}
@@ -722,7 +717,7 @@
uno::Reference<drawing::XShape> xShape( mxShapeAgg, uno::UNO_QUERY );
if (xShape.is())
{
- if (ScDrawLayer::GetAnchor(pObj) == SCA_CELL)
+ if (ScDrawLayer::GetAnchorType(*pObj) == SCA_CELL)
{
awt::Size aUnoSize;
awt::Point aCaptionPoint;
@@ -782,7 +777,7 @@
if (xShape.is())
{
uno::Reference< uno::XInterface > xAnchor;
- if (ScDrawLayer::GetAnchor(pObj) == SCA_CELL)
+ if (ScDrawLayer::GetAnchorType(*pObj) == SCA_CELL)
{
awt::Size aUnoSize;
awt::Point aCaptionPoint;
diff -ru sc.orig/source/ui/view/drawvie3.cxx sc/source/ui/view/drawvie3.cxx
--- sc.orig/source/ui/view/drawvie3.cxx 2009-06-04 12:39:42.000000000 +0100
+++ sc/source/ui/view/drawvie3.cxx 2009-06-05 08:47:05.000000000 +0100
@@ -77,7 +77,7 @@
// Verankerung setzen
-void ScDrawView::SetAnchor( ScAnchorType eType )
+void ScDrawView::SetPageAnchored()
{
SdrObject* pObj = NULL;
if( AreObjectsMarked() )
@@ -87,7 +87,7 @@
for( ULONG i=0; i<nCount; i++ )
{
pObj = pMark->GetMark(i)->GetMarkedSdrObj();
- ScDrawLayer::SetAnchor( pObj, eType );
+ ScDrawLayer::SetPageAnchored( *pObj );
}
if ( pViewData )
@@ -95,7 +95,28 @@
}
}
-ScAnchorType ScDrawView::GetAnchor() const
+void ScDrawView::SetCellAnchored()
+{
+ if (!pDoc)
+ return;
+
+ SdrObject* pObj = NULL;
+ if( AreObjectsMarked() )
+ {
+ const SdrMarkList* pMark = &GetMarkedObjectList();
+ ULONG nCount = pMark->GetMarkCount();
+ for( ULONG i=0; i<nCount; i++ )
+ {
+ pObj = pMark->GetMark(i)->GetMarkedSdrObj();
+ ScDrawLayer::SetCellAnchoredFromPosition(*pObj, *pDoc, nTab);
+ }
+
+ if ( pViewData )
+ pViewData->GetDocShell()->SetDrawModified();
+ }
+}
+
+ScAnchorType ScDrawView::GetAnchorType() const
{
BOOL bPage = FALSE;
BOOL bCell = FALSE;
@@ -108,7 +129,7 @@
for( ULONG i=0; i<nCount; i++ )
{
pObj = pMark->GetMark(i)->GetMarkedSdrObj();
- if( ScDrawLayer::GetAnchor( pObj ) == SCA_CELL )
+ if( ScDrawLayer::GetAnchorType( *pObj ) == SCA_CELL )
bCell =TRUE;
else
bPage = TRUE;
@@ -138,6 +159,20 @@
if ( nTab == ((ScTabSizeChangedHint&)rHint).GetTab() )
UpdateWorkArea();
}
+ else if ( rHint.ISA( SdrHint ) )
+ {
+ if (const SdrHint* pSdrHint = PTR_CAST( SdrHint, &rHint ))
+ {
+ //Update the anchors of any non note object that is cell anchored which has
+ //been moved since the last anchors for its position was calculated
+ if (pSdrHint->GetKind() == HINT_OBJCHG || pSdrHint->GetKind() == HINT_OBJINSERTED)
+ if (SdrObject* pObj = const_cast<SdrObject*>(pSdrHint->GetObject()))
+ if (ScDrawObjData *pAnchor = ScDrawLayer::GetObjData(pObj))
+ if (!pAnchor->mbNote && pAnchor->maLastRect != pObj->GetLogicRect())
+ ScDrawLayer::SetCellAnchoredFromPosition(*pObj, *pDoc, nTab);
+ }
+ FmFormView::Notify( rBC,rHint );
+ }
else
FmFormView::Notify( rBC,rHint );
}
diff -ru sc.orig/source/ui/view/drawview.cxx sc/source/ui/view/drawview.cxx
--- sc.orig/source/ui/view/drawview.cxx 2009-06-04 12:39:41.000000000 +0100
+++ sc/source/ui/view/drawview.cxx 2009-06-04 12:40:23.000000000 +0100
@@ -155,46 +155,15 @@
void ScDrawView::AddCustomHdl()
{
- BOOL bNegativePage = pDoc->IsNegativePage( nTab );
-
const SdrMarkList &rMrkList = GetMarkedObjectList();
UINT32 nCount = rMrkList.GetMarkCount();
for(UINT32 nPos=0; nPos<nCount; nPos++ )
{
- const SdrObject* pObj = rMrkList.GetMark(nPos)->GetMarkedSdrObj();
- if(ScDrawLayer::GetAnchor(pObj) == SCA_CELL)
+ SdrObject* pObj = rMrkList.GetMark(nPos)->GetMarkedSdrObj();
+ if (ScDrawObjData *pAnchor = ScDrawLayer::GetObjDataTab(pObj, nTab))
{
- const INT32 nDelta = 1;
-
- Rectangle aBoundRect = pObj->GetCurrentBoundRect();
- Point aPos;
- if (bNegativePage)
- {
- aPos = aBoundRect.TopRight();
- aPos.X() = -aPos.X(); // so the loop below is the same
- }
- else
- aPos = aBoundRect.TopLeft();
- long nPosX = (long) (aPos.X() / HMM_PER_TWIPS) + nDelta;
- long nPosY = (long) (aPos.Y() / HMM_PER_TWIPS) + nDelta;
-
- SCCOL nCol;
- INT32 nWidth = 0;
-
- for(nCol=0; nCol<=MAXCOL && nWidth<=nPosX; nCol++)
- nWidth += pDoc->GetColWidth(nCol,nTab);
-
- if(nCol > 0)
- --nCol;
-
- SCROW nRow = nPosY <= 0 ? 0 : pDoc->GetRowForHeight( nTab,
- (ULONG) nPosY);
- if(nRow > 0)
- --nRow;
-
- ScTabView* pView = pViewData->GetView();
- ScAddress aScAddress(nCol, nRow, nTab);
- pView->CreateAnchorHandles(aHdl, aScAddress);
+ if (ScTabView* pView = pViewData->GetView())
+ pView->CreateAnchorHandles(aHdl, pAnchor->maStart);
}
}
}
--- sc.orig/source/filter/xcl97/xcl97rec.cxx 2010-11-18 21:18:32.000000000 +0000
+++ sc/source/filter/xcl97/xcl97rec.cxx 2010-11-18 21:19:31.000000000 +0000
@@ -1014,7 +1014,7 @@
if( const SdrObject* pShape = EscherEx::GetSdrObject( rObj.GetShape() ) )
{
// OOXTODO: returning "twoCell"
- switch( ScDrawLayer::GetAnchor( pShape ) )
+ switch( ScDrawLayer::GetAnchorType( *pShape ) )
{
case SCA_CELL: return "oneCell";
default: break;