xref: /trunk/main/sd/source/ui/view/drviews9.cxx (revision 9afceb33)
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 #include "DrawViewShell.hxx"
28 #include <vcl/wrkwin.hxx>
29 #include <svx/xgrad.hxx>
30 #include <svx/svdpagv.hxx>
31 #include <svx/xlnwtit.hxx>
32 #include <svx/xlndsit.hxx>
33 #include <svx/xflhtit.hxx>
34 #include <svx/xflgrit.hxx>
35 #include <svx/xlnclit.hxx>
36 #include <svx/xflclit.hxx>
37 #include <svx/xlnwtit.hxx>
38 #include <sfx2/bindings.hxx>
39 
40 #ifndef _SFX_DISPATCH_HXX //autogen
41 #include <sfx2/dispatch.hxx>
42 #endif
43 #include <svl/intitem.hxx>
44 #include <sfx2/app.hxx>
45 #include <sfx2/request.hxx>
46 #include <svl/stritem.hxx>
47 #ifndef _SVXIDS_HXX
48 #include <svx/svxids.hrc>
49 #endif
50 #include <svx/xtable.hxx>
51 #include <svx/gallery.hxx>
52 #include <vcl/graph.hxx>
53 #include <svx/svdograf.hxx>
54 #include <svx/svdoole2.hxx>
55 #include <sot/storage.hxx>
56 #include <svl/whiter.hxx>
57 #include <basic/sbstar.hxx>
58 
59 #include <sfx2/viewfrm.hxx>
60 
61 
62 #include "app.hrc"
63 #include "strings.hrc"
64 #include "Window.hxx"
65 #include "drawdoc.hxx"
66 #include "drawview.hxx"
67 #include "DrawDocShell.hxx"
68 #include "sdresid.hxx"
69 #include "fupoor.hxx"
70 
71 #include <svx/galleryitem.hxx>
72 #include <com/sun/star/gallery/GalleryItemType.hpp>
73 
74 namespace sd {
75 
76 #ifndef SO2_DECL_SVINPLACEOBJECT_DEFINED
77 #define SO2_DECL_SVINPLACEOBJECT_DEFINED
78 SO2_DECL_REF(SvInPlaceObject)
79 #endif
80 #ifndef SO2_DECL_SVSTORAGE_DEFINED
81 #define SO2_DECL_SVSTORAGE_DEFINED
SO2_DECL_REF(SvStorage)82 SO2_DECL_REF(SvStorage)
83 #endif
84 
85 
86 /*************************************************************************
87 |*
88 |* SfxRequests fuer Gallery bearbeiten
89 |*
90 \************************************************************************/
91 
92 void DrawViewShell::ExecGallery(SfxRequest& rReq)
93 {
94 	// waehrend einer Diashow wird nichts ausgefuehrt!
95 	if(HasCurrentFunction(SID_PRESENTATION))
96 		return;
97 
98 	const SfxItemSet* pArgs = rReq.GetArgs();
99 
100     SFX_ITEMSET_ARG( pArgs, pGalleryItem, SvxGalleryItem, SID_GALLERY_FORMATS, sal_False );
101     if ( !pGalleryItem )
102         return;
103 
104     GetDocSh()->SetWaitCursor( sal_True );
105 
106     sal_Int8 nType( pGalleryItem->GetType() );
107     // Graphik einfuegen
108     if (nType == com::sun::star::gallery::GalleryItemType::GRAPHIC)
109     {
110         Graphic aGraphic( pGalleryItem->GetGraphic() );
111 
112         // Ggf. Groesse reduzieren
113         Window aWindow (GetActiveWindow());
114         aWindow.SetMapMode(aGraphic.GetPrefMapMode());
115         Size aSizePix = aWindow.LogicToPixel(aGraphic.GetPrefSize());
116         aWindow.SetMapMode( MapMode(MAP_100TH_MM) );
117         Size aSize = aWindow.PixelToLogic(aSizePix);
118 
119         // Groesse ggf. auf Seitengroesse begrenzen
120         SdrPage* pPage = mpDrawView->GetSdrPageView()->GetPage();
121         Size aPageSize = pPage->GetSize();
122         aPageSize.Width() -= pPage->GetLftBorder() + pPage->GetRgtBorder();
123         aPageSize.Height() -= pPage->GetUppBorder() + pPage->GetLwrBorder();
124 
125 
126         // Falls Grafik zu gross, wird die Grafik
127         // in die Seite eingepasst
128         if ( ( ( aSize.Height() > aPageSize.Height() ) || ( aSize.Width()	> aPageSize.Width() ) ) &&
129             aSize.Height() && aPageSize.Height() )
130         {
131             float fGrfWH =	(float)aSize.Width() /
132                             (float)aSize.Height();
133             float fWinWH =	(float)aPageSize.Width() /
134                             (float)aPageSize.Height();
135 
136             // Grafik an Pagesize anpassen (skaliert)
137             if ((fGrfWH != 0.F) && (fGrfWH < fWinWH))
138             {
139                 aSize.Width() = (long)(aPageSize.Height() * fGrfWH);
140                 aSize.Height()= aPageSize.Height();
141             }
142             else
143             {
144                 aSize.Width() = aPageSize.Width();
145                 aSize.Height()= (long)(aPageSize.Width() / fGrfWH);
146             }
147         }
148 
149 
150         // Ausgaberechteck fuer Grafik setzen
151         Point aPnt ((aPageSize.Width()	- aSize.Width())  / 2,
152                     (aPageSize.Height() - aSize.Height()) / 2);
153         aPnt += Point(pPage->GetLftBorder(), pPage->GetUppBorder());
154         Rectangle aRect (aPnt, aSize);
155 
156         SdrGrafObj* pGrafObj = NULL;
157 
158         sal_Bool bInsertNewObject = sal_True;
159 
160         if ( mpDrawView->AreObjectsMarked() )
161         {
162             /******************************************************
163             * Ist ein leeres Graphik-Objekt vorhanden?
164             ******************************************************/
165             const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
166 
167             if (rMarkList.GetMarkCount() == 1)
168             {
169                 SdrMark* pMark = rMarkList.GetMark(0);
170                 SdrObject* pObj = pMark->GetMarkedSdrObj();
171 
172                 if (pObj->GetObjInventor() == SdrInventor && pObj->GetObjIdentifier() == OBJ_GRAF)
173                 {
174                     pGrafObj = (SdrGrafObj*) pObj;
175 
176                     if( pGrafObj->IsEmptyPresObj() )
177                     {
178                         /******************************************
179                         * Das leere Graphik-Objekt bekommt eine neue
180                         * Graphik
181                         ******************************************/
182                         bInsertNewObject = sal_False;
183 
184                         SdrGrafObj* pNewGrafObj = (SdrGrafObj*) pGrafObj->Clone();
185                         pNewGrafObj->SetEmptyPresObj(sal_False);
186                         pNewGrafObj->SetOutlinerParaObject(NULL);
187                         pNewGrafObj->SetGraphic(aGraphic);
188 
189                         String aStr(mpDrawView->GetDescriptionOfMarkedObjects());
190                         aStr += sal_Unicode(' ');
191                         aStr += String(SdResId(STR_UNDO_REPLACE));
192                         mpDrawView->BegUndo(aStr);
193                         SdrPageView* pPV = mpDrawView->GetSdrPageView();
194                         mpDrawView->ReplaceObjectAtView(pGrafObj, *pPV, pNewGrafObj);
195                         mpDrawView->EndUndo();
196                     }
197                 }
198             }
199         }
200 
201 
202         if( bInsertNewObject )
203         {
204             pGrafObj = new SdrGrafObj(aGraphic, aRect);
205             SdrPageView* pPV = mpDrawView->GetSdrPageView();
206             mpDrawView->InsertObjectAtView(pGrafObj, *pPV, SDRINSERT_SETDEFLAYER);
207         }
208 
209         // Soll nur ein Link benutzt werden?
210         if( pGrafObj && pGalleryItem->IsLink() )
211             pGrafObj->SetGraphicLink( pGalleryItem->GetURL(), pGalleryItem->GetFilterName() );
212     }
213     // insert sound
214     else if( nType == com::sun::star::gallery::GalleryItemType::MEDIA )
215     {
216         const SfxStringItem aMediaURLItem( SID_INSERT_AVMEDIA, pGalleryItem->GetURL() );
217         GetViewFrame()->GetDispatcher()->Execute( SID_INSERT_AVMEDIA, SFX_CALLMODE_SYNCHRON, &aMediaURLItem, 0L );
218     }
219 
220     GetDocSh()->SetWaitCursor( sal_False );
221 }
222 
223 
224 /*************************************************************************
225 |*
226 |* Statuswerte fuer Gallery zurueckgeben
227 |*
228 \************************************************************************/
229 
GetGalleryState(SfxItemSet &)230 void DrawViewShell::GetGalleryState(SfxItemSet& )
231 {
232 }
233 
234 /*************************************************************************
235 |*
236 |* Makros fuer die Attributeinstellungen bearbeiten
237 |*
238 \************************************************************************/
239 
240 //
241 // die vorgehensweise fuer die attributaenderung ist praktisch ueberall identisch
242 // 1. bisherige attribute auslesen
243 // 2. parameter aus dem basic-set auslesen
244 // 3. gewaehltes item aus dem attribut-set loeschen
245 // 4. neues attribut-item erzeugen
246 // 5. item in den set eintragen
247 //
AttrExec(SfxRequest & rReq)248 void DrawViewShell::AttrExec (SfxRequest &rReq)
249 {
250 	// waehrend einer Diashow wird nichts ausgefuehrt!
251 	if(HasCurrentFunction(SID_PRESENTATION))
252 		return;
253 
254 	CheckLineTo (rReq);
255 
256 	SfxBindings&	rBindings = GetViewFrame()->GetBindings();
257 	SfxItemSet*		pAttr = new SfxItemSet ( GetDoc()->GetPool() );
258 
259 	GetView()->GetAttributes( *pAttr );
260 	const SfxItemSet* pArgs = rReq.GetArgs();
261 
262 	switch (rReq.GetSlot ())
263 	{
264 		// neuen fuellstil setzen
265 		case SID_SETFILLSTYLE :
266 			if (pArgs)
267 				if (pArgs->Count () == 1)
268 				{
269 					SFX_REQUEST_ARG (rReq, pFillStyle, SfxUInt32Item, ID_VAL_STYLE, sal_False);
270 					if (CHECK_RANGE (XFILL_NONE, (sal_Int32)pFillStyle->GetValue (), XFILL_BITMAP))
271 					{
272 						pAttr->ClearItem (XATTR_FILLSTYLE);
273 						pAttr->Put (XFillStyleItem ((XFillStyle) pFillStyle->GetValue ()), XATTR_FILLSTYLE);
274 						rBindings.Invalidate (SID_ATTR_FILL_STYLE);
275 					}
276 					else StarBASIC::FatalError (SbERR_BAD_PROP_VALUE);
277 
278 					break;
279 				}
280 
281 			StarBASIC::FatalError (SbERR_WRONG_ARGS);
282 			break;
283 
284 		// linienstil neu bestimmen
285 		case SID_SETLINESTYLE :
286 			if (pArgs)
287 				if (pArgs->Count () == 1)
288 				{
289 					SFX_REQUEST_ARG (rReq, pLineStyle, SfxUInt32Item, ID_VAL_STYLE, sal_False);
290 					if (CHECK_RANGE (XLINE_NONE, (sal_Int32)pLineStyle->GetValue (), XLINE_DASH))
291 					{
292 						pAttr->ClearItem (XATTR_LINESTYLE);
293 						pAttr->Put (XLineStyleItem ((XLineStyle) pLineStyle->GetValue ()), XATTR_LINESTYLE);
294 						rBindings.Invalidate (SID_ATTR_LINE_STYLE);
295 					}
296 					else StarBASIC::FatalError (SbERR_BAD_PROP_VALUE);
297 
298 					break;
299 				}
300 
301 			StarBASIC::FatalError (SbERR_WRONG_ARGS);
302 			break;
303 
304 		// linienbreite setzen
305 		case SID_SETLINEWIDTH :
306 			if (pArgs)
307 				if (pArgs->Count () == 1)
308 				{
309 					SFX_REQUEST_ARG (rReq, pLineWidth, SfxUInt32Item, ID_VAL_WIDTH, sal_False);
310 					pAttr->ClearItem (XATTR_LINEWIDTH);
311 					pAttr->Put (XLineWidthItem (pLineWidth->GetValue ()), XATTR_LINEWIDTH);
312 					rBindings.Invalidate (SID_ATTR_LINE_WIDTH);
313 					break;
314 				}
315 
316 			StarBASIC::FatalError (SbERR_WRONG_ARGS);
317 			break;
318 
319 		case SID_SETFILLCOLOR :
320 			if (pArgs)
321 				if (pArgs->Count () == 3)
322 				{
323 					SFX_REQUEST_ARG (rReq, pRed, SfxUInt32Item, ID_VAL_RED, sal_False);
324 					SFX_REQUEST_ARG (rReq, pGreen, SfxUInt32Item, ID_VAL_GREEN, sal_False);
325 					SFX_REQUEST_ARG (rReq, pBlue, SfxUInt32Item, ID_VAL_BLUE, sal_False);
326 
327 					pAttr->ClearItem (XATTR_FILLCOLOR);
328 					pAttr->ClearItem (XATTR_FILLSTYLE);
329 					pAttr->Put (XFillColorItem (-1, Color ((sal_uInt8) pRed->GetValue (),
330                                                            (sal_uInt8) pGreen->GetValue (),
331 														   (sal_uInt8) pBlue->GetValue ())),
332 								XATTR_FILLCOLOR);
333 					pAttr->Put (XFillStyleItem (XFILL_SOLID), XATTR_FILLSTYLE);
334 					rBindings.Invalidate (SID_ATTR_FILL_COLOR);
335 					rBindings.Invalidate (SID_ATTR_FILL_STYLE);
336 					break;
337 				}
338 
339 			StarBASIC::FatalError (SbERR_WRONG_ARGS);
340 			break;
341 
342 		case SID_SETLINECOLOR :
343 			if (pArgs)
344 				if (pArgs->Count () == 3)
345 				{
346 					SFX_REQUEST_ARG (rReq, pRed, SfxUInt32Item, ID_VAL_RED, sal_False);
347 					SFX_REQUEST_ARG (rReq, pGreen, SfxUInt32Item, ID_VAL_GREEN, sal_False);
348 					SFX_REQUEST_ARG (rReq, pBlue, SfxUInt32Item, ID_VAL_BLUE, sal_False);
349 
350 					pAttr->ClearItem (XATTR_LINECOLOR);
351 					pAttr->Put (XLineColorItem (-1, Color ((sal_uInt8) pRed->GetValue (),
352                                                            (sal_uInt8) pGreen->GetValue (),
353 														   (sal_uInt8) pBlue->GetValue ())),
354 								XATTR_LINECOLOR);
355 					rBindings.Invalidate (SID_ATTR_LINE_COLOR);
356 					break;
357 				}
358 
359 			StarBASIC::FatalError (SbERR_WRONG_ARGS);
360 			break;
361 
362 		case SID_SETGRADSTARTCOLOR :
363 		case SID_SETGRADENDCOLOR :
364 			if (pArgs)
365 				if (pArgs->Count () == 4)
366 				{
367 					SFX_REQUEST_ARG (rReq, pName, SfxStringItem, ID_VAL_INDEX, sal_False);
368 					SFX_REQUEST_ARG (rReq, pRed, SfxUInt32Item, ID_VAL_RED, sal_False);
369 					SFX_REQUEST_ARG (rReq, pGreen, SfxUInt32Item, ID_VAL_GREEN, sal_False);
370 					SFX_REQUEST_ARG (rReq, pBlue, SfxUInt32Item, ID_VAL_BLUE, sal_False);
371 
372 					XGradientListSharedPtr aGradientList = GetDoc()->GetGradientListFromSdrModel();
373 					long		  nCounts		 = aGradientList->Count ();
374 					Color		  aColor ((sal_uInt8) pRed->GetValue (),
375                                           (sal_uInt8) pGreen->GetValue (),
376 										  (sal_uInt8) pBlue->GetValue ());
377 					long i;
378 
379 					pAttr->ClearItem (XATTR_FILLGRADIENT);
380 					pAttr->ClearItem (XATTR_FILLSTYLE);
381 
382 					for ( i = 0; i < nCounts; i ++)
383 					{
384 						XGradientEntry *pEntry = aGradientList->GetGradient (i);
385 
386 						if (pEntry->GetName () == pName->GetValue ())
387 						{
388 							XGradient aGradient(pEntry->GetGradient());
389 
390 							if (rReq.GetSlot () == SID_SETGRADSTARTCOLOR) aGradient.SetStartColor (aColor);
391 							else aGradient.SetEndColor (aColor);
392 
393 							pAttr->Put (XFillStyleItem (XFILL_GRADIENT), XATTR_FILLSTYLE);
394 							pAttr->Put (XFillGradientItem (pName->GetValue (), aGradient), XATTR_FILLGRADIENT);
395 							break;
396 						}
397 					}
398 
399 					if (i >= nCounts)
400 					{
401 						Color aBlack (0, 0, 0);
402 						XGradient aGradient ((rReq.GetSlot () == SID_SETGRADSTARTCOLOR)
403 												 ? aColor
404 												 : aBlack,
405 											 (rReq.GetSlot () == SID_SETGRADENDCOLOR)
406 												 ? aColor
407 												 : aBlack);
408 
409 						GetDoc()->GetGradientListFromSdrModel()->Insert (new XGradientEntry (aGradient, pName->GetValue ()));
410 
411 						pAttr->Put (XFillStyleItem (XFILL_GRADIENT), XATTR_FILLSTYLE);
412 						pAttr->Put (XFillGradientItem (pName->GetValue (), aGradient), XATTR_FILLGRADIENT);
413 					}
414 
415 					rBindings.Invalidate (SID_ATTR_FILL_STYLE);
416 					rBindings.Invalidate (SID_ATTR_FILL_GRADIENT);
417 					break;
418 				}
419 
420 			StarBASIC::FatalError (SbERR_WRONG_ARGS);
421 			break;
422 
423 		case SID_SETHATCHCOLOR :
424 			if (pArgs)
425 				if (pArgs->Count () == 4)
426 				{
427 					SFX_REQUEST_ARG (rReq, pName, SfxStringItem, ID_VAL_INDEX, sal_False);
428 					SFX_REQUEST_ARG (rReq, pRed, SfxUInt32Item, ID_VAL_RED, sal_False);
429 					SFX_REQUEST_ARG (rReq, pGreen, SfxUInt32Item, ID_VAL_GREEN, sal_False);
430 					SFX_REQUEST_ARG (rReq, pBlue, SfxUInt32Item, ID_VAL_BLUE, sal_False);
431 
432 					XHatchListSharedPtr aHatchList = GetDoc()->GetHatchListFromSdrModel();
433 					long	   nCounts	   = aHatchList.get() ? aHatchList->Count() : 0;
434 					Color	   aColor ((sal_uInt8) pRed->GetValue (),
435                                        (sal_uInt8) pGreen->GetValue (),
436 									   (sal_uInt8) pBlue->GetValue ());
437 					long i;
438 
439 					pAttr->ClearItem (XATTR_FILLHATCH);
440 					pAttr->ClearItem (XATTR_FILLSTYLE);
441 
442 					for ( i = 0; i < nCounts; i ++)
443 					{
444 						XHatchEntry *pEntry = aHatchList->GetHatch (i);
445 
446 						if (pEntry->GetName () == pName->GetValue ())
447 						{
448 							XHatch aHatch(pEntry->GetHatch());
449 
450 							aHatch.SetColor (aColor);
451 
452 							pAttr->Put (XFillStyleItem (XFILL_HATCH), XATTR_FILLSTYLE);
453 							pAttr->Put (XFillHatchItem (pName->GetValue (), aHatch), XATTR_FILLHATCH);
454 							break;
455 						}
456 					}
457 
458 					if (i >= nCounts)
459 					{
460 						XHatch aHatch (aColor);
461 
462 						GetDoc()->GetHatchListFromSdrModel()->Insert (new XHatchEntry (aHatch, pName->GetValue ()));
463 
464 						pAttr->Put (XFillStyleItem (XFILL_HATCH), XATTR_FILLSTYLE);
465 						pAttr->Put (XFillHatchItem (pName->GetValue (), aHatch), XATTR_FILLHATCH);
466 					}
467 
468 					rBindings.Invalidate (SID_ATTR_FILL_HATCH);
469 					rBindings.Invalidate (SID_ATTR_FILL_STYLE);
470 					break;
471 				}
472 
473 			StarBASIC::FatalError (SbERR_WRONG_ARGS);
474 			break;
475 
476 		// einstellungen fuer liniendash
477 		case SID_DASH :
478 			if (pArgs)
479 				if (pArgs->Count () == 7)
480 				{
481 					SFX_REQUEST_ARG (rReq, pName, SfxStringItem, ID_VAL_INDEX, sal_False);
482 					SFX_REQUEST_ARG (rReq, pStyle, SfxUInt32Item, ID_VAL_STYLE, sal_False);
483 					SFX_REQUEST_ARG (rReq, pDots, SfxUInt32Item, ID_VAL_DOTS, sal_False);
484 					SFX_REQUEST_ARG (rReq, pDotLen, SfxUInt32Item, ID_VAL_DOTLEN, sal_False);
485 					SFX_REQUEST_ARG (rReq, pDashes, SfxUInt32Item, ID_VAL_DASHES, sal_False);
486 					SFX_REQUEST_ARG (rReq, pDashLen, SfxUInt32Item, ID_VAL_DASHLEN, sal_False);
487 					SFX_REQUEST_ARG (rReq, pDistance, SfxUInt32Item, ID_VAL_DISTANCE, sal_False);
488 
489 					if (CHECK_RANGE (XDASH_RECT, (sal_Int32)pStyle->GetValue (), XDASH_ROUNDRELATIVE))
490 					{
491 						XDash aNewDash ((XDashStyle) pStyle->GetValue (), (short) pDots->GetValue (), pDotLen->GetValue (),
492 										(short) pDashes->GetValue (), pDashLen->GetValue (), pDistance->GetValue ());
493 
494 						pAttr->ClearItem (XATTR_LINEDASH);
495 						pAttr->ClearItem (XATTR_LINESTYLE);
496 
497 						XDashListSharedPtr aDashList = GetDoc()->GetDashListFromSdrModel();
498 						long	   nCounts	  = aDashList.get() ? aDashList->Count() : 0;
499 						XDashEntry *pEntry	  = new XDashEntry (aNewDash, pName->GetValue ());
500 						long i;
501 
502 						for ( i = 0; i < nCounts; i++ )
503 							if (aDashList->GetDash (i)->GetName () == pName->GetValue ())
504 								break;
505 
506 						if (i < nCounts)
507 							aDashList->Replace (pEntry, i);
508 						else
509 							aDashList->Insert (pEntry);
510 
511 						pAttr->Put (XLineDashItem (pName->GetValue (), aNewDash), XATTR_LINEDASH);
512 						pAttr->Put (XLineStyleItem (XLINE_DASH), XATTR_LINESTYLE);
513 						rBindings.Invalidate (SID_ATTR_LINE_DASH);
514 						rBindings.Invalidate (SID_ATTR_FILL_STYLE);
515 					}
516 					else StarBASIC::FatalError (SbERR_BAD_PROP_VALUE);
517 
518 					break;
519 				}
520 
521 			StarBASIC::FatalError (SbERR_WRONG_ARGS);
522 			break;
523 
524 		// einstellungen fuer farbverlauf
525 		case SID_GRADIENT :
526 			if (pArgs)
527 				if (pArgs->Count () == 8)
528 				{
529 					SFX_REQUEST_ARG (rReq, pName, SfxStringItem, ID_VAL_INDEX, sal_False);
530 					SFX_REQUEST_ARG (rReq, pStyle, SfxUInt32Item, ID_VAL_STYLE, sal_False);
531 					SFX_REQUEST_ARG (rReq, pAngle, SfxUInt32Item, ID_VAL_ANGLE, sal_False);
532 					SFX_REQUEST_ARG (rReq, pBorder, SfxUInt32Item, ID_VAL_BORDER, sal_False);
533 					SFX_REQUEST_ARG (rReq, pCenterX, SfxUInt32Item, ID_VAL_CENTER_X, sal_False);
534 					SFX_REQUEST_ARG (rReq, pCenterY, SfxUInt32Item, ID_VAL_CENTER_Y, sal_False);
535 					SFX_REQUEST_ARG (rReq, pStart, SfxUInt32Item, ID_VAL_STARTINTENS, sal_False);
536 					SFX_REQUEST_ARG (rReq, pEnd, SfxUInt32Item, ID_VAL_ENDINTENS, sal_False);
537 
538 					if (CHECK_RANGE (XGRAD_LINEAR, (sal_Int32)pStyle->GetValue (), XGRAD_RECT) &&
539 						CHECK_RANGE (0, (sal_Int32)pAngle->GetValue (), 360) &&
540 						CHECK_RANGE (0, (sal_Int32)pBorder->GetValue (), 100) &&
541 						CHECK_RANGE (0, (sal_Int32)pCenterX->GetValue (), 100) &&
542 						CHECK_RANGE (0, (sal_Int32)pCenterY->GetValue (), 100) &&
543 						CHECK_RANGE (0, (sal_Int32)pStart->GetValue (), 100) &&
544 						CHECK_RANGE (0, (sal_Int32)pEnd->GetValue (), 100))
545 					{
546 						pAttr->ClearItem (XATTR_FILLGRADIENT);
547 						pAttr->ClearItem (XATTR_FILLSTYLE);
548 
549 						XGradientListSharedPtr aGradientList = GetDoc()->GetGradientListFromSdrModel();
550 						long		   nCounts		  = aGradientList->Count ();
551 						long i;
552 
553 						for ( i = 0; i < nCounts; i++ )
554 						{
555 							XGradientEntry *pEntry = aGradientList->GetGradient (i);
556 
557 							if (pEntry->GetName () == pName->GetValue ())
558 							{
559 								XGradient aGradient(pEntry->GetGradient());
560 
561 								aGradient.SetGradientStyle ((XGradientStyle) pStyle->GetValue ());
562 								aGradient.SetAngle (pAngle->GetValue () * 10);
563 								aGradient.SetBorder ((short) pBorder->GetValue ());
564 								aGradient.SetXOffset ((short) pCenterX->GetValue ());
565 								aGradient.SetYOffset ((short) pCenterY->GetValue ());
566 								aGradient.SetStartIntens ((short) pStart->GetValue ());
567 								aGradient.SetEndIntens ((short) pEnd->GetValue ());
568 
569 								pAttr->Put (XFillStyleItem (XFILL_GRADIENT), XATTR_FILLSTYLE);
570 								pAttr->Put (XFillGradientItem (pName->GetValue (), aGradient), XATTR_FILLGRADIENT);
571 								break;
572 							}
573 						}
574 
575 						if (i >= nCounts)
576 						{
577 							Color aBlack (0, 0, 0);
578 							XGradient aGradient (aBlack, aBlack, (XGradientStyle) pStyle->GetValue (),
579 												 pAngle->GetValue () * 10, (short) pCenterX->GetValue (),
580 												 (short) pCenterY->GetValue (), (short) pBorder->GetValue (),
581 												 (short) pStart->GetValue (), (short) pEnd->GetValue ());
582 
583 							aGradientList->Insert (new XGradientEntry (aGradient, pName->GetValue ()));
584 							pAttr->Put (XFillStyleItem (XFILL_GRADIENT), XATTR_FILLSTYLE);
585 							pAttr->Put (XFillGradientItem (pName->GetValue (), aGradient), XATTR_FILLGRADIENT);
586 						}
587 
588 						rBindings.Invalidate (SID_ATTR_FILL_GRADIENT);
589 						rBindings.Invalidate (SID_ATTR_FILL_STYLE);
590 					}
591 					else StarBASIC::FatalError (SbERR_BAD_PROP_VALUE);
592 
593 					break;
594 				}
595 
596 			StarBASIC::FatalError (SbERR_WRONG_ARGS);
597 			break;
598 
599 		// einstellungen fuer schraffur
600 		case SID_HATCH :
601 			if (pArgs)
602 				if (pArgs->Count () == 4)
603 				{
604 					SFX_REQUEST_ARG (rReq, pName, SfxStringItem, ID_VAL_INDEX, sal_False);
605 					SFX_REQUEST_ARG (rReq, pStyle, SfxUInt32Item, ID_VAL_STYLE, sal_False);
606 					SFX_REQUEST_ARG (rReq, pDistance, SfxUInt32Item, ID_VAL_DISTANCE, sal_False);
607 					SFX_REQUEST_ARG (rReq, pAngle, SfxUInt32Item, ID_VAL_ANGLE, sal_False);
608 
609 					if (CHECK_RANGE (XHATCH_SINGLE, (sal_Int32)pStyle->GetValue (), XHATCH_TRIPLE) &&
610 						CHECK_RANGE (0, (sal_Int32)pAngle->GetValue (), 360))
611 					{
612 						pAttr->ClearItem (XATTR_FILLHATCH);
613 						pAttr->ClearItem (XATTR_FILLSTYLE);
614 
615 						XHatchListSharedPtr aHatchList = GetDoc()->GetHatchListFromSdrModel();
616 						long	   nCounts	   = aHatchList.get() ? aHatchList->Count() : 0;
617 						long i;
618 
619 						for ( i = 0; i < nCounts; i++ )
620 						{
621 							XHatchEntry *pEntry = aHatchList->GetHatch (i);
622 
623 							if (pEntry->GetName () == pName->GetValue ())
624 							{
625 								XHatch aHatch(pEntry->GetHatch());
626 
627 								aHatch.SetHatchStyle ((XHatchStyle) pStyle->GetValue ());
628 								aHatch.SetDistance (pDistance->GetValue ());
629 								aHatch.SetAngle (pAngle->GetValue () * 10);
630 
631 								pAttr->Put (XFillStyleItem (XFILL_HATCH), XATTR_FILLSTYLE);
632 								pAttr->Put (XFillHatchItem (pName->GetValue (), aHatch), XATTR_FILLHATCH);
633 								break;
634 							}
635 						}
636 
637 						if (i >= nCounts)
638 						{
639 							Color  aBlack (0, 0, 0);
640 							XHatch aHatch (aBlack, (XHatchStyle) pStyle->GetValue (), pDistance->GetValue (),
641 										   pAngle->GetValue () * 10);
642 
643 							aHatchList->Insert (new XHatchEntry (aHatch, pName->GetValue ()));
644 							pAttr->Put (XFillStyleItem (XFILL_HATCH), XATTR_FILLSTYLE);
645 							pAttr->Put (XFillHatchItem (pName->GetValue (), aHatch), XATTR_FILLHATCH);
646 						}
647 
648 						rBindings.Invalidate (SID_ATTR_FILL_HATCH);
649 						rBindings.Invalidate (SID_ATTR_FILL_STYLE);
650 					}
651 					else StarBASIC::FatalError (SbERR_BAD_PROP_VALUE);
652 
653 					break;
654 				}
655 
656 			StarBASIC::FatalError (SbERR_WRONG_ARGS);
657 			break;
658 
659 		case SID_SELECTGRADIENT :
660 			if (pArgs)
661 				if (pArgs->Count () == 1)
662 				{
663 					SFX_REQUEST_ARG (rReq, pName, SfxStringItem, ID_VAL_INDEX, sal_False);
664 
665 					XGradientListSharedPtr aGradientList = GetDoc()->GetGradientListFromSdrModel();
666 					long		   nCounts		  = aGradientList->Count ();
667 
668 					for (long i = 0;
669 							  i < nCounts;
670 							  i ++)
671 					{
672 						XGradientEntry *pEntry = aGradientList->GetGradient (i);
673 
674 						if (pEntry->GetName () == pName->GetValue ())
675 						{
676 							pAttr->ClearItem (XATTR_FILLGRADIENT);
677 							pAttr->ClearItem (XATTR_FILLSTYLE);
678 							pAttr->Put (XFillStyleItem (XFILL_GRADIENT), XATTR_FILLSTYLE);
679 							pAttr->Put (XFillGradientItem (pName->GetValue (), pEntry->GetGradient ()), XATTR_FILLGRADIENT);
680 
681 							rBindings.Invalidate (SID_ATTR_FILL_GRADIENT);
682 							rBindings.Invalidate (SID_ATTR_FILL_STYLE);
683 							break;
684 						}
685 					}
686 
687 					break;
688 				}
689 
690 			StarBASIC::FatalError (SbERR_WRONG_ARGS);
691 			break;
692 
693 		case SID_SELECTHATCH :
694 			if (pArgs)
695 				if (pArgs->Count () == 1)
696 				{
697 					SFX_REQUEST_ARG (rReq, pName, SfxStringItem, ID_VAL_INDEX, sal_False);
698 
699 					XHatchListSharedPtr aHatchList = GetDoc()->GetHatchListFromSdrModel();
700 					long	   nCounts	   = aHatchList.get() ? aHatchList->Count() : 0;
701 
702 					for (long i = 0;
703 							  i < nCounts;
704 							  i ++)
705 					{
706 						XHatchEntry *pEntry = aHatchList->GetHatch (i);
707 
708 						if (pEntry->GetName () == pName->GetValue ())
709 						{
710 							pAttr->ClearItem (XATTR_FILLHATCH);
711 							pAttr->ClearItem (XATTR_FILLSTYLE);
712 							pAttr->Put (XFillStyleItem (XFILL_HATCH), XATTR_FILLSTYLE);
713 							pAttr->Put (XFillHatchItem (pName->GetValue (), pEntry->GetHatch ()), XATTR_FILLHATCH);
714 
715 							rBindings.Invalidate (SID_ATTR_FILL_HATCH);
716 							rBindings.Invalidate (SID_ATTR_FILL_STYLE);
717 							break;
718 						}
719 					}
720 
721 					break;
722 				}
723 
724 			StarBASIC::FatalError (SbERR_WRONG_ARGS);
725 			break;
726 
727 		case SID_UNSELECT :
728 			mpDrawView->UnmarkAll ();
729 			break;
730 
731 		case SID_GETRED :
732 			if (pArgs)
733 				if (pArgs->Count () == 1)
734 				{
735 					break;
736 				}
737 
738 			StarBASIC::FatalError (SbERR_WRONG_ARGS);
739 			break;
740 
741 /*		  case SID_SETFONTFAMILYNAME :
742 		case SID_SETFONTSTYLENAME :
743 		case SID_SETFONTFAMILY :
744 		case SID_SETFONTPITCH :
745 		case SID_SETFONTCHARSET :
746 		case SID_SETFONTPOSTURE :
747 		case SID_SETFONTWEIGHT :
748 		case SID_SETFONTUNDERLINE :
749 		case SID_SETFONTCROSSEDOUT :
750 		case SID_SETFONTSHADOWED :
751 		case SID_SETFONTCONTOUR :
752 		case SID_SETFONTCOLOR :
753 		case SID_SETFONTLANGUAGE :
754 		case SID_SETFONTWORDLINE :
755 		case SID_SETFONTCASEMAP :
756 		case SID_SETFONTESCAPE :
757 		case SID_SETFONTKERNING :
758 			break;*/
759 
760 		default :
761 			;
762 	}
763 
764 	mpDrawView->SetAttributes (*(const SfxItemSet *) pAttr);
765 	rReq.Ignore ();
766 	delete pAttr;
767 }
768 
769 /*************************************************************************
770 |*
771 |* Makros fuer die Attributeinstellungen bearbeiten
772 |*
773 \************************************************************************/
774 
AttrState(SfxItemSet & rSet)775 void DrawViewShell::AttrState (SfxItemSet& rSet)
776 {
777 	SfxWhichIter	 aIter (rSet);
778 	sal_uInt16			 nWhich = aIter.FirstWhich ();
779 	SfxItemSet aAttr( GetDoc()->GetPool() );
780 	mpDrawView->GetAttributes( aAttr );
781 
782 	while (nWhich)
783 	{
784 		switch (nWhich)
785 		{
786 			case SID_GETFILLSTYLE :
787 			{
788 				const XFillStyleItem &rFillStyleItem = (const XFillStyleItem &) aAttr.Get (XATTR_FILLSTYLE);
789 
790 				rSet.Put (SfxUInt32Item (nWhich, (long) rFillStyleItem.GetValue ()));
791 				break;
792 			}
793 
794 			case SID_GETLINESTYLE :
795 			{
796 				const XLineStyleItem &rLineStyleItem = (const XLineStyleItem &) aAttr.Get (XATTR_LINESTYLE);
797 
798 				rSet.Put (SfxUInt32Item (nWhich, (long) rLineStyleItem.GetValue ()));
799 				break;
800 			}
801 
802 			case SID_GETLINEWIDTH :
803 			{
804 				const XLineWidthItem &rLineWidthItem = (const XLineWidthItem &) aAttr.Get (XATTR_LINEWIDTH);
805 
806 				rSet.Put (SfxUInt32Item (nWhich, (long) rLineWidthItem.GetValue ()));
807 				break;
808 			}
809 
810 			case SID_GETGREEN :
811 			case SID_GETRED :
812 			case SID_GETBLUE :
813 			{
814 				const SfxUInt32Item &rWhatKind = (const SfxUInt32Item &) rSet.Get (ID_VAL_WHATKIND);
815 				Color				aColor;
816 
817 				switch (rWhatKind.GetValue ())
818 				{
819 					case 1 :
820 					{
821 						const XLineColorItem &rLineColorItem = (const XLineColorItem &) aAttr.Get (XATTR_LINECOLOR);
822 
823 						aColor = rLineColorItem.GetColorValue ();
824 						break;
825 					}
826 
827 					case 2 :
828 					{
829 						const XFillColorItem &rFillColorItem = (const XFillColorItem &) aAttr.Get (XATTR_FILLCOLOR);
830 
831 						aColor = rFillColorItem.GetColorValue ();
832 						break;
833 					}
834 
835 					case 3 :
836 					case 4 :
837 					{
838 						const XFillGradientItem &rFillGradientItem = (const XFillGradientItem &) aAttr.Get (XATTR_FILLGRADIENT);
839 						const XGradient 		&rGradient		   = rFillGradientItem.GetGradientValue ();
840 
841 						aColor = (rWhatKind.GetValue () == 3)
842 									? rGradient.GetStartColor ()
843 									: rGradient.GetEndColor ();
844 						break;
845 					}
846 
847 					case 5:
848 					{
849 						const XFillHatchItem &rFillHatchItem = (const XFillHatchItem &) aAttr.Get (XATTR_FILLHATCH);
850 						const XHatch		 &rHatch		 = rFillHatchItem.GetHatchValue ();
851 
852 						aColor = rHatch.GetColor ();
853 						break;
854 					}
855 
856 					default :
857 						;
858 				}
859 
860 				rSet.Put (SfxUInt32Item (nWhich, (long) ((nWhich == SID_GETRED)
861 															 ? aColor.GetRed ()
862 															 : (nWhich == SID_GETGREEN)
863 																   ? aColor.GetGreen ()
864 																   : aColor.GetBlue ())));
865 				break;
866 			}
867 
868 			default :
869 				;
870 		}
871 
872 		nWhich = aIter.NextWhich ();
873 	}
874 }
875 
876 } // end of namespace sd
877