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