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