1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_svx.hxx" 26 27 #include <svx/svdglev.hxx> 28 #include <math.h> 29 30 #include <svx/svdundo.hxx> 31 #include "svx/svdstr.hrc" // Namen aus der Resource 32 #include "svx/svdglob.hxx" // StringCache 33 #include <svx/svdpagv.hxx> 34 #include <svx/svdglue.hxx> 35 #include <svx/svdtrans.hxx> 36 #include <svx/svdobj.hxx> 37 38 //////////////////////////////////////////////////////////////////////////////////////////////////// 39 40 void SdrGlueEditView::ImpClearVars() 41 { 42 } 43 44 SdrGlueEditView::SdrGlueEditView(SdrModel* pModel1, OutputDevice* pOut): 45 SdrPolyEditView(pModel1,pOut) 46 { 47 ImpClearVars(); 48 } 49 50 SdrGlueEditView::~SdrGlueEditView() 51 { 52 } 53 54 //////////////////////////////////////////////////////////////////////////////////////////////////// 55 56 void SdrGlueEditView::ImpDoMarkedGluePoints(PGlueDoFunc pDoFunc, sal_Bool bConst, const void* p1, const void* p2, const void* p3, const void* p4, const void* p5) 57 { 58 sal_uIntPtr nMarkAnz=GetMarkedObjectCount(); 59 for (sal_uIntPtr nm=0; nm<nMarkAnz; nm++) { 60 SdrMark* pM=GetSdrMarkByIndex(nm); 61 SdrObject* pObj=pM->GetMarkedSdrObj(); 62 const SdrUShortCont* pPts=pM->GetMarkedGluePoints(); 63 sal_uIntPtr nPtAnz=pPts==NULL ? 0 : pPts->GetCount(); 64 if (nPtAnz!=0) { 65 SdrGluePointList* pGPL=NULL; 66 if (bConst) { 67 const SdrGluePointList* pConstGPL=pObj->GetGluePointList(); 68 pGPL=(SdrGluePointList*)pConstGPL; 69 } else { 70 pGPL=pObj->ForceGluePointList(); 71 } 72 if (pGPL!=NULL) 73 { 74 if(!bConst && IsUndoEnabled() ) 75 AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pObj)); 76 77 for (sal_uIntPtr nPtNum=0; nPtNum<nPtAnz; nPtNum++) 78 { 79 sal_uInt16 nPtId=pPts->GetObject(nPtNum); 80 sal_uInt16 nGlueIdx=pGPL->FindGluePoint(nPtId); 81 if (nGlueIdx!=SDRGLUEPOINT_NOTFOUND) 82 { 83 SdrGluePoint& rGP=(*pGPL)[nGlueIdx]; 84 (*pDoFunc)(rGP,pObj,p1,p2,p3,p4,p5); 85 } 86 } 87 if (!bConst) 88 { 89 pObj->SetChanged(); 90 pObj->BroadcastObjectChange(); 91 } 92 } 93 } 94 } 95 if (!bConst && nMarkAnz!=0) pMod->SetChanged(); 96 } 97 98 //////////////////////////////////////////////////////////////////////////////////////////////////// 99 100 static void ImpGetEscDir(SdrGluePoint& rGP, const SdrObject* /*pObj*/, const void* pbFirst, const void* pnThisEsc, const void* pnRet, const void*, const void*) 101 { 102 sal_uInt16& nRet=*(sal_uInt16*)pnRet; 103 sal_Bool& bFirst=*(sal_Bool*)pbFirst; 104 if (nRet!=FUZZY) { 105 sal_uInt16 nEsc=rGP.GetEscDir(); 106 sal_Bool bOn=(nEsc & *(sal_uInt16*)pnThisEsc)!=0; 107 if (bFirst) { nRet=bOn; bFirst=sal_False; } 108 else if (nRet!=bOn) nRet=FUZZY; 109 } 110 } 111 112 TRISTATE SdrGlueEditView::IsMarkedGluePointsEscDir(sal_uInt16 nThisEsc) const 113 { 114 ForceUndirtyMrkPnt(); 115 sal_Bool bFirst=sal_True; 116 sal_uInt16 nRet=sal_False; 117 ((SdrGlueEditView*)this)->ImpDoMarkedGluePoints(ImpGetEscDir,sal_True,&bFirst,&nThisEsc,&nRet); 118 return (TRISTATE)nRet; 119 } 120 121 static void ImpSetEscDir(SdrGluePoint& rGP, const SdrObject* /*pObj*/, const void* pnThisEsc, const void* pbOn, const void*, const void*, const void*) 122 { 123 sal_uInt16 nEsc=rGP.GetEscDir(); 124 if (*(sal_Bool*)pbOn) nEsc|=*(sal_uInt16*)pnThisEsc; 125 else nEsc&=~*(sal_uInt16*)pnThisEsc; 126 rGP.SetEscDir(nEsc); 127 } 128 129 void SdrGlueEditView::SetMarkedGluePointsEscDir(sal_uInt16 nThisEsc, sal_Bool bOn) 130 { 131 ForceUndirtyMrkPnt(); 132 BegUndo(ImpGetResStr(STR_EditSetGlueEscDir),GetDescriptionOfMarkedGluePoints()); 133 ImpDoMarkedGluePoints(ImpSetEscDir,sal_False,&nThisEsc,&bOn); 134 EndUndo(); 135 } 136 137 //////////////////////////////////////////////////////////////////////////////////////////////////// 138 139 static void ImpGetPercent(SdrGluePoint& rGP, const SdrObject* /*pObj*/, const void* pbFirst, const void* pnRet, const void*, const void*, const void*) 140 { 141 sal_uInt16& nRet=*(sal_uInt16*)pnRet; 142 sal_Bool& bFirst=*(sal_Bool*)pbFirst; 143 if (nRet!=FUZZY) { 144 bool bOn=rGP.IsPercent(); 145 if (bFirst) { nRet=bOn; bFirst=sal_False; } 146 else if ((nRet!=0)!=bOn) nRet=FUZZY; 147 } 148 } 149 150 TRISTATE SdrGlueEditView::IsMarkedGluePointsPercent() const 151 { 152 ForceUndirtyMrkPnt(); 153 sal_Bool bFirst=sal_True; 154 sal_uInt16 nRet=sal_True; 155 ((SdrGlueEditView*)this)->ImpDoMarkedGluePoints(ImpGetPercent,sal_True,&bFirst,&nRet); 156 return (TRISTATE)nRet; 157 } 158 159 static void ImpSetPercent(SdrGluePoint& rGP, const SdrObject* pObj, const void* pbOn, const void*, const void*, const void*, const void*) 160 { 161 Point aPos(rGP.GetAbsolutePos(*pObj)); 162 rGP.SetPercent(*(sal_Bool*)pbOn); 163 rGP.SetAbsolutePos(aPos,*pObj); 164 } 165 166 void SdrGlueEditView::SetMarkedGluePointsPercent(sal_Bool bOn) 167 { 168 ForceUndirtyMrkPnt(); 169 BegUndo(ImpGetResStr(STR_EditSetGluePercent),GetDescriptionOfMarkedGluePoints()); 170 ImpDoMarkedGluePoints(ImpSetPercent,sal_False,&bOn); 171 EndUndo(); 172 } 173 174 //////////////////////////////////////////////////////////////////////////////////////////////////// 175 176 static void ImpGetAlign(SdrGluePoint& rGP, const SdrObject* /*pObj*/, const void* pbFirst, const void* pbDontCare, const void* pbVert, const void* pnRet, const void*) 177 { 178 sal_uInt16& nRet=*(sal_uInt16*)pnRet; 179 sal_Bool& bFirst=*(sal_Bool*)pbFirst; 180 sal_Bool& bDontCare=*(sal_Bool*)pbDontCare; 181 sal_Bool bVert=*(sal_Bool*)pbVert; 182 if (!bDontCare) { 183 sal_uInt16 nAlg=0; 184 if (bVert) { 185 nAlg=rGP.GetVertAlign(); 186 } else { 187 nAlg=rGP.GetHorzAlign(); 188 } 189 if (bFirst) { nRet=nAlg; bFirst=sal_False; } 190 else if (nRet!=nAlg) { 191 if (bVert) { 192 nRet=SDRVERTALIGN_DONTCARE; 193 } else { 194 nRet=SDRHORZALIGN_DONTCARE; 195 } 196 bDontCare=sal_True; 197 } 198 } 199 } 200 201 sal_uInt16 SdrGlueEditView::GetMarkedGluePointsAlign(sal_Bool bVert) const 202 { 203 ForceUndirtyMrkPnt(); 204 sal_Bool bFirst=sal_True; 205 sal_Bool bDontCare=sal_False; 206 sal_uInt16 nRet=0; 207 ((SdrGlueEditView*)this)->ImpDoMarkedGluePoints(ImpGetAlign,sal_True,&bFirst,&bDontCare,&bVert,&nRet); 208 return nRet; 209 } 210 211 static void ImpSetAlign(SdrGluePoint& rGP, const SdrObject* pObj, const void* pbVert, const void* pnAlign, const void*, const void*, const void*) 212 { 213 Point aPos(rGP.GetAbsolutePos(*pObj)); 214 if (*(sal_Bool*)pbVert) { // bVert? 215 rGP.SetVertAlign(*(sal_uInt16*)pnAlign); 216 } else { 217 rGP.SetHorzAlign(*(sal_uInt16*)pnAlign); 218 } 219 rGP.SetAbsolutePos(aPos,*pObj); 220 } 221 222 void SdrGlueEditView::SetMarkedGluePointsAlign(sal_Bool bVert, sal_uInt16 nAlign) 223 { 224 ForceUndirtyMrkPnt(); 225 BegUndo(ImpGetResStr(STR_EditSetGlueAlign),GetDescriptionOfMarkedGluePoints()); 226 ImpDoMarkedGluePoints(ImpSetAlign,sal_False,&bVert,&nAlign); 227 EndUndo(); 228 } 229 230 //////////////////////////////////////////////////////////////////////////////////////////////////// 231 232 sal_Bool SdrGlueEditView::IsDeleteMarkedGluePointsPossible() const 233 { 234 return HasMarkedGluePoints(); 235 } 236 237 void SdrGlueEditView::DeleteMarkedGluePoints() 238 { 239 BrkAction(); 240 ForceUndirtyMrkPnt(); 241 const bool bUndo = IsUndoEnabled(); 242 if( bUndo ) 243 BegUndo(ImpGetResStr(STR_EditDelete),GetDescriptionOfMarkedGluePoints(),SDRREPFUNC_OBJ_DELETE); 244 245 sal_uIntPtr nMarkAnz=GetMarkedObjectCount(); 246 for (sal_uIntPtr nm=0; nm<nMarkAnz; nm++) 247 { 248 SdrMark* pM=GetSdrMarkByIndex(nm); 249 SdrObject* pObj=pM->GetMarkedSdrObj(); 250 const SdrUShortCont* pPts=pM->GetMarkedGluePoints(); 251 sal_uIntPtr nPtAnz=pPts==NULL ? 0 : pPts->GetCount(); 252 if (nPtAnz!=0) 253 { 254 SdrGluePointList* pGPL=pObj->ForceGluePointList(); 255 if (pGPL!=NULL) 256 { 257 if( bUndo ) 258 AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pObj)); 259 260 for (sal_uIntPtr nPtNum=0; nPtNum<nPtAnz; nPtNum++) 261 { 262 sal_uInt16 nPtId=pPts->GetObject(nPtNum); 263 sal_uInt16 nGlueIdx=pGPL->FindGluePoint(nPtId); 264 if (nGlueIdx!=SDRGLUEPOINT_NOTFOUND) 265 { 266 pGPL->Delete(nGlueIdx); 267 } 268 } 269 pObj->SetChanged(); 270 pObj->BroadcastObjectChange(); 271 } 272 } 273 } 274 if( bUndo ) 275 EndUndo(); 276 UnmarkAllGluePoints(); 277 if (nMarkAnz!=0) 278 pMod->SetChanged(); 279 } 280 281 //////////////////////////////////////////////////////////////////////////////////////////////////// 282 283 void SdrGlueEditView::ImpCopyMarkedGluePoints() 284 { 285 const bool bUndo = IsUndoEnabled(); 286 287 if( bUndo ) 288 BegUndo(); 289 290 sal_uIntPtr nMarkAnz=GetMarkedObjectCount(); 291 for (sal_uIntPtr nm=0; nm<nMarkAnz; nm++) 292 { 293 SdrMark* pM=GetSdrMarkByIndex(nm); 294 SdrObject* pObj=pM->GetMarkedSdrObj(); 295 SdrUShortCont* pPts=pM->GetMarkedGluePoints(); 296 SdrGluePointList* pGPL=pObj->ForceGluePointList(); 297 sal_uIntPtr nPtAnz=pPts==NULL ? 0 : pPts->GetCount(); 298 if (nPtAnz!=0 && pGPL!=NULL) 299 { 300 if( bUndo ) 301 AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pObj)); 302 303 for (sal_uIntPtr nPtNum=0; nPtNum<nPtAnz; nPtNum++) 304 { 305 sal_uInt16 nPtId=pPts->GetObject(nPtNum); 306 sal_uInt16 nGlueIdx=pGPL->FindGluePoint(nPtId); 307 if (nGlueIdx!=SDRGLUEPOINT_NOTFOUND) 308 { 309 SdrGluePoint aNewGP((*pGPL)[nGlueIdx]); // GluePoint klonen 310 sal_uInt16 nNewIdx=pGPL->Insert(aNewGP); // und einfuegen 311 sal_uInt16 nNewId=(*pGPL)[nNewIdx].GetId(); // Id des neuen GluePoints ermitteln 312 pPts->Replace(nNewId,nPtNum); // und diesen markieren (anstelle des alten) 313 } 314 } 315 } 316 } 317 if( bUndo ) 318 EndUndo(); 319 320 if (nMarkAnz!=0) 321 pMod->SetChanged(); 322 } 323 324 //////////////////////////////////////////////////////////////////////////////////////////////////// 325 326 void SdrGlueEditView::ImpTransformMarkedGluePoints(PGlueTrFunc pTrFunc, const void* p1, const void* p2, const void* p3, const void* p4, const void* p5) 327 { 328 sal_uIntPtr nMarkAnz=GetMarkedObjectCount(); 329 for (sal_uIntPtr nm=0; nm<nMarkAnz; nm++) { 330 SdrMark* pM=GetSdrMarkByIndex(nm); 331 SdrObject* pObj=pM->GetMarkedSdrObj(); 332 const SdrUShortCont* pPts=pM->GetMarkedGluePoints(); 333 sal_uIntPtr nPtAnz=pPts==NULL ? 0 : pPts->GetCount(); 334 if (nPtAnz!=0) { 335 SdrGluePointList* pGPL=pObj->ForceGluePointList(); 336 if (pGPL!=NULL) 337 { 338 if( IsUndoEnabled() ) 339 AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pObj)); 340 341 for (sal_uIntPtr nPtNum=0; nPtNum<nPtAnz; nPtNum++) { 342 sal_uInt16 nPtId=pPts->GetObject(nPtNum); 343 sal_uInt16 nGlueIdx=pGPL->FindGluePoint(nPtId); 344 if (nGlueIdx!=SDRGLUEPOINT_NOTFOUND) { 345 SdrGluePoint& rGP=(*pGPL)[nGlueIdx]; 346 Point aPos(rGP.GetAbsolutePos(*pObj)); 347 (*pTrFunc)(aPos,p1,p2,p3,p4,p5); 348 rGP.SetAbsolutePos(aPos,*pObj); 349 } 350 } 351 pObj->SetChanged(); 352 pObj->BroadcastObjectChange(); 353 } 354 } 355 } 356 if (nMarkAnz!=0) pMod->SetChanged(); 357 } 358 359 //////////////////////////////////////////////////////////////////////////////////////////////////// 360 361 static void ImpMove(Point& rPt, const void* p1, const void* /*p2*/, const void* /*p3*/, const void* /*p4*/, const void* /*p5*/) 362 { 363 rPt.X()+=((const Size*)p1)->Width(); 364 rPt.Y()+=((const Size*)p1)->Height(); 365 } 366 367 void SdrGlueEditView::MoveMarkedGluePoints(const Size& rSiz, bool bCopy) 368 { 369 ForceUndirtyMrkPnt(); 370 XubString aStr(ImpGetResStr(STR_EditMove)); 371 if (bCopy) aStr+=ImpGetResStr(STR_EditWithCopy); 372 BegUndo(aStr,GetDescriptionOfMarkedGluePoints(),SDRREPFUNC_OBJ_MOVE); 373 if (bCopy) ImpCopyMarkedGluePoints(); 374 ImpTransformMarkedGluePoints(ImpMove,&rSiz); 375 EndUndo(); 376 AdjustMarkHdl(); 377 } 378 379 //////////////////////////////////////////////////////////////////////////////////////////////////// 380 381 static void ImpResize(Point& rPt, const void* p1, const void* p2, const void* p3, const void* /*p4*/, const void* /*p5*/) 382 { 383 ResizePoint(rPt,*(const Point*)p1,*(const Fraction*)p2,*(const Fraction*)p3); 384 } 385 386 void SdrGlueEditView::ResizeMarkedGluePoints(const Point& rRef, const Fraction& xFact, const Fraction& yFact, bool bCopy) 387 { 388 ForceUndirtyMrkPnt(); 389 XubString aStr(ImpGetResStr(STR_EditResize)); 390 if (bCopy) aStr+=ImpGetResStr(STR_EditWithCopy); 391 BegUndo(aStr,GetDescriptionOfMarkedGluePoints(),SDRREPFUNC_OBJ_RESIZE); 392 if (bCopy) ImpCopyMarkedGluePoints(); 393 ImpTransformMarkedGluePoints(ImpResize,&rRef,&xFact,&yFact); 394 EndUndo(); 395 AdjustMarkHdl(); 396 } 397 398 //////////////////////////////////////////////////////////////////////////////////////////////////// 399 400 static void ImpRotate(Point& rPt, const void* p1, const void* /*p2*/, const void* p3, const void* p4, const void* /*p5*/) 401 { 402 RotatePoint(rPt,*(const Point*)p1,*(const double*)p3,*(const double*)p4); 403 } 404 405 void SdrGlueEditView::RotateMarkedGluePoints(const Point& rRef, long nWink, bool bCopy) 406 { 407 ForceUndirtyMrkPnt(); 408 XubString aStr(ImpGetResStr(STR_EditRotate)); 409 if (bCopy) aStr+=ImpGetResStr(STR_EditWithCopy); 410 BegUndo(aStr,GetDescriptionOfMarkedGluePoints(),SDRREPFUNC_OBJ_ROTATE); 411 if (bCopy) ImpCopyMarkedGluePoints(); 412 double nSin=sin(nWink*nPi180); 413 double nCos=cos(nWink*nPi180); 414 ImpTransformMarkedGluePoints(ImpRotate,&rRef,&nWink,&nSin,&nCos); 415 EndUndo(); 416 AdjustMarkHdl(); 417 } 418 419