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 #include <hintids.hxx> 28 #include <i18npool/lang.h> 29 #include <svl/slstitm.hxx> 30 #include <svl/cjkoptions.hxx> 31 #include <editeng/fontitem.hxx> 32 #include <editeng/langitem.hxx> 33 #include <svx/svdview.hxx> 34 #include <vcl/msgbox.hxx> 35 #include <sfx2/viewfrm.hxx> 36 #include <sfx2/objface.hxx> 37 #include <svx/svdotext.hxx> 38 #include <editeng/editeng.hxx> 39 #include <editeng/editview.hxx> 40 #include <editeng/eeitem.hxx> 41 #include <editeng/scripttypeitem.hxx> 42 #include <sfx2/bindings.hxx> 43 #include <svx/fontwork.hxx> 44 #include <sfx2/request.hxx> 45 #include <svl/whiter.hxx> 46 #include <editeng/outliner.hxx> 47 #include <editeng/editstat.hxx> 48 #include <svx/svdoutl.hxx> 49 #include <com/sun/star/i18n/TransliterationModules.hpp> 50 #include <com/sun/star/i18n/TransliterationModulesExtra.hpp> 51 #include <com/sun/star/i18n/TextConversionOption.hpp> 52 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp> 53 #include <com/sun/star/lang/XInitialization.hpp> 54 #include <swtypes.hxx> 55 #include <view.hxx> 56 #include <wrtsh.hxx> 57 #include <viewopt.hxx> 58 #include <initui.hxx> // fuer SpellPointer 59 #include <drwtxtsh.hxx> 60 #include <swundo.hxx> 61 #include <breakit.hxx> 62 63 #include <cmdid.h> 64 #include <helpid.h> 65 #ifndef _GLOBALS_HRC 66 #include <globals.hrc> 67 #endif 68 #ifndef _SHELLS_HRC 69 #include <shells.hrc> 70 #endif 71 72 #define SwDrawTextShell 73 #include <sfx2/msg.hxx> 74 #include <swslots.hxx> 75 #ifndef _POPUP_HRC 76 #include <popup.hrc> 77 #endif 78 #include <uitool.hxx> 79 #include <wview.hxx> 80 #include <swmodule.hxx> 81 #include <svx/xtable.hxx> 82 #include <svx/svxdlg.hxx> 83 #include <svx/dialogs.hrc> 84 #include <svx/svxdlg.hxx> 85 #include <svx/dialogs.hrc> 86 #include <svx/svdoashp.hxx> 87 #include <cppuhelper/bootstrap.hxx> 88 #include "swabstdlg.hxx" //CHINA001 89 #include "misc.hrc" 90 91 using namespace ::com::sun::star; 92 using namespace ::com::sun::star::uno; 93 using namespace ::com::sun::star::beans; 94 using namespace ::com::sun::star::i18n; 95 96 97 98 SFX_IMPL_INTERFACE(SwDrawTextShell, SfxShell, SW_RES(STR_SHELLNAME_DRAW_TEXT)) 99 { 100 SFX_POPUPMENU_REGISTRATION(SW_RES(MN_DRWTXT_POPUPMENU)); 101 SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_DRAW_TEXT_TOOLBOX)); 102 SFX_CHILDWINDOW_REGISTRATION(SvxFontWorkChildWindow::GetChildWindowId()); 103 } 104 105 TYPEINIT1(SwDrawTextShell,SfxShell) 106 107 /*-------------------------------------------------------------------- 108 Beschreibung: 109 --------------------------------------------------------------------*/ 110 111 112 113 void SwDrawTextShell::Init() 114 { 115 SwWrtShell &rSh = GetShell(); 116 pSdrView = rSh.GetDrawView(); 117 SdrOutliner * pOutliner = pSdrView->GetTextEditOutliner(); 118 //#97471# mouse click _and_ key input at the same time 119 if( !pOutliner ) 120 return ; 121 OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView(); 122 sal_uLong nCtrl = pOutliner->GetControlWord(); 123 nCtrl |= EE_CNTRL_AUTOCORRECT; 124 125 SetUndoManager(&pOutliner->GetUndoManager()); 126 127 // jetzt versuchen wir mal ein AutoSpell 128 129 const SwViewOption* pVOpt = rSh.GetViewOptions(); 130 if(pVOpt->IsOnlineSpell()) 131 { 132 nCtrl |= EE_CNTRL_ONLINESPELLING|EE_CNTRL_ALLOWBIGOBJS; 133 } 134 else 135 nCtrl &= ~(EE_CNTRL_ONLINESPELLING); 136 137 pOutliner->SetControlWord(nCtrl); 138 pOLV->ShowCursor(); 139 } 140 141 /*-------------------------------------------------------------------- 142 Beschreibung: 143 --------------------------------------------------------------------*/ 144 145 146 SwDrawTextShell::SwDrawTextShell(SwView &rV) : 147 SfxShell(&rV), 148 rView(rV) 149 { 150 SwWrtShell &rSh = GetShell(); 151 SetPool(rSh.GetAttrPool().GetSecondaryPool()); 152 153 Init(); 154 155 rSh.NoEdit(sal_True); 156 SetName(String::CreateFromAscii("ObjectText")); 157 SetHelpId(SW_DRWTXTSHELL); 158 } 159 160 /*-------------------------------------------------------------------- 161 Beschreibung: 162 --------------------------------------------------------------------*/ 163 164 165 166 __EXPORT SwDrawTextShell::~SwDrawTextShell() 167 { 168 if ( GetView().GetCurShell() == this ) 169 rView.ResetSubShell(); 170 171 //MA 13. Nov. 96: Das kommt durchaus vor #33141#: 172 //(doppel-)Klick von einem Texteditmode in ein anderes Objekt, zwischendurch 173 //wird eine andere (Draw-)Shell gepusht, die alte aber noch nicht deletet. 174 //Dann wird vor dem Flush wieder ein DrawTextShell gepusht und der Mode ist 175 //eingeschaltet. In diesem Moment wird der Dispatcher geflusht und die alte 176 //DrawTextShell zerstoert. 177 // ASSERT( !pSdrView->IsTextEdit(), "TextEdit in DTor DrwTxtSh?" ); 178 // if (pSdrView->IsTextEdit()) 179 // GetShell().EndTextEdit(); // Danebengeklickt, Ende mit Edit 180 181 // GetShell().Edit(); 182 } 183 184 SwWrtShell& SwDrawTextShell::GetShell() 185 { 186 return rView.GetWrtShell(); 187 } 188 189 190 /*-------------------------------------------------------------------- 191 Beschreibung: Slots mit dieser Statusmethode disablen 192 --------------------------------------------------------------------*/ 193 194 void SwDrawTextShell::StateDisableItems( SfxItemSet &rSet ) 195 { 196 SfxWhichIter aIter(rSet); 197 sal_uInt16 nWhich = aIter.FirstWhich(); 198 199 while (nWhich) 200 { 201 rSet.DisableItem( nWhich ); 202 nWhich = aIter.NextWhich(); 203 } 204 } 205 206 207 /************************************************************************* 208 |* 209 |* Attribute setzen 210 |* 211 \************************************************************************/ 212 213 214 215 void SwDrawTextShell::SetAttrToMarked(const SfxItemSet& rAttr) 216 { 217 Rectangle aNullRect; 218 OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView(); 219 Rectangle aOutRect = pOLV->GetOutputArea(); 220 221 if (aNullRect != aOutRect) 222 { 223 GetShell().GetDrawView()->SetAttributes(rAttr); 224 // Init(); 225 } 226 } 227 228 /*-------------------------------------------------------------------- 229 Beschreibung: 230 --------------------------------------------------------------------*/ 231 232 233 234 sal_Bool SwDrawTextShell::IsTextEdit() 235 { 236 return pSdrView->IsTextEdit(); 237 } 238 239 /*-------------------------------------------------------------------- 240 Beschreibung: 241 --------------------------------------------------------------------*/ 242 243 244 245 void SwDrawTextShell::ExecFontWork(SfxRequest& rReq) 246 { 247 SwWrtShell &rSh = GetShell(); 248 FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, &rSh.GetView())); 249 SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)) ); 250 SfxViewFrame* pVFrame = GetView().GetViewFrame(); 251 if ( rReq.GetArgs() ) 252 { 253 pVFrame->SetChildWindow(SvxFontWorkChildWindow::GetChildWindowId(), 254 ((const SfxBoolItem&) (rReq.GetArgs()-> 255 Get(SID_FONTWORK))).GetValue()); 256 } 257 else 258 pVFrame->ToggleChildWindow(SvxFontWorkChildWindow::GetChildWindowId()); 259 260 pVFrame->GetBindings().Invalidate(SID_FONTWORK); 261 } 262 263 /*-------------------------------------------------------------------- 264 Beschreibung: 265 --------------------------------------------------------------------*/ 266 267 268 269 void SwDrawTextShell::StateFontWork(SfxItemSet& rSet) 270 { 271 const sal_uInt16 nId = SvxFontWorkChildWindow::GetChildWindowId(); 272 rSet.Put(SfxBoolItem(SID_FONTWORK, GetView().GetViewFrame()->HasChildWindow(nId))); 273 } 274 275 /************************************************************************* 276 |* 277 |* SfxRequests fuer FontWork bearbeiten 278 |* 279 \************************************************************************/ 280 281 282 283 void SwDrawTextShell::ExecFormText(SfxRequest& rReq) 284 { 285 SwWrtShell &rSh = GetShell(); 286 SdrView* pDrView = rSh.GetDrawView(); 287 288 const SdrMarkList& rMarkList = pDrView->GetMarkedObjectList(); 289 290 if ( rMarkList.GetMarkCount() == 1 && rReq.GetArgs() ) 291 { 292 const SfxItemSet& rSet = *rReq.GetArgs(); 293 const SfxPoolItem* pItem; 294 295 //ask for the ViewFrame here - "this" may not be valid any longer! 296 SfxViewFrame* pVFrame = GetView().GetViewFrame(); 297 if ( pDrView->IsTextEdit() ) 298 { 299 //#111733# Sometimes SdrEndTextEdit() initiates the change in selection and 300 // 'this' is not valid anymore 301 SwView& rTempView = GetView(); 302 pDrView->SdrEndTextEdit(sal_True); 303 //this removes the current shell from the dispatcher stack!! 304 rTempView.AttrChangedNotify(&rSh); 305 } 306 307 pDrView->SetAttributes(rSet); 308 } 309 310 } 311 312 /************************************************************************* 313 |* 314 |* Statuswerte fuer FontWork zurueckgeben 315 |* 316 \************************************************************************/ 317 318 319 320 void SwDrawTextShell::GetFormTextState(SfxItemSet& rSet) 321 { 322 SwWrtShell &rSh = GetShell(); 323 SdrView* pDrView = rSh.GetDrawView(); 324 const SdrMarkList& rMarkList = pDrView->GetMarkedObjectList(); 325 const SdrObject* pObj = NULL; 326 SvxFontWorkDialog* pDlg = NULL; 327 328 const sal_uInt16 nId = SvxFontWorkChildWindow::GetChildWindowId(); 329 330 SfxViewFrame* pVFrame = GetView().GetViewFrame(); 331 if ( pVFrame->HasChildWindow(nId) ) 332 pDlg = (SvxFontWorkDialog*)(pVFrame->GetChildWindow(nId)->GetWindow()); 333 334 if ( rMarkList.GetMarkCount() == 1 ) 335 pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); 336 337 const SdrTextObj* pTextObj = dynamic_cast< const SdrTextObj* >(pObj); 338 const bool bDeactivate( 339 !pObj || 340 !pTextObj || 341 !pTextObj->HasText() || 342 dynamic_cast< const SdrObjCustomShape* >(pObj)); // #121538# no FontWork for CustomShapes 343 344 if (bDeactivate) 345 { 346 rSet.DisableItem(XATTR_FORMTXTSTYLE); 347 rSet.DisableItem(XATTR_FORMTXTADJUST); 348 rSet.DisableItem(XATTR_FORMTXTDISTANCE); 349 rSet.DisableItem(XATTR_FORMTXTSTART); 350 rSet.DisableItem(XATTR_FORMTXTMIRROR); 351 rSet.DisableItem(XATTR_FORMTXTHIDEFORM); 352 rSet.DisableItem(XATTR_FORMTXTOUTLINE); 353 rSet.DisableItem(XATTR_FORMTXTSHADOW); 354 rSet.DisableItem(XATTR_FORMTXTSHDWCOLOR); 355 rSet.DisableItem(XATTR_FORMTXTSHDWXVAL); 356 rSet.DisableItem(XATTR_FORMTXTSHDWYVAL); 357 } 358 else 359 { 360 if ( pDlg ) 361 pDlg->SetColorTable(XColorTable::GetStdColorTable()); 362 363 pDrView->GetAttributes( rSet ); 364 } 365 } 366 367 /*-------------------------------------------------------------------- 368 Beschreibung: 369 --------------------------------------------------------------------*/ 370 371 372 373 void SwDrawTextShell::ExecDrawLingu(SfxRequest &rReq) 374 { 375 SwWrtShell &rSh = GetShell(); 376 OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView(); 377 if( rSh.GetDrawView()->GetMarkedObjectList().GetMarkCount() ) 378 { 379 switch(rReq.GetSlot()) 380 { 381 case SID_THESAURUS: 382 pOLV->StartThesaurus(); 383 break; 384 385 case SID_HANGUL_HANJA_CONVERSION: 386 pOLV->StartTextConversion( LANGUAGE_KOREAN, LANGUAGE_KOREAN, NULL, 387 i18n::TextConversionOption::CHARACTER_BY_CHARACTER, sal_True, sal_False ); 388 break; 389 390 case SID_CHINESE_CONVERSION: 391 { 392 //open ChineseTranslationDialog 393 Reference< XComponentContext > xContext( 394 ::cppu::defaultBootstrap_InitialComponentContext() ); //@todo get context from calc if that has one 395 if(xContext.is()) 396 { 397 Reference< lang::XMultiComponentFactory > xMCF( xContext->getServiceManager() ); 398 if(xMCF.is()) 399 { 400 Reference< ui::dialogs::XExecutableDialog > xDialog( 401 xMCF->createInstanceWithContext( 402 rtl::OUString::createFromAscii("com.sun.star.linguistic2.ChineseTranslationDialog") 403 , xContext), UNO_QUERY); 404 Reference< lang::XInitialization > xInit( xDialog, UNO_QUERY ); 405 if( xInit.is() ) 406 { 407 // initialize dialog 408 Reference< awt::XWindow > xDialogParentWindow(0); 409 Sequence<Any> aSeq(1); 410 Any* pArray = aSeq.getArray(); 411 PropertyValue aParam; 412 aParam.Name = rtl::OUString::createFromAscii("ParentWindow"); 413 aParam.Value <<= makeAny(xDialogParentWindow); 414 pArray[0] <<= makeAny(aParam); 415 xInit->initialize( aSeq ); 416 417 //execute dialog 418 sal_Int16 nDialogRet = xDialog->execute(); 419 if( RET_OK == nDialogRet ) 420 { 421 //get some parameters from the dialog 422 sal_Bool bToSimplified = sal_True; 423 sal_Bool bUseVariants = sal_True; 424 sal_Bool bCommonTerms = sal_True; 425 Reference< beans::XPropertySet > xProp( xDialog, UNO_QUERY ); 426 if( xProp.is() ) 427 { 428 try 429 { 430 xProp->getPropertyValue( C2U("IsDirectionToSimplified") ) >>= bToSimplified; 431 xProp->getPropertyValue( C2U("IsUseCharacterVariants") ) >>= bUseVariants; 432 xProp->getPropertyValue( C2U("IsTranslateCommonTerms") ) >>= bCommonTerms; 433 } 434 catch( Exception& ) 435 { 436 } 437 } 438 439 //execute translation 440 sal_Int16 nSourceLang = bToSimplified ? LANGUAGE_CHINESE_TRADITIONAL : LANGUAGE_CHINESE_SIMPLIFIED; 441 sal_Int16 nTargetLang = bToSimplified ? LANGUAGE_CHINESE_SIMPLIFIED : LANGUAGE_CHINESE_TRADITIONAL; 442 sal_Int32 nOptions = bUseVariants ? i18n::TextConversionOption::USE_CHARACTER_VARIANTS : 0; 443 if( !bCommonTerms ) 444 nOptions = nOptions | i18n::TextConversionOption::CHARACTER_BY_CHARACTER; 445 446 Font aTargetFont = pOLV->GetWindow()->GetDefaultFont( DEFAULTFONT_CJK_TEXT, 447 nTargetLang, DEFAULTFONT_FLAGS_ONLYONE ); 448 449 pOLV->StartTextConversion( nSourceLang, nTargetLang, &aTargetFont, nOptions, sal_False, sal_False ); 450 } 451 } 452 Reference< lang::XComponent > xComponent( xDialog, UNO_QUERY ); 453 if( xComponent.is() ) 454 xComponent->dispose(); 455 } 456 } 457 } 458 break; 459 460 default: 461 ASSERT(!this, "unexpected slot-id"); 462 } 463 } 464 } 465 466 /*-------------------------------------------------------------------- 467 Beschreibung: 468 --------------------------------------------------------------------*/ 469 void SwDrawTextShell::ExecDraw(SfxRequest &rReq) 470 { 471 SwWrtShell &rSh = GetShell(); 472 pSdrView = rSh.GetDrawView(); 473 OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView(); 474 475 switch (rReq.GetSlot()) 476 { 477 case FN_INSERT_SOFT_HYPHEN: 478 case FN_INSERT_HARDHYPHEN: 479 case FN_INSERT_HARD_SPACE: 480 case SID_INSERT_RLM : 481 case SID_INSERT_LRM : 482 case SID_INSERT_ZWNBSP : 483 case SID_INSERT_ZWSP: 484 { 485 sal_Unicode cIns = 0; 486 switch(rReq.GetSlot()) 487 { 488 case FN_INSERT_SOFT_HYPHEN: cIns = CHAR_SOFTHYPHEN; break; 489 case FN_INSERT_HARDHYPHEN: cIns = CHAR_HARDHYPHEN; break; 490 case FN_INSERT_HARD_SPACE: cIns = CHAR_HARDBLANK; break; 491 case SID_INSERT_RLM : cIns = CHAR_RLM ; break; 492 case SID_INSERT_LRM : cIns = CHAR_LRM ; break; 493 case SID_INSERT_ZWSP : cIns = CHAR_ZWSP ; break; 494 case SID_INSERT_ZWNBSP: cIns = CHAR_ZWNBSP; break; 495 } 496 pOLV->InsertText( String(cIns)); 497 rReq.Done(); 498 } 499 break; 500 case SID_CHARMAP: 501 { // Sonderzeichen einfuegen 502 InsertSymbol(rReq); 503 break; 504 } 505 case FN_INSERT_STRING: 506 { 507 const SfxItemSet *pNewAttrs = rReq.GetArgs(); 508 sal_uInt16 nSlot = rReq.GetSlot(); 509 const SfxPoolItem* pItem = 0; 510 if(pNewAttrs) 511 { 512 pNewAttrs->GetItemState(nSlot, sal_False, &pItem ); 513 pOLV->InsertText(((const SfxStringItem *)pItem)->GetValue()); 514 } 515 break; 516 } 517 518 case SID_SELECTALL: 519 { 520 SdrOutliner * pOutliner = pSdrView->GetTextEditOutliner(); 521 if(pOutliner) 522 { 523 sal_uLong nParaCount = pOutliner->GetParagraphCount(); 524 if (nParaCount > 0) 525 pOLV->SelectRange(0L, sal_uInt16(nParaCount) ); 526 } 527 } 528 break; 529 530 case FN_FORMAT_RESET: // delete hard text attributes 531 { 532 pOLV->RemoveAttribsKeepLanguages( true ); 533 pOLV->GetEditView().GetEditEngine()->RemoveFields(sal_True); 534 rReq.Done(); 535 } 536 break; 537 538 case FN_ESCAPE: 539 if (pSdrView->IsTextEdit()) 540 { 541 // Shellwechsel! 542 rSh.EndTextEdit(); 543 SwView& rTempView = rSh.GetView(); 544 rTempView.ExitDraw(); 545 rSh.Edit(); 546 rTempView.AttrChangedNotify(&rSh); 547 return; 548 } 549 break; 550 case FN_DRAWTEXT_ATTR_DLG: 551 { 552 SfxItemSet aNewAttr( pSdrView->GetModel()->GetItemPool() ); 553 pSdrView->GetAttributes( aNewAttr ); 554 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 555 if ( pFact ) 556 { 557 SfxAbstractTabDialog *pDlg = pFact->CreateTextTabDialog( 558 &(GetView().GetViewFrame()->GetWindow()), 559 &aNewAttr, pSdrView ); 560 sal_uInt16 nResult = pDlg->Execute(); 561 562 if (nResult == RET_OK) 563 { 564 if (pSdrView->AreObjectsMarked()) 565 { 566 pSdrView->SetAttributes(*pDlg->GetOutputItemSet()); 567 rReq.Done(*(pDlg->GetOutputItemSet())); 568 } 569 } 570 571 delete( pDlg ); 572 } 573 } 574 break; 575 576 default: 577 ASSERT(!this, "unexpected slot-id"); 578 return; 579 } 580 581 GetView().GetViewFrame()->GetBindings().InvalidateAll(sal_False); 582 583 if (IsTextEdit() && pOLV->GetOutliner()->IsModified()) 584 rSh.SetModified(); 585 } 586 587 /*-------------------------------------------------------------------- 588 Beschreibung: Undo ausfuehren 589 --------------------------------------------------------------------*/ 590 591 592 593 void SwDrawTextShell::ExecUndo(SfxRequest &rReq) 594 { 595 if( IsTextEdit() ) 596 { 597 sal_Bool bCallBase = sal_True; 598 const SfxItemSet* pArgs = rReq.GetArgs(); 599 if( pArgs ) 600 { 601 sal_uInt16 nId = rReq.GetSlot(), nCnt = 1; 602 const SfxPoolItem* pItem; 603 switch( nId ) 604 { 605 case SID_UNDO: 606 case SID_REDO: 607 if( SFX_ITEM_SET == pArgs->GetItemState( nId, sal_False, &pItem ) && 608 1 < (nCnt = ((SfxUInt16Item*)pItem)->GetValue()) ) 609 { 610 // then we make by ourself. 611 ::svl::IUndoManager* pUndoManager = GetUndoManager(); 612 if( pUndoManager ) 613 { 614 if( SID_UNDO == nId ) 615 while( nCnt-- ) 616 pUndoManager->Undo(); 617 else 618 while( nCnt-- ) 619 pUndoManager->Redo(); 620 } 621 bCallBase = sal_False; 622 GetView().GetViewFrame()->GetBindings().InvalidateAll(sal_False); 623 } 624 break; 625 } 626 } 627 if( bCallBase ) 628 { 629 SfxViewFrame *pSfxViewFrame = GetView().GetViewFrame(); 630 pSfxViewFrame->ExecuteSlot(rReq, pSfxViewFrame->GetInterface()); 631 } 632 } 633 } 634 635 /*-------------------------------------------------------------------- 636 Beschreibung: Zustand Undo 637 --------------------------------------------------------------------*/ 638 639 640 641 void SwDrawTextShell::StateUndo(SfxItemSet &rSet) 642 { 643 if ( !IsTextEdit() ) 644 return; 645 646 SfxViewFrame *pSfxViewFrame = GetView().GetViewFrame(); 647 SfxWhichIter aIter(rSet); 648 sal_uInt16 nWhich = aIter.FirstWhich(); 649 while( nWhich ) 650 { 651 switch ( nWhich ) 652 { 653 case SID_GETUNDOSTRINGS: 654 case SID_GETREDOSTRINGS: 655 { 656 ::svl::IUndoManager* pUndoManager = GetUndoManager(); 657 if( pUndoManager ) 658 { 659 UniString (::svl::IUndoManager:: *fnGetComment)( size_t, bool const ) const; 660 661 sal_uInt16 nCount; 662 if( SID_GETUNDOSTRINGS == nWhich ) 663 { 664 nCount = pUndoManager->GetUndoActionCount(); 665 fnGetComment = &::svl::IUndoManager::GetUndoActionComment; 666 } 667 else 668 { 669 nCount = pUndoManager->GetRedoActionCount(); 670 fnGetComment = &::svl::IUndoManager::GetRedoActionComment; 671 } 672 if( nCount ) 673 { 674 String sList; 675 for( sal_uInt16 n = 0; n < nCount; ++n ) 676 ( sList += (pUndoManager->*fnGetComment)( n, ::svl::IUndoManager::TopLevel ) ) 677 += '\n'; 678 679 SfxStringListItem aItem( nWhich ); 680 aItem.SetString( sList ); 681 rSet.Put( aItem ); 682 } 683 } 684 else 685 rSet.DisableItem( nWhich ); 686 } 687 break; 688 689 default: 690 pSfxViewFrame->GetSlotState( nWhich, 691 pSfxViewFrame->GetInterface(), &rSet ); 692 } 693 694 nWhich = aIter.NextWhich(); 695 } 696 } 697 698 void SwDrawTextShell::ExecTransliteration( SfxRequest & rReq ) 699 { 700 using namespace i18n; 701 { 702 sal_uInt32 nMode = 0; 703 704 switch( rReq.GetSlot() ) 705 { 706 case SID_TRANSLITERATE_SENTENCE_CASE: 707 nMode = TransliterationModulesExtra::SENTENCE_CASE; 708 break; 709 case SID_TRANSLITERATE_TITLE_CASE: 710 nMode = TransliterationModulesExtra::TITLE_CASE; 711 break; 712 case SID_TRANSLITERATE_TOGGLE_CASE: 713 nMode = TransliterationModulesExtra::TOGGLE_CASE; 714 break; 715 case SID_TRANSLITERATE_UPPER: 716 nMode = TransliterationModules_LOWERCASE_UPPERCASE; 717 break; 718 case SID_TRANSLITERATE_LOWER: 719 nMode = TransliterationModules_UPPERCASE_LOWERCASE; 720 break; 721 722 case SID_TRANSLITERATE_HALFWIDTH: 723 nMode = TransliterationModules_FULLWIDTH_HALFWIDTH; 724 break; 725 case SID_TRANSLITERATE_FULLWIDTH: 726 nMode = TransliterationModules_HALFWIDTH_FULLWIDTH; 727 break; 728 729 case SID_TRANSLITERATE_HIRAGANA: 730 nMode = TransliterationModules_KATAKANA_HIRAGANA; 731 break; 732 case SID_TRANSLITERATE_KATAGANA: 733 nMode = TransliterationModules_HIRAGANA_KATAKANA; 734 break; 735 736 default: 737 ASSERT(!this, "falscher Dispatcher"); 738 } 739 740 if( nMode ) 741 { 742 OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView(); 743 pOLV->TransliterateText( nMode ); 744 } 745 } 746 } 747 748 /*-------------------------------------------------------------------- 749 Beschreibung: Sonderzeichen einfuegen (siehe SDraw: FUBULLET.CXX) 750 --------------------------------------------------------------------*/ 751 752 void SwDrawTextShell::InsertSymbol(SfxRequest& rReq) 753 { 754 OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView(); 755 if(!pOLV) 756 return; 757 const SfxItemSet *pArgs = rReq.GetArgs(); 758 const SfxPoolItem* pItem = 0; 759 if( pArgs ) 760 pArgs->GetItemState(GetPool().GetWhich(SID_CHARMAP), sal_False, &pItem); 761 762 String sSym; 763 String sFontName; 764 if ( pItem ) 765 { 766 sSym = ((const SfxStringItem*)pItem)->GetValue(); 767 const SfxPoolItem* pFtItem = NULL; 768 pArgs->GetItemState( GetPool().GetWhich(SID_ATTR_SPECIALCHAR), sal_False, &pFtItem); 769 const SfxStringItem* pFontItem = PTR_CAST( SfxStringItem, pFtItem ); 770 if ( pFontItem ) 771 sFontName = pFontItem->GetValue(); 772 } 773 774 SfxItemSet aSet(pOLV->GetAttribs()); 775 sal_uInt16 nScript = pOLV->GetSelectedScriptType(); 776 SvxFontItem aSetDlgFont( RES_CHRATR_FONT ); 777 { 778 SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONT, *aSet.GetPool() ); 779 aSetItem.GetItemSet().Put( aSet, sal_False ); 780 const SfxPoolItem* pI = aSetItem.GetItemOfScript( nScript ); 781 if( pI ) 782 aSetDlgFont = *(SvxFontItem*)pI; 783 else 784 aSetDlgFont = (SvxFontItem&)aSet.Get( GetWhichOfScript( 785 SID_ATTR_CHAR_FONT, 786 GetI18NScriptTypeOfLanguage( (sal_uInt16)GetAppLanguage() ) )); 787 if (!sFontName.Len()) 788 sFontName = aSetDlgFont.GetFamilyName(); 789 } 790 791 Font aFont(sFontName, Size(1,1)); 792 if(!sSym.Len()) 793 { 794 SfxAllItemSet aAllSet( GetPool() ); 795 aAllSet.Put( SfxBoolItem( FN_PARAM_1, sal_False ) ); 796 797 SwViewOption aOpt(*rView.GetWrtShell().GetViewOptions()); 798 String sSymbolFont = aOpt.GetSymbolFont(); 799 if( sSymbolFont.Len() ) 800 aAllSet.Put( SfxStringItem( SID_FONT_NAME, sSymbolFont ) ); 801 else 802 aAllSet.Put( SfxStringItem( SID_FONT_NAME, aSetDlgFont.GetFamilyName() ) ); 803 804 // Wenn Zeichen selektiert ist kann es angezeigt werden 805 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 806 SfxAbstractDialog* pDlg = pFact->CreateSfxDialog( rView.GetWindow(), aAllSet, 807 rView.GetViewFrame()->GetFrame().GetFrameInterface(), RID_SVXDLG_CHARMAP ); 808 sal_uInt16 nResult = pDlg->Execute(); 809 if( nResult == RET_OK ) 810 { 811 SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pCItem, SfxStringItem, SID_CHARMAP, sal_False ); 812 SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pFontItem, SvxFontItem, SID_ATTR_CHAR_FONT, sal_False ); 813 if ( pFontItem ) 814 { 815 aFont.SetName( pFontItem->GetFamilyName() ); 816 aFont.SetStyleName( pFontItem->GetStyleName() ); 817 aFont.SetCharSet( pFontItem->GetCharSet() ); 818 aFont.SetPitch( pFontItem->GetPitch() ); 819 } 820 821 if ( pCItem ) 822 { 823 sSym = pCItem->GetValue(); 824 aOpt.SetSymbolFont(aFont.GetName()); 825 SW_MOD()->ApplyUsrPref(aOpt, &rView); 826 } 827 } 828 829 delete( pDlg ); 830 } 831 832 if( sSym.Len() ) 833 { 834 // nicht flackern 835 pOLV->HideCursor(); 836 SdrOutliner * pOutliner = pSdrView->GetTextEditOutliner(); 837 pOutliner->SetUpdateMode(sal_False); 838 839 SfxItemSet aOldSet( pOLV->GetAttribs() ); 840 SfxItemSet aFontSet( *aOldSet.GetPool(), 841 EE_CHAR_FONTINFO, EE_CHAR_FONTINFO, 842 EE_CHAR_FONTINFO_CJK, EE_CHAR_FONTINFO_CJK, 843 EE_CHAR_FONTINFO_CTL, EE_CHAR_FONTINFO_CTL, 844 0 ); 845 aFontSet.Set( aOldSet ); 846 847 // String einfuegen 848 pOLV->InsertText( sSym ); 849 850 // attributieren (Font setzen) 851 SfxItemSet aFontAttribSet( *aFontSet.GetPool(), aFontSet.GetRanges() ); 852 SvxFontItem aFontItem (aFont.GetFamily(), aFont.GetName(), 853 aFont.GetStyleName(), aFont.GetPitch(), 854 aFont.GetCharSet(), 855 EE_CHAR_FONTINFO ); 856 nScript = pBreakIt->GetAllScriptsOfText( sSym ); 857 if( SCRIPTTYPE_LATIN & nScript ) 858 aFontAttribSet.Put( aFontItem, EE_CHAR_FONTINFO ); 859 if( SCRIPTTYPE_ASIAN & nScript ) 860 aFontAttribSet.Put( aFontItem, EE_CHAR_FONTINFO_CJK ); 861 if( SCRIPTTYPE_COMPLEX & nScript ) 862 aFontAttribSet.Put( aFontItem, EE_CHAR_FONTINFO_CTL ); 863 pOLV->SetAttribs(aFontAttribSet); 864 865 // Selektion loeschen 866 ESelection aSel(pOLV->GetSelection()); 867 aSel.nStartPara = aSel.nEndPara; 868 aSel.nStartPos = aSel.nEndPos; 869 pOLV->SetSelection(aSel); 870 871 // Alten Font restaurieren 872 pOLV->SetAttribs( aFontSet ); 873 874 // ab jetzt wieder anzeigen 875 pOutliner->SetUpdateMode(sal_True); 876 pOLV->ShowCursor(); 877 878 rReq.AppendItem( SfxStringItem( GetPool().GetWhich(SID_CHARMAP), sSym ) ); 879 if(aFont.GetName().Len()) 880 rReq.AppendItem( SfxStringItem( SID_ATTR_SPECIALCHAR, aFont.GetName() ) ); 881 rReq.Done(); 882 } 883 } 884 /*-- 22.10.2003 14:26:32--------------------------------------------------- 885 886 -----------------------------------------------------------------------*/ 887 ::svl::IUndoManager* SwDrawTextShell::GetUndoManager() 888 { 889 SwWrtShell &rSh = GetShell(); 890 pSdrView = rSh.GetDrawView(); 891 SdrOutliner * pOutliner = pSdrView->GetTextEditOutliner(); 892 pOutliner = pSdrView->GetTextEditOutliner(); 893 return &pOutliner->GetUndoManager(); 894 } 895 896 897 898