From 0011c596e6293bdd9c1498de338e013849214a9d Mon Sep 17 00:00:00 2001 From: Niklas Nebel Date: Thu, 9 Nov 2000 14:09:26 +0000 Subject: InsertObject --- sc/inc/detfunc.hxx | 18 ++++- sc/source/core/tool/detfunc.cxx | 172 +++++++++++++++++++++++++++------------- 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; + } +} + -- cgit v1.2.3