summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiklas Nebel <nn@openoffice.org>2000-11-09 14:09:26 +0000
committerNiklas Nebel <nn@openoffice.org>2000-11-09 14:09:26 +0000
commit0011c596e6293bdd9c1498de338e013849214a9d (patch)
treebea188500473bfe9ac75c5c9bfd8d247cb2c7ea7
parent7d1ecb9afe8452f2e84ce7affbefeebce6164e29 (diff)
InsertObject
-rw-r--r--sc/inc/detfunc.hxx18
-rw-r--r--sc/source/core/tool/detfunc.cxx172
2 files changed, 131 insertions, 59 deletions
diff --git a/sc/inc/detfunc.hxx b/sc/inc/detfunc.hxx
index 2e323aae3..b866f7152 100644
--- a/sc/inc/detfunc.hxx
+++ b/sc/inc/detfunc.hxx
@@ -2,9 +2,9 @@
*
* $RCSfile: detfunc.hxx,v $
*
- * $Revision: 1.3 $
+ * $Revision: 1.4 $
*
- * last change: $Author: nn $ $Date: 2000-11-06 18:27:47 $
+ * last change: $Author: nn $ $Date: 2000-11-09 15:06:26 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -106,10 +106,22 @@ class ScDetectiveFunc
void FillAttributes( ScDetectiveData& rData );
+ // called from DrawEntry/DrawAlienEntry and InsertObject
+ BOOL InsertArrow( USHORT nCol, USHORT nRow,
+ USHORT nRefStartCol, USHORT nRefStartRow,
+ USHORT nRefEndCol, USHORT nRefEndRow,
+ BOOL bFromOtherTab, BOOL bRed,
+ ScDetectiveData& rData );
+ BOOL InsertToOtherTab( USHORT nStartCol, USHORT nStartRow,
+ USHORT nEndCol, USHORT nEndRow, BOOL bRed,
+ ScDetectiveData& rData );
+
+ // DrawEntry / DrawAlienEntry check for existing arrows and errors
BOOL DrawEntry( USHORT nCol, USHORT nRow, const ScTripel& rRefStart, const ScTripel& rRefEnd,
ScDetectiveData& rData );
BOOL DrawAlienEntry( const ScTripel& rRefStart, const ScTripel& rRefEnd,
ScDetectiveData& rData );
+
void DrawCircle( USHORT nCol, USHORT nRow, ScDetectiveData& rData );
SdrObject* DrawCaption( USHORT nCol, USHORT nRow, const String& rText,
@@ -159,6 +171,8 @@ public:
ScDetectiveObjType GetDetectiveObjectType( SdrObject* pObject,
ScAddress& rPosition, ScRange& rSource, BOOL& rRedLine );
+ void InsertObject( ScDetectiveObjType eType, const ScAddress& rPosition,
+ const ScRange& rSource, BOOL bRedLine );
};
diff --git a/sc/source/core/tool/detfunc.cxx b/sc/source/core/tool/detfunc.cxx
index 3ba6f66e4..7c93e26a0 100644
--- a/sc/source/core/tool/detfunc.cxx
+++ b/sc/source/core/tool/detfunc.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: detfunc.cxx,v $
*
- * $Revision: 1.4 $
+ * $Revision: 1.5 $
*
- * last change: $Author: nn $ $Date: 2000-11-06 18:29:04 $
+ * last change: $Author: nn $ $Date: 2000-11-09 15:09:26 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -445,32 +445,26 @@ BOOL ScDetectiveFunc::IsNonAlienArrow( SdrObject* pObject ) // static
return FALSE;
}
-// DrawEntry: Formel auf dieser Tabelle,
-// Referenz auf dieser oder anderer
-// DrawAlienEntry: Formel auf anderer Tabelle,
-// Referenz auf dieser
+//------------------------------------------------------------------------
-// return FALSE: da war schon ein Pfeil
+// InsertXXX: called from DrawEntry/DrawAlienEntry and InsertObject
-BOOL ScDetectiveFunc::DrawEntry( USHORT nCol, USHORT nRow,
- const ScTripel& rRefStart, const ScTripel& rRefEnd,
- ScDetectiveData& rData )
+BOOL ScDetectiveFunc::InsertArrow( USHORT nCol, USHORT nRow,
+ USHORT nRefStartCol, USHORT nRefStartRow,
+ USHORT nRefEndCol, USHORT nRefEndRow,
+ BOOL bFromOtherTab, BOOL bRed,
+ ScDetectiveData& rData )
{
- if ( HasArrow( rRefStart.GetCol(), rRefStart.GetRow(), rRefStart.GetTab(),
- nCol, nRow, nTab ) )
- return FALSE;
-
ScDrawLayer* pModel = pDoc->GetDrawLayer();
SdrPage* pPage = pModel->GetPage(nTab);
- BOOL bArea = (rRefStart != rRefEnd);
- BOOL bAlien = ( rRefEnd.GetTab() < nTab || rRefStart.GetTab() > nTab );
- if (bArea && !bAlien)
+ BOOL bArea = ( nRefStartCol != nRefEndCol || nRefStartRow != nRefEndRow );
+ if (bArea && !bFromOtherTab)
{
// insert the rectangle before the arrow - this is relied on in FindFrameForObject
- Point aStartCorner = GetDrawPos( rRefStart.GetCol(), rRefStart.GetRow(), FALSE );
- Point aEndCorner = GetDrawPos( rRefEnd.GetCol()+1, rRefEnd.GetRow()+1, FALSE );
+ Point aStartCorner = GetDrawPos( nRefStartCol, nRefStartRow, FALSE );
+ Point aEndCorner = GetDrawPos( nRefEndCol+1, nRefEndRow+1, FALSE );
SdrRectObj* pBox = new SdrRectObj(Rectangle(aStartCorner,aEndCorner));
@@ -483,16 +477,20 @@ BOOL ScDetectiveFunc::DrawEntry( USHORT nCol, USHORT nRow,
pModel->AddCalcUndo( new SdrUndoInsertObj( *pBox ) );
ScDrawObjData* pData = ScDrawLayer::GetObjData( pBox, TRUE );
- pData->aStt = rRefStart;
- pData->aEnd = rRefEnd;
+ pData->aStt.nCol = nRefStartCol;
+ pData->aStt.nRow = nRefStartRow;
+ pData->aStt.nTab = nTab;
+ pData->aEnd.nCol = nRefEndCol;
+ pData->aEnd.nRow = nRefEndRow;
+ pData->aEnd.nTab = nTab;
pData->bValidStart = TRUE;
pData->bValidEnd = TRUE;
}
- Point aStartPos = GetDrawPos( rRefStart.GetCol(), rRefStart.GetRow(), TRUE );
+ Point aStartPos = GetDrawPos( nRefStartCol, nRefStartRow, TRUE );
Point aEndPos = GetDrawPos( nCol, nRow, TRUE );
- if (bAlien)
+ if (bFromOtherTab)
{
aStartPos = Point( aEndPos.X() - 1000, aEndPos.Y() - 1000 );
if (aStartPos.X() < 0)
@@ -501,20 +499,14 @@ BOOL ScDetectiveFunc::DrawEntry( USHORT nCol, USHORT nRow,
aStartPos.Y() += 2000;
}
- SfxItemSet& rAttrSet = bAlien ? rData.GetFromTabSet() : rData.GetArrowSet();
+ SfxItemSet& rAttrSet = bFromOtherTab ? rData.GetFromTabSet() : rData.GetArrowSet();
- if (bArea && !bAlien)
+ if (bArea && !bFromOtherTab)
rAttrSet.Put( XLineWidthItem( 50 ) ); // Bereich
else
rAttrSet.Put( XLineWidthItem( 0 ) ); // einzelne Referenz
- ColorData nColorData;
- ScTripel aErrorPos;
- if (HasError( rRefStart, rRefEnd, aErrorPos ))
- nColorData = COL_LIGHTRED;
- else
- nColorData = COL_LIGHTBLUE;
-
+ ColorData nColorData = ( bRed ? COL_LIGHTRED : COL_LIGHTBLUE );
rAttrSet.Put( XLineColorItem( String(), Color( nColorData ) ) );
Point aPointArr[2] = {aStartPos, aEndPos};
SdrPathObj* pArrow = new SdrPathObj(OBJ_LINE,
@@ -531,13 +523,13 @@ BOOL ScDetectiveFunc::DrawEntry( USHORT nCol, USHORT nRow,
pModel->AddCalcUndo( new SdrUndoInsertObj( *pArrow ) );
ScDrawObjData* pData = ScDrawLayer::GetObjData( pArrow, TRUE );
- if (bAlien)
+ if (bFromOtherTab)
pData->bValidStart = FALSE;
else
{
- pData->aStt.nCol = rRefStart.GetCol();
- pData->aStt.nRow = rRefStart.GetRow();
- pData->aStt.nTab = rRefStart.GetTab();
+ pData->aStt.nCol = nRefStartCol;
+ pData->aStt.nRow = nRefStartRow;
+ pData->aStt.nTab = nTab;
pData->bValidStart = TRUE;
}
@@ -549,21 +541,18 @@ BOOL ScDetectiveFunc::DrawEntry( USHORT nCol, USHORT nRow,
return TRUE;
}
-BOOL ScDetectiveFunc::DrawAlienEntry( const ScTripel& rRefStart, const ScTripel& rRefEnd,
- ScDetectiveData& rData )
+BOOL ScDetectiveFunc::InsertToOtherTab( USHORT nStartCol, USHORT nStartRow,
+ USHORT nEndCol, USHORT nEndRow, BOOL bRed,
+ ScDetectiveData& rData )
{
- if ( HasArrow( rRefStart.GetCol(), rRefStart.GetRow(), rRefStart.GetTab(),
- 0, 0, nTab+1 ) )
- return FALSE;
-
ScDrawLayer* pModel = pDoc->GetDrawLayer();
SdrPage* pPage = pModel->GetPage(nTab);
- BOOL bArea = (rRefStart != rRefEnd);
+ BOOL bArea = ( nStartCol != nEndCol || nStartRow != nEndRow );
if (bArea)
{
- Point aStartCorner = GetDrawPos( rRefStart.GetCol(), rRefStart.GetRow(), FALSE );
- Point aEndCorner = GetDrawPos( rRefEnd.GetCol()+1, rRefEnd.GetRow()+1, FALSE );
+ Point aStartCorner = GetDrawPos( nStartCol, nStartRow, FALSE );
+ Point aEndCorner = GetDrawPos( nEndCol+1, nEndRow+1, FALSE );
SdrRectObj* pBox = new SdrRectObj(Rectangle(aStartCorner,aEndCorner));
@@ -576,13 +565,17 @@ BOOL ScDetectiveFunc::DrawAlienEntry( const ScTripel& rRefStart, const ScTripel&
pModel->AddCalcUndo( new SdrUndoInsertObj( *pBox ) );
ScDrawObjData* pData = ScDrawLayer::GetObjData( pBox, TRUE );
- pData->aStt = rRefStart;
- pData->aEnd = rRefEnd;
+ pData->aStt.nCol = nStartCol;
+ pData->aStt.nRow = nStartRow;
+ pData->aStt.nTab = nTab;
+ pData->aEnd.nCol = nEndCol;
+ pData->aEnd.nRow = nEndRow;
+ pData->aEnd.nTab = nTab;
pData->bValidStart = TRUE;
pData->bValidEnd = TRUE;
}
- Point aStartPos = GetDrawPos( rRefStart.GetCol(), rRefStart.GetRow(), TRUE );
+ Point aStartPos = GetDrawPos( nStartCol, nStartRow, TRUE );
Point aEndPos = Point( aStartPos.X() + 1000, aStartPos.Y() - 1000 );
if (aEndPos.Y() < 0)
aEndPos.Y() += 2000;
@@ -593,12 +586,7 @@ BOOL ScDetectiveFunc::DrawAlienEntry( const ScTripel& rRefStart, const ScTripel&
else
rAttrSet.Put( XLineWidthItem( 0 ) ); // einzelne Referenz
- ColorData nColorData;
- ScTripel aErrorPos;
- if (HasError( rRefStart, rRefEnd, aErrorPos ))
- nColorData = COL_LIGHTRED;
- else
- nColorData = COL_LIGHTBLUE;
+ ColorData nColorData = ( bRed ? COL_LIGHTRED : COL_LIGHTBLUE );
rAttrSet.Put( XLineColorItem( String(), Color( nColorData ) ) );
Point aPointArr[2] = {aStartPos, aEndPos};
SdrPathObj* pArrow = new SdrPathObj(OBJ_LINE,
@@ -615,15 +603,57 @@ BOOL ScDetectiveFunc::DrawAlienEntry( const ScTripel& rRefStart, const ScTripel&
pModel->AddCalcUndo( new SdrUndoInsertObj( *pArrow ) );
ScDrawObjData* pData = ScDrawLayer::GetObjData( pArrow, TRUE );
- pData->aStt.nCol = rRefStart.GetCol();
- pData->aStt.nRow = rRefStart.GetRow();
- pData->aStt.nTab = rRefStart.GetTab();
+ pData->aStt.nCol = nStartCol;
+ pData->aStt.nRow = nStartRow;
+ pData->aStt.nTab = nTab;
pData->bValidStart = TRUE;
pData->bValidEnd = FALSE;
return TRUE;
}
+//------------------------------------------------------------------------
+
+// DrawEntry: Formel auf dieser Tabelle,
+// Referenz auf dieser oder anderer
+// DrawAlienEntry: Formel auf anderer Tabelle,
+// Referenz auf dieser
+
+// return FALSE: da war schon ein Pfeil
+
+BOOL ScDetectiveFunc::DrawEntry( USHORT nCol, USHORT nRow,
+ const ScTripel& rRefStart, const ScTripel& rRefEnd,
+ ScDetectiveData& rData )
+{
+ if ( HasArrow( rRefStart.GetCol(), rRefStart.GetRow(), rRefStart.GetTab(),
+ nCol, nRow, nTab ) )
+ return FALSE;
+
+ ScTripel aErrorPos;
+ BOOL bError = HasError( rRefStart, rRefEnd, aErrorPos );
+ BOOL bAlien = ( rRefEnd.GetTab() < nTab || rRefStart.GetTab() > nTab );
+
+ return InsertArrow( nCol, nRow,
+ rRefStart.GetCol(), rRefStart.GetRow(),
+ rRefEnd.GetCol(), rRefEnd.GetRow(),
+ bAlien, bError, rData );
+}
+
+BOOL ScDetectiveFunc::DrawAlienEntry( const ScTripel& rRefStart, const ScTripel& rRefEnd,
+ ScDetectiveData& rData )
+{
+ if ( HasArrow( rRefStart.GetCol(), rRefStart.GetRow(), rRefStart.GetTab(),
+ 0, 0, nTab+1 ) )
+ return FALSE;
+
+ ScTripel aErrorPos;
+ BOOL bError = HasError( rRefStart, rRefEnd, aErrorPos );
+
+ return InsertToOtherTab( rRefStart.GetCol(), rRefStart.GetRow(),
+ rRefEnd.GetCol(), rRefEnd.GetRow(),
+ bError, rData );
+}
+
void ScDetectiveFunc::DrawCircle( USHORT nCol, USHORT nRow, ScDetectiveData& rData )
{
ScDrawLayer* pModel = pDoc->GetDrawLayer();
@@ -1722,3 +1752,31 @@ ScDetectiveObjType ScDetectiveFunc::GetDetectiveObjectType( SdrObject* pObject,
return eType;
}
+void ScDetectiveFunc::InsertObject( ScDetectiveObjType eType,
+ const ScAddress& rPosition, const ScRange& rSource,
+ BOOL bRedLine )
+{
+ ScDrawLayer* pModel = pDoc->GetDrawLayer();
+ if (!pModel) return;
+ ScDetectiveData aData( pModel );
+
+ switch (eType)
+ {
+ case SC_DETOBJ_ARROW:
+ case SC_DETOBJ_FROMOTHERTAB:
+ InsertArrow( rPosition.Col(), rPosition.Row(),
+ rSource.aStart.Col(), rSource.aStart.Row(),
+ rSource.aEnd.Col(), rSource.aEnd.Row(),
+ (eType == SC_DETOBJ_FROMOTHERTAB), bRedLine, aData );
+ break;
+ case SC_DETOBJ_TOOTHERTAB:
+ InsertToOtherTab( rSource.aStart.Col(), rSource.aStart.Row(),
+ rSource.aEnd.Col(), rSource.aEnd.Row(),
+ bRedLine, aData );
+ break;
+ case SC_DETOBJ_CIRCLE:
+ DrawCircle( rPosition.Col(), rPosition.Row(), aData );
+ break;
+ }
+}
+