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