xref: /AOO41X/main/sw/source/ui/shells/txtattr.cxx (revision 5443dcac4da55ae8863c5c80e8907938642a7f1b)
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.SetAttr( 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.SetAttr( 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                 aINetFmt.SetVisitedFmtId(
227                         SwStyleNameMapper::GetPoolIdFromUIName( aINetFmt.GetVisitedFmt(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT));
228             }
229             if( USHRT_MAX == aINetFmt.GetINetFmtId() )
230             {
231                 aINetFmt.SetINetFmtId(
232                         SwStyleNameMapper::GetPoolIdFromUIName( aINetFmt.GetINetFmt(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT));
233             }
234 
235             if ( pColl )
236                 pColl->SetFmtAttr( aINetFmt );
237             else rWrtSh.SetAttr( aINetFmt );
238             rReq.Done();
239         }
240         break;
241 
242         case FN_GROW_FONT_SIZE:
243             bGrow = sal_True;
244             // kein break !!
245         case FN_SHRINK_FONT_SIZE:
246         {
247             SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONTHEIGHT, rPool );
248             rWrtSh.GetCurAttr( aSetItem.GetItemSet() );
249             SfxItemSet aAttrSet( rPool, aSetItem.GetItemSet().GetRanges() );
250 
251             const SfxPoolItem* pI;
252             static const sal_uInt16 aScrTypes[] = {
253                 SCRIPTTYPE_LATIN, SCRIPTTYPE_ASIAN, SCRIPTTYPE_COMPLEX, 0 };
254             sal_uInt16 nScriptType = rWrtSh.GetScriptType();
255             for( const sal_uInt16* pScrpTyp = aScrTypes; *pScrpTyp; ++pScrpTyp )
256                 if( ( nScriptType & *pScrpTyp ) &&
257                     0 != ( pI = aSetItem.GetItemOfScript( *pScrpTyp )))
258                 {
259                     SvxFontHeightItem aSize( *(const SvxFontHeightItem*)pI );
260                     SwTwips lSize = (SwTwips) aSize.GetHeight();
261 
262                     if (bGrow)
263                     {
264                         if( lSize == lFontMaxSz )
265                             break;      // das wars, hoeher gehts nicht
266                         if( ( lSize += lFontInc ) > lFontMaxSz )
267                             lSize = lFontMaxSz;
268                     }
269                     else
270                     {
271                         if( 4 == lSize )
272                             break;
273                         if( ( lSize -= lFontInc ) < 4 )
274                             lSize = 4;
275                     }
276                     aSize.SetHeight( lSize );
277                     aAttrSet.Put( aSize );
278                 }
279                 if( aAttrSet.Count() )
280                 {
281                     if( pColl )
282                         pColl->SetFmtAttr( aAttrSet );
283                     else
284                         rWrtSh.SetAttr( aAttrSet );
285                 }
286             rReq.Done();
287         }
288         break;
289 
290         default:
291             ASSERT(sal_False, falscher Dispatcher);
292             return;
293     }
294 }
295 
296 
297 
298 #ifdef CFRONT
299 
300 void lcl_SetAdjust(SvxAdjust eAdjst, SfxItemSet& rSet)
301 {
302     rSet.Put(SvxAdjustItem(eAdjst,RES_PARATR_ADJUST ));
303 }
304 
305 
306 
307 void lcl_SetLineSpace(sal_uInt8 ePropL,SfxItemSet& rSet)
308 {
309     SvxLineSpacingItem aLineSpacing(ePropL, RES_PARATR_LINESPACING );
310     aLineSpacing.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
311     if( 100 == ePropL )
312         aLineSpacing.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
313     else
314         aLineSpacing.SetPropLineSpace(ePropL);
315     rSet.Put( aLineSpacing );
316 }
317 
318 
319 
320 void SwTextShell::ExecParaAttr(SfxRequest &rReq)
321 {
322     // gleiche beide Attribute holen, ist nicht teuerer !!
323     SfxItemSet aSet( GetPool(), RES_PARATR_LINESPACING, RES_PARATR_ADJUST );
324 
325     switch (rReq.GetSlot())
326     {
327     case FN_SET_LEFT_PARA:          lcl_SetAdjust(ADJLEFT,aSet);    break;
328     case FN_SET_RIGHT_PARA:         lcl_SetAdjust(ADJRIGHT,aSet);   break;
329     case FN_SET_CENTER_PARA:        lcl_SetAdjust(ADJCENTER,aSet);  break;
330     case SID_ATTR_PARA_ADJUST_BLOCK:lcl_SetAdjust(ADJBLOCK,aSet);   break;
331 
332     case FN_SET_LINE_SPACE_1:   lcl_SetLineSpace(100,aSet);     break;
333     case FN_SET_LINE_SPACE_15:  lcl_SetLineSpace(150,aSet);     break;
334     case FN_SET_LINE_SPACE_2:   lcl_SetLineSpace(200,aSet);     break;
335 
336     default:
337         DBG_ERROR("SwTextShell::ExecParaAttr falscher Dispatcher");
338         return;
339     }
340     SwWrtShell& rWrtSh = GetShell();
341     SwTxtFmtColl* pColl = rWrtSh.GetCurTxtFmtColl();
342     if(pColl && pColl->IsAutoUpdateFmt())
343     {
344         rWrtSh.AutoUpdatePara(pColl, *pSet);
345     }
346     else
347     {
348         rWrtSh.SetAttr( aSet );
349         rReq.Done( aSet );
350     }
351 }
352 
353 #else
354 
355 
356 
357 void SwTextShell::ExecParaAttr(SfxRequest &rReq)
358 {
359     SvxAdjust eAdjst;
360     sal_uInt8 ePropL;
361     const SfxItemSet* pArgs = rReq.GetArgs();
362 
363     // gleich beide Attribute holen, ist nicht teuerer !!
364     SfxItemSet aSet( GetPool(),
365         RES_PARATR_LINESPACING, RES_PARATR_ADJUST,
366         RES_FRAMEDIR, RES_FRAMEDIR,
367         0 );
368 
369     sal_uInt16 nSlot = rReq.GetSlot();
370     switch (nSlot)
371     {
372         case SID_ATTR_PARA_ADJUST:
373         {
374             if( pArgs && SFX_ITEM_SET == pArgs->GetItemState(RES_PARATR_ADJUST) )
375             {
376                 const SvxAdjustItem& rAdj = (const SvxAdjustItem&) pArgs->Get(RES_PARATR_ADJUST);
377                 SvxAdjustItem aAdj( rAdj.GetAdjust(), RES_PARATR_ADJUST );
378                 if ( rAdj.GetAdjust() == SVX_ADJUST_BLOCK )
379                 {
380                     aAdj.SetLastBlock( rAdj.GetLastBlock() );
381                     aAdj.SetOneWord( rAdj.GetOneWord() );
382                 }
383 
384                 aSet.Put(aAdj);
385             }
386         }
387         break;
388         case SID_ATTR_PARA_ADJUST_LEFT:     eAdjst =  SVX_ADJUST_LEFT;      goto SET_ADJUST;
389         case SID_ATTR_PARA_ADJUST_RIGHT:    eAdjst =  SVX_ADJUST_RIGHT;     goto SET_ADJUST;
390         case SID_ATTR_PARA_ADJUST_CENTER:   eAdjst =  SVX_ADJUST_CENTER;    goto SET_ADJUST;
391         case SID_ATTR_PARA_ADJUST_BLOCK:    eAdjst =  SVX_ADJUST_BLOCK;     goto SET_ADJUST;
392 SET_ADJUST:
393         {
394             aSet.Put(SvxAdjustItem(eAdjst,RES_PARATR_ADJUST));
395             rReq.AppendItem( SfxBoolItem( GetPool().GetWhich(nSlot), sal_True ) );
396         }
397         break;
398 
399         case SID_ATTR_PARA_LINESPACE:
400             if(pArgs && SFX_ITEM_SET == pArgs->GetItemState( GetPool().GetWhich(nSlot) ))
401             {
402                 SvxLineSpacingItem aLineSpace = (const SvxLineSpacingItem&)pArgs->Get(
403                                                             GetPool().GetWhich(nSlot));
404                 aSet.Put( aLineSpace );
405             }
406         break;
407         case SID_ATTR_PARA_LINESPACE_10:    ePropL = 100;   goto SET_LINESPACE;
408         case SID_ATTR_PARA_LINESPACE_15:    ePropL = 150;   goto SET_LINESPACE;
409         case SID_ATTR_PARA_LINESPACE_20:    ePropL = 200;   goto SET_LINESPACE;
410 
411 SET_LINESPACE:
412         {
413 
414             SvxLineSpacingItem aLineSpacing(ePropL, RES_PARATR_LINESPACING );
415             aLineSpacing.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
416             if( 100 == ePropL )
417                 aLineSpacing.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
418             else
419                 aLineSpacing.SetPropLineSpace(ePropL);
420             aSet.Put( aLineSpacing );
421         }
422         break;
423 
424         case SID_ATTR_PARA_LEFT_TO_RIGHT :
425         case SID_ATTR_PARA_RIGHT_TO_LEFT :
426         {
427             sal_Bool bSet = sal_True;
428             int eState = pArgs ? pArgs->GetItemState(nSlot) : SFX_ITEM_DISABLED;
429             if (pArgs && SFX_ITEM_SET == eState)
430                 bSet = ((const SfxBoolItem&)pArgs->Get(nSlot)).GetValue();
431 /*
432 // toggling of the slots not used anymore
433 
434            if(!bSet)
435                 nSlot = SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot ?
436                     SID_ATTR_PARA_RIGHT_TO_LEFT :
437                     SID_ATTR_PARA_LEFT_TO_RIGHT;
438 */
439             SfxItemSet aAdjustSet( GetPool(),
440                     RES_PARATR_ADJUST, RES_PARATR_ADJUST );
441             GetShell().GetCurAttr(aAdjustSet);
442             sal_Bool bChgAdjust = sal_False;
443             SfxItemState eAdjustState = aAdjustSet.GetItemState(RES_PARATR_ADJUST, sal_False);
444             if(eAdjustState  >= SFX_ITEM_DEFAULT)
445             {
446                 int eAdjust = (int)(( const SvxAdjustItem& )
447                         aAdjustSet.Get(RES_PARATR_ADJUST)).GetAdjust();
448 //                bChgAdjust = SVX_ADJUST_CENTER  != eAdjust  &&  SVX_ADJUST_BLOCK != eAdjust;
449                 bChgAdjust = (SVX_ADJUST_LEFT  == eAdjust  &&  SID_ATTR_PARA_RIGHT_TO_LEFT == nSlot) ||
450                              (SVX_ADJUST_RIGHT == eAdjust  &&  SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot);
451             }
452             else
453                 bChgAdjust = sal_True;
454 
455             SvxFrameDirection eFrmDirection =
456                     (SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot) ?
457                         FRMDIR_HORI_LEFT_TOP : FRMDIR_HORI_RIGHT_TOP;
458             aSet.Put( SvxFrameDirectionItem( eFrmDirection, RES_FRAMEDIR ) );
459 
460             if (bChgAdjust)
461             {
462                 SvxAdjust eAdjust = (SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot) ?
463                         SVX_ADJUST_LEFT : SVX_ADJUST_RIGHT;
464                 SvxAdjustItem aAdjust( eAdjust, RES_PARATR_ADJUST );
465                 aSet.Put( aAdjust );
466                 aAdjust.SetWhich(SID_ATTR_PARA_ADJUST);
467                 GetView().GetViewFrame()->GetBindings().SetState( aAdjust );
468                 // Toggle numbering alignment
469                 const SwNumRule* pCurRule = GetShell().GetCurNumRule();
470                 if( pCurRule )
471                 {
472                     SvxNumRule aRule = pCurRule->MakeSvxNumRule();
473 
474                     for(sal_uInt16 i = 0; i < aRule.GetLevelCount(); i++)
475                     {
476                         SvxNumberFormat aFmt(aRule.GetLevel(i));
477                         if(SVX_ADJUST_LEFT == aFmt.GetNumAdjust())
478                             aFmt.SetNumAdjust( SVX_ADJUST_RIGHT );
479 
480                         else if(SVX_ADJUST_RIGHT == aFmt.GetNumAdjust())
481                             aFmt.SetNumAdjust( SVX_ADJUST_LEFT );
482 
483                         aRule.SetLevel(i, aFmt, aRule.Get(i) != 0);
484                     }
485                     // --> OD 2008-02-11 #newlistlevelattrs#
486                     SwNumRule aSetRule( pCurRule->GetName(),
487                                         pCurRule->Get( 0 ).GetPositionAndSpaceMode() );
488                     // <--
489                     aSetRule.SetSvxRule( aRule, GetShell().GetDoc());
490                     aSetRule.SetAutoRule( sal_True );
491                     // --> OD 2008-03-17 #refactorlists#
492                     // no start or continuation of a list - list style is only changed
493                     GetShell().SetCurNumRule( aSetRule, false );
494                     // <--
495                 }
496             }
497         }
498         break;
499 
500         default:
501             ASSERT(sal_False, falscher Dispatcher);
502             return;
503     }
504     SwWrtShell& rWrtSh = GetShell();
505     SwTxtFmtColl* pColl = rWrtSh.GetCurTxtFmtColl();
506     if(pColl && pColl->IsAutoUpdateFmt())
507     {
508         rWrtSh.AutoUpdatePara(pColl, aSet);
509     }
510     else
511         rWrtSh.SetAttr( aSet );
512     rReq.Done();
513 }
514 
515 #endif
516 
517 
518 
519 void SwTextShell::ExecParaAttrArgs(SfxRequest &rReq)
520 {
521     SwWrtShell &rSh = GetShell();
522     const SfxItemSet *pArgs = rReq.GetArgs();
523     const SfxPoolItem *pItem = 0;
524 
525     sal_uInt16 nSlot = rReq.GetSlot();
526     if(pArgs)
527         pArgs->GetItemState(GetPool().GetWhich(nSlot), sal_False, &pItem);
528     switch ( nSlot )
529     {
530         case FN_DROP_CHAR_STYLE_NAME:
531             if( pItem )
532             {
533                 String sCharStyleName = ((const SfxStringItem*)pItem)->GetValue();
534                 SfxItemSet aSet(GetPool(), RES_PARATR_DROP, RES_PARATR_DROP, 0L);
535                 rSh.GetCurAttr(aSet);
536                 SwFmtDrop aDropItem((const SwFmtDrop&)aSet.Get(RES_PARATR_DROP));
537                 SwCharFmt* pFmt = 0;
538                 if(sCharStyleName.Len())
539                     pFmt = rSh.FindCharFmtByName( sCharStyleName );
540                 aDropItem.SetCharFmt( pFmt );
541                 aSet.Put(aDropItem);
542                 rSh.SetAttr(aSet);
543             }
544         break;
545         case FN_FORMAT_DROPCAPS:
546         {
547             if(pItem)
548             {
549                 rSh.SetAttr(*pItem);
550                 rReq.Done();
551             }
552             else
553             {
554                 SfxItemSet aSet(GetPool(), RES_PARATR_DROP, RES_PARATR_DROP,
555                                            HINT_END, HINT_END, 0);
556                 rSh.GetCurAttr(aSet);
557                 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
558                 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
559 
560                 SfxAbstractDialog* pDlg = pFact->CreateSfxDialog( GetView().GetWindow(), aSet,
561                     rSh.GetView().GetViewFrame()->GetFrame().GetFrameInterface(), DLG_SWDROPCAPS );
562                 DBG_ASSERT(pDlg, "Dialogdiet fail!");
563                 if (pDlg->Execute() == RET_OK)
564                 {
565                     rSh.StartAction();
566                     rSh.StartUndo( UNDO_START );
567                     if ( SFX_ITEM_SET == aSet.GetItemState(HINT_END,sal_False,&pItem) )
568                     {
569                         if ( ((SfxStringItem*)pItem)->GetValue().Len() )
570                             rSh.ReplaceDropTxt(((SfxStringItem*)pItem)->GetValue());
571                     }
572                     rSh.SetAttr(*pDlg->GetOutputItemSet());
573                     rSh.StartUndo( UNDO_END );
574                     rSh.EndAction();
575                     rReq.Done(*pDlg->GetOutputItemSet());
576                 }
577                 delete pDlg;
578             }
579         }
580         break;
581         case SID_ATTR_PARA_PAGEBREAK:
582             if(pItem)
583             {
584                 rSh.SetAttr( *pItem );
585                 rReq.Done();
586             }
587         break;
588         case SID_ATTR_PARA_MODEL:
589         {
590             if(pItem)
591             {
592                 SfxItemSet aCoreSet( GetPool(),
593                     RES_PAGEDESC,   RES_PAGEDESC,
594                     SID_ATTR_PARA_MODEL, SID_ATTR_PARA_MODEL, 0);
595                 aCoreSet.Put(*pItem);
596                 SfxToSwPageDescAttr( rSh, aCoreSet);
597                 rSh.SetAttr(aCoreSet);
598                 rReq.Done();
599             }
600         }
601         break;
602 
603         default:
604             ASSERT(sal_False, falscher Dispatcher);
605             return;
606     }
607 }
608 
609 
610 
611 void SwTextShell::GetAttrState(SfxItemSet &rSet)
612 {
613     SwWrtShell &rSh = GetShell();
614     SfxItemPool& rPool = GetPool();
615     SfxItemSet aCoreSet(rPool, aTxtFmtCollSetRange);
616     rSh.GetCurAttr(aCoreSet); // *alle* Textattribute von der Core erfragen
617 
618     SfxWhichIter aIter(rSet);
619     sal_uInt16 nSlot = aIter.FirstWhich();
620     sal_Bool bFlag = sal_False;
621     SfxBoolItem aFlagItem;
622     const SfxPoolItem* pItem = 0;
623     int eAdjust = -1;   // Illegaler Wert, um DONTCARE zu erkennen
624     SfxItemState eState = aCoreSet.GetItemState(RES_PARATR_ADJUST, sal_False, &pItem);
625 
626     if( SFX_ITEM_DEFAULT == eState )
627         pItem = &rPool.GetDefaultItem(RES_PARATR_ADJUST);
628     if( SFX_ITEM_DEFAULT <= eState )
629         eAdjust = (int)(( SvxAdjustItem* ) pItem)->GetAdjust();
630 
631     short nEsc = 0;
632     eState =  aCoreSet.GetItemState(RES_CHRATR_ESCAPEMENT, sal_False, &pItem);
633     if( SFX_ITEM_DEFAULT == eState )
634         pItem = &rPool.GetDefaultItem(RES_CHRATR_ESCAPEMENT);
635     if( eState >= SFX_ITEM_DEFAULT )
636         nEsc = ((SvxEscapementItem* )pItem)->GetEsc();
637 
638     sal_uInt16 nLineSpace = 0;
639     eState =  aCoreSet.GetItemState(RES_PARATR_LINESPACING, sal_False, &pItem);
640     if( SFX_ITEM_DEFAULT == eState )
641         pItem = &rPool.GetDefaultItem(RES_PARATR_LINESPACING);
642     if( SFX_ITEM_DEFAULT <= eState &&
643             ((SvxLineSpacingItem* )pItem)->GetLineSpaceRule() == SVX_LINE_SPACE_AUTO )
644     {
645         if(SVX_INTER_LINE_SPACE_OFF ==
646                     ((SvxLineSpacingItem* )pItem)->GetInterLineSpaceRule())
647             nLineSpace = 100;
648         else
649             nLineSpace = ((SvxLineSpacingItem* )pItem)->GetPropLineSpace();
650     }
651 
652     while (nSlot)
653     {
654         switch(nSlot)
655         {
656             case FN_SET_SUPER_SCRIPT:
657                     bFlag = 0 < nEsc;
658                 break;
659             case FN_SET_SUB_SCRIPT:
660                     bFlag = 0 > nEsc;
661                 break;
662             case SID_ATTR_PARA_ADJUST_LEFT:
663                 if (eAdjust == -1)
664                 {
665                     rSet.InvalidateItem( nSlot );
666                     nSlot = 0;
667                 }
668                 else
669                     bFlag = SVX_ADJUST_LEFT == eAdjust;
670                 break;
671             case SID_ATTR_PARA_ADJUST_RIGHT:
672                 if (eAdjust == -1)
673                 {
674                     rSet.InvalidateItem( nSlot );
675                     nSlot = 0;
676                 }
677                 else
678                     bFlag = SVX_ADJUST_RIGHT == eAdjust;
679                 break;
680             case SID_ATTR_PARA_ADJUST_CENTER:
681                 if (eAdjust == -1)
682                 {
683                     rSet.InvalidateItem( nSlot );
684                     nSlot = 0;
685                 }
686                 else
687                     bFlag = SVX_ADJUST_CENTER == eAdjust;
688                 break;
689             case SID_ATTR_PARA_ADJUST_BLOCK:
690             {
691                 if (eAdjust == -1)
692                 {
693                     rSet.InvalidateItem( nSlot );
694                     nSlot = 0;
695                 }
696                 else
697                 {
698                     bFlag = SVX_ADJUST_BLOCK == eAdjust;
699                     sal_uInt16 nHtmlMode = GetHtmlMode(rSh.GetView().GetDocShell());
700                     if((nHtmlMode & HTMLMODE_ON) && !(nHtmlMode & (HTMLMODE_FULL_STYLES|HTMLMODE_FIRSTLINE) ))
701                     {
702                         rSet.DisableItem( nSlot );
703                         nSlot = 0;
704                     }
705                 }
706             }
707             break;
708             case SID_ATTR_PARA_LINESPACE_10:
709                 bFlag = nLineSpace == 100;
710             break;
711             case SID_ATTR_PARA_LINESPACE_15:
712                 bFlag = nLineSpace == 150;
713             break;
714             case SID_ATTR_PARA_LINESPACE_20:
715                 bFlag = nLineSpace == 200;
716             break;
717             case FN_GROW_FONT_SIZE:
718             case FN_SHRINK_FONT_SIZE:
719             {
720                 SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONTHEIGHT,
721                                             *rSet.GetPool() );
722                 aSetItem.GetItemSet().Put( aCoreSet, sal_False );
723                 if( !aSetItem.GetItemOfScript( rSh.GetScriptType() ))
724                     rSet.DisableItem( nSlot );
725                 nSlot = 0;
726             }
727             break;
728             case FN_UNDERLINE_DOUBLE:
729             {
730                 eState = aCoreSet.GetItemState(RES_CHRATR_UNDERLINE);
731                 if( eState >= SFX_ITEM_DEFAULT )
732                 {
733                     FontUnderline eUnderline =  ((const SvxUnderlineItem&)
734                             aCoreSet.Get(RES_CHRATR_UNDERLINE)).GetLineStyle();
735                     rSet.Put(SfxBoolItem(nSlot, eUnderline == UNDERLINE_DOUBLE));
736                 }
737                 else
738                     rSet.InvalidateItem(nSlot);
739                 nSlot = 0;
740             }
741             break;
742             case SID_ATTR_PARA_ADJUST:
743                 if (eAdjust == -1)
744                     rSet.InvalidateItem( nSlot );
745                 else
746                     rSet.Put(SvxAdjustItem((SvxAdjust)eAdjust, SID_ATTR_PARA_ADJUST ));
747                 nSlot = 0;
748             break;
749             case SID_ATTR_PARA_LRSPACE:
750             {
751                 eState = aCoreSet.GetItemState(RES_LR_SPACE);
752                 if( eState >= SFX_ITEM_DEFAULT )
753                 {
754                     SvxLRSpaceItem aLR = ( (const SvxLRSpaceItem&) aCoreSet.Get( RES_LR_SPACE ) );
755                     aLR.SetWhich(SID_ATTR_PARA_LRSPACE);
756                     rSet.Put(aLR);
757                 }
758                 else
759                     rSet.InvalidateItem(nSlot);
760                 nSlot = 0;
761             }
762 
763             case SID_ATTR_PARA_LEFT_TO_RIGHT :
764             case SID_ATTR_PARA_RIGHT_TO_LEFT :
765             {
766                 if ( !SW_MOD()->GetCTLOptions().IsCTLFontEnabled() )
767                 {
768                     rSet.DisableItem( nSlot );
769                     nSlot = 0;
770                 }
771                 else
772                 {
773                     // is the item set?
774                     sal_uInt16 nHtmlMode = GetHtmlMode(rSh.GetView().GetDocShell());
775                     if((!(nHtmlMode & HTMLMODE_ON) || (0 != (nHtmlMode & HTMLMODE_SOME_STYLES))) &&
776                     aCoreSet.GetItemState( RES_FRAMEDIR, sal_False ) >= SFX_ITEM_DEFAULT)
777                     {
778                         SvxFrameDirection eFrmDir = (SvxFrameDirection)
779                                 ((const SvxFrameDirectionItem& )aCoreSet.Get(RES_FRAMEDIR)).GetValue();
780                         if (FRMDIR_ENVIRONMENT == eFrmDir)
781                         {
782                             eFrmDir = rSh.IsInRightToLeftText() ?
783                                     FRMDIR_HORI_RIGHT_TOP : FRMDIR_HORI_LEFT_TOP;
784                         }
785                         bFlag = (SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot &&
786                                             FRMDIR_HORI_LEFT_TOP == eFrmDir) ||
787                                 (SID_ATTR_PARA_RIGHT_TO_LEFT == nSlot &&
788                                             FRMDIR_HORI_RIGHT_TOP == eFrmDir);
789                     }
790                     else
791                     {
792                         rSet.InvalidateItem(nSlot);
793                         nSlot = 0;
794                     }
795                 }
796             }
797             break;
798 
799             case SID_ATTR_CHAR_LANGUAGE:
800             case SID_ATTR_CHAR_KERNING:
801             case RES_PARATR_DROP:
802             {
803 #if OSL_DEBUG_LEVEL > 1
804                 const SfxPoolItem& rItem = aCoreSet.Get(GetPool().GetWhich(nSlot), sal_True);
805                 rSet.Put(rItem);
806 #else
807                 rSet.Put(aCoreSet.Get( GetPool().GetWhich(nSlot), sal_True));
808 #endif
809                 nSlot = 0;
810             }
811             break;
812             case SID_ATTR_PARA_MODEL:
813             {
814                 SfxItemSet aTemp(GetPool(),
815                         RES_PAGEDESC,RES_PAGEDESC,
816                         SID_ATTR_PARA_MODEL,SID_ATTR_PARA_MODEL,
817                         0L);
818                 aTemp.Put(aCoreSet);
819                 ::SwToSfxPageDescAttr(aTemp);
820                 rSet.Put(aTemp.Get(SID_ATTR_PARA_MODEL));
821                 nSlot = 0;
822             }
823             break;
824             case RES_TXTATR_INETFMT:
825             {
826                 SfxItemSet aSet(GetPool(), RES_TXTATR_INETFMT, RES_TXTATR_INETFMT);
827                 rSh.GetCurAttr(aSet);
828 #if OSL_DEBUG_LEVEL > 1
829                 const SfxPoolItem& rItem = aSet.Get(RES_TXTATR_INETFMT, sal_True);
830                 rSet.Put(rItem);
831 #else
832                 rSet.Put(aSet.Get( RES_TXTATR_INETFMT, sal_True));
833 #endif
834                 nSlot = 0;
835             }
836             break;
837 
838             default:
839             // Nichts tun
840             nSlot = 0;
841             break;
842 
843         }
844         if( nSlot )
845         {
846             aFlagItem.SetWhich( nSlot );
847             aFlagItem.SetValue( bFlag );
848             rSet.Put( aFlagItem );
849         }
850         nSlot = aIter.NextWhich();
851     }
852 
853     rSet.Put(aCoreSet,sal_False);
854 }
855 
856 
857 
858