/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sd.hxx" #include "fucopy.hxx" #include #include #include "sdresid.hxx" #include "sdattr.hxx" #include "strings.hrc" #include "ViewShell.hxx" #include "View.hxx" #include "drawdoc.hxx" #include "DrawDocShell.hxx" #include #include #include #include #include #include #include #include #include #include "sdabstdlg.hxx" #include "copydlg.hrc" namespace sd { /************************************************************************* |* |* Konstruktor |* \************************************************************************/ FuCopy::FuCopy ( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq) : FuPoor(pViewSh, pWin, pView, pDoc, rReq) { } FunctionReference FuCopy::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) { FunctionReference xFunc( new FuCopy( pViewSh, pWin, pView, pDoc, rReq ) ); xFunc->DoExecute(rReq); return xFunc; } void FuCopy::DoExecute( SfxRequest& rReq ) { if( mpView->areSdrObjectsSelected() ) { // Undo const SdrObjectVector aInitialSelection(mpView->getSelectedSdrObjectVectorFromSdrMarkView()); String aString(getSelectionDescription(aInitialSelection)); aString.Append( sal_Unicode(' ') ); aString.Append( String( SdResId( STR_UNDO_COPYOBJECTS ) ) ); mpView->BegUndo( aString ); const SfxItemSet* pArgs = rReq.GetArgs(); if( !pArgs ) { SfxItemSet aSet( mpViewShell->GetPool(), ATTR_COPY_START, ATTR_COPY_END, 0 ); // Farb-Attribut angeben SfxItemSet aAttr( mpDoc->GetItemPool() ); mpView->GetAttributes( aAttr ); const SfxPoolItem* pPoolItem = NULL; if( SFX_ITEM_SET == aAttr.GetItemState( XATTR_FILLSTYLE, true, &pPoolItem ) ) { XFillStyle eStyle = ( ( const XFillStyleItem* ) pPoolItem )->GetValue(); if( eStyle == XFILL_SOLID && SFX_ITEM_SET == aAttr.GetItemState( XATTR_FILLCOLOR, true, &pPoolItem ) ) { const XFillColorItem* pItem = ( const XFillColorItem* ) pPoolItem; XColorItem aXColorItem( ATTR_COPY_START_COLOR, pItem->GetName(), pItem->GetColorValue() ); aSet.Put( aXColorItem ); } } SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); if( pFact ) { AbstractCopyDlg* pDlg = pFact->CreateCopyDlg(NULL, aSet, mpDoc->GetColorTableFromSdrModel(), mpView ); if( pDlg ) { sal_uInt16 nResult = pDlg->Execute(); switch( nResult ) { case RET_OK: pDlg->GetAttr( aSet ); rReq.Done( aSet ); pArgs = rReq.GetArgs(); break; default: { delete pDlg; mpView->EndUndo(); } return; // Abbruch } delete( pDlg ); } } } basegfx::B2DRange aRange; double lWidth(0.0); double lHeight(0.0); double lSizeX(0.0); double lSizeY(0.0); double lAngle(0.0); sal_uInt16 nNumber(0); Color aStartColor, aEndColor; bool bColor(false); const SfxPoolItem* pPoolItem = 0; // Anzahl if( SFX_ITEM_SET == pArgs->GetItemState( ATTR_COPY_NUMBER, true, &pPoolItem ) ) { nNumber = ( ( const SfxUInt16Item* ) pPoolItem )->GetValue(); } // Verschiebung if( SFX_ITEM_SET == pArgs->GetItemState( ATTR_COPY_MOVE_X, true, &pPoolItem ) ) { lSizeX = ( ( const SfxInt32Item* ) pPoolItem )->GetValue(); } if( SFX_ITEM_SET == pArgs->GetItemState( ATTR_COPY_MOVE_Y, true, &pPoolItem ) ) { lSizeY = ( ( const SfxInt32Item* ) pPoolItem )->GetValue(); } if( SFX_ITEM_SET == pArgs->GetItemState( ATTR_COPY_ANGLE, true, &pPoolItem ) ) { const sal_Int32 nAngle(((const SfxInt32Item*)pPoolItem)->GetValue()); lAngle = (((360 - nAngle) % 360) * F_PI) / 180.0; } // Verrgroesserung / Verkleinerung if( SFX_ITEM_SET == pArgs->GetItemState( ATTR_COPY_WIDTH, true, &pPoolItem ) ) { lWidth = ( ( const SfxInt32Item* ) pPoolItem )->GetValue(); } if( SFX_ITEM_SET == pArgs->GetItemState( ATTR_COPY_HEIGHT, true, &pPoolItem ) ) { lHeight = ( ( const SfxInt32Item* ) pPoolItem )->GetValue(); } // Startfarbe / Endfarbe if( SFX_ITEM_SET == pArgs->GetItemState( ATTR_COPY_START_COLOR, true, &pPoolItem ) ) { aStartColor = ( ( const XColorItem* ) pPoolItem )->GetColorValue(); bColor = true; } if( SFX_ITEM_SET == pArgs->GetItemState( ATTR_COPY_END_COLOR, true, &pPoolItem ) ) { aEndColor = ( ( const XColorItem* ) pPoolItem )->GetColorValue(); if( aStartColor == aEndColor ) bColor = false; } else { bColor = false; } SfxProgress* pProgress = NULL; bool bWaiting = false; if( nNumber > 1 ) { String aStr( SdResId( STR_OBJECTS ) ); aStr.Append( sal_Unicode(' ') ); aStr.Append( String( SdResId( STR_UNDO_COPYOBJECTS ) ) ); pProgress = new SfxProgress( mpDocSh, aStr, nNumber ); mpDocSh->SetWaitCursor( true ); bWaiting = true; } // Anzahl moeglicher Kopien berechnen aRange = mpView->getMarkedObjectSnapRange(); if( lWidth < 0.0 ) { const double fTmp(aRange.getWidth() / -lWidth); nNumber = std::min((sal_uInt16)basegfx::fround(fTmp), nNumber); } if( lHeight < 0.0 ) { const double fTmp(aRange.getHeight() / -lHeight); nNumber = std::min((sal_uInt16)basegfx::fround(fTmp), nNumber); } for( sal_uInt16 i(1); i <= nNumber; i++ ) { if( pProgress ) { pProgress->SetState( i ); } aRange = mpView->getMarkedObjectSnapRange(); if( ( 1 == i ) && bColor ) { SfxItemSet aNewSet( mpViewShell->GetPool(), XATTR_FILLSTYLE, XATTR_FILLCOLOR, 0L ); aNewSet.Put( XFillStyleItem( XFILL_SOLID ) ); aNewSet.Put( XFillColorItem( String(), aStartColor ) ); mpView->SetAttributes( aNewSet ); } // make a copy of selected objects mpView->CopyMarkedObj(); // get newly selected objects const SdrObjectVector aSelectedSdrObjects(mpView->getSelectedSdrObjectVectorFromSdrMarkView()); sal_uInt32 j; // set protection flags at marked copies to null for(j = 0; j < aSelectedSdrObjects.size(); j++) { SdrObject* pObj = aSelectedSdrObjects[j]; pObj->SetMoveProtect(false); pObj->SetResizeProtect(false); } if( mpView->IsResizeAllowed() ) { const basegfx::B2DVector aScale( (aRange.getWidth() + lWidth) / (basegfx::fTools::equalZero(aRange.getWidth()) ? 1.0 : aRange.getWidth()), (aRange.getHeight() + lHeight) / (basegfx::fTools::equalZero(aRange.getHeight()) ? 1.0 : aRange.getHeight())); mpView->ResizeMarkedObj(aRange.getMinimum(), aScale); } if( mpView->IsRotateAllowed() ) { mpView->RotateMarkedObj(aRange.getCenter(), lAngle); } if( mpView->IsMoveAllowed() ) { mpView->MoveMarkedObj(basegfx::B2DVector(lSizeX, lSizeY)); } // set protection flags at marked copies to original values if(aInitialSelection.size() == aSelectedSdrObjects.size()) { for(j = 0; j < aInitialSelection.size(); j++) { SdrObject* pSrcObj = aInitialSelection[j]; SdrObject* pDstObj = aSelectedSdrObjects[j]; if(pSrcObj->GetObjInventor() == pDstObj->GetObjInventor() && pSrcObj->GetObjIdentifier() == pDstObj->GetObjIdentifier()) { pDstObj->SetMoveProtect( pSrcObj->IsMoveProtect() ); pDstObj->SetResizeProtect( pSrcObj->IsResizeProtect() ); } } } if( bColor ) { // Koennte man sicher noch optimieren, wuerde aber u.U. // zu Rundungsfehlern fuehren sal_uInt8 nRed = aStartColor.GetRed() + (sal_uInt8) ( ( (long) aEndColor.GetRed() - (long) aStartColor.GetRed() ) * (long) i / (long) nNumber ); sal_uInt8 nGreen = aStartColor.GetGreen() + (sal_uInt8) ( ( (long) aEndColor.GetGreen() - (long) aStartColor.GetGreen() ) * (long) i / (long) nNumber ); sal_uInt8 nBlue = aStartColor.GetBlue() + (sal_uInt8) ( ( (long) aEndColor.GetBlue() - (long) aStartColor.GetBlue() ) * (long) i / (long) nNumber ); Color aNewColor( nRed, nGreen, nBlue ); SfxItemSet aNewSet( mpViewShell->GetPool(), XATTR_FILLSTYLE, XATTR_FILLCOLOR, 0L ); aNewSet.Put( XFillStyleItem( XFILL_SOLID ) ); aNewSet.Put( XFillColorItem( String(), aNewColor ) ); mpView->SetAttributes( aNewSet ); } } if ( pProgress ) { delete pProgress; } if ( bWaiting ) { mpDocSh->SetWaitCursor( false ); } // adapt handles mpView->RecreateAllMarkHandles(); mpView->EndUndo(); } } } // end of namespace