LCOV - code coverage report
Current view: top level - libreoffice/sc/source/ui/view - editsh.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 4 602 0.7 %
Date: 2012-12-27 Functions: 5 32 15.6 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10