Lines 69-74
Link Here
|
69 |
#include <vcl/svapp.hxx> |
69 |
#include <vcl/svapp.hxx> |
70 |
#include <unotools/ucbstreamhelper.hxx> |
70 |
#include <unotools/ucbstreamhelper.hxx> |
71 |
|
71 |
|
|
|
72 |
#include <basegfx/polygon/b2dpolygon.hxx> |
73 |
#include <basegfx/polygon/b2dpolygontools.hxx> |
74 |
|
72 |
#include "drwlayer.hxx" |
75 |
#include "drwlayer.hxx" |
73 |
#include "drawpage.hxx" |
76 |
#include "drawpage.hxx" |
74 |
#include "global.hxx" |
77 |
#include "global.hxx" |
Lines 526-532
Link Here
|
526 |
} |
529 |
} |
527 |
} |
530 |
} |
528 |
|
531 |
|
529 |
void ScDrawLayer::RecalcPos( SdrObject* pObj, const ScDrawObjData& rData, |
532 |
namespace |
|
|
533 |
{ |
534 |
//Can't have a zero width dimension |
535 |
Rectangle lcl_makeSafeRectangle(const Rectangle &rNew) |
536 |
{ |
537 |
Rectangle aRect = rNew; |
538 |
if (aRect.Bottom() == aRect.Top()) |
539 |
aRect.Bottom() = aRect.Top()+1; |
540 |
if (aRect.Right() == aRect.Left()) |
541 |
aRect.Right() = aRect.Left()+1; |
542 |
return aRect; |
543 |
} |
544 |
|
545 |
Point lcl_calcAvailableDiff(ScDocument &rDoc, SCCOL nCol, SCROW nRow, SCTAB nTab, const Point &aWantedDiff) |
546 |
{ |
547 |
Point aAvailableDiff(aWantedDiff); |
548 |
long nHeight = rDoc.GetRowHeight( nRow, nTab ) * HMM_PER_TWIPS; |
549 |
long nWidth = rDoc.GetColWidth( nCol, nTab ) * HMM_PER_TWIPS; |
550 |
if (aAvailableDiff.Y() > nHeight) |
551 |
aAvailableDiff.Y() = nHeight; |
552 |
if (aAvailableDiff.X() > nWidth) |
553 |
aAvailableDiff.X() = nWidth; |
554 |
return aAvailableDiff; |
555 |
} |
556 |
|
557 |
Rectangle lcl_UpdateCalcPoly(basegfx::B2DPolygon &rCalcPoly, int nWhichPoint, const Point &rPos) |
558 |
{ |
559 |
rCalcPoly.setB2DPoint(nWhichPoint, basegfx::B2DPoint(rPos.X(), rPos.Y())); |
560 |
basegfx::B2DRange aRange(basegfx::tools::getRange(rCalcPoly)); |
561 |
return Rectangle(aRange.getMinX(), aRange.getMinY(), |
562 |
aRange.getMaxX(), aRange.getMaxY()); |
563 |
} |
564 |
} |
565 |
|
566 |
void ScDrawLayer::RecalcPos( SdrObject* pObj, ScDrawObjData& rData, |
530 |
const ScAddress& rOldStart, const ScAddress& /*rOldEnd*/, bool bNegativePage ) |
567 |
const ScAddress& rOldStart, const ScAddress& /*rOldEnd*/, bool bNegativePage ) |
531 |
{ |
568 |
{ |
532 |
DBG_ASSERT( pDoc, "ScDrawLayer::RecalcPos - missing document" ); |
569 |
DBG_ASSERT( pDoc, "ScDrawLayer::RecalcPos - missing document" ); |
Lines 562-567
Link Here
|
562 |
|
599 |
|
563 |
if( bCircle ) |
600 |
if( bCircle ) |
564 |
{ |
601 |
{ |
|
|
602 |
rData.maLastRect = pObj->GetLogicRect(); |
603 |
|
565 |
Point aPos( pDoc->GetColOffset( nCol1, nTab1 ), pDoc->GetRowOffset( nRow1, nTab1 ) ); |
604 |
Point aPos( pDoc->GetColOffset( nCol1, nTab1 ), pDoc->GetRowOffset( nRow1, nTab1 ) ); |
566 |
TwipsToMM( aPos.X() ); |
605 |
TwipsToMM( aPos.X() ); |
567 |
TwipsToMM( aPos.Y() ); |
606 |
TwipsToMM( aPos.Y() ); |
Lines 582-592
Link Here
|
582 |
{ |
621 |
{ |
583 |
if (bRecording) |
622 |
if (bRecording) |
584 |
AddCalcUndo( new SdrUndoGeoObj( *pObj ) ); |
623 |
AddCalcUndo( new SdrUndoGeoObj( *pObj ) ); |
585 |
pObj->SetLogicRect(aRect); |
624 |
rData.maLastRect = lcl_makeSafeRectangle(aRect); |
|
|
625 |
pObj->SetLogicRect(rData.maLastRect); |
586 |
} |
626 |
} |
587 |
} |
627 |
} |
588 |
else if( bArrow ) |
628 |
else if( bArrow ) |
589 |
{ |
629 |
{ |
|
|
630 |
rData.maLastRect = pObj->GetLogicRect(); |
631 |
basegfx::B2DPolygon aCalcPoly; |
632 |
Point aOrigStartPos(pObj->GetPoint(0)); |
633 |
Point aOrigEndPos(pObj->GetPoint(1)); |
634 |
aCalcPoly.append(basegfx::B2DPoint(aOrigStartPos.X(), aOrigStartPos.Y())); |
635 |
aCalcPoly.append(basegfx::B2DPoint(aOrigEndPos.X(), aOrigEndPos.Y())); |
590 |
//! nicht mehrere Undos fuer ein Objekt erzeugen (hinteres kann dann weggelassen werden) |
636 |
//! nicht mehrere Undos fuer ein Objekt erzeugen (hinteres kann dann weggelassen werden) |
591 |
|
637 |
|
592 |
if( bValid1 ) |
638 |
if( bValid1 ) |
Lines 605-610
Link Here
|
605 |
{ |
651 |
{ |
606 |
if (bRecording) |
652 |
if (bRecording) |
607 |
AddCalcUndo( new SdrUndoGeoObj( *pObj ) ); |
653 |
AddCalcUndo( new SdrUndoGeoObj( *pObj ) ); |
|
|
654 |
|
655 |
rData.maLastRect = lcl_UpdateCalcPoly(aCalcPoly, 0, aStartPos); |
608 |
pObj->SetPoint( aStartPos, 0 ); |
656 |
pObj->SetPoint( aStartPos, 0 ); |
609 |
} |
657 |
} |
610 |
|
658 |
|
Lines 619-624
Link Here
|
619 |
{ |
667 |
{ |
620 |
if (bRecording) |
668 |
if (bRecording) |
621 |
AddCalcUndo( new SdrUndoGeoObj( *pObj ) ); |
669 |
AddCalcUndo( new SdrUndoGeoObj( *pObj ) ); |
|
|
670 |
|
671 |
rData.maLastRect = lcl_UpdateCalcPoly(aCalcPoly, 1, aEndPos); |
622 |
pObj->SetPoint( aEndPos, 1 ); |
672 |
pObj->SetPoint( aEndPos, 1 ); |
623 |
} |
673 |
} |
624 |
} |
674 |
} |
Lines 639-644
Link Here
|
639 |
{ |
689 |
{ |
640 |
if (bRecording) |
690 |
if (bRecording) |
641 |
AddCalcUndo( new SdrUndoGeoObj( *pObj ) ); |
691 |
AddCalcUndo( new SdrUndoGeoObj( *pObj ) ); |
|
|
692 |
|
693 |
rData.maLastRect = lcl_UpdateCalcPoly(aCalcPoly, 1, aEndPos); |
642 |
pObj->SetPoint( aEndPos, 1 ); |
694 |
pObj->SetPoint( aEndPos, 1 ); |
643 |
} |
695 |
} |
644 |
|
696 |
|
Lines 655-699
Link Here
|
655 |
{ |
707 |
{ |
656 |
if (bRecording) |
708 |
if (bRecording) |
657 |
AddCalcUndo( new SdrUndoGeoObj( *pObj ) ); |
709 |
AddCalcUndo( new SdrUndoGeoObj( *pObj ) ); |
|
|
710 |
|
711 |
rData.maLastRect = lcl_UpdateCalcPoly(aCalcPoly, 0, aStartPos); |
658 |
pObj->SetPoint( aStartPos, 0 ); |
712 |
pObj->SetPoint( aStartPos, 0 ); |
659 |
} |
713 |
} |
660 |
} |
714 |
} |
661 |
} |
715 |
} |
662 |
} |
716 |
} |
663 |
else // Referenz-Rahmen |
717 |
else |
664 |
{ |
718 |
{ |
|
|
719 |
bool bCanResize = bValid2 && !pObj->IsResizeProtect(); |
720 |
|
721 |
//First time positioning, must be able to at least move it |
722 |
if (rData.maLastRect.IsEmpty()) |
723 |
rData.maLastRect = pObj->GetLogicRect(); |
724 |
|
665 |
DBG_ASSERT( bValid1, "ScDrawLayer::RecalcPos - invalid start position" ); |
725 |
DBG_ASSERT( bValid1, "ScDrawLayer::RecalcPos - invalid start position" ); |
666 |
Point aPos( pDoc->GetColOffset( nCol1, nTab1 ), pDoc->GetRowOffset( nRow1, nTab1 ) ); |
726 |
Point aPos( pDoc->GetColOffset( nCol1, nTab1 ), pDoc->GetRowOffset( nRow1, nTab1 ) ); |
667 |
TwipsToMM( aPos.X() ); |
727 |
TwipsToMM( aPos.X() ); |
668 |
TwipsToMM( aPos.Y() ); |
728 |
TwipsToMM( aPos.Y() ); |
|
|
729 |
aPos += lcl_calcAvailableDiff(*pDoc, nCol1, nRow1, nTab1, rData.maStartOffset); |
669 |
|
730 |
|
670 |
if( bValid2 ) |
731 |
if( bCanResize ) |
671 |
{ |
732 |
{ |
672 |
Point aEnd( pDoc->GetColOffset( nCol2 + 1, nTab2 ), pDoc->GetRowOffset( nRow2 + 1, nTab2 ) ); |
733 |
Point aEnd( pDoc->GetColOffset( nCol2, nTab2 ), pDoc->GetRowOffset( nRow2, nTab2 ) ); |
673 |
TwipsToMM( aEnd.X() ); |
734 |
TwipsToMM( aEnd.X() ); |
674 |
TwipsToMM( aEnd.Y() ); |
735 |
TwipsToMM( aEnd.Y() ); |
|
|
736 |
aEnd += lcl_calcAvailableDiff(*pDoc, nCol2, nRow2, nTab2, rData.maEndOffset); |
675 |
|
737 |
|
676 |
Rectangle aNew( aPos, aEnd ); |
738 |
Rectangle aNew( aPos, aEnd ); |
677 |
if ( bNegativePage ) |
739 |
if ( bNegativePage ) |
678 |
MirrorRectRTL( aNew ); |
740 |
MirrorRectRTL( aNew ); |
679 |
if ( pObj->GetLogicRect() != aNew ) |
741 |
if ( pObj->GetLogicRect() != aNew ) |
680 |
{ |
742 |
{ |
|
|
743 |
Rectangle aOld(pObj->GetLogicRect()); |
744 |
|
681 |
if (bRecording) |
745 |
if (bRecording) |
682 |
AddCalcUndo( new SdrUndoGeoObj( *pObj ) ); |
746 |
AddCalcUndo( new SdrUndoGeoObj( *pObj ) ); |
683 |
pObj->SetLogicRect(aNew); |
747 |
rData.maLastRect = lcl_makeSafeRectangle(aNew); |
|
|
748 |
pObj->SetLogicRect(rData.maLastRect); |
684 |
} |
749 |
} |
685 |
} |
750 |
} |
686 |
else |
751 |
else |
687 |
{ |
752 |
{ |
688 |
if ( bNegativePage ) |
753 |
if ( bNegativePage ) |
689 |
aPos.X() = -aPos.X(); |
754 |
aPos.X() = -aPos.X() - rData.maLastRect.GetWidth(); |
690 |
if ( pObj->GetRelativePos() != aPos ) |
755 |
if ( pObj->GetRelativePos() != aPos ) |
691 |
{ |
756 |
{ |
692 |
if (bRecording) |
757 |
if (bRecording) |
693 |
AddCalcUndo( new SdrUndoGeoObj( *pObj ) ); |
758 |
AddCalcUndo( new SdrUndoGeoObj( *pObj ) ); |
|
|
759 |
rData.maLastRect.SetPos( aPos ); |
694 |
pObj->SetRelativePos( aPos ); |
760 |
pObj->SetRelativePos( aPos ); |
695 |
} |
761 |
} |
696 |
} |
762 |
} |
|
|
763 |
|
764 |
/* |
765 |
* If we were not allowed resize the object, then the end cell anchor |
766 |
* is possibly incorrect now, and if the object has no end-cell (e.g. |
767 |
* missing in original .xml) we are also forced to generate one |
768 |
*/ |
769 |
bool bEndAnchorIsBad = !bValid2 || pObj->IsResizeProtect(); |
770 |
if (bEndAnchorIsBad) |
771 |
ScDrawLayer::UpdateCellAnchorFromPositionEnd(*pObj, *pDoc, nTab1); |
697 |
} |
772 |
} |
698 |
} |
773 |
} |
699 |
|
774 |
|
Lines 868-1018
Link Here
|
868 |
return pRet; |
943 |
return pRet; |
869 |
} |
944 |
} |
870 |
|
945 |
|
871 |
// MoveAreaTwips: all measures are kept in twips |
|
|
872 |
void ScDrawLayer::MoveAreaTwips( SCTAB nTab, const Rectangle& rArea, |
873 |
const Point& rMove, const Point& rTopLeft ) |
874 |
{ |
875 |
if (!rMove.X() && !rMove.Y()) |
876 |
return; // nix |
877 |
|
878 |
SdrPage* pPage = GetPage(static_cast<sal_uInt16>(nTab)); |
879 |
DBG_ASSERT(pPage,"Page nicht gefunden"); |
880 |
if (!pPage) |
881 |
return; |
882 |
|
883 |
BOOL bNegativePage = pDoc && pDoc->IsNegativePage( nTab ); |
884 |
|
885 |
// fuer Shrinking! |
886 |
Rectangle aNew( rArea ); |
887 |
BOOL bShrink = FALSE; |
888 |
if ( rMove.X() < 0 || rMove.Y() < 0 ) // verkleinern |
889 |
{ |
890 |
if ( rTopLeft != rArea.TopLeft() ) // sind gleich beim Verschieben von Zellen |
891 |
{ |
892 |
bShrink = TRUE; |
893 |
aNew.Left() = rTopLeft.X(); |
894 |
aNew.Top() = rTopLeft.Y(); |
895 |
} |
896 |
} |
897 |
SdrObjListIter aIter( *pPage, IM_FLAT ); |
898 |
SdrObject* pObject = aIter.Next(); |
899 |
while (pObject) |
900 |
{ |
901 |
if( GetAnchor( pObject ) == SCA_CELL ) |
902 |
{ |
903 |
if ( GetObjData( pObject ) ) // Detektiv-Pfeil ? |
904 |
{ |
905 |
// hier nichts |
906 |
} |
907 |
else if ( pObject->ISA( SdrEdgeObj ) ) // Verbinder? |
908 |
{ |
909 |
// hier auch nichts |
910 |
//! nicht verbundene Enden wie bei Linien (s.u.) behandeln? |
911 |
} |
912 |
else if ( pObject->IsPolyObj() && pObject->GetPointCount()==2 ) |
913 |
{ |
914 |
for (USHORT i=0; i<2; i++) |
915 |
{ |
916 |
BOOL bMoved = FALSE; |
917 |
Point aPoint = pObject->GetPoint(i); |
918 |
lcl_ReverseTwipsToMM( aPoint ); |
919 |
if (rArea.IsInside(aPoint)) |
920 |
{ |
921 |
aPoint += rMove; bMoved = TRUE; |
922 |
} |
923 |
else if (bShrink && aNew.IsInside(aPoint)) |
924 |
{ |
925 |
// Punkt ist in betroffener Zelle - Test auf geloeschten Bereich |
926 |
if ( rMove.X() && aPoint.X() >= rArea.Left() + rMove.X() ) |
927 |
{ |
928 |
aPoint.X() = rArea.Left() + rMove.X() - SHRINK_DIST_TWIPS; |
929 |
if ( aPoint.X() < 0 ) aPoint.X() = 0; |
930 |
bMoved = TRUE; |
931 |
} |
932 |
if ( rMove.Y() && aPoint.Y() >= rArea.Top() + rMove.Y() ) |
933 |
{ |
934 |
aPoint.Y() = rArea.Top() + rMove.Y() - SHRINK_DIST_TWIPS; |
935 |
if ( aPoint.Y() < 0 ) aPoint.Y() = 0; |
936 |
bMoved = TRUE; |
937 |
} |
938 |
} |
939 |
if( bMoved ) |
940 |
{ |
941 |
AddCalcUndo( new SdrUndoGeoObj( *pObject ) ); |
942 |
lcl_TwipsToMM( aPoint ); |
943 |
pObject->SetPoint( aPoint, i ); |
944 |
} |
945 |
} |
946 |
} |
947 |
else |
948 |
{ |
949 |
Rectangle aObjRect = pObject->GetLogicRect(); |
950 |
// aOldMMPos: not converted, millimeters |
951 |
Point aOldMMPos = bNegativePage ? aObjRect.TopRight() : aObjRect.TopLeft(); |
952 |
lcl_ReverseTwipsToMM( aObjRect ); |
953 |
Point aTopLeft = bNegativePage ? aObjRect.TopRight() : aObjRect.TopLeft(); // logical left |
954 |
Size aMoveSize; |
955 |
BOOL bDoMove = FALSE; |
956 |
if (rArea.IsInside(aTopLeft)) |
957 |
{ |
958 |
aMoveSize = Size(rMove.X(),rMove.Y()); |
959 |
bDoMove = TRUE; |
960 |
} |
961 |
else if (bShrink && aNew.IsInside(aTopLeft)) |
962 |
{ |
963 |
// Position ist in betroffener Zelle - Test auf geloeschten Bereich |
964 |
if ( rMove.X() && aTopLeft.X() >= rArea.Left() + rMove.X() ) |
965 |
{ |
966 |
aMoveSize.Width() = rArea.Left() + rMove.X() - SHRINK_DIST - aTopLeft.X(); |
967 |
bDoMove = TRUE; |
968 |
} |
969 |
if ( rMove.Y() && aTopLeft.Y() >= rArea.Top() + rMove.Y() ) |
970 |
{ |
971 |
aMoveSize.Height() = rArea.Top() + rMove.Y() - SHRINK_DIST - aTopLeft.Y(); |
972 |
bDoMove = TRUE; |
973 |
} |
974 |
} |
975 |
if ( bDoMove ) |
976 |
{ |
977 |
if ( bNegativePage ) |
978 |
{ |
979 |
if ( aTopLeft.X() + aMoveSize.Width() > 0 ) |
980 |
aMoveSize.Width() = -aTopLeft.X(); |
981 |
} |
982 |
else |
983 |
{ |
984 |
if ( aTopLeft.X() + aMoveSize.Width() < 0 ) |
985 |
aMoveSize.Width() = -aTopLeft.X(); |
986 |
} |
987 |
if ( aTopLeft.Y() + aMoveSize.Height() < 0 ) |
988 |
aMoveSize.Height() = -aTopLeft.Y(); |
989 |
|
990 |
// get corresponding move size in millimeters: |
991 |
Point aNewPos( aTopLeft.X() + aMoveSize.Width(), aTopLeft.Y() + aMoveSize.Height() ); |
992 |
lcl_TwipsToMM( aNewPos ); |
993 |
aMoveSize = Size( aNewPos.X() - aOldMMPos.X(), aNewPos.Y() - aOldMMPos.Y() ); // millimeters |
994 |
|
995 |
AddCalcUndo( new SdrUndoMoveObj( *pObject, aMoveSize ) ); |
996 |
pObject->Move( aMoveSize ); |
997 |
} |
998 |
else if ( rArea.IsInside( bNegativePage ? aObjRect.BottomLeft() : aObjRect.BottomRight() ) && |
999 |
!pObject->IsResizeProtect() ) |
1000 |
{ |
1001 |
// geschuetzte Groessen werden nicht veraendert |
1002 |
// (Positionen schon, weil sie ja an der Zelle "verankert" sind) |
1003 |
AddCalcUndo( new SdrUndoGeoObj( *pObject ) ); |
1004 |
long nOldSizeX = aObjRect.Right() - aObjRect.Left() + 1; |
1005 |
long nOldSizeY = aObjRect.Bottom() - aObjRect.Top() + 1; |
1006 |
long nLogMoveX = rMove.X() * ( bNegativePage ? -1 : 1 ); // logical direction |
1007 |
pObject->Resize( aOldMMPos, Fraction( nOldSizeX+nLogMoveX, nOldSizeX ), |
1008 |
Fraction( nOldSizeY+rMove.Y(), nOldSizeY ) ); |
1009 |
} |
1010 |
} |
1011 |
} |
1012 |
pObject = aIter.Next(); |
1013 |
} |
1014 |
} |
1015 |
|
1016 |
void ScDrawLayer::MoveArea( SCTAB nTab, SCCOL nCol1,SCROW nRow1, SCCOL nCol2,SCROW nRow2, |
946 |
void ScDrawLayer::MoveArea( SCTAB nTab, SCCOL nCol1,SCROW nRow1, SCCOL nCol2,SCROW nRow2, |
1017 |
SCsCOL nDx,SCsROW nDy, BOOL bInsDel ) |
947 |
SCsCOL nDx,SCsROW nDy, BOOL bInsDel ) |
1018 |
{ |
948 |
{ |
Lines 1054-1064
Link Here
|
1054 |
aTopLeft.Y() += aMove.Y(); |
984 |
aTopLeft.Y() += aMove.Y(); |
1055 |
} |
985 |
} |
1056 |
|
986 |
|
1057 |
// drawing objects are now directly included in cut&paste |
|
|
1058 |
// -> only update references when inserting/deleting (or changing widths or heights) |
1059 |
if ( bInsDel ) |
1060 |
MoveAreaTwips( nTab, aRect, aMove, aTopLeft ); |
1061 |
|
1062 |
// |
987 |
// |
1063 |
// Detektiv-Pfeile: Zellpositionen anpassen |
988 |
// Detektiv-Pfeile: Zellpositionen anpassen |
1064 |
// |
989 |
// |
Lines 1096-1103
Link Here
|
1096 |
aTopLeft.X() = -aTopLeft.X(); |
1021 |
aTopLeft.X() = -aTopLeft.X(); |
1097 |
nDifTwips = -nDifTwips; |
1022 |
nDifTwips = -nDifTwips; |
1098 |
} |
1023 |
} |
1099 |
|
|
|
1100 |
MoveAreaTwips( nTab, aRect, Point( nDifTwips,0 ), aTopLeft ); |
1101 |
} |
1024 |
} |
1102 |
|
1025 |
|
1103 |
void ScDrawLayer::HeightChanged( SCTAB nTab, SCROW nRow, long nDifTwips ) |
1026 |
void ScDrawLayer::HeightChanged( SCTAB nTab, SCROW nRow, long nDifTwips ) |
Lines 1128-1135
Link Here
|
1128 |
MirrorRectRTL( aRect ); |
1051 |
MirrorRectRTL( aRect ); |
1129 |
aTopLeft.X() = -aTopLeft.X(); |
1052 |
aTopLeft.X() = -aTopLeft.X(); |
1130 |
} |
1053 |
} |
1131 |
|
|
|
1132 |
MoveAreaTwips( nTab, aRect, Point( 0,nDifTwips ), aTopLeft ); |
1133 |
} |
1054 |
} |
1134 |
|
1055 |
|
1135 |
BOOL ScDrawLayer::HasObjectsInRows( SCTAB nTab, SCROW nStartRow, SCROW nEndRow ) |
1056 |
BOOL ScDrawLayer::HasObjectsInRows( SCTAB nTab, SCROW nStartRow, SCROW nEndRow ) |
Lines 1807-1836
Link Here
|
1807 |
} |
1728 |
} |
1808 |
} |
1729 |
} |
1809 |
|
1730 |
|
1810 |
void ScDrawLayer::SetAnchor( SdrObject* pObj, ScAnchorType eType ) |
1731 |
namespace |
1811 |
{ |
1732 |
{ |
1812 |
// Ein an der Seite verankertes Objekt zeichnet sich durch eine Anker-Pos |
1733 |
SdrObjUserData* GetFirstUserDataOfType(const SdrObject *pObj, UINT16 nId) |
1813 |
// von (0,1) aus. Das ist ein shabby Trick, der aber funktioniert! |
1734 |
{ |
1814 |
Point aAnchor( 0, eType == SCA_PAGE ? 1 : 0 ); |
1735 |
USHORT nCount = pObj ? pObj->GetUserDataCount() : 0; |
1815 |
pObj->SetAnchorPos( aAnchor ); |
1736 |
for( USHORT i = 0; i < nCount; i++ ) |
|
|
1737 |
{ |
1738 |
SdrObjUserData* pData = pObj->GetUserData( i ); |
1739 |
if( pData && pData->GetInventor() == SC_DRAWLAYER && pData->GetId() == nId ) |
1740 |
return pData; |
1741 |
} |
1742 |
return NULL; |
1743 |
} |
1744 |
|
1745 |
void DeleteFirstUserDataOfType(SdrObject *pObj, UINT16 nId) |
1746 |
{ |
1747 |
USHORT nCount = pObj ? pObj->GetUserDataCount() : 0; |
1748 |
for( USHORT i = nCount; i > 0; i-- ) |
1749 |
{ |
1750 |
SdrObjUserData* pData = pObj->GetUserData( i-1 ); |
1751 |
if( pData && pData->GetInventor() == SC_DRAWLAYER && pData->GetId() == nId ) |
1752 |
pObj->DeleteUserData(i-1); |
1753 |
} |
1754 |
} |
1755 |
} |
1756 |
|
1757 |
void ScDrawLayer::SetCellAnchored( SdrObject &rObj, const ScDrawObjData &rAnchor ) |
1758 |
{ |
1759 |
ScDrawObjData* pAnchor = GetObjData( &rObj, true ); |
1760 |
pAnchor->maStart = rAnchor.maStart; |
1761 |
pAnchor->maEnd = rAnchor.maEnd; |
1762 |
pAnchor->maStartOffset = rAnchor.maStartOffset; |
1763 |
pAnchor->maEndOffset = rAnchor.maEndOffset; |
1764 |
} |
1765 |
|
1766 |
void ScDrawLayer::SetCellAnchoredFromPosition( SdrObject &rObj, const ScDocument &rDoc, SCTAB nTab ) |
1767 |
{ |
1768 |
Rectangle aObjRect(rObj.GetLogicRect()); |
1769 |
ScRange aRange = rDoc.GetRange( nTab, aObjRect ); |
1770 |
|
1771 |
Rectangle aCellRect; |
1772 |
|
1773 |
ScDrawObjData aAnchor; |
1774 |
aAnchor.maStart = aRange.aStart; |
1775 |
aCellRect = rDoc.GetMMRect( aRange.aStart.Col(), aRange.aStart.Row(), |
1776 |
aRange.aStart.Col(), aRange.aStart.Row(), aRange.aStart.Tab() ); |
1777 |
aAnchor.maStartOffset.Y() = aObjRect.Top()-aCellRect.Top(); |
1778 |
if (!rDoc.IsNegativePage(nTab)) |
1779 |
aAnchor.maStartOffset.X() = aObjRect.Left()-aCellRect.Left(); |
1780 |
else |
1781 |
aAnchor.maStartOffset.X() = aCellRect.Right()-aObjRect.Right(); |
1782 |
|
1783 |
aAnchor.maEnd = aRange.aEnd; |
1784 |
aCellRect = rDoc.GetMMRect( aRange.aEnd.Col(), aRange.aEnd.Row(), |
1785 |
aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aEnd.Tab() ); |
1786 |
aAnchor.maEndOffset.Y() = aObjRect.Bottom()-aCellRect.Top(); |
1787 |
if (!rDoc.IsNegativePage(nTab)) |
1788 |
aAnchor.maEndOffset.X() = aObjRect.Right()-aCellRect.Left(); |
1789 |
else |
1790 |
aAnchor.maEndOffset.X() = aCellRect.Right()-aObjRect.Left(); |
1791 |
|
1792 |
SetCellAnchored( rObj, aAnchor ); |
1793 |
} |
1794 |
|
1795 |
void ScDrawLayer::UpdateCellAnchorFromPositionEnd( SdrObject &rObj, const ScDocument &rDoc, SCTAB nTab ) |
1796 |
{ |
1797 |
Rectangle aObjRect(rObj.GetLogicRect()); |
1798 |
ScRange aRange = rDoc.GetRange( nTab, aObjRect ); |
1799 |
|
1800 |
ScDrawObjData* pAnchor = GetObjData( &rObj, true ); |
1801 |
pAnchor->maEnd = aRange.aEnd; |
1802 |
|
1803 |
Rectangle aCellRect; |
1804 |
aCellRect = rDoc.GetMMRect( aRange.aEnd.Col(), aRange.aEnd.Row(), |
1805 |
aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aEnd.Tab() ); |
1806 |
pAnchor->maEndOffset.Y() = aObjRect.Bottom()-aCellRect.Top(); |
1807 |
if (!rDoc.IsNegativePage(nTab)) |
1808 |
pAnchor->maEndOffset.X() = aObjRect.Right()-aCellRect.Left(); |
1809 |
else |
1810 |
pAnchor->maEndOffset.X() = aCellRect.Right()-aObjRect.Left(); |
1811 |
} |
1812 |
|
1813 |
void ScDrawLayer::SetPageAnchored( SdrObject &rObj ) |
1814 |
{ |
1815 |
DeleteFirstUserDataOfType(&rObj, SC_UD_OBJDATA); |
1816 |
} |
1816 |
} |
1817 |
|
1817 |
|
1818 |
ScAnchorType ScDrawLayer::GetAnchor( const SdrObject* pObj ) |
1818 |
ScAnchorType ScDrawLayer::GetAnchorType( const SdrObject &rObj ) |
1819 |
{ |
1819 |
{ |
1820 |
Point aAnchor( pObj->GetAnchorPos() ); |
1820 |
//If this object has a cell anchor associated with it |
1821 |
return ( aAnchor.Y() != 0 ) ? SCA_PAGE : SCA_CELL; |
1821 |
//then its cell-anchored, otherwise its page-anchored |
|
|
1822 |
return ScDrawLayer::GetObjData(const_cast<SdrObject*>(&rObj)) ? SCA_CELL : SCA_PAGE; |
1822 |
} |
1823 |
} |
1823 |
|
1824 |
|
1824 |
ScDrawObjData* ScDrawLayer::GetObjData( SdrObject* pObj, BOOL bCreate ) // static |
1825 |
ScDrawObjData* ScDrawLayer::GetObjData( SdrObject* pObj, BOOL bCreate ) // static |
1825 |
{ |
1826 |
{ |
1826 |
USHORT nCount = pObj ? pObj->GetUserDataCount() : 0; |
1827 |
if (SdrObjUserData *pData = GetFirstUserDataOfType(pObj, SC_UD_OBJDATA)) |
1827 |
for( USHORT i = 0; i < nCount; i++ ) |
1828 |
return (ScDrawObjData*) pData; |
1828 |
{ |
1829 |
|
1829 |
SdrObjUserData* pData = pObj->GetUserData( i ); |
|
|
1830 |
if( pData && pData->GetInventor() == SC_DRAWLAYER |
1831 |
&& pData->GetId() == SC_UD_OBJDATA ) |
1832 |
return (ScDrawObjData*) pData; |
1833 |
} |
1834 |
if( pObj && bCreate ) |
1830 |
if( pObj && bCreate ) |
1835 |
{ |
1831 |
{ |
1836 |
ScDrawObjData* pData = new ScDrawObjData; |
1832 |
ScDrawObjData* pData = new ScDrawObjData; |
Lines 1867-1881
Link Here
|
1867 |
|
1863 |
|
1868 |
ScIMapInfo* ScDrawLayer::GetIMapInfo( SdrObject* pObj ) // static |
1864 |
ScIMapInfo* ScDrawLayer::GetIMapInfo( SdrObject* pObj ) // static |
1869 |
{ |
1865 |
{ |
1870 |
USHORT nCount = pObj->GetUserDataCount(); |
1866 |
return (ScIMapInfo*)GetFirstUserDataOfType(pObj, SC_UD_IMAPDATA); |
1871 |
for( USHORT i = 0; i < nCount; i++ ) |
|
|
1872 |
{ |
1873 |
SdrObjUserData* pData = pObj->GetUserData( i ); |
1874 |
if( pData && pData->GetInventor() == SC_DRAWLAYER |
1875 |
&& pData->GetId() == SC_UD_IMAPDATA ) |
1876 |
return (ScIMapInfo*) pData; |
1877 |
} |
1878 |
return NULL; |
1879 |
} |
1867 |
} |
1880 |
|
1868 |
|
1881 |
// static: |
1869 |
// static: |
Lines 1928-1934
Link Here
|
1928 |
else if ( pObj->ISA( SdrOle2Obj ) ) // OLE-Objekt |
1916 |
else if ( pObj->ISA( SdrOle2Obj ) ) // OLE-Objekt |
1929 |
{ |
1917 |
{ |
1930 |
// TODO/LEAN: working with visual area needs running state |
1918 |
// TODO/LEAN: working with visual area needs running state |
1931 |
aGraphSize = ((SdrOle2Obj*)pObj)->GetOrigObjSize(); |
1919 |
aGraphSize = ((const SdrOle2Obj*)pObj)->GetOrigObjSize(); |
1932 |
bObjSupported = TRUE; |
1920 |
bObjSupported = TRUE; |
1933 |
} |
1921 |
} |
1934 |
|
1922 |
|
Lines 1946-1959
Link Here
|
1946 |
|
1934 |
|
1947 |
ScMacroInfo* ScDrawLayer::GetMacroInfo( SdrObject* pObj, BOOL bCreate ) // static |
1935 |
ScMacroInfo* ScDrawLayer::GetMacroInfo( SdrObject* pObj, BOOL bCreate ) // static |
1948 |
{ |
1936 |
{ |
1949 |
USHORT nCount = pObj->GetUserDataCount(); |
1937 |
if (SdrObjUserData *pData = GetFirstUserDataOfType(pObj, SC_UD_MACRODATA)) |
1950 |
for( USHORT i = 0; i < nCount; i++ ) |
1938 |
return (ScMacroInfo*) pData; |
1951 |
{ |
1939 |
|
1952 |
SdrObjUserData* pData = pObj->GetUserData( i ); |
|
|
1953 |
if( pData && pData->GetInventor() == SC_DRAWLAYER |
1954 |
&& pData->GetId() == SC_UD_MACRODATA ) |
1955 |
return (ScMacroInfo*) pData; |
1956 |
} |
1957 |
if ( bCreate ) |
1940 |
if ( bCreate ) |
1958 |
{ |
1941 |
{ |
1959 |
ScMacroInfo* pData = new ScMacroInfo; |
1942 |
ScMacroInfo* pData = new ScMacroInfo; |