xref: /trunk/main/sd/source/ui/view/drtxtob1.cxx (revision bfaba8a2bfbeecb976bed59dc67e51a3365db0fb)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26 
27 #include "TextObjectBar.hxx"
28 
29 
30 #include <svx/svxids.hrc>
31 
32 #include <editeng/editview.hxx>
33 #include <editeng/editeng.hxx>
34 #include <editeng/unolingu.hxx>
35 #include <editeng/outliner.hxx>
36 #include <editeng/ulspitem.hxx>
37 #include <editeng/lspcitem.hxx>
38 #include <editeng/adjitem.hxx>
39 #include <vcl/vclenum.hxx>
40 #include <sfx2/app.hxx>
41 #include <svl/whiter.hxx>
42 #include <svl/itempool.hxx>
43 #include <svl/style.hxx>
44 #include <sfx2/tplpitem.hxx>
45 #include <sfx2/request.hxx>
46 #include <sfx2/viewfrm.hxx>
47 #include <sfx2/dispatch.hxx>
48 #include <editeng/escpitem.hxx>
49 #include <editeng/wghtitem.hxx>
50 #include <editeng/postitem.hxx>
51 #include <editeng/udlnitem.hxx>
52 #include <editeng/crsditem.hxx>
53 #include <editeng/cntritem.hxx>
54 #include <editeng/shdditem.hxx>
55 #include <svx/xtable.hxx>
56 #include <svx/svdobj.hxx>
57 #include <editeng/outlobj.hxx>
58 #include <editeng/flstitem.hxx>
59 #include <editeng/editeng.hxx>
60 #include <svl/intitem.hxx>
61 #include <editeng/scripttypeitem.hxx>
62 #include <svx/svdoutl.hxx>
63 #include <editeng/writingmodeitem.hxx>
64 #include <editeng/frmdiritem.hxx>
65 #include <svl/itemiter.hxx>
66 
67 
68 #include "app.hrc"
69 
70 #include "eetext.hxx"
71 #include "ViewShell.hxx"
72 #include "drawview.hxx"
73 #include "drawdoc.hxx"
74 #include "OutlineView.hxx"
75 #include "Window.hxx"
76 #include "futempl.hxx"
77 #include "DrawDocShell.hxx"
78 #include "Outliner.hxx"
79 #include "futext.hxx"
80 
81 namespace sd {
82 
83 /*************************************************************************
84 |*
85 |* Bearbeitung der SfxRequests
86 |*
87 \************************************************************************/
88 
89 void TextObjectBar::Execute( SfxRequest &rReq )
90 {
91     const SfxItemSet* pArgs = rReq.GetArgs();
92     const SfxPoolItem* pPoolItem = NULL;
93     sal_uInt16 nSlot = rReq.GetSlot();
94     sal_Bool bOutlineMode = sal_False;
95     OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
96 
97     std::auto_ptr< OutlineViewModelChangeGuard > aGuard;
98 
99     if (mpView->ISA(OutlineView))
100     {
101         bOutlineMode = sal_True;
102         pOLV = static_cast<OutlineView*>(mpView)
103             ->GetViewByWindow(mpViewShell->GetActiveWindow());
104 
105         aGuard.reset( new OutlineViewModelChangeGuard( static_cast<OutlineView&>(*mpView) ) );
106     }
107 
108     switch (nSlot)
109     {
110         case SID_STYLE_APPLY:
111         {
112             if( pArgs )
113             {
114                 SdDrawDocument* pDoc = mpView->GetDoc();
115                 OSL_ASSERT (mpViewShell->GetViewShell()!=NULL);
116                 FunctionReference xFunc( FuTemplate::Create( mpViewShell, static_cast< ::sd::Window*>( mpViewShell->GetViewShell()->GetWindow()), mpView, pDoc, rReq ) );
117 
118                 if(xFunc.is())
119                 {
120                     xFunc->Activate();
121                     xFunc->Deactivate();
122 
123                     if( rReq.GetSlot() == SID_STYLE_APPLY )
124                     {
125                         if( mpViewShell && mpViewShell->GetViewFrame() )
126                             mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_STYLE_APPLY );
127                     }
128                 }
129             }
130             else
131             {
132                 if( mpViewShell && mpViewShell->GetViewFrame() )
133                     mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_STYLE_DESIGNER, SFX_CALLMODE_ASYNCHRON );
134             }
135 
136             rReq.Done();
137         }
138         break;
139 
140         case SID_PARASPACE_INCREASE:
141         case SID_PARASPACE_DECREASE:
142         {
143             if( pOLV )
144             {
145                 ESelection aSel = pOLV->GetSelection();
146                 aSel.Adjust();
147                 sal_uLong nStartPara = aSel.nStartPara;
148                 sal_uLong nEndPara = aSel.nEndPara;
149                 if( !aSel.HasRange() )
150                 {
151                     nStartPara = 0;
152                     nEndPara = pOLV->GetOutliner()->GetParagraphCount() - 1;
153                 }
154                 for( sal_uLong nPara = nStartPara; nPara <= nEndPara; nPara++ )
155                 {
156                     SfxStyleSheet* pStyleSheet = NULL;
157                     if (pOLV->GetOutliner() != NULL)
158                         pStyleSheet = pOLV->GetOutliner()->GetStyleSheet(nPara);
159                     if (pStyleSheet != NULL)
160                     {
161                         SfxItemSet aAttr( pStyleSheet->GetItemSet() );
162                         SfxItemSet aTmpSet( pOLV->GetOutliner()->GetParaAttribs( (sal_uInt16) nPara ) );
163                         aAttr.Put( aTmpSet, sal_False ); // sal_False= InvalidItems nicht als Default, sondern als "Loecher" betrachten
164                         const SvxULSpaceItem& rItem = (const SvxULSpaceItem&) aAttr.Get( EE_PARA_ULSPACE );
165                         SvxULSpaceItem* pNewItem = (SvxULSpaceItem*) rItem.Clone();
166 
167                         long nUpper = pNewItem->GetUpper();
168                         if( nSlot == SID_PARASPACE_INCREASE )
169                             nUpper += 100;
170                         else
171                         {
172                             nUpper -= 100;
173                             nUpper = Max( (long) nUpper, 0L );
174                         }
175                         pNewItem->SetUpper( (sal_uInt16) nUpper );
176 
177                         long nLower = pNewItem->GetLower();
178                         if( nSlot == SID_PARASPACE_INCREASE )
179                             nLower += 100;
180                         else
181                         {
182                             nLower -= 100;
183                             nLower = Max( (long) nLower, 0L );
184                         }
185                         pNewItem->SetLower( (sal_uInt16) nLower );
186 
187                         SfxItemSet aNewAttrs( aAttr );
188                         aNewAttrs.Put( *pNewItem );
189                         delete pNewItem;
190                         pOLV->GetOutliner()->SetParaAttribs( (sal_uInt16)nPara, aNewAttrs );
191                     }
192                 }
193             }
194             else
195             {
196                 // Der folgende Code kann enabled werden, wenn ich von
197                 // JOE einen richtigen Status (DontCare) bekomme;
198 
199                 // Wird enabled, obwohl es nicht richtig funktioniert (s.o.)
200                 SfxItemSet aEditAttr( mpView->GetDoc()->GetPool() );
201                 mpView->GetAttributes( aEditAttr );
202                 if( aEditAttr.GetItemState( EE_PARA_ULSPACE ) >= SFX_ITEM_AVAILABLE )
203                 {
204                     SfxItemSet aNewAttrs(*(aEditAttr.GetPool()), aEditAttr.GetRanges());
205                     const SvxULSpaceItem& rItem = (const SvxULSpaceItem&) aEditAttr.Get( EE_PARA_ULSPACE );
206                     SvxULSpaceItem* pNewItem = (SvxULSpaceItem*) rItem.Clone();
207                     long nUpper = pNewItem->GetUpper();
208 
209                     if( nSlot == SID_PARASPACE_INCREASE )
210                         nUpper += 100;
211                     else
212                     {
213                         nUpper -= 100;
214                         nUpper = Max( (long) nUpper, 0L );
215                     }
216                     pNewItem->SetUpper( (sal_uInt16) nUpper );
217 
218                     long nLower = pNewItem->GetLower();
219                     if( nSlot == SID_PARASPACE_INCREASE )
220                         nLower += 100;
221                     else
222                     {
223                         nLower -= 100;
224                         nLower = Max( (long) nLower, 0L );
225                     }
226                     pNewItem->SetLower( (sal_uInt16) nLower );
227 
228                     aNewAttrs.Put( *pNewItem );
229                     delete pNewItem;
230 
231                     mpView->SetAttributes( aNewAttrs );
232                 }
233             }
234             rReq.Done();
235 
236             Invalidate();
237             // Um die Preview (im Gliederungsmodus) zu aktualisieren muss
238             // der Slot invalidiert werden:
239             mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, sal_True, sal_False );
240         }
241         break;
242 
243         case SID_OUTLINE_LEFT:
244         case SID_ATTR_PARA_LEFT:
245         {
246             if (pOLV)
247             {
248                 pOLV->AdjustDepth( -1 );
249 
250                 // Ensure bold/italic etc. icon state updates
251                 Invalidate();
252                 // #96551# trigger preview refresh
253                 mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, sal_True, sal_False );
254             }
255             rReq.Done();
256         }
257         break;
258 
259         case SID_OUTLINE_RIGHT:
260         case SID_ATTR_PARA_RIGHT:
261         {
262             if (pOLV)
263             {
264                 pOLV->AdjustDepth( 1 );
265 
266                 // Ensure bold/italic etc. icon state updates
267                 Invalidate();
268                 // #96551# trigger preview refresh
269                 mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, sal_True, sal_False );
270             }
271             rReq.Done();
272         }
273         break;
274 
275         case SID_ATTR_PARA_LRSPACE:
276         {
277             sal_uInt16 nSlot = SID_ATTR_PARA_LRSPACE;
278             SvxLRSpaceItem aLRSpace = (const SvxLRSpaceItem&)pArgs->Get(
279                 GetPool().GetWhich(nSlot));
280 
281             SfxItemSet aEditAttr( GetPool(), EE_PARA_LRSPACE, EE_PARA_LRSPACE );
282             aLRSpace.SetWhich( EE_PARA_LRSPACE );
283 
284             aEditAttr.Put( aLRSpace );
285             mpView->SetAttributes( aEditAttr );
286 
287             Invalidate(SID_ATTR_PARA_LRSPACE);
288         }
289         break;
290 
291         case SID_OUTLINE_UP:
292         {
293             if (pOLV)
294             {
295                 pOLV->AdjustHeight( -1 );
296 
297                 // #96551# trigger preview refresh
298                 mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, sal_True, sal_False );
299             }
300             rReq.Done();
301         }
302         break;
303 
304         case SID_OUTLINE_DOWN:
305         {
306             if (pOLV)
307             {
308                 pOLV->AdjustHeight( 1 );
309 
310                 // #96551# trigger preview refresh
311                 mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, sal_True, sal_False );
312             }
313             rReq.Done();
314         }
315         break;
316 
317         case SID_TEXTDIRECTION_LEFT_TO_RIGHT:
318         case SID_TEXTDIRECTION_TOP_TO_BOTTOM:
319         {
320             mpView->SdrEndTextEdit();
321             SfxItemSet aAttr( mpView->GetDoc()->GetPool(), SDRATTR_TEXTDIRECTION, SDRATTR_TEXTDIRECTION, 0 );
322             aAttr.Put( SvxWritingModeItem(
323                 nSlot == SID_TEXTDIRECTION_LEFT_TO_RIGHT ?
324                     com::sun::star::text::WritingMode_LR_TB : com::sun::star::text::WritingMode_TB_RL,
325                     SDRATTR_TEXTDIRECTION ) );
326             rReq.Done( aAttr );
327             mpView->SetAttributes( aAttr );
328             Invalidate();
329             mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, sal_True, sal_False );
330         }
331         break;
332 
333         case FN_NUM_BULLET_ON:
334             if( pOLV )
335                 pOLV->ToggleBullets();
336         break;
337 
338         case SID_GROW_FONT_SIZE:
339         case SID_SHRINK_FONT_SIZE:
340         {
341             const SvxFontListItem* pFonts = (const SvxFontListItem*)mpViewShell->GetDocSh()->GetItem( SID_ATTR_CHAR_FONTLIST );
342             const FontList* pFontList = pFonts ? pFonts->GetFontList(): 0;
343             if( pFontList )
344             {
345                 FuText::ChangeFontSize( nSlot == SID_GROW_FONT_SIZE, pOLV, pFontList, mpView );
346                 mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_CHAR_FONTHEIGHT );
347             }
348             rReq.Done();
349         }
350         break;
351 
352         case SID_THES:
353         {
354             String aReplaceText;
355             SFX_REQUEST_ARG( rReq, pItem2, SfxStringItem, SID_THES, sal_False );
356             if (pItem2)
357                 aReplaceText = pItem2->GetValue();
358             if (aReplaceText.Len() > 0)
359                 ReplaceTextWithSynonym( pOLV->GetEditView(), aReplaceText );
360         }
361         break;
362 
363         default:
364         {
365             SfxItemSet aEditAttr( mpView->GetDoc()->GetPool() );
366             mpView->GetAttributes( aEditAttr );
367             SfxItemSet aNewAttr(*(aEditAttr.GetPool()), aEditAttr.GetRanges());
368 
369             if( !pArgs )
370             {
371                 //aNewAttr.InvalidateAllItems(); <- Macht Probleme (#35465#)
372 
373                 switch ( nSlot )
374                 {
375                     case SID_ATTR_CHAR_WEIGHT:
376                     {
377                         FontWeight eFW = ( (const SvxWeightItem&) aEditAttr.
378                                         Get( EE_CHAR_WEIGHT ) ).GetWeight();
379                         aNewAttr.Put( SvxWeightItem( eFW == WEIGHT_NORMAL ?
380                                             WEIGHT_BOLD : WEIGHT_NORMAL,
381                                             EE_CHAR_WEIGHT ) );
382                     }
383                     break;
384                     case SID_ATTR_CHAR_POSTURE:
385                     {
386                         FontItalic eFI = ( (const SvxPostureItem&) aEditAttr.
387                                         Get( EE_CHAR_ITALIC ) ).GetPosture();
388                         aNewAttr.Put( SvxPostureItem( eFI == ITALIC_NORMAL ?
389                                             ITALIC_NONE : ITALIC_NORMAL,
390                                             EE_CHAR_ITALIC ) );
391                     }
392                     break;
393                     case SID_ATTR_CHAR_UNDERLINE:
394                     {
395                         FontUnderline eFU = ( (const SvxUnderlineItem&) aEditAttr.
396                                         Get( EE_CHAR_UNDERLINE ) ).GetLineStyle();
397                         aNewAttr.Put( SvxUnderlineItem( eFU == UNDERLINE_SINGLE ?
398                                             UNDERLINE_NONE : UNDERLINE_SINGLE,
399                                             EE_CHAR_UNDERLINE ) );
400                     }
401                     break;
402                     case SID_ATTR_CHAR_OVERLINE:
403                     {
404                         FontUnderline eFO = ( (const SvxOverlineItem&) aEditAttr.
405                                         Get( EE_CHAR_OVERLINE ) ).GetLineStyle();
406                         aNewAttr.Put( SvxOverlineItem( eFO == UNDERLINE_SINGLE ?
407                                             UNDERLINE_NONE : UNDERLINE_SINGLE,
408                                             EE_CHAR_OVERLINE ) );
409                     }
410                     break;
411                     case SID_ATTR_CHAR_CONTOUR:
412                     {
413                         aNewAttr.Put( SvxContourItem( !( (const SvxContourItem&) aEditAttr.
414                                         Get( EE_CHAR_OUTLINE ) ).GetValue(), EE_CHAR_OUTLINE ) );
415                     }
416                     break;
417                     case SID_ATTR_CHAR_SHADOWED:
418                     {
419                         aNewAttr.Put( SvxShadowedItem( !( (const SvxShadowedItem&) aEditAttr.
420                                         Get( EE_CHAR_SHADOW ) ).GetValue(), EE_CHAR_SHADOW ) );
421                     }
422                     break;
423                     case SID_ATTR_CHAR_STRIKEOUT:
424                     {
425                         FontStrikeout eFSO = ( ( (const SvxCrossedOutItem&) aEditAttr.
426                                         Get( EE_CHAR_STRIKEOUT ) ).GetStrikeout() );
427                         aNewAttr.Put( SvxCrossedOutItem( eFSO == STRIKEOUT_SINGLE ?
428                                             STRIKEOUT_NONE : STRIKEOUT_SINGLE, EE_CHAR_STRIKEOUT ) );
429                     }
430                     break;
431 
432                     case SID_ATTR_PARA_ADJUST_LEFT:
433                     {
434                         aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_LEFT, EE_PARA_JUST ) );
435                     }
436                     break;
437                     case SID_ATTR_PARA_ADJUST_CENTER:
438                     {
439                         aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_CENTER, EE_PARA_JUST ) );
440                     }
441                     break;
442                     case SID_ATTR_PARA_ADJUST_RIGHT:
443                     {
444                         aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_RIGHT, EE_PARA_JUST ) );
445                     }
446                     break;
447                     case SID_ATTR_PARA_ADJUST_BLOCK:
448                     {
449                         aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_BLOCK, EE_PARA_JUST ) );
450                     }
451                     break;
452                     case SID_ATTR_PARA_LINESPACE_10:
453                     {
454                         SvxLineSpacingItem aItem( SVX_LINESPACE_ONE_LINE, EE_PARA_SBL );
455                         aItem.SetPropLineSpace( 100 );
456                         aNewAttr.Put( aItem );
457                     }
458                     break;
459                     case SID_ATTR_PARA_LINESPACE_15:
460                     {
461                         SvxLineSpacingItem aItem( SVX_LINESPACE_ONE_POINT_FIVE_LINES, EE_PARA_SBL );
462                         aItem.SetPropLineSpace( 150 );
463                         aNewAttr.Put( aItem );
464                     }
465                     break;
466                     case SID_ATTR_PARA_LINESPACE_20:
467                     {
468                         SvxLineSpacingItem aItem( SVX_LINESPACE_TWO_LINES, EE_PARA_SBL );
469                         aItem.SetPropLineSpace( 200 );
470                         aNewAttr.Put( aItem );
471                     }
472                     break;
473                     case SID_SET_SUPER_SCRIPT:
474                     {
475                         SvxEscapementItem aItem( EE_CHAR_ESCAPEMENT );
476                         SvxEscapement eEsc = (SvxEscapement ) ( (const SvxEscapementItem&)
477                                         aEditAttr.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();
478 
479                         if( eEsc == SVX_ESCAPEMENT_SUPERSCRIPT )
480                             aItem.SetEscapement( SVX_ESCAPEMENT_OFF );
481                         else
482                             aItem.SetEscapement( SVX_ESCAPEMENT_SUPERSCRIPT );
483                         aNewAttr.Put( aItem );
484                     }
485                     break;
486                     case SID_SET_SUB_SCRIPT:
487                     {
488                         SvxEscapementItem aItem( EE_CHAR_ESCAPEMENT );
489                         SvxEscapement eEsc = (SvxEscapement ) ( (const SvxEscapementItem&)
490                                         aEditAttr.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();
491 
492                         if( eEsc == SVX_ESCAPEMENT_SUBSCRIPT )
493                             aItem.SetEscapement( SVX_ESCAPEMENT_OFF );
494                         else
495                             aItem.SetEscapement( SVX_ESCAPEMENT_SUBSCRIPT );
496                         aNewAttr.Put( aItem );
497                     }
498                     break;
499 
500                     // Attribute fuer die TextObjectBar
501                     case SID_ATTR_CHAR_FONT:
502                     {
503                         if( pArgs )
504                         {
505                             if( SFX_ITEM_SET == pArgs->GetItemState( EE_CHAR_FONTINFO, sal_True, &pPoolItem ) )
506                                 aNewAttr.Put( *pPoolItem );
507                         }
508                         else
509                             mpViewShell->GetViewFrame()->GetDispatcher()->
510                             Execute( SID_CHAR_DLG, SFX_CALLMODE_ASYNCHRON );
511                     }
512                     break;
513                     case SID_ATTR_CHAR_FONTHEIGHT:
514                     {
515                         if( pArgs )
516                         {
517                             if( SFX_ITEM_SET == pArgs->GetItemState( EE_CHAR_FONTHEIGHT, sal_True, &pPoolItem ) )
518                                 aNewAttr.Put( *pPoolItem );
519                         }
520                         else
521                             mpViewShell->GetViewFrame()->GetDispatcher()->
522                             Execute( SID_CHAR_DLG, SFX_CALLMODE_ASYNCHRON );
523                     }
524                     break;
525                     case SID_ATTR_CHAR_COLOR:
526                     {
527                         if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( EE_CHAR_COLOR, sal_True, &pPoolItem ) )
528                             aNewAttr.Put( *pPoolItem );
529                     }
530                     break;
531 /* #i35937#
532                     case FN_NUM_BULLET_ON:
533                     {
534                         if (aEditAttr.GetItemState(EE_PARA_BULLETSTATE) == SFX_ITEM_ON)
535                         {
536                             SfxUInt16Item aBulletState((const SfxUInt16Item&) aEditAttr.Get(EE_PARA_BULLETSTATE));
537 
538                             if (aBulletState.GetValue() != 0)
539                             {
540                                 // Ausschalten
541                                 aNewAttr.Put(SfxUInt16Item(EE_PARA_BULLETSTATE, 0));
542                             }
543                             else
544                             {
545                                 // Einschalten
546                                 aNewAttr.Put(SfxUInt16Item(EE_PARA_BULLETSTATE, 1));
547                             }
548                         }
549                         else
550                         {
551                             // Einschalten
552                             aNewAttr.Put(SfxUInt16Item(EE_PARA_BULLETSTATE, 1));
553                         }
554                     }
555                     break;
556 */
557                 }
558 
559                 rReq.Done( aNewAttr );
560                 pArgs = rReq.GetArgs();
561             }
562             else if ( nSlot == SID_ATTR_PARA_LEFT_TO_RIGHT ||
563                       nSlot == SID_ATTR_PARA_RIGHT_TO_LEFT )
564             {
565                 sal_Bool bLeftToRight = nSlot == SID_ATTR_PARA_LEFT_TO_RIGHT;
566 
567                 sal_uInt16 nAdjust = SVX_ADJUST_LEFT;
568                 if( SFX_ITEM_ON == aEditAttr.GetItemState(EE_PARA_JUST, sal_True, &pPoolItem ) )
569                     nAdjust = ( (SvxAdjustItem*)pPoolItem)->GetEnumValue();
570 
571                 if( bLeftToRight )
572                 {
573                     aNewAttr.Put( SvxFrameDirectionItem( FRMDIR_HORI_LEFT_TOP, EE_PARA_WRITINGDIR ) );
574                     if( nAdjust == SVX_ADJUST_RIGHT )
575                         aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_LEFT, EE_PARA_JUST ) );
576                 }
577                 else
578                 {
579                     aNewAttr.Put( SvxFrameDirectionItem( FRMDIR_HORI_RIGHT_TOP, EE_PARA_WRITINGDIR ) );
580                     if( nAdjust == SVX_ADJUST_LEFT )
581                         aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_RIGHT, EE_PARA_JUST ) );
582                 }
583 
584                 rReq.Done( aNewAttr );
585                 pArgs = rReq.GetArgs();
586 
587                 Invalidate( SID_RULER_TEXT_RIGHT_TO_LEFT );
588             }
589             else if ( nSlot == SID_ATTR_CHAR_FONT       ||
590                       nSlot == SID_ATTR_CHAR_FONTHEIGHT ||
591                       nSlot == SID_ATTR_CHAR_POSTURE    ||
592                       nSlot == SID_ATTR_CHAR_WEIGHT )
593             {
594                 // #i78017 establish the same behaviour as in Writer
595                 sal_uInt16 nScriptType = SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN | SCRIPTTYPE_COMPLEX;
596                 if (nSlot == SID_ATTR_CHAR_FONT)
597                     nScriptType = mpView->GetScriptType();
598 
599                 SfxItemPool& rPool = mpView->GetDoc()->GetPool();
600                 SvxScriptSetItem aSvxScriptSetItem( nSlot, rPool );
601                 aSvxScriptSetItem.PutItemForScriptType( nScriptType, pArgs->Get( rPool.GetWhich( nSlot ) ) );
602                 aNewAttr.Put( aSvxScriptSetItem.GetItemSet() );
603                 rReq.Done( aNewAttr );
604                 pArgs = rReq.GetArgs();
605             }
606             else if (nSlot == SID_ATTR_PARA_ADJUST_LEFT ||
607                 nSlot == SID_ATTR_PARA_ADJUST_CENTER ||
608                 nSlot == SID_ATTR_PARA_ADJUST_RIGHT ||
609                 nSlot == SID_ATTR_PARA_ADJUST_BLOCK)
610             {
611                 switch( nSlot )
612                 {
613                 case SID_ATTR_PARA_ADJUST_LEFT:
614                     {
615                         aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_LEFT, EE_PARA_JUST ) );
616                     }
617                     break;
618                 case SID_ATTR_PARA_ADJUST_CENTER:
619                     {
620                         aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_CENTER, EE_PARA_JUST ) );
621                     }
622                     break;
623                 case SID_ATTR_PARA_ADJUST_RIGHT:
624                     {
625                         aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_RIGHT, EE_PARA_JUST ) );
626                     }
627                     break;
628                 case SID_ATTR_PARA_ADJUST_BLOCK:
629                     {
630                         aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_BLOCK, EE_PARA_JUST ) );
631                     }
632                     break;
633                 }
634                 rReq.Done( aNewAttr );
635                 pArgs = rReq.GetArgs();
636             }
637             else if(nSlot == SID_ATTR_CHAR_KERNING)
638             {
639                 aNewAttr.Put(pArgs->Get(pArgs->GetPool()->GetWhich(nSlot)));
640                 rReq.Done( aNewAttr );
641                 pArgs = rReq.GetArgs();
642             }
643             else if(nSlot ==  SID_SET_SUPER_SCRIPT )
644             {
645                 SvxEscapementItem aItem(EE_CHAR_ESCAPEMENT);
646                 SvxEscapement eEsc = (SvxEscapement) ( (const SvxEscapementItem&)
647                                 aEditAttr.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();
648 
649                 if( eEsc == SVX_ESCAPEMENT_SUPERSCRIPT )
650                     aItem.SetEscapement( SVX_ESCAPEMENT_OFF );
651                 else
652                     aItem.SetEscapement( SVX_ESCAPEMENT_SUPERSCRIPT );
653                 aNewAttr.Put( aItem );
654                 rReq.Done( aNewAttr );
655                 pArgs = rReq.GetArgs();
656             }
657             else if( nSlot ==  SID_SET_SUB_SCRIPT )
658             {
659                 SvxEscapementItem aItem(EE_CHAR_ESCAPEMENT);
660                 SvxEscapement eEsc = (SvxEscapement) ( (const SvxEscapementItem&)
661                                 aEditAttr.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();
662 
663                 if( eEsc == SVX_ESCAPEMENT_SUBSCRIPT )
664                     aItem.SetEscapement( SVX_ESCAPEMENT_OFF );
665                 else
666                     aItem.SetEscapement( SVX_ESCAPEMENT_SUBSCRIPT );
667                 aNewAttr.Put( aItem );
668                 rReq.Done( aNewAttr );
669                 pArgs = rReq.GetArgs();
670             }
671 
672             mpView->SetAttributes(*pArgs);
673 
674             // Aus Performance- und Erweiterungsgruenden wird
675             // jetzt die komplette Shell invalidiert
676             Invalidate();
677 
678             // Um die Preview (im Gliederungsmodus) zu aktualisieren muss
679             // der Slot invalidiert werden:
680             mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, sal_True, sal_False );
681         }
682         break;
683     }
684 
685     Invalidate( SID_OUTLINE_LEFT );
686     Invalidate( SID_OUTLINE_RIGHT );
687     Invalidate( SID_OUTLINE_UP );
688     Invalidate( SID_OUTLINE_DOWN );
689 }
690 
691 } // end of namespace sd
692