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