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

Generated by: LCOV version 1.10