xref: /AOO41X/main/sd/source/ui/func/fucopy.cxx (revision 3ce09a58b0d6873449cda31e55c66dba2dbc8f7f)
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 
FuCopy(ViewShell * pViewSh,::sd::Window * pWin,::sd::View * pView,SdDrawDocument * pDoc,SfxRequest & rReq)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 
Create(ViewShell * pViewSh,::sd::Window * pWin,::sd::View * pView,SdDrawDocument * pDoc,SfxRequest & rReq)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 
DoExecute(SfxRequest & rReq)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->GetColorTableFromSdrModel(), 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