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