2000-09-18 16:07:07 +00:00
/*************************************************************************
*
2008-04-11 01:56:12 +00:00
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER .
2000-09-18 16:07:07 +00:00
*
2008-04-11 01:56:12 +00:00
* Copyright 2008 by Sun Microsystems , Inc .
2000-09-18 16:07:07 +00:00
*
2008-04-11 01:56:12 +00:00
* OpenOffice . org - a multi - platform office productivity suite
2000-09-18 16:07:07 +00:00
*
2008-04-11 01:56:12 +00:00
* $ RCSfile : svdedtv1 . cxx , v $
* $ Revision : 1.30 $
2000-09-18 16:07:07 +00:00
*
2008-04-11 01:56:12 +00:00
* This file is part of OpenOffice . org .
2000-09-18 16:07:07 +00:00
*
2008-04-11 01:56:12 +00:00
* OpenOffice . org is free software : you can redistribute it and / or modify
* it under the terms of the GNU Lesser General Public License version 3
* only , as published by the Free Software Foundation .
2000-09-18 16:07:07 +00:00
*
2008-04-11 01:56:12 +00:00
* OpenOffice . org is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Lesser General Public License version 3 for more details
* ( a copy is included in the LICENSE file that accompanied this code ) .
2000-09-18 16:07:07 +00:00
*
2008-04-11 01:56:12 +00:00
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice . org . If not , see
* < http : //www.openoffice.org/license.html>
* for a copy of the LGPLv3 License .
2000-09-18 16:07:07 +00:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2006-09-17 04:49:14 +00:00
// MARKER(update_precomp.py): autogen include statement, do not remove
# include "precompiled_svx.hxx"
2007-06-27 17:59:56 +00:00
# include <svx/svdedtv.hxx>
2000-09-18 16:07:07 +00:00
# include <math.h>
# ifndef _MATH_H
# define _MATH_H
# endif
# include <tools/bigint.hxx>
# include <svtools/itemiter.hxx>
# include <vcl/msgbox.hxx>
2007-06-27 17:59:56 +00:00
# include <svx/rectenum.hxx>
2000-09-18 16:07:07 +00:00
2007-06-27 17:59:56 +00:00
# include <svx/svxids.hrc> // fuer SID_ATTR_TRANSFORM_...
# include <svx/svdattr.hxx> // fuer Get/SetGeoAttr
2000-09-18 16:07:07 +00:00
# include "svditext.hxx"
# include "svditer.hxx"
2007-06-27 17:59:56 +00:00
# include <svx/svdtrans.hxx>
# include <svx/svdundo.hxx>
# include <svx/svdpage.hxx>
# include <svx/svdpagv.hxx>
# include <svx/svdlayer.hxx> // fuer MergeNotPersistAttr
# include <svx/svdattrx.hxx> // fuer MergeNotPersistAttr
# include <svx/svdetc.hxx> // fuer SearchOutlinerItems
# include <svx/svdopath.hxx> // fuer Crook
2000-09-18 16:07:07 +00:00
# include "svdstr.hrc" // Namen aus der Resource
# include "svdglob.hxx" // StringCache
2007-06-27 17:59:56 +00:00
# include <svx/eeitem.hxx>
2000-09-18 16:07:07 +00:00
# include <svtools/aeitem.hxx>
# include <svtools/whiter.hxx>
2005-01-28 15:31:38 +00:00
# include <svx/sdr/contact/objectcontact.hxx>
// #i38495#
# include <svx/sdr/contact/viewcontact.hxx>
2000-09-18 16:07:07 +00:00
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//
// @@@@@ @@@@@ @@ @@@@@@ @@ @@ @@ @@@@@ @@ @@
// @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
// @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @ @@
// @@@@ @@ @@ @@ @@ @@@@@ @@ @@@@ @@@@@@@
// @@ @@ @@ @@ @@ @@@ @@ @@ @@@@@@@
// @@ @@ @@ @@ @@ @@@ @@ @@ @@@ @@@
// @@@@@ @@@@@ @@ @@ @ @@ @@@@@ @@ @@
//
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
void SdrEditView : : SetMarkedObjRect ( const Rectangle & rRect , BOOL bCopy )
{
DBG_ASSERT ( ! rRect . IsEmpty ( ) , " SetMarkedObjRect() mit leerem Rect mach keinen Sinn " ) ;
if ( rRect . IsEmpty ( ) ) return ;
2004-07-12 13:44:58 +00:00
ULONG nAnz = GetMarkedObjectCount ( ) ;
2000-09-18 16:07:07 +00:00
if ( nAnz = = 0 ) return ;
Rectangle aR0 ( GetMarkedObjRect ( ) ) ;
DBG_ASSERT ( ! aR0 . IsEmpty ( ) , " SetMarkedObjRect(): GetMarkedObjRect() ist leer " ) ;
if ( aR0 . IsEmpty ( ) ) return ;
long x0 = aR0 . Left ( ) ;
long y0 = aR0 . Top ( ) ;
long w0 = aR0 . Right ( ) - x0 ;
long h0 = aR0 . Bottom ( ) - y0 ;
long x1 = rRect . Left ( ) ;
long y1 = rRect . Top ( ) ;
long w1 = rRect . Right ( ) - x1 ;
long h1 = rRect . Bottom ( ) - y1 ;
XubString aStr ;
ImpTakeDescriptionStr ( STR_EditPosSize , aStr ) ;
if ( bCopy ) aStr + = ImpGetResStr ( STR_EditWithCopy ) ;
BegUndo ( aStr ) ;
if ( bCopy ) CopyMarkedObj ( ) ;
for ( ULONG nm = 0 ; nm < nAnz ; nm + + ) {
2004-07-12 13:44:58 +00:00
SdrMark * pM = GetSdrMarkByIndex ( nm ) ;
2006-07-25 11:55:34 +00:00
SdrObject * pO = pM - > GetMarkedSdrObj ( ) ;
2006-01-10 13:49:16 +00:00
AddUndo ( GetModel ( ) - > GetSdrUndoFactory ( ) . CreateUndoGeoObject ( * pO ) ) ;
2000-09-18 16:07:07 +00:00
Rectangle aR1 ( pO - > GetSnapRect ( ) ) ;
if ( ! aR1 . IsEmpty ( ) ) {
if ( aR1 = = aR0 ) aR1 = rRect ;
else { // aR1 von aR0 nach rRect transformieren
aR1 . Move ( - x0 , - y0 ) ;
BigInt l ( aR1 . Left ( ) ) ;
BigInt r ( aR1 . Right ( ) ) ;
BigInt t ( aR1 . Top ( ) ) ;
BigInt b ( aR1 . Bottom ( ) ) ;
if ( w0 ! = 0 ) {
l * = w1 ; l / = w0 ;
r * = w1 ; r / = w0 ;
} else {
l = 0 ; r = w1 ;
}
if ( h0 ! = 0 ) {
t * = h1 ; t / = h0 ;
b * = h1 ; b / = h0 ;
} else {
t = 0 ; b = h1 ;
}
aR1 . Left ( ) = long ( l ) ;
aR1 . Right ( ) = long ( r ) ;
aR1 . Top ( ) = long ( t ) ;
aR1 . Bottom ( ) = long ( b ) ;
aR1 . Move ( x1 , y1 ) ;
}
pO - > SetSnapRect ( aR1 ) ;
} else {
DBG_ERROR ( " SetMarkedObjRect(): pObj->GetSnapRect() liefert leeres Rect " ) ;
}
}
EndUndo ( ) ;
}
2006-10-12 12:08:49 +00:00
void SdrEditView : : MoveMarkedObj ( const Size & rSiz , bool bCopy )
2000-09-18 16:07:07 +00:00
{
XubString aStr ( ImpGetResStr ( STR_EditMove ) ) ;
if ( bCopy ) aStr + = ImpGetResStr ( STR_EditWithCopy ) ;
// benoetigt eigene UndoGroup wegen Parameter
2004-07-12 13:44:58 +00:00
BegUndo ( aStr , GetDescriptionOfMarkedObjects ( ) , SDRREPFUNC_OBJ_MOVE ) ;
2000-09-18 16:07:07 +00:00
if ( bCopy ) CopyMarkedObj ( ) ;
2004-07-12 13:44:58 +00:00
ULONG nMarkAnz = GetMarkedObjectCount ( ) ;
2000-09-18 16:07:07 +00:00
for ( ULONG nm = 0 ; nm < nMarkAnz ; nm + + ) {
2004-07-12 13:44:58 +00:00
SdrMark * pM = GetSdrMarkByIndex ( nm ) ;
2006-07-25 11:55:34 +00:00
SdrObject * pO = pM - > GetMarkedSdrObj ( ) ;
2006-01-10 13:49:16 +00:00
AddUndo ( GetModel ( ) - > GetSdrUndoFactory ( ) . CreateUndoMoveObject ( * pO , rSiz ) ) ;
2000-09-18 16:07:07 +00:00
pO - > Move ( rSiz ) ;
}
EndUndo ( ) ;
}
2006-10-12 12:08:49 +00:00
void SdrEditView : : ResizeMarkedObj ( const Point & rRef , const Fraction & xFact , const Fraction & yFact , bool bCopy )
2000-09-18 16:07:07 +00:00
{
XubString aStr ;
ImpTakeDescriptionStr ( STR_EditResize , aStr ) ;
if ( bCopy ) aStr + = ImpGetResStr ( STR_EditWithCopy ) ;
BegUndo ( aStr ) ;
if ( bCopy ) CopyMarkedObj ( ) ;
2004-07-12 13:44:58 +00:00
ULONG nMarkAnz = GetMarkedObjectCount ( ) ;
2000-09-18 16:07:07 +00:00
for ( ULONG nm = 0 ; nm < nMarkAnz ; nm + + ) {
2004-07-12 13:44:58 +00:00
SdrMark * pM = GetSdrMarkByIndex ( nm ) ;
2006-07-25 11:55:34 +00:00
SdrObject * pO = pM - > GetMarkedSdrObj ( ) ;
2006-01-10 13:49:16 +00:00
AddUndo ( GetModel ( ) - > GetSdrUndoFactory ( ) . CreateUndoGeoObject ( * pO ) ) ;
2006-11-14 12:40:55 +00:00
pO - > Resize ( rRef , xFact , yFact ) ;
2000-09-18 16:07:07 +00:00
}
EndUndo ( ) ;
}
long SdrEditView : : GetMarkedObjRotate ( ) const
{
BOOL b1st = TRUE ;
BOOL bOk = TRUE ;
long nWink = 0 ;
2004-07-12 13:44:58 +00:00
ULONG nMarkAnz = GetMarkedObjectCount ( ) ;
2000-09-18 16:07:07 +00:00
for ( ULONG nm = 0 ; nm < nMarkAnz & & bOk ; nm + + ) {
2004-07-12 13:44:58 +00:00
SdrMark * pM = GetSdrMarkByIndex ( nm ) ;
2006-07-25 11:55:34 +00:00
SdrObject * pO = pM - > GetMarkedSdrObj ( ) ;
2000-09-18 16:07:07 +00:00
long nWink2 = pO - > GetRotateAngle ( ) ;
if ( b1st ) nWink = nWink2 ;
else if ( nWink2 ! = nWink ) bOk = FALSE ;
b1st = FALSE ;
}
if ( ! bOk ) nWink = 0 ;
return nWink ;
}
2006-10-12 12:08:49 +00:00
void SdrEditView : : RotateMarkedObj ( const Point & rRef , long nWink , bool bCopy )
2000-09-18 16:07:07 +00:00
{
XubString aStr ;
ImpTakeDescriptionStr ( STR_EditRotate , aStr ) ;
if ( bCopy ) aStr + = ImpGetResStr ( STR_EditWithCopy ) ;
BegUndo ( aStr ) ;
if ( bCopy ) CopyMarkedObj ( ) ;
double nSin = sin ( nWink * nPi180 ) ;
double nCos = cos ( nWink * nPi180 ) ;
2004-07-12 13:44:58 +00:00
ULONG nMarkAnz = GetMarkedObjectCount ( ) ;
2000-09-18 16:07:07 +00:00
for ( ULONG nm = 0 ; nm < nMarkAnz ; nm + + ) {
2004-07-12 13:44:58 +00:00
SdrMark * pM = GetSdrMarkByIndex ( nm ) ;
2006-07-25 11:55:34 +00:00
SdrObject * pO = pM - > GetMarkedSdrObj ( ) ;
2006-01-10 13:49:16 +00:00
AddUndo ( GetModel ( ) - > GetSdrUndoFactory ( ) . CreateUndoGeoObject ( * pO ) ) ;
2006-11-14 12:40:55 +00:00
pO - > Rotate ( rRef , nWink , nSin , nCos ) ;
2000-09-18 16:07:07 +00:00
}
EndUndo ( ) ;
}
2006-10-12 12:08:49 +00:00
void SdrEditView : : MirrorMarkedObj ( const Point & rRef1 , const Point & rRef2 , bool bCopy )
2000-09-18 16:07:07 +00:00
{
XubString aStr ;
Point aDif ( rRef2 - rRef1 ) ;
if ( aDif . X ( ) = = 0 ) ImpTakeDescriptionStr ( STR_EditMirrorHori , aStr ) ;
else if ( aDif . Y ( ) = = 0 ) ImpTakeDescriptionStr ( STR_EditMirrorVert , aStr ) ;
else if ( Abs ( aDif . X ( ) ) = = Abs ( aDif . Y ( ) ) ) ImpTakeDescriptionStr ( STR_EditMirrorDiag , aStr ) ;
else ImpTakeDescriptionStr ( STR_EditMirrorFree , aStr ) ;
if ( bCopy ) aStr + = ImpGetResStr ( STR_EditWithCopy ) ;
BegUndo ( aStr ) ;
if ( bCopy ) CopyMarkedObj ( ) ;
2004-07-12 13:44:58 +00:00
ULONG nMarkAnz = GetMarkedObjectCount ( ) ;
2000-09-18 16:07:07 +00:00
for ( ULONG nm = 0 ; nm < nMarkAnz ; nm + + ) {
2004-07-12 13:44:58 +00:00
SdrMark * pM = GetSdrMarkByIndex ( nm ) ;
2006-07-25 11:55:34 +00:00
SdrObject * pO = pM - > GetMarkedSdrObj ( ) ;
2006-01-10 13:49:16 +00:00
AddUndo ( GetModel ( ) - > GetSdrUndoFactory ( ) . CreateUndoGeoObject ( * pO ) ) ;
2006-11-14 12:40:55 +00:00
pO - > Mirror ( rRef1 , rRef2 ) ;
2000-09-18 16:07:07 +00:00
}
EndUndo ( ) ;
}
void SdrEditView : : MirrorMarkedObjHorizontal ( BOOL bCopy )
{
Point aCenter ( GetMarkedObjRect ( ) . Center ( ) ) ;
Point aPt2 ( aCenter ) ;
aPt2 . Y ( ) + + ;
MirrorMarkedObj ( aCenter , aPt2 , bCopy ) ;
}
void SdrEditView : : MirrorMarkedObjVertical ( BOOL bCopy )
{
Point aCenter ( GetMarkedObjRect ( ) . Center ( ) ) ;
Point aPt2 ( aCenter ) ;
aPt2 . X ( ) + + ;
MirrorMarkedObj ( aCenter , aPt2 , bCopy ) ;
}
long SdrEditView : : GetMarkedObjShear ( ) const
{
BOOL b1st = TRUE ;
BOOL bOk = TRUE ;
long nWink = 0 ;
2004-07-12 13:44:58 +00:00
ULONG nMarkAnz = GetMarkedObjectCount ( ) ;
2000-09-18 16:07:07 +00:00
for ( ULONG nm = 0 ; nm < nMarkAnz & & bOk ; nm + + ) {
2004-07-12 13:44:58 +00:00
SdrMark * pM = GetSdrMarkByIndex ( nm ) ;
2006-07-25 11:55:34 +00:00
SdrObject * pO = pM - > GetMarkedSdrObj ( ) ;
2000-09-18 16:07:07 +00:00
long nWink2 = pO - > GetShearAngle ( ) ;
if ( b1st ) nWink = nWink2 ;
else if ( nWink2 ! = nWink ) bOk = FALSE ;
b1st = FALSE ;
}
if ( nWink > SDRMAXSHEAR ) nWink = SDRMAXSHEAR ;
if ( nWink < - SDRMAXSHEAR ) nWink = - SDRMAXSHEAR ;
if ( ! bOk ) nWink = 0 ;
return nWink ;
}
2006-10-12 12:08:49 +00:00
void SdrEditView : : ShearMarkedObj ( const Point & rRef , long nWink , bool bVShear , bool bCopy )
2000-09-18 16:07:07 +00:00
{
XubString aStr ;
ImpTakeDescriptionStr ( STR_EditShear , aStr ) ;
if ( bCopy ) aStr + = ImpGetResStr ( STR_EditWithCopy ) ;
BegUndo ( aStr ) ;
if ( bCopy ) CopyMarkedObj ( ) ;
double nTan = tan ( nWink * nPi180 ) ;
2004-07-12 13:44:58 +00:00
ULONG nMarkAnz = GetMarkedObjectCount ( ) ;
2000-09-18 16:07:07 +00:00
for ( ULONG nm = 0 ; nm < nMarkAnz ; nm + + ) {
2004-07-12 13:44:58 +00:00
SdrMark * pM = GetSdrMarkByIndex ( nm ) ;
2006-07-25 11:55:34 +00:00
SdrObject * pO = pM - > GetMarkedSdrObj ( ) ;
2006-01-10 13:49:16 +00:00
AddUndo ( GetModel ( ) - > GetSdrUndoFactory ( ) . CreateUndoGeoObject ( * pO ) ) ;
2006-11-14 12:40:55 +00:00
pO - > Shear ( rRef , nWink , nTan , bVShear ) ;
2000-09-18 16:07:07 +00:00
}
EndUndo ( ) ;
}
void SdrEditView : : ImpCrookObj ( SdrObject * pO , const Point & rRef , const Point & rRad ,
SdrCrookMode eMode , BOOL bVertical , BOOL bNoContortion , BOOL bRotate , const Rectangle & rMarkRect )
{
SdrPathObj * pPath = PTR_CAST ( SdrPathObj , pO ) ;
BOOL bDone = FALSE ;
if ( pPath ! = NULL & & ! bNoContortion )
{
XPolyPolygon aXPP ( pPath - > GetPathPoly ( ) ) ;
switch ( eMode ) {
case SDRCROOK_ROTATE : CrookRotatePoly ( aXPP , rRef , rRad , bVertical ) ; break ;
case SDRCROOK_SLANT : CrookSlantPoly ( aXPP , rRef , rRad , bVertical ) ; break ;
case SDRCROOK_STRETCH : CrookStretchPoly ( aXPP , rRef , rRad , bVertical , rMarkRect ) ; break ;
} // switch
2006-11-14 12:40:55 +00:00
pPath - > SetPathPoly ( aXPP . getB2DPolyPolygon ( ) ) ;
2000-09-18 16:07:07 +00:00
bDone = TRUE ;
}
2006-11-14 12:40:55 +00:00
if ( ! bDone & & ! pPath & & pO - > IsPolyObj ( ) & & 0L ! = pO - > GetPointCount ( ) )
2000-09-18 16:07:07 +00:00
{
// FuerPolyObj's, aber NICHT fuer SdrPathObj's, z.B. fuer's Bemassungsobjekt
2006-11-14 12:40:55 +00:00
sal_uInt32 nPtAnz ( pO - > GetPointCount ( ) ) ;
XPolygon aXP ( ( sal_uInt16 ) nPtAnz ) ;
sal_uInt32 nPtNum ;
for ( nPtNum = 0L ; nPtNum < nPtAnz ; nPtNum + + )
{
2000-09-18 16:07:07 +00:00
Point aPt ( pO - > GetPoint ( nPtNum ) ) ;
2006-11-14 12:40:55 +00:00
aXP [ ( sal_uInt16 ) nPtNum ] = aPt ;
2000-09-18 16:07:07 +00:00
}
2006-11-14 12:40:55 +00:00
switch ( eMode )
{
2000-09-18 16:07:07 +00:00
case SDRCROOK_ROTATE : CrookRotatePoly ( aXP , rRef , rRad , bVertical ) ; break ;
case SDRCROOK_SLANT : CrookSlantPoly ( aXP , rRef , rRad , bVertical ) ; break ;
case SDRCROOK_STRETCH : CrookStretchPoly ( aXP , rRef , rRad , bVertical , rMarkRect ) ; break ;
2006-11-14 12:40:55 +00:00
}
for ( nPtNum = 0L ; nPtNum < nPtAnz ; nPtNum + + )
{
2000-09-18 16:07:07 +00:00
// hier koennte man vieleicht auch mal das Broadcasting optimieren
// ist aber z.Zt. bei den 2 Punkten des Bemassungsobjekts noch nicht so tragisch
2006-11-14 12:40:55 +00:00
pO - > SetPoint ( aXP [ ( sal_uInt16 ) nPtNum ] , nPtNum ) ;
2000-09-18 16:07:07 +00:00
}
2006-11-14 12:40:55 +00:00
2000-09-18 16:07:07 +00:00
bDone = TRUE ;
}
if ( ! bDone )
{
// Fuer alle anderen oder wenn bNoContortion
Point aCtr0 ( pO - > GetSnapRect ( ) . Center ( ) ) ;
Point aCtr1 ( aCtr0 ) ;
2006-11-14 12:40:55 +00:00
sal_Bool bRotOk ( sal_False ) ;
double nSin ( 0.0 ) , nCos ( 1.0 ) ;
double nWink ( 0.0 ) ;
if ( 0 ! = rRad . X ( ) & & 0 ! = rRad . Y ( ) )
{
bRotOk = bRotate ;
switch ( eMode )
{
2000-09-18 16:07:07 +00:00
case SDRCROOK_ROTATE : nWink = CrookRotateXPoint ( aCtr1 , NULL , NULL , rRef , rRad , nSin , nCos , bVertical ) ; bRotOk = bRotate ; break ;
case SDRCROOK_SLANT : nWink = CrookSlantXPoint ( aCtr1 , NULL , NULL , rRef , rRad , nSin , nCos , bVertical ) ; break ;
case SDRCROOK_STRETCH : nWink = CrookStretchXPoint ( aCtr1 , NULL , NULL , rRef , rRad , nSin , nCos , bVertical , rMarkRect ) ; break ;
2006-11-14 12:40:55 +00:00
}
2000-09-18 16:07:07 +00:00
}
2006-11-14 12:40:55 +00:00
aCtr1 - = aCtr0 ;
if ( bRotOk )
pO - > Rotate ( aCtr0 , Round ( nWink / nPi180 ) , nSin , nCos ) ;
2000-09-18 16:07:07 +00:00
pO - > Move ( Size ( aCtr1 . X ( ) , aCtr1 . Y ( ) ) ) ;
}
}
void SdrEditView : : CrookMarkedObj ( const Point & rRef , const Point & rRad , SdrCrookMode eMode ,
2006-10-12 12:08:49 +00:00
bool bVertical , bool bNoContortion , bool bCopy )
2000-09-18 16:07:07 +00:00
{
Rectangle aMarkRect ( GetMarkedObjRect ( ) ) ;
XubString aStr ;
BOOL bRotate = bNoContortion & & eMode = = SDRCROOK_ROTATE & & IsRotateAllowed ( FALSE ) ;
ImpTakeDescriptionStr ( bNoContortion ? STR_EditCrook : STR_EditCrookContortion , aStr ) ;
if ( bCopy ) aStr + = ImpGetResStr ( STR_EditWithCopy ) ;
BegUndo ( aStr ) ;
if ( bCopy ) CopyMarkedObj ( ) ;
2004-07-12 13:44:58 +00:00
ULONG nMarkAnz = GetMarkedObjectCount ( ) ;
2000-09-18 16:07:07 +00:00
for ( ULONG nm = 0 ; nm < nMarkAnz ; nm + + ) {
2004-07-12 13:44:58 +00:00
SdrMark * pM = GetSdrMarkByIndex ( nm ) ;
2006-07-25 11:55:34 +00:00
SdrObject * pO = pM - > GetMarkedSdrObj ( ) ;
2006-01-10 13:49:16 +00:00
AddUndo ( GetModel ( ) - > GetSdrUndoFactory ( ) . CreateUndoGeoObject ( * pO ) ) ;
2000-09-18 16:07:07 +00:00
const SdrObjList * pOL = pO - > GetSubList ( ) ;
if ( bNoContortion | | pOL = = NULL ) {
2006-11-14 12:40:55 +00:00
ImpCrookObj ( pO , rRef , rRad , eMode , bVertical , bNoContortion , bRotate , aMarkRect ) ;
2000-09-18 16:07:07 +00:00
} else {
SdrObjListIter aIter ( * pOL , IM_DEEPNOGROUPS ) ;
while ( aIter . IsMore ( ) ) {
SdrObject * pO1 = aIter . Next ( ) ;
2006-11-14 12:40:55 +00:00
ImpCrookObj ( pO1 , rRef , rRad , eMode , bVertical , bNoContortion , bRotate , aMarkRect ) ;
2000-09-18 16:07:07 +00:00
}
}
}
EndUndo ( ) ;
}
void SdrEditView : : ImpDistortObj ( SdrObject * pO , const Rectangle & rRef , const XPolygon & rDistortedRect , BOOL bNoContortion )
{
2006-11-14 12:40:55 +00:00
SdrPathObj * pPath = PTR_CAST ( SdrPathObj , pO ) ;
if ( ! bNoContortion & & pPath )
{
2000-09-18 16:07:07 +00:00
XPolyPolygon aXPP ( pPath - > GetPathPoly ( ) ) ;
2006-11-14 12:40:55 +00:00
aXPP . Distort ( rRef , rDistortedRect ) ;
pPath - > SetPathPoly ( aXPP . getB2DPolyPolygon ( ) ) ;
}
else if ( pO - > IsPolyObj ( ) )
{
2000-09-18 16:07:07 +00:00
// z.B. fuer's Bemassungsobjekt
2006-11-14 12:40:55 +00:00
sal_uInt32 nPtAnz ( pO - > GetPointCount ( ) ) ;
XPolygon aXP ( ( sal_uInt16 ) nPtAnz ) ;
sal_uInt32 nPtNum ;
for ( nPtNum = 0L ; nPtNum < nPtAnz ; nPtNum + + )
{
2000-09-18 16:07:07 +00:00
Point aPt ( pO - > GetPoint ( nPtNum ) ) ;
2006-11-14 12:40:55 +00:00
aXP [ ( sal_uInt16 ) nPtNum ] = aPt ;
2000-09-18 16:07:07 +00:00
}
2006-11-14 12:40:55 +00:00
aXP . Distort ( rRef , rDistortedRect ) ;
for ( nPtNum = 0L ; nPtNum < nPtAnz ; nPtNum + + )
{
2000-09-18 16:07:07 +00:00
// hier koennte man vieleicht auch mal das Broadcasting optimieren
// ist aber z.Zt. bei den 2 Punkten des Bemassungsobjekts noch nicht so tragisch
2006-11-14 12:40:55 +00:00
pO - > SetPoint ( aXP [ ( sal_uInt16 ) nPtNum ] , nPtNum ) ;
2000-09-18 16:07:07 +00:00
}
}
}
2006-10-12 12:08:49 +00:00
void SdrEditView : : DistortMarkedObj ( const Rectangle & rRef , const XPolygon & rDistortedRect , bool bNoContortion , bool bCopy )
2000-09-18 16:07:07 +00:00
{
XubString aStr ;
ImpTakeDescriptionStr ( STR_EditDistort , aStr ) ;
if ( bCopy ) aStr + = ImpGetResStr ( STR_EditWithCopy ) ;
BegUndo ( aStr ) ;
if ( bCopy ) CopyMarkedObj ( ) ;
2004-07-12 13:44:58 +00:00
ULONG nMarkAnz = GetMarkedObjectCount ( ) ;
2000-09-18 16:07:07 +00:00
for ( ULONG nm = 0 ; nm < nMarkAnz ; nm + + ) {
2004-07-12 13:44:58 +00:00
SdrMark * pM = GetSdrMarkByIndex ( nm ) ;
2006-07-25 11:55:34 +00:00
SdrObject * pO = pM - > GetMarkedSdrObj ( ) ;
2006-01-10 13:49:16 +00:00
AddUndo ( GetModel ( ) - > GetSdrUndoFactory ( ) . CreateUndoGeoObject ( * pO ) ) ;
2000-09-18 16:07:07 +00:00
Rectangle aRefRect ( rRef ) ;
XPolygon aRefPoly ( rDistortedRect ) ;
const SdrObjList * pOL = pO - > GetSubList ( ) ;
if ( bNoContortion | | pOL = = NULL ) {
ImpDistortObj ( pO , aRefRect , aRefPoly , bNoContortion ) ;
} else {
SdrObjListIter aIter ( * pOL , IM_DEEPNOGROUPS ) ;
while ( aIter . IsMore ( ) ) {
SdrObject * pO1 = aIter . Next ( ) ;
ImpDistortObj ( pO1 , aRefRect , aRefPoly , bNoContortion ) ;
}
}
}
EndUndo ( ) ;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
2006-06-19 15:35:48 +00:00
void SdrEditView : : SetNotPersistAttrToMarked ( const SfxItemSet & rAttr , BOOL /*bReplaceAll*/ )
2000-09-18 16:07:07 +00:00
{
// bReplaceAll hat hier keinerlei Wirkung
Rectangle aAllSnapRect ( GetMarkedObjRect ( ) ) ;
const SfxPoolItem * pPoolItem = NULL ;
if ( rAttr . GetItemState ( SDRATTR_TRANSFORMREF1X , TRUE , & pPoolItem ) = = SFX_ITEM_SET ) {
long n = ( ( const SdrTransformRef1XItem * ) pPoolItem ) - > GetValue ( ) ;
SetRef1 ( Point ( n , GetRef1 ( ) . Y ( ) ) ) ;
}
if ( rAttr . GetItemState ( SDRATTR_TRANSFORMREF1Y , TRUE , & pPoolItem ) = = SFX_ITEM_SET ) {
long n = ( ( const SdrTransformRef1YItem * ) pPoolItem ) - > GetValue ( ) ;
SetRef1 ( Point ( GetRef1 ( ) . X ( ) , n ) ) ;
}
if ( rAttr . GetItemState ( SDRATTR_TRANSFORMREF2X , TRUE , & pPoolItem ) = = SFX_ITEM_SET ) {
long n = ( ( const SdrTransformRef2XItem * ) pPoolItem ) - > GetValue ( ) ;
SetRef2 ( Point ( n , GetRef2 ( ) . Y ( ) ) ) ;
}
if ( rAttr . GetItemState ( SDRATTR_TRANSFORMREF2Y , TRUE , & pPoolItem ) = = SFX_ITEM_SET ) {
long n = ( ( const SdrTransformRef2YItem * ) pPoolItem ) - > GetValue ( ) ;
SetRef2 ( Point ( GetRef2 ( ) . X ( ) , n ) ) ;
}
long nAllPosX = 0 ; BOOL bAllPosX = FALSE ;
long nAllPosY = 0 ; BOOL bAllPosY = FALSE ;
long nAllWdt = 0 ; BOOL bAllWdt = FALSE ;
long nAllHgt = 0 ; BOOL bAllHgt = FALSE ;
BOOL bDoIt = FALSE ;
if ( rAttr . GetItemState ( SDRATTR_ALLPOSITIONX , TRUE , & pPoolItem ) = = SFX_ITEM_SET ) {
nAllPosX = ( ( const SdrAllPositionXItem * ) pPoolItem ) - > GetValue ( ) ;
bAllPosX = TRUE ; bDoIt = TRUE ;
}
if ( rAttr . GetItemState ( SDRATTR_ALLPOSITIONY , TRUE , & pPoolItem ) = = SFX_ITEM_SET ) {
nAllPosY = ( ( const SdrAllPositionYItem * ) pPoolItem ) - > GetValue ( ) ;
bAllPosY = TRUE ; bDoIt = TRUE ;
}
if ( rAttr . GetItemState ( SDRATTR_ALLSIZEWIDTH , TRUE , & pPoolItem ) = = SFX_ITEM_SET ) {
nAllWdt = ( ( const SdrAllSizeWidthItem * ) pPoolItem ) - > GetValue ( ) ;
bAllWdt = TRUE ; bDoIt = TRUE ;
}
if ( rAttr . GetItemState ( SDRATTR_ALLSIZEHEIGHT , TRUE , & pPoolItem ) = = SFX_ITEM_SET ) {
nAllHgt = ( ( const SdrAllSizeHeightItem * ) pPoolItem ) - > GetValue ( ) ;
bAllHgt = TRUE ; bDoIt = TRUE ;
}
if ( bDoIt ) {
Rectangle aRect ( aAllSnapRect ) ; // !!! fuer PolyPt's und GluePt's aber bitte noch aendern !!!
if ( bAllPosX ) aRect . Move ( nAllPosX - aRect . Left ( ) , 0 ) ;
if ( bAllPosY ) aRect . Move ( 0 , nAllPosY - aRect . Top ( ) ) ;
if ( bAllWdt ) aRect . Right ( ) = aAllSnapRect . Left ( ) + nAllWdt ;
if ( bAllHgt ) aRect . Bottom ( ) = aAllSnapRect . Top ( ) + nAllHgt ;
SetMarkedObjRect ( aRect ) ;
}
if ( rAttr . GetItemState ( SDRATTR_RESIZEXALL , TRUE , & pPoolItem ) = = SFX_ITEM_SET ) {
Fraction aXFact = ( ( const SdrResizeXAllItem * ) pPoolItem ) - > GetValue ( ) ;
ResizeMarkedObj ( aAllSnapRect . TopLeft ( ) , aXFact , Fraction ( 1 , 1 ) ) ;
}
if ( rAttr . GetItemState ( SDRATTR_RESIZEYALL , TRUE , & pPoolItem ) = = SFX_ITEM_SET ) {
Fraction aYFact = ( ( const SdrResizeYAllItem * ) pPoolItem ) - > GetValue ( ) ;
ResizeMarkedObj ( aAllSnapRect . TopLeft ( ) , Fraction ( 1 , 1 ) , aYFact ) ;
}
if ( rAttr . GetItemState ( SDRATTR_ROTATEALL , TRUE , & pPoolItem ) = = SFX_ITEM_SET ) {
long nAngle = ( ( const SdrRotateAllItem * ) pPoolItem ) - > GetValue ( ) ;
RotateMarkedObj ( aAllSnapRect . Center ( ) , nAngle ) ;
}
if ( rAttr . GetItemState ( SDRATTR_HORZSHEARALL , TRUE , & pPoolItem ) = = SFX_ITEM_SET ) {
long nAngle = ( ( const SdrHorzShearAllItem * ) pPoolItem ) - > GetValue ( ) ;
ShearMarkedObj ( aAllSnapRect . Center ( ) , nAngle , FALSE ) ;
}
if ( rAttr . GetItemState ( SDRATTR_VERTSHEARALL , TRUE , & pPoolItem ) = = SFX_ITEM_SET ) {
long nAngle = ( ( const SdrVertShearAllItem * ) pPoolItem ) - > GetValue ( ) ;
ShearMarkedObj ( aAllSnapRect . Center ( ) , nAngle , TRUE ) ;
}
// Todo: WhichRange nach Notwendigkeit ueberpruefen.
2004-07-12 13:44:58 +00:00
ULONG nMarkAnz = GetMarkedObjectCount ( ) ;
2000-09-18 16:07:07 +00:00
for ( ULONG nm = 0 ; nm < nMarkAnz ; nm + + ) {
2004-07-12 13:44:58 +00:00
const SdrMark * pM = GetSdrMarkByIndex ( nm ) ;
2006-07-25 11:55:34 +00:00
SdrObject * pObj = pM - > GetMarkedSdrObj ( ) ;
2006-06-19 15:35:48 +00:00
//const SdrPageView* pPV=pM->GetPageView();
2006-01-10 13:49:16 +00:00
AddUndo ( GetModel ( ) - > GetSdrUndoFactory ( ) . CreateUndoGeoObject ( * pObj ) ) ;
2000-09-18 16:07:07 +00:00
pObj - > ApplyNotPersistAttr ( rAttr ) ;
}
}
2006-06-19 15:35:48 +00:00
void SdrEditView : : MergeNotPersistAttrFromMarked ( SfxItemSet & rAttr , BOOL /*bOnlyHardAttr*/ ) const
2000-09-18 16:07:07 +00:00
{
// bOnlyHardAttr hat hier keinerlei Wirkung
// Hier muss ausserdem noch der Nullpunkt und
// die PvPos berueksichtigt werden.
Rectangle aAllSnapRect ( GetMarkedObjRect ( ) ) ; // !!! fuer PolyPt's und GluePt's aber bitte noch aendern !!!
long nAllSnapPosX = aAllSnapRect . Left ( ) ;
long nAllSnapPosY = aAllSnapRect . Top ( ) ;
long nAllSnapWdt = aAllSnapRect . GetWidth ( ) - 1 ;
long nAllSnapHgt = aAllSnapRect . GetHeight ( ) - 1 ;
// koennte mal zu CheckPossibilities mit rein
BOOL bMovProtect = FALSE , bMovProtectDC = FALSE ;
BOOL bSizProtect = FALSE , bSizProtectDC = FALSE ;
BOOL bPrintable = TRUE , bPrintableDC = FALSE ;
SdrLayerID nLayerId = 0 ; BOOL bLayerDC = FALSE ;
XubString aObjName ; BOOL bObjNameDC = FALSE , bObjNameSet = FALSE ;
long nSnapPosX = 0 ; BOOL bSnapPosXDC = FALSE ;
long nSnapPosY = 0 ; BOOL bSnapPosYDC = FALSE ;
long nSnapWdt = 0 ; BOOL bSnapWdtDC = FALSE ;
long nSnapHgt = 0 ; BOOL bSnapHgtDC = FALSE ;
long nLogicWdt = 0 ; BOOL bLogicWdtDC = FALSE , bLogicWdtDiff = FALSE ;
long nLogicHgt = 0 ; BOOL bLogicHgtDC = FALSE , bLogicHgtDiff = FALSE ;
long nRotAngle = 0 ; BOOL bRotAngleDC = FALSE ;
long nShrAngle = 0 ; BOOL bShrAngleDC = FALSE ;
Rectangle aSnapRect ;
Rectangle aLogicRect ;
2004-07-12 13:44:58 +00:00
ULONG nMarkAnz = GetMarkedObjectCount ( ) ;
2000-09-18 16:07:07 +00:00
for ( ULONG nm = 0 ; nm < nMarkAnz ; nm + + ) {
2004-07-12 13:44:58 +00:00
const SdrMark * pM = GetSdrMarkByIndex ( nm ) ;
2006-07-25 11:55:34 +00:00
const SdrObject * pObj = pM - > GetMarkedSdrObj ( ) ;
2000-09-18 16:07:07 +00:00
if ( nm = = 0 ) {
nLayerId = pObj - > GetLayer ( ) ;
bMovProtect = pObj - > IsMoveProtect ( ) ;
bSizProtect = pObj - > IsResizeProtect ( ) ;
bPrintable = pObj - > IsPrintable ( ) ;
2006-06-19 15:35:48 +00:00
Rectangle aSnapRect2 ( pObj - > GetSnapRect ( ) ) ;
Rectangle aLogicRect2 ( pObj - > GetLogicRect ( ) ) ;
nSnapPosX = aSnapRect2 . Left ( ) ;
nSnapPosY = aSnapRect2 . Top ( ) ;
nSnapWdt = aSnapRect2 . GetWidth ( ) - 1 ;
nSnapHgt = aSnapRect2 . GetHeight ( ) - 1 ;
nLogicWdt = aLogicRect2 . GetWidth ( ) - 1 ;
nLogicHgt = aLogicRect2 . GetHeight ( ) - 1 ;
2000-09-18 16:07:07 +00:00
bLogicWdtDiff = nLogicWdt ! = nSnapWdt ;
bLogicHgtDiff = nLogicHgt ! = nSnapHgt ;
nRotAngle = pObj - > GetRotateAngle ( ) ;
nShrAngle = pObj - > GetShearAngle ( ) ;
} else {
if ( ! bLayerDC & & nLayerId ! = pObj - > GetLayer ( ) ) bLayerDC = TRUE ;
if ( ! bMovProtectDC & & bMovProtect ! = pObj - > IsMoveProtect ( ) ) bMovProtectDC = TRUE ;
if ( ! bSizProtectDC & & bSizProtect ! = pObj - > IsResizeProtect ( ) ) bSizProtectDC = TRUE ;
if ( ! bPrintableDC & & bPrintable ! = pObj - > IsPrintable ( ) ) bPrintableDC = TRUE ;
if ( ! bRotAngleDC & & nRotAngle ! = pObj - > GetRotateAngle ( ) ) bRotAngleDC = TRUE ;
if ( ! bShrAngleDC & & nShrAngle ! = pObj - > GetShearAngle ( ) ) bShrAngleDC = TRUE ;
if ( ! bSnapWdtDC | | ! bSnapHgtDC | | ! bSnapPosXDC | | ! bSnapPosYDC | | ! bLogicWdtDiff | | ! bLogicHgtDiff ) {
aSnapRect = pObj - > GetSnapRect ( ) ;
if ( nSnapPosX ! = aSnapRect . Left ( ) ) bSnapPosXDC = TRUE ;
if ( nSnapPosY ! = aSnapRect . Top ( ) ) bSnapPosYDC = TRUE ;
if ( nSnapWdt ! = aSnapRect . GetWidth ( ) - 1 ) bSnapWdtDC = TRUE ;
if ( nSnapHgt ! = aSnapRect . GetHeight ( ) - 1 ) bSnapHgtDC = TRUE ;
}
if ( ! bLogicWdtDC | | ! bLogicHgtDC | | ! bLogicWdtDiff | | ! bLogicHgtDiff ) {
aLogicRect = pObj - > GetLogicRect ( ) ;
if ( nLogicWdt ! = aLogicRect . GetWidth ( ) - 1 ) bLogicWdtDC = TRUE ;
if ( nLogicHgt ! = aLogicRect . GetHeight ( ) - 1 ) bLogicHgtDC = TRUE ;
if ( ! bLogicWdtDiff & & aSnapRect . GetWidth ( ) ! = aLogicRect . GetWidth ( ) ) bLogicWdtDiff = TRUE ;
if ( ! bLogicHgtDiff & & aSnapRect . GetHeight ( ) ! = aLogicRect . GetHeight ( ) ) bLogicHgtDiff = TRUE ;
}
}
2006-12-19 16:46:29 +00:00
if ( ! bObjNameDC ) {
2000-09-18 16:07:07 +00:00
if ( ! bObjNameSet ) {
aObjName = pObj - > GetName ( ) ;
} else {
if ( aObjName ! = pObj - > GetName ( ) ) bObjNameDC = TRUE ;
}
}
}
if ( bSnapPosXDC | | nAllSnapPosX ! = nSnapPosX ) rAttr . Put ( SdrAllPositionXItem ( nAllSnapPosX ) ) ;
if ( bSnapPosYDC | | nAllSnapPosY ! = nSnapPosY ) rAttr . Put ( SdrAllPositionYItem ( nAllSnapPosY ) ) ;
if ( bSnapWdtDC | | nAllSnapWdt ! = nSnapWdt ) rAttr . Put ( SdrAllSizeWidthItem ( nAllSnapWdt ) ) ;
if ( bSnapHgtDC | | nAllSnapHgt ! = nSnapHgt ) rAttr . Put ( SdrAllSizeHeightItem ( nAllSnapHgt ) ) ;
// Items fuer reine Transformationen
rAttr . Put ( SdrMoveXItem ( ) ) ;
rAttr . Put ( SdrMoveYItem ( ) ) ;
rAttr . Put ( SdrResizeXOneItem ( ) ) ;
rAttr . Put ( SdrResizeYOneItem ( ) ) ;
rAttr . Put ( SdrRotateOneItem ( ) ) ;
rAttr . Put ( SdrHorzShearOneItem ( ) ) ;
rAttr . Put ( SdrVertShearOneItem ( ) ) ;
if ( nMarkAnz > 1 ) {
rAttr . Put ( SdrResizeXAllItem ( ) ) ;
rAttr . Put ( SdrResizeYAllItem ( ) ) ;
rAttr . Put ( SdrRotateAllItem ( ) ) ;
rAttr . Put ( SdrHorzShearAllItem ( ) ) ;
rAttr . Put ( SdrVertShearAllItem ( ) ) ;
}
if ( eDragMode = = SDRDRAG_ROTATE | | eDragMode = = SDRDRAG_MIRROR )
{
rAttr . Put ( SdrTransformRef1XItem ( GetRef1 ( ) . X ( ) ) ) ;
rAttr . Put ( SdrTransformRef1YItem ( GetRef1 ( ) . Y ( ) ) ) ;
}
if ( eDragMode = = SDRDRAG_MIRROR )
{
rAttr . Put ( SdrTransformRef2XItem ( GetRef2 ( ) . X ( ) ) ) ;
rAttr . Put ( SdrTransformRef2YItem ( GetRef2 ( ) . Y ( ) ) ) ;
}
}
SfxItemSet SdrEditView : : GetAttrFromMarked ( BOOL bOnlyHardAttr ) const
{
SfxItemSet aSet ( pMod - > GetItemPool ( ) ) ;
MergeAttrFromMarked ( aSet , bOnlyHardAttr ) ;
2004-08-02 09:06:36 +00:00
//the EE_FEATURE items should not be set with SetAttrToMarked (see error message there)
//so we do not set them here
2004-08-31 13:54:38 +00:00
// #i32448#
// Do not disable, but clear the items.
aSet . ClearItem ( EE_FEATURE_TAB ) ;
aSet . ClearItem ( EE_FEATURE_LINEBR ) ;
aSet . ClearItem ( EE_FEATURE_NOTCONV ) ;
aSet . ClearItem ( EE_FEATURE_FIELD ) ;
2000-09-18 16:07:07 +00:00
return aSet ;
}
void SdrEditView : : MergeAttrFromMarked ( SfxItemSet & rAttr , BOOL bOnlyHardAttr ) const
{
2004-07-12 13:44:58 +00:00
sal_uInt32 nMarkAnz ( GetMarkedObjectCount ( ) ) ;
2000-10-30 10:20:51 +00:00
for ( sal_uInt32 a ( 0 ) ; a < nMarkAnz ; a + + )
{
2000-11-28 15:40:56 +00:00
// #80277# merging was done wrong in the prev version
2004-07-12 13:44:58 +00:00
//const SfxItemSet& rSet = GetMarkedObjectByIndex()->GetItemSet();
const SfxItemSet & rSet = GetMarkedObjectByIndex ( a ) - > GetMergedItemSet ( ) ;
2000-10-30 10:20:51 +00:00
SfxWhichIter aIter ( rSet ) ;
sal_uInt16 nWhich ( aIter . FirstWhich ( ) ) ;
while ( nWhich )
{
2001-01-12 16:02:25 +00:00
if ( ! bOnlyHardAttr )
{
if ( SFX_ITEM_DONTCARE = = rSet . GetItemState ( nWhich , FALSE ) )
rAttr . InvalidateItem ( nWhich ) ;
else
2001-02-15 13:04:27 +00:00
rAttr . MergeValue ( rSet . Get ( nWhich ) , TRUE ) ;
2001-01-12 16:02:25 +00:00
}
else if ( SFX_ITEM_SET = = rSet . GetItemState ( nWhich , FALSE ) )
2000-10-30 10:20:51 +00:00
{
2000-11-28 15:40:56 +00:00
const SfxPoolItem & rItem = rSet . Get ( nWhich ) ;
2001-02-15 13:04:27 +00:00
rAttr . MergeValue ( rItem , TRUE ) ;
2000-10-30 10:20:51 +00:00
}
2001-01-12 16:02:25 +00:00
2000-10-30 10:20:51 +00:00
nWhich = aIter . NextWhich ( ) ;
}
2001-01-26 13:08:54 +00:00
}
2000-09-18 16:07:07 +00:00
}
void SdrEditView : : SetAttrToMarked ( const SfxItemSet & rAttr , BOOL bReplaceAll )
{
2004-07-12 13:44:58 +00:00
if ( AreObjectsMarked ( ) )
2001-01-12 16:02:25 +00:00
{
2000-09-18 16:07:07 +00:00
# ifdef DBG_UTIL
{
BOOL bHasEEFeatureItems = FALSE ;
SfxItemIter aIter ( rAttr ) ;
const SfxPoolItem * pItem = aIter . FirstItem ( ) ;
while ( ! bHasEEFeatureItems & & pItem ! = NULL ) {
if ( ! IsInvalidItem ( pItem ) ) {
USHORT nW = pItem - > Which ( ) ;
if ( nW > = EE_FEATURE_START & & nW < = EE_FEATURE_END ) bHasEEFeatureItems = TRUE ;
}
pItem = aIter . NextItem ( ) ;
}
if ( bHasEEFeatureItems )
{
String aMessage ;
aMessage . AppendAscii ( " SdrEditView::SetAttrToMarked(): Das setzen von EE_FEATURE-Items an der SdrView macht keinen Sinn! Es fuehrt nur zu Overhead und nicht mehr lesbaren Dokumenten. " ) ;
InfoBox ( NULL , aMessage ) . Execute ( ) ;
}
}
# endif
2002-10-07 14:40:24 +00:00
// #103836# if the user thets character attributes to the complete shape,
// we want to remove all hard set character attributes with same
// which ids from the text. We do that later but here we remember
// all character attribute which id's that are set.
std : : vector < sal_uInt16 > aCharWhichIds ;
{
SfxItemIter aIter ( rAttr ) ;
const SfxPoolItem * pItem = aIter . FirstItem ( ) ;
while ( pItem ! = NULL )
{
if ( ! IsInvalidItem ( pItem ) )
{
sal_uInt16 nWhich = pItem - > Which ( ) ;
if ( nWhich > = EE_CHAR_START & & nWhich < = EE_CHAR_END )
aCharWhichIds . push_back ( nWhich ) ;
}
pItem = aIter . NextItem ( ) ;
}
}
2000-09-18 16:07:07 +00:00
// Joe, 2.7.98: Damit Undo nach Format.Standard auch die Textattribute korrekt restauriert
BOOL bHasEEItems = SearchOutlinerItems ( rAttr , bReplaceAll ) ;
XubString aStr ;
ImpTakeDescriptionStr ( STR_EditSetAttributes , aStr ) ;
// AW 030100: save additional geom info when para or char attributes
// are changed and the geom form of the text object might be changed
BOOL bPossibleGeomChange ( FALSE ) ;
SfxWhichIter aIter ( rAttr ) ;
UINT16 nWhich = aIter . FirstWhich ( ) ;
while ( ! bPossibleGeomChange & & nWhich )
{
SfxItemState eState = rAttr . GetItemState ( nWhich ) ;
if ( eState = = SFX_ITEM_SET )
{
2001-01-26 13:08:54 +00:00
if ( ( nWhich > = SDRATTR_TEXT_MINFRAMEHEIGHT & & nWhich < = SDRATTR_TEXT_CONTOURFRAME )
| | nWhich = = SDRATTR_3DOBJ_PERCENT_DIAGONAL
| | nWhich = = SDRATTR_3DOBJ_BACKSCALE
| | nWhich = = SDRATTR_3DOBJ_DEPTH
2001-02-16 11:16:18 +00:00
| | nWhich = = SDRATTR_3DOBJ_END_ANGLE
| | nWhich = = SDRATTR_3DSCENE_DISTANCE )
2001-01-26 13:08:54 +00:00
{
2000-09-18 16:07:07 +00:00
bPossibleGeomChange = TRUE ;
2001-01-26 13:08:54 +00:00
}
2000-09-18 16:07:07 +00:00
}
nWhich = aIter . NextWhich ( ) ;
}
BegUndo ( aStr ) ;
2004-07-12 13:44:58 +00:00
ULONG nMarkAnz = GetMarkedObjectCount ( ) ;
2001-01-12 16:02:25 +00:00
// create ItemSet without SFX_ITEM_DONTCARE. Put()
// uses it's second parameter (bInvalidAsDefault) to
// remove all such items to set them to default.
SfxItemSet aAttr ( * rAttr . GetPool ( ) , rAttr . GetRanges ( ) ) ;
aAttr . Put ( rAttr , TRUE ) ;
2005-01-28 15:31:38 +00:00
// #i38135#
bool bResetAnimationTimer ( false ) ;
2002-10-07 14:40:24 +00:00
for ( ULONG nm = 0 ; nm < nMarkAnz ; nm + + )
{
2004-07-12 13:44:58 +00:00
SdrMark * pM = GetSdrMarkByIndex ( nm ) ;
2006-07-25 11:55:34 +00:00
SdrObject * pObj = pM - > GetMarkedSdrObj ( ) ;
2000-09-18 16:07:07 +00:00
// new geometry undo
if ( bPossibleGeomChange )
{
// save position and size of obect, too
2006-01-10 13:49:16 +00:00
AddUndo ( GetModel ( ) - > GetSdrUndoFactory ( ) . CreateUndoGeoObject ( * pObj ) ) ;
2000-09-18 16:07:07 +00:00
}
2003-03-27 14:06:05 +00:00
// #i8508#
// If this is a text object also rescue the OutlinerParaObject since
// applying attributes to the object may change text layout when
// multiple portions exist with multiple formats. If a OutlinerParaObject
// really exists and needs to be rescued is evaluated in the undo
// implementation itself.
sal_Bool bRescueText ( pObj - > ISA ( SdrTextObj ) ) ;
2000-09-18 16:07:07 +00:00
// add attribute undo
2006-01-10 13:49:16 +00:00
AddUndo ( GetModel ( ) - > GetSdrUndoFactory ( ) . CreateUndoAttrObject ( * pObj , FALSE , bHasEEItems | | bPossibleGeomChange | | bRescueText ) ) ;
2000-09-18 16:07:07 +00:00
2003-11-24 15:53:21 +00:00
//pObj->SetItemSetAndBroadcast(aAttr, bReplaceAll);
pObj - > SetMergedItemSetAndBroadcast ( aAttr , bReplaceAll ) ;
2005-01-28 15:31:38 +00:00
if ( pObj - > ISA ( SdrTextObj ) )
2003-11-24 15:53:21 +00:00
{
SdrTextObj * pTextObj = ( ( SdrTextObj * ) pObj ) ;
2005-01-28 15:31:38 +00:00
if ( 0 ! = aCharWhichIds . size ( ) )
{
Rectangle aOldBoundRect = pTextObj - > GetLastBoundRect ( ) ;
// #110094#-14 pTextObj->SendRepaintBroadcast(pTextObj->GetBoundRect());
pTextObj - > RemoveOutlinerCharacterAttribs ( aCharWhichIds ) ;
2002-10-07 14:40:24 +00:00
2005-01-28 15:31:38 +00:00
// object has changed, should be called form
// RemoveOutlinerCharacterAttribs. This will change when the text
// object implementation changes.
pTextObj - > SetChanged ( ) ;
2003-11-24 15:53:21 +00:00
2005-01-28 15:31:38 +00:00
pTextObj - > BroadcastObjectChange ( ) ;
pTextObj - > SendUserCall ( SDRUSERCALL_CHGATTR , aOldBoundRect ) ;
}
}
// #i38495#
if ( ! bResetAnimationTimer & & pObj - > GetViewContact ( ) . SupportsAnimation ( ) )
{
bResetAnimationTimer = true ;
2003-11-24 15:53:21 +00:00
}
2000-09-18 16:07:07 +00:00
}
2005-01-28 15:31:38 +00:00
// #i38135#
if ( bResetAnimationTimer )
{
SetAnimationTimer ( 0L ) ;
}
2000-09-18 16:07:07 +00:00
// besser vorher checken, was gemacht werden soll:
// pObj->SetAttr() oder SetNotPersistAttr()
// !!! fehlende Implementation !!!
SetNotPersistAttrToMarked ( rAttr , bReplaceAll ) ;
EndUndo ( ) ;
}
}
SfxStyleSheet * SdrEditView : : GetStyleSheetFromMarked ( ) const
{
SfxStyleSheet * pRet = NULL ;
BOOL b1st = TRUE ;
2004-07-12 13:44:58 +00:00
ULONG nMarkAnz = GetMarkedObjectCount ( ) ;
2000-09-18 16:07:07 +00:00
for ( ULONG nm = 0 ; nm < nMarkAnz ; nm + + ) {
2004-07-12 13:44:58 +00:00
SdrMark * pM = GetSdrMarkByIndex ( nm ) ;
2006-07-25 11:55:34 +00:00
SfxStyleSheet * pSS = pM - > GetMarkedSdrObj ( ) - > GetStyleSheet ( ) ;
2000-09-18 16:07:07 +00:00
if ( b1st ) pRet = pSS ;
else if ( pRet ! = pSS ) return NULL ; // verschiedene StyleSheets
b1st = FALSE ;
}
return pRet ;
}
void SdrEditView : : SetStyleSheetToMarked ( SfxStyleSheet * pStyleSheet , BOOL bDontRemoveHardAttr )
{
2004-07-12 13:44:58 +00:00
if ( AreObjectsMarked ( ) ) {
2000-09-18 16:07:07 +00:00
XubString aStr ;
if ( pStyleSheet ! = NULL ) ImpTakeDescriptionStr ( STR_EditSetStylesheet , aStr ) ;
else ImpTakeDescriptionStr ( STR_EditDelStylesheet , aStr ) ;
BegUndo ( aStr ) ;
2004-07-12 13:44:58 +00:00
ULONG nMarkAnz = GetMarkedObjectCount ( ) ;
2000-09-18 16:07:07 +00:00
for ( ULONG nm = 0 ; nm < nMarkAnz ; nm + + ) {
2004-07-12 13:44:58 +00:00
SdrMark * pM = GetSdrMarkByIndex ( nm ) ;
2006-07-25 11:55:34 +00:00
AddUndo ( GetModel ( ) - > GetSdrUndoFactory ( ) . CreateUndoGeoObject ( * pM - > GetMarkedSdrObj ( ) ) ) ;
AddUndo ( GetModel ( ) - > GetSdrUndoFactory ( ) . CreateUndoAttrObject ( * pM - > GetMarkedSdrObj ( ) , true , true ) ) ;
pM - > GetMarkedSdrObj ( ) - > SetStyleSheet ( pStyleSheet , bDontRemoveHardAttr ) ;
2000-09-18 16:07:07 +00:00
}
EndUndo ( ) ;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/* new interface src537 */
BOOL SdrEditView : : GetAttributes ( SfxItemSet & rTargetSet , BOOL bOnlyHardAttr ) const
{
2004-07-12 13:44:58 +00:00
if ( GetMarkedObjectCount ( ) )
2000-09-18 16:07:07 +00:00
{
rTargetSet . Put ( GetAttrFromMarked ( bOnlyHardAttr ) , FALSE ) ;
return TRUE ;
}
else
{
return SdrMarkView : : GetAttributes ( rTargetSet , bOnlyHardAttr ) ;
}
}
BOOL SdrEditView : : SetAttributes ( const SfxItemSet & rSet , BOOL bReplaceAll )
{
2004-07-12 13:44:58 +00:00
if ( GetMarkedObjectCount ( ) ! = 0 ) {
2000-09-18 16:07:07 +00:00
SetAttrToMarked ( rSet , bReplaceAll ) ;
return TRUE ;
} else {
return SdrMarkView : : SetAttributes ( rSet , bReplaceAll ) ;
}
}
2006-06-19 15:35:48 +00:00
SfxStyleSheet * SdrEditView : : GetStyleSheet ( ) const // SfxStyleSheet* SdrEditView::GetStyleSheet(BOOL& rOk) const
2000-09-18 16:07:07 +00:00
{
2004-07-12 13:44:58 +00:00
if ( GetMarkedObjectCount ( ) ! = 0 ) {
2006-06-19 15:35:48 +00:00
//rOk=TRUE;
2000-09-18 16:07:07 +00:00
return GetStyleSheetFromMarked ( ) ;
} else {
2006-06-19 15:35:48 +00:00
return SdrMarkView : : GetStyleSheet ( ) ; // SdrMarkView::GetStyleSheet(rOk);
2000-09-18 16:07:07 +00:00
}
}
BOOL SdrEditView : : SetStyleSheet ( SfxStyleSheet * pStyleSheet , BOOL bDontRemoveHardAttr )
{
2004-07-12 13:44:58 +00:00
if ( GetMarkedObjectCount ( ) ! = 0 ) {
2000-09-18 16:07:07 +00:00
SetStyleSheetToMarked ( pStyleSheet , bDontRemoveHardAttr ) ;
return TRUE ;
} else {
return SdrMarkView : : SetStyleSheet ( pStyleSheet , bDontRemoveHardAttr ) ;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
SfxItemSet SdrEditView : : GetGeoAttrFromMarked ( ) const
{
SfxItemSet aRetSet ( pMod - > GetItemPool ( ) , // SID_ATTR_TRANSFORM_... aus s:svxids.hrc
SID_ATTR_TRANSFORM_POS_X , SID_ATTR_TRANSFORM_ANGLE ,
SID_ATTR_TRANSFORM_PROTECT_POS , SID_ATTR_TRANSFORM_AUTOHEIGHT ,
SDRATTR_ECKENRADIUS , SDRATTR_ECKENRADIUS ,
0 ) ;
2004-07-12 13:44:58 +00:00
if ( AreObjectsMarked ( ) ) {
2000-09-18 16:07:07 +00:00
SfxItemSet aMarkAttr ( GetAttrFromMarked ( FALSE ) ) ; // wg. AutoGrowHeight und Eckenradius
Rectangle aRect ( GetMarkedObjRect ( ) ) ;
2006-11-14 12:40:55 +00:00
if ( GetSdrPageView ( ) )
{
GetSdrPageView ( ) - > LogicToPagePos ( aRect ) ;
2000-09-18 16:07:07 +00:00
}
// Position
aRetSet . Put ( SfxInt32Item ( SID_ATTR_TRANSFORM_POS_X , aRect . Left ( ) ) ) ;
aRetSet . Put ( SfxInt32Item ( SID_ATTR_TRANSFORM_POS_Y , aRect . Top ( ) ) ) ;
// Groesse
long nResizeRefX = aRect . Left ( ) ;
long nResizeRefY = aRect . Top ( ) ;
if ( eDragMode = = SDRDRAG_ROTATE ) { // Drehachse auch als Referenz fuer Resize
nResizeRefX = aRef1 . X ( ) ;
nResizeRefY = aRef1 . Y ( ) ;
}
aRetSet . Put ( SfxUInt32Item ( SID_ATTR_TRANSFORM_WIDTH , aRect . Right ( ) - aRect . Left ( ) ) ) ;
aRetSet . Put ( SfxUInt32Item ( SID_ATTR_TRANSFORM_HEIGHT , aRect . Bottom ( ) - aRect . Top ( ) ) ) ;
aRetSet . Put ( SfxInt32Item ( SID_ATTR_TRANSFORM_RESIZE_REF_X , nResizeRefX ) ) ;
aRetSet . Put ( SfxInt32Item ( SID_ATTR_TRANSFORM_RESIZE_REF_Y , nResizeRefY ) ) ;
Point aRotateAxe ( aRef1 ) ;
2006-11-14 12:40:55 +00:00
if ( GetSdrPageView ( ) )
{
GetSdrPageView ( ) - > LogicToPagePos ( aRotateAxe ) ;
2000-09-18 16:07:07 +00:00
}
// Drehung
long nRotateRefX = aRect . Center ( ) . X ( ) ;
long nRotateRefY = aRect . Center ( ) . Y ( ) ;
if ( eDragMode = = SDRDRAG_ROTATE ) {
nRotateRefX = aRotateAxe . X ( ) ;
nRotateRefY = aRotateAxe . Y ( ) ;
}
aRetSet . Put ( SfxInt32Item ( SID_ATTR_TRANSFORM_ANGLE , GetMarkedObjRotate ( ) ) ) ;
aRetSet . Put ( SfxInt32Item ( SID_ATTR_TRANSFORM_ROT_X , nRotateRefX ) ) ;
aRetSet . Put ( SfxInt32Item ( SID_ATTR_TRANSFORM_ROT_Y , nRotateRefY ) ) ;
// Shear
long nShearRefX = aRect . Left ( ) ;
long nShearRefY = aRect . Bottom ( ) ;
if ( eDragMode = = SDRDRAG_ROTATE ) { // Drehachse auch als Referenz fuer Shear
nShearRefX = aRotateAxe . X ( ) ;
nShearRefY = aRotateAxe . Y ( ) ;
}
aRetSet . Put ( SfxInt32Item ( SID_ATTR_TRANSFORM_SHEAR , GetMarkedObjShear ( ) ) ) ;
aRetSet . Put ( SfxInt32Item ( SID_ATTR_TRANSFORM_SHEAR_X , nShearRefX ) ) ;
aRetSet . Put ( SfxInt32Item ( SID_ATTR_TRANSFORM_SHEAR_Y , nShearRefY ) ) ;
// Pruefen der einzelnen Objekte, ob Objekte geschuetzt sind
2004-07-12 13:44:58 +00:00
const SdrMarkList & rMarkList = GetMarkedObjectList ( ) ;
2000-09-18 16:07:07 +00:00
ULONG nMarkCount = rMarkList . GetMarkCount ( ) ;
2006-07-25 11:55:34 +00:00
SdrObject * pObj = rMarkList . GetMark ( 0 ) - > GetMarkedSdrObj ( ) ;
2000-09-18 16:07:07 +00:00
BOOL bPosProt = pObj - > IsMoveProtect ( ) ;
BOOL bSizProt = pObj - > IsResizeProtect ( ) ;
BOOL bPosProtDontCare = FALSE ;
BOOL bSizProtDontCare = FALSE ;
for ( ULONG i = 1 ; i < nMarkCount & & ( ! bPosProtDontCare | | ! bSizProtDontCare ) ; i + + ) {
2006-07-25 11:55:34 +00:00
pObj = rMarkList . GetMark ( i ) - > GetMarkedSdrObj ( ) ;
2000-09-18 16:07:07 +00:00
if ( bPosProt ! = pObj - > IsMoveProtect ( ) ) bPosProtDontCare = TRUE ;
if ( bSizProt ! = pObj - > IsResizeProtect ( ) ) bSizProtDontCare = TRUE ;
}
// InvalidateItem setzt das Item auf DONT_CARE
if ( bPosProtDontCare ) {
aRetSet . InvalidateItem ( SID_ATTR_TRANSFORM_PROTECT_POS ) ;
} else {
aRetSet . Put ( SfxBoolItem ( SID_ATTR_TRANSFORM_PROTECT_POS , bPosProt ) ) ;
}
if ( bSizProtDontCare ) {
aRetSet . InvalidateItem ( SID_ATTR_TRANSFORM_PROTECT_SIZE ) ;
} else {
aRetSet . Put ( SfxBoolItem ( SID_ATTR_TRANSFORM_PROTECT_SIZE , bSizProt ) ) ;
}
SfxItemState eState = aMarkAttr . GetItemState ( SDRATTR_TEXT_AUTOGROWWIDTH ) ;
BOOL bAutoGrow = ( ( SdrTextAutoGrowWidthItem & ) ( aMarkAttr . Get ( SDRATTR_TEXT_AUTOGROWWIDTH ) ) ) . GetValue ( ) ;
if ( eState = = SFX_ITEM_DONTCARE ) {
aRetSet . InvalidateItem ( SID_ATTR_TRANSFORM_AUTOWIDTH ) ;
} else if ( eState = = SFX_ITEM_SET ) {
aRetSet . Put ( SfxBoolItem ( SID_ATTR_TRANSFORM_AUTOWIDTH , bAutoGrow ) ) ;
}
eState = aMarkAttr . GetItemState ( SDRATTR_TEXT_AUTOGROWHEIGHT ) ;
bAutoGrow = ( ( SdrTextAutoGrowHeightItem & ) ( aMarkAttr . Get ( SDRATTR_TEXT_AUTOGROWHEIGHT ) ) ) . GetValue ( ) ;
if ( eState = = SFX_ITEM_DONTCARE ) {
aRetSet . InvalidateItem ( SID_ATTR_TRANSFORM_AUTOHEIGHT ) ;
} else if ( eState = = SFX_ITEM_SET ) {
aRetSet . Put ( SfxBoolItem ( SID_ATTR_TRANSFORM_AUTOHEIGHT , bAutoGrow ) ) ;
}
eState = aMarkAttr . GetItemState ( SDRATTR_ECKENRADIUS ) ;
long nRadius = ( ( SdrEckenradiusItem & ) ( aMarkAttr . Get ( SDRATTR_ECKENRADIUS ) ) ) . GetValue ( ) ;
if ( eState = = SFX_ITEM_DONTCARE ) {
aRetSet . InvalidateItem ( SDRATTR_ECKENRADIUS ) ;
} else if ( eState = = SFX_ITEM_SET ) {
aRetSet . Put ( SdrEckenradiusItem ( nRadius ) ) ;
}
}
return aRetSet ;
}
Point ImpGetPoint ( Rectangle aRect , RECT_POINT eRP )
{
switch ( eRP ) {
case RP_LT : return aRect . TopLeft ( ) ;
case RP_MT : return aRect . TopCenter ( ) ;
case RP_RT : return aRect . TopRight ( ) ;
case RP_LM : return aRect . LeftCenter ( ) ;
case RP_MM : return aRect . Center ( ) ;
case RP_RM : return aRect . RightCenter ( ) ;
case RP_LB : return aRect . BottomLeft ( ) ;
case RP_MB : return aRect . BottomCenter ( ) ;
case RP_RB : return aRect . BottomRight ( ) ;
}
return Point ( ) ; // Sollte nicht vorkommen !
}
void SdrEditView : : SetGeoAttrToMarked ( const SfxItemSet & rAttr )
{
Rectangle aRect ( GetMarkedObjRect ( ) ) ;
2006-11-14 12:40:55 +00:00
if ( GetSdrPageView ( ) )
{
GetSdrPageView ( ) - > LogicToPagePos ( aRect ) ;
2000-09-18 16:07:07 +00:00
}
2006-11-14 12:40:55 +00:00
2000-09-18 16:07:07 +00:00
long nOldRotateAngle = GetMarkedObjRotate ( ) ;
long nOldShearAngle = GetMarkedObjShear ( ) ;
2004-07-12 13:44:58 +00:00
const SdrMarkList & rMarkList = GetMarkedObjectList ( ) ;
2000-09-18 16:07:07 +00:00
ULONG nMarkCount = rMarkList . GetMarkCount ( ) ;
SdrObject * pObj = NULL ;
RECT_POINT eSizePoint = RP_MM ;
long nPosDX = 0 ;
long nPosDY = 0 ;
long nSizX = 0 ;
long nSizY = 0 ;
long nRotateAngle = 0 ;
2001-08-06 14:28:33 +00:00
// #86909#
sal_Bool bModeIsRotate ( eDragMode = = SDRDRAG_ROTATE ) ;
long nRotateX ( 0 ) ;
long nRotateY ( 0 ) ;
long nOldRotateX ( 0 ) ;
long nOldRotateY ( 0 ) ;
if ( bModeIsRotate )
{
Point aRotateAxe ( aRef1 ) ;
2006-11-14 12:40:55 +00:00
if ( GetSdrPageView ( ) )
{
GetSdrPageView ( ) - > LogicToPagePos ( aRotateAxe ) ;
}
2001-08-06 14:28:33 +00:00
nRotateX = nOldRotateX = aRotateAxe . X ( ) ;
nRotateY = nOldRotateY = aRotateAxe . Y ( ) ;
}
2000-09-18 16:07:07 +00:00
long nNewShearAngle = 0 ;
long nShearAngle = 0 ;
long nShearX = 0 ;
long nShearY = 0 ;
BOOL bShearVert = FALSE ;
BOOL bChgPos = FALSE ;
BOOL bChgSiz = FALSE ;
BOOL bChgHgt = FALSE ;
BOOL bRotate = FALSE ;
BOOL bShear = FALSE ;
BOOL bSetAttr = FALSE ;
SfxItemSet aSetAttr ( pMod - > GetItemPool ( ) ) ;
const SfxPoolItem * pPoolItem = NULL ;
// Position
if ( SFX_ITEM_SET = = rAttr . GetItemState ( SID_ATTR_TRANSFORM_POS_X , TRUE , & pPoolItem ) ) {
nPosDX = ( ( const SfxInt32Item * ) pPoolItem ) - > GetValue ( ) - aRect . Left ( ) ;
bChgPos = TRUE ;
}
if ( SFX_ITEM_SET = = rAttr . GetItemState ( SID_ATTR_TRANSFORM_POS_Y , TRUE , & pPoolItem ) ) {
nPosDY = ( ( const SfxInt32Item * ) pPoolItem ) - > GetValue ( ) - aRect . Top ( ) ;
bChgPos = TRUE ;
}
// Groesse
if ( SFX_ITEM_SET = = rAttr . GetItemState ( SID_ATTR_TRANSFORM_WIDTH , TRUE , & pPoolItem ) ) {
nSizX = ( ( const SfxUInt32Item * ) pPoolItem ) - > GetValue ( ) ;
bChgSiz = TRUE ;
}
if ( SFX_ITEM_SET = = rAttr . GetItemState ( SID_ATTR_TRANSFORM_HEIGHT , TRUE , & pPoolItem ) ) {
nSizY = ( ( const SfxUInt32Item * ) pPoolItem ) - > GetValue ( ) ;
bChgSiz = TRUE ;
bChgHgt = TRUE ;
}
if ( bChgSiz ) {
eSizePoint = ( RECT_POINT ) ( ( const SfxAllEnumItem & ) rAttr . Get ( SID_ATTR_TRANSFORM_SIZE_POINT ) ) . GetValue ( ) ;
}
// Rotation
if ( SFX_ITEM_SET = = rAttr . GetItemState ( SID_ATTR_TRANSFORM_ANGLE , TRUE , & pPoolItem ) ) {
nRotateAngle = ( ( const SfxInt32Item * ) pPoolItem ) - > GetValue ( ) - nOldRotateAngle ;
2001-08-06 14:28:33 +00:00
bRotate = ( nRotateAngle ! = 0 ) ;
2000-09-18 16:07:07 +00:00
}
2001-08-06 14:28:33 +00:00
// #86909# pos rot point x
if ( bRotate | | SFX_ITEM_SET = = rAttr . GetItemState ( SID_ATTR_TRANSFORM_ROT_X , TRUE , & pPoolItem ) )
nRotateX = ( ( const SfxInt32Item & ) rAttr . Get ( SID_ATTR_TRANSFORM_ROT_X ) ) . GetValue ( ) ;
// #86909# pos rot point y
if ( bRotate | | SFX_ITEM_SET = = rAttr . GetItemState ( SID_ATTR_TRANSFORM_ROT_Y , TRUE , & pPoolItem ) )
nRotateY = ( ( const SfxInt32Item & ) rAttr . Get ( SID_ATTR_TRANSFORM_ROT_Y ) ) . GetValue ( ) ;
2000-09-18 16:07:07 +00:00
// Shear
if ( SFX_ITEM_SET = = rAttr . GetItemState ( SID_ATTR_TRANSFORM_SHEAR , TRUE , & pPoolItem ) ) {
nNewShearAngle = ( ( const SfxInt32Item * ) pPoolItem ) - > GetValue ( ) ;
if ( nNewShearAngle > SDRMAXSHEAR ) nNewShearAngle = SDRMAXSHEAR ;
if ( nNewShearAngle < - SDRMAXSHEAR ) nNewShearAngle = - SDRMAXSHEAR ;
if ( nNewShearAngle ! = nOldShearAngle ) {
bShearVert = ( ( const SfxBoolItem & ) rAttr . Get ( SID_ATTR_TRANSFORM_SHEAR_VERTICAL ) ) . GetValue ( ) ;
if ( bShearVert ) {
nShearAngle = nNewShearAngle ;
} else {
if ( nNewShearAngle ! = 0 & & nOldShearAngle ! = 0 ) {
// Bugfix #25714#.
double nOld = tan ( ( double ) nOldShearAngle * nPi180 ) ;
double nNew = tan ( ( double ) nNewShearAngle * nPi180 ) ;
nNew - = nOld ;
nNew = atan ( nNew ) / nPi180 ;
nShearAngle = Round ( nNew ) ;
} else {
nShearAngle = nNewShearAngle - nOldShearAngle ;
}
}
bShear = nShearAngle ! = 0 ;
if ( bShear ) {
nShearX = ( ( const SfxInt32Item & ) rAttr . Get ( SID_ATTR_TRANSFORM_SHEAR_X ) ) . GetValue ( ) ;
nShearY = ( ( const SfxInt32Item & ) rAttr . Get ( SID_ATTR_TRANSFORM_SHEAR_Y ) ) . GetValue ( ) ;
}
}
}
// AutoGrow
if ( SFX_ITEM_SET = = rAttr . GetItemState ( SID_ATTR_TRANSFORM_AUTOWIDTH , TRUE , & pPoolItem ) ) {
BOOL bAutoGrow = ( ( const SfxBoolItem * ) pPoolItem ) - > GetValue ( ) ;
aSetAttr . Put ( SdrTextAutoGrowWidthItem ( bAutoGrow ) ) ;
bSetAttr = TRUE ;
}
if ( SFX_ITEM_SET = = rAttr . GetItemState ( SID_ATTR_TRANSFORM_AUTOHEIGHT , TRUE , & pPoolItem ) ) {
BOOL bAutoGrow = ( ( const SfxBoolItem * ) pPoolItem ) - > GetValue ( ) ;
aSetAttr . Put ( SdrTextAutoGrowHeightItem ( bAutoGrow ) ) ;
bSetAttr = TRUE ;
}
// Eckenradius
2001-02-15 15:11:33 +00:00
if ( bEdgeRadiusAllowed & & SFX_ITEM_SET = = rAttr . GetItemState ( SDRATTR_ECKENRADIUS , TRUE , & pPoolItem ) ) {
2000-09-18 16:07:07 +00:00
long nRadius = ( ( SdrEckenradiusItem * ) pPoolItem ) - > GetValue ( ) ;
aSetAttr . Put ( SdrEckenradiusItem ( nRadius ) ) ;
bSetAttr = TRUE ;
}
ForcePossibilities ( ) ;
2004-07-12 13:44:58 +00:00
BegUndo ( ImpGetResStr ( STR_EditTransform ) , GetDescriptionOfMarkedObjects ( ) ) ;
2000-09-18 16:07:07 +00:00
if ( bSetAttr ) {
SetAttrToMarked ( aSetAttr , FALSE ) ;
}
// Groesse und Hoehe aendern
if ( bChgSiz & & ( bResizeFreeAllowed | | bResizePropAllowed ) ) {
Fraction aWdt ( nSizX , aRect . Right ( ) - aRect . Left ( ) ) ;
Fraction aHgt ( nSizY , aRect . Bottom ( ) - aRect . Top ( ) ) ;
Point aRef ( ImpGetPoint ( aRect , eSizePoint ) ) ;
2006-11-14 12:40:55 +00:00
if ( GetSdrPageView ( ) )
{
GetSdrPageView ( ) - > PagePosToLogic ( aRef ) ;
2000-09-18 16:07:07 +00:00
}
2006-11-14 12:40:55 +00:00
2000-09-18 16:07:07 +00:00
ResizeMarkedObj ( aRef , aWdt , aHgt ) ;
}
// Rotieren
if ( bRotate & & ( bRotateFreeAllowed | | bRotate90Allowed ) ) {
Point aRef ( nRotateX , nRotateY ) ;
2006-11-14 12:40:55 +00:00
if ( GetSdrPageView ( ) )
{
GetSdrPageView ( ) - > PagePosToLogic ( aRef ) ;
2000-09-18 16:07:07 +00:00
}
2006-11-14 12:40:55 +00:00
2000-09-18 16:07:07 +00:00
RotateMarkedObj ( aRef , nRotateAngle ) ;
}
2001-08-06 14:28:33 +00:00
// #86909# set rotation point position
if ( bModeIsRotate & & ( nRotateX ! = nOldRotateX | | nRotateY ! = nOldRotateY ) )
{
Point aNewRef1 ( nRotateX , nRotateY ) ;
2006-11-14 12:40:55 +00:00
if ( GetSdrPageView ( ) )
{
GetSdrPageView ( ) - > PagePosToLogic ( aNewRef1 ) ;
}
2001-08-06 14:28:33 +00:00
SetRef1 ( aNewRef1 ) ;
}
2000-09-18 16:07:07 +00:00
// Shear
if ( bShear & & bShearAllowed ) {
Point aRef ( nShearX , nShearY ) ;
2006-11-14 12:40:55 +00:00
if ( GetSdrPageView ( ) )
{
GetSdrPageView ( ) - > PagePosToLogic ( aRef ) ;
2000-09-18 16:07:07 +00:00
}
2006-11-14 12:40:55 +00:00
2000-09-18 16:07:07 +00:00
ShearMarkedObj ( aRef , nShearAngle , bShearVert ) ;
2007-07-18 09:55:50 +00:00
// #i74358#
// ShearMarkedObj creates a linear combination of the existing transformation and
// the new shear to apply. If the object is already transformed (e.g. rotated) the
// linear combination will not decompose to the same start values again, but to a
// new combination. Thus it makes no sense to check if the wanted shear is reached
// or not. Taking out.
#if 0
2000-09-18 16:07:07 +00:00
long nTempAngle = GetMarkedObjShear ( ) ;
if ( nTempAngle ! = 0 & & nTempAngle ! = nNewShearAngle & & ! bShearVert ) {
// noch eine 2. Iteration zur Kompensation der Rundungsfehler
double nOld = tan ( ( double ) nTempAngle * nPi180 ) ;
double nNew = tan ( ( double ) nNewShearAngle * nPi180 ) ;
nNew - = nOld ;
nNew = atan ( nNew ) / nPi180 ;
nTempAngle = Round ( nNew ) ;
if ( nTempAngle ! = 0 ) {
ShearMarkedObj ( aRef , nTempAngle , bShearVert ) ;
}
}
2007-07-18 09:55:50 +00:00
# endif
2000-09-18 16:07:07 +00:00
}
// Position aendern
if ( bChgPos & & bMoveAllowed ) {
MoveMarkedObj ( Size ( nPosDX , nPosDY ) ) ;
}
// Position geschuetzt
2002-03-27 10:02:15 +00:00
if ( SFX_ITEM_SET = = rAttr . GetItemState ( SID_ATTR_TRANSFORM_PROTECT_POS , TRUE , & pPoolItem ) )
{
2000-09-18 16:07:07 +00:00
BOOL bProtPos = ( ( const SfxBoolItem * ) pPoolItem ) - > GetValue ( ) ;
for ( ULONG i = 0 ; i < nMarkCount ; i + + ) {
2006-07-25 11:55:34 +00:00
pObj = rMarkList . GetMark ( i ) - > GetMarkedSdrObj ( ) ;
2000-09-18 16:07:07 +00:00
pObj - > SetMoveProtect ( bProtPos ) ;
2002-03-27 10:02:15 +00:00
if ( bProtPos )
pObj - > SetResizeProtect ( true ) ;
2000-09-18 16:07:07 +00:00
}
// BugFix 13897: hier muesste besser ein Broadcast her!
// Ausserdem fehlt Undo
// oder -> bProtPos/Size als Item (Interface)
bMoveProtect = bProtPos ;
2002-03-27 10:02:15 +00:00
if ( bProtPos )
bResizeProtect = true ;
2000-09-18 16:07:07 +00:00
}
2002-03-27 10:02:15 +00:00
if ( ! bMoveProtect )
{
// Groesse geschuetzt
if ( SFX_ITEM_SET = = rAttr . GetItemState ( SID_ATTR_TRANSFORM_PROTECT_SIZE , TRUE , & pPoolItem ) )
{
BOOL bProtSize = ( ( const SfxBoolItem * ) pPoolItem ) - > GetValue ( ) ;
for ( ULONG i = 0 ; i < nMarkCount ; i + + ) {
2006-07-25 11:55:34 +00:00
pObj = rMarkList . GetMark ( i ) - > GetMarkedSdrObj ( ) ;
2002-03-27 10:02:15 +00:00
pObj - > SetResizeProtect ( bProtSize ) ;
}
// BugFix 13897: hier muesste besser ein Broadcast her!
// Ausserdem fehlt Undo
// oder -> bProtPos/Size als Item (Interface)
bResizeProtect = bProtSize ;
2000-09-18 16:07:07 +00:00
}
}
EndUndo ( ) ;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL SdrEditView : : IsAlignPossible ( ) const
{ // Mindestens 2 markierte Objekte, davon mind. 1 beweglich
ForcePossibilities ( ) ;
2004-07-12 13:44:58 +00:00
ULONG nAnz = GetMarkedObjectCount ( ) ;
2000-09-18 16:07:07 +00:00
if ( nAnz = = 0 ) return FALSE ; // Nix markiert!
if ( nAnz = = 1 ) return bMoveAllowed ; // einzelnes Obj an der Seite ausrichten
return bOneOrMoreMovable ; // ansonsten ist MarkCount>=2
}
void SdrEditView : : AlignMarkedObjects ( SdrHorAlign eHor , SdrVertAlign eVert , BOOL bBoundRects )
{
if ( eHor = = SDRHALIGN_NONE & & eVert = = SDRVALIGN_NONE ) return ;
2004-07-12 13:44:58 +00:00
SortMarkedObjects ( ) ;
if ( GetMarkedObjectCount ( ) < 1 ) return ;
XubString aStr ( GetDescriptionOfMarkedObjects ( ) ) ;
2000-09-18 16:07:07 +00:00
if ( eHor = = SDRHALIGN_NONE ) {
switch ( eVert ) {
case SDRVALIGN_TOP : ImpTakeDescriptionStr ( STR_EditAlignVTop , aStr ) ; break ;
case SDRVALIGN_BOTTOM : ImpTakeDescriptionStr ( STR_EditAlignVBottom , aStr ) ; break ;
case SDRVALIGN_CENTER : ImpTakeDescriptionStr ( STR_EditAlignVCenter , aStr ) ; break ;
2006-06-19 15:35:48 +00:00
default : break ;
2000-09-18 16:07:07 +00:00
}
} else if ( eVert = = SDRVALIGN_NONE ) {
switch ( eHor ) {
case SDRHALIGN_LEFT : ImpTakeDescriptionStr ( STR_EditAlignHLeft , aStr ) ; break ;
case SDRHALIGN_RIGHT : ImpTakeDescriptionStr ( STR_EditAlignHRight , aStr ) ; break ;
case SDRHALIGN_CENTER : ImpTakeDescriptionStr ( STR_EditAlignHCenter , aStr ) ; break ;
2006-06-19 15:35:48 +00:00
default : break ;
2000-09-18 16:07:07 +00:00
}
} else if ( eHor = = SDRHALIGN_CENTER & & eVert = = SDRVALIGN_CENTER ) {
ImpTakeDescriptionStr ( STR_EditAlignCenter , aStr ) ;
} else {
ImpTakeDescriptionStr ( STR_EditAlign , aStr ) ;
}
BegUndo ( aStr ) ;
Rectangle aBound ;
2004-07-12 13:44:58 +00:00
ULONG nMarkAnz = GetMarkedObjectCount ( ) ;
2000-09-18 16:07:07 +00:00
ULONG nm ;
BOOL bHasFixed = FALSE ;
for ( nm = 0 ; nm < nMarkAnz ; nm + + ) {
2004-07-12 13:44:58 +00:00
SdrMark * pM = GetSdrMarkByIndex ( nm ) ;
2006-07-25 11:55:34 +00:00
SdrObject * pObj = pM - > GetMarkedSdrObj ( ) ;
2000-09-18 16:07:07 +00:00
SdrObjTransformInfoRec aInfo ;
pObj - > TakeObjInfo ( aInfo ) ;
if ( ! aInfo . bMoveAllowed | | pObj - > IsMoveProtect ( ) ) {
2003-11-24 15:53:21 +00:00
Rectangle aObjRect ( bBoundRects ? pObj - > GetCurrentBoundRect ( ) : pObj - > GetSnapRect ( ) ) ;
2000-09-18 16:07:07 +00:00
aBound . Union ( aObjRect ) ;
bHasFixed = TRUE ;
}
}
if ( ! bHasFixed ) {
if ( nMarkAnz = = 1 ) { // einzelnes Obj an der Seite ausrichten
2004-07-12 13:44:58 +00:00
const SdrObject * pObj = GetMarkedObjectByIndex ( 0L ) ;
2000-09-18 16:07:07 +00:00
const SdrPage * pPage = pObj - > GetPage ( ) ;
2004-07-12 13:44:58 +00:00
const SdrPageGridFrameList * pGFL = pPage - > GetGridFrameList ( GetSdrPageViewOfMarkedByIndex ( 0 ) , & ( pObj - > GetSnapRect ( ) ) ) ;
2000-09-18 16:07:07 +00:00
const SdrPageGridFrame * pFrame = NULL ;
if ( pGFL ! = NULL & & pGFL - > GetCount ( ) ! = 0 ) { // Writer
pFrame = & ( ( * pGFL ) [ 0 ] ) ;
}
if ( pFrame ! = NULL ) { // Writer
aBound = pFrame - > GetUserArea ( ) ;
} else {
aBound = Rectangle ( pPage - > GetLftBorder ( ) , pPage - > GetUppBorder ( ) ,
pPage - > GetWdt ( ) - pPage - > GetRgtBorder ( ) ,
pPage - > GetHgt ( ) - pPage - > GetLwrBorder ( ) ) ;
}
} else {
if ( bBoundRects ) aBound = GetMarkedObjBoundRect ( ) ;
else aBound = GetMarkedObjRect ( ) ;
}
}
Point aCenter ( aBound . Center ( ) ) ;
for ( nm = 0 ; nm < nMarkAnz ; nm + + ) {
2004-07-12 13:44:58 +00:00
SdrMark * pM = GetSdrMarkByIndex ( nm ) ;
2006-07-25 11:55:34 +00:00
SdrObject * pObj = pM - > GetMarkedSdrObj ( ) ;
2000-09-18 16:07:07 +00:00
SdrObjTransformInfoRec aInfo ;
pObj - > TakeObjInfo ( aInfo ) ;
if ( aInfo . bMoveAllowed & & ! pObj - > IsMoveProtect ( ) ) {
2006-11-14 12:40:55 +00:00
// SdrPageView* pPV=pM->GetPageView();
2000-09-18 16:07:07 +00:00
long nXMov = 0 ;
long nYMov = 0 ;
2003-11-24 15:53:21 +00:00
Rectangle aObjRect ( bBoundRects ? pObj - > GetCurrentBoundRect ( ) : pObj - > GetSnapRect ( ) ) ;
2000-09-18 16:07:07 +00:00
switch ( eVert ) {
2006-11-14 12:40:55 +00:00
case SDRVALIGN_TOP : nYMov = aBound . Top ( ) - aObjRect . Top ( ) ; break ;
case SDRVALIGN_BOTTOM : nYMov = aBound . Bottom ( ) - aObjRect . Bottom ( ) ; break ;
case SDRVALIGN_CENTER : nYMov = aCenter . Y ( ) - aObjRect . Center ( ) . Y ( ) ; break ;
2006-06-19 15:35:48 +00:00
default : break ;
2000-09-18 16:07:07 +00:00
}
switch ( eHor ) {
2006-11-14 12:40:55 +00:00
case SDRHALIGN_LEFT : nXMov = aBound . Left ( ) - aObjRect . Left ( ) ; break ;
case SDRHALIGN_RIGHT : nXMov = aBound . Right ( ) - aObjRect . Right ( ) ; break ;
case SDRHALIGN_CENTER : nXMov = aCenter . X ( ) - aObjRect . Center ( ) . X ( ) ; break ;
2006-06-19 15:35:48 +00:00
default : break ;
2000-09-18 16:07:07 +00:00
}
2002-10-09 14:35:51 +00:00
if ( nXMov ! = 0 | | nYMov ! = 0 )
{
// #104104# SdrEdgeObj needs an extra SdrUndoGeoObj since the
// connections may need to be saved
if ( pObj & & pObj - > ISA ( SdrEdgeObj ) )
{
2006-01-10 13:49:16 +00:00
AddUndo ( GetModel ( ) - > GetSdrUndoFactory ( ) . CreateUndoGeoObject ( * pObj ) ) ;
2002-10-09 14:35:51 +00:00
}
2006-01-10 13:49:16 +00:00
AddUndo ( GetModel ( ) - > GetSdrUndoFactory ( ) . CreateUndoMoveObject ( * pObj , Size ( nXMov , nYMov ) ) ) ;
2002-10-09 14:35:51 +00:00
2000-09-18 16:07:07 +00:00
pObj - > Move ( Size ( nXMov , nYMov ) ) ;
}
}
}
EndUndo ( ) ;
}