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_sd.hxx" 26 27 28 #include "fucopy.hxx" 29 #include <sfx2/progress.hxx> 30 #include <svx/svxids.hrc> 31 32 #include "sdresid.hxx" 33 #include "sdattr.hxx" 34 #include "strings.hrc" 35 #include "ViewShell.hxx" 36 #include "View.hxx" 37 #include "drawdoc.hxx" 38 #include "DrawDocShell.hxx" 39 #include <vcl/wrkwin.hxx> 40 #include <svx/svdobj.hxx> 41 #include <vcl/msgbox.hxx> 42 #include <sfx2/app.hxx> 43 #include <svx/xcolit.hxx> 44 #include <svx/xflclit.hxx> 45 #include <svx/xdef.hxx> 46 #include <svx/xfillit0.hxx> 47 #include <sfx2/request.hxx> 48 #include "sdabstdlg.hxx" 49 #include "copydlg.hrc" 50 namespace sd { 51 52 TYPEINIT1( FuCopy, FuPoor ); 53 54 /************************************************************************* 55 |* 56 |* Konstruktor 57 |* 58 \************************************************************************/ 59 60 FuCopy::FuCopy ( 61 ViewShell* pViewSh, 62 ::sd::Window* pWin, 63 ::sd::View* pView, 64 SdDrawDocument* pDoc, 65 SfxRequest& rReq) 66 : FuPoor(pViewSh, pWin, pView, pDoc, rReq) 67 { 68 } 69 70 FunctionReference FuCopy::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) 71 { 72 FunctionReference xFunc( new FuCopy( pViewSh, pWin, pView, pDoc, rReq ) ); 73 xFunc->DoExecute(rReq); 74 return xFunc; 75 } 76 77 void FuCopy::DoExecute( SfxRequest& rReq ) 78 { 79 if( mpView->AreObjectsMarked() ) 80 { 81 // Undo 82 String aString( mpView->GetDescriptionOfMarkedObjects() ); 83 aString.Append( sal_Unicode(' ') ); 84 aString.Append( String( SdResId( STR_UNDO_COPYOBJECTS ) ) ); 85 mpView->BegUndo( aString ); 86 87 const SfxItemSet* pArgs = rReq.GetArgs(); 88 89 if( !pArgs ) 90 { 91 SfxItemSet aSet( mpViewShell->GetPool(), 92 ATTR_COPY_START, ATTR_COPY_END, 0 ); 93 94 // Farb-Attribut angeben 95 SfxItemSet aAttr( mpDoc->GetPool() ); 96 mpView->GetAttributes( aAttr ); 97 const SfxPoolItem* pPoolItem = NULL; 98 99 if( SFX_ITEM_SET == aAttr.GetItemState( XATTR_FILLSTYLE, sal_True, &pPoolItem ) ) 100 { 101 XFillStyle eStyle = ( ( const XFillStyleItem* ) pPoolItem )->GetValue(); 102 103 if( eStyle == XFILL_SOLID && 104 SFX_ITEM_SET == aAttr.GetItemState( XATTR_FILLCOLOR, sal_True, &pPoolItem ) ) 105 { 106 const XFillColorItem* pItem = ( const XFillColorItem* ) pPoolItem; 107 XColorItem aXColorItem( ATTR_COPY_START_COLOR, pItem->GetName(), 108 pItem->GetColorValue() ); 109 aSet.Put( aXColorItem ); 110 111 } 112 } 113 114 SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); 115 if( pFact ) 116 { 117 AbstractCopyDlg* pDlg = pFact->CreateCopyDlg(NULL, aSet, mpDoc->GetColorTable(), mpView ); 118 if( pDlg ) 119 { 120 sal_uInt16 nResult = pDlg->Execute(); 121 122 switch( nResult ) 123 { 124 case RET_OK: 125 pDlg->GetAttr( aSet ); 126 rReq.Done( aSet ); 127 pArgs = rReq.GetArgs(); 128 break; 129 130 default: 131 { 132 delete pDlg; 133 mpView->EndUndo(); 134 } 135 return; // Abbruch 136 } 137 delete( pDlg ); 138 } 139 } 140 } 141 142 Rectangle aRect; 143 sal_Int32 lWidth = 0, lHeight = 0, lSizeX = 0L, lSizeY = 0L, lAngle = 0L; 144 sal_uInt16 nNumber = 0; 145 Color aStartColor, aEndColor; 146 sal_Bool bColor = sal_False; 147 const SfxPoolItem* pPoolItem = NULL; 148 149 // Anzahl 150 if( SFX_ITEM_SET == pArgs->GetItemState( ATTR_COPY_NUMBER, sal_True, &pPoolItem ) ) 151 nNumber = ( ( const SfxUInt16Item* ) pPoolItem )->GetValue(); 152 153 // Verschiebung 154 if( SFX_ITEM_SET == pArgs->GetItemState( ATTR_COPY_MOVE_X, sal_True, &pPoolItem ) ) 155 lSizeX = ( ( const SfxInt32Item* ) pPoolItem )->GetValue(); 156 if( SFX_ITEM_SET == pArgs->GetItemState( ATTR_COPY_MOVE_Y, sal_True, &pPoolItem ) ) 157 lSizeY = ( ( const SfxInt32Item* ) pPoolItem )->GetValue(); 158 if( SFX_ITEM_SET == pArgs->GetItemState( ATTR_COPY_ANGLE, sal_True, &pPoolItem ) ) 159 lAngle = ( ( const SfxInt32Item* )pPoolItem )->GetValue(); 160 161 // Verrgroesserung / Verkleinerung 162 if( SFX_ITEM_SET == pArgs->GetItemState( ATTR_COPY_WIDTH, sal_True, &pPoolItem ) ) 163 lWidth = ( ( const SfxInt32Item* ) pPoolItem )->GetValue(); 164 if( SFX_ITEM_SET == pArgs->GetItemState( ATTR_COPY_HEIGHT, sal_True, &pPoolItem ) ) 165 lHeight = ( ( const SfxInt32Item* ) pPoolItem )->GetValue(); 166 167 // Startfarbe / Endfarbe 168 if( SFX_ITEM_SET == pArgs->GetItemState( ATTR_COPY_START_COLOR, sal_True, &pPoolItem ) ) 169 { 170 aStartColor = ( ( const XColorItem* ) pPoolItem )->GetColorValue(); 171 bColor = sal_True; 172 } 173 if( SFX_ITEM_SET == pArgs->GetItemState( ATTR_COPY_END_COLOR, sal_True, &pPoolItem ) ) 174 { 175 aEndColor = ( ( const XColorItem* ) pPoolItem )->GetColorValue(); 176 if( aStartColor == aEndColor ) 177 bColor = sal_False; 178 } 179 else 180 bColor = sal_False; 181 182 // Handles wegnehmen 183 //HMHmpView->HideMarkHdl(); 184 185 SfxProgress* pProgress = NULL; 186 sal_Bool bWaiting = sal_False; 187 188 if( nNumber > 1 ) 189 { 190 String aStr( SdResId( STR_OBJECTS ) ); 191 aStr.Append( sal_Unicode(' ') ); 192 aStr.Append( String( SdResId( STR_UNDO_COPYOBJECTS ) ) ); 193 194 pProgress = new SfxProgress( mpDocSh, aStr, nNumber ); 195 mpDocSh->SetWaitCursor( sal_True ); 196 bWaiting = sal_True; 197 } 198 199 const SdrMarkList aMarkList( mpView->GetMarkedObjectList() ); 200 const sal_uLong nMarkCount = aMarkList.GetMarkCount(); 201 SdrObject* pObj = NULL; 202 203 // Anzahl moeglicher Kopien berechnen 204 aRect = mpView->GetAllMarkedRect(); 205 206 if( lWidth < 0L ) 207 { 208 long nTmp = ( aRect.Right() - aRect.Left() ) / -lWidth; 209 nNumber = (sal_uInt16) Min( nTmp, (long)nNumber ); 210 } 211 212 if( lHeight < 0L ) 213 { 214 long nTmp = ( aRect.Bottom() - aRect.Top() ) / -lHeight; 215 nNumber = (sal_uInt16) Min( nTmp, (long)nNumber ); 216 } 217 218 for( sal_uInt16 i = 1; i <= nNumber; i++ ) 219 { 220 if( pProgress ) 221 pProgress->SetState( i ); 222 223 aRect = mpView->GetAllMarkedRect(); 224 225 if( ( 1 == i ) && bColor ) 226 { 227 SfxItemSet aNewSet( mpViewShell->GetPool(), XATTR_FILLSTYLE, XATTR_FILLCOLOR, 0L ); 228 aNewSet.Put( XFillStyleItem( XFILL_SOLID ) ); 229 aNewSet.Put( XFillColorItem( String(), aStartColor ) ); 230 mpView->SetAttributes( aNewSet ); 231 } 232 233 // make a copy of selected objects 234 mpView->CopyMarked(); 235 236 // get newly selected objects 237 SdrMarkList aCopyMarkList( mpView->GetMarkedObjectList() ); 238 sal_uLong j, nCopyMarkCount = aMarkList.GetMarkCount(); 239 240 // set protection flags at marked copies to null 241 for( j = 0; j < nCopyMarkCount; j++ ) 242 { 243 pObj = aCopyMarkList.GetMark( j )->GetMarkedSdrObj(); 244 245 if( pObj ) 246 { 247 pObj->SetMoveProtect( sal_False ); 248 pObj->SetResizeProtect( sal_False ); 249 } 250 } 251 252 Fraction aWidth( aRect.Right() - aRect.Left() + lWidth, aRect.Right() - aRect.Left() ); 253 Fraction aHeight( aRect.Bottom() - aRect.Top() + lHeight, aRect.Bottom() - aRect.Top() ); 254 255 if( mpView->IsResizeAllowed() ) 256 mpView->ResizeAllMarked( aRect.TopLeft(), aWidth, aHeight ); 257 258 if( mpView->IsRotateAllowed() ) 259 mpView->RotateAllMarked( aRect.Center(), lAngle * 100 ); 260 261 if( mpView->IsMoveAllowed() ) 262 mpView->MoveAllMarked( Size( lSizeX, lSizeY ) ); 263 264 // set protection flags at marked copies to original values 265 if( nMarkCount == nCopyMarkCount ) 266 { 267 for( j = 0; j < nMarkCount; j++ ) 268 { 269 SdrObject* pSrcObj = aMarkList.GetMark( j )->GetMarkedSdrObj(); 270 SdrObject* pDstObj = aCopyMarkList.GetMark( j )->GetMarkedSdrObj(); 271 272 if( pSrcObj && pDstObj && 273 ( pSrcObj->GetObjInventor() == pDstObj->GetObjInventor() ) && 274 ( pSrcObj->GetObjIdentifier() == pDstObj->GetObjIdentifier() ) ) 275 { 276 pDstObj->SetMoveProtect( pSrcObj->IsMoveProtect() ); 277 pDstObj->SetResizeProtect( pSrcObj->IsResizeProtect() ); 278 } 279 } 280 } 281 282 if( bColor ) 283 { 284 // Koennte man sicher noch optimieren, wuerde aber u.U. 285 // zu Rundungsfehlern fuehren 286 sal_uInt8 nRed = aStartColor.GetRed() + (sal_uInt8) ( ( (long) aEndColor.GetRed() - (long) aStartColor.GetRed() ) * (long) i / (long) nNumber ); 287 sal_uInt8 nGreen = aStartColor.GetGreen() + (sal_uInt8) ( ( (long) aEndColor.GetGreen() - (long) aStartColor.GetGreen() ) * (long) i / (long) nNumber ); 288 sal_uInt8 nBlue = aStartColor.GetBlue() + (sal_uInt8) ( ( (long) aEndColor.GetBlue() - (long) aStartColor.GetBlue() ) * (long) i / (long) nNumber ); 289 Color aNewColor( nRed, nGreen, nBlue ); 290 SfxItemSet aNewSet( mpViewShell->GetPool(), XATTR_FILLSTYLE, XATTR_FILLCOLOR, 0L ); 291 aNewSet.Put( XFillStyleItem( XFILL_SOLID ) ); 292 aNewSet.Put( XFillColorItem( String(), aNewColor ) ); 293 mpView->SetAttributes( aNewSet ); 294 } 295 } 296 297 if ( pProgress ) 298 delete pProgress; 299 300 if ( bWaiting ) 301 mpDocSh->SetWaitCursor( sal_False ); 302 303 // Handles zeigen 304 mpView->AdjustMarkHdl(); //HMH sal_True ); 305 //HMHpView->ShowMarkHdl(); 306 307 mpView->EndUndo(); 308 } 309 } 310 311 } // end of namespace 312