xref: /trunk/main/sc/source/ui/view/formatsh.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_sc.hxx"
30 
31 
32 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
33 #include <com/sun/star/beans/XPropertySet.hpp>
34 #include <com/sun/star/container/XNameAccess.hpp>
35 
36 //------------------------------------------------------------------
37 
38 //svdraw.hxx
39 #define _SDR_NOITEMS
40 #define _SDR_NOTOUCH
41 #define _SDR_NOTRANSFORM
42 #define _SI_NOSBXCONTROLS
43 #define _VCONT_HXX
44 #define _SI_NOOTHERFORMS
45 #define _VCTRLS_HXX
46 #define _SI_NOCONTROL
47 #define _SETBRW_HXX
48 #define _VCBRW_HXX
49 #define _SI_NOSBXCONTROLS
50 
51 //------------------------------------------------------------------
52 
53 #include "scitems.hxx"
54 #include <editeng/eeitem.hxx>
55 
56 #include <sfx2/app.hxx>
57 #include <sfx2/viewfrm.hxx>
58 #include <sfx2/objface.hxx>
59 #include <sfx2/request.hxx>
60 #include <svl/whiter.hxx>
61 #include <vcl/msgbox.hxx>
62 
63 #define _ZFORLIST_DECLARE_TABLE
64 #include <svl/stritem.hxx>
65 #include <svl/zformat.hxx>
66 #include <svl/languageoptions.hxx>
67 #include <editeng/boxitem.hxx>
68 #include <editeng/langitem.hxx>
69 #include <svx/numinf.hxx>
70 #include <sfx2/dispatch.hxx>
71 #include <sfx2/templdlg.hxx>
72 #include <sfx2/tplpitem.hxx>
73 #include <editeng/svxenum.hxx>
74 #include <svx/algitem.hxx>
75 #include <editeng/wghtitem.hxx>
76 #include <editeng/postitem.hxx>
77 #include <editeng/udlnitem.hxx>
78 #include <editeng/bolnitem.hxx>
79 #include <editeng/colritem.hxx>
80 #include <editeng/brshitem.hxx>
81 #include <editeng/frmdiritem.hxx>
82 #include <editeng/scripttypeitem.hxx>
83 #include <svtools/colorcfg.hxx>
84 #include <editeng/shaditem.hxx>
85 
86 #include "formatsh.hxx"
87 #include "sc.hrc"
88 #include "globstr.hrc"
89 #include "docsh.hxx"
90 #include "patattr.hxx"
91 #include "scmod.hxx"
92 //CHINA001 #include "styledlg.hxx"
93 #include "attrdlg.hrc"
94 #include "stlpool.hxx"
95 #include "stlsheet.hxx"
96 #include "printfun.hxx"
97 #include "docpool.hxx"
98 #include "scresid.hxx"
99 #include "tabvwsh.hxx"
100 #include "undostyl.hxx"
101 
102 
103 #define ScFormatShell
104 #define TableFont
105 #define FormatForSelection
106 #include "scslots.hxx"
107 
108 #include "scabstdlg.hxx" //CHINA001
109 
110 namespace {
111 
112 SvxCellHorJustify lclConvertSlotToHAlign( sal_uInt16 nSlot )
113 {
114     SvxCellHorJustify eHJustify = SVX_HOR_JUSTIFY_STANDARD;
115     switch( nSlot )
116     {
117         case SID_ALIGN_ANY_HDEFAULT:    eHJustify = SVX_HOR_JUSTIFY_STANDARD;   break;
118         case SID_ALIGN_ANY_LEFT:        eHJustify = SVX_HOR_JUSTIFY_LEFT;       break;
119         case SID_ALIGN_ANY_HCENTER:     eHJustify = SVX_HOR_JUSTIFY_CENTER;     break;
120         case SID_ALIGN_ANY_RIGHT:       eHJustify = SVX_HOR_JUSTIFY_RIGHT;      break;
121         case SID_ALIGN_ANY_JUSTIFIED:   eHJustify = SVX_HOR_JUSTIFY_BLOCK;      break;
122         default:    DBG_ERRORFILE( "lclConvertSlotToHAlign - invalid slot" );
123     }
124     return eHJustify;
125 }
126 
127 SvxCellVerJustify lclConvertSlotToVAlign( sal_uInt16 nSlot )
128 {
129     SvxCellVerJustify eVJustify = SVX_VER_JUSTIFY_STANDARD;
130     switch( nSlot )
131     {
132         case SID_ALIGN_ANY_VDEFAULT:    eVJustify = SVX_VER_JUSTIFY_STANDARD;   break;
133         case SID_ALIGN_ANY_TOP:         eVJustify = SVX_VER_JUSTIFY_TOP;        break;
134         case SID_ALIGN_ANY_VCENTER:     eVJustify = SVX_VER_JUSTIFY_CENTER;     break;
135         case SID_ALIGN_ANY_BOTTOM:      eVJustify = SVX_VER_JUSTIFY_BOTTOM;     break;
136         default:    DBG_ERRORFILE( "lclConvertSlotToVAlign - invalid slot" );
137     }
138     return eVJustify;
139 }
140 
141 } // namespace
142 
143 TYPEINIT1( ScFormatShell, SfxShell );
144 
145 SFX_IMPL_INTERFACE(ScFormatShell, SfxShell, ScResId(SCSTR_FORMATSHELL) )
146 {
147     SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_OBJECT | SFX_VISIBILITY_STANDARD |
148                                 SFX_VISIBILITY_SERVER,
149                                 ScResId(RID_OBJECTBAR_FORMAT));
150 
151 }
152 
153 
154 ScFormatShell::ScFormatShell(ScViewData* pData) :
155     SfxShell(pData->GetViewShell()),
156     pViewData(pData)
157 {
158     ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell();
159 
160     SetPool( &pTabViewShell->GetPool() );
161     ::svl::IUndoManager* pMgr = pViewData->GetSfxDocShell()->GetUndoManager();
162     SetUndoManager( pMgr );
163     if ( !pViewData->GetDocument()->IsUndoEnabled() )
164     {
165         pMgr->SetMaxUndoActionCount( 0 );
166     }
167     SetHelpId(HID_SCSHELL_FORMATSH);
168     SetName(String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("Format")));
169 }
170 
171 ScFormatShell::~ScFormatShell()
172 {
173 }
174 
175 //------------------------------------------------------------------
176 
177 void __EXPORT ScFormatShell::GetStyleState( SfxItemSet& rSet )
178 {
179     ScDocument*             pDoc        = GetViewData()->GetDocument();
180     ScTabViewShell* pTabViewShell       = GetViewData()->GetViewShell();
181     SfxStyleSheetBasePool*  pStylePool  = pDoc->GetStyleSheetPool();
182 
183     sal_Bool bProtected = sal_False;
184     SCTAB nTabCount = pDoc->GetTableCount();
185     for (SCTAB i=0; i<nTabCount; i++)
186         if (pDoc->IsTabProtected(i))                // ueberhaupt eine Tabelle geschuetzt?
187             bProtected = sal_True;
188 
189     SfxWhichIter    aIter(rSet);
190     sal_uInt16          nWhich = aIter.FirstWhich();
191     sal_uInt16          nSlotId = 0;
192 
193     while ( nWhich )
194     {
195         nSlotId = SfxItemPool::IsWhich( nWhich )
196                     ? GetPool().GetSlotId( nWhich )
197                     : nWhich;
198 
199         switch ( nSlotId )
200         {
201             case SID_STYLE_APPLY:
202                 if ( !pStylePool )
203                     rSet.DisableItem( nSlotId );
204                 break;
205 
206             case SID_STYLE_FAMILY2:     // Zellvorlagen
207             {
208                 SfxStyleSheet* pStyleSheet = (SfxStyleSheet*)
209                                              pTabViewShell->GetStyleSheetFromMarked();
210 
211                 if ( pStyleSheet )
212                     rSet.Put( SfxTemplateItem( nSlotId, pStyleSheet->GetName() ) );
213                 else
214                     rSet.Put( SfxTemplateItem( nSlotId, String() ) );
215             }
216             break;
217 
218             case SID_STYLE_FAMILY4:     // Seitenvorlagen
219             {
220                 SCTAB           nCurTab     = GetViewData()->GetTabNo();
221                 String          aPageStyle  = pDoc->GetPageStyle( nCurTab );
222                 SfxStyleSheet*  pStyleSheet = (SfxStyleSheet*)pStylePool->
223                                     Find( aPageStyle, SFX_STYLE_FAMILY_PAGE );
224 
225                 if ( pStyleSheet )
226                     rSet.Put( SfxTemplateItem( nSlotId, aPageStyle ) );
227                 else
228                     rSet.Put( SfxTemplateItem( nSlotId, String() ) );
229             }
230             break;
231 
232             case SID_STYLE_WATERCAN:
233             {
234                 rSet.Put( SfxBoolItem( nSlotId, SC_MOD()->GetIsWaterCan() ) );
235             }
236             break;
237 
238             case SID_STYLE_UPDATE_BY_EXAMPLE:
239             {
240                 ISfxTemplateCommon* pDesigner = SFX_APP()->
241                         GetCurrentTemplateCommon(pTabViewShell->GetViewFrame()->GetBindings());
242                 sal_Bool bPage = pDesigner && SFX_STYLE_FAMILY_PAGE == pDesigner->GetActualFamily();
243 
244                 if ( bProtected || bPage )
245                     rSet.DisableItem( nSlotId );
246             }
247             break;
248 
249             case SID_STYLE_EDIT:
250             case SID_STYLE_DELETE:
251             {
252                 ISfxTemplateCommon* pDesigner = SFX_APP()->
253                         GetCurrentTemplateCommon(pTabViewShell->GetViewFrame()->GetBindings());
254                 sal_Bool bPage = pDesigner && SFX_STYLE_FAMILY_PAGE == pDesigner->GetActualFamily();
255 
256                 if ( bProtected && !bPage )
257                     rSet.DisableItem( nSlotId );
258             }
259             break;
260 
261             default:
262                 break;
263         }
264 
265         nWhich = aIter.NextWhich();
266     }
267 }
268 
269 //------------------------------------------------------------------
270 
271 void __EXPORT ScFormatShell::ExecuteStyle( SfxRequest& rReq )
272 {
273     // Wenn ToolBar vertikal :
274     if ( !rReq.GetArgs() )
275     {
276         pViewData->GetDispatcher().Execute( SID_STYLE_DESIGNER, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD );
277         return;
278     }
279 
280     //--------------------------------------------------------------------
281     SfxBindings&        rBindings   = pViewData->GetBindings();
282     const SfxItemSet*   pArgs       = rReq.GetArgs();
283     const sal_uInt16        nSlotId     = rReq.GetSlot();
284     const SCTAB         nCurTab     = GetViewData()->GetTabNo();
285     ScDocShell*         pDocSh      = GetViewData()->GetDocShell();
286     ScTabViewShell*     pTabViewShell= GetViewData()->GetViewShell();
287     ScDocument*         pDoc        = pDocSh->GetDocument();
288     ScMarkData&         rMark       = GetViewData()->GetMarkData();
289     ScModule*           pScMod      = SC_MOD();
290     String              aRefName;
291     sal_Bool                bUndo       = pDoc->IsUndoEnabled();
292 
293     if (   (nSlotId == SID_STYLE_NEW)
294         || (nSlotId == SID_STYLE_EDIT)
295         || (nSlotId == SID_STYLE_DELETE)
296         || (nSlotId == SID_STYLE_APPLY)
297         || (nSlotId == SID_STYLE_WATERCAN)
298         || (nSlotId == SID_STYLE_FAMILY)
299         || (nSlotId == SID_STYLE_NEW_BY_EXAMPLE)
300         || (nSlotId == SID_STYLE_UPDATE_BY_EXAMPLE) )
301     {
302         SfxStyleSheetBasePool*  pStylePool  = pDoc->GetStyleSheetPool();
303         SfxStyleSheetBase*      pStyleSheet = NULL;
304 
305         sal_Bool bStyleToMarked = sal_False;
306         sal_Bool bListAction = sal_False;
307         sal_Bool bAddUndo = sal_False;          // add ScUndoModifyStyle (style modified)
308         ScStyleSaveData aOldData;       // for undo/redo
309         ScStyleSaveData aNewData;
310 
311         SfxStyleFamily eFamily = SFX_STYLE_FAMILY_PARA;
312         const SfxPoolItem* pFamItem;
313         if ( pArgs && SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_FAMILY, sal_True, &pFamItem ) )
314             eFamily = (SfxStyleFamily)((const SfxUInt16Item*)pFamItem)->GetValue();
315         else
316         if ( pArgs && SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_FAMILYNAME, sal_True, &pFamItem ) )
317         {
318             String sFamily = ((const SfxStringItem*)pFamItem)->GetValue();
319             if (sFamily.CompareToAscii("CellStyles") == COMPARE_EQUAL)
320                 eFamily = SFX_STYLE_FAMILY_PARA;
321             else
322             if (sFamily.CompareToAscii("PageStyles") == COMPARE_EQUAL)
323                 eFamily = SFX_STYLE_FAMILY_PAGE;
324         }
325 
326         String                  aStyleName;
327         sal_uInt16                  nRetMask = 0xffff;
328 //      #96983# only stylist sends focus to sheet
329 //        sal_Bool                    bGrabFocus = ( SID_STYLE_APPLY == nSlotId );
330 
331         pStylePool->SetSearchMask( eFamily, SFXSTYLEBIT_ALL );
332 
333         switch ( nSlotId )
334         {
335             case SID_STYLE_NEW:
336                 {
337                     const SfxPoolItem* pNameItem;
338                     if (pArgs && SFX_ITEM_SET == pArgs->GetItemState( nSlotId, sal_True, &pNameItem ))
339                         aStyleName  = ((const SfxStringItem*)pNameItem)->GetValue();
340 
341                     const SfxPoolItem* pRefItem=NULL;
342                     if (pArgs && SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_REFERENCE, sal_True, &pRefItem ))
343                     {
344                         if(pRefItem!=NULL)
345                             aRefName  = ((const SfxStringItem*)pRefItem)->GetValue();
346                     }
347 
348                     pStyleSheet = &(pStylePool->Make( aStyleName, eFamily,
349                                                       SFXSTYLEBIT_USERDEF ) );
350 
351                     if ( pStyleSheet && pStyleSheet->HasParentSupport() )
352                         pStyleSheet->SetParent(aRefName);
353                 }
354                 break;
355 
356             case SID_STYLE_APPLY:
357             {
358                 SFX_REQUEST_ARG( rReq, pNameItem, SfxStringItem, SID_APPLY_STYLE, sal_False );
359                 SFX_REQUEST_ARG( rReq, pFamilyItem, SfxStringItem, SID_STYLE_FAMILYNAME, sal_False );
360                 if ( pFamilyItem && pNameItem )
361                 {
362                     com::sun::star::uno::Reference< com::sun::star::style::XStyleFamiliesSupplier > xModel(pDocSh->GetModel(), com::sun::star::uno::UNO_QUERY);
363                     try
364                     {
365                         com::sun::star::uno::Reference< com::sun::star::container::XNameAccess > xStyles;
366                         com::sun::star::uno::Reference< com::sun::star::container::XNameAccess > xCont = xModel->getStyleFamilies();
367                         xCont->getByName(pFamilyItem->GetValue()) >>= xStyles;
368                         com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet > xInfo;
369                         xStyles->getByName( pNameItem->GetValue() ) >>= xInfo;
370                         ::rtl::OUString aUIName;
371                         xInfo->getPropertyValue( ::rtl::OUString::createFromAscii("DisplayName") ) >>= aUIName;
372                         if ( aUIName.getLength() )
373                             rReq.AppendItem( SfxStringItem( SID_STYLE_APPLY, aUIName ) );
374                     }
375                     catch( com::sun::star::uno::Exception& )
376                     {
377                     }
378                 }
379             }
380             case SID_STYLE_EDIT:
381             case SID_STYLE_DELETE:
382             case SID_STYLE_NEW_BY_EXAMPLE:
383                 {
384                     const SfxPoolItem* pNameItem;
385                     if (pArgs && SFX_ITEM_SET == pArgs->GetItemState( nSlotId, sal_True, &pNameItem ))
386                         aStyleName  = ((const SfxStringItem*)pNameItem)->GetValue();
387                     pStyleSheet = pStylePool->Find( aStyleName, eFamily );
388 
389                     aOldData.InitFromStyle( pStyleSheet );
390                 }
391                 break;
392 
393             case SID_STYLE_WATERCAN:
394             {
395                 sal_Bool bWaterCan = pScMod->GetIsWaterCan();
396 
397                 if( !bWaterCan )
398                 {
399                     const SfxPoolItem* pItem;
400 
401                     if ( SFX_ITEM_SET ==
402                          pArgs->GetItemState( nSlotId, sal_True, &pItem ) )
403                     {
404                         const SfxStringItem* pStrItem = PTR_CAST(SfxStringItem,pItem);
405                         if ( pStrItem )
406                         {
407                             aStyleName  = pStrItem->GetValue();
408                             pStyleSheet = pStylePool->Find( aStyleName, eFamily );
409 
410                             if ( pStyleSheet )
411                             {
412                                 ((ScStyleSheetPool*)pStylePool)->
413                                         SetActualStyleSheet( pStyleSheet );
414                                 rReq.Done();
415                             }
416                         }
417                     }
418                 }
419 
420                 if ( !bWaterCan && pStyleSheet )
421                 {
422                     pScMod->SetWaterCan( sal_True );
423                     pTabViewShell->SetActivePointer( Pointer(POINTER_FILL) );
424                     rReq.Done();
425                 }
426                 else
427                 {
428                     pScMod->SetWaterCan( sal_False );
429                     pTabViewShell->SetActivePointer( Pointer(POINTER_ARROW) );
430                     rReq.Done();
431                 }
432             }
433             break;
434 
435             default:
436                 break;
437         }
438 
439         // Neuen Style fuer WaterCan-Mode setzen
440         if ( nSlotId == SID_STYLE_APPLY && pScMod->GetIsWaterCan() && pStyleSheet )
441             ((ScStyleSheetPool*)pStylePool)->SetActualStyleSheet( pStyleSheet );
442 
443         switch ( eFamily )
444         {
445             case SFX_STYLE_FAMILY_PARA:
446             {
447                 switch ( nSlotId )
448                 {
449                     case SID_STYLE_DELETE:
450                     {
451                         if ( pStyleSheet )
452                         {
453                             pTabViewShell->RemoveStyleSheetInUse( pStyleSheet );
454                             pStylePool->Remove( pStyleSheet );
455                             pTabViewShell->InvalidateAttribs();
456                             nRetMask = sal_True;
457                             bAddUndo = sal_True;
458                             rReq.Done();
459                         }
460                         else
461                             nRetMask = sal_False;
462                     }
463                     break;
464 
465                     case SID_STYLE_APPLY:
466                     {
467                         if ( pStyleSheet && !pScMod->GetIsWaterCan() )
468                         {
469                             // Anwenden der Vorlage auf das Dokument
470                             pTabViewShell->SetStyleSheetToMarked( (SfxStyleSheet*)pStyleSheet );
471                             pTabViewShell->InvalidateAttribs();
472                             rReq.Done();
473                         }
474                     }
475                     break;
476 
477                     case SID_STYLE_NEW_BY_EXAMPLE:
478                     case SID_STYLE_UPDATE_BY_EXAMPLE:
479                     {
480                         // Vorlage erzeugen/ersetzen durch Attribute
481                         // an der Cursor-Position:
482 
483                         const ScPatternAttr* pAttrItem = NULL;
484 
485                         // Die Abfrage, ob markiert ist, war hier immer falsch,
486                         // darum jetzt gar nicht mehr, und einfach vom Cursor.
487                         // Wenn Attribute aus der Selektion genommen werden sollen,
488                         // muss noch darauf geachtet werden, Items aus Vorlagen nicht
489                         // zu uebernehmen (GetSelectionPattern sammelt auch Items aus
490                         // Vorlagen zusammen) (#44748#)
491                         //      pAttrItem = GetSelectionPattern();
492 
493                         // ScViewData* pViewData = GetViewData();
494                         SCCOL       nCol = pViewData->GetCurX();
495                         SCROW       nRow = pViewData->GetCurY();
496                         pAttrItem = pDoc->GetPattern( nCol, nRow, nCurTab );
497 
498                         SfxItemSet aAttrSet = pAttrItem->GetItemSet();
499                         aAttrSet.ClearItem( ATTR_MERGE );
500                         aAttrSet.ClearItem( ATTR_MERGE_FLAG );
501                         //  bedingte Formatierung und Gueltigkeit nicht uebernehmen,
502                         //  weil sie in der Vorlage nicht editiert werden koennen
503                         aAttrSet.ClearItem( ATTR_VALIDDATA );
504                         aAttrSet.ClearItem( ATTR_CONDITIONAL );
505 
506                         if ( SID_STYLE_NEW_BY_EXAMPLE == nSlotId )
507                         {
508                             if ( bUndo )
509                             {
510                                 String aUndo = ScGlobal::GetRscString( STR_UNDO_EDITCELLSTYLE );
511                                 pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
512                                 bListAction = sal_True;
513                             }
514 
515                             sal_Bool            bConvertBack = sal_False;
516                             SfxStyleSheet*  pSheetInUse = (SfxStyleSheet*)
517                                                           pTabViewShell->GetStyleSheetFromMarked();
518 
519                             // wenn neuer Style vorhanden und in der Selektion
520                             // verwendet wird, so darf der Parent nicht uebernommen
521                             // werden:
522 
523                             if ( pStyleSheet && pSheetInUse && pStyleSheet == pSheetInUse )
524                                 pSheetInUse = NULL;
525 
526                             // wenn bereits vorhanden, erstmal entfernen...
527                             if ( pStyleSheet )
528                             {
529                                 // Style-Pointer zu Namen vor Erase,
530                                 // weil Zellen sonst ungueltige Pointer
531                                 // enthalten.
532                                 //!!! bei Gelenheit mal eine Methode, die
533                                 //    das fuer einen bestimmten Style macht
534                                 pDoc->StylesToNames();
535                                 bConvertBack = sal_True;
536                                 pStylePool->Remove(pStyleSheet);
537                             }
538 
539                             // ...und neu anlegen
540                             pStyleSheet = &pStylePool->Make( aStyleName, eFamily,
541                                                              SFXSTYLEBIT_USERDEF );
542 
543                             // wenn ein Style vorhanden ist, so wird dieser
544                             // Parent der neuen Vorlage:
545                             if ( pSheetInUse && pStyleSheet->HasParentSupport() )
546                                 pStyleSheet->SetParent( pSheetInUse->GetName() );
547 
548                             if ( bConvertBack )
549                                 // Namen zu Style-Pointer
550                                 pDoc->UpdStlShtPtrsFrmNms();
551                             else
552                                 pDoc->GetPool()->CellStyleCreated( aStyleName );
553 
554                             // Attribute uebernehmen und Style anwenden
555                             pStyleSheet->GetItemSet().Put( aAttrSet );
556                             pTabViewShell->UpdateStyleSheetInUse( pStyleSheet );
557 
558                             //  call SetStyleSheetToMarked after adding the ScUndoModifyStyle
559                             //  (pStyleSheet pointer is used!)
560                             bStyleToMarked = sal_True;
561                         }
562                         else // ( nSlotId == SID_STYLE_UPDATE_BY_EXAMPLE )
563                         {
564                             pStyleSheet = (SfxStyleSheet*)pTabViewShell->GetStyleSheetFromMarked();
565 
566                             if ( pStyleSheet )
567                             {
568                                 aOldData.InitFromStyle( pStyleSheet );
569 
570                                 if ( bUndo )
571                                 {
572                                     String aUndo = ScGlobal::GetRscString( STR_UNDO_EDITCELLSTYLE );
573                                     pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
574                                     bListAction = sal_True;
575                                 }
576 
577                                 pStyleSheet->GetItemSet().Put( aAttrSet );
578                                 pTabViewShell->UpdateStyleSheetInUse( pStyleSheet );
579 
580                                 //  call SetStyleSheetToMarked after adding the ScUndoModifyStyle
581                                 //  (pStyleSheet pointer is used!)
582                                 bStyleToMarked = sal_True;
583                             }
584                         }
585 
586                         aNewData.InitFromStyle( pStyleSheet );
587                         bAddUndo = sal_True;
588                         rReq.Done();
589                     }
590                     break;
591 
592                     default:
593                         break;
594                 }
595             } // case SFX_STYLE_FAMILY_PARA:
596             break;
597 
598             case SFX_STYLE_FAMILY_PAGE:
599             {
600                 switch ( nSlotId )
601                 {
602                     case SID_STYLE_DELETE:
603                     {
604                         nRetMask = ( NULL != pStyleSheet );
605                         if ( pStyleSheet )
606                         {
607                             if ( pDoc->RemovePageStyleInUse( pStyleSheet->GetName() ) )
608                             {
609                                 ScPrintFunc( pDocSh, pTabViewShell->GetPrinter(sal_True), nCurTab ).UpdatePages();
610                                 rBindings.Invalidate( SID_STATUS_PAGESTYLE );
611                                 rBindings.Invalidate( FID_RESET_PRINTZOOM );
612                             }
613                             pStylePool->Remove( pStyleSheet );
614                             rBindings.Invalidate( SID_STYLE_FAMILY4 );
615                             pDocSh->SetDocumentModified();
616                             bAddUndo = sal_True;
617                             rReq.Done();
618                         }
619                     }
620                     break;
621 
622                     case SID_STYLE_APPLY:
623                     {
624                         nRetMask = ( NULL != pStyleSheet );
625                         if ( pStyleSheet && !pScMod->GetIsWaterCan() )
626                         {
627                             ScUndoApplyPageStyle* pUndoAction = 0;
628                             for( SCTAB nTab = 0, nTabCount = pDoc->GetTableCount(); nTab < nTabCount; ++nTab )
629                             {
630                                 if( rMark.GetTableSelect( nTab ) )
631                                 {
632                                     String aOldName = pDoc->GetPageStyle( nTab );
633                                     if ( aOldName != aStyleName )
634                                     {
635                                         pDoc->SetPageStyle( nTab, aStyleName );
636                                         ScPrintFunc( pDocSh, pTabViewShell->GetPrinter(sal_True), nTab ).UpdatePages();
637                                         if( !pUndoAction )
638                                             pUndoAction = new ScUndoApplyPageStyle( pDocSh, aStyleName );
639                                         pUndoAction->AddSheetAction( nTab, aOldName );
640                                     }
641                                 }
642                             }
643                             if( pUndoAction )
644                             {
645                                 pDocSh->GetUndoManager()->AddUndoAction( pUndoAction );
646                                 pDocSh->SetDocumentModified();
647                                 rBindings.Invalidate( SID_STYLE_FAMILY4 );
648                                 rBindings.Invalidate( SID_STATUS_PAGESTYLE );
649                                 rBindings.Invalidate( FID_RESET_PRINTZOOM );
650                             }
651                             rReq.Done();
652                         }
653                     }
654                     break;
655 
656                     case SID_STYLE_NEW_BY_EXAMPLE:
657                     {
658                         const String& rStrCurStyle = pDoc->GetPageStyle( nCurTab );
659 
660                         if ( rStrCurStyle != aStyleName )
661                         {
662                             SfxStyleSheetBase*  pCurStyle = pStylePool->Find( rStrCurStyle, eFamily );
663                             SfxItemSet          aAttrSet  = pCurStyle->GetItemSet();
664                             SCTAB               nInTab;
665                             sal_Bool                bUsed = pDoc->IsPageStyleInUse( aStyleName, &nInTab );
666 
667                             // wenn bereits vorhanden, erstmal entfernen...
668                             if ( pStyleSheet )
669                                 pStylePool->Remove( pStyleSheet );
670 
671                             // ...und neu anlegen
672                             pStyleSheet = &pStylePool->Make( aStyleName, eFamily,
673                                                              SFXSTYLEBIT_USERDEF );
674 
675                             // Attribute uebernehmen
676                             pStyleSheet->GetItemSet().Put( aAttrSet );
677                             pDocSh->SetDocumentModified();
678 
679                             // wenn in Verwendung -> Update
680                             if ( bUsed )
681                                 ScPrintFunc( pDocSh, pTabViewShell->GetPrinter(sal_True), nInTab ).UpdatePages();
682 
683                             aNewData.InitFromStyle( pStyleSheet );
684                             bAddUndo = sal_True;
685                             rReq.Done();
686                             nRetMask = sal_True;
687                         }
688                     }
689                     break;
690 
691                     default:
692                         break;
693                 } // switch ( nSlotId )
694             } // case SFX_STYLE_FAMILY_PAGE:
695             break;
696 
697             default:
698                 break;
699         } // switch ( eFamily )
700 
701         // Neu anlegen oder bearbeiten ueber Dialog:
702         if ( nSlotId == SID_STYLE_NEW || nSlotId == SID_STYLE_EDIT )
703         {
704             if ( pStyleSheet )
705             {
706                 SvxNumberInfoItem* pNumberInfoItem = NULL;
707 
708                 SfxStyleFamily  eFam    = pStyleSheet->GetFamily();
709                 // ScDocument*     pDoc    = GetViewData()->GetDocument();
710                 // ScDocShell*     pDocSh  = GetViewData()->GetDocShell();
711                 //CHINA001 ScStyleDlg*      pDlg    = NULL;
712                 SfxAbstractTabDialog* pDlg    = NULL; //CHINA001
713                 sal_uInt16          nRsc    = 0;
714 
715                 //  #37034#/#37245# alte Items aus der Vorlage merken
716                 SfxItemSet aOldSet = pStyleSheet->GetItemSet();
717                 String aOldName = pStyleSheet->GetName();
718 
719                 switch ( eFam )
720                 {
721                     case SFX_STYLE_FAMILY_PAGE:
722                         nRsc = RID_SCDLG_STYLES_PAGE;
723                         break;
724 
725                     case SFX_STYLE_FAMILY_PARA:
726                     default:
727                         {
728                             SfxItemSet& rSet = pStyleSheet->GetItemSet();
729 
730                             const SfxPoolItem* pItem;
731                             if ( rSet.GetItemState( ATTR_VALUE_FORMAT,
732                                     sal_False, &pItem ) == SFX_ITEM_SET )
733                             {
734                                 // NumberFormat Value aus Value und Language
735                                 // erzeugen und eintueten
736                                 sal_uLong nFormat =
737                                     ((SfxUInt32Item*)pItem)->GetValue();
738                                 LanguageType eLang =
739                                     ((SvxLanguageItem*)&rSet.Get(
740                                     ATTR_LANGUAGE_FORMAT ))->GetLanguage();
741                                 sal_uLong nLangFormat = pDoc->GetFormatTable()->
742                                     GetFormatForLanguageIfBuiltIn( nFormat, eLang );
743                                 if ( nLangFormat != nFormat )
744                                 {
745                                     SfxUInt32Item aNewItem( ATTR_VALUE_FORMAT, nLangFormat );
746                                     rSet.Put( aNewItem );
747                                     aOldSet.Put( aNewItem );
748                                     // auch in aOldSet fuer Vergleich nach dem Dialog,
749                                     // sonst geht evtl. eine Aenderung der Sprache verloren
750                                 }
751                             }
752 
753                             pTabViewShell->MakeNumberInfoItem( pDoc, GetViewData(), &pNumberInfoItem );
754                             pDocSh->PutItem( *pNumberInfoItem );
755                             nRsc = RID_SCDLG_STYLES_PAR;
756 
757                             //  auf jeden Fall ein SvxBoxInfoItem mit Table = sal_False im Set:
758                             //  (wenn gar kein Item da ist, loescht der Dialog auch das
759                             //   BORDER_OUTER SvxBoxItem aus dem Vorlagen-Set)
760 
761                             if ( rSet.GetItemState( ATTR_BORDER_INNER, sal_False ) != SFX_ITEM_SET )
762                             {
763                                 SvxBoxInfoItem aBoxInfoItem( ATTR_BORDER_INNER );
764                                 aBoxInfoItem.SetTable(sal_False);       // keine inneren Linien
765                                 aBoxInfoItem.SetDist(sal_True);
766                                 aBoxInfoItem.SetMinDist(sal_False);
767                                 rSet.Put( aBoxInfoItem );
768                             }
769                         }
770                         break;
771                 }
772 
773                 //  If GetDefDialogParent is a dialog, it must be used
774                 //  (style catalog)
775 
776                 Window* pParent = Application::GetDefDialogParent();
777                 if ( !pParent || !pParent->IsDialog() )
778                 {
779                     //  #107256# GetDefDialogParent currently doesn't return the window
780                     //  that was set with SetDefDialogParent (but dynamically finds the
781                     //  topmost parent of the focus window), so IsDialog above is FALSE
782                     //  even if called from the style catalog.
783                     //  -> Use NULL if a modal dialog is open, to enable the Dialog's
784                     //  default parent handling.
785                     if ( Application::IsInModalMode() )
786                         pParent = NULL;
787                     else
788                         pParent = pTabViewShell->GetDialogParent();
789                 }
790 
791                 pTabViewShell->SetInFormatDialog(sal_True);
792 
793                 //CHINA001 pDlg = new ScStyleDlg( pParent, *pStyleSheet, nRsc );
794                 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
795                 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
796 
797                 pDlg = pFact->CreateScStyleDlg( pParent, *pStyleSheet, nRsc, nRsc );
798                 DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
799                 short nResult = pDlg->Execute();
800                 pTabViewShell->SetInFormatDialog(sal_False);
801 
802                 if ( nResult == RET_OK )
803                 {
804                     const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
805 
806                     if ( pOutSet )
807                     {
808                         nRetMask = pStyleSheet->GetMask();
809 
810                         //  #37034#/#37245# Attribut-Vergleiche (frueher in ModifyStyleSheet)
811                         //  jetzt hier mit den alten Werten (Style ist schon veraendert)
812 
813                         if ( SFX_STYLE_FAMILY_PARA == eFam )
814                         {
815 //                          pDoc->CellStyleChanged( *pStyleSheet, aOldSet );
816 
817                             SfxItemSet& rNewSet = pStyleSheet->GetItemSet();
818                             sal_Bool bNumFormatChanged;
819                             if ( ScGlobal::CheckWidthInvalidate(
820                                                 bNumFormatChanged, aOldSet, rNewSet ) )
821                                 pDoc->InvalidateTextWidth( NULL, NULL, bNumFormatChanged );
822 
823                             SCTAB nTabCount = pDoc->GetTableCount();
824                             for (SCTAB nTab=0; nTab<nTabCount; nTab++)
825                                 if (pDoc->IsStreamValid(nTab))
826                                     pDoc->SetStreamValid(nTab, sal_False);
827 
828                             sal_uLong nOldFormat = ((const SfxUInt32Item&)aOldSet.
829                                                     Get( ATTR_VALUE_FORMAT )).GetValue();
830                             sal_uLong nNewFormat = ((const SfxUInt32Item&)rNewSet.
831                                                     Get( ATTR_VALUE_FORMAT )).GetValue();
832                             if ( nNewFormat != nOldFormat )
833                             {
834                                 SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
835                                 const SvNumberformat* pOld = pFormatter->GetEntry( nOldFormat );
836                                 const SvNumberformat* pNew = pFormatter->GetEntry( nNewFormat );
837                                 if ( pOld && pNew && pOld->GetLanguage() != pNew->GetLanguage() )
838                                     rNewSet.Put( SvxLanguageItem(
839                                                     pNew->GetLanguage(), ATTR_LANGUAGE_FORMAT ) );
840                             }
841 
842                             pDoc->GetPool()->CellStyleCreated( pStyleSheet->GetName() );
843                         }
844                         else
845                         {
846                             //! auch fuer Seitenvorlagen die Abfragen hier
847 
848                             String aNewName = pStyleSheet->GetName();
849                             if ( aNewName != aOldName &&
850                                     pDoc->RenamePageStyleInUse( aOldName, aNewName ) )
851                             {
852                                 rBindings.Invalidate( SID_STATUS_PAGESTYLE );
853                                 rBindings.Invalidate( FID_RESET_PRINTZOOM );
854                             }
855 
856                             pDoc->ModifyStyleSheet( *pStyleSheet, *pOutSet );
857                             rBindings.Invalidate( FID_RESET_PRINTZOOM );
858                         }
859 
860                         pDocSh->SetDocumentModified();
861 
862                         if ( SFX_STYLE_FAMILY_PARA == eFam )
863                         {
864                             pTabViewShell->UpdateNumberFormatter( pDoc,
865                                 (const SvxNumberInfoItem&)
866                                     *(pDocSh->GetItem(SID_ATTR_NUMBERFORMAT_INFO)) );
867 
868                             pTabViewShell->UpdateStyleSheetInUse( pStyleSheet );
869                             pTabViewShell->InvalidateAttribs();
870                         }
871 
872                         aNewData.InitFromStyle( pStyleSheet );
873                         bAddUndo = sal_True;
874                     }
875                 }
876                 else
877                 {
878                     if ( nSlotId == SID_STYLE_NEW )
879                         pStylePool->Remove( pStyleSheet );
880                     else
881                     {
882                         //  falls zwischendurch etwas mit dem temporaer geaenderten
883                         //  ItemSet gepainted wurde:
884                         pDocSh->PostPaintGridAll();
885                     }
886                 }
887                 delete pDlg;
888             }
889         }
890 
891 //      if ( nRetMask != 0xffff )// Irgendein Wert MUSS geliefert werden JN
892             rReq.SetReturnValue( SfxUInt16Item( nSlotId, nRetMask ) );
893 
894 //      #96983# only stylist sends focus to sheet
895 //        if ( bGrabFocus )
896 //            pTabViewShell->GetActiveWin()->GrabFocus();
897 
898         if ( bAddUndo && bUndo)
899             pDocSh->GetUndoManager()->AddUndoAction(
900                         new ScUndoModifyStyle( pDocSh, eFamily, aOldData, aNewData ) );
901 
902         if ( bStyleToMarked )
903         {
904             //  call SetStyleSheetToMarked after adding the ScUndoModifyStyle,
905             //  so redo will find the modified style
906             pTabViewShell->SetStyleSheetToMarked( (SfxStyleSheet*)pStyleSheet );
907             pTabViewShell->InvalidateAttribs();
908         }
909 
910         if ( bListAction )
911             pDocSh->GetUndoManager()->LeaveListAction();
912     }
913     else
914     {
915         DBG_ERROR( "Unknown slot (ScViewShell::ExecuteStyle)" );
916     }
917 }
918 
919 void ScFormatShell::ExecuteNumFormat( SfxRequest& rReq )
920 {
921     ScModule*           pScMod      = SC_MOD();
922     ScTabViewShell* pTabViewShell   = GetViewData()->GetViewShell();
923     const SfxItemSet*   pReqArgs    = rReq.GetArgs();
924     sal_uInt16              nSlot       = rReq.GetSlot();
925 
926     pTabViewShell->HideListBox();                   // Autofilter-DropDown-Listbox
927 
928                                     // Eingabe beenden
929     if ( GetViewData()->HasEditView( GetViewData()->GetActivePart() ) )
930     {
931         switch ( nSlot )
932         {
933             case SID_NUMBER_TWODEC:
934             case SID_NUMBER_SCIENTIFIC:
935             case SID_NUMBER_DATE:
936             case SID_NUMBER_CURRENCY:
937             case SID_NUMBER_PERCENT:
938             case SID_NUMBER_STANDARD:
939             case SID_NUMBER_FORMAT:
940             case SID_NUMBER_INCDEC:
941             case SID_NUMBER_DECDEC:
942             case FID_DEFINE_NAME:
943             case FID_USE_NAME:
944             case FID_INSERT_NAME:
945             case SID_SPELL_DIALOG:
946             case SID_HANGUL_HANJA_CONVERSION:
947 
948             pScMod->InputEnterHandler();
949             pTabViewShell->UpdateInputHandler();
950             break;
951 
952             default:
953             break;
954         }
955     }
956 
957     switch ( nSlot )
958     {
959         case SID_NUMBER_TWODEC:
960             pTabViewShell->SetNumberFormat( NUMBERFORMAT_NUMBER, 4 );       // Standard+4 = #.##0,00
961             rReq.Done();
962             break;
963         case SID_NUMBER_SCIENTIFIC:
964             pTabViewShell->SetNumberFormat( NUMBERFORMAT_SCIENTIFIC );
965             rReq.Done();
966             break;
967         case SID_NUMBER_DATE:
968             pTabViewShell->SetNumberFormat( NUMBERFORMAT_DATE );
969             rReq.Done();
970             break;
971         case SID_NUMBER_TIME:
972             pTabViewShell->SetNumberFormat( NUMBERFORMAT_TIME );
973             rReq.Done();
974             break;
975         case SID_NUMBER_CURRENCY:
976             pTabViewShell->SetNumberFormat( NUMBERFORMAT_CURRENCY );
977             rReq.Done();
978             break;
979         case SID_NUMBER_PERCENT:
980             pTabViewShell->SetNumberFormat( NUMBERFORMAT_PERCENT );
981             rReq.Done();
982             break;
983         case SID_NUMBER_STANDARD:
984             pTabViewShell->SetNumberFormat( NUMBERFORMAT_NUMBER );
985             rReq.Done();
986             break;
987         case SID_NUMBER_INCDEC:
988             pTabViewShell->ChangeNumFmtDecimals( sal_True );
989             rReq.Done();
990             break;
991         case SID_NUMBER_DECDEC:
992             pTabViewShell->ChangeNumFmtDecimals( sal_False );
993             rReq.Done();
994             break;
995 
996         case SID_NUMBER_FORMAT:
997             if ( pReqArgs )
998             {
999                 const SfxPoolItem* pItem;
1000                 if(pReqArgs->GetItemState(nSlot, sal_True, &pItem) == SFX_ITEM_SET)
1001                 {
1002                     String aCode = ((const SfxStringItem*)pItem)->GetValue();
1003                     pTabViewShell->SetNumFmtByStr( aCode );
1004                 }
1005             }
1006             break;
1007 
1008         case SID_ATTR_NUMBERFORMAT_VALUE:
1009             if ( pReqArgs )
1010             {
1011                 const SfxPoolItem* pItem;
1012                 if ( pReqArgs->GetItemState( ATTR_VALUE_FORMAT, sal_True, &pItem ) == SFX_ITEM_SET )
1013                 {
1014                     // We have to accomplish this using ApplyAttributes()
1015                     // because we also need the language information to be
1016                     // considered.
1017                     const SfxItemSet& rOldSet =
1018                         pTabViewShell->GetSelectionPattern()->GetItemSet();
1019                     SfxItemPool* pDocPool = GetViewData()->GetDocument()->GetPool();
1020                     SfxItemSet aNewSet( *pDocPool, ATTR_PATTERN_START, ATTR_PATTERN_END );
1021                     aNewSet.Put( *pItem );
1022                     pTabViewShell->ApplyAttributes( &aNewSet, &rOldSet, sal_True );
1023                 }
1024             }
1025             break;
1026 
1027         default:
1028             DBG_ERROR("falscher Slot bei ExecuteEdit");
1029             break;
1030     }
1031 }
1032 
1033 
1034 //------------------------------------------------------------------
1035 
1036 #define APPLY_HOR_JUSTIFY(j) \
1037     {                                                                       \
1038         if ( !pHorJustify || (eHorJustify != (j) ) )                        \
1039             pTabViewShell->ApplyAttr( SvxHorJustifyItem( (j) ) );                          \
1040         else                                                                \
1041             pTabViewShell->ApplyAttr( SvxHorJustifyItem( SVX_HOR_JUSTIFY_STANDARD ) );     \
1042     }
1043 
1044 #define APPLY_VER_JUSTIFY(j) \
1045     {                                                                       \
1046         if ( !pVerJustify || (eVerJustify != (j) ) )                        \
1047             pTabViewShell->ApplyAttr( SvxVerJustifyItem( (j) ) );                          \
1048         else                                                                \
1049             pTabViewShell->ApplyAttr( SvxVerJustifyItem( SVX_VER_JUSTIFY_STANDARD ) );     \
1050     }
1051 
1052 void ScFormatShell::ExecuteAlignment( SfxRequest& rReq )
1053 {
1054     ScTabViewShell* pTabViewShell       = GetViewData()->GetViewShell();
1055     SfxBindings&            rBindings   = pViewData->GetBindings();
1056     const SfxItemSet*       pSet        = rReq.GetArgs();
1057     sal_uInt16                  nSlot       = rReq.GetSlot();
1058 
1059     pTabViewShell->HideListBox();   // Autofilter-DropDown-Listbox
1060 
1061     switch( nSlot )
1062     {
1063         // pseudo slots for Format menu
1064         case SID_ALIGN_ANY_HDEFAULT:
1065         case SID_ALIGN_ANY_LEFT:
1066         case SID_ALIGN_ANY_HCENTER:
1067         case SID_ALIGN_ANY_RIGHT:
1068         case SID_ALIGN_ANY_JUSTIFIED:
1069             pTabViewShell->ApplyAttr( SvxHorJustifyItem( lclConvertSlotToHAlign( nSlot ), ATTR_HOR_JUSTIFY ) );
1070         break;
1071         case SID_ALIGN_ANY_VDEFAULT:
1072         case SID_ALIGN_ANY_TOP:
1073         case SID_ALIGN_ANY_VCENTER:
1074         case SID_ALIGN_ANY_BOTTOM:
1075             pTabViewShell->ApplyAttr( SvxVerJustifyItem( lclConvertSlotToVAlign( nSlot ), ATTR_VER_JUSTIFY ) );
1076         break;
1077 
1078         default:
1079             if( pSet )
1080             {
1081                 const SfxPoolItem* pItem = NULL;
1082                 if( pSet->GetItemState(GetPool().GetWhich(nSlot), sal_True, &pItem  ) == SFX_ITEM_SET )
1083                 {
1084 
1085                     switch ( nSlot )
1086                     {
1087                         case SID_ATTR_ALIGN_HOR_JUSTIFY:
1088                         case SID_ATTR_ALIGN_VER_JUSTIFY:
1089                         case SID_ATTR_ALIGN_INDENT:
1090                         case SID_ATTR_ALIGN_HYPHENATION:
1091                         case SID_ATTR_ALIGN_DEGREES:
1092                         case SID_ATTR_ALIGN_LOCKPOS:
1093                         case SID_ATTR_ALIGN_MARGIN:
1094                         case SID_ATTR_ALIGN_STACKED:
1095                             pTabViewShell->ApplyAttr( *pItem );
1096                         break;
1097 
1098                         case SID_H_ALIGNCELL:
1099                         {
1100                             SvxCellHorJustify eJust = (SvxCellHorJustify)((const SvxHorJustifyItem*)pItem)->GetValue();
1101                             // #i78476# update alignment of text in cell edit mode
1102                             pTabViewShell->UpdateInputHandlerCellAdjust( eJust );
1103                             pTabViewShell->ApplyAttr( SvxHorJustifyItem( eJust, ATTR_HOR_JUSTIFY ) );
1104                         }
1105                         break;
1106                         case SID_V_ALIGNCELL:
1107                             pTabViewShell->ApplyAttr( SvxVerJustifyItem( (SvxCellVerJustify)((const SvxVerJustifyItem*)pItem)->GetValue(), ATTR_VER_JUSTIFY ) );
1108                         break;
1109                         default:
1110                             DBG_ERROR( "ExecuteAlignment: invalid slot" );
1111                             return;
1112                     }
1113                 }
1114             }
1115     }
1116 
1117     rBindings.Invalidate( SID_ALIGNLEFT );
1118     rBindings.Invalidate( SID_ALIGNRIGHT );
1119     rBindings.Invalidate( SID_ALIGNCENTERHOR );
1120     rBindings.Invalidate( SID_ALIGNBLOCK );
1121     rBindings.Invalidate( SID_ALIGNTOP );
1122     rBindings.Invalidate( SID_ALIGNBOTTOM );
1123     rBindings.Invalidate( SID_ALIGNCENTERVER );
1124     rBindings.Invalidate( SID_V_ALIGNCELL );
1125     rBindings.Invalidate( SID_H_ALIGNCELL );
1126     // pseudo slots for Format menu
1127     rBindings.Invalidate( SID_ALIGN_ANY_HDEFAULT );
1128     rBindings.Invalidate( SID_ALIGN_ANY_LEFT );
1129     rBindings.Invalidate( SID_ALIGN_ANY_HCENTER );
1130     rBindings.Invalidate( SID_ALIGN_ANY_RIGHT );
1131     rBindings.Invalidate( SID_ALIGN_ANY_JUSTIFIED );
1132     rBindings.Invalidate( SID_ALIGN_ANY_VDEFAULT );
1133     rBindings.Invalidate( SID_ALIGN_ANY_TOP );
1134     rBindings.Invalidate( SID_ALIGN_ANY_VCENTER );
1135     rBindings.Invalidate( SID_ALIGN_ANY_BOTTOM );
1136     rBindings.Update();
1137 
1138     if( ! rReq.IsAPI() )
1139         rReq.Done();
1140 }
1141 
1142 void ScFormatShell::ExecuteTextAttr( SfxRequest& rReq )
1143 {
1144     ScTabViewShell* pTabViewShell       = GetViewData()->GetViewShell();
1145     SfxBindings&            rBindings   = pViewData->GetBindings();
1146     const ScPatternAttr*    pAttrs      = pTabViewShell->GetSelectionPattern();
1147     const SfxItemSet*       pSet        = rReq.GetArgs();
1148     sal_uInt16                  nSlot       = rReq.GetSlot();
1149     SfxAllItemSet*          pNewSet = 0;
1150 
1151     pTabViewShell->HideListBox();                   // Autofilter-DropDown-Listbox
1152 
1153     if (  (nSlot == SID_ATTR_CHAR_WEIGHT)
1154         ||(nSlot == SID_ATTR_CHAR_POSTURE)
1155         ||(nSlot == SID_ATTR_CHAR_UNDERLINE)
1156         ||(nSlot == SID_ULINE_VAL_NONE)
1157         ||(nSlot == SID_ULINE_VAL_SINGLE)
1158         ||(nSlot == SID_ULINE_VAL_DOUBLE)
1159         ||(nSlot == SID_ULINE_VAL_DOTTED) )
1160     {
1161         pNewSet = new SfxAllItemSet( GetPool() );
1162 
1163         switch ( nSlot )
1164         {
1165             case SID_ATTR_CHAR_WEIGHT:
1166             {
1167                 // #i78017 establish the same behaviour as in Writer
1168                 sal_uInt8 nScript = SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN | SCRIPTTYPE_COMPLEX;
1169 
1170                 SfxItemPool& rPool = GetPool();
1171                 SvxScriptSetItem aSetItem( nSlot, rPool );
1172                 if ( pSet )
1173                     aSetItem.PutItemForScriptType( nScript, pSet->Get( ATTR_FONT_WEIGHT ) );
1174                 else
1175                 {
1176                     //  toggle manually
1177 
1178                     FontWeight eWeight = WEIGHT_BOLD;
1179                     SvxScriptSetItem aOldSetItem( nSlot, rPool );
1180                     aOldSetItem.GetItemSet().Put( pAttrs->GetItemSet(), sal_False );
1181                     const SfxPoolItem* pCore = aOldSetItem.GetItemOfScript( nScript );
1182                     if ( pCore && ((const SvxWeightItem*)pCore)->GetWeight() == WEIGHT_BOLD )
1183                         eWeight = WEIGHT_NORMAL;
1184 
1185                     aSetItem.PutItemForScriptType( nScript, SvxWeightItem( eWeight, ATTR_FONT_WEIGHT ) );
1186                 }
1187                 pTabViewShell->ApplyUserItemSet( aSetItem.GetItemSet() );
1188                 pNewSet->Put( aSetItem.GetItemSet(), sal_False );
1189             }
1190             break;
1191 
1192             case SID_ATTR_CHAR_POSTURE:
1193             {
1194                 // #i78017 establish the same behaviour as in Writer
1195                 sal_uInt8 nScript = SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN | SCRIPTTYPE_COMPLEX;
1196 
1197                 SfxItemPool& rPool = GetPool();
1198                 SvxScriptSetItem aSetItem( nSlot, rPool );
1199                 if ( pSet )
1200                     aSetItem.PutItemForScriptType( nScript, pSet->Get( ATTR_FONT_POSTURE ) );
1201                 else
1202                 {
1203                     //  toggle manually
1204 
1205                     FontItalic eItalic = ITALIC_NORMAL;
1206                     SvxScriptSetItem aOldSetItem( nSlot, rPool );
1207                     aOldSetItem.GetItemSet().Put( pAttrs->GetItemSet(), sal_False );
1208                     const SfxPoolItem* pCore = aOldSetItem.GetItemOfScript( nScript );
1209                     if ( pCore && ((const SvxPostureItem*)pCore)->GetPosture() == ITALIC_NORMAL )
1210                         eItalic = ITALIC_NONE;
1211 
1212                     aSetItem.PutItemForScriptType( nScript, SvxPostureItem( eItalic, ATTR_FONT_POSTURE ) );
1213                 }
1214                 pTabViewShell->ApplyUserItemSet( aSetItem.GetItemSet() );
1215                 pNewSet->Put( aSetItem.GetItemSet(), sal_False );
1216             }
1217             break;
1218 
1219             case SID_ATTR_CHAR_UNDERLINE:
1220                 {
1221                     FontUnderline       eUnderline;
1222 
1223                     if( pSet )
1224                     {
1225                         const SfxPoolItem& rUnderline = pSet->Get( ATTR_FONT_UNDERLINE );
1226 
1227                         if( rUnderline.ISA(SvxUnderlineItem) )
1228                         {
1229                             pTabViewShell->ApplyAttr( rUnderline );
1230                             pNewSet->Put( rUnderline,rUnderline.Which() );
1231                         }
1232                         else if ( rUnderline.ISA(SvxTextLineItem) )
1233                         {
1234                             // #i106580# also allow SvxTextLineItem (base class of SvxUnderlineItem)
1235                             const SvxTextLineItem& rTextLineItem = static_cast<const SvxTextLineItem&>(rUnderline);
1236                             SvxUnderlineItem aNewItem( rTextLineItem.GetLineStyle(), rTextLineItem.Which() );
1237                             aNewItem.SetColor( rTextLineItem.GetColor() );
1238                             pTabViewShell->ApplyAttr( aNewItem );
1239                             pNewSet->Put( aNewItem, aNewItem.Which() );
1240                         }
1241                     }
1242                     else
1243                     {
1244                         SvxUnderlineItem aUnderline( (const SvxUnderlineItem&)
1245                                                         pAttrs->GetItem(
1246                                                             ATTR_FONT_UNDERLINE ) );
1247                         eUnderline = (UNDERLINE_NONE != aUnderline.GetLineStyle())
1248                                     ? UNDERLINE_NONE
1249                                     : UNDERLINE_SINGLE;
1250                         aUnderline.SetLineStyle( eUnderline );
1251                         pTabViewShell->ApplyAttr( aUnderline );
1252                         pNewSet->Put( aUnderline,aUnderline.Which() );
1253                     }
1254                 }
1255                 break;
1256 
1257             case SID_ULINE_VAL_NONE:
1258                 pTabViewShell->ApplyAttr( SvxUnderlineItem( UNDERLINE_NONE, ATTR_FONT_UNDERLINE ) );
1259                 break;
1260             case SID_ULINE_VAL_SINGLE:      // Toggles
1261             case SID_ULINE_VAL_DOUBLE:
1262             case SID_ULINE_VAL_DOTTED:
1263                 {
1264                     FontUnderline eOld = ((const SvxUnderlineItem&)
1265                                             pAttrs->GetItem(ATTR_FONT_UNDERLINE)).GetLineStyle();
1266                     FontUnderline eNew = eOld;
1267                     switch (nSlot)
1268                     {
1269                         case SID_ULINE_VAL_SINGLE:
1270                             eNew = ( eOld == UNDERLINE_SINGLE ) ? UNDERLINE_NONE : UNDERLINE_SINGLE;
1271                             break;
1272                         case SID_ULINE_VAL_DOUBLE:
1273                             eNew = ( eOld == UNDERLINE_DOUBLE ) ? UNDERLINE_NONE : UNDERLINE_DOUBLE;
1274                             break;
1275                         case SID_ULINE_VAL_DOTTED:
1276                             eNew = ( eOld == UNDERLINE_DOTTED ) ? UNDERLINE_NONE : UNDERLINE_DOTTED;
1277                             break;
1278                     }
1279                     pTabViewShell->ApplyAttr( SvxUnderlineItem( eNew, ATTR_FONT_UNDERLINE ) );
1280                 }
1281                 break;
1282 
1283             default:
1284                 break;
1285         }
1286         rBindings.Invalidate( nSlot );
1287     }
1288     else
1289     {
1290         /*
1291          * "Selbstgemachte" RadioButton-Funktionalitaet
1292          * Beim Toggle gibt es den Standard-State, d.h. kein
1293          * Button ist gedrueckt
1294          */
1295 
1296         const SfxItemSet&        rAttrSet   = pTabViewShell->GetSelectionPattern()->GetItemSet();
1297         const SfxPoolItem*       pItem       = NULL;
1298         const SvxHorJustifyItem* pHorJustify = NULL;
1299         const SvxVerJustifyItem* pVerJustify = NULL;
1300         SvxCellHorJustify        eHorJustify = SVX_HOR_JUSTIFY_STANDARD;
1301         SvxCellVerJustify        eVerJustify = SVX_VER_JUSTIFY_STANDARD;
1302 
1303         if (rAttrSet.GetItemState(ATTR_HOR_JUSTIFY, sal_True,&pItem ) == SFX_ITEM_SET)
1304         {
1305             pHorJustify = (const SvxHorJustifyItem*)pItem;
1306             eHorJustify = SvxCellHorJustify( pHorJustify->GetValue() );
1307         }
1308         if (rAttrSet.GetItemState(ATTR_VER_JUSTIFY, sal_True,&pItem ) == SFX_ITEM_SET)
1309         {
1310             pVerJustify = (const SvxVerJustifyItem*)pItem;
1311             eVerJustify = SvxCellVerJustify( pVerJustify->GetValue() );
1312         }
1313 
1314         switch ( nSlot )
1315         {
1316             case SID_ALIGNLEFT:
1317                 rReq.SetSlot( SID_H_ALIGNCELL );
1318                 rReq.AppendItem( SvxHorJustifyItem(
1319                     !pHorJustify || (eHorJustify != SVX_HOR_JUSTIFY_LEFT) ?
1320                     SVX_HOR_JUSTIFY_LEFT : SVX_HOR_JUSTIFY_STANDARD, SID_H_ALIGNCELL ) );
1321                 ExecuteSlot( rReq, GetInterface() );
1322                 return;
1323 //              APPLY_HOR_JUSTIFY( SVX_HOR_JUSTIFY_LEFT );
1324                 //break;
1325 
1326             case SID_ALIGNRIGHT:
1327                 rReq.SetSlot( SID_H_ALIGNCELL );
1328                 rReq.AppendItem( SvxHorJustifyItem(
1329                     !pHorJustify || (eHorJustify != SVX_HOR_JUSTIFY_RIGHT) ?
1330                     SVX_HOR_JUSTIFY_RIGHT : SVX_HOR_JUSTIFY_STANDARD, SID_H_ALIGNCELL ) );
1331                 ExecuteSlot( rReq, GetInterface() );
1332                 return;
1333 //              APPLY_HOR_JUSTIFY( SVX_HOR_JUSTIFY_RIGHT );
1334                 //break;
1335 
1336             case SID_ALIGNCENTERHOR:
1337                 rReq.SetSlot( SID_H_ALIGNCELL );
1338                 rReq.AppendItem( SvxHorJustifyItem(
1339                     !pHorJustify || (eHorJustify != SVX_HOR_JUSTIFY_CENTER) ?
1340                     SVX_HOR_JUSTIFY_CENTER : SVX_HOR_JUSTIFY_STANDARD, SID_H_ALIGNCELL ) );
1341                 ExecuteSlot( rReq, GetInterface() );
1342                 return;
1343 //              APPLY_HOR_JUSTIFY( SVX_HOR_JUSTIFY_CENTER );
1344                 //break;
1345 
1346             case SID_ALIGNBLOCK:
1347                 rReq.SetSlot( SID_H_ALIGNCELL );
1348                 rReq.AppendItem( SvxHorJustifyItem(
1349                     !pHorJustify || (eHorJustify != SVX_HOR_JUSTIFY_BLOCK) ?
1350                     SVX_HOR_JUSTIFY_BLOCK : SVX_HOR_JUSTIFY_STANDARD, SID_H_ALIGNCELL ) );
1351                 ExecuteSlot( rReq, GetInterface() );
1352                 return;
1353 //              APPLY_HOR_JUSTIFY( SVX_HOR_JUSTIFY_BLOCK );
1354                 //break;
1355 
1356             case SID_ALIGNTOP:
1357                 rReq.SetSlot( SID_V_ALIGNCELL );
1358                 rReq.AppendItem( SvxVerJustifyItem(
1359                     !pVerJustify || (eVerJustify != SVX_VER_JUSTIFY_TOP) ?
1360                     SVX_VER_JUSTIFY_TOP : SVX_VER_JUSTIFY_STANDARD, SID_V_ALIGNCELL ) );
1361                 ExecuteSlot( rReq, GetInterface() );
1362                 return;
1363 //              APPLY_VER_JUSTIFY( SVX_VER_JUSTIFY_TOP );
1364                 //break;
1365 
1366             case SID_ALIGNBOTTOM:
1367                 rReq.SetSlot( SID_V_ALIGNCELL );
1368                 rReq.AppendItem( SvxVerJustifyItem(
1369                     !pVerJustify || (eVerJustify != SVX_VER_JUSTIFY_BOTTOM) ?
1370                     SVX_VER_JUSTIFY_BOTTOM : SVX_VER_JUSTIFY_STANDARD, SID_V_ALIGNCELL ) );
1371                 ExecuteSlot( rReq, GetInterface() );
1372                 return;
1373 //              APPLY_VER_JUSTIFY( SVX_VER_JUSTIFY_BOTTOM );
1374                 //break;
1375 
1376             case SID_ALIGNCENTERVER:
1377                 rReq.SetSlot( SID_V_ALIGNCELL );
1378                 rReq.AppendItem( SvxVerJustifyItem(
1379                     !pVerJustify || (eVerJustify != SVX_VER_JUSTIFY_CENTER) ?
1380                     SVX_VER_JUSTIFY_CENTER : SVX_VER_JUSTIFY_STANDARD, SID_V_ALIGNCELL ) );
1381                 ExecuteSlot( rReq, GetInterface() );
1382                 return;
1383 //              APPLY_VER_JUSTIFY( SVX_VER_JUSTIFY_CENTER );
1384                 //break;
1385 
1386             default:
1387             break;
1388         }
1389 
1390     }
1391 
1392     rBindings.Update();
1393 //  rReq.Done();
1394 
1395     if( pNewSet )
1396     {
1397         rReq.Done( *pNewSet );
1398         delete pNewSet;
1399     }
1400     else
1401     {
1402         rReq.Done();
1403     }
1404 
1405 }
1406 
1407 #undef APPLY_HOR_JUSTIFY
1408 #undef APPLY_VER_JUSTIFY
1409 
1410 //------------------------------------------------------------------
1411 
1412 void ScFormatShell::ExecuteAttr( SfxRequest& rReq )
1413 {
1414     ScTabViewShell* pTabViewShell       = GetViewData()->GetViewShell();
1415     SfxBindings&        rBindings = pViewData->GetBindings();
1416     const SfxItemSet*   pNewAttrs = rReq.GetArgs();
1417 
1418     pTabViewShell->HideListBox();                   // Autofilter-DropDown-Listbox
1419 
1420     if ( !pNewAttrs )
1421     {
1422         sal_uInt16 nSlot = rReq.GetSlot();
1423 
1424         switch ( nSlot )
1425         {
1426             case SID_ATTR_CHAR_FONT:
1427             case SID_ATTR_CHAR_FONTHEIGHT:
1428                 pTabViewShell->ExecuteCellFormatDlg( rReq, TP_FONT );       // wenn ToolBar vertikal
1429                 break;
1430 
1431             case SID_ATTR_ALIGN_LINEBREAK:                  // ohne Parameter als Toggle
1432                 {
1433                     const ScPatternAttr* pAttrs = pTabViewShell->GetSelectionPattern();
1434                     sal_Bool bOld = ((const SfxBoolItem&)pAttrs->GetItem(ATTR_LINEBREAK)).GetValue();
1435                     SfxBoolItem aBreakItem( ATTR_LINEBREAK, !bOld );
1436                     pTabViewShell->ApplyAttr( aBreakItem );
1437 
1438                     SfxAllItemSet aNewSet( GetPool() );
1439                     aNewSet.Put( aBreakItem,aBreakItem.Which() );
1440                     rReq.Done( aNewSet );
1441 
1442                     rBindings.Invalidate( nSlot );
1443                 }
1444                 break;
1445 
1446             case SID_BACKGROUND_COLOR:
1447                 {
1448                     //  SID_BACKGROUND_COLOR without arguments -> set transparent background
1449 
1450                     SvxBrushItem        aBrushItem( (const SvxBrushItem&)
1451                                             pTabViewShell->GetSelectionPattern()->
1452                                                 GetItem( ATTR_BACKGROUND ) );
1453 
1454                     aBrushItem.SetColor( COL_TRANSPARENT );
1455 
1456                     pTabViewShell->ApplyAttr( aBrushItem );
1457                 }
1458                 break;
1459         }
1460     }
1461     else
1462     {
1463         sal_uInt16 nSlot = rReq.GetSlot();
1464 
1465         switch ( nSlot )
1466         {
1467             case SID_ATTR_CHAR_OVERLINE:
1468             case SID_ATTR_CHAR_STRIKEOUT:
1469             case SID_ATTR_ALIGN_LINEBREAK:
1470             case SID_ATTR_CHAR_COLOR:
1471             case SID_ATTR_CHAR_CONTOUR:
1472             case SID_ATTR_CHAR_SHADOWED:
1473             case SID_ATTR_CHAR_RELIEF:
1474             case SID_SCATTR_PROTECTION :
1475                 pTabViewShell->ApplyAttr( pNewAttrs->Get( pNewAttrs->GetPool()->GetWhich( nSlot ) ) );
1476                 rBindings.Invalidate( nSlot );
1477                 rBindings.Update( nSlot );
1478                 break;
1479 
1480             case SID_ATTR_CHAR_FONT:
1481             case SID_ATTR_CHAR_FONTHEIGHT:
1482                 {
1483                     // #i78017 establish the same behaviour as in Writer
1484                     sal_uInt8 nScript = SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN | SCRIPTTYPE_COMPLEX;
1485                     if (nSlot == SID_ATTR_CHAR_FONT)
1486                         nScript = pTabViewShell->GetSelectionScriptType();
1487 
1488                     SfxItemPool& rPool = GetPool();
1489                     SvxScriptSetItem aSetItem( nSlot, rPool );
1490                     sal_uInt16 nWhich = rPool.GetWhich( nSlot );
1491                     aSetItem.PutItemForScriptType( nScript, pNewAttrs->Get( nWhich ) );
1492 
1493                     pTabViewShell->ApplyUserItemSet( aSetItem.GetItemSet() );
1494 
1495                     rBindings.Invalidate( nSlot );
1496                     rBindings.Update( nSlot );
1497                 }
1498                 break;
1499 
1500             case SID_FRAME_LINESTYLE:
1501                 {
1502                     // Default-Linie aktualisieren
1503                     const SvxBorderLine* pLine =
1504                             ((const SvxLineItem&)
1505                                 pNewAttrs->Get( SID_FRAME_LINESTYLE )).
1506                                 GetLine();
1507 
1508                     if ( pLine )
1509                     {
1510                         SvxBorderLine* pDefLine = pTabViewShell->GetDefaultFrameLine();
1511 
1512                         if ( pDefLine )
1513                         {
1514                             pDefLine->SetOutWidth( pLine->GetOutWidth() );
1515                             pDefLine->SetInWidth ( pLine->GetInWidth() );
1516                             pDefLine->SetDistance( pLine->GetDistance() );
1517                             pTabViewShell->SetSelectionFrameLines( pDefLine, sal_False );
1518                         }
1519                         else
1520                         {
1521                             pTabViewShell->SetDefaultFrameLine( pLine );
1522                             pTabViewShell->GetDefaultFrameLine()->SetColor( COL_BLACK );
1523                             pTabViewShell->SetSelectionFrameLines( pLine, sal_False );
1524                         }
1525                     }
1526                     else
1527                     {
1528                         Color           aColorBlack( COL_BLACK );
1529                         SvxBorderLine   aDefLine( &aColorBlack, 20, 0, 0 );
1530                         pTabViewShell->SetDefaultFrameLine( &aDefLine );
1531                         pTabViewShell->SetSelectionFrameLines( NULL, sal_False );
1532                     }
1533                 }
1534                 break;
1535 
1536             case SID_FRAME_LINECOLOR:
1537                 {
1538                     SvxBorderLine*  pDefLine = pTabViewShell->GetDefaultFrameLine();
1539                     const Color&    rColor = ((const SvxColorItem&)
1540                                         pNewAttrs->Get( SID_FRAME_LINECOLOR )).
1541                                             GetValue();
1542 
1543                     // Default-Linie aktualisieren
1544                     if ( pDefLine )
1545                     {
1546                         pDefLine->SetColor( rColor );
1547                         pTabViewShell->SetSelectionFrameLines( pDefLine, sal_True );
1548                     }
1549                     else
1550                     {
1551                         SvxBorderLine   aDefLine( &rColor, 20, 0, 0 );
1552                         pTabViewShell->SetDefaultFrameLine( &aDefLine );
1553                         pTabViewShell->SetSelectionFrameLines( &aDefLine, sal_False );
1554                     }
1555                 }
1556                 break;
1557 
1558             case SID_ATTR_BORDER_OUTER:
1559             case SID_ATTR_BORDER:
1560                 {
1561                     SvxBorderLine*          pDefLine = pTabViewShell->GetDefaultFrameLine();
1562                     const ScPatternAttr*    pOldAttrs = pTabViewShell->GetSelectionPattern();
1563                     ScDocument*             pDoc = GetViewData()->GetDocument();
1564                     SfxItemSet*             pOldSet =
1565                                                 new SfxItemSet(
1566                                                         *(pDoc->GetPool()),
1567                                                         ATTR_PATTERN_START,
1568                                                         ATTR_PATTERN_END );
1569                     SfxItemSet*             pNewSet =
1570                                                 new SfxItemSet(
1571                                                         *(pDoc->GetPool()),
1572                                                         ATTR_PATTERN_START,
1573                                                         ATTR_PATTERN_END );
1574                     const SfxPoolItem&      rBorderAttr =
1575                                                 pOldAttrs->GetItemSet().
1576                                                     Get( ATTR_BORDER );
1577 
1578                     // Border-Items vom Controller auswerten:
1579                     const SfxPoolItem* pItem = 0;
1580 
1581                     if ( pNewAttrs->GetItemState( ATTR_BORDER, sal_True, &pItem )
1582                          == SFX_ITEM_SET )
1583                     {
1584                         //  #100959# The SvxFrameToolBoxControl toolbox controller uses a default
1585                         //  SvxBorderLine (all widths 0) to mark the lines that should be set.
1586                         //  Macro recording uses a SvxBoxItem with the real values (OutWidth > 0)
1587                         //  or NULL pointers for no lines.
1588                         //  -> Substitute existing lines with pDefLine only if widths are 0.
1589                         SvxBoxItem aBoxItem ( *(const SvxBoxItem*)pItem );
1590                         if ( aBoxItem.GetTop() && aBoxItem.GetTop()->GetOutWidth() == 0 )
1591                             aBoxItem.SetLine( pDefLine, BOX_LINE_TOP );
1592                         if ( aBoxItem.GetBottom() && aBoxItem.GetBottom()->GetOutWidth() == 0 )
1593                             aBoxItem.SetLine( pDefLine, BOX_LINE_BOTTOM );
1594                         if ( aBoxItem.GetLeft() && aBoxItem.GetLeft()->GetOutWidth() == 0 )
1595                             aBoxItem.SetLine( pDefLine, BOX_LINE_LEFT );
1596                         if ( aBoxItem.GetRight() && aBoxItem.GetRight()->GetOutWidth() == 0 )
1597                             aBoxItem.SetLine( pDefLine, BOX_LINE_RIGHT );
1598                         pNewSet->Put( aBoxItem );
1599                         rReq.AppendItem( aBoxItem );
1600                     }
1601 
1602                     if ( pNewAttrs->GetItemState( ATTR_BORDER_INNER, sal_True, &pItem )
1603                          == SFX_ITEM_SET )
1604                     {
1605                         SvxBoxInfoItem aBoxInfoItem( *(const SvxBoxInfoItem*)pItem );
1606                         if ( aBoxInfoItem.GetHori() && aBoxInfoItem.GetHori()->GetOutWidth() == 0 )
1607                             aBoxInfoItem.SetLine( pDefLine, BOXINFO_LINE_HORI );
1608                         if ( aBoxInfoItem.GetVert() && aBoxInfoItem.GetVert()->GetOutWidth() == 0 )
1609                             aBoxInfoItem.SetLine( pDefLine, BOXINFO_LINE_VERT );
1610                         pNewSet->Put( aBoxInfoItem );
1611                         rReq.AppendItem( aBoxInfoItem );
1612                     }
1613                     else
1614                     {
1615                         SvxBoxInfoItem aBoxInfoItem( ATTR_BORDER_INNER );
1616                         aBoxInfoItem.SetLine( NULL, BOXINFO_LINE_HORI );
1617                         aBoxInfoItem.SetLine( NULL, BOXINFO_LINE_VERT );
1618                         pNewSet->Put( aBoxInfoItem );
1619                     }
1620 
1621                     pOldSet->Put( rBorderAttr );
1622                     pTabViewShell->ApplyAttributes( pNewSet, pOldSet );
1623 
1624                     delete pOldSet;
1625                     delete pNewSet;
1626                 }
1627                 break;
1628 
1629             // ATTR_BACKGROUND (=SID_ATTR_BRUSH) muss ueber zwei IDs
1630             // gesetzt werden:
1631             case SID_BACKGROUND_COLOR:
1632                 {
1633                     const SvxColorItem  rNewColorItem = (const SvxColorItem&)
1634                                             pNewAttrs->Get( SID_BACKGROUND_COLOR );
1635 
1636                     SvxBrushItem        aBrushItem( (const SvxBrushItem&)
1637                                             pTabViewShell->GetSelectionPattern()->
1638                                                 GetItem( ATTR_BACKGROUND ) );
1639 
1640                     aBrushItem.SetColor( rNewColorItem.GetValue() );
1641 
1642                     pTabViewShell->ApplyAttr( aBrushItem );
1643                 }
1644                 break;
1645 
1646                 case SID_ATTR_BRUSH:
1647                 {
1648                     SvxBrushItem        aBrushItem( (const SvxBrushItem&)
1649                                             pTabViewShell->GetSelectionPattern()->
1650                                                 GetItem( ATTR_BACKGROUND ) );
1651                     const SvxBrushItem& rNewBrushItem = (const SvxBrushItem&)
1652                                             pNewAttrs->Get( GetPool().GetWhich(nSlot) );
1653                     aBrushItem.SetColor(rNewBrushItem.GetColor());
1654                     pTabViewShell->ApplyAttr( aBrushItem );
1655                 }
1656                 break;
1657 
1658             case SID_ATTR_BORDER_SHADOW:
1659                 {
1660                     const SvxShadowItem& rNewShadowItem = (const SvxShadowItem&)
1661                                             pNewAttrs->Get( ATTR_SHADOW );
1662                     pTabViewShell->ApplyAttr( rNewShadowItem );
1663                 }
1664                 break;
1665 
1666             default:
1667             break;
1668         }
1669 
1670         if( ! rReq.IsAPI() )
1671             if( ! rReq.IsDone() )
1672                 rReq.Done();
1673     }
1674 }
1675 
1676 void ScFormatShell::GetAttrState( SfxItemSet& rSet )
1677 {
1678     ScTabViewShell* pTabViewShell   = GetViewData()->GetViewShell();
1679     const SfxItemSet&    rAttrSet   = pTabViewShell->GetSelectionPattern()->GetItemSet();
1680     const SvxBorderLine* pLine      = pTabViewShell->GetDefaultFrameLine();
1681     const SvxBrushItem&  rBrushItem = (const SvxBrushItem&)rAttrSet.Get( ATTR_BACKGROUND );
1682     SfxWhichIter aIter( rSet );
1683     sal_uInt16 nWhich = aIter.FirstWhich();
1684 
1685     rSet.Put( rAttrSet, sal_False );
1686 
1687     //  choose font info according to selection script type
1688     sal_uInt8 nScript = 0;      // GetSelectionScriptType never returns 0
1689     if ( rSet.GetItemState( ATTR_FONT ) != SFX_ITEM_UNKNOWN )
1690     {
1691         if (!nScript) nScript = pTabViewShell->GetSelectionScriptType();
1692         ScViewUtil::PutItemScript( rSet, rAttrSet, ATTR_FONT, nScript );
1693     }
1694     if ( rSet.GetItemState( ATTR_FONT_HEIGHT ) != SFX_ITEM_UNKNOWN )
1695     {
1696         if (!nScript) nScript = pTabViewShell->GetSelectionScriptType();
1697         ScViewUtil::PutItemScript( rSet, rAttrSet, ATTR_FONT_HEIGHT, nScript );
1698     }
1699 
1700     while ( nWhich )
1701     {
1702         switch(nWhich)
1703         {
1704             case SID_BACKGROUND_COLOR:
1705             {
1706                 rSet.Put( SvxColorItem( rBrushItem.GetColor(), SID_BACKGROUND_COLOR ) );
1707             }
1708             break;
1709             case SID_FRAME_LINECOLOR:
1710             {
1711                 rSet.Put( SvxColorItem( pLine ? pLine->GetColor() : Color(), SID_FRAME_LINECOLOR ) );
1712             }
1713             break;
1714             case SID_ATTR_BRUSH:
1715             {
1716                 rSet.Put( rBrushItem, GetPool().GetWhich(nWhich) );
1717             }
1718             break;
1719 /*          case SID_ATTR_ALIGN_LINEBREAK:
1720             {
1721                 const SfxBoolItem& rBreakItem = (const SfxBoolItem&)rAttrSet.Get( ATTR_LINEBREAK );
1722                 rSet.Put( rBreakItem, GetPool().GetWhich(nWhich) );
1723             }
1724             break;
1725 */
1726         }
1727         nWhich = aIter.NextWhich();
1728     }
1729 }
1730 
1731 //------------------------------------------------------------------
1732 
1733 void ScFormatShell::GetTextAttrState( SfxItemSet& rSet )
1734 {
1735     ScTabViewShell* pTabViewShell   = GetViewData()->GetViewShell();
1736     const SfxItemSet& rAttrSet  = pTabViewShell->GetSelectionPattern()->GetItemSet();
1737     rSet.Put( rAttrSet, sal_False ); // ItemStates mitkopieren
1738 
1739     //  choose font info according to selection script type
1740     sal_uInt8 nScript = 0;      // GetSelectionScriptType never returns 0
1741     if ( rSet.GetItemState( ATTR_FONT_WEIGHT ) != SFX_ITEM_UNKNOWN )
1742     {
1743         if (!nScript) nScript = pTabViewShell->GetSelectionScriptType();
1744         ScViewUtil::PutItemScript( rSet, rAttrSet, ATTR_FONT_WEIGHT, nScript );
1745     }
1746     if ( rSet.GetItemState( ATTR_FONT_POSTURE ) != SFX_ITEM_UNKNOWN )
1747     {
1748         if (!nScript) nScript = pTabViewShell->GetSelectionScriptType();
1749         ScViewUtil::PutItemScript( rSet, rAttrSet, ATTR_FONT_POSTURE, nScript );
1750     }
1751 
1752     SfxItemState eState;
1753 //  const SfxPoolItem* pItem;
1754 
1755     //--------------------------------------------------------------------
1756     // eigene Kontrolle ueber RadioButton-Funktionalitaet:
1757     //--------------------------------------------------------------------
1758     // Unterstreichung
1759     //------------------------
1760 
1761     eState = rAttrSet.GetItemState( ATTR_FONT_UNDERLINE, sal_True );
1762     if ( eState == SFX_ITEM_DONTCARE )
1763     {
1764         rSet.InvalidateItem( SID_ULINE_VAL_NONE );
1765         rSet.InvalidateItem( SID_ULINE_VAL_SINGLE );
1766         rSet.InvalidateItem( SID_ULINE_VAL_DOUBLE );
1767         rSet.InvalidateItem( SID_ULINE_VAL_DOTTED );
1768     }
1769     else
1770     {
1771         FontUnderline eUnderline = ((const SvxUnderlineItem&)
1772                     rAttrSet.Get(ATTR_FONT_UNDERLINE)).GetLineStyle();
1773         sal_uInt16 nId = SID_ULINE_VAL_NONE;
1774         switch (eUnderline)
1775         {
1776             case UNDERLINE_SINGLE:  nId = SID_ULINE_VAL_SINGLE; break;
1777             case UNDERLINE_DOUBLE:  nId = SID_ULINE_VAL_DOUBLE; break;
1778             case UNDERLINE_DOTTED:  nId = SID_ULINE_VAL_DOTTED; break;
1779             default:
1780                 break;
1781         }
1782         rSet.Put( SfxBoolItem( nId, sal_True ) );
1783     }
1784 
1785     //------------------------
1786     // horizontale Ausrichtung
1787     //------------------------
1788 
1789     const SvxHorJustifyItem* pHorJustify = NULL;
1790     const SvxVerJustifyItem* pVerJustify = NULL;
1791     SvxCellHorJustify        eHorJustify = SVX_HOR_JUSTIFY_STANDARD;
1792     SvxCellVerJustify        eVerJustify = SVX_VER_JUSTIFY_STANDARD;
1793     sal_uInt16                   nWhich      = 0;
1794     sal_Bool                     bJustifyStd = sal_False;
1795     SfxBoolItem              aBoolItem   ( 0, sal_True );
1796 
1797     eState   = rAttrSet.GetItemState( ATTR_HOR_JUSTIFY, sal_True,
1798                                         (const SfxPoolItem**)&pHorJustify );
1799     switch ( eState )
1800     {
1801         case SFX_ITEM_SET:
1802             {
1803                 eHorJustify = SvxCellHorJustify( pHorJustify->GetValue() );
1804 
1805                 switch ( SvxCellHorJustify( pHorJustify->GetValue() ) )
1806                 {
1807                     case SVX_HOR_JUSTIFY_STANDARD:
1808                         break;
1809 
1810                     case SVX_HOR_JUSTIFY_LEFT:
1811                         nWhich = SID_ALIGNLEFT;
1812                         break;
1813 
1814                     case SVX_HOR_JUSTIFY_RIGHT:
1815                         nWhich = SID_ALIGNRIGHT;
1816                         break;
1817 
1818                     case SVX_HOR_JUSTIFY_CENTER:
1819                         nWhich = SID_ALIGNCENTERHOR;
1820                         break;
1821 
1822                     case SVX_HOR_JUSTIFY_BLOCK:
1823                         nWhich = SID_ALIGNBLOCK;
1824                         break;
1825 
1826                     case SVX_HOR_JUSTIFY_REPEAT:
1827                     default:
1828                         bJustifyStd = sal_True;
1829                         break;
1830                 }
1831             }
1832             break;
1833 
1834         case SFX_ITEM_DONTCARE:
1835             rSet.InvalidateItem( SID_ALIGNLEFT );
1836             rSet.InvalidateItem( SID_ALIGNRIGHT );
1837             rSet.InvalidateItem( SID_ALIGNCENTERHOR );
1838             rSet.InvalidateItem( SID_ALIGNBLOCK );
1839             break;
1840 
1841         default:
1842             bJustifyStd = sal_True;
1843             break;
1844     }
1845 
1846     if ( nWhich )
1847     {
1848         aBoolItem.SetWhich( nWhich );
1849         rSet.Put( aBoolItem );
1850     }
1851     else if ( bJustifyStd )
1852     {
1853         aBoolItem.SetValue( sal_False );
1854         aBoolItem.SetWhich( SID_ALIGNLEFT );      rSet.Put( aBoolItem );
1855         aBoolItem.SetWhich( SID_ALIGNRIGHT );     rSet.Put( aBoolItem );
1856         aBoolItem.SetWhich( SID_ALIGNCENTERHOR ); rSet.Put( aBoolItem );
1857         aBoolItem.SetWhich( SID_ALIGNBLOCK );     rSet.Put( aBoolItem );
1858         bJustifyStd = sal_False;
1859     }
1860 
1861     //------------------------
1862     // vertikale Ausrichtung
1863     //------------------------
1864 
1865     nWhich = 0;
1866     aBoolItem.SetValue( sal_True );
1867 
1868     eState = rAttrSet.GetItemState( ATTR_VER_JUSTIFY, sal_True,
1869                                     (const SfxPoolItem**)&pVerJustify );
1870 
1871     switch ( eState )
1872     {
1873         case SFX_ITEM_SET:
1874             {
1875                 eVerJustify = SvxCellVerJustify( pVerJustify->GetValue() );
1876 
1877                 switch ( eVerJustify )
1878                 {
1879                     case SVX_VER_JUSTIFY_TOP:
1880                         nWhich = SID_ALIGNTOP;
1881                         break;
1882 
1883                     case SVX_VER_JUSTIFY_BOTTOM:
1884                         nWhich = SID_ALIGNBOTTOM;
1885                         break;
1886 
1887                     case SVX_VER_JUSTIFY_CENTER:
1888                         nWhich = SID_ALIGNCENTERVER;
1889                         break;
1890 
1891                     case SVX_VER_JUSTIFY_STANDARD:
1892                     default:
1893                         bJustifyStd = sal_True;
1894                         break;
1895                 }
1896             }
1897             break;
1898 
1899         case SFX_ITEM_DONTCARE:
1900             rSet.InvalidateItem( SID_ALIGNTOP );
1901             rSet.InvalidateItem( SID_ALIGNBOTTOM );
1902             rSet.InvalidateItem( SID_ALIGNCENTERVER );
1903             break;
1904 
1905         default:
1906             bJustifyStd = sal_True;
1907             break;
1908     }
1909 
1910     if ( nWhich )
1911     {
1912         aBoolItem.SetWhich( nWhich );
1913         rSet.Put( aBoolItem );
1914     }
1915     else if ( bJustifyStd )
1916     {
1917         aBoolItem.SetValue( sal_False );
1918         aBoolItem.SetWhich( SID_ALIGNTOP );       rSet.Put( aBoolItem );
1919         aBoolItem.SetWhich( SID_ALIGNBOTTOM );    rSet.Put( aBoolItem );
1920         aBoolItem.SetWhich( SID_ALIGNCENTERVER ); rSet.Put( aBoolItem );
1921     }
1922 }
1923 
1924 
1925 //------------------------------------------------------------------
1926 
1927 void ScFormatShell::GetBorderState( SfxItemSet& rSet )
1928 {
1929     ScTabViewShell* pTabViewShell   = GetViewData()->GetViewShell();
1930     SvxBoxItem      aBoxItem( ATTR_BORDER );
1931     SvxBoxInfoItem  aInfoItem( ATTR_BORDER_INNER );
1932 
1933     pTabViewShell->GetSelectionFrame( aBoxItem, aInfoItem );
1934 
1935     if ( rSet.GetItemState( ATTR_BORDER ) != SFX_ITEM_UNKNOWN )
1936         rSet.Put( aBoxItem );
1937     if ( rSet.GetItemState( ATTR_BORDER_INNER ) != SFX_ITEM_UNKNOWN )
1938         rSet.Put( aInfoItem );
1939 }
1940 
1941 //------------------------------------------------------------------
1942 
1943 void ScFormatShell::GetAlignState( SfxItemSet& rSet )
1944 {
1945     ScTabViewShell* pTabViewShell   = GetViewData()->GetViewShell();
1946     const SfxItemSet& rAttrSet    = pTabViewShell->GetSelectionPattern()->GetItemSet();
1947     SfxWhichIter    aIter(rSet);
1948     sal_uInt16          nWhich = aIter.FirstWhich();
1949 
1950     SvxCellHorJustify eHAlign = SVX_HOR_JUSTIFY_STANDARD;
1951     bool bHasHAlign = rAttrSet.GetItemState( ATTR_HOR_JUSTIFY ) != SFX_ITEM_DONTCARE;
1952     if( bHasHAlign )
1953         eHAlign = (SvxCellHorJustify)((const SvxHorJustifyItem&) rAttrSet.Get( ATTR_HOR_JUSTIFY )).GetValue();
1954 
1955     SvxCellVerJustify eVAlign = SVX_VER_JUSTIFY_STANDARD;
1956     bool bHasVAlign = rAttrSet.GetItemState( ATTR_VER_JUSTIFY ) != SFX_ITEM_DONTCARE;
1957     if( bHasVAlign )
1958         eVAlign = (SvxCellVerJustify)((const SvxVerJustifyItem&) rAttrSet.Get( ATTR_VER_JUSTIFY )).GetValue();
1959 
1960     while ( nWhich )
1961     {
1962         switch ( nWhich )
1963         {
1964             case SID_H_ALIGNCELL:
1965                 if ( bHasHAlign )
1966                     rSet.Put( SvxHorJustifyItem( eHAlign, nWhich ));
1967             break;
1968             case SID_V_ALIGNCELL:
1969                 if ( bHasVAlign )
1970                     rSet.Put( SvxVerJustifyItem( eVAlign, nWhich ));
1971             break;
1972 
1973             // pseudo slots for Format menu
1974             case SID_ALIGN_ANY_HDEFAULT:
1975             case SID_ALIGN_ANY_LEFT:
1976             case SID_ALIGN_ANY_HCENTER:
1977             case SID_ALIGN_ANY_RIGHT:
1978             case SID_ALIGN_ANY_JUSTIFIED:
1979                 rSet.Put( SfxBoolItem( nWhich, bHasHAlign && (eHAlign == lclConvertSlotToHAlign( nWhich )) ) );
1980             break;
1981             case SID_ALIGN_ANY_VDEFAULT:
1982             case SID_ALIGN_ANY_TOP:
1983             case SID_ALIGN_ANY_VCENTER:
1984             case SID_ALIGN_ANY_BOTTOM:
1985                 rSet.Put( SfxBoolItem( nWhich, bHasVAlign && (eVAlign == lclConvertSlotToVAlign( nWhich )) ) );
1986             break;
1987         }
1988         nWhich = aIter.NextWhich();
1989     }
1990 }
1991 
1992 void ScFormatShell::GetNumFormatState( SfxItemSet& rSet )
1993 {
1994     ScTabViewShell* pTabViewShell   = GetViewData()->GetViewShell();
1995 
1996     // ScViewData* pViewData   = GetViewData();
1997     ScDocument* pDoc        = pViewData->GetDocument();
1998 
1999     SfxWhichIter aIter(rSet);
2000     sal_uInt16 nWhich = aIter.FirstWhich();
2001     while ( nWhich )
2002     {
2003         switch ( nWhich )
2004         {
2005             case SID_NUMBER_FORMAT:
2006                 {
2007                     String aFormatCode;         // bleibt leer, wenn dont-care
2008 
2009                     const SfxItemSet& rAttrSet  = pTabViewShell->GetSelectionPattern()->GetItemSet();
2010                     if ( rAttrSet.GetItemState( ATTR_VALUE_FORMAT ) != SFX_ITEM_DONTCARE )
2011                     {
2012                         sal_uLong nNumberFormat = ((const SfxUInt32Item&)rAttrSet.Get(
2013                                                     ATTR_VALUE_FORMAT )).GetValue();
2014 
2015                         SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
2016                         const SvNumberformat* pFormatEntry = pFormatter->GetEntry( nNumberFormat );
2017                         if ( pFormatEntry )
2018                             aFormatCode = pFormatEntry->GetFormatstring();
2019                     }
2020 
2021                     rSet.Put( SfxStringItem( nWhich, aFormatCode ) );
2022                 }
2023                 break;
2024 
2025         }
2026         nWhich = aIter.NextWhich();
2027     }
2028 }
2029 
2030 
2031 void ScFormatShell::ExecuteTextDirection( SfxRequest& rReq )
2032 {
2033     ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell();
2034     pTabViewShell->HideListBox();               // Autofilter-DropDown-Listbox
2035     if ( GetViewData()->HasEditView( GetViewData()->GetActivePart() ) )
2036     {
2037         SC_MOD()->InputEnterHandler();
2038         pTabViewShell->UpdateInputHandler();
2039     }
2040 
2041     sal_uInt16 nSlot = rReq.GetSlot();
2042     switch( nSlot )
2043     {
2044         case SID_TEXTDIRECTION_LEFT_TO_RIGHT:
2045         case SID_TEXTDIRECTION_TOP_TO_BOTTOM:
2046         {
2047             sal_Bool bVert = (nSlot == SID_TEXTDIRECTION_TOP_TO_BOTTOM);
2048             ScPatternAttr aAttr( GetViewData()->GetDocument()->GetPool() );
2049             SfxItemSet& rItemSet = aAttr.GetItemSet();
2050             rItemSet.Put( SfxBoolItem( ATTR_STACKED, bVert ) );
2051             rItemSet.Put( SfxBoolItem( ATTR_VERTICAL_ASIAN, bVert ) );
2052             pTabViewShell->ApplySelectionPattern( aAttr );
2053             pTabViewShell->AdjustBlockHeight();
2054         }
2055         break;
2056 
2057         case SID_ATTR_PARA_LEFT_TO_RIGHT:
2058         case SID_ATTR_PARA_RIGHT_TO_LEFT:
2059         {
2060             SvxFrameDirection eDirection = ( nSlot == SID_ATTR_PARA_LEFT_TO_RIGHT ) ?
2061                                                 FRMDIR_HORI_LEFT_TOP : FRMDIR_HORI_RIGHT_TOP;
2062             pTabViewShell->ApplyAttr( SvxFrameDirectionItem( eDirection, ATTR_WRITINGDIR ) );
2063         }
2064         break;
2065     }
2066 }
2067 
2068 void ScFormatShell::GetTextDirectionState( SfxItemSet& rSet )
2069 {
2070     ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell();
2071     const SfxItemSet& rAttrSet = pTabViewShell->GetSelectionPattern()->GetItemSet();
2072 
2073     sal_Bool bVertDontCare =
2074         (rAttrSet.GetItemState( ATTR_VERTICAL_ASIAN ) == SFX_ITEM_DONTCARE) ||
2075         (rAttrSet.GetItemState( ATTR_STACKED ) == SFX_ITEM_DONTCARE);
2076     sal_Bool bLeftRight = !bVertDontCare &&
2077         !((const SfxBoolItem&) rAttrSet.Get( ATTR_STACKED )).GetValue();
2078     sal_Bool bTopBottom = !bVertDontCare && !bLeftRight &&
2079         ((const SfxBoolItem&) rAttrSet.Get( ATTR_VERTICAL_ASIAN )).GetValue();
2080 
2081     sal_Bool bBidiDontCare = (rAttrSet.GetItemState( ATTR_WRITINGDIR ) == SFX_ITEM_DONTCARE);
2082     EEHorizontalTextDirection eBidiDir = EE_HTEXTDIR_DEFAULT;
2083     if ( !bBidiDontCare )
2084     {
2085         SvxFrameDirection eCellDir = (SvxFrameDirection)((const SvxFrameDirectionItem&)
2086                                         rAttrSet.Get( ATTR_WRITINGDIR )).GetValue();
2087         if ( eCellDir == FRMDIR_ENVIRONMENT )
2088             eBidiDir = (EEHorizontalTextDirection)GetViewData()->GetDocument()->
2089                                 GetEditTextDirection( GetViewData()->GetTabNo() );
2090         else if ( eCellDir == FRMDIR_HORI_RIGHT_TOP )
2091             eBidiDir = EE_HTEXTDIR_R2L;
2092         else
2093             eBidiDir = EE_HTEXTDIR_L2R;
2094     }
2095 
2096     SvtLanguageOptions  aLangOpt;
2097     sal_Bool bDisableCTLFont = !aLangOpt.IsCTLFontEnabled();
2098     sal_Bool bDisableVerticalText = !aLangOpt.IsVerticalTextEnabled();
2099 
2100     SfxWhichIter aIter( rSet );
2101     sal_uInt16 nWhich = aIter.FirstWhich();
2102     while( nWhich )
2103     {
2104         switch( nWhich )
2105         {
2106             case SID_TEXTDIRECTION_LEFT_TO_RIGHT:
2107             case SID_TEXTDIRECTION_TOP_TO_BOTTOM:
2108                 if ( bDisableVerticalText )
2109                     rSet.DisableItem( nWhich );
2110                 else
2111                 {
2112                     if( bVertDontCare )
2113                         rSet.InvalidateItem( nWhich );
2114                     else if ( nWhich == SID_TEXTDIRECTION_LEFT_TO_RIGHT )
2115                         rSet.Put( SfxBoolItem( nWhich, bLeftRight ) );
2116                     else
2117                         rSet.Put( SfxBoolItem( nWhich, bTopBottom ) );
2118                 }
2119             break;
2120 
2121             case SID_ATTR_PARA_LEFT_TO_RIGHT:
2122             case SID_ATTR_PARA_RIGHT_TO_LEFT:
2123                 if ( bDisableCTLFont )
2124                     rSet.DisableItem( nWhich );
2125                 else
2126                 {
2127                     if ( bTopBottom )
2128                         rSet.DisableItem( nWhich );
2129                     else if ( bBidiDontCare )
2130                         rSet.InvalidateItem( nWhich );
2131                     else if ( nWhich == SID_ATTR_PARA_LEFT_TO_RIGHT )
2132                         rSet.Put( SfxBoolItem( nWhich, eBidiDir == EE_HTEXTDIR_L2R ) );
2133                     else
2134                         rSet.Put( SfxBoolItem( nWhich, eBidiDir == EE_HTEXTDIR_R2L ) );
2135                 }
2136         }
2137         nWhich = aIter.NextWhich();
2138     }
2139 }
2140 
2141 void ScFormatShell::ExecFormatPaintbrush( SfxRequest& rReq )
2142 {
2143     ScViewFunc* pView = pViewData->GetView();
2144     if ( pView->HasPaintBrush() )
2145     {
2146         // cancel paintbrush mode
2147         pView->ResetBrushDocument();
2148     }
2149     else
2150     {
2151         sal_Bool bLock = sal_False;
2152         const SfxItemSet *pArgs = rReq.GetArgs();
2153         if( pArgs && pArgs->Count() >= 1 )
2154             bLock = static_cast<const SfxBoolItem&>(pArgs->Get(SID_FORMATPAINTBRUSH)).GetValue();
2155 
2156         // in case of multi selection, deselect all and use the cursor position
2157         ScRange aDummy;
2158         if ( pViewData->GetSimpleArea(aDummy) != SC_MARK_SIMPLE )
2159             pView->Unmark();
2160 
2161         ScDocument* pBrushDoc = new ScDocument( SCDOCMODE_CLIP );
2162         pView->CopyToClip( pBrushDoc, sal_False, sal_True );
2163         pView->SetBrushDocument( pBrushDoc, bLock );
2164     }
2165 }
2166 
2167 void ScFormatShell::StateFormatPaintbrush( SfxItemSet& rSet )
2168 {
2169     if ( pViewData->HasEditView( pViewData->GetActivePart() ) )
2170         rSet.DisableItem( SID_FORMATPAINTBRUSH );
2171     else
2172         rSet.Put( SfxBoolItem( SID_FORMATPAINTBRUSH, pViewData->GetView()->HasPaintBrush() ) );
2173 }
2174 
2175