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_sc.hxx" 26 27 28 29 //------------------------------------------------------------------ 30 31 #include <com/sun/star/linguistic2/XThesaurus.hpp> 32 33 #include "scitems.hxx" 34 #include <editeng/eeitem.hxx> 35 36 #include <svx/clipfmtitem.hxx> 37 #include <svx/svxdlg.hxx> 38 #include <editeng/cntritem.hxx> 39 #include <editeng/outliner.hxx> 40 #include <editeng/unolingu.hxx> 41 #include <editeng/crsditem.hxx> 42 #include <editeng/editeng.hxx> 43 #include <editeng/editview.hxx> 44 #include <editeng/escpitem.hxx> 45 #include <editeng/flditem.hxx> 46 #include <editeng/fontitem.hxx> 47 #include <svx/hlnkitem.hxx> 48 #include <sfx2/sidebar/EnumContext.hxx> 49 #include <editeng/postitem.hxx> 50 #include <editeng/scripttypeitem.hxx> 51 #include <editeng/shdditem.hxx> 52 #include <svl/srchitem.hxx> 53 #include <editeng/udlnitem.hxx> 54 #include <editeng/wghtitem.hxx> 55 #include <sfx2/basedlgs.hxx> 56 #include <sfx2/bindings.hxx> 57 #include <sfx2/msg.hxx> 58 #include <sfx2/objface.hxx> 59 #include <sfx2/objsh.hxx> 60 #include <sfx2/request.hxx> 61 #include <sfx2/viewfrm.hxx> 62 #include <sot/exchange.hxx> 63 #include <svtools/cliplistener.hxx> 64 #include <svl/whiter.hxx> 65 #include <vcl/msgbox.hxx> 66 #include <vcl/sound.hxx> 67 #include <sot/formats.hxx> 68 #include <svtools/transfer.hxx> 69 #include <svl/stritem.hxx> 70 71 #define _EDITSH_CXX 72 #include "editsh.hxx" 73 74 #include "scresid.hxx" 75 #include "global.hxx" 76 #include "sc.hrc" 77 #include "scmod.hxx" 78 #include "inputhdl.hxx" 79 #include "viewutil.hxx" 80 #include "viewdata.hxx" 81 #include "document.hxx" 82 //CHINA001 #include "namepast.hxx" 83 #include "reffind.hxx" 84 #include "tabvwsh.hxx" 85 //CHINA001 #include "textdlgs.hxx" 86 #include "editutil.hxx" 87 #include "globstr.hrc" 88 89 #define ScEditShell 90 #include "scslots.hxx" 91 92 #include "scui_def.hxx" //CHINA001 93 #include "scabstdlg.hxx" //CHINA001 94 95 96 using namespace ::com::sun::star; 97 98 99 TYPEINIT1( ScEditShell, SfxShell ); 100 101 SFX_IMPL_INTERFACE(ScEditShell, SfxShell, ScResId(SCSTR_EDITSHELL)) 102 { 103 SFX_POPUPMENU_REGISTRATION( ScResId(RID_POPUP_EDIT) ); 104 } 105 106 107 ScEditShell::ScEditShell(EditView* pView, ScViewData* pData) : 108 pEditView (pView), 109 pViewData (pData), 110 pClipEvtLstnr (NULL), 111 bPastePossible (sal_False), 112 bIsInsertMode (sal_True) 113 { 114 SetPool( pEditView->GetEditEngine()->GetEmptyItemSet().GetPool() ); 115 SetUndoManager( &pEditView->GetEditEngine()->GetUndoManager() ); 116 SetName(String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("EditCell"))); 117 SfxShell::SetContextName(sfx2::sidebar::EnumContext::GetContextName(sfx2::sidebar::EnumContext::Context_EditCell)); 118 } 119 120 ScEditShell::~ScEditShell() 121 { 122 if ( pClipEvtLstnr ) 123 { 124 pClipEvtLstnr->AddRemoveListener( pViewData->GetActiveWin(), sal_False ); 125 126 // #122057# The listener may just now be waiting for the SolarMutex and call the link 127 // afterwards, in spite of RemoveListener. So the link has to be reset, too. 128 pClipEvtLstnr->ClearCallbackLink(); 129 130 pClipEvtLstnr->release(); 131 } 132 } 133 134 ScInputHandler* ScEditShell::GetMyInputHdl() 135 { 136 return SC_MOD()->GetInputHdl( pViewData->GetViewShell() ); 137 } 138 139 void ScEditShell::SetEditView(EditView* pView) 140 { 141 pEditView = pView; 142 pEditView->SetInsertMode( bIsInsertMode ); 143 SetPool( pEditView->GetEditEngine()->GetEmptyItemSet().GetPool() ); 144 SetUndoManager( &pEditView->GetEditEngine()->GetUndoManager() ); 145 } 146 147 void lcl_RemoveAttribs( EditView& rEditView ) 148 { 149 ScEditEngineDefaulter* pEngine = static_cast<ScEditEngineDefaulter*>(rEditView.GetEditEngine()); 150 151 sal_Bool bOld = pEngine->GetUpdateMode(); 152 pEngine->SetUpdateMode(sal_False); 153 154 String aName = ScGlobal::GetRscString( STR_UNDO_DELETECONTENTS ); 155 pEngine->GetUndoManager().EnterListAction( aName, aName ); 156 157 rEditView.RemoveAttribs(sal_True); 158 pEngine->RepeatDefaults(); // #97226# paragraph attributes from cell formats must be preserved 159 160 pEngine->GetUndoManager().LeaveListAction(); 161 162 pEngine->SetUpdateMode(bOld); 163 } 164 165 void lclInsertCharacter( EditView* pTableView, EditView* pTopView, sal_Unicode cChar ) 166 { 167 String aString( cChar ); 168 if( pTableView ) 169 pTableView->InsertText( aString ); 170 if( pTopView ) 171 pTopView->InsertText( aString ); 172 } 173 174 void ScEditShell::Execute( SfxRequest& rReq ) 175 { 176 const SfxItemSet* pReqArgs = rReq.GetArgs(); 177 sal_uInt16 nSlot = rReq.GetSlot(); 178 SfxBindings& rBindings = pViewData->GetBindings(); 179 180 ScInputHandler* pHdl = GetMyInputHdl(); 181 DBG_ASSERT(pHdl,"kein ScInputHandler"); 182 183 EditView* pTopView = pHdl->GetTopView(); // hat Eingabezeile den Focus? 184 EditView* pTableView = pHdl->GetTableView(); 185 186 DBG_ASSERT(pTableView,"no EditView :-("); 187 /* #i91683# No EditView if spell-check dialog is active and positioned on 188 * an error and user immediately (without double click or F2) selected a 189 * text portion of that cell with the mouse and wanted to modify it. */ 190 /* FIXME: Bailing out only cures the symptom and prevents a crash, no edit 191 * action is possible. A real fix somehow would need to create a valid 192 * EditView from the spell-check view. */ 193 if (!pTableView) 194 return; 195 196 EditEngine* pEngine = pTableView->GetEditEngine(); 197 198 pHdl->DataChanging(); 199 sal_Bool bSetSelIsRef = sal_False; 200 sal_Bool bSetModified = sal_True; 201 202 switch ( nSlot ) 203 { 204 case FID_INS_CELL_CONTENTS: // Insert-Taste, weil als Acc definiert 205 bIsInsertMode = !pTableView->IsInsertMode(); 206 pTableView->SetInsertMode( bIsInsertMode ); 207 if (pTopView) 208 pTopView->SetInsertMode( bIsInsertMode ); 209 rBindings.Invalidate( SID_ATTR_INSERT ); 210 break; 211 212 case SID_ATTR_INSERT: 213 if ( pReqArgs ) 214 { 215 bIsInsertMode = ((const SfxBoolItem&)pReqArgs->Get(nSlot)).GetValue(); 216 pTableView->SetInsertMode( bIsInsertMode ); 217 if (pTopView) 218 pTopView->SetInsertMode( bIsInsertMode ); 219 rBindings.Invalidate( SID_ATTR_INSERT ); 220 } 221 break; 222 223 case SID_THES: 224 { 225 String aReplaceText; 226 SFX_REQUEST_ARG( rReq, pItem2, SfxStringItem, SID_THES , sal_False ); 227 if (pItem2) 228 aReplaceText = pItem2->GetValue(); 229 if (aReplaceText.Len() > 0) 230 ReplaceTextWithSynonym( *pEditView, aReplaceText ); 231 } 232 break; 233 234 case SID_COPY: 235 pTableView->Copy(); 236 bSetModified = sal_False; 237 break; 238 239 case SID_CUT: 240 pTableView->Cut(); 241 if (pTopView) 242 pTopView->DeleteSelected(); 243 break; 244 245 case SID_PASTE: 246 pTableView->PasteSpecial(); 247 if (pTopView) 248 pTopView->Paste(); 249 break; 250 251 case SID_DELETE: 252 pTableView->DeleteSelected(); 253 if (pTopView) 254 pTopView->DeleteSelected(); 255 break; 256 257 case SID_CELL_FORMAT_RESET: // "Standard" 258 lcl_RemoveAttribs( *pTableView ); 259 if ( pTopView ) 260 lcl_RemoveAttribs( *pTopView ); 261 break; 262 263 case SID_CLIPBOARD_FORMAT_ITEMS: 264 { 265 sal_uLong nFormat = 0; 266 const SfxPoolItem* pItem; 267 if ( pReqArgs && 268 pReqArgs->GetItemState(nSlot, sal_True, &pItem) == SFX_ITEM_SET && 269 pItem->ISA(SfxUInt32Item) ) 270 { 271 nFormat = ((const SfxUInt32Item*)pItem)->GetValue(); 272 } 273 274 if ( nFormat ) 275 { 276 if (SOT_FORMAT_STRING == nFormat) 277 pTableView->Paste(); 278 else 279 pTableView->PasteSpecial(); 280 281 if (pTopView) 282 pTopView->Paste(); 283 } 284 } 285 break; 286 287 case SID_PASTE_SPECIAL: 288 { 289 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 290 SfxAbstractPasteDialog* pDlg = pFact->CreatePasteDialog( pViewData->GetDialogParent() ); 291 sal_uLong nFormat = 0; 292 if ( pDlg ) 293 { 294 pDlg->Insert( SOT_FORMAT_STRING, EMPTY_STRING ); 295 pDlg->Insert( SOT_FORMAT_RTF, EMPTY_STRING ); 296 297 TransferableDataHelper aDataHelper( 298 TransferableDataHelper::CreateFromSystemClipboard( pViewData->GetActiveWin() ) ); 299 300 nFormat = pDlg->GetFormat( aDataHelper.GetTransferable() ); 301 DELETEZ(pDlg); 302 } 303 304 // while the dialog was open, edit mode may have been stopped 305 if (!SC_MOD()->IsInputMode()) 306 { 307 Sound::Beep(); 308 return; 309 } 310 311 if (nFormat > 0) 312 { 313 if (SOT_FORMAT_STRING == nFormat) 314 pTableView->Paste(); 315 else 316 pTableView->PasteSpecial(); 317 318 if (pTopView) 319 pTopView->Paste(); 320 } 321 322 if (pTopView) 323 pTopView->GetWindow()->GrabFocus(); 324 } 325 break; 326 327 case SID_SELECTALL: 328 { 329 sal_uInt16 nPar = pEngine->GetParagraphCount(); 330 if (nPar) 331 { 332 xub_StrLen nLen = pEngine->GetTextLen(nPar-1); 333 pTableView->SetSelection(ESelection(0,0,nPar-1,nLen)); 334 if (pTopView) 335 pTopView->SetSelection(ESelection(0,0,nPar-1,nLen)); 336 } 337 bSetModified = sal_False; 338 } 339 break; 340 341 case SID_CHARMAP: 342 { 343 sal_uInt16 nScript = pTableView->GetSelectedScriptType(); 344 sal_uInt16 nFontWhich = ( nScript == SCRIPTTYPE_ASIAN ) ? EE_CHAR_FONTINFO_CJK : 345 ( ( nScript == SCRIPTTYPE_COMPLEX ) ? EE_CHAR_FONTINFO_CTL : 346 EE_CHAR_FONTINFO ); 347 const SvxFontItem& rItem = (const SvxFontItem&) 348 pTableView->GetAttribs().Get(nFontWhich); 349 350 String aString; 351 SvxFontItem aNewItem( EE_CHAR_FONTINFO ); 352 353 const SfxItemSet *pArgs = rReq.GetArgs(); 354 const SfxPoolItem* pItem = 0; 355 if( pArgs ) 356 pArgs->GetItemState(GetPool().GetWhich(SID_CHARMAP), sal_False, &pItem); 357 358 if ( pItem ) 359 { 360 aString = ((const SfxStringItem*)pItem)->GetValue(); 361 const SfxPoolItem* pFtItem = NULL; 362 pArgs->GetItemState( GetPool().GetWhich(SID_ATTR_SPECIALCHAR), sal_False, &pFtItem); 363 const SfxStringItem* pFontItem = PTR_CAST( SfxStringItem, pFtItem ); 364 if ( pFontItem ) 365 { 366 String aFontName(pFontItem->GetValue()); 367 Font aFont(aFontName, Size(1,1)); // Size nur wg. CTOR 368 aNewItem = SvxFontItem( aFont.GetFamily(), aFont.GetName(), 369 aFont.GetStyleName(), aFont.GetPitch(), 370 aFont.GetCharSet(), ATTR_FONT ); 371 } 372 else 373 aNewItem = rItem; 374 } 375 else 376 { 377 ScViewUtil::ExecuteCharMap( rItem, *pViewData->GetViewShell()->GetViewFrame(), aNewItem, aString ); 378 379 // while the dialog was open, edit mode may have been stopped 380 if (!SC_MOD()->IsInputMode()) 381 { 382 Sound::Beep(); 383 return; 384 } 385 } 386 387 if ( aString.Len() ) 388 { 389 // if string contains WEAK characters, set all fonts 390 sal_uInt8 nSetScript; 391 ScDocument* pDoc = pViewData->GetDocument(); 392 if ( pDoc->HasStringWeakCharacters( aString ) ) 393 nSetScript = SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN | SCRIPTTYPE_COMPLEX; 394 else 395 nSetScript = pDoc->GetStringScriptType( aString ); 396 397 SfxItemSet aSet( pTableView->GetEmptyItemSet() ); 398 SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONT, GetPool() ); 399 aSetItem.PutItemForScriptType( nSetScript, aNewItem ); 400 aSet.Put( aSetItem.GetItemSet(), sal_False ); 401 402 // SetAttribs an der View selektiert ein Wort, wenn nichts selektiert ist 403 pTableView->GetEditEngine()->QuickSetAttribs( aSet, pTableView->GetSelection() ); 404 pTableView->InsertText(aString); 405 if (pTopView) 406 pTopView->InsertText(aString); 407 408 SfxStringItem aStringItem( SID_CHARMAP, aString ); 409 SfxStringItem aFontItem( SID_ATTR_SPECIALCHAR, aNewItem.GetFamilyName() ); 410 rReq.AppendItem( aFontItem ); 411 rReq.AppendItem( aStringItem ); 412 rReq.Done(); 413 414 415 } 416 417 if (pTopView) 418 pTopView->GetWindow()->GrabFocus(); 419 } 420 break; 421 422 case FID_INSERT_NAME: 423 { 424 ScDocument* pDoc = pViewData->GetDocument(); 425 //CHINA001 ScNamePasteDlg* pDlg = new ScNamePasteDlg( pViewData->GetDialogParent(), 426 //CHINA001 pDoc->GetRangeName(), sal_False ); 427 // "Liste" disablen 428 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 429 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 430 431 AbstractScNamePasteDlg* pDlg = pFact->CreateScNamePasteDlg( pViewData->GetDialogParent(), pDoc->GetRangeName(), RID_SCDLG_NAMES_PASTE, sal_False ); 432 DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001 433 short nRet = pDlg->Execute(); 434 // pDlg is needed below 435 436 // while the dialog was open, edit mode may have been stopped 437 if (!SC_MOD()->IsInputMode()) 438 { 439 Sound::Beep(); 440 delete pDlg; 441 return; 442 } 443 444 if ( nRet == BTN_PASTE_NAME ) 445 { 446 String aName = pDlg->GetSelectedName(); 447 pTableView->InsertText(aName); 448 if (pTopView) 449 pTopView->InsertText(aName); 450 } 451 delete pDlg; 452 453 if (pTopView) 454 pTopView->GetWindow()->GrabFocus(); 455 } 456 break; 457 458 case SID_CHAR_DLG_EFFECT: 459 case SID_CHAR_DLG: 460 { 461 SfxItemSet aAttrs( pTableView->GetAttribs() ); 462 463 SfxObjectShell* pObjSh = pViewData->GetSfxDocShell(); 464 465 //CHINA001 ScCharDlg* pDlg = new ScCharDlg( pViewData->GetDialogParent(), &aAttrs, pObjSh ); 466 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 467 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 468 469 SfxAbstractTabDialog* pDlg = pFact->CreateScCharDlg( pViewData->GetDialogParent(), &aAttrs, 470 pObjSh, RID_SCDLG_CHAR ); 471 DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001 472 if (nSlot == SID_CHAR_DLG_EFFECT) 473 { 474 pDlg->SetCurPageId(RID_SVXPAGE_CHAR_EFFECTS); 475 } 476 short nRet = pDlg->Execute(); 477 // pDlg is needed below 478 479 // while the dialog was open, edit mode may have been stopped 480 if (!SC_MOD()->IsInputMode()) 481 { 482 Sound::Beep(); 483 delete pDlg; 484 return; 485 } 486 487 if ( nRet == RET_OK ) 488 { 489 const SfxItemSet* pOut = pDlg->GetOutputItemSet(); 490 pTableView->SetAttribs( *pOut ); 491 } 492 delete pDlg; 493 } 494 break; 495 496 case SID_TOGGLE_REL: 497 { 498 sal_Bool bOk = sal_False; 499 if (pEngine->GetParagraphCount() == 1) 500 { 501 String aText = pEngine->GetText(); 502 ESelection aSel = pEditView->GetSelection(); // aktuelle View 503 504 ScRefFinder aFinder( aText, pViewData->GetDocument() ); 505 aFinder.ToggleRel( aSel.nStartPos, aSel.nEndPos ); 506 if (aFinder.GetFound()) 507 { 508 String aNew = aFinder.GetText(); 509 ESelection aNewSel( 0,aFinder.GetSelStart(), 0,aFinder.GetSelEnd() ); 510 pEngine->SetText( aNew ); 511 pTableView->SetSelection( aNewSel ); 512 if ( pTopView ) 513 { 514 pTopView->GetEditEngine()->SetText( aNew ); 515 pTopView->SetSelection( aNewSel ); 516 } 517 bOk = sal_True; 518 519 // Referenz wird selektiert -> beim Tippen nicht ueberschreiben 520 bSetSelIsRef = sal_True; 521 } 522 } 523 if (!bOk) 524 Sound::Beep(); // keine Referenzen oder mehrere Absaetze 525 } 526 break; 527 528 case SID_HYPERLINK_SETLINK: 529 if( pReqArgs ) 530 { 531 const SfxPoolItem* pItem; 532 if ( pReqArgs->GetItemState( SID_HYPERLINK_SETLINK, sal_True, &pItem ) == SFX_ITEM_SET ) 533 { 534 const SvxHyperlinkItem* pHyper = (const SvxHyperlinkItem*) pItem; 535 const String& rName = pHyper->GetName(); 536 const String& rURL = pHyper->GetURL(); 537 const String& rTarget = pHyper->GetTargetFrame(); 538 SvxLinkInsertMode eMode = pHyper->GetInsertMode(); 539 540 sal_Bool bDone = sal_False; 541 if ( eMode == HLINK_DEFAULT || eMode == HLINK_FIELD ) 542 { 543 const SvxURLField* pURLField = GetURLField(); 544 if ( pURLField ) 545 { 546 // altes Feld selektieren 547 548 ESelection aSel = pTableView->GetSelection(); 549 aSel.Adjust(); 550 aSel.nEndPara = aSel.nStartPara; 551 aSel.nEndPos = aSel.nStartPos + 1; 552 pTableView->SetSelection( aSel ); 553 554 // neues Feld einfuegen 555 556 SvxURLField aURLField( rURL, rName, SVXURLFORMAT_REPR ); 557 aURLField.SetTargetFrame( rTarget ); 558 SvxFieldItem aURLItem( aURLField, EE_FEATURE_FIELD ); 559 pTableView->InsertField( aURLItem ); 560 pTableView->SetSelection( aSel ); // select inserted field 561 562 // #57254# jetzt doch auch Felder in der Top-View 563 564 if ( pTopView ) 565 { 566 aSel = pTopView->GetSelection(); 567 aSel.nEndPara = aSel.nStartPara; 568 aSel.nEndPos = aSel.nStartPos + 1; 569 pTopView->SetSelection( aSel ); 570 pTopView->InsertField( aURLItem ); 571 pTopView->SetSelection( aSel ); // select inserted field 572 } 573 574 bDone = sal_True; 575 } 576 } 577 578 if (!bDone) 579 { 580 pViewData->GetViewShell()-> 581 InsertURL( rName, rURL, rTarget, (sal_uInt16) eMode ); 582 583 // InsertURL an der ViewShell schaltet bei "Button" 584 // die EditShell ab, darum sofort return 585 586 return; 587 } 588 } 589 } 590 break; 591 592 case SID_OPEN_HYPERLINK: 593 { 594 const SvxURLField* pURLField = GetURLField(); 595 if ( pURLField ) 596 ScGlobal::OpenURL( pURLField->GetURL(), pURLField->GetTargetFrame() ); 597 return; 598 } 599 //break; 600 601 case FN_INSERT_SOFT_HYPHEN: 602 lclInsertCharacter( pTableView, pTopView, CHAR_SHY ); 603 break; 604 case FN_INSERT_HARDHYPHEN: 605 lclInsertCharacter( pTableView, pTopView, CHAR_NBHY ); 606 break; 607 case FN_INSERT_HARD_SPACE: 608 lclInsertCharacter( pTableView, pTopView, CHAR_NBSP ); 609 break; 610 case SID_INSERT_RLM: 611 lclInsertCharacter( pTableView, pTopView, CHAR_RLM ); 612 break; 613 case SID_INSERT_LRM: 614 lclInsertCharacter( pTableView, pTopView, CHAR_LRM ); 615 break; 616 case SID_INSERT_ZWSP: 617 lclInsertCharacter( pTableView, pTopView, CHAR_ZWSP ); 618 break; 619 case SID_INSERT_ZWNBSP: 620 lclInsertCharacter( pTableView, pTopView, CHAR_ZWNBSP ); 621 break; 622 } 623 624 pHdl->DataChanged(sal_False, bSetModified); 625 if (bSetSelIsRef) 626 pHdl->SetSelIsRef(sal_True); 627 } 628 629 void lcl_DisableAll( SfxItemSet& rSet ) // disable all slots 630 { 631 SfxWhichIter aIter( rSet ); 632 sal_uInt16 nWhich = aIter.FirstWhich(); 633 while (nWhich) 634 { 635 rSet.DisableItem( nWhich ); 636 nWhich = aIter.NextWhich(); 637 } 638 } 639 640 void __EXPORT ScEditShell::GetState( SfxItemSet& rSet ) 641 { 642 // #125326# When deactivating the view, edit mode is stopped, but the EditShell is left active 643 // (a shell can't be removed from within Deactivate). In that state, the EditView isn't inserted 644 // into the EditEngine, so it can have an invalid selection and must not be used. 645 if ( !pViewData->HasEditView( pViewData->GetActivePart() ) ) 646 { 647 lcl_DisableAll( rSet ); 648 return; 649 } 650 651 ScInputHandler* pHdl = GetMyInputHdl(); 652 EditView* pActiveView = pHdl ? pHdl->GetActiveView() : pEditView; 653 654 SfxWhichIter aIter( rSet ); 655 sal_uInt16 nWhich = aIter.FirstWhich(); 656 while (nWhich) 657 { 658 switch (nWhich) 659 { 660 case SID_ATTR_INSERT: // Statuszeile 661 { 662 if ( pActiveView ) 663 rSet.Put( SfxBoolItem( nWhich, pActiveView->IsInsertMode() ) ); 664 else 665 rSet.Put( SfxBoolItem( nWhich, 42 ) ); 666 } 667 break; 668 669 case SID_HYPERLINK_GETLINK: 670 { 671 SvxHyperlinkItem aHLinkItem; 672 const SvxURLField* pURLField = GetURLField(); 673 if ( pURLField ) 674 { 675 aHLinkItem.SetName( pURLField->GetRepresentation() ); 676 aHLinkItem.SetURL( pURLField->GetURL() ); 677 aHLinkItem.SetTargetFrame( pURLField->GetTargetFrame() ); 678 } 679 else if ( pActiveView ) 680 { 681 // use selected text as name for urls 682 String sReturn = pActiveView->GetSelected(); 683 sReturn.Erase(255); 684 sReturn.EraseTrailingChars(); 685 aHLinkItem.SetName(sReturn); 686 } 687 rSet.Put(aHLinkItem); 688 } 689 break; 690 691 case SID_OPEN_HYPERLINK: 692 { 693 if ( !GetURLField() ) 694 rSet.DisableItem( nWhich ); 695 } 696 break; 697 698 case SID_TRANSLITERATE_HALFWIDTH: 699 case SID_TRANSLITERATE_FULLWIDTH: 700 case SID_TRANSLITERATE_HIRAGANA: 701 case SID_TRANSLITERATE_KATAGANA: 702 case SID_INSERT_RLM: 703 case SID_INSERT_LRM: 704 case SID_INSERT_ZWNBSP: 705 case SID_INSERT_ZWSP: 706 ScViewUtil::HideDisabledSlot( rSet, pViewData->GetBindings(), nWhich ); 707 break; 708 709 case SID_THES: 710 { 711 String aStatusVal; 712 LanguageType nLang = LANGUAGE_NONE; 713 bool bIsLookUpWord = GetStatusValueForThesaurusFromContext( aStatusVal, nLang, *pActiveView ); 714 rSet.Put( SfxStringItem( SID_THES, aStatusVal ) ); 715 716 // disable thesaurus context menu entry if there is nothing to look up 717 sal_Bool bCanDoThesaurus = ScModule::HasThesaurusLanguage( nLang ); 718 if (!bIsLookUpWord || !bCanDoThesaurus) 719 rSet.DisableItem( SID_THES ); 720 } 721 break; 722 723 724 } 725 nWhich = aIter.NextWhich(); 726 } 727 } 728 729 const SvxURLField* ScEditShell::GetURLField() 730 { 731 ScInputHandler* pHdl = GetMyInputHdl(); 732 EditView* pActiveView = pHdl ? pHdl->GetActiveView() : pEditView; 733 if ( pActiveView ) 734 { 735 const SvxFieldItem* pFieldItem = pActiveView->GetFieldAtSelection(); 736 if (pFieldItem) 737 { 738 const SvxFieldData* pField = pFieldItem->GetField(); 739 if ( pField && pField->ISA(SvxURLField) ) 740 return (const SvxURLField*)pField; 741 } 742 } 743 744 return NULL; 745 } 746 747 IMPL_LINK( ScEditShell, ClipboardChanged, TransferableDataHelper*, pDataHelper ) 748 { 749 if ( pDataHelper ) 750 { 751 bPastePossible = ( pDataHelper->HasFormat( SOT_FORMAT_STRING ) || pDataHelper->HasFormat( SOT_FORMAT_RTF ) ); 752 753 SfxBindings& rBindings = pViewData->GetBindings(); 754 rBindings.Invalidate( SID_PASTE ); 755 rBindings.Invalidate( SID_PASTE_SPECIAL ); 756 rBindings.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS ); 757 } 758 return 0; 759 } 760 761 void __EXPORT ScEditShell::GetClipState( SfxItemSet& rSet ) 762 { 763 if ( !pClipEvtLstnr ) 764 { 765 // create listener 766 pClipEvtLstnr = new TransferableClipboardListener( LINK( this, ScEditShell, ClipboardChanged ) ); 767 pClipEvtLstnr->acquire(); 768 Window* pWin = pViewData->GetActiveWin(); 769 pClipEvtLstnr->AddRemoveListener( pWin, sal_True ); 770 771 // get initial state 772 TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( pViewData->GetActiveWin() ) ); 773 bPastePossible = ( aDataHelper.HasFormat( SOT_FORMAT_STRING ) || aDataHelper.HasFormat( SOT_FORMAT_RTF ) ); 774 } 775 776 SfxWhichIter aIter( rSet ); 777 sal_uInt16 nWhich = aIter.FirstWhich(); 778 while (nWhich) 779 { 780 switch (nWhich) 781 { 782 case SID_PASTE: 783 case SID_PASTE_SPECIAL: 784 if( !bPastePossible ) 785 rSet.DisableItem( nWhich ); 786 break; 787 case SID_CLIPBOARD_FORMAT_ITEMS: 788 if( bPastePossible ) 789 { 790 SvxClipboardFmtItem aFormats( SID_CLIPBOARD_FORMAT_ITEMS ); 791 TransferableDataHelper aDataHelper( 792 TransferableDataHelper::CreateFromSystemClipboard( pViewData->GetActiveWin() ) ); 793 794 if ( aDataHelper.HasFormat( SOT_FORMAT_STRING ) ) 795 aFormats.AddClipbrdFormat( SOT_FORMAT_STRING ); 796 if ( aDataHelper.HasFormat( SOT_FORMAT_RTF ) ) 797 aFormats.AddClipbrdFormat( SOT_FORMAT_RTF ); 798 799 rSet.Put( aFormats ); 800 } 801 else 802 rSet.DisableItem( nWhich ); 803 break; 804 } 805 nWhich = aIter.NextWhich(); 806 } 807 } 808 809 void lcl_InvalidateUnder( SfxBindings& rBindings ) 810 { 811 rBindings.Invalidate( SID_ATTR_CHAR_UNDERLINE ); 812 rBindings.Invalidate( SID_ULINE_VAL_NONE ); 813 rBindings.Invalidate( SID_ULINE_VAL_SINGLE ); 814 rBindings.Invalidate( SID_ULINE_VAL_DOUBLE ); 815 rBindings.Invalidate( SID_ULINE_VAL_DOTTED ); 816 } 817 818 void ScEditShell::ExecuteAttr(SfxRequest& rReq) 819 { 820 SfxItemSet aSet( pEditView->GetEmptyItemSet() ); 821 SfxBindings& rBindings = pViewData->GetBindings(); 822 const SfxItemSet* pArgs = rReq.GetArgs(); 823 sal_uInt16 nSlot = rReq.GetSlot(); 824 825 switch ( nSlot ) 826 { 827 case SID_ATTR_CHAR_FONTHEIGHT: 828 case SID_ATTR_CHAR_FONT: 829 { 830 if (pArgs) 831 { 832 // #i78017 establish the same behaviour as in Writer 833 sal_uInt16 nScript = SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN | SCRIPTTYPE_COMPLEX; 834 if (nSlot == SID_ATTR_CHAR_FONT) 835 { 836 nScript = pEditView->GetSelectedScriptType(); 837 if (nScript == 0) nScript = ScGlobal::GetDefaultScriptType(); 838 } 839 840 SfxItemPool& rPool = GetPool(); 841 SvxScriptSetItem aSetItem( nSlot, rPool ); 842 sal_uInt16 nWhich = rPool.GetWhich( nSlot ); 843 aSetItem.PutItemForScriptType( nScript, pArgs->Get( nWhich ) ); 844 845 aSet.Put( aSetItem.GetItemSet(), sal_False ); 846 } 847 } 848 break; 849 850 case SID_ATTR_CHAR_COLOR: 851 { 852 if (pArgs) 853 { 854 aSet.Put( pArgs->Get( pArgs->GetPool()->GetWhich( nSlot ) ) ); 855 rBindings.Invalidate( nSlot ); 856 } 857 } 858 break; 859 860 // Toggles 861 862 case SID_ATTR_CHAR_WEIGHT: 863 { 864 // #i78017 establish the same behaviour as in Writer 865 sal_uInt16 nScript = SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN | SCRIPTTYPE_COMPLEX; 866 867 SfxItemPool& rPool = GetPool(); 868 869 sal_Bool bOld = sal_False; 870 SvxScriptSetItem aOldSetItem( nSlot, rPool ); 871 aOldSetItem.GetItemSet().Put( pEditView->GetAttribs(), sal_False ); 872 const SfxPoolItem* pCore = aOldSetItem.GetItemOfScript( nScript ); 873 if ( pCore && ((const SvxWeightItem*)pCore)->GetWeight() > WEIGHT_NORMAL ) 874 bOld = sal_True; 875 876 SvxScriptSetItem aSetItem( nSlot, rPool ); 877 aSetItem.PutItemForScriptType( nScript, 878 SvxWeightItem( bOld ? WEIGHT_NORMAL : WEIGHT_BOLD, EE_CHAR_WEIGHT ) ); 879 aSet.Put( aSetItem.GetItemSet(), sal_False ); 880 881 rBindings.Invalidate( nSlot ); 882 } 883 break; 884 885 case SID_ATTR_CHAR_POSTURE: 886 { 887 // #i78017 establish the same behaviour as in Writer 888 sal_uInt16 nScript = SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN | SCRIPTTYPE_COMPLEX; 889 890 SfxItemPool& rPool = GetPool(); 891 892 sal_Bool bOld = sal_False; 893 SvxScriptSetItem aOldSetItem( nSlot, rPool ); 894 aOldSetItem.GetItemSet().Put( pEditView->GetAttribs(), sal_False ); 895 const SfxPoolItem* pCore = aOldSetItem.GetItemOfScript( nScript ); 896 if ( pCore && ((const SvxPostureItem*)pCore)->GetValue() != ITALIC_NONE ) 897 bOld = sal_True; 898 899 SvxScriptSetItem aSetItem( nSlot, rPool ); 900 aSetItem.PutItemForScriptType( nScript, 901 SvxPostureItem( bOld ? ITALIC_NONE : ITALIC_NORMAL, EE_CHAR_ITALIC ) ); 902 aSet.Put( aSetItem.GetItemSet(), sal_False ); 903 904 rBindings.Invalidate( nSlot ); 905 } 906 break; 907 908 case SID_ULINE_VAL_NONE: 909 aSet.Put( SvxUnderlineItem( UNDERLINE_NONE, EE_CHAR_UNDERLINE ) ); 910 lcl_InvalidateUnder( rBindings ); 911 break; 912 913 case SID_ATTR_CHAR_UNDERLINE: // Toggles 914 case SID_ULINE_VAL_SINGLE: 915 case SID_ULINE_VAL_DOUBLE: 916 case SID_ULINE_VAL_DOTTED: 917 { 918 FontUnderline eOld = ((const SvxUnderlineItem&) pEditView-> 919 GetAttribs().Get(EE_CHAR_UNDERLINE)).GetLineStyle(); 920 FontUnderline eNew = eOld; 921 switch (nSlot) 922 { 923 case SID_ATTR_CHAR_UNDERLINE: 924 eNew = ( eOld != UNDERLINE_NONE ) ? UNDERLINE_NONE : UNDERLINE_SINGLE; 925 break; 926 case SID_ULINE_VAL_SINGLE: 927 eNew = ( eOld == UNDERLINE_SINGLE ) ? UNDERLINE_NONE : UNDERLINE_SINGLE; 928 break; 929 case SID_ULINE_VAL_DOUBLE: 930 eNew = ( eOld == UNDERLINE_DOUBLE ) ? UNDERLINE_NONE : UNDERLINE_DOUBLE; 931 break; 932 case SID_ULINE_VAL_DOTTED: 933 eNew = ( eOld == UNDERLINE_DOTTED ) ? UNDERLINE_NONE : UNDERLINE_DOTTED; 934 break; 935 } 936 aSet.Put( SvxUnderlineItem( eNew, EE_CHAR_UNDERLINE ) ); 937 lcl_InvalidateUnder( rBindings ); 938 } 939 break; 940 941 case SID_ATTR_CHAR_OVERLINE: 942 { 943 FontUnderline eOld = ((const SvxOverlineItem&) pEditView-> 944 GetAttribs().Get(EE_CHAR_OVERLINE)).GetLineStyle(); 945 FontUnderline eNew = ( eOld != UNDERLINE_NONE ) ? UNDERLINE_NONE : UNDERLINE_SINGLE; 946 aSet.Put( SvxOverlineItem( eNew, EE_CHAR_OVERLINE ) ); 947 rBindings.Invalidate( nSlot ); 948 } 949 break; 950 951 case SID_ATTR_CHAR_STRIKEOUT: 952 { 953 sal_Bool bOld = ((const SvxCrossedOutItem&)pEditView->GetAttribs(). 954 Get(EE_CHAR_STRIKEOUT)).GetValue() != STRIKEOUT_NONE; 955 aSet.Put( SvxCrossedOutItem( bOld ? STRIKEOUT_NONE : STRIKEOUT_SINGLE, EE_CHAR_STRIKEOUT ) ); 956 rBindings.Invalidate( nSlot ); 957 } 958 break; 959 960 case SID_ATTR_CHAR_SHADOWED: 961 { 962 sal_Bool bOld = ((const SvxShadowedItem&)pEditView->GetAttribs(). 963 Get(EE_CHAR_SHADOW)).GetValue(); 964 aSet.Put( SvxShadowedItem( !bOld, EE_CHAR_SHADOW ) ); 965 rBindings.Invalidate( nSlot ); 966 } 967 break; 968 969 case SID_ATTR_CHAR_CONTOUR: 970 { 971 sal_Bool bOld = ((const SvxContourItem&)pEditView->GetAttribs(). 972 Get(EE_CHAR_OUTLINE)).GetValue(); 973 aSet.Put( SvxContourItem( !bOld, EE_CHAR_OUTLINE ) ); 974 rBindings.Invalidate( nSlot ); 975 } 976 break; 977 978 case SID_SET_SUPER_SCRIPT: 979 { 980 SvxEscapement eOld = (SvxEscapement) ((const SvxEscapementItem&) 981 pEditView->GetAttribs().Get(EE_CHAR_ESCAPEMENT)).GetEnumValue(); 982 SvxEscapement eNew = (eOld == SVX_ESCAPEMENT_SUPERSCRIPT) ? 983 SVX_ESCAPEMENT_OFF : SVX_ESCAPEMENT_SUPERSCRIPT; 984 aSet.Put( SvxEscapementItem( eNew, EE_CHAR_ESCAPEMENT ) ); 985 rBindings.Invalidate( nSlot ); 986 } 987 break; 988 case SID_SET_SUB_SCRIPT: 989 { 990 SvxEscapement eOld = (SvxEscapement) ((const SvxEscapementItem&) 991 pEditView->GetAttribs().Get(EE_CHAR_ESCAPEMENT)).GetEnumValue(); 992 SvxEscapement eNew = (eOld == SVX_ESCAPEMENT_SUBSCRIPT) ? 993 SVX_ESCAPEMENT_OFF : SVX_ESCAPEMENT_SUBSCRIPT; 994 aSet.Put( SvxEscapementItem( eNew, EE_CHAR_ESCAPEMENT ) ); 995 rBindings.Invalidate( nSlot ); 996 } 997 break; 998 } 999 1000 // 1001 // anwenden 1002 // 1003 1004 EditEngine* pEngine = pEditView->GetEditEngine(); 1005 sal_Bool bOld = pEngine->GetUpdateMode(); 1006 pEngine->SetUpdateMode(sal_False); 1007 1008 pEditView->SetAttribs( aSet ); 1009 1010 pEngine->SetUpdateMode(bOld); 1011 pEditView->Invalidate(); 1012 1013 ScInputHandler* pHdl = GetMyInputHdl(); 1014 pHdl->SetModified(); 1015 1016 rReq.Done(); 1017 } 1018 1019 void ScEditShell::GetAttrState(SfxItemSet &rSet) 1020 { 1021 if ( !pViewData->HasEditView( pViewData->GetActivePart() ) ) // #125326# 1022 { 1023 lcl_DisableAll( rSet ); 1024 return; 1025 } 1026 1027 SfxItemSet aAttribs = pEditView->GetAttribs(); 1028 rSet.Put( aAttribs ); 1029 1030 // choose font info according to selection script type 1031 1032 sal_uInt16 nScript = pEditView->GetSelectedScriptType(); 1033 if (nScript == 0) nScript = ScGlobal::GetDefaultScriptType(); 1034 1035 // #i55929# input-language-dependent script type (depends on input language if nothing selected) 1036 sal_uInt16 nInputScript = nScript; 1037 if ( !pEditView->GetSelection().HasRange() ) 1038 { 1039 LanguageType nInputLang = pViewData->GetActiveWin()->GetInputLanguage(); 1040 if (nInputLang != LANGUAGE_DONTKNOW && nInputLang != LANGUAGE_SYSTEM) 1041 nInputScript = SvtLanguageOptions::GetScriptTypeOfLanguage( nInputLang ); 1042 } 1043 1044 // #i55929# according to spec, nInputScript is used for font and font height only 1045 if ( rSet.GetItemState( EE_CHAR_FONTINFO ) != SFX_ITEM_UNKNOWN ) 1046 ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_FONTINFO, nInputScript ); 1047 if ( rSet.GetItemState( EE_CHAR_FONTHEIGHT ) != SFX_ITEM_UNKNOWN ) 1048 ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_FONTHEIGHT, nInputScript ); 1049 if ( rSet.GetItemState( EE_CHAR_WEIGHT ) != SFX_ITEM_UNKNOWN ) 1050 ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_WEIGHT, nScript ); 1051 if ( rSet.GetItemState( EE_CHAR_ITALIC ) != SFX_ITEM_UNKNOWN ) 1052 ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_ITALIC, nScript ); 1053 1054 // Unterstreichung 1055 1056 SfxItemState eState = aAttribs.GetItemState( EE_CHAR_UNDERLINE, sal_True ); 1057 if ( eState == SFX_ITEM_DONTCARE ) 1058 { 1059 rSet.InvalidateItem( SID_ULINE_VAL_NONE ); 1060 rSet.InvalidateItem( SID_ULINE_VAL_SINGLE ); 1061 rSet.InvalidateItem( SID_ULINE_VAL_DOUBLE ); 1062 rSet.InvalidateItem( SID_ULINE_VAL_DOTTED ); 1063 } 1064 else 1065 { 1066 FontUnderline eUnderline = ((const SvxUnderlineItem&) 1067 aAttribs.Get(EE_CHAR_UNDERLINE)).GetLineStyle(); 1068 sal_uInt16 nId = SID_ULINE_VAL_NONE; 1069 switch (eUnderline) 1070 { 1071 case UNDERLINE_SINGLE: nId = SID_ULINE_VAL_SINGLE; break; 1072 case UNDERLINE_DOUBLE: nId = SID_ULINE_VAL_DOUBLE; break; 1073 case UNDERLINE_DOTTED: nId = SID_ULINE_VAL_DOTTED; break; 1074 default: 1075 break; 1076 } 1077 rSet.Put( SfxBoolItem( nId, sal_True ) ); 1078 } 1079 1080 //! Testen, ob Klammer-Hervorhebung aktiv ist !!!! 1081 ScInputHandler* pHdl = GetMyInputHdl(); 1082 if ( pHdl && pHdl->IsFormulaMode() ) 1083 rSet.ClearItem( EE_CHAR_WEIGHT ); // hervorgehobene Klammern hier nicht 1084 } 1085 1086 String ScEditShell::GetSelectionText( sal_Bool bWholeWord ) 1087 { 1088 String aStrSelection; 1089 1090 if ( pViewData->HasEditView( pViewData->GetActivePart() ) ) // #125326# 1091 { 1092 if ( bWholeWord ) 1093 { 1094 EditEngine* pEngine = pEditView->GetEditEngine(); 1095 ESelection aSel = pEditView->GetSelection(); 1096 String aStrCurrentDelimiters = pEngine->GetWordDelimiters(); 1097 1098 pEngine->SetWordDelimiters( String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(" .,;\"'")) ); 1099 aStrSelection = pEngine->GetWord( aSel.nEndPara, aSel.nEndPos ); 1100 pEngine->SetWordDelimiters( aStrCurrentDelimiters ); 1101 } 1102 else 1103 { 1104 aStrSelection = pEditView->GetSelected(); 1105 } 1106 } 1107 1108 return aStrSelection; 1109 } 1110 1111 void ScEditShell::ExecuteUndo(SfxRequest& rReq) 1112 { 1113 // #81733# Undo must be handled here because it's called for both EditViews 1114 1115 ScInputHandler* pHdl = GetMyInputHdl(); 1116 DBG_ASSERT(pHdl,"no ScInputHandler"); 1117 EditView* pTopView = pHdl->GetTopView(); 1118 EditView* pTableView = pHdl->GetTableView(); 1119 DBG_ASSERT(pTableView,"no EditView"); 1120 1121 pHdl->DataChanging(); 1122 1123 const SfxItemSet* pReqArgs = rReq.GetArgs(); 1124 sal_uInt16 nSlot = rReq.GetSlot(); 1125 switch ( nSlot ) 1126 { 1127 case SID_UNDO: 1128 case SID_REDO: 1129 { 1130 sal_Bool bIsUndo = ( nSlot == SID_UNDO ); 1131 1132 sal_uInt16 nCount = 1; 1133 const SfxPoolItem* pItem; 1134 if ( pReqArgs && pReqArgs->GetItemState( nSlot, sal_True, &pItem ) == SFX_ITEM_SET ) 1135 nCount = ((const SfxUInt16Item*)pItem)->GetValue(); 1136 1137 for (sal_uInt16 i=0; i<nCount; i++) 1138 { 1139 if ( bIsUndo ) 1140 { 1141 pTableView->Undo(); 1142 if (pTopView) 1143 pTopView->Undo(); 1144 } 1145 else 1146 { 1147 pTableView->Redo(); 1148 if (pTopView) 1149 pTopView->Redo(); 1150 } 1151 } 1152 } 1153 break; 1154 } 1155 pViewData->GetBindings().InvalidateAll(sal_False); 1156 1157 pHdl->DataChanged(); 1158 } 1159 1160 void ScEditShell::GetUndoState(SfxItemSet &rSet) 1161 { 1162 // Undo state is taken from normal ViewFrame state function 1163 1164 SfxViewFrame* pViewFrm = pViewData->GetViewShell()->GetViewFrame(); 1165 if ( pViewFrm && GetUndoManager() ) 1166 { 1167 SfxWhichIter aIter(rSet); 1168 sal_uInt16 nWhich = aIter.FirstWhich(); 1169 while( nWhich ) 1170 { 1171 pViewFrm->GetSlotState( nWhich, NULL, &rSet ); 1172 nWhich = aIter.NextWhich(); 1173 } 1174 } 1175 1176 // disable if no action in input line EditView 1177 1178 ScInputHandler* pHdl = GetMyInputHdl(); 1179 DBG_ASSERT(pHdl,"no ScInputHandler"); 1180 EditView* pTopView = pHdl->GetTopView(); 1181 if (pTopView) 1182 { 1183 ::svl::IUndoManager& rTopMgr = pTopView->GetEditEngine()->GetUndoManager(); 1184 if ( rTopMgr.GetUndoActionCount() == 0 ) 1185 rSet.DisableItem( SID_UNDO ); 1186 if ( rTopMgr.GetRedoActionCount() == 0 ) 1187 rSet.DisableItem( SID_REDO ); 1188 } 1189 } 1190 1191 void ScEditShell::ExecuteTrans( SfxRequest& rReq ) 1192 { 1193 sal_Int32 nType = ScViewUtil::GetTransliterationType( rReq.GetSlot() ); 1194 if ( nType ) 1195 { 1196 ScInputHandler* pHdl = GetMyInputHdl(); 1197 DBG_ASSERT( pHdl, "no ScInputHandler" ); 1198 1199 EditView* pTopView = pHdl->GetTopView(); 1200 EditView* pTableView = pHdl->GetTableView(); 1201 DBG_ASSERT( pTableView, "no EditView" ); 1202 1203 pHdl->DataChanging(); 1204 1205 pTableView->TransliterateText( nType ); 1206 if (pTopView) 1207 pTopView->TransliterateText( nType ); 1208 1209 pHdl->DataChanged(); 1210 } 1211 } 1212