LCOV - code coverage report
Current view: top level - sc/source/ui/view - editsh.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 5 638 0.8 %
Date: 2015-06-13 12:38:46 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         156 : SFX_IMPL_INTERFACE(ScEditShell, SfxShell)
      86             : 
      87          52 : void ScEditShell::InitInterface_Impl()
      88             : {
      89          52 :     GetStaticInterface()->RegisterPopupMenu(ScResId(RID_POPUP_EDIT));
      90          52 : }
      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 :                 SotClipboardFormatId nFormat = SotClipboardFormatId::NONE;
     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<SotClipboardFormatId>(static_cast<const SfxUInt32Item*>(pItem)->GetValue());
     257             :                 }
     258             : 
     259           0 :                 if ( nFormat != SotClipboardFormatId::NONE )
     260             :                 {
     261           0 :                     if (SotClipboardFormatId::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 :                 SotClipboardFormatId nFormat = SotClipboardFormatId::NONE;
     277           0 :                 if ( pDlg )
     278             :                 {
     279           0 :                     pDlg->Insert( SotClipboardFormatId::STRING, EMPTY_OUSTRING );
     280           0 :                     pDlg->Insert( SotClipboardFormatId::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 != SotClipboardFormatId::NONE)
     294             :                 {
     295           0 :                     if (SotClipboardFormatId::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 :                 SvtScriptType nScript = pTableView->GetSelectedScriptType();
     337             :                 sal_uInt16 nFontWhich = ( nScript == SvtScriptType::ASIAN ) ? EE_CHAR_FONTINFO_CJK :
     338             :                                 ( ( nScript == SvtScriptType::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             :                     SvtScriptType nSetScript;
     381           0 :                     ScDocument* pDoc = pViewData->GetDocument();
     382           0 :                     if ( pDoc->HasStringWeakCharacters( aString ) )
     383           0 :                         nSetScript = SvtScriptType::LATIN | SvtScriptType::ASIAN | SvtScriptType::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             : 
     581             :         case FN_INSERT_SOFT_HYPHEN:
     582           0 :             lclInsertCharacter( pTableView, pTopView, CHAR_SHY );
     583           0 :         break;
     584             :         case FN_INSERT_HARDHYPHEN:
     585           0 :             lclInsertCharacter( pTableView, pTopView, CHAR_NBHY );
     586           0 :         break;
     587             :         case FN_INSERT_HARD_SPACE:
     588           0 :             lclInsertCharacter( pTableView, pTopView, CHAR_NBSP );
     589           0 :         break;
     590             :         case SID_INSERT_RLM:
     591           0 :             lclInsertCharacter( pTableView, pTopView, CHAR_RLM );
     592           0 :         break;
     593             :         case SID_INSERT_LRM:
     594           0 :             lclInsertCharacter( pTableView, pTopView, CHAR_LRM );
     595           0 :         break;
     596             :         case SID_INSERT_ZWSP:
     597           0 :             lclInsertCharacter( pTableView, pTopView, CHAR_ZWSP );
     598           0 :         break;
     599             :         case SID_INSERT_ZWNBSP:
     600           0 :             lclInsertCharacter( pTableView, pTopView, CHAR_ZWNBSP );
     601           0 :         break;
     602             :         case SID_INSERT_FIELD_SHEET:
     603             :         {
     604           0 :             SvxTableField aField(pViewData->GetTabNo());
     605           0 :             SvxFieldItem aItem(aField, EE_FEATURE_FIELD);
     606           0 :             pTableView->InsertField(aItem);
     607             :         }
     608           0 :         break;
     609             :         case SID_INSERT_FIELD_TITLE:
     610             :         {
     611           0 :             SvxFileField aField;
     612           0 :             SvxFieldItem aItem(aField, EE_FEATURE_FIELD);
     613           0 :             pTableView->InsertField(aItem);
     614             :         }
     615           0 :         break;
     616             :         case SID_INSERT_FIELD_DATE_VAR:
     617             :         {
     618           0 :             SvxDateField aField;
     619           0 :             SvxFieldItem aItem(aField, EE_FEATURE_FIELD);
     620           0 :             pTableView->InsertField(aItem);
     621             :         }
     622           0 :         break;
     623             :     }
     624             : 
     625           0 :     pHdl->DataChanged(false, bSetModified);
     626           0 :     if (bSetSelIsRef)
     627           0 :         pHdl->SetSelIsRef(true);
     628             : }
     629             : 
     630           0 : static void lcl_DisableAll( SfxItemSet& rSet )    // disable all slots
     631             : {
     632           0 :     SfxWhichIter aIter( rSet );
     633           0 :     sal_uInt16 nWhich = aIter.FirstWhich();
     634           0 :     while (nWhich)
     635             :     {
     636           0 :         rSet.DisableItem( nWhich );
     637           0 :         nWhich = aIter.NextWhich();
     638           0 :     }
     639           0 : }
     640             : 
     641           0 : void ScEditShell::GetState( SfxItemSet& rSet )
     642             : {
     643             :     // When deactivating the view, edit mode is stopped, but the EditShell is left active
     644             :     // (a shell can't be removed from within Deactivate). In that state, the EditView isn't inserted
     645             :     // into the EditEngine, so it can have an invalid selection and must not be used.
     646           0 :     if ( !pViewData->HasEditView( pViewData->GetActivePart() ) )
     647             :     {
     648           0 :         lcl_DisableAll( rSet );
     649           0 :         return;
     650             :     }
     651             : 
     652           0 :     ScInputHandler* pHdl = GetMyInputHdl();
     653           0 :     EditView* pActiveView = pHdl ? pHdl->GetActiveView() : pEditView;
     654             : 
     655           0 :     SfxWhichIter aIter( rSet );
     656           0 :     sal_uInt16 nWhich = aIter.FirstWhich();
     657           0 :     while (nWhich)
     658             :     {
     659           0 :         switch (nWhich)
     660             :         {
     661             :             case SID_ATTR_INSERT:   // Statuszeile
     662             :                 {
     663           0 :                     if ( pActiveView )
     664           0 :                         rSet.Put( SfxBoolItem( nWhich, pActiveView->IsInsertMode() ) );
     665             :                     else
     666             :                     {
     667             :                         // Here the code used to pass the value 42 and it used
     668             :                         // to "work" without warnings because the SfxBoolItem
     669             :                         // was based on 'sal_Bool', which is actually 'unsigned
     670             :                         // char'. But now it uses actual 'bool', and passing 42
     671             :                         // for a 'bool' parameter causes a warning at least with
     672             :                         // MSVC.  So use 'true'. I really really hope there is
     673             :                         // not code somewhere that retrieves this "boolean" item
     674             :                         // and checks it value for the magic value 42...
     675           0 :                         rSet.Put( SfxBoolItem( nWhich,  true) );
     676             :                     }
     677             :                 }
     678           0 :                 break;
     679             : 
     680             :             case SID_HYPERLINK_GETLINK:
     681             :                 {
     682           0 :                     SvxHyperlinkItem aHLinkItem;
     683           0 :                     const SvxURLField* pURLField = GetURLField();
     684           0 :                     if ( pURLField )
     685             :                     {
     686           0 :                         aHLinkItem.SetName( pURLField->GetRepresentation() );
     687           0 :                         aHLinkItem.SetURL( pURLField->GetURL() );
     688           0 :                         aHLinkItem.SetTargetFrame( pURLField->GetTargetFrame() );
     689             :                     }
     690           0 :                     else if ( pActiveView )
     691             :                     {
     692             :                         // use selected text as name for urls
     693           0 :                         OUString sReturn = pActiveView->GetSelected();
     694           0 :                         sReturn = sReturn.copy(0, std::min(sReturn.getLength(), static_cast<sal_Int32>(255)));
     695           0 :                         aHLinkItem.SetName(comphelper::string::stripEnd(sReturn, ' '));
     696             :                     }
     697           0 :                     rSet.Put(aHLinkItem);
     698             :                 }
     699           0 :                 break;
     700             : 
     701             :             case SID_OPEN_HYPERLINK:
     702             :                 {
     703           0 :                     if ( !GetURLField() )
     704           0 :                         rSet.DisableItem( nWhich );
     705             :                 }
     706           0 :                 break;
     707             : 
     708             :             case SID_TRANSLITERATE_HALFWIDTH:
     709             :             case SID_TRANSLITERATE_FULLWIDTH:
     710             :             case SID_TRANSLITERATE_HIRAGANA:
     711             :             case SID_TRANSLITERATE_KATAGANA:
     712             :             case SID_INSERT_RLM:
     713             :             case SID_INSERT_LRM:
     714             :             case SID_INSERT_ZWNBSP:
     715             :             case SID_INSERT_ZWSP:
     716           0 :                 ScViewUtil::HideDisabledSlot( rSet, pViewData->GetBindings(), nWhich );
     717           0 :             break;
     718             : 
     719             :             case SID_THES:
     720             :                 {
     721           0 :                     OUString        aStatusVal;
     722           0 :                     LanguageType    nLang = LANGUAGE_NONE;
     723           0 :                     bool bIsLookUpWord = pActiveView &&
     724           0 :                         GetStatusValueForThesaurusFromContext(aStatusVal, nLang, *pActiveView);
     725           0 :                     rSet.Put( SfxStringItem( SID_THES, aStatusVal ) );
     726             : 
     727             :                     // disable thesaurus context menu entry if there is nothing to look up
     728           0 :                     bool bCanDoThesaurus = ScModule::HasThesaurusLanguage( nLang );
     729           0 :                     if (!bIsLookUpWord || !bCanDoThesaurus)
     730           0 :                         rSet.DisableItem( SID_THES );
     731             :                 }
     732           0 :                 break;
     733             :             case SID_INSERT_FIELD_SHEET:
     734             :             case SID_INSERT_FIELD_TITLE:
     735             :             case SID_INSERT_FIELD_DATE_VAR:
     736           0 :             break;
     737             : 
     738             :         }
     739           0 :         nWhich = aIter.NextWhich();
     740           0 :     }
     741             : }
     742             : 
     743           0 : const SvxURLField* ScEditShell::GetURLField()
     744             : {
     745           0 :     ScInputHandler* pHdl = GetMyInputHdl();
     746           0 :     EditView* pActiveView = pHdl ? pHdl->GetActiveView() : pEditView;
     747           0 :     if ( pActiveView )
     748             :     {
     749           0 :         const SvxFieldItem* pFieldItem = pActiveView->GetFieldAtSelection();
     750           0 :         if (pFieldItem)
     751             :         {
     752           0 :             const SvxFieldData* pField = pFieldItem->GetField();
     753           0 :             if ( pField && pField->ISA(SvxURLField) )
     754           0 :                 return static_cast<const SvxURLField*>(pField);
     755             :         }
     756             :     }
     757             : 
     758           0 :     return NULL;
     759             : }
     760             : 
     761           0 : IMPL_LINK( ScEditShell, ClipboardChanged, TransferableDataHelper*, pDataHelper )
     762             : {
     763           0 :     if ( pDataHelper )
     764             :     {
     765           0 :         bPastePossible = ( pDataHelper->HasFormat( SotClipboardFormatId::STRING ) || pDataHelper->HasFormat( SotClipboardFormatId::RTF ) );
     766             : 
     767           0 :         SfxBindings& rBindings = pViewData->GetBindings();
     768           0 :         rBindings.Invalidate( SID_PASTE );
     769           0 :         rBindings.Invalidate( SID_PASTE_SPECIAL );
     770           0 :         rBindings.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS );
     771             :     }
     772           0 :     return 0;
     773             : }
     774             : 
     775           0 : void ScEditShell::GetClipState( SfxItemSet& rSet )
     776             : {
     777           0 :     if ( !pClipEvtLstnr )
     778             :     {
     779             :         // create listener
     780           0 :         pClipEvtLstnr = new TransferableClipboardListener( LINK( this, ScEditShell, ClipboardChanged ) );
     781           0 :         pClipEvtLstnr->acquire();
     782           0 :         vcl::Window* pWin = pViewData->GetActiveWin();
     783           0 :         pClipEvtLstnr->AddRemoveListener( pWin, true );
     784             : 
     785             :         // get initial state
     786           0 :         TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( pViewData->GetActiveWin() ) );
     787           0 :         bPastePossible = ( aDataHelper.HasFormat( SotClipboardFormatId::STRING ) || aDataHelper.HasFormat( SotClipboardFormatId::RTF ) );
     788             :     }
     789             : 
     790           0 :     SfxWhichIter aIter( rSet );
     791           0 :     sal_uInt16 nWhich = aIter.FirstWhich();
     792           0 :     while (nWhich)
     793             :     {
     794           0 :         switch (nWhich)
     795             :         {
     796             :             case SID_PASTE:
     797             :             case SID_PASTE_SPECIAL:
     798           0 :                 if( !bPastePossible )
     799           0 :                     rSet.DisableItem( nWhich );
     800           0 :                 break;
     801             :             case SID_CLIPBOARD_FORMAT_ITEMS:
     802           0 :                 if( bPastePossible )
     803             :                 {
     804           0 :                     SvxClipboardFormatItem aFormats( SID_CLIPBOARD_FORMAT_ITEMS );
     805             :                     TransferableDataHelper aDataHelper(
     806           0 :                             TransferableDataHelper::CreateFromSystemClipboard( pViewData->GetActiveWin() ) );
     807             : 
     808           0 :                     if ( aDataHelper.HasFormat( SotClipboardFormatId::STRING ) )
     809           0 :                         aFormats.AddClipbrdFormat( SotClipboardFormatId::STRING );
     810           0 :                     if ( aDataHelper.HasFormat( SotClipboardFormatId::RTF ) )
     811           0 :                         aFormats.AddClipbrdFormat( SotClipboardFormatId::RTF );
     812             : 
     813           0 :                     rSet.Put( aFormats );
     814             :                 }
     815             :                 else
     816           0 :                     rSet.DisableItem( nWhich );
     817           0 :                 break;
     818             :         }
     819           0 :         nWhich = aIter.NextWhich();
     820           0 :     }
     821           0 : }
     822             : 
     823           0 : static void lcl_InvalidateUnder( SfxBindings& rBindings )
     824             : {
     825           0 :     rBindings.Invalidate( SID_ATTR_CHAR_UNDERLINE );
     826           0 :     rBindings.Invalidate( SID_ULINE_VAL_NONE );
     827           0 :     rBindings.Invalidate( SID_ULINE_VAL_SINGLE );
     828           0 :     rBindings.Invalidate( SID_ULINE_VAL_DOUBLE );
     829           0 :     rBindings.Invalidate( SID_ULINE_VAL_DOTTED );
     830           0 : }
     831             : 
     832           0 : void ScEditShell::ExecuteAttr(SfxRequest& rReq)
     833             : {
     834           0 :     SfxItemSet          aSet( pEditView->GetEmptyItemSet() );
     835           0 :     SfxBindings&        rBindings   = pViewData->GetBindings();
     836           0 :     const SfxItemSet*   pArgs       = rReq.GetArgs();
     837           0 :     sal_uInt16              nSlot       = rReq.GetSlot();
     838             : 
     839           0 :     switch ( nSlot )
     840             :     {
     841             :         case SID_ATTR_CHAR_FONTHEIGHT:
     842             :         case SID_ATTR_CHAR_FONT:
     843             :             {
     844           0 :                 if (pArgs)
     845             :                 {
     846             :                     // #i78017 establish the same behaviour as in Writer
     847           0 :                     SvtScriptType nScript = SvtScriptType::LATIN | SvtScriptType::ASIAN | SvtScriptType::COMPLEX;
     848           0 :                     if (nSlot == SID_ATTR_CHAR_FONT)
     849             :                     {
     850           0 :                         nScript = pEditView->GetSelectedScriptType();
     851           0 :                         if (nScript == SvtScriptType::NONE) nScript = ScGlobal::GetDefaultScriptType();
     852             :                     }
     853             : 
     854           0 :                     SfxItemPool& rPool = GetPool();
     855           0 :                     SvxScriptSetItem aSetItem( nSlot, rPool );
     856           0 :                     sal_uInt16 nWhich = rPool.GetWhich( nSlot );
     857           0 :                     aSetItem.PutItemForScriptType( nScript, pArgs->Get( nWhich ) );
     858             : 
     859           0 :                     aSet.Put( aSetItem.GetItemSet(), false );
     860             :                 }
     861             :             }
     862           0 :             break;
     863             : 
     864             :         case SID_ATTR_CHAR_COLOR:
     865             :             {
     866           0 :                 if (pArgs)
     867             :                 {
     868           0 :                     aSet.Put( pArgs->Get( pArgs->GetPool()->GetWhich( nSlot ) ) );
     869           0 :                     rBindings.Invalidate( nSlot );
     870             :                 }
     871             :             }
     872           0 :             break;
     873             : 
     874             :         //  Toggles
     875             : 
     876             :         case SID_ATTR_CHAR_WEIGHT:
     877             :             {
     878             :                 // #i78017 establish the same behaviour as in Writer
     879           0 :                 SvtScriptType nScript = SvtScriptType::LATIN | SvtScriptType::ASIAN | SvtScriptType::COMPLEX;
     880             : 
     881           0 :                 SfxItemPool& rPool = GetPool();
     882             : 
     883           0 :                 bool bOld = false;
     884           0 :                 SvxScriptSetItem aOldSetItem( nSlot, rPool );
     885           0 :                 aOldSetItem.GetItemSet().Put( pEditView->GetAttribs(), false );
     886           0 :                 const SfxPoolItem* pCore = aOldSetItem.GetItemOfScript( nScript );
     887           0 :                 if ( pCore && static_cast<const SvxWeightItem*>(pCore)->GetWeight() > WEIGHT_NORMAL )
     888           0 :                     bOld = true;
     889             : 
     890           0 :                 SvxScriptSetItem aSetItem( nSlot, rPool );
     891             :                 aSetItem.PutItemForScriptType( nScript,
     892           0 :                             SvxWeightItem( bOld ? WEIGHT_NORMAL : WEIGHT_BOLD, EE_CHAR_WEIGHT ) );
     893           0 :                 aSet.Put( aSetItem.GetItemSet(), false );
     894             : 
     895           0 :                 rBindings.Invalidate( nSlot );
     896             :             }
     897           0 :             break;
     898             : 
     899             :         case SID_ATTR_CHAR_POSTURE:
     900             :             {
     901             :                 // #i78017 establish the same behaviour as in Writer
     902           0 :                 SvtScriptType nScript = SvtScriptType::LATIN | SvtScriptType::ASIAN | SvtScriptType::COMPLEX;
     903             : 
     904           0 :                 SfxItemPool& rPool = GetPool();
     905             : 
     906           0 :                 bool bOld = false;
     907           0 :                 SvxScriptSetItem aOldSetItem( nSlot, rPool );
     908           0 :                 aOldSetItem.GetItemSet().Put( pEditView->GetAttribs(), false );
     909           0 :                 const SfxPoolItem* pCore = aOldSetItem.GetItemOfScript( nScript );
     910           0 :                 if ( pCore && static_cast<const SvxPostureItem*>(pCore)->GetValue() != ITALIC_NONE )
     911           0 :                     bOld = true;
     912             : 
     913           0 :                 SvxScriptSetItem aSetItem( nSlot, rPool );
     914             :                 aSetItem.PutItemForScriptType( nScript,
     915           0 :                             SvxPostureItem( bOld ? ITALIC_NONE : ITALIC_NORMAL, EE_CHAR_ITALIC ) );
     916           0 :                 aSet.Put( aSetItem.GetItemSet(), false );
     917             : 
     918           0 :                 rBindings.Invalidate( nSlot );
     919             :             }
     920           0 :             break;
     921             : 
     922             :         case SID_ULINE_VAL_NONE:
     923           0 :             aSet.Put( SvxUnderlineItem( UNDERLINE_NONE, EE_CHAR_UNDERLINE ) );
     924           0 :             lcl_InvalidateUnder( rBindings );
     925           0 :             break;
     926             : 
     927             :         case SID_ATTR_CHAR_UNDERLINE:
     928             :         case SID_ULINE_VAL_SINGLE:
     929             :         case SID_ULINE_VAL_DOUBLE:
     930             :         case SID_ULINE_VAL_DOTTED:
     931             :             {
     932             :                 FontUnderline eOld = static_cast<const SvxUnderlineItem&>( pEditView->
     933           0 :                                     GetAttribs().Get(EE_CHAR_UNDERLINE)).GetLineStyle();
     934           0 :                 FontUnderline eNew = eOld;
     935           0 :                 switch (nSlot)
     936             :                 {
     937             :                     case SID_ATTR_CHAR_UNDERLINE:
     938           0 :                         if ( pArgs )
     939             :                         {
     940           0 :                             const SvxTextLineItem& rTextLineItem = static_cast< const SvxTextLineItem& >( pArgs->Get( pArgs->GetPool()->GetWhich(nSlot) ) );
     941           0 :                             eNew = rTextLineItem.GetLineStyle();
     942             :                         }
     943             :                         else
     944             :                         {
     945           0 :                             eNew = ( eOld != UNDERLINE_NONE ) ? UNDERLINE_NONE : UNDERLINE_SINGLE;
     946             :                         }
     947           0 :                         break;
     948             :                     case SID_ULINE_VAL_SINGLE:
     949           0 :                         eNew = ( eOld == UNDERLINE_SINGLE ) ? UNDERLINE_NONE : UNDERLINE_SINGLE;
     950           0 :                         break;
     951             :                     case SID_ULINE_VAL_DOUBLE:
     952           0 :                         eNew = ( eOld == UNDERLINE_DOUBLE ) ? UNDERLINE_NONE : UNDERLINE_DOUBLE;
     953           0 :                         break;
     954             :                     case SID_ULINE_VAL_DOTTED:
     955           0 :                         eNew = ( eOld == UNDERLINE_DOTTED ) ? UNDERLINE_NONE : UNDERLINE_DOTTED;
     956           0 :                         break;
     957             :                 }
     958           0 :                 aSet.Put( SvxUnderlineItem( eNew, EE_CHAR_UNDERLINE ) );
     959           0 :                 lcl_InvalidateUnder( rBindings );
     960             :             }
     961           0 :             break;
     962             : 
     963             :         case SID_ATTR_CHAR_OVERLINE:
     964             :             {
     965             :                 FontUnderline eOld = static_cast<const SvxOverlineItem&>( pEditView->
     966           0 :                                     GetAttribs().Get(EE_CHAR_OVERLINE)).GetLineStyle();
     967           0 :                 FontUnderline eNew = ( eOld != UNDERLINE_NONE ) ? UNDERLINE_NONE : UNDERLINE_SINGLE;
     968           0 :                 aSet.Put( SvxOverlineItem( eNew, EE_CHAR_OVERLINE ) );
     969           0 :                 rBindings.Invalidate( nSlot );
     970             :             }
     971           0 :             break;
     972             : 
     973             :         case SID_ATTR_CHAR_STRIKEOUT:
     974             :             {
     975             :                 bool bOld = static_cast<const SvxCrossedOutItem&>( pEditView->GetAttribs().
     976           0 :                                 Get(EE_CHAR_STRIKEOUT)).GetValue() != STRIKEOUT_NONE;
     977           0 :                 aSet.Put( SvxCrossedOutItem( bOld ? STRIKEOUT_NONE : STRIKEOUT_SINGLE, EE_CHAR_STRIKEOUT ) );
     978           0 :                 rBindings.Invalidate( nSlot );
     979             :             }
     980           0 :             break;
     981             : 
     982             :         case SID_ATTR_CHAR_SHADOWED:
     983             :             {
     984             :                 bool bOld = static_cast<const SvxShadowedItem&>(pEditView->GetAttribs().
     985           0 :                                 Get(EE_CHAR_SHADOW)).GetValue();
     986           0 :                 aSet.Put( SvxShadowedItem( !bOld, EE_CHAR_SHADOW ) );
     987           0 :                 rBindings.Invalidate( nSlot );
     988             :             }
     989           0 :             break;
     990             : 
     991             :         case SID_ATTR_CHAR_CONTOUR:
     992             :             {
     993             :                 bool bOld = static_cast<const SvxContourItem&>(pEditView->GetAttribs().
     994           0 :                                 Get(EE_CHAR_OUTLINE)).GetValue();
     995           0 :                 aSet.Put( SvxContourItem( !bOld, EE_CHAR_OUTLINE ) );
     996           0 :                 rBindings.Invalidate( nSlot );
     997             :             }
     998           0 :             break;
     999             : 
    1000             :         case SID_SET_SUPER_SCRIPT:
    1001             :             {
    1002             :                 SvxEscapement eOld = (SvxEscapement) static_cast<const SvxEscapementItem&>(
    1003           0 :                         pEditView->GetAttribs().Get(EE_CHAR_ESCAPEMENT)).GetEnumValue();
    1004             :                 SvxEscapement eNew = (eOld == SVX_ESCAPEMENT_SUPERSCRIPT) ?
    1005           0 :                                         SVX_ESCAPEMENT_OFF : SVX_ESCAPEMENT_SUPERSCRIPT;
    1006           0 :                 aSet.Put( SvxEscapementItem( eNew, EE_CHAR_ESCAPEMENT ) );
    1007           0 :                 rBindings.Invalidate( nSlot );
    1008             :             }
    1009           0 :             break;
    1010             :         case SID_SET_SUB_SCRIPT:
    1011             :             {
    1012             :                 SvxEscapement eOld = (SvxEscapement) static_cast<const SvxEscapementItem&>(
    1013           0 :                         pEditView->GetAttribs().Get(EE_CHAR_ESCAPEMENT)).GetEnumValue();
    1014             :                 SvxEscapement eNew = (eOld == SVX_ESCAPEMENT_SUBSCRIPT) ?
    1015           0 :                                         SVX_ESCAPEMENT_OFF : SVX_ESCAPEMENT_SUBSCRIPT;
    1016           0 :                 aSet.Put( SvxEscapementItem( eNew, EE_CHAR_ESCAPEMENT ) );
    1017           0 :                 rBindings.Invalidate( nSlot );
    1018             :             }
    1019           0 :             break;
    1020             :         case SID_ATTR_CHAR_KERNING:
    1021             :             {
    1022           0 :                 if(pArgs)
    1023             :                 {
    1024           0 :                     aSet.Put ( pArgs->Get(pArgs->GetPool()->GetWhich(nSlot)));
    1025           0 :                     rBindings.Invalidate( nSlot );
    1026             :                 }
    1027             :             }
    1028           0 :             break;
    1029             :     }
    1030             : 
    1031             :     //  anwenden
    1032             : 
    1033           0 :     EditEngine* pEngine = pEditView->GetEditEngine();
    1034           0 :     bool bOld = pEngine->GetUpdateMode();
    1035           0 :     pEngine->SetUpdateMode(false);
    1036             : 
    1037           0 :     pEditView->SetAttribs( aSet );
    1038             : 
    1039           0 :     pEngine->SetUpdateMode(bOld);
    1040           0 :     pEditView->Invalidate();
    1041             : 
    1042           0 :     ScInputHandler* pHdl = GetMyInputHdl();
    1043           0 :     pHdl->SetModified();
    1044             : 
    1045           0 :     rReq.Done();
    1046           0 : }
    1047             : 
    1048           0 : void ScEditShell::GetAttrState(SfxItemSet &rSet)
    1049             : {
    1050           0 :     if ( !pViewData->HasEditView( pViewData->GetActivePart() ) )    // #125326#
    1051             :     {
    1052           0 :         lcl_DisableAll( rSet );
    1053           0 :         return;
    1054             :     }
    1055             : 
    1056           0 :     SfxItemSet aAttribs = pEditView->GetAttribs();
    1057           0 :     rSet.Put( aAttribs );
    1058             : 
    1059             :     //  choose font info according to selection script type
    1060             : 
    1061           0 :     SvtScriptType nScript = pEditView->GetSelectedScriptType();
    1062           0 :     if (nScript == SvtScriptType::NONE) nScript = ScGlobal::GetDefaultScriptType();
    1063             : 
    1064             :     // #i55929# input-language-dependent script type (depends on input language if nothing selected)
    1065           0 :     SvtScriptType nInputScript = nScript;
    1066           0 :     if ( !pEditView->GetSelection().HasRange() )
    1067             :     {
    1068           0 :         LanguageType nInputLang = pViewData->GetActiveWin()->GetInputLanguage();
    1069           0 :         if (nInputLang != LANGUAGE_DONTKNOW && nInputLang != LANGUAGE_SYSTEM)
    1070           0 :             nInputScript = SvtLanguageOptions::GetScriptTypeOfLanguage( nInputLang );
    1071             :     }
    1072             : 
    1073             :     // #i55929# according to spec, nInputScript is used for font and font height only
    1074           0 :     if ( rSet.GetItemState( EE_CHAR_FONTINFO ) != SfxItemState::UNKNOWN )
    1075           0 :         ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_FONTINFO, nInputScript );
    1076           0 :     if ( rSet.GetItemState( EE_CHAR_FONTHEIGHT ) != SfxItemState::UNKNOWN )
    1077           0 :         ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_FONTHEIGHT, nInputScript );
    1078           0 :     if ( rSet.GetItemState( EE_CHAR_WEIGHT ) != SfxItemState::UNKNOWN )
    1079           0 :         ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_WEIGHT, nScript );
    1080           0 :     if ( rSet.GetItemState( EE_CHAR_ITALIC ) != SfxItemState::UNKNOWN )
    1081           0 :         ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_ITALIC, nScript );
    1082             : 
    1083             :     //  Unterstreichung
    1084             : 
    1085           0 :     SfxItemState eState = aAttribs.GetItemState( EE_CHAR_UNDERLINE, true );
    1086           0 :     if ( eState == SfxItemState::DONTCARE )
    1087             :     {
    1088           0 :         rSet.InvalidateItem( SID_ULINE_VAL_NONE );
    1089           0 :         rSet.InvalidateItem( SID_ULINE_VAL_SINGLE );
    1090           0 :         rSet.InvalidateItem( SID_ULINE_VAL_DOUBLE );
    1091           0 :         rSet.InvalidateItem( SID_ULINE_VAL_DOTTED );
    1092             :     }
    1093             :     else
    1094             :     {
    1095             :         FontUnderline eUnderline = static_cast<const SvxUnderlineItem&>(
    1096           0 :                     aAttribs.Get(EE_CHAR_UNDERLINE)).GetLineStyle();
    1097           0 :         sal_uInt16 nId = SID_ULINE_VAL_NONE;
    1098           0 :         switch (eUnderline)
    1099             :         {
    1100           0 :             case UNDERLINE_SINGLE:  nId = SID_ULINE_VAL_SINGLE; break;
    1101           0 :             case UNDERLINE_DOUBLE:  nId = SID_ULINE_VAL_DOUBLE; break;
    1102           0 :             case UNDERLINE_DOTTED:  nId = SID_ULINE_VAL_DOTTED; break;
    1103             :             default:
    1104           0 :                 break;
    1105             :         }
    1106           0 :         rSet.Put( SfxBoolItem( nId, true ) );
    1107             :     }
    1108             : 
    1109             :     //! Testen, ob Klammer-Hervorhebung aktiv ist !!!!
    1110           0 :     ScInputHandler* pHdl = GetMyInputHdl();
    1111           0 :     if ( pHdl && pHdl->IsFormulaMode() )
    1112           0 :         rSet.ClearItem( EE_CHAR_WEIGHT );   // hervorgehobene Klammern hier nicht
    1113             : 
    1114             :     SvxEscapement eEsc = (SvxEscapement) static_cast<const SvxEscapementItem&>(
    1115           0 :                     aAttribs.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();
    1116           0 :     if( eEsc == SVX_ESCAPEMENT_SUPERSCRIPT )
    1117             :     {
    1118           0 :         rSet.Put( SfxBoolItem( SID_SET_SUPER_SCRIPT, true ) );
    1119             :     }
    1120           0 :     else if( eEsc == SVX_ESCAPEMENT_SUBSCRIPT )
    1121             :     {
    1122           0 :         rSet.Put( SfxBoolItem( SID_SET_SUB_SCRIPT, true ) );
    1123             :     }
    1124           0 :     pViewData->GetBindings().Invalidate( SID_SET_SUPER_SCRIPT );
    1125           0 :     pViewData->GetBindings().Invalidate( SID_SET_SUB_SCRIPT );
    1126             : 
    1127           0 :     eState = aAttribs.GetItemState( EE_CHAR_KERNING, true );
    1128           0 :     pViewData->GetBindings().Invalidate( SID_ATTR_CHAR_KERNING );
    1129           0 :     if ( eState == SfxItemState::DONTCARE )
    1130             :     {
    1131             :     //  rSet.InvalidateItem( SID_ATTR_CHAR_KERNING );
    1132           0 :         rSet.InvalidateItem(EE_CHAR_KERNING);
    1133           0 :     }
    1134             : }
    1135             : 
    1136           0 : OUString ScEditShell::GetSelectionText( bool bWholeWord )
    1137             : {
    1138           0 :     OUString aStrSelection;
    1139             : 
    1140           0 :     if ( pViewData->HasEditView( pViewData->GetActivePart() ) )    // #125326#
    1141             :     {
    1142           0 :         if ( bWholeWord )
    1143             :         {
    1144           0 :             EditEngine* pEngine = pEditView->GetEditEngine();
    1145           0 :             ESelection  aSel = pEditView->GetSelection();
    1146           0 :             OUString    aStrCurrentDelimiters = pEngine->GetWordDelimiters();
    1147             : 
    1148           0 :             pEngine->SetWordDelimiters(" .,;\"'");
    1149           0 :             aStrSelection = pEngine->GetWord( aSel.nEndPara, aSel.nEndPos );
    1150           0 :             pEngine->SetWordDelimiters( aStrCurrentDelimiters );
    1151             :         }
    1152             :         else
    1153             :         {
    1154           0 :             aStrSelection = pEditView->GetSelected();
    1155             :         }
    1156             :     }
    1157             : 
    1158           0 :     return aStrSelection;
    1159             : }
    1160             : 
    1161           0 : void ScEditShell::ExecuteUndo(SfxRequest& rReq)
    1162             : {
    1163             :     //  Undo must be handled here because it's called for both EditViews
    1164             : 
    1165           0 :     ScInputHandler* pHdl = GetMyInputHdl();
    1166             :     OSL_ENSURE(pHdl,"no ScInputHandler");
    1167           0 :     EditView* pTopView   = pHdl->GetTopView();
    1168           0 :     EditView* pTableView = pHdl->GetTableView();
    1169             :     OSL_ENSURE(pTableView,"no EditView");
    1170             : 
    1171           0 :     pHdl->DataChanging();
    1172             : 
    1173           0 :     const SfxItemSet* pReqArgs = rReq.GetArgs();
    1174           0 :     sal_uInt16 nSlot = rReq.GetSlot();
    1175           0 :     switch ( nSlot )
    1176             :     {
    1177             :         case SID_UNDO:
    1178             :         case SID_REDO:
    1179             :             {
    1180           0 :                 bool bIsUndo = ( nSlot == SID_UNDO );
    1181             : 
    1182           0 :                 sal_uInt16 nCount = 1;
    1183             :                 const SfxPoolItem* pItem;
    1184           0 :                 if ( pReqArgs && pReqArgs->GetItemState( nSlot, true, &pItem ) == SfxItemState::SET )
    1185           0 :                     nCount = static_cast<const SfxUInt16Item*>(pItem)->GetValue();
    1186             : 
    1187           0 :                 for (sal_uInt16 i=0; i<nCount; i++)
    1188             :                 {
    1189           0 :                     if ( bIsUndo )
    1190             :                     {
    1191           0 :                         pTableView->Undo();
    1192           0 :                         if (pTopView)
    1193           0 :                             pTopView->Undo();
    1194             :                     }
    1195             :                     else
    1196             :                     {
    1197           0 :                         pTableView->Redo();
    1198           0 :                         if (pTopView)
    1199           0 :                             pTopView->Redo();
    1200             :                     }
    1201             :                 }
    1202             :             }
    1203           0 :             break;
    1204             :     }
    1205           0 :     pViewData->GetBindings().InvalidateAll(false);
    1206             : 
    1207           0 :     pHdl->DataChanged();
    1208           0 : }
    1209             : 
    1210           0 : void ScEditShell::GetUndoState(SfxItemSet &rSet)
    1211             : {
    1212             :     //  Undo state is taken from normal ViewFrame state function
    1213             : 
    1214           0 :     SfxViewFrame* pViewFrm = pViewData->GetViewShell()->GetViewFrame();
    1215           0 :     if ( pViewFrm && GetUndoManager() )
    1216             :     {
    1217           0 :         SfxWhichIter aIter(rSet);
    1218           0 :         sal_uInt16 nWhich = aIter.FirstWhich();
    1219           0 :         while( nWhich )
    1220             :         {
    1221           0 :             pViewFrm->GetSlotState( nWhich, NULL, &rSet );
    1222           0 :             nWhich = aIter.NextWhich();
    1223           0 :         }
    1224             :     }
    1225             : 
    1226             :     //  disable if no action in input line EditView
    1227             : 
    1228           0 :     ScInputHandler* pHdl = GetMyInputHdl();
    1229             :     OSL_ENSURE(pHdl,"no ScInputHandler");
    1230           0 :     EditView* pTopView = pHdl->GetTopView();
    1231           0 :     if (pTopView)
    1232             :     {
    1233           0 :         ::svl::IUndoManager& rTopMgr = pTopView->GetEditEngine()->GetUndoManager();
    1234           0 :         if ( rTopMgr.GetUndoActionCount() == 0 )
    1235           0 :             rSet.DisableItem( SID_UNDO );
    1236           0 :         if ( rTopMgr.GetRedoActionCount() == 0 )
    1237           0 :             rSet.DisableItem( SID_REDO );
    1238             :     }
    1239           0 : }
    1240             : 
    1241           0 : void ScEditShell::ExecuteTrans( SfxRequest& rReq )
    1242             : {
    1243           0 :     sal_Int32 nType = ScViewUtil::GetTransliterationType( rReq.GetSlot() );
    1244           0 :     if ( nType )
    1245             :     {
    1246           0 :         ScInputHandler* pHdl = GetMyInputHdl();
    1247             :         assert(pHdl && "no ScInputHandler");
    1248             : 
    1249           0 :         EditView* pTopView   = pHdl->GetTopView();
    1250           0 :         EditView* pTableView = pHdl->GetTableView();
    1251             :         assert(pTableView && "no EditView");
    1252             : 
    1253           0 :         pHdl->DataChanging();
    1254             : 
    1255           0 :         pTableView->TransliterateText( nType );
    1256           0 :         if (pTopView)
    1257           0 :             pTopView->TransliterateText( nType );
    1258             : 
    1259           0 :         pHdl->DataChanged();
    1260             :     }
    1261         156 : }
    1262             : 
    1263             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11