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

Generated by: LCOV version 1.10