Kaydet (Commit) 248a6136 authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Fix re-calculation of the position of circular drawing objects.

Cell-anchored circular drawing objects would get distorted whenever
its bounding rectangle changes, either via insertion / removal of
columns / rows, or changing the row height / column width.

This commit fixes it by differentiating the validation circles, which
needs its own re-calc algorithm, from the normal circular drawing
objects.
üst bf6ccec6
......@@ -59,11 +59,13 @@ public:
class ScDrawObjData : public SdrObjUserData
{
public:
enum Type { CellNote, ValidationCircle, DrawingObject };
ScAddress maStart;
ScAddress maEnd;
Point maStartOffset;
Point maEndOffset;
bool mbNote;
Type meType;
Rectangle maLastRect;
explicit ScDrawObjData();
......
......@@ -610,7 +610,7 @@ void ScDrawLayer::RecalcPos( SdrObject* pObj, ScDrawObjData& rData, bool bNegati
if( !pDoc )
return;
if( rData.mbNote )
if (rData.meType == ScDrawObjData::CellNote)
{
OSL_ENSURE( rData.maStart.IsValid(), "ScDrawLayer::RecalcPos - invalid position for cell note" );
/* #i109372# On insert/remove rows/columns/cells: Updating the caption
......@@ -636,13 +636,12 @@ void ScDrawLayer::RecalcPos( SdrObject* pObj, ScDrawObjData& rData, bool bNegati
SCROW nRow2 = rData.maEnd.Row();
SCTAB nTab2 = rData.maEnd.Tab();
// validation circle
bool bCircle = pObj->ISA( SdrCircObj );
// detective arrow
bool bArrow = pObj->IsPolyObj() && (pObj->GetPointCount() == 2);
if( bCircle )
if (rData.meType == ScDrawObjData::ValidationCircle)
{
// Validation circle for detective.
rData.maLastRect = pObj->GetLogicRect();
Point aPos( pDoc->GetColOffset( nCol1, nTab1 ), pDoc->GetRowOffset( nRow1, nTab1 ) );
......@@ -1835,13 +1834,13 @@ ScDrawObjData* ScDrawLayer::GetObjDataTab( SdrObject* pObj, SCTAB nTab )
bool ScDrawLayer::IsNoteCaption( SdrObject* pObj )
{
ScDrawObjData* pData = pObj ? GetObjData( pObj ) : 0;
return pData && pData->mbNote;
return pData && pData->meType == ScDrawObjData::CellNote;
}
ScDrawObjData* ScDrawLayer::GetNoteCaptionData( SdrObject* pObj, SCTAB nTab )
{
ScDrawObjData* pData = pObj ? GetObjDataTab( pObj, nTab ) : 0;
return (pData && pData->mbNote) ? pData : 0;
return (pData && pData->meType == ScDrawObjData::CellNote) ? pData : 0;
}
ScIMapInfo* ScDrawLayer::GetIMapInfo( SdrObject* pObj )
......
......@@ -109,7 +109,7 @@ void ScCaptionUtil::SetCaptionUserData( SdrCaptionObj& rCaption, const ScAddress
ScDrawObjData* pObjData = ScDrawLayer::GetObjData( &rCaption, true );
OSL_ENSURE( pObjData, "ScCaptionUtil::SetCaptionUserData - missing drawing object user data" );
pObjData->maStart = rPos;
pObjData->mbNote = true;
pObjData->meType = ScDrawObjData::CellNote;
}
void ScCaptionUtil::SetDefaultItems( SdrCaptionObj& rCaption, ScDocument& rDoc )
......
......@@ -70,7 +70,7 @@ ScDrawObjData::ScDrawObjData() :
SdrObjUserData( SC_DRAWLAYER, SC_UD_OBJDATA, 0 ),
maStart( ScAddress::INITIALIZE_INVALID ),
maEnd( ScAddress::INITIALIZE_INVALID ),
mbNote( false )
meType( DrawingObject )
{
}
......
......@@ -681,6 +681,7 @@ void ScDetectiveFunc::DrawCircle( SCCOL nCol, SCROW nRow, ScDetectiveData& rData
ScDrawObjData* pData = ScDrawLayer::GetObjData( pCircle, sal_True );
pData->maStart.Set( nCol, nRow, nTab);
pData->maEnd.SetInvalid();
pData->meType = ScDrawObjData::ValidationCircle;
Modified();
}
......
......@@ -163,7 +163,7 @@ void adjustAnchoredPosition(const SdrHint& rHint, const ScDocument& rDoc, SCTAB
if (!pAnchor)
return;
if (pAnchor->mbNote)
if (pAnchor->meType == ScDrawObjData::CellNote)
return;
if (pAnchor->maLastRect == pObj->GetLogicRect())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment