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 #define _SW_FRMVALID_HXX 29 #include <hintids.hxx> 30 31 #include <svl/globalnameitem.hxx> 32 #include <sfx2/objface.hxx> 33 #include <sfx2/lnkbase.hxx> 34 35 #include <tools/errinf.hxx> 36 #include <svx/svdview.hxx> 37 #include <svl/ptitem.hxx> 38 #include <svl/stritem.hxx> 39 #include <unotools/moduleoptions.hxx> 40 #include <vcl/msgbox.hxx> 41 #include <sfx2/fcontnr.hxx> 42 #include <svx/hlnkitem.hxx> 43 #include <svl/srchitem.hxx> 44 #include <sfx2/dispatch.hxx> 45 #include <sfx2/docfile.hxx> 46 #include <svl/urihelper.hxx> 47 #include <basic/sbxvar.hxx> 48 #include <svl/whiter.hxx> 49 #include <sfx2/request.hxx> 50 #include <editeng/opaqitem.hxx> 51 #include <editeng/fontitem.hxx> 52 #include <editeng/adjitem.hxx> 53 #include <editeng/boxitem.hxx> 54 #include <editeng/sizeitem.hxx> 55 #include <editeng/svxacorr.hxx> 56 #include <editeng/scripttypeitem.hxx> 57 #include <svtools/filter.hxx> 58 #include <svx/htmlmode.hxx> 59 #include <svx/pfiledlg.hxx> 60 #include <svtools/htmlcfg.hxx> 61 #include <com/sun/star/i18n/TransliterationModules.hpp> 62 #include <com/sun/star/i18n/TransliterationModulesExtra.hpp> 63 64 #include <sot/clsids.hxx> 65 #include <editeng/acorrcfg.hxx> 66 #include <wdocsh.hxx> 67 #include <fmtinfmt.hxx> 68 #include <fmtclds.hxx> 69 #include <fmtsrnd.hxx> 70 #include <fmtfsize.hxx> 71 #include <swmodule.hxx> 72 #include <wrtsh.hxx> 73 #include <view.hxx> 74 #include <docsh.hxx> 75 #include <doc.hxx> 76 #include <uitool.hxx> 77 #include <cmdid.h> 78 #include <globals.hrc> 79 #include <frmmgr.hxx> 80 #include <textsh.hxx> 81 #include <frmfmt.hxx> 82 #include <tablemgr.hxx> 83 #include <swundo.hxx> // fuer Undo-IDs 84 #include <shellio.hxx> 85 #include <frmdlg.hxx> 86 #include <usrpref.hxx> 87 #include <swtable.hxx> 88 #include <tblafmt.hxx> 89 #include <caption.hxx> 90 #include <idxmrk.hxx> 91 #include <poolfmt.hxx> 92 #include <breakit.hxx> 93 #include <crsskip.hxx> 94 #include <modcfg.hxx> 95 #include <column.hxx> 96 #include <edtwin.hxx> 97 #include <shells.hrc> 98 #include <popup.hrc> 99 #include <swerror.h> 100 #include <SwAppletImpl.hxx> 101 #include <unochart.hxx> 102 103 #include <chartins.hxx> 104 105 #define SwTextShell 106 #define Paragraph 107 #define HyphenZone 108 #define TextFont 109 #define DropCap 110 #include <sfx2/msg.hxx> 111 #include <sfx2/sidebar/EnumContext.hxx> 112 #include <swslots.hxx> 113 #include <SwRewriter.hxx> 114 #include <comcore.hrc> 115 116 using namespace ::com::sun::star; 117 using ::rtl::OUString; 118 119 #include <svx/svxdlg.hxx> 120 #include <svx/dialogs.hrc> 121 #include "swabstdlg.hxx" 122 #include <misc.hrc> 123 #include <table.hrc> 124 #include <frmui.hrc> 125 #include <unomid.h> 126 127 128 129 /*-------------------------------------------------------------------- 130 Beschreibung: 131 --------------------------------------------------------------------*/ 132 133 SFX_IMPL_INTERFACE(SwTextShell, SwBaseShell, SW_RES(STR_SHELLNAME_TEXT)) 134 { 135 SFX_POPUPMENU_REGISTRATION(SW_RES(MN_TEXT_POPUPMENU)); 136 SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_TEXT_TOOLBOX)); 137 SFX_CHILDWINDOW_REGISTRATION(FN_EDIT_FORMULA); 138 SFX_CHILDWINDOW_REGISTRATION(FN_INSERT_FIELD); 139 SFX_CHILDWINDOW_REGISTRATION(FN_INSERT_IDX_ENTRY_DLG); 140 SFX_CHILDWINDOW_REGISTRATION(FN_INSERT_AUTH_ENTRY_DLG); 141 SFX_CHILDWINDOW_REGISTRATION(SID_RUBY_DIALOG); 142 } 143 144 145 146 TYPEINIT1(SwTextShell,SwBaseShell) 147 148 149 150 void SwTextShell::ExecInsert(SfxRequest &rReq) 151 { 152 SwWrtShell &rSh = GetShell(); 153 154 ASSERT( !rSh.IsObjSelected() && !rSh.IsFrmSelected(), 155 "Falsche Shell auf dem Dispatcher" ); 156 157 const SfxItemSet *pArgs = rReq.GetArgs(); 158 const SfxPoolItem* pItem = 0; 159 sal_uInt16 nSlot = rReq.GetSlot(); 160 if(pArgs) 161 pArgs->GetItemState(nSlot, sal_False, &pItem ); 162 163 switch( nSlot ) 164 { 165 case FN_INSERT_STRING: 166 if( pItem ) 167 rSh.InsertByWord(((const SfxStringItem *)pItem)->GetValue()); 168 break; 169 170 case FN_INSERT_SOFT_HYPHEN: 171 if( CHAR_SOFTHYPHEN != rSh.SwCrsrShell::GetChar( sal_True, 0 ) && 172 CHAR_SOFTHYPHEN != rSh.SwCrsrShell::GetChar( sal_True, -1 )) 173 rSh.Insert( String( CHAR_SOFTHYPHEN ) ); 174 break; 175 176 case FN_INSERT_HARDHYPHEN: 177 case FN_INSERT_HARD_SPACE: 178 { 179 const sal_Unicode cIns = FN_INSERT_HARD_SPACE == nSlot ? CHAR_HARDBLANK : CHAR_HARDHYPHEN; 180 181 SvxAutoCorrCfg* pACfg = SvxAutoCorrCfg::Get(); 182 SvxAutoCorrect* pACorr = pACfg->GetAutoCorrect(); 183 if( pACorr && pACfg->IsAutoFmtByInput() 184 && pACorr->IsAutoCorrFlag( 185 CptlSttSntnc | CptlSttWrd | AddNonBrkSpace | ChgOrdinalNumber | ChgToEnEmDash | SetINetAttr | Autocorrect ) ) 186 { 187 rSh.AutoCorrect( *pACorr, cIns ); 188 } 189 else 190 { 191 rSh.Insert( String( cIns ) ); 192 } 193 } 194 break; 195 196 case SID_INSERT_RLM : 197 case SID_INSERT_LRM : 198 case SID_INSERT_ZWNBSP : 199 case SID_INSERT_ZWSP: 200 { 201 sal_Unicode cIns = 0; 202 switch(nSlot) 203 { 204 case SID_INSERT_RLM : cIns = CHAR_RLM ; break; 205 case SID_INSERT_LRM : cIns = CHAR_LRM ; break; 206 case SID_INSERT_ZWSP : cIns = CHAR_ZWSP ; break; 207 case SID_INSERT_ZWNBSP: cIns = CHAR_ZWNBSP; break; 208 } 209 rSh.Insert( String( cIns ) ); 210 } 211 break; 212 213 case FN_INSERT_BREAK: 214 { 215 if( !rSh.CrsrInsideInputFld() ) 216 { 217 rSh.SplitNode(); 218 } 219 else 220 { 221 rSh.InsertLineBreak(); 222 } 223 } 224 rReq.Done(); 225 break; 226 227 case FN_INSERT_PAGEBREAK: 228 rSh.InsertPageBreak(); 229 rReq.Done(); 230 break; 231 232 case FN_INSERT_LINEBREAK: 233 rSh.InsertLineBreak(); 234 rReq.Done(); 235 break; 236 237 case FN_INSERT_COLUMN_BREAK: 238 rSh.InsertColumnBreak(); 239 rReq.Done(); 240 break; 241 242 case SID_HYPERLINK_SETLINK: 243 if (pItem) 244 InsertHyperlink(*((const SvxHyperlinkItem *)pItem)); 245 rReq.Done(); 246 break; 247 248 case SID_INSERT_AVMEDIA: 249 rReq.SetReturnValue(SfxBoolItem(nSlot, InsertMediaDlg( rReq ))); 250 break; 251 252 case SID_INSERT_SOUND: 253 case SID_INSERT_VIDEO: 254 { 255 SvxPluginFileDlg aDlg( &GetView().GetViewFrame()->GetWindow(), nSlot ); 256 aDlg.SetContext( nSlot == SID_INSERT_SOUND? sfx2::FileDialogHelper::SW_INSERT_SOUND : sfx2::FileDialogHelper::SW_INSERT_VIDEO ); 257 258 if ( ERRCODE_NONE == aDlg.Execute() ) 259 { 260 // URL ermitteln 261 String aStrURL( aDlg.GetPath() ); 262 aStrURL = URIHelper::SmartRel2Abs( 263 INetURLObject(), aStrURL, URIHelper::GetMaybeFileHdl() ); 264 265 INetURLObject* pURL = new INetURLObject(); 266 pURL->SetSmartProtocol( INET_PROT_FILE ); 267 268 if ( pURL->SetURL( aStrURL, INetURLObject::WAS_ENCODED ) ) 269 { 270 ::rtl::OUString aName; 271 comphelper::EmbeddedObjectContainer aCnt; 272 svt::EmbeddedObjectRef xObj( aCnt.CreateEmbeddedObject( SvGlobalName( SO3_PLUGIN_CLASSID ).GetByteSequence(), aName ), embed::Aspects::MSOLE_CONTENT ); 273 if ( xObj.is() ) 274 { 275 svt::EmbeddedObjectRef::TryRunningState( xObj.GetObject() ); 276 277 // set properties from dialog 278 uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY ); 279 if ( xSet.is() ) 280 { 281 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("PluginURL"), 282 uno::makeAny( ::rtl::OUString( pURL->GetMainURL( INetURLObject::NO_DECODE ) ) ) ); 283 } 284 } 285 286 rSh.InsertObject( xObj, 0, sal_True, nSlot); 287 } 288 } 289 } 290 break; 291 292 case SID_INSERT_OBJECT: 293 case SID_INSERT_PLUGIN: 294 { 295 SFX_REQUEST_ARG( rReq, pNameItem, SfxGlobalNameItem, SID_INSERT_OBJECT, sal_False ); 296 SvGlobalName *pName = NULL; 297 SvGlobalName aName; 298 if ( pNameItem ) 299 { 300 aName = pNameItem->GetValue(); 301 pName = &aName; 302 } 303 304 SFX_REQUEST_ARG( rReq, pClassLocationItem, SfxStringItem, FN_PARAM_2, sal_False ); 305 SFX_REQUEST_ARG( rReq, pCommandsItem, SfxStringItem, FN_PARAM_3, sal_False ); 306 //TODO/LATER: recording currently not working, need code for Commandlist 307 svt::EmbeddedObjectRef xObj; 308 if( nSlot == SID_INSERT_PLUGIN && ( pClassLocationItem || pCommandsItem ) ) 309 { 310 String sClassLocation; 311 if(pClassLocationItem) 312 sClassLocation = pClassLocationItem->GetValue(); 313 314 SvCommandList aCommandList; 315 if(pCommandsItem) 316 { 317 sal_uInt16 nTemp; 318 aCommandList.AppendCommands( pCommandsItem->GetValue(), &nTemp ); 319 } 320 321 { 322 comphelper::EmbeddedObjectContainer aCnt; 323 ::rtl::OUString sName; 324 xObj.Assign( aCnt.CreateEmbeddedObject( SvGlobalName( SO3_PLUGIN_CLASSID ).GetByteSequence(), sName ), 325 embed::Aspects::MSOLE_CONTENT ); 326 svt::EmbeddedObjectRef::TryRunningState( xObj.GetObject() ); 327 uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY ); 328 if ( xSet.is() ) 329 { 330 try 331 { 332 if ( sClassLocation.Len() ) 333 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("PluginURL"), 334 uno::makeAny( 335 ::rtl::OUString( 336 URIHelper::SmartRel2Abs( 337 INetURLObject(), sClassLocation, 338 URIHelper::GetMaybeFileHdl()) ) ) ); 339 uno::Sequence< beans::PropertyValue > aSeq; 340 if ( aCommandList.Count() ) 341 { 342 aCommandList.FillSequence( aSeq ); 343 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("PluginCommands"), uno::makeAny( aSeq ) ); 344 } 345 } 346 catch ( uno::Exception& ) 347 { 348 } 349 } 350 } 351 352 if(xObj.is()) 353 rSh.InsertOleObject( xObj ); 354 } 355 else 356 { 357 DBG_ASSERT( !pNameItem || nSlot == SID_INSERT_OBJECT, "Superfluous argument!" ); 358 rSh.InsertObject( xObj, pName, sal_True, nSlot); 359 rReq.Done(); 360 } 361 break; 362 } 363 case SID_INSERT_FLOATINGFRAME: 364 { 365 svt::EmbeddedObjectRef xObj; 366 SFX_REQUEST_ARG( rReq, pNameItem, SfxStringItem, FN_PARAM_1, sal_False ); 367 SFX_REQUEST_ARG( rReq, pURLItem, SfxStringItem, FN_PARAM_2, sal_False ); 368 SFX_REQUEST_ARG( rReq, pMarginItem, SvxSizeItem, FN_PARAM_3, sal_False ); 369 SFX_REQUEST_ARG( rReq, pScrollingItem, SfxByteItem, FN_PARAM_4, sal_False ); 370 SFX_REQUEST_ARG( rReq, pBorderItem, SfxBoolItem, FN_PARAM_5, sal_False ); 371 372 if(pURLItem) // URL is a _must_ 373 { 374 comphelper::EmbeddedObjectContainer aCnt; 375 ::rtl::OUString aName; 376 xObj.Assign( aCnt.CreateEmbeddedObject( SvGlobalName( SO3_IFRAME_CLASSID ).GetByteSequence(), aName ), 377 embed::Aspects::MSOLE_CONTENT ); 378 svt::EmbeddedObjectRef::TryRunningState( xObj.GetObject() ); 379 uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY ); 380 if ( xSet.is() ) 381 { 382 try 383 { 384 ScrollingMode eScroll = ScrollingAuto; 385 if( pScrollingItem && pScrollingItem->GetValue() <= ScrollingAuto ) 386 eScroll = (ScrollingMode) pScrollingItem->GetValue(); 387 388 Size aMargin; 389 if ( pMarginItem ) 390 aMargin = pMarginItem->GetSize(); 391 392 if ( pURLItem ) 393 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameURL"), uno::makeAny( ::rtl::OUString( pURLItem->GetValue() ) ) ); 394 if ( pNameItem ) 395 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameName"), uno::makeAny( ::rtl::OUString( pNameItem->GetValue() ) ) ); 396 397 if ( eScroll == ScrollingAuto ) 398 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameIsAutoScroll"), 399 uno::makeAny( sal_True ) ); 400 else 401 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameIsScrollingMode"), 402 uno::makeAny( (sal_Bool) ( eScroll == ScrollingYes) ) ); 403 404 //if ( aFrmDescr.IsFrameBorderSet() ) 405 if ( pBorderItem ) 406 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameIsBorder"), 407 uno::makeAny( (sal_Bool) pBorderItem->GetValue() ) ); 408 /*else 409 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameIsAutoBorder"), 410 makeAny( sal_True ) );*/ 411 412 if ( pMarginItem ) 413 { 414 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameMarginWidth"), 415 uno::makeAny( sal_Int32( aMargin.Width() ) ) ); 416 417 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameMarginHeight"), 418 uno::makeAny( sal_Int32( aMargin.Height() ) ) ); 419 } 420 } 421 catch ( uno::Exception& ) 422 { 423 } 424 } 425 426 rSh.InsertOleObject( xObj ); 427 } 428 else 429 { 430 rSh.InsertObject( xObj, 0, sal_True, nSlot); 431 rReq.Done(); 432 } 433 } 434 break; 435 case SID_INSERT_DIAGRAM: 436 { 437 SvtModuleOptions aMOpt; 438 if ( !aMOpt.IsChart() ) 439 break; 440 if(!rReq.IsAPI()) 441 { 442 SfxViewFrame* pVFrame = GetView().GetViewFrame(); 443 SwInsertChart( &GetView().GetEditWin(), &pVFrame->GetBindings() ); 444 } 445 else 446 { 447 uno::Reference< chart2::data::XDataProvider > xDataProvider; 448 sal_Bool bFillWithData = sal_True; 449 OUString aRangeString; 450 if (!GetShell().IsTblComplexForChart()) 451 { 452 SwFrmFmt* pTblFmt = GetShell().GetTableFmt(); 453 String aCurrentTblName = pTblFmt->GetName(); 454 // String aText( String::CreateFromAscii("<.>") ); // was used for UI 455 // aText.Insert( rWrtShell.GetBoxNms(), 2); 456 // aText.Insert( aCurrentTblName, 1 ); 457 aRangeString = aCurrentTblName; 458 aRangeString += OUString::valueOf( sal_Unicode('.') ); 459 aRangeString += GetShell().GetBoxNms(); 460 461 // get table data provider 462 xDataProvider.set( GetView().GetDocShell()->getIDocumentChartDataProviderAccess()->GetChartDataProvider() ); 463 } 464 else 465 bFillWithData = sal_False; // will create chart with only it's default image 466 467 SwTableFUNC( &rSh, sal_False ).InsertChart( xDataProvider, bFillWithData, aRangeString ); 468 rSh.LaunchOLEObj(); 469 470 svt::EmbeddedObjectRef& xObj = rSh.GetOLEObject(); 471 if(pItem && xObj.is()) 472 { 473 Size aSize(((SvxSizeItem*)pItem)->GetSize()); 474 aSize = OutputDevice::LogicToLogic 475 ( aSize, MapMode( MAP_TWIP ), MapMode( MAP_100TH_MM ) ); 476 477 if(aSize.Width() > MINLAY&& aSize.Height()> MINLAY) 478 { 479 awt::Size aSz; 480 aSz.Width = aSize.Width(); 481 aSz.Height = aSize.Height(); 482 xObj->setVisualAreaSize( xObj.GetViewAspect(), aSz ); 483 } 484 } 485 } 486 } 487 break; 488 489 case FN_INSERT_SMA: 490 { 491 // #i34343# Inserting a math object into an autocompletion crashes 492 // the suggestion has to be removed before 493 GetView().GetEditWin().StopQuickHelp(); 494 SvGlobalName aGlobalName( SO3_SM_CLASSID ); 495 rSh.InsertObject( svt::EmbeddedObjectRef(), &aGlobalName, sal_True, 0 ); 496 } 497 break; 498 499 case FN_INSERT_TABLE: 500 InsertTable( rReq ); 501 break; 502 503 case FN_INSERT_FRAME_INTERACT_NOCOL: 504 case FN_INSERT_FRAME_INTERACT: 505 { 506 sal_uInt16 nCols = 1; 507 sal_Bool bModifier1 = rReq.GetModifier() == KEY_MOD1; 508 if(pArgs) 509 { 510 if(FN_INSERT_FRAME_INTERACT_NOCOL != nSlot && 511 pArgs->GetItemState(SID_ATTR_COLUMNS, sal_False, &pItem) == SFX_ITEM_SET) 512 nCols = ((SfxUInt16Item *)pItem)->GetValue(); 513 if(pArgs->GetItemState(SID_MODIFIER, sal_False, &pItem) == SFX_ITEM_SET) 514 bModifier1 |= KEY_MOD1 == ((SfxUInt16Item *)pItem)->GetValue(); 515 } 516 if(bModifier1 ) 517 { 518 SwEditWin& rEdtWin = GetView().GetEditWin(); 519 Size aWinSize = rEdtWin.GetSizePixel(); 520 Point aStartPos(aWinSize.Width()/2, aWinSize.Height() / 2); 521 aStartPos = rEdtWin.PixelToLogic(aStartPos); 522 aStartPos.X() -= 8 * MM50; 523 aStartPos.Y() -= 4 * MM50; 524 Size aSize(16 * MM50, 8 * MM50); 525 GetShell().LockPaint(); 526 GetShell().StartAllAction(); 527 SwFlyFrmAttrMgr aMgr( sal_True, GetShellPtr(), FRMMGR_TYPE_TEXT ); 528 if(nCols > 1) 529 { 530 SwFmtCol aCol; 531 aCol.Init( nCols, aCol.GetGutterWidth(), aCol.GetWishWidth() ); 532 aMgr.SetCol( aCol ); 533 } 534 aMgr.InsertFlyFrm(FLY_AT_PARA, aStartPos, aSize); 535 GetShell().EndAllAction(); 536 GetShell().UnlockPaint(); 537 } 538 else 539 { 540 GetView().InsFrmMode(nCols); 541 } 542 rReq.Ignore(); 543 } 544 break; 545 case FN_INSERT_FRAME: 546 { 547 sal_Bool bSingleCol = sal_False; 548 if( 0!= dynamic_cast< SwWebDocShell*>( GetView().GetDocShell()) ) 549 { 550 SvxHtmlOptions* pHtmlOpt = SvxHtmlOptions::Get(); 551 sal_uInt16 nExport = pHtmlOpt->GetExportMode(); 552 if( HTML_CFG_MSIE == nExport || 553 HTML_CFG_HTML32 == nExport || 554 HTML_CFG_MSIE_40 == nExport || 555 HTML_CFG_HTML32 == nExport ) 556 { 557 bSingleCol = sal_True; 558 } 559 560 } 561 // Rahmen neu anlegen 562 SwFlyFrmAttrMgr aMgr( sal_True, GetShellPtr(), FRMMGR_TYPE_TEXT ); 563 if(pArgs) 564 { 565 Size aSize(aMgr.GetSize()); 566 aSize.Width() = GetShell().GetAnyCurRect(RECT_PAGE_PRT).Width(); 567 Point aPos = aMgr.GetPos(); 568 RndStdIds eAnchor = FLY_AT_PARA; 569 if(pArgs->GetItemState(nSlot, sal_False, &pItem) == SFX_ITEM_SET) 570 eAnchor = (RndStdIds)((SfxUInt16Item *)pItem)->GetValue(); 571 if(pArgs->GetItemState(FN_PARAM_1, sal_False, &pItem) == SFX_ITEM_SET) 572 aPos = ((SfxPointItem *)pItem)->GetValue(); 573 if(pArgs->GetItemState(FN_PARAM_2, sal_False, &pItem) == SFX_ITEM_SET) 574 aSize = ((SvxSizeItem *)pItem)->GetSize(); 575 if(pArgs->GetItemState(SID_ATTR_COLUMNS, sal_False, &pItem) == SFX_ITEM_SET) 576 { 577 sal_uInt16 nCols = ((SfxUInt16Item *)pItem)->GetValue(); 578 if( !bSingleCol && 1 < nCols ) 579 { 580 SwFmtCol aFmtCol; 581 aFmtCol.Init( nCols , (rReq.IsAPI() ? 0 582 : DEF_GUTTER_WIDTH), USHRT_MAX ); 583 aMgr.SetCol(aFmtCol); 584 } 585 } 586 587 GetShell().LockPaint(); 588 GetShell().StartAllAction(); 589 590 aMgr.InsertFlyFrm(eAnchor, aPos, aSize); 591 592 GetShell().EndAllAction(); 593 GetShell().UnlockPaint(); 594 } 595 else 596 { 597 static sal_uInt16 __READONLY_DATA aFrmAttrRange[] = 598 { 599 RES_FRMATR_BEGIN, RES_FRMATR_END-1, 600 SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, 601 FN_GET_PRINT_AREA, FN_GET_PRINT_AREA, 602 SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE, 603 FN_SET_FRM_NAME, FN_SET_FRM_NAME, 604 SID_HTML_MODE, SID_HTML_MODE, 605 0 606 }; 607 608 SfxItemSet aSet(GetPool(), aFrmAttrRange ); 609 aSet.Put(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(GetView().GetDocShell()))); 610 const SwRect &rPg = GetShell().GetAnyCurRect(RECT_PAGE); 611 SwFmtFrmSize aFrmSize(ATT_VAR_SIZE, rPg.Width(), rPg.Height()); 612 aFrmSize.SetWhich(GetPool().GetWhich(SID_ATTR_PAGE_SIZE)); 613 aSet.Put(aFrmSize); 614 615 const SwRect &rPr = GetShell().GetAnyCurRect(RECT_PAGE_PRT); 616 SwFmtFrmSize aPrtSize(ATT_VAR_SIZE, rPr.Width(), rPr.Height()); 617 aPrtSize.SetWhich(GetPool().GetWhich(FN_GET_PRINT_AREA)); 618 aSet.Put(aPrtSize); 619 620 aSet.Put(aMgr.GetAttrSet()); 621 aSet.SetParent( aMgr.GetAttrSet().GetParent() ); 622 623 // Minimalgroesse in Spalten loeschen 624 SvxBoxInfoItem aBoxInfo((SvxBoxInfoItem &)aSet.Get(SID_ATTR_BORDER_INNER)); 625 const SvxBoxItem& rBox = (const SvxBoxItem&)aSet.Get(RES_BOX); 626 aBoxInfo.SetMinDist(sal_False); 627 aBoxInfo.SetDefDist(rBox.GetDistance(BOX_LINE_LEFT)); 628 aSet.Put(aBoxInfo); 629 630 FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebDocShell, GetView().GetDocShell())); 631 SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric))); 632 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); 633 DBG_ASSERT(pFact, "Dialogdiet fail!"); 634 SfxAbstractTabDialog* pDlg = pFact->CreateFrmTabDialog( DLG_FRM_STD, 635 GetView().GetViewFrame(), &GetView().GetViewFrame()->GetWindow(), aSet, sal_True); 636 DBG_ASSERT(pDlg, "Dialogdiet fail!"); 637 if(pDlg->Execute() && pDlg->GetOutputItemSet()) 638 { 639 //local variable necessary at least after call of .AutoCaption() because this could be deleted at this point 640 SwWrtShell& rShell = GetShell(); 641 rShell.LockPaint(); 642 rShell.StartAllAction(); 643 rShell.StartUndo(UNDO_INSERT); 644 645 const SfxItemSet* pOutSet = pDlg->GetOutputItemSet(); 646 aMgr.SetAttrSet(*pOutSet); 647 648 // beim ClickToEditFeld erst die Selektion loeschen 649 if( rShell.IsInClickToEdit() ) 650 rShell.DelRight(); 651 652 aMgr.InsertFlyFrm(); 653 654 uno::Reference< frame::XDispatchRecorder > xRecorder = 655 GetView().GetViewFrame()->GetBindings().GetRecorder(); 656 if ( xRecorder.is() ) 657 { 658 //FN_INSERT_FRAME 659 sal_uInt16 nAnchor = (sal_uInt16)aMgr.GetAnchor(); 660 rReq.AppendItem(SfxUInt16Item(nSlot, nAnchor)); 661 rReq.AppendItem(SfxPointItem(FN_PARAM_1, rShell.GetObjAbsPos())); 662 rReq.AppendItem(SvxSizeItem(FN_PARAM_2, rShell.GetObjSize())); 663 rReq.Done(); 664 } 665 666 GetView().AutoCaption(FRAME_CAP); 667 668 { 669 SwRewriter aRewriter; 670 671 aRewriter.AddRule(UNDO_ARG1, SW_RES(STR_FRAME)); 672 673 rShell.EndUndo(UNDO_INSERT, &aRewriter); 674 } 675 rShell.EndAllAction(); 676 rShell.UnlockPaint(); 677 } 678 679 DELETEZ(pDlg); 680 } 681 break; 682 } 683 684 case FN_INSERT_HRULER: 685 { 686 String sPath; 687 sal_Bool bSimpleLine = sal_False; 688 sal_Bool bRet = sal_False; 689 Window* pParent = GetView().GetWindow(); 690 if ( pItem ) 691 { 692 sPath = ( (SfxStringItem*) pItem )->GetValue(); 693 SFX_REQUEST_ARG( rReq, pSimple, SfxBoolItem, FN_PARAM_1, sal_False ); 694 if ( pSimple ) 695 bSimpleLine = pSimple->GetValue(); 696 } 697 else 698 { 699 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); 700 DBG_ASSERT( pFact, "Dialogdiet fail!" ); 701 AbstractInsertGrfRulerDlg* pDlg = pFact->CreateInsertGrfRulerDlg( DLG_INSERT_RULER, 702 pParent ); 703 DBG_ASSERT( pDlg, "Dialogdiet fail!" ); 704 // MessageBox fuer fehlende Grafiken 705 if ( !pDlg->HasImages() ) 706 InfoBox( pParent, SW_RES( MSG_NO_RULER ) ).Execute(); 707 if ( RET_OK == pDlg->Execute() ) 708 { 709 sPath = pDlg->GetGraphicName(); 710 bSimpleLine = pDlg->IsSimpleLine(); 711 } 712 713 delete pDlg; 714 rReq.AppendItem( SfxStringItem( FN_INSERT_HRULER, sPath ) ); 715 rReq.AppendItem( SfxBoolItem( FN_PARAM_1, bSimpleLine ) ); 716 } 717 718 rSh.StartAllAction(); 719 rSh.StartUndo( UNDO_UI_INSERT_RULER ); 720 if ( bSimpleLine ) 721 { 722 if ( !( rSh.IsSttOfPara() && rSh.IsEndOfPara() ) ) // kein leerer Absatz? 723 rSh.SplitNode( sal_False, sal_False ); // dann Platz schaffen 724 rSh.SplitNode( sal_False, sal_False ); 725 rSh.Left( CRSR_SKIP_CHARS, sal_False, 1, sal_False ); 726 rSh.SetTxtFmtColl( rSh.GetTxtCollFromPool( RES_POOLCOLL_HTML_HR ) ); 727 rSh.Right( CRSR_SKIP_CHARS, sal_False, 1, sal_False ); 728 bRet = sal_True; 729 } 730 else if ( sPath.Len() ) 731 { 732 SwFlyFrmAttrMgr aFrmMgr( sal_True, &rSh, FRMMGR_TYPE_GRF ); 733 // am FrmMgr muessen die richtigen Parameter eingestellt werden 734 735 aFrmMgr.SetAnchor( FLY_AS_CHAR ); 736 737 rSh.SplitNode( sal_False, sal_False ); 738 rSh.SplitNode( sal_False, sal_False ); 739 rSh.Left( CRSR_SKIP_CHARS, sal_False, 1, sal_False ); 740 rSh.SetAttrItem( SvxAdjustItem( SVX_ADJUST_CENTER, RES_PARATR_ADJUST ) ); 741 if ( GRFILTER_OK == GetView().InsertGraphic( sPath, aEmptyStr, sal_True, 0, 0 ) ) 742 { 743 rSh.GetCurrFrm(); // just to trigger formatting in case the inserted graphic is not formatted. 744 bRet = sal_True; 745 } 746 rSh.EnterStdMode(); 747 rSh.Right( CRSR_SKIP_CHARS, sal_False, 1, sal_False ); 748 } 749 rSh.EndAllAction(); 750 rSh.EndUndo( UNDO_UI_INSERT_RULER ); 751 rReq.SetReturnValue( SfxBoolItem( nSlot, bRet ) ); 752 rReq.Done(); 753 } 754 break; 755 756 case FN_FORMAT_COLUMN : 757 { 758 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); 759 DBG_ASSERT(pFact, "Dialogdiet fail!"); 760 VclAbstractDialog* pColDlg = pFact->CreateVclAbstractDialog( GetView().GetWindow(), rSh, DLG_COLUMN); 761 DBG_ASSERT(pColDlg, "Dialogdiet fail!"); 762 pColDlg->Execute(); 763 delete pColDlg; 764 } 765 break; 766 767 default: 768 ASSERT( sal_False, "wrong dispatcher" ); 769 return; 770 } 771 } 772 773 bool lcl_IsMarkInSameSection( SwWrtShell& rWrtSh, const SwSection* pSect ) 774 { 775 rWrtSh.SwapPam(); 776 bool bRet = pSect == rWrtSh.GetCurrSection(); 777 rWrtSh.SwapPam(); 778 return bRet; 779 } 780 781 782 void SwTextShell::StateInsert( SfxItemSet &rSet ) 783 { 784 sal_uInt16 nHtmlMode = ::GetHtmlMode(GetView().GetDocShell()); 785 SfxWhichIter aIter( rSet ); 786 SwWrtShell &rSh = GetShell(); 787 sal_uInt16 nWhich = aIter.FirstWhich(); 788 SvtModuleOptions aMOpt; 789 SfxObjectCreateMode eCreateMode = 790 GetView().GetDocShell()->GetCreateMode(); 791 792 rSh.Push(); 793 const sal_Bool bCrsrInHidden = rSh.SelectHiddenRange(); 794 rSh.Pop(); 795 796 while ( nWhich ) 797 { 798 switch ( nWhich ) 799 { 800 case SID_INSERT_AVMEDIA: 801 case SID_INSERT_SOUND: 802 case SID_INSERT_VIDEO: 803 if ( GetShell().IsSelFrmMode() 804 || GetShell().CrsrInsideInputFld() 805 || SFX_CREATE_MODE_EMBEDDED == eCreateMode 806 || bCrsrInHidden ) 807 { 808 rSet.DisableItem( nWhich ); 809 } 810 break; 811 812 case SID_INSERT_DIAGRAM: 813 if( !aMOpt.IsChart() 814 || GetShell().CrsrInsideInputFld() 815 || eCreateMode == SFX_CREATE_MODE_EMBEDDED 816 || bCrsrInHidden ) 817 { 818 rSet.DisableItem( nWhich ); 819 } 820 break; 821 822 case FN_INSERT_SMA: 823 if( !aMOpt.IsMath() 824 || eCreateMode == SFX_CREATE_MODE_EMBEDDED 825 || bCrsrInHidden 826 || rSh.CrsrInsideInputFld() ) 827 { 828 rSet.DisableItem( nWhich ); 829 } 830 break; 831 832 case SID_INSERT_FLOATINGFRAME: 833 case SID_INSERT_OBJECT: 834 case SID_INSERT_PLUGIN: 835 { 836 if( eCreateMode == SFX_CREATE_MODE_EMBEDDED || bCrsrInHidden ) 837 { 838 rSet.DisableItem( nWhich ); 839 } 840 else if( GetShell().IsSelFrmMode() 841 || GetShell().CrsrInsideInputFld() ) 842 { 843 rSet.DisableItem( nWhich ); 844 } 845 else if(SID_INSERT_FLOATINGFRAME == nWhich && nHtmlMode&HTMLMODE_ON) 846 { 847 SvxHtmlOptions* pHtmlOpt = SvxHtmlOptions::Get(); 848 sal_uInt16 nExport = pHtmlOpt->GetExportMode(); 849 if(HTML_CFG_MSIE_40 != nExport && HTML_CFG_WRITER != nExport ) 850 rSet.DisableItem(nWhich); 851 } 852 } 853 break; 854 855 case FN_INSERT_FRAME_INTERACT_NOCOL : 856 case FN_INSERT_FRAME_INTERACT: 857 { 858 if( GetShell().IsSelFrmMode() 859 || GetShell().CrsrInsideInputFld() 860 || ( 0 != (nHtmlMode & HTMLMODE_ON) 861 && 0 == (nHtmlMode & HTMLMODE_SOME_ABS_POS) ) 862 || bCrsrInHidden ) 863 rSet.DisableItem(nWhich); 864 } 865 break; 866 867 case SID_HYPERLINK_GETLINK: 868 { 869 SfxItemSet aSet(GetPool(), RES_TXTATR_INETFMT, RES_TXTATR_INETFMT); 870 rSh.GetCurAttr( aSet ); 871 872 SvxHyperlinkItem aHLinkItem; 873 const SfxPoolItem* pItem; 874 if(SFX_ITEM_SET == aSet.GetItemState(RES_TXTATR_INETFMT, sal_False, &pItem)) 875 { 876 const SwFmtINetFmt* pINetFmt = (const SwFmtINetFmt*)pItem; 877 aHLinkItem.SetURL(pINetFmt->GetValue()); 878 aHLinkItem.SetTargetFrame(pINetFmt->GetTargetFrame()); 879 aHLinkItem.SetIntName(pINetFmt->GetName()); 880 const SvxMacro *pMacro = pINetFmt->GetMacro( SFX_EVENT_MOUSEOVER_OBJECT ); 881 if( pMacro ) 882 aHLinkItem.SetMacro(HYPERDLG_EVENT_MOUSEOVER_OBJECT, *pMacro); 883 884 pMacro = pINetFmt->GetMacro( SFX_EVENT_MOUSECLICK_OBJECT ); 885 if( pMacro ) 886 aHLinkItem.SetMacro(HYPERDLG_EVENT_MOUSECLICK_OBJECT, *pMacro); 887 888 pMacro = pINetFmt->GetMacro( SFX_EVENT_MOUSEOUT_OBJECT ); 889 if( pMacro ) 890 aHLinkItem.SetMacro(HYPERDLG_EVENT_MOUSEOUT_OBJECT, *pMacro); 891 892 // Text des Links besorgen 893 rSh.StartAction(); 894 rSh.CreateCrsr(); 895 rSh.SwCrsrShell::SelectTxtAttr(RES_TXTATR_INETFMT,sal_True); 896 String sLinkName = rSh.GetSelTxt(); 897 aHLinkItem.SetName(sLinkName); 898 aHLinkItem.SetInsertMode(HLINK_FIELD); 899 rSh.DestroyCrsr(); 900 rSh.EndAction(); 901 } 902 else 903 { 904 String sReturn = rSh.GetSelTxt(); 905 sReturn.Erase(255); 906 sReturn.EraseTrailingChars(); 907 aHLinkItem.SetName(sReturn); 908 } 909 910 aHLinkItem.SetInsertMode((SvxLinkInsertMode)(aHLinkItem.GetInsertMode() | 911 ((nHtmlMode & HTMLMODE_ON) != 0 ? HLINK_HTMLMODE : 0))); 912 aHLinkItem.SetMacroEvents ( HYPERDLG_EVENT_MOUSEOVER_OBJECT| 913 HYPERDLG_EVENT_MOUSECLICK_OBJECT | HYPERDLG_EVENT_MOUSEOUT_OBJECT ); 914 915 rSet.Put(aHLinkItem); 916 } 917 break; 918 919 case FN_INSERT_FRAME: 920 if (rSh.IsSelFrmMode() ) 921 { 922 const int nSel = rSh.GetSelectionType(); 923 if( ((nsSelectionType::SEL_GRF | nsSelectionType::SEL_OLE ) & nSel ) || bCrsrInHidden ) 924 rSet.DisableItem(nWhich); 925 } 926 else if ( rSh.CrsrInsideInputFld() ) 927 { 928 rSet.DisableItem(nWhich); 929 } 930 break; 931 932 case FN_INSERT_HRULER : 933 if( (rSh.IsReadOnlyAvailable() && rSh.HasReadonlySel()) 934 || bCrsrInHidden 935 || rSh.CrsrInsideInputFld() ) 936 { 937 rSet.DisableItem(nWhich); 938 } 939 break; 940 941 case FN_FORMAT_COLUMN : 942 { 943 //#i80458# column dialog cannot work if the selection contains different page styles and different sections 944 bool bDisable = true; 945 if( rSh.GetFlyFrmFmt() || rSh.GetSelectedPageDescs() ) 946 bDisable = false; 947 if( bDisable ) 948 { 949 const SwSection* pCurrSection = rSh.GetCurrSection(); 950 sal_uInt16 nFullSectCnt = rSh.GetFullSelectedSectionCount(); 951 if( pCurrSection && ( !rSh.HasSelection() || 0 != nFullSectCnt )) 952 bDisable = false; 953 else if( 954 rSh.HasSelection() && rSh.IsInsRegionAvailable() && 955 ( !pCurrSection || ( 1 != nFullSectCnt && 956 lcl_IsMarkInSameSection( rSh, pCurrSection ) ))) 957 bDisable = false; 958 } 959 if(bDisable) 960 rSet.DisableItem(nWhich); 961 } 962 break; 963 } 964 nWhich = aIter.NextWhich(); 965 } 966 } 967 968 /*-------------------------------------------------------------------- 969 Beschreibung: 970 --------------------------------------------------------------------*/ 971 972 void SwTextShell::ExecDelete(SfxRequest &rReq) 973 { 974 SwWrtShell &rSh = GetShell(); 975 switch( rReq.GetSlot() ) 976 { 977 case FN_DELETE_SENT: 978 if( rSh.IsTableMode() ) 979 { 980 rSh.DeleteRow(); 981 rSh.EnterStdMode(); 982 } 983 else 984 rSh.DelToEndOfSentence(); 985 break; 986 case FN_DELETE_BACK_SENT: 987 rSh.DelToStartOfSentence(); 988 break; 989 case FN_DELETE_WORD: 990 rSh.DelNxtWord(); 991 break; 992 case FN_DELETE_BACK_WORD: 993 rSh.DelPrvWord(); 994 break; 995 case FN_DELETE_LINE: 996 rSh.DelToEndOfLine(); 997 break; 998 case FN_DELETE_BACK_LINE: 999 rSh.DelToStartOfLine(); 1000 break; 1001 case FN_DELETE_PARA: 1002 rSh.DelToEndOfPara(); 1003 break; 1004 case FN_DELETE_BACK_PARA: 1005 rSh.DelToStartOfPara(); 1006 break; 1007 case FN_DELETE_WHOLE_LINE: 1008 rSh.DelLine(); 1009 break; 1010 default: 1011 ASSERT(sal_False, "wrong dispatcher"); 1012 return; 1013 } 1014 rReq.Done(); 1015 } 1016 1017 void SwTextShell::ExecTransliteration( SfxRequest & rReq ) 1018 { 1019 using namespace ::com::sun::star::i18n; 1020 { 1021 sal_uInt32 nMode = 0; 1022 1023 switch( rReq.GetSlot() ) 1024 { 1025 case SID_TRANSLITERATE_SENTENCE_CASE: 1026 nMode = TransliterationModulesExtra::SENTENCE_CASE; 1027 break; 1028 case SID_TRANSLITERATE_TITLE_CASE: 1029 nMode = TransliterationModulesExtra::TITLE_CASE; 1030 break; 1031 case SID_TRANSLITERATE_TOGGLE_CASE: 1032 nMode = TransliterationModulesExtra::TOGGLE_CASE; 1033 break; 1034 case SID_TRANSLITERATE_UPPER: 1035 nMode = TransliterationModules_LOWERCASE_UPPERCASE; 1036 break; 1037 case SID_TRANSLITERATE_LOWER: 1038 nMode = TransliterationModules_UPPERCASE_LOWERCASE; 1039 break; 1040 1041 case SID_TRANSLITERATE_HALFWIDTH: 1042 nMode = TransliterationModules_FULLWIDTH_HALFWIDTH; 1043 break; 1044 case SID_TRANSLITERATE_FULLWIDTH: 1045 nMode = TransliterationModules_HALFWIDTH_FULLWIDTH; 1046 break; 1047 1048 case SID_TRANSLITERATE_HIRAGANA: 1049 nMode = TransliterationModules_KATAKANA_HIRAGANA; 1050 break; 1051 case SID_TRANSLITERATE_KATAGANA: 1052 nMode = TransliterationModules_HIRAGANA_KATAKANA; 1053 break; 1054 1055 default: 1056 ASSERT(sal_False, "wrong dispatcher"); 1057 } 1058 1059 if( nMode ) 1060 GetShell().TransliterateText( nMode ); 1061 } 1062 } 1063 1064 1065 /*-------------------------------------------------------------------- 1066 Beschreibung: 1067 --------------------------------------------------------------------*/ 1068 1069 1070 1071 SwTextShell::SwTextShell(SwView &_rView) : 1072 SwBaseShell(_rView), pPostItFldMgr( 0 ) 1073 { 1074 SetName(String::CreateFromAscii("Text")); 1075 SetHelpId(SW_TEXTSHELL); 1076 SfxShell::SetContextName(sfx2::sidebar::EnumContext::GetContextName(sfx2::sidebar::EnumContext::Context_Text)); 1077 } 1078 1079 /*-------------------------------------------------------------------- 1080 Beschreibung: 1081 --------------------------------------------------------------------*/ 1082 1083 SwTextShell::~SwTextShell() 1084 { 1085 } 1086 1087 /*-------------------------------------------------------------------- 1088 Beschreibung: 1089 --------------------------------------------------------------------*/ 1090 1091 void SwTextShell::InsertSymbol( SfxRequest& rReq ) 1092 { 1093 const SfxItemSet *pArgs = rReq.GetArgs(); 1094 const SfxPoolItem* pItem = 0; 1095 if( pArgs ) 1096 pArgs->GetItemState(GetPool().GetWhich(SID_CHARMAP), sal_False, &pItem); 1097 1098 String aChars, aFontName; 1099 if ( pItem ) 1100 { 1101 aChars = ((const SfxStringItem*)pItem)->GetValue(); 1102 const SfxPoolItem* pFtItem = NULL; 1103 pArgs->GetItemState( GetPool().GetWhich(SID_ATTR_SPECIALCHAR), sal_False, &pFtItem); 1104 const SfxStringItem* pFontItem = PTR_CAST( SfxStringItem, pFtItem ); 1105 if ( pFontItem ) 1106 aFontName = pFontItem->GetValue(); 1107 } 1108 1109 SwWrtShell &rSh = GetShell(); 1110 SfxItemSet aSet( GetPool(), RES_CHRATR_FONT, RES_CHRATR_FONT, 1111 RES_CHRATR_CJK_FONT, RES_CHRATR_CJK_FONT, 1112 RES_CHRATR_CTL_FONT, RES_CHRATR_CTL_FONT, 1113 0 ); 1114 rSh.GetCurAttr( aSet ); 1115 sal_uInt16 nScript = rSh.GetScriptType(); 1116 1117 SvxFontItem aFont( RES_CHRATR_FONT ); 1118 { 1119 SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONT, *aSet.GetPool() ); 1120 aSetItem.GetItemSet().Put( aSet, sal_False ); 1121 const SfxPoolItem* pI = aSetItem.GetItemOfScript( nScript ); 1122 if( pI ) 1123 aFont = *(SvxFontItem*)pI; 1124 else 1125 aFont = (SvxFontItem&)aSet.Get( GetWhichOfScript( 1126 RES_CHRATR_FONT, 1127 GetI18NScriptTypeOfLanguage( (sal_uInt16)GetAppLanguage() ) )); 1128 if (!aFontName.Len()) 1129 aFontName = aFont.GetFamilyName(); 1130 } 1131 1132 Font aNewFont(aFontName, Size(1,1)); // Size nur wg. CTOR 1133 if( !aChars.Len() ) 1134 { 1135 // Eingestellten Font als Default 1136 SfxAllItemSet aAllSet( rSh.GetAttrPool() ); 1137 aAllSet.Put( SfxBoolItem( FN_PARAM_1, sal_False ) ); 1138 1139 SwViewOption aOpt(*GetShell().GetViewOptions()); 1140 String sSymbolFont = aOpt.GetSymbolFont(); 1141 if( !aFontName.Len() && sSymbolFont.Len() ) 1142 aAllSet.Put( SfxStringItem( SID_FONT_NAME, sSymbolFont ) ); 1143 else 1144 aAllSet.Put( SfxStringItem( SID_FONT_NAME, aFont.GetFamilyName() ) ); 1145 1146 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 1147 SfxAbstractDialog* pDlg = pFact->CreateSfxDialog( GetView().GetWindow(), aAllSet, 1148 GetView().GetViewFrame()->GetFrame().GetFrameInterface(), RID_SVXDLG_CHARMAP ); 1149 if( RET_OK == pDlg->Execute() ) 1150 { 1151 SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pCItem, SfxStringItem, SID_CHARMAP, sal_False ); 1152 SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pFontItem, SvxFontItem, SID_ATTR_CHAR_FONT, sal_False ); 1153 if ( pFontItem ) 1154 { 1155 aNewFont.SetName( pFontItem->GetFamilyName() ); 1156 aNewFont.SetStyleName( pFontItem->GetStyleName() ); 1157 aNewFont.SetCharSet( pFontItem->GetCharSet() ); 1158 aNewFont.SetPitch( pFontItem->GetPitch() ); 1159 } 1160 1161 if ( pCItem ) 1162 { 1163 aChars = pCItem->GetValue(); 1164 aOpt.SetSymbolFont(aNewFont.GetName()); 1165 SW_MOD()->ApplyUsrPref(aOpt, &GetView()); 1166 } 1167 } 1168 1169 delete pDlg; 1170 } 1171 1172 sal_Bool bFontChanged = sal_False; 1173 if( aChars.Len() ) 1174 { 1175 rSh.StartAllAction(); 1176 1177 // Selektierten Inhalt loeschen 1178 SwRewriter aRewriter; 1179 aRewriter.AddRule(UNDO_ARG1, SW_RES(STR_SPECIALCHAR)); 1180 1181 rSh.StartUndo( UNDO_INSERT, &aRewriter ); 1182 if ( rSh.HasSelection() ) 1183 { 1184 rSh.DelRight(); 1185 aSet.ClearItem(); 1186 rSh.GetCurAttr( aSet ); 1187 1188 SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONT, *aSet.GetPool() ); 1189 aSetItem.GetItemSet().Put( aSet, sal_False ); 1190 const SfxPoolItem* pI = aSetItem.GetItemOfScript( nScript ); 1191 if( pI ) 1192 aFont = *(SvxFontItem*)pI; 1193 else 1194 aFont = (SvxFontItem&)aSet.Get( GetWhichOfScript( 1195 RES_CHRATR_FONT, 1196 GetI18NScriptTypeOfLanguage( (sal_uInt16)GetAppLanguage() ) )); 1197 } 1198 1199 // Zeichen einfuegen 1200 rSh.Insert( aChars ); 1201 1202 // #108876# a font attribute has to be set always due to a guessed script type 1203 if( aNewFont.GetName().Len() ) 1204 { 1205 bFontChanged = sal_True; 1206 SvxFontItem aNewFontItem( aFont ); 1207 aNewFontItem.SetFamilyName( aNewFont.GetName()); 1208 aNewFontItem.SetFamily( aNewFont.GetFamily()); 1209 aNewFontItem.SetPitch( aNewFont.GetPitch()); 1210 aNewFontItem.SetCharSet( aNewFont.GetCharSet() ); 1211 1212 SfxItemSet aRestoreSet( GetPool(), RES_CHRATR_FONT, RES_CHRATR_FONT, 1213 RES_CHRATR_CJK_FONT, RES_CHRATR_CJK_FONT, 1214 RES_CHRATR_CTL_FONT, RES_CHRATR_CTL_FONT, 0 ); 1215 1216 nScript = pBreakIt->GetAllScriptsOfText( aChars ); 1217 if( SCRIPTTYPE_LATIN & nScript ) 1218 { 1219 aRestoreSet.Put( aSet.Get( RES_CHRATR_FONT, sal_True ) ); 1220 aSet.Put( aNewFontItem, RES_CHRATR_FONT); 1221 } 1222 if( SCRIPTTYPE_ASIAN & nScript ) 1223 { 1224 aRestoreSet.Put( aSet.Get( RES_CHRATR_CJK_FONT, sal_True ) ); 1225 aSet.Put( aNewFontItem, RES_CHRATR_CJK_FONT ); 1226 } 1227 if( SCRIPTTYPE_COMPLEX & nScript ) 1228 { 1229 aRestoreSet.Put( aSet.Get( RES_CHRATR_CTL_FONT, sal_True ) ); 1230 aSet.Put( aNewFontItem, RES_CHRATR_CTL_FONT ); 1231 } 1232 1233 rSh.SetMark(); 1234 rSh.ExtendSelection( sal_False, aChars.Len() ); 1235 rSh.SetAttrSet( aSet, nsSetAttrMode::SETATTR_DONTEXPAND | nsSetAttrMode::SETATTR_NOFORMATATTR ); 1236 if( !rSh.IsCrsrPtAtEnd() ) 1237 rSh.SwapPam(); 1238 1239 rSh.ClearMark(); 1240 1241 // --> FME 2007-07-09 #i75891# 1242 // SETATTR_DONTEXPAND does not work if there are already hard attributes. 1243 // Therefore we have to restore the font attributes. 1244 rSh.SetMark(); 1245 rSh.SetAttrSet( aRestoreSet ); 1246 rSh.ClearMark(); 1247 // <-- 1248 1249 rSh.UpdateAttr(); 1250 aFont = aNewFontItem; 1251 } 1252 1253 rSh.EndAllAction(); 1254 rSh.EndUndo(); 1255 1256 if ( aChars.Len() ) 1257 { 1258 rReq.AppendItem( SfxStringItem( GetPool().GetWhich(SID_CHARMAP), aChars ) ); 1259 rReq.AppendItem( SfxStringItem( SID_ATTR_SPECIALCHAR, aNewFont.GetName() ) ); 1260 rReq.Done(); 1261 } 1262 } 1263 } 1264