summaryrefslogtreecommitdiff
path: root/sc/source
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 /sc/source
parent7d1ecb9afe8452f2e84ce7affbefeebce6164e29 (diff)
InsertObject
Diffstat (limited to 'sc/source')
-rw-r--r--sc/source/core/tool/detfunc.cxx172
1 files changed, 115 insertions, 57 deletions
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;
+ }
+}
+