xref: /AOO41X/main/sw/source/ui/shells/txtattr.cxx (revision 41919c97b323a66d7e3a6686c38c568ed6a52cd0)
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_sw.hxx"
26 
27 
28 #include <hintids.hxx>
29 
30 #ifndef _MSGBOX_HXX //autogen
31 #include <vcl/msgbox.hxx>
32 #endif
33 #include <svl/whiter.hxx>
34 #include <svl/stritem.hxx>
35 #include <svl/itemiter.hxx>
36 #include <svl/ctloptions.hxx>
37 #include <swmodule.hxx>
38 #include <sfx2/bindings.hxx>
39 #include <sfx2/request.hxx>
40 #include <editeng/fhgtitem.hxx>
41 #include <editeng/adjitem.hxx>
42 #include <editeng/lspcitem.hxx>
43 #include <editeng/lrspitem.hxx>
44 #include <editeng/udlnitem.hxx>
45 #include <editeng/escpitem.hxx>
46 #include <svx/htmlmode.hxx>
47 #include <editeng/scripttypeitem.hxx>
48 #include <editeng/frmdiritem.hxx>
49 #include "paratr.hxx"
50 
51 #include <fmtinfmt.hxx>
52 #ifndef _DOCSH_HXX
53 #include <docsh.hxx>
54 #endif
55 #include <wrtsh.hxx>
56 #ifndef _VIEW_HXX
57 #include <view.hxx>
58 #endif
59 #include <viewopt.hxx>
60 #include <uitool.hxx>
61 #ifndef _TEXTSH_HXX
62 #include <textsh.hxx>
63 #endif
64 #include <num.hxx>
65 #include <swundo.hxx>
66 #include <fmtcol.hxx>
67 
68 #ifndef _CMDID_H
69 #include <cmdid.h>
70 #endif
71 #include <globals.h>
72 #ifndef _SHELLS_HRC
73 #include <shells.hrc>
74 #endif
75 #include <SwStyleNameMapper.hxx>
76 #include "swabstdlg.hxx"
77 #include "chrdlg.hrc"
78 const SwTwips lFontInc = 2 * 20;           // ==> PointToTwips(2)
79 const SwTwips lFontMaxSz = 72 * 20;        // ==> PointToTwips(72)
80 
81 
82 
83 
84 void SwTextShell::ExecCharAttr(SfxRequest &rReq)
85 {
86     SwWrtShell &rSh = GetShell();
87     const SfxItemSet  *pArgs   = rReq.GetArgs();
88           int          eState = STATE_TOGGLE;
89     sal_uInt16 nWhich = rReq.GetSlot();
90 
91     if(pArgs )
92     {
93         const SfxPoolItem* pItem;
94         pArgs->GetItemState(nWhich, sal_False, &pItem);
95         eState =  ((const SfxBoolItem &) pArgs->
96                                 Get( nWhich )).GetValue() ? STATE_ON : STATE_OFF;
97     }
98 
99 
100     SfxItemSet aSet( GetPool(), RES_CHRATR_BEGIN, RES_CHRATR_END-1 );
101     if (STATE_TOGGLE == eState)
102         rSh.GetCurAttr( aSet );
103 
104     switch ( nWhich )
105     {
106         case FN_SET_SUB_SCRIPT:
107         case FN_SET_SUPER_SCRIPT:
108         {
109             SvxEscapement eEscape = SVX_ESCAPEMENT_SUBSCRIPT;
110             switch (eState)
111             {
112             case STATE_TOGGLE:
113             {
114                 short nTmpEsc = ((const SvxEscapementItem&)
115                             aSet.Get( RES_CHRATR_ESCAPEMENT )).GetEsc();
116                 eEscape = nWhich == FN_SET_SUPER_SCRIPT ?
117                                 SVX_ESCAPEMENT_SUPERSCRIPT:
118                                 SVX_ESCAPEMENT_SUBSCRIPT;
119                 if( (nWhich == FN_SET_SUB_SCRIPT && nTmpEsc < 0) ||
120                             (nWhich == FN_SET_SUPER_SCRIPT && nTmpEsc > 0) )
121                     eEscape = SVX_ESCAPEMENT_OFF;
122 
123                 SfxBindings& rBind = GetView().GetViewFrame()->GetBindings();
124                 if( nWhich == FN_SET_SUB_SCRIPT )
125                     rBind.SetState( SfxBoolItem( FN_SET_SUPER_SCRIPT,
126                                                                     sal_False ) );
127                 else
128                     rBind.SetState( SfxBoolItem( FN_SET_SUB_SCRIPT,
129                                                                     sal_False ) );
130 
131             }
132             break;
133             case STATE_ON:
134                 eEscape = nWhich == FN_SET_SUPER_SCRIPT ?
135                                 SVX_ESCAPEMENT_SUPERSCRIPT:
136                                 SVX_ESCAPEMENT_SUBSCRIPT;
137                 break;
138             case STATE_OFF:
139                 eEscape = SVX_ESCAPEMENT_OFF;
140                 break;
141             }
142             SvxEscapementItem aEscape( eEscape, RES_CHRATR_ESCAPEMENT );
143             if(eEscape == SVX_ESCAPEMENT_SUPERSCRIPT)
144                 aEscape.GetEsc() = DFLT_ESC_AUTO_SUPER;
145             else if(eEscape == SVX_ESCAPEMENT_SUBSCRIPT)
146                 aEscape.GetEsc() = DFLT_ESC_AUTO_SUB;
147             if(eState != STATE_OFF )
148             {
149                 if(eEscape == FN_SET_SUPER_SCRIPT)
150                     aEscape.GetEsc() *= -1;
151             }
152             rSh.SetAttrItem( aEscape );
153             rReq.AppendItem( aEscape );
154             rReq.Done();
155         }
156         break;
157 
158         case FN_UPDATE_STYLE_BY_EXAMPLE:
159             rSh.QuickUpdateStyle();
160             rReq.Done();
161             break;
162         case FN_UNDERLINE_DOUBLE:
163         {
164             FontUnderline eUnderline =  ((const SvxUnderlineItem&)
165                             aSet.Get(RES_CHRATR_UNDERLINE)).GetLineStyle();
166             switch( eState )
167             {
168                 case STATE_TOGGLE:
169                     eUnderline = eUnderline == UNDERLINE_DOUBLE ?
170                         UNDERLINE_NONE :
171                             UNDERLINE_DOUBLE;
172                 break;
173                 case STATE_ON:
174                     eUnderline = UNDERLINE_DOUBLE;
175                 break;
176                 case STATE_OFF:
177                     eUnderline = UNDERLINE_NONE;
178                 break;
179             }
180             SvxUnderlineItem aUnderline(eUnderline, RES_CHRATR_UNDERLINE );
181             rSh.SetAttrItem( aUnderline );
182             rReq.AppendItem( aUnderline );
183             rReq.Done();
184         }
185         break;
186         case FN_REMOVE_DIRECT_CHAR_FORMATS:
187             if( !rSh.HasReadonlySel() && rSh.IsEndPara())
188                 rSh.DontExpandFmt();
189         break;
190         default:
191             ASSERT(sal_False, falscher Dispatcher);
192             return;
193     }
194 }
195 
196 
197 void SwTextShell::ExecCharAttrArgs(SfxRequest &rReq)
198 {
199     sal_uInt16 nSlot = rReq.GetSlot();
200     const SfxItemSet* pArgs = rReq.GetArgs();
201     sal_Bool bArgs = pArgs != 0 && pArgs->Count() > 0;
202     int bGrow = sal_False;
203     SwWrtShell& rWrtSh = GetShell();
204     SwTxtFmtColl* pColl = 0;
205 
206     // nur gesetzt, wenn gesamter Absatz selektiert ist und AutoUpdateFmt gesetzt ist
207     if ( rWrtSh.HasSelection() && rWrtSh.IsSelFullPara() )
208     {
209         pColl = rWrtSh.GetCurTxtFmtColl();
210         if ( pColl && !pColl->IsAutoUpdateFmt() )
211             pColl = 0;
212     }
213     SfxItemPool& rPool = GetPool();
214     sal_uInt16 nWhich = rPool.GetWhich( nSlot );
215     switch (nSlot)
216     {
217     case FN_TXTATR_INET:
218         // Sonderbehandlung der PoolId des SwFmtInetFmt
219         if ( bArgs )
220         {
221             const SfxPoolItem& rItem = pArgs->Get( nWhich );
222 
223             SwFmtINetFmt aINetFmt( (const SwFmtINetFmt&) rItem );
224             if ( USHRT_MAX == aINetFmt.GetVisitedFmtId() )
225             {
226                 ASSERT( false, "<SwTextShell::ExecCharAttrArgs(..)> - unexpected visited character format ID at hyperlink attribute" );
227                 aINetFmt.SetVisitedFmtAndId(
228                         aINetFmt.GetVisitedFmt(),
229                         SwStyleNameMapper::GetPoolIdFromUIName( aINetFmt.GetVisitedFmt(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT ) );
230             }
231             if ( USHRT_MAX == aINetFmt.GetINetFmtId() )
232             {
233                 ASSERT( false, "<SwTextShell::ExecCharAttrArgs(..)> - unexpected unvisited character format ID at hyperlink attribute" );
234                 aINetFmt.SetINetFmtAndId(
235                         aINetFmt.GetINetFmt(),
236                         SwStyleNameMapper::GetPoolIdFromUIName( aINetFmt.GetINetFmt(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT ) );
237             }
238 
239             if ( pColl )
240                 pColl->SetFmtAttr( aINetFmt );
241             else
242                 rWrtSh.SetAttrItem( aINetFmt );
243             rReq.Done();
244         }
245         break;
246 
247         case FN_GROW_FONT_SIZE:
248             bGrow = sal_True;
249             // kein break !!
250         case FN_SHRINK_FONT_SIZE:
251         {
252             SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONTHEIGHT, rPool );
253             rWrtSh.GetCurAttr( aSetItem.GetItemSet() );
254             SfxItemSet aAttrSet( rPool, aSetItem.GetItemSet().GetRanges() );
255 
256             const SfxPoolItem* pI;
257             static const sal_uInt16 aScrTypes[] = {
258                 SCRIPTTYPE_LATIN, SCRIPTTYPE_ASIAN, SCRIPTTYPE_COMPLEX, 0 };
259             sal_uInt16 nScriptType = rWrtSh.GetScriptType();
260             for( const sal_uInt16* pScrpTyp = aScrTypes; *pScrpTyp; ++pScrpTyp )
261                 if( ( nScriptType & *pScrpTyp ) &&
262                     0 != ( pI = aSetItem.GetItemOfScript( *pScrpTyp )))
263                 {
264                     SvxFontHeightItem aSize( *(const SvxFontHeightItem*)pI );
265                     SwTwips lSize = (SwTwips) aSize.GetHeight();
266 
267                     if (bGrow)
268                     {
269                         if( lSize == lFontMaxSz )
270                             break;      // das wars, hoeher gehts nicht
271                         if( ( lSize += lFontInc ) > lFontMaxSz )
272                             lSize = lFontMaxSz;
273                     }
274                     else
275                     {
276                         if( 4 == lSize )
277                             break;
278                         if( ( lSize -= lFontInc ) < 4 )
279                             lSize = 4;
280                     }
281                     aSize.SetHeight( lSize );
282                     aAttrSet.Put( aSize );
283                 }
284                 if( aAttrSet.Count() )
285                 {
286                     if( pColl )
287                         pColl->SetFmtAttr( aAttrSet );
288                     else
289                         rWrtSh.SetAttrSet( aAttrSet );
290                 }
291             rReq.Done();
292         }
293         break;
294 
295         default:
296             ASSERT(sal_False, falscher Dispatcher);
297             return;
298     }
299 }
300 
301 
302 
303 #ifdef CFRONT
304 
305 void lcl_SetAdjust(SvxAdjust eAdjst, SfxItemSet& rSet)
306 {
307     rSet.Put(SvxAdjustItem(eAdjst,RES_PARATR_ADJUST ));
308 }
309 
310 
311 
312 void lcl_SetLineSpace(sal_uInt8 ePropL,SfxItemSet& rSet)
313 {
314     SvxLineSpacingItem aLineSpacing(ePropL, RES_PARATR_LINESPACING );
315     aLineSpacing.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
316     if( 100 == ePropL )
317         aLineSpacing.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
318     else
319         aLineSpacing.SetPropLineSpace(ePropL);
320     rSet.Put( aLineSpacing );
321 }
322 
323 
324 
325 void SwTextShell::ExecParaAttr(SfxRequest &rReq)
326 {
327     // gleiche beide Attribute holen, ist nicht teuerer !!
328     SfxItemSet aSet( GetPool(), RES_PARATR_LINESPACING, RES_PARATR_ADJUST );
329 
330     switch (rReq.GetSlot())
331     {
332     case FN_SET_LEFT_PARA:          lcl_SetAdjust(ADJLEFT,aSet);    break;
333     case FN_SET_RIGHT_PARA:         lcl_SetAdjust(ADJRIGHT,aSet);   break;
334     case FN_SET_CENTER_PARA:        lcl_SetAdjust(ADJCENTER,aSet);  break;
335     case SID_ATTR_PARA_ADJUST_BLOCK:lcl_SetAdjust(ADJBLOCK,aSet);   break;
336 
337     case FN_SET_LINE_SPACE_1:   lcl_SetLineSpace(100,aSet);     break;
338     case FN_SET_LINE_SPACE_15:  lcl_SetLineSpace(150,aSet);     break;
339     case FN_SET_LINE_SPACE_2:   lcl_SetLineSpace(200,aSet);     break;
340 
341     default:
342         DBG_ERROR("SwTextShell::ExecParaAttr falscher Dispatcher");
343         return;
344     }
345     SwWrtShell& rWrtSh = GetShell();
346     SwTxtFmtColl* pColl = rWrtSh.GetCurTxtFmtColl();
347     if(pColl && pColl->IsAutoUpdateFmt())
348     {
349         rWrtSh.AutoUpdatePara(pColl, *pSet);
350     }
351     else
352     {
353         rWrtSh.SetAttrSet( aSet );
354         rReq.Done( aSet );
355     }
356 }
357 
358 #else
359 
360 
361 
362 void SwTextShell::ExecParaAttr(SfxRequest &rReq)
363 {
364     SvxAdjust eAdjst;
365     sal_uInt8 ePropL;
366     const SfxItemSet* pArgs = rReq.GetArgs();
367 
368     // gleich beide Attribute holen, ist nicht teuerer !!
369     SfxItemSet aSet( GetPool(),
370         RES_PARATR_LINESPACING, RES_PARATR_ADJUST,
371         RES_FRAMEDIR, RES_FRAMEDIR,
372         0 );
373 
374     sal_uInt16 nSlot = rReq.GetSlot();
375     switch (nSlot)
376     {
377         case SID_ATTR_PARA_ADJUST:
378         {
379             if( pArgs && SFX_ITEM_SET == pArgs->GetItemState(RES_PARATR_ADJUST) )
380             {
381                 const SvxAdjustItem& rAdj = (const SvxAdjustItem&) pArgs->Get(RES_PARATR_ADJUST);
382                 SvxAdjustItem aAdj( rAdj.GetAdjust(), RES_PARATR_ADJUST );
383                 if ( rAdj.GetAdjust() == SVX_ADJUST_BLOCK )
384                 {
385                     aAdj.SetLastBlock( rAdj.GetLastBlock() );
386                     aAdj.SetOneWord( rAdj.GetOneWord() );
387                 }
388 
389                 aSet.Put(aAdj);
390             }
391         }
392         break;
393         case SID_ATTR_PARA_ADJUST_LEFT:     eAdjst =  SVX_ADJUST_LEFT;      goto SET_ADJUST;
394         case SID_ATTR_PARA_ADJUST_RIGHT:    eAdjst =  SVX_ADJUST_RIGHT;     goto SET_ADJUST;
395         case SID_ATTR_PARA_ADJUST_CENTER:   eAdjst =  SVX_ADJUST_CENTER;    goto SET_ADJUST;
396         case SID_ATTR_PARA_ADJUST_BLOCK:    eAdjst =  SVX_ADJUST_BLOCK;     goto SET_ADJUST;
397 SET_ADJUST:
398         {
399             aSet.Put(SvxAdjustItem(eAdjst,RES_PARATR_ADJUST));
400             rReq.AppendItem( SfxBoolItem( GetPool().GetWhich(nSlot), sal_True ) );
401         }
402         break;
403 
404         case SID_ATTR_PARA_LINESPACE:
405             if(pArgs && SFX_ITEM_SET == pArgs->GetItemState( GetPool().GetWhich(nSlot) ))
406             {
407                 SvxLineSpacingItem aLineSpace = (const SvxLineSpacingItem&)pArgs->Get(
408                                                             GetPool().GetWhich(nSlot));
409                 aSet.Put( aLineSpace );
410             }
411         break;
412         case SID_ATTR_PARA_LINESPACE_10:    ePropL = 100;   goto SET_LINESPACE;
413         case SID_ATTR_PARA_LINESPACE_15:    ePropL = 150;   goto SET_LINESPACE;
414         case SID_ATTR_PARA_LINESPACE_20:    ePropL = 200;   goto SET_LINESPACE;
415 
416 SET_LINESPACE:
417         {
418 
419             SvxLineSpacingItem aLineSpacing(ePropL, RES_PARATR_LINESPACING );
420             aLineSpacing.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
421             if( 100 == ePropL )
422                 aLineSpacing.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
423             else
424                 aLineSpacing.SetPropLineSpace(ePropL);
425             aSet.Put( aLineSpacing );
426         }
427         break;
428 
429         case SID_ATTR_PARA_LEFT_TO_RIGHT :
430         case SID_ATTR_PARA_RIGHT_TO_LEFT :
431         {
432             sal_Bool bSet = sal_True;
433             int eState = pArgs ? pArgs->GetItemState(nSlot) : SFX_ITEM_DISABLED;
434             if (pArgs && SFX_ITEM_SET == eState)
435                 bSet = ((const SfxBoolItem&)pArgs->Get(nSlot)).GetValue();
436 /*
437 // toggling of the slots not used anymore
438 
439            if(!bSet)
440                 nSlot = SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot ?
441                     SID_ATTR_PARA_RIGHT_TO_LEFT :
442                     SID_ATTR_PARA_LEFT_TO_RIGHT;
443 */
444             SfxItemSet aAdjustSet( GetPool(),
445                     RES_PARATR_ADJUST, RES_PARATR_ADJUST );
446             GetShell().GetCurAttr(aAdjustSet);
447             sal_Bool bChgAdjust = sal_False;
448             SfxItemState eAdjustState = aAdjustSet.GetItemState(RES_PARATR_ADJUST, sal_False);
449             if(eAdjustState  >= SFX_ITEM_DEFAULT)
450             {
451                 int eAdjust = (int)(( const SvxAdjustItem& )
452                         aAdjustSet.Get(RES_PARATR_ADJUST)).GetAdjust();
453 //                bChgAdjust = SVX_ADJUST_CENTER  != eAdjust  &&  SVX_ADJUST_BLOCK != eAdjust;
454                 bChgAdjust = (SVX_ADJUST_LEFT  == eAdjust  &&  SID_ATTR_PARA_RIGHT_TO_LEFT == nSlot) ||
455                              (SVX_ADJUST_RIGHT == eAdjust  &&  SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot);
456             }
457             else
458                 bChgAdjust = sal_True;
459 
460             SvxFrameDirection eFrmDirection =
461                     (SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot) ?
462                         FRMDIR_HORI_LEFT_TOP : FRMDIR_HORI_RIGHT_TOP;
463             aSet.Put( SvxFrameDirectionItem( eFrmDirection, RES_FRAMEDIR ) );
464 
465             if (bChgAdjust)
466             {
467                 SvxAdjust eAdjust = (SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot) ?
468                         SVX_ADJUST_LEFT : SVX_ADJUST_RIGHT;
469                 SvxAdjustItem aAdjust( eAdjust, RES_PARATR_ADJUST );
470                 aSet.Put( aAdjust );
471                 aAdjust.SetWhich(SID_ATTR_PARA_ADJUST);
472                 GetView().GetViewFrame()->GetBindings().SetState( aAdjust );
473                 // Toggle numbering alignment
474                 const SwNumRule* pCurRule = GetShell().GetCurNumRule();
475                 if( pCurRule )
476                 {
477                     SvxNumRule aRule = pCurRule->MakeSvxNumRule();
478 
479                     for(sal_uInt16 i = 0; i < aRule.GetLevelCount(); i++)
480                     {
481                         SvxNumberFormat aFmt(aRule.GetLevel(i));
482                         if(SVX_ADJUST_LEFT == aFmt.GetNumAdjust())
483                             aFmt.SetNumAdjust( SVX_ADJUST_RIGHT );
484 
485                         else if(SVX_ADJUST_RIGHT == aFmt.GetNumAdjust())
486                             aFmt.SetNumAdjust( SVX_ADJUST_LEFT );
487 
488                         aRule.SetLevel(i, aFmt, aRule.Get(i) != 0);
489                     }
490                     // --> OD 2008-02-11 #newlistlevelattrs#
491                     SwNumRule aSetRule( pCurRule->GetName(),
492                                         pCurRule->Get( 0 ).GetPositionAndSpaceMode() );
493                     // <--
494                     aSetRule.SetSvxRule( aRule, GetShell().GetDoc());
495                     aSetRule.SetAutoRule( sal_True );
496                     // --> OD 2008-03-17 #refactorlists#
497                     // no start or continuation of a list - list style is only changed
498                     GetShell().SetCurNumRule( aSetRule, false );
499                     // <--
500                 }
501             }
502         }
503         break;
504 
505         default:
506             ASSERT(sal_False, falscher Dispatcher);
507             return;
508     }
509     SwWrtShell& rWrtSh = GetShell();
510     SwTxtFmtColl* pColl = rWrtSh.GetCurTxtFmtColl();
511     if(pColl && pColl->IsAutoUpdateFmt())
512     {
513         rWrtSh.AutoUpdatePara(pColl, aSet);
514     }
515     else
516         rWrtSh.SetAttrSet( aSet );
517     rReq.Done();
518 }
519 
520 #endif
521 
522 
523 
524 void SwTextShell::ExecParaAttrArgs(SfxRequest &rReq)
525 {
526     SwWrtShell &rSh = GetShell();
527     const SfxItemSet *pArgs = rReq.GetArgs();
528     const SfxPoolItem *pItem = 0;
529 
530     sal_uInt16 nSlot = rReq.GetSlot();
531     if(pArgs)
532         pArgs->GetItemState(GetPool().GetWhich(nSlot), sal_False, &pItem);
533     switch ( nSlot )
534     {
535         case FN_DROP_CHAR_STYLE_NAME:
536             if( pItem )
537             {
538                 String sCharStyleName = ((const SfxStringItem*)pItem)->GetValue();
539                 SfxItemSet aSet(GetPool(), RES_PARATR_DROP, RES_PARATR_DROP, 0L);
540                 rSh.GetCurAttr(aSet);
541                 SwFmtDrop aDropItem((const SwFmtDrop&)aSet.Get(RES_PARATR_DROP));
542                 SwCharFmt* pFmt = 0;
543                 if(sCharStyleName.Len())
544                     pFmt = rSh.FindCharFmtByName( sCharStyleName );
545                 aDropItem.SetCharFmt( pFmt );
546                 aSet.Put(aDropItem);
547                 rSh.SetAttrSet(aSet);
548             }
549         break;
550         case FN_FORMAT_DROPCAPS:
551         {
552             if(pItem)
553             {
554                 rSh.SetAttrItem(*pItem);
555                 rReq.Done();
556             }
557             else
558             {
559                 SfxItemSet aSet(GetPool(), RES_PARATR_DROP, RES_PARATR_DROP,
560                                            HINT_END, HINT_END, 0);
561                 rSh.GetCurAttr(aSet);
562                 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
563                 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
564 
565                 SfxAbstractDialog* pDlg = pFact->CreateSfxDialog( GetView().GetWindow(), aSet,
566                     rSh.GetView().GetViewFrame()->GetFrame().GetFrameInterface(), DLG_SWDROPCAPS );
567                 DBG_ASSERT(pDlg, "Dialogdiet fail!");
568                 if (pDlg->Execute() == RET_OK)
569                 {
570                     rSh.StartAction();
571                     rSh.StartUndo( UNDO_START );
572                     if ( SFX_ITEM_SET == aSet.GetItemState(HINT_END,sal_False,&pItem) )
573                     {
574                         if ( ((SfxStringItem*)pItem)->GetValue().Len() )
575                             rSh.ReplaceDropTxt(((SfxStringItem*)pItem)->GetValue());
576                     }
577                     rSh.SetAttrSet(*pDlg->GetOutputItemSet());
578                     rSh.StartUndo( UNDO_END );
579                     rSh.EndAction();
580                     rReq.Done(*pDlg->GetOutputItemSet());
581                 }
582                 delete pDlg;
583             }
584         }
585         break;
586         case SID_ATTR_PARA_PAGEBREAK:
587             if(pItem)
588             {
589                 rSh.SetAttrItem( *pItem );
590                 rReq.Done();
591             }
592         break;
593         case SID_ATTR_PARA_MODEL:
594         {
595             if(pItem)
596             {
597                 SfxItemSet aCoreSet( GetPool(),
598                     RES_PAGEDESC,   RES_PAGEDESC,
599                     SID_ATTR_PARA_MODEL, SID_ATTR_PARA_MODEL, 0);
600                 aCoreSet.Put(*pItem);
601                 SfxToSwPageDescAttr( rSh, aCoreSet);
602                 rSh.SetAttrSet(aCoreSet);
603                 rReq.Done();
604             }
605         }
606         break;
607 
608         default:
609             ASSERT(sal_False, falscher Dispatcher);
610             return;
611     }
612 }
613 
614 
615 
616 void SwTextShell::GetAttrState(SfxItemSet &rSet)
617 {
618     SwWrtShell &rSh = GetShell();
619     SfxItemPool& rPool = GetPool();
620     SfxItemSet aCoreSet(rPool, aTxtFmtCollSetRange);
621     rSh.GetCurAttr(aCoreSet); // *alle* Textattribute von der Core erfragen
622 
623     SfxWhichIter aIter(rSet);
624     sal_uInt16 nSlot = aIter.FirstWhich();
625     sal_Bool bFlag = sal_False;
626     SfxBoolItem aFlagItem;
627     const SfxPoolItem* pItem = 0;
628     int eAdjust = -1;   // Illegaler Wert, um DONTCARE zu erkennen
629     SfxItemState eState = aCoreSet.GetItemState(RES_PARATR_ADJUST, sal_False, &pItem);
630 
631     if( SFX_ITEM_DEFAULT == eState )
632         pItem = &rPool.GetDefaultItem(RES_PARATR_ADJUST);
633     if( SFX_ITEM_DEFAULT <= eState )
634         eAdjust = (int)(( SvxAdjustItem* ) pItem)->GetAdjust();
635 
636     short nEsc = 0;
637     eState =  aCoreSet.GetItemState(RES_CHRATR_ESCAPEMENT, sal_False, &pItem);
638     if( SFX_ITEM_DEFAULT == eState )
639         pItem = &rPool.GetDefaultItem(RES_CHRATR_ESCAPEMENT);
640     if( eState >= SFX_ITEM_DEFAULT )
641         nEsc = ((SvxEscapementItem* )pItem)->GetEsc();
642 
643     sal_uInt16 nLineSpace = 0;
644     eState =  aCoreSet.GetItemState(RES_PARATR_LINESPACING, sal_False, &pItem);
645     if( SFX_ITEM_DEFAULT == eState )
646         pItem = &rPool.GetDefaultItem(RES_PARATR_LINESPACING);
647     if( SFX_ITEM_DEFAULT <= eState &&
648             ((SvxLineSpacingItem* )pItem)->GetLineSpaceRule() == SVX_LINE_SPACE_AUTO )
649     {
650         if(SVX_INTER_LINE_SPACE_OFF ==
651                     ((SvxLineSpacingItem* )pItem)->GetInterLineSpaceRule())
652             nLineSpace = 100;
653         else
654             nLineSpace = ((SvxLineSpacingItem* )pItem)->GetPropLineSpace();
655     }
656 
657     while (nSlot)
658     {
659         switch(nSlot)
660         {
661             case FN_SET_SUPER_SCRIPT:
662                     bFlag = 0 < nEsc;
663                 break;
664             case FN_SET_SUB_SCRIPT:
665                     bFlag = 0 > nEsc;
666                 break;
667             case SID_ATTR_PARA_ADJUST_LEFT:
668                 if (eAdjust == -1)
669                 {
670                     rSet.InvalidateItem( nSlot );
671                     nSlot = 0;
672                 }
673                 else
674                     bFlag = SVX_ADJUST_LEFT == eAdjust;
675                 break;
676             case SID_ATTR_PARA_ADJUST_RIGHT:
677                 if (eAdjust == -1)
678                 {
679                     rSet.InvalidateItem( nSlot );
680                     nSlot = 0;
681                 }
682                 else
683                     bFlag = SVX_ADJUST_RIGHT == eAdjust;
684                 break;
685             case SID_ATTR_PARA_ADJUST_CENTER:
686                 if (eAdjust == -1)
687                 {
688                     rSet.InvalidateItem( nSlot );
689                     nSlot = 0;
690                 }
691                 else
692                     bFlag = SVX_ADJUST_CENTER == eAdjust;
693                 break;
694             case SID_ATTR_PARA_ADJUST_BLOCK:
695             {
696                 if (eAdjust == -1)
697                 {
698                     rSet.InvalidateItem( nSlot );
699                     nSlot = 0;
700                 }
701                 else
702                 {
703                     bFlag = SVX_ADJUST_BLOCK == eAdjust;
704                     sal_uInt16 nHtmlMode = GetHtmlMode(rSh.GetView().GetDocShell());
705                     if((nHtmlMode & HTMLMODE_ON) && !(nHtmlMode & (HTMLMODE_FULL_STYLES|HTMLMODE_FIRSTLINE) ))
706                     {
707                         rSet.DisableItem( nSlot );
708                         nSlot = 0;
709                     }
710                 }
711             }
712             break;
713             case SID_ATTR_PARA_LINESPACE_10:
714                 bFlag = nLineSpace == 100;
715             break;
716             case SID_ATTR_PARA_LINESPACE_15:
717                 bFlag = nLineSpace == 150;
718             break;
719             case SID_ATTR_PARA_LINESPACE_20:
720                 bFlag = nLineSpace == 200;
721             break;
722             case FN_GROW_FONT_SIZE:
723             case FN_SHRINK_FONT_SIZE:
724             {
725                 SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONTHEIGHT,
726                                             *rSet.GetPool() );
727                 aSetItem.GetItemSet().Put( aCoreSet, sal_False );
728                 if( !aSetItem.GetItemOfScript( rSh.GetScriptType() ))
729                     rSet.DisableItem( nSlot );
730                 nSlot = 0;
731             }
732             break;
733             case FN_UNDERLINE_DOUBLE:
734             {
735                 eState = aCoreSet.GetItemState(RES_CHRATR_UNDERLINE);
736                 if( eState >= SFX_ITEM_DEFAULT )
737                 {
738                     FontUnderline eUnderline =  ((const SvxUnderlineItem&)
739                             aCoreSet.Get(RES_CHRATR_UNDERLINE)).GetLineStyle();
740                     rSet.Put(SfxBoolItem(nSlot, eUnderline == UNDERLINE_DOUBLE));
741                 }
742                 else
743                     rSet.InvalidateItem(nSlot);
744                 nSlot = 0;
745             }
746             break;
747             case SID_ATTR_PARA_ADJUST:
748                 if (eAdjust == -1)
749                     rSet.InvalidateItem( nSlot );
750                 else
751                     rSet.Put(SvxAdjustItem((SvxAdjust)eAdjust, SID_ATTR_PARA_ADJUST ));
752                 nSlot = 0;
753             break;
754             case SID_ATTR_PARA_LRSPACE:
755             {
756                 eState = aCoreSet.GetItemState(RES_LR_SPACE);
757                 if( eState >= SFX_ITEM_DEFAULT )
758                 {
759                     SvxLRSpaceItem aLR = ( (const SvxLRSpaceItem&) aCoreSet.Get( RES_LR_SPACE ) );
760                     aLR.SetWhich(SID_ATTR_PARA_LRSPACE);
761                     rSet.Put(aLR);
762                 }
763                 else
764                     rSet.InvalidateItem(nSlot);
765                 nSlot = 0;
766             }
767 
768             case SID_ATTR_PARA_LEFT_TO_RIGHT :
769             case SID_ATTR_PARA_RIGHT_TO_LEFT :
770             {
771                 if ( !SW_MOD()->GetCTLOptions().IsCTLFontEnabled() )
772                 {
773                     rSet.DisableItem( nSlot );
774                     nSlot = 0;
775                 }
776                 else
777                 {
778                     // is the item set?
779                     sal_uInt16 nHtmlMode = GetHtmlMode(rSh.GetView().GetDocShell());
780                     if((!(nHtmlMode & HTMLMODE_ON) || (0 != (nHtmlMode & HTMLMODE_SOME_STYLES))) &&
781                     aCoreSet.GetItemState( RES_FRAMEDIR, sal_False ) >= SFX_ITEM_DEFAULT)
782                     {
783                         SvxFrameDirection eFrmDir = (SvxFrameDirection)
784                                 ((const SvxFrameDirectionItem& )aCoreSet.Get(RES_FRAMEDIR)).GetValue();
785                         if (FRMDIR_ENVIRONMENT == eFrmDir)
786                         {
787                             eFrmDir = rSh.IsInRightToLeftText() ?
788                                     FRMDIR_HORI_RIGHT_TOP : FRMDIR_HORI_LEFT_TOP;
789                         }
790                         bFlag = (SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot &&
791                                             FRMDIR_HORI_LEFT_TOP == eFrmDir) ||
792                                 (SID_ATTR_PARA_RIGHT_TO_LEFT == nSlot &&
793                                             FRMDIR_HORI_RIGHT_TOP == eFrmDir);
794                     }
795                     else
796                     {
797                         rSet.InvalidateItem(nSlot);
798                         nSlot = 0;
799                     }
800                 }
801             }
802             break;
803 
804             case SID_ATTR_CHAR_LANGUAGE:
805             case SID_ATTR_CHAR_KERNING:
806             case RES_PARATR_DROP:
807             {
808 #if OSL_DEBUG_LEVEL > 1
809                 const SfxPoolItem& rItem = aCoreSet.Get(GetPool().GetWhich(nSlot), sal_True);
810                 rSet.Put(rItem);
811 #else
812                 rSet.Put(aCoreSet.Get( GetPool().GetWhich(nSlot), sal_True));
813 #endif
814                 nSlot = 0;
815             }
816             break;
817             case SID_ATTR_PARA_MODEL:
818             {
819                 SfxItemSet aTemp(GetPool(),
820                         RES_PAGEDESC,RES_PAGEDESC,
821                         SID_ATTR_PARA_MODEL,SID_ATTR_PARA_MODEL,
822                         0L);
823                 aTemp.Put(aCoreSet);
824                 ::SwToSfxPageDescAttr(aTemp);
825                 rSet.Put(aTemp.Get(SID_ATTR_PARA_MODEL));
826                 nSlot = 0;
827             }
828             break;
829             case RES_TXTATR_INETFMT:
830             {
831                 SfxItemSet aSet(GetPool(), RES_TXTATR_INETFMT, RES_TXTATR_INETFMT);
832                 rSh.GetCurAttr(aSet);
833 #if OSL_DEBUG_LEVEL > 1
834                 const SfxPoolItem& rItem = aSet.Get(RES_TXTATR_INETFMT, sal_True);
835                 rSet.Put(rItem);
836 #else
837                 rSet.Put(aSet.Get( RES_TXTATR_INETFMT, sal_True));
838 #endif
839                 nSlot = 0;
840             }
841             break;
842 
843             default:
844             // Nichts tun
845             nSlot = 0;
846             break;
847 
848         }
849         if( nSlot )
850         {
851             aFlagItem.SetWhich( nSlot );
852             aFlagItem.SetValue( bFlag );
853             rSet.Put( aFlagItem );
854         }
855         nSlot = aIter.NextWhich();
856     }
857 
858     rSet.Put(aCoreSet,sal_False);
859 }
860 
861 
862 
863