LibreOffice Module sc (master)  1
editsh.cxx
Go to the documentation of this file.
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 <comphelper/string.hxx>
21 #include <scitems.hxx>
22 #include <editeng/eeitem.hxx>
23 #include <i18nutil/unicode.hxx>
24 
25 #include <svx/clipfmtitem.hxx>
26 #include <svx/svxdlg.hxx>
27 #include <editeng/contouritem.hxx>
28 #include <editeng/outliner.hxx>
30 #include <editeng/editeng.hxx>
31 #include <editeng/editview.hxx>
33 #include <editeng/flditem.hxx>
34 #include <editeng/flstitem.hxx>
35 #include <editeng/fontitem.hxx>
37 #include <svx/hlnkitem.hxx>
38 #include <vcl/EnumContext.hxx>
39 #include <editeng/postitem.hxx>
41 #include <editeng/shdditem.hxx>
42 #include <editeng/udlnitem.hxx>
43 #include <editeng/wghtitem.hxx>
44 #include <sfx2/bindings.hxx>
45 #include <sfx2/dispatch.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 <svtools/cliplistener.hxx>
52 #include <svl/whiter.hxx>
53 #include <sot/formats.hxx>
54 #include <vcl/transfer.hxx>
55 #include <vcl/unohelp2.hxx>
56 #include <svl/stritem.hxx>
57 #include <editeng/colritem.hxx>
58 
59 #include <editsh.hxx>
60 #include <global.hxx>
61 #include <sc.hrc>
62 #include <scmod.hxx>
63 #include <inputhdl.hxx>
64 #include <viewutil.hxx>
65 #include <viewdata.hxx>
66 #include <document.hxx>
67 #include <reffind.hxx>
68 #include <tabvwsh.hxx>
69 #include <editutil.hxx>
70 #include <globstr.hrc>
71 #include <scresid.hxx>
72 #include <gridwin.hxx>
73 
74 #define ShellClass_ScEditShell
75 #include <scslots.hxx>
76 
77 #include <scui_def.hxx>
78 #include <scabstdlg.hxx>
79 #include <memory>
80 
81 using namespace ::com::sun::star;
82 
83 
85 
86 void ScEditShell::InitInterface_Impl()
87 {
88  GetStaticInterface()->RegisterPopupMenu("celledit");
89 }
90 
92  pEditView (pView),
93  rViewData (rData),
94  bPastePossible (false),
95  bIsInsertMode (true)
96 {
99  SetName("EditCell");
101 }
102 
104 {
105  if ( mxClipEvtLstnr.is() )
106  {
107  mxClipEvtLstnr->RemoveListener( rViewData.GetActiveWin() );
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  mxClipEvtLstnr->ClearCallbackLink();
112  }
113 }
114 
116 {
117  return SC_MOD()->GetInputHdl( rViewData.GetViewShell() );
118 }
119 
121 {
122  pEditView = pView;
126 }
127 
128 static void lcl_RemoveAttribs( EditView& rEditView )
129 {
130  ScEditEngineDefaulter* pEngine = static_cast<ScEditEngineDefaulter*>(rEditView.GetEditEngine());
131 
132  bool bOld = pEngine->GetUpdateMode();
133  pEngine->SetUpdateMode(false);
134 
135  OUString aName = ScResId( STR_UNDO_DELETECONTENTS );
136  ViewShellId nViewShellId(-1);
138  nViewShellId = pViewSh->GetViewShellId();
139  pEngine->GetUndoManager().EnterListAction( aName, aName, 0, nViewShellId );
140 
141  rEditView.RemoveAttribs(true);
142  pEngine->RepeatDefaults(); // paragraph attributes from cell formats must be preserved
143 
144  pEngine->GetUndoManager().LeaveListAction();
145 
146  pEngine->SetUpdateMode(bOld);
147 }
148 
149 static void lclInsertCharacter( EditView* pTableView, EditView* pTopView, sal_Unicode cChar )
150 {
151  OUString aString( cChar );
152  if( pTableView )
153  pTableView->InsertText( aString );
154  if( pTopView )
155  pTopView->InsertText( aString );
156 }
157 
159 {
160  const SfxItemSet* pReqArgs = rReq.GetArgs();
161  sal_uInt16 nSlot = rReq.GetSlot();
162  SfxBindings& rBindings = rViewData.GetBindings();
163 
164  ScInputHandler* pHdl = GetMyInputHdl();
165  OSL_ENSURE(pHdl,"no ScInputHandler");
166 
167  EditView* pTopView = pHdl->GetTopView(); // Has thee input cell the focus?
168  EditView* pTableView = pHdl->GetTableView();
169 
170  OSL_ENSURE(pTableView,"no EditView :-(");
171  /* #i91683# No EditView if spell-check dialog is active and positioned on
172  * an error and user immediately (without double click or F2) selected a
173  * text portion of that cell with the mouse and wanted to modify it. */
174  /* FIXME: Bailing out only cures the symptom and prevents a crash, no edit
175  * action is possible. A real fix somehow would need to create a valid
176  * EditView from the spell-check view. */
177  if (!pTableView)
178  return;
179 
180  EditEngine* pEngine = pTableView->GetEditEngine();
181 
182  pHdl->DataChanging();
183  bool bSetSelIsRef = false;
184  bool bSetModified = true;
185 
186  switch ( nSlot )
187  {
188  case SID_ATTR_INSERT:
189  case FID_INS_CELL_CONTENTS: // Insert taste, while defined as Acc
190  bIsInsertMode = !pTableView->IsInsertMode();
191  pTableView->SetInsertMode( bIsInsertMode );
192  if (pTopView)
193  pTopView->SetInsertMode( bIsInsertMode );
194  rBindings.Invalidate( SID_ATTR_INSERT );
195  break;
196 
197  case SID_THES:
198  {
199  OUString aReplaceText;
200  const SfxStringItem* pItem2 = rReq.GetArg<SfxStringItem>(SID_THES);
201  if (pItem2)
202  aReplaceText = pItem2->GetValue();
203  if (!aReplaceText.isEmpty())
204  ReplaceTextWithSynonym( *pEditView, aReplaceText );
205  }
206  break;
207 
208  case SID_COPY:
209  pTableView->Copy();
210  bSetModified = false;
211  break;
212 
213  case SID_CUT:
214  pTableView->Cut();
215  if (pTopView)
216  pTopView->DeleteSelected();
217  break;
218 
219  case SID_PASTE:
220  {
221  EVControlBits nControl = pTableView->GetControlWord();
222  if (pTopView)
223  {
224  pTopView->Paste();
225  pTableView->SetControlWord(nControl | EVControlBits::SINGLELINEPASTE);
226  }
227 
228  pTableView->PasteSpecial();
229  pTableView->SetControlWord(nControl);
230  }
231  break;
232 
233  case SID_DELETE:
234  pTableView->DeleteSelected();
235  if (pTopView)
236  pTopView->DeleteSelected();
237  break;
238 
239  case SID_CELL_FORMAT_RESET: // "Standard"
240  lcl_RemoveAttribs( *pTableView );
241  if ( pTopView )
242  lcl_RemoveAttribs( *pTopView );
243  break;
244 
245  case SID_CLIPBOARD_FORMAT_ITEMS:
246  {
247  SotClipboardFormatId nFormat = SotClipboardFormatId::NONE;
248  const SfxPoolItem* pItem;
249  if ( pReqArgs &&
250  pReqArgs->GetItemState(nSlot, true, &pItem) == SfxItemState::SET &&
251  dynamic_cast<const SfxUInt32Item*>( pItem) != nullptr )
252  {
253  nFormat = static_cast<SotClipboardFormatId>(static_cast<const SfxUInt32Item*>(pItem)->GetValue());
254  }
255 
256  if ( nFormat != SotClipboardFormatId::NONE )
257  {
258  if (SotClipboardFormatId::STRING == nFormat)
259  pTableView->Paste();
260  else
261  pTableView->PasteSpecial();
262 
263  if (pTopView)
264  pTopView->Paste();
265  }
266  }
267  break;
268 
269  case SID_PASTE_SPECIAL:
270  {
272  ScopedVclPtr<SfxAbstractPasteDialog> pDlg(pFact->CreatePasteDialog(rViewData.GetDialogParent()));
273  SotClipboardFormatId nFormat = SotClipboardFormatId::NONE;
274  pDlg->Insert( SotClipboardFormatId::STRING, EMPTY_OUSTRING );
275  pDlg->Insert( SotClipboardFormatId::RTF, EMPTY_OUSTRING );
276  pDlg->Insert( SotClipboardFormatId::RICHTEXT, EMPTY_OUSTRING );
277  // Do not offer SotClipboardFormatId::STRING_TSVC for
278  // in-cell paste.
279 
280  TransferableDataHelper aDataHelper(
282 
283  nFormat = pDlg->GetFormat( aDataHelper.GetTransferable() );
284  pDlg.disposeAndClear();
285 
286  // while the dialog was open, edit mode may have been stopped
287  if (!SC_MOD()->IsInputMode())
288  return;
289 
290  if (nFormat != SotClipboardFormatId::NONE)
291  {
292  if (SotClipboardFormatId::STRING == nFormat)
293  pTableView->Paste();
294  else
295  pTableView->PasteSpecial();
296 
297  if (pTopView)
298  pTopView->Paste();
299  }
300 
301  if (vcl::Window* pViewWindow = pTopView ? pTopView->GetWindow() : nullptr)
302  pViewWindow->GrabFocus();
303  }
304  break;
305 
306  case SID_PASTE_UNFORMATTED:
307  {
308  pTableView->Paste();
309 
310  if (pTopView)
311  {
312  pTopView->Paste();
313  if (vcl::Window* pViewWindow = pTopView->GetWindow())
314  pViewWindow->GrabFocus();
315  }
316  }
317  break;
318 
319  case SID_SELECTALL:
320  {
321  sal_Int32 nPar = pEngine->GetParagraphCount();
322  if (nPar)
323  {
324  sal_Int32 nLen = pEngine->GetTextLen(nPar-1);
325  pTableView->SetSelection(ESelection(0,0,nPar-1,nLen));
326  if (pTopView)
327  pTopView->SetSelection(ESelection(0,0,nPar-1,nLen));
328  rBindings.Invalidate( SID_ATTR_CHAR_FONT );
329  rBindings.Invalidate( SID_ATTR_CHAR_FONTHEIGHT );
330  rBindings.Invalidate( SID_ATTR_CHAR_WEIGHT );
331  rBindings.Invalidate( SID_ATTR_CHAR_POSTURE );
332  rBindings.Invalidate( SID_ATTR_CHAR_UNDERLINE );
333  rBindings.Invalidate( SID_ATTR_CHAR_STRIKEOUT );
334  rBindings.Invalidate( SID_ATTR_CHAR_SHADOWED );
335  rBindings.Invalidate( SID_ATTR_CHAR_KERNING );
336  rBindings.Invalidate( SID_ATTR_CHAR_COLOR );
337  rBindings.Invalidate( SID_SET_SUPER_SCRIPT );
338  rBindings.Invalidate( SID_SET_SUB_SCRIPT );
339  }
340  }
341  return;
342  case SID_UNICODE_NOTATION_TOGGLE:
343  {
344  EditView* pActiveView = pHdl->GetActiveView();
345  if( pActiveView )
346  {
347  OUString sInput = pEngine->GetText();
348  ESelection aSel( pActiveView->GetSelection() );
349  if( aSel.HasRange() )
350  sInput = pActiveView->GetSelected();
351 
352  if( aSel.nStartPos > aSel.nEndPos )
353  aSel.nEndPos = aSel.nStartPos;
354 
355  //calculate a valid end-position by reading logical characters
356  sal_Int32 nUtf16Pos=0;
357  while( (nUtf16Pos < sInput.getLength()) && (nUtf16Pos < aSel.nEndPos) )
358  {
359  sInput.iterateCodePoints(&nUtf16Pos);
360  if( nUtf16Pos > aSel.nEndPos )
361  aSel.nEndPos = nUtf16Pos;
362  }
363 
364  ToggleUnicodeCodepoint aToggle;
365  while( nUtf16Pos && aToggle.AllowMoreInput( sInput[nUtf16Pos-1]) )
366  --nUtf16Pos;
367  OUString sReplacement = aToggle.ReplacementString();
368  if( !sReplacement.isEmpty() )
369  {
370  aSel.nStartPos = aSel.nEndPos - aToggle.StringToReplace().getLength();
371  pTableView->SetSelection( aSel );
372  pTableView->InsertText(sReplacement, true);
373  if( pTopView )
374  {
375  pTopView->SetSelection( aSel );
376  pTopView->InsertText(sReplacement, true);
377  }
378  }
379  }
380  }
381  break;
382 
383  case SID_CHARMAP:
384  {
385  SvtScriptType nScript = pTableView->GetSelectedScriptType();
386  sal_uInt16 nFontWhich = ( nScript == SvtScriptType::ASIAN ) ? EE_CHAR_FONTINFO_CJK :
387  ( ( nScript == SvtScriptType::COMPLEX ) ? EE_CHAR_FONTINFO_CTL :
389  const SvxFontItem& rItem = static_cast<const SvxFontItem&>(
390  pTableView->GetAttribs().Get(nFontWhich));
391 
392  OUString aString;
393  std::shared_ptr<SvxFontItem> aNewItem(std::make_shared<SvxFontItem>(EE_CHAR_FONTINFO));
394 
395  const SfxItemSet *pArgs = rReq.GetArgs();
396  const SfxPoolItem* pItem = nullptr;
397  if( pArgs )
398  pArgs->GetItemState(GetPool().GetWhich(SID_CHARMAP), false, &pItem);
399 
400  if ( pItem )
401  {
402  aString = static_cast<const SfxStringItem*>(pItem)->GetValue();
403  const SfxPoolItem* pFtItem = nullptr;
404  pArgs->GetItemState( GetPool().GetWhich(SID_ATTR_SPECIALCHAR), false, &pFtItem);
405  const SfxStringItem* pFontItem = dynamic_cast<const SfxStringItem*>( pFtItem );
406  if ( pFontItem )
407  {
408  const OUString& aFontName(pFontItem->GetValue());
409  vcl::Font aFont(aFontName, Size(1,1)); // Size just because CTOR
410  // tdf#125054 see comment in drtxob.cxx, same ID
411  aNewItem = std::make_shared<SvxFontItem>(
412  aFont.GetFamilyType(), aFont.GetFamilyName(),
413  aFont.GetStyleName(), aFont.GetPitch(),
414  aFont.GetCharSet(), ATTR_FONT);
415  }
416  else
417  {
418  aNewItem.reset(rItem.Clone());
419  }
420 
421  // tdf#125054 force Item to correct intended ID
422  aNewItem->SetWhich(EE_CHAR_FONTINFO);
423  }
424  else
425  {
427 
428  // while the dialog was open, edit mode may have been stopped
429  if (!SC_MOD()->IsInputMode())
430  return;
431  }
432 
433  if ( !aString.isEmpty() )
434  {
435  // if string contains WEAK characters, set all fonts
436  SvtScriptType nSetScript;
437  ScDocument& rDoc = rViewData.GetDocument();
438  if ( rDoc.HasStringWeakCharacters( aString ) )
439  nSetScript = SvtScriptType::LATIN | SvtScriptType::ASIAN | SvtScriptType::COMPLEX;
440  else
441  nSetScript = rDoc.GetStringScriptType( aString );
442 
443  SfxItemSet aSet( pTableView->GetEmptyItemSet() );
444  SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONT, GetPool() );
445  aSetItem.PutItemForScriptType( nSetScript, *aNewItem );
446  aSet.Put( aSetItem.GetItemSet(), false );
447 
448  // SetAttribs on the View selects a word, when nothing is selected
449  pTableView->GetEditEngine()->QuickSetAttribs( aSet, pTableView->GetSelection() );
450  pTableView->InsertText(aString);
451  if (pTopView)
452  pTopView->InsertText(aString);
453 
454  SfxStringItem aStringItem( SID_CHARMAP, aString );
455  SfxStringItem aFontItem( SID_ATTR_SPECIALCHAR, aNewItem->GetFamilyName() );
456  rReq.AppendItem( aFontItem );
457  rReq.AppendItem( aStringItem );
458  rReq.Done();
459 
460  }
461 
462  if (vcl::Window* pViewWindow = pTopView ? pTopView->GetWindow() : nullptr)
463  pViewWindow->GrabFocus();
464  }
465  break;
466 
467  case FID_INSERT_NAME:
468  {
470 
472  short nRet = pDlg->Execute();
473  // pDlg is needed below
474 
475  // while the dialog was open, edit mode may have been stopped
476  if (!SC_MOD()->IsInputMode())
477  return;
478 
479  if ( nRet == BTN_PASTE_NAME )
480  {
481  std::vector<OUString> aNames = pDlg->GetSelectedNames();
482  if (!aNames.empty())
483  {
484  OUStringBuffer aBuffer;
485  for (const auto& rName : aNames)
486  {
487  aBuffer.append(rName).append(' ');
488  }
489  pTableView->InsertText(aBuffer.toString());
490  if (pTopView)
491  pTopView->InsertText(aBuffer.makeStringAndClear());
492  }
493  }
494  pDlg.disposeAndClear();
495 
496  if (vcl::Window* pViewWindow = pTopView ? pTopView->GetWindow() : nullptr)
497  pViewWindow->GrabFocus();
498  }
499  break;
500 
501  case SID_CHAR_DLG_EFFECT:
502  case SID_CHAR_DLG:
503  {
504  SfxItemSet aAttrs( pTableView->GetAttribs() );
505 
507 
509 
511  rViewData.GetDialogParent(), &aAttrs, pObjSh, false));
512  if (nSlot == SID_CHAR_DLG_EFFECT)
513  {
514  pDlg->SetCurPageId("fonteffects");
515  }
516  short nRet = pDlg->Execute();
517  // pDlg is needed below
518 
519  // while the dialog was open, edit mode may have been stopped
520  if (!SC_MOD()->IsInputMode())
521  return;
522 
523  if ( nRet == RET_OK )
524  {
525  const SfxItemSet* pOut = pDlg->GetOutputItemSet();
526  pTableView->SetAttribs( *pOut );
527  }
528  }
529  break;
530 
531  case SID_TOGGLE_REL:
532  {
533  if (pEngine->GetParagraphCount() == 1)
534  {
535  OUString aText = pEngine->GetText();
536  ESelection aSel = pEditView->GetSelection(); // current View
537 
538  ScDocument& rDoc = rViewData.GetDocument();
539  ScRefFinder aFinder(aText, rViewData.GetCurPos(), rDoc, rDoc.GetAddressConvention());
540  aFinder.ToggleRel( aSel.nStartPos, aSel.nEndPos );
541  if (aFinder.GetFound())
542  {
543  const OUString& aNew = aFinder.GetText();
544  ESelection aNewSel( 0,aFinder.GetSelStart(), 0,aFinder.GetSelEnd() );
545  pEngine->SetText( aNew );
546  pTableView->SetSelection( aNewSel );
547  if ( pTopView )
548  {
549  pTopView->GetEditEngine()->SetText( aNew );
550  pTopView->SetSelection( aNewSel );
551  }
552 
553  // reference is being selected -> do not overwrite when typing
554  bSetSelIsRef = true;
555  }
556  }
557  }
558  break;
559 
560  case SID_HYPERLINK_SETLINK:
561  if( pReqArgs )
562  {
563  const SfxPoolItem* pItem;
564  if ( pReqArgs->GetItemState( SID_HYPERLINK_SETLINK, true, &pItem ) == SfxItemState::SET )
565  {
566  const SvxHyperlinkItem* pHyper = static_cast<const SvxHyperlinkItem*>(pItem);
567  const OUString& rName = pHyper->GetName();
568  const OUString& rURL = pHyper->GetURL();
569  const OUString& rTarget = pHyper->GetTargetFrame();
571 
572  bool bDone = false;
573  if ( eMode == HLINK_DEFAULT || eMode == HLINK_FIELD )
574  {
575  const SvxURLField* pURLField = GetURLField();
576  if ( pURLField )
577  {
578  // select old field
579 
580  ESelection aSel = pTableView->GetSelection();
581  aSel.Adjust();
582  aSel.nEndPara = aSel.nStartPara;
583  aSel.nEndPos = aSel.nStartPos + 1;
584  pTableView->SetSelection( aSel );
585 
586  // insert new field
587 
588  SvxURLField aURLField( rURL, rName, SvxURLFormat::Repr );
589  aURLField.SetTargetFrame( rTarget );
590  SvxFieldItem aURLItem( aURLField, EE_FEATURE_FIELD );
591  pTableView->InsertField( aURLItem );
592  pTableView->SetSelection( aSel ); // select inserted field
593 
594  // now also fields in the Top-View
595 
596  if ( pTopView )
597  {
598  aSel = pTopView->GetSelection();
599  aSel.nEndPara = aSel.nStartPara;
600  aSel.nEndPos = aSel.nStartPos + 1;
601  pTopView->SetSelection( aSel );
602  pTopView->InsertField( aURLItem );
603  pTopView->SetSelection( aSel ); // select inserted field
604  }
605 
606  bDone = true;
607  }
608  }
609 
610  if (!bDone)
611  {
613  InsertURL( rName, rURL, rTarget, static_cast<sal_uInt16>(eMode) );
614 
615  // when "Button", the InsertURL in ViewShell turns the EditShell off
616  // thus the immediate return statement
617  return;
618  }
619  }
620  }
621  break;
622 
623  case SID_OPEN_HYPERLINK:
624  {
625  const SvxURLField* pURLField = GetURLField();
626  if ( pURLField )
627  ScGlobal::OpenURL( pURLField->GetURL(), pURLField->GetTargetFrame(), true );
628  return;
629  }
630  case SID_EDIT_HYPERLINK:
631  {
632  // Ensure the field is selected first
635  SID_HYPERLINK_DIALOG);
636  }
637  break;
638  case SID_COPY_HYPERLINK_LOCATION:
639  {
640  const SvxFieldData* pField = pEditView->GetFieldAtCursor();
641  if (const SvxURLField* pURLField = dynamic_cast<const SvxURLField*>(pField))
642  {
643  uno::Reference<datatransfer::clipboard::XClipboard> xClipboard = GetSystemClipboard();
644 
646  {
647  std::function<void (int, const char*)> callback = [&] (int callbackType, const char* text) { rViewData.GetViewShell()->libreOfficeKitViewCallback(callbackType, text); } ;
648  vcl::unohelper::TextDataObject::CopyStringTo(pURLField->GetURL(), xClipboard, &callback);
649  }
650  else
651  vcl::unohelper::TextDataObject::CopyStringTo(pURLField->GetURL(), xClipboard, nullptr);
652  }
653  }
654  break;
655  case SID_REMOVE_HYPERLINK:
656  {
658  }
659  break;
660 
661  case FN_INSERT_SOFT_HYPHEN:
662  lclInsertCharacter( pTableView, pTopView, CHAR_SHY );
663  break;
664  case FN_INSERT_HARDHYPHEN:
665  lclInsertCharacter( pTableView, pTopView, CHAR_NBHY );
666  break;
667  case FN_INSERT_HARD_SPACE:
668  lclInsertCharacter( pTableView, pTopView, CHAR_NBSP );
669  break;
670  case FN_INSERT_NNBSP:
671  lclInsertCharacter( pTableView, pTopView, CHAR_NNBSP );
672  break;
673  case SID_INSERT_RLM:
674  lclInsertCharacter( pTableView, pTopView, CHAR_RLM );
675  break;
676  case SID_INSERT_LRM:
677  lclInsertCharacter( pTableView, pTopView, CHAR_LRM );
678  break;
679  case SID_INSERT_ZWSP:
680  lclInsertCharacter( pTableView, pTopView, CHAR_ZWSP );
681  break;
682  case SID_INSERT_ZWNBSP:
683  lclInsertCharacter( pTableView, pTopView, CHAR_ZWNBSP );
684  break;
685  case SID_INSERT_FIELD_SHEET:
686  {
687  SvxTableField aField(rViewData.GetTabNo());
688  SvxFieldItem aItem(aField, EE_FEATURE_FIELD);
689  pTableView->InsertField(aItem);
690  }
691  break;
692  case SID_INSERT_FIELD_TITLE:
693  {
694  SvxFileField aField;
695  SvxFieldItem aItem(aField, EE_FEATURE_FIELD);
696  pTableView->InsertField(aItem);
697  }
698  break;
699  case SID_INSERT_FIELD_DATE_VAR:
700  {
701  SvxDateField aField;
702  SvxFieldItem aItem(aField, EE_FEATURE_FIELD);
703  pTableView->InsertField(aItem);
704  }
705  break;
706  }
707 
708  pHdl->DataChanged(false, bSetModified);
709  if (bSetSelIsRef)
710  pHdl->SetSelIsRef(true);
711 }
712 
713 static void lcl_DisableAll( SfxItemSet& rSet ) // disable all slots
714 {
715  SfxWhichIter aIter( rSet );
716  sal_uInt16 nWhich = aIter.FirstWhich();
717  while (nWhich)
718  {
719  rSet.DisableItem( nWhich );
720  nWhich = aIter.NextWhich();
721  }
722 }
723 
725 {
726  // When deactivating the view, edit mode is stopped, but the EditShell is left active
727  // (a shell can't be removed from within Deactivate). In that state, the EditView isn't inserted
728  // into the EditEngine, so it can have an invalid selection and must not be used.
730  {
731  lcl_DisableAll( rSet );
732  return;
733  }
734 
735  ScInputHandler* pHdl = GetMyInputHdl();
736  EditView* pActiveView = pHdl ? pHdl->GetActiveView() : pEditView;
737 
738  SfxWhichIter aIter( rSet );
739  sal_uInt16 nWhich = aIter.FirstWhich();
740  while (nWhich)
741  {
742  switch (nWhich)
743  {
744  case SID_ATTR_INSERT: // Status row
745  {
746  if ( pActiveView )
747  rSet.Put( SfxBoolItem( nWhich, pActiveView->IsInsertMode() ) );
748  else
749  {
750  // Here the code used to pass the value 42 and it used
751  // to "work" without warnings because the SfxBoolItem
752  // was based on 'sal_Bool', which is actually 'unsigned
753  // char'. But now it uses actual 'bool', and passing 42
754  // for a 'bool' parameter causes a warning at least with
755  // MSVC. So use 'true'. I really really hope there is
756  // not code somewhere that retrieves this "boolean" item
757  // and checks it value for the magic value 42...
758  rSet.Put( SfxBoolItem( nWhich, true) );
759  }
760  }
761  break;
762 
763  case SID_HYPERLINK_GETLINK:
764  {
765  SvxHyperlinkItem aHLinkItem;
766  const SvxURLField* pURLField = GetURLField();
767  if ( pURLField )
768  {
769  aHLinkItem.SetName( pURLField->GetRepresentation() );
770  aHLinkItem.SetURL( pURLField->GetURL() );
771  aHLinkItem.SetTargetFrame( pURLField->GetTargetFrame() );
772  }
773  else if ( pActiveView )
774  {
775  // use selected text as name for urls
776  OUString sReturn = pActiveView->GetSelected();
777  sReturn = sReturn.copy(0, std::min(sReturn.getLength(), static_cast<sal_Int32>(255)));
778  aHLinkItem.SetName(comphelper::string::stripEnd(sReturn, ' '));
779  }
780  rSet.Put(aHLinkItem);
781  }
782  break;
783 
784  case SID_OPEN_HYPERLINK:
785  case SID_EDIT_HYPERLINK:
786  case SID_COPY_HYPERLINK_LOCATION:
787  case SID_REMOVE_HYPERLINK:
788  {
790  rSet.DisableItem (nWhich);
791  }
792  break;
793 
794  case SID_TRANSLITERATE_HALFWIDTH:
795  case SID_TRANSLITERATE_FULLWIDTH:
796  case SID_TRANSLITERATE_HIRAGANA:
797  case SID_TRANSLITERATE_KATAKANA:
798  case SID_INSERT_RLM:
799  case SID_INSERT_LRM:
801  break;
802 
803  case SID_THES:
804  {
805  OUString aStatusVal;
806  LanguageType nLang = LANGUAGE_NONE;
807  bool bIsLookUpWord = pActiveView &&
808  GetStatusValueForThesaurusFromContext(aStatusVal, nLang, *pActiveView);
809  rSet.Put( SfxStringItem( SID_THES, aStatusVal ) );
810 
811  // disable thesaurus context menu entry if there is nothing to look up
812  bool bCanDoThesaurus = ScModule::HasThesaurusLanguage( nLang );
813  if (!bIsLookUpWord || !bCanDoThesaurus)
814  rSet.DisableItem( SID_THES );
815  }
816  break;
817  case SID_INSERT_FIELD_SHEET:
818  case SID_INSERT_FIELD_TITLE:
819  case SID_INSERT_FIELD_DATE_VAR:
820  break;
821  case SID_COPY:
822  case SID_CUT:
823  if (GetObjectShell() && GetObjectShell()->isContentExtractionLocked())
824  {
825  rSet.DisableItem(SID_COPY);
826  rSet.DisableItem(SID_CUT);
827  }
828  break;
829 
830  }
831  nWhich = aIter.NextWhich();
832  }
833 }
834 
836 {
837  ScInputHandler* pHdl = GetMyInputHdl();
838  EditView* pActiveView = pHdl ? pHdl->GetActiveView() : pEditView;
839  if (!pActiveView)
840  return nullptr;
841 
842  const SvxFieldData* pField = pActiveView->GetFieldAtCursor();
843  if (auto pURLField = dynamic_cast<const SvxURLField*>(pField))
844  return pURLField;
845 
846  return nullptr;
847 }
848 
849 IMPL_LINK( ScEditShell, ClipboardChanged, TransferableDataHelper*, pDataHelper, void )
850 {
851  bPastePossible = ( pDataHelper->HasFormat( SotClipboardFormatId::STRING )
852  || pDataHelper->HasFormat( SotClipboardFormatId::RTF )
853  || pDataHelper->HasFormat( SotClipboardFormatId::RICHTEXT ));
854 
855  SfxBindings& rBindings = rViewData.GetBindings();
856  rBindings.Invalidate( SID_PASTE );
857  rBindings.Invalidate( SID_PASTE_SPECIAL );
858  rBindings.Invalidate( SID_PASTE_UNFORMATTED );
859  rBindings.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS );
860 }
861 
863 {
864  // Do not offer SotClipboardFormatId::STRING_TSVC for in-cell paste.
865 
866  if ( !mxClipEvtLstnr.is() )
867  {
868  // create listener
869  mxClipEvtLstnr = new TransferableClipboardListener( LINK( this, ScEditShell, ClipboardChanged ) );
871  mxClipEvtLstnr->AddListener( pWin );
872 
873  // get initial state
875  bPastePossible = ( aDataHelper.HasFormat( SotClipboardFormatId::STRING )
876  || aDataHelper.HasFormat( SotClipboardFormatId::RTF )
877  || aDataHelper.HasFormat( SotClipboardFormatId::RICHTEXT ) );
878  }
879 
880  SfxWhichIter aIter( rSet );
881  sal_uInt16 nWhich = aIter.FirstWhich();
882  while (nWhich)
883  {
884  switch (nWhich)
885  {
886  case SID_PASTE:
887  case SID_PASTE_SPECIAL:
888  case SID_PASTE_UNFORMATTED:
889  if( !bPastePossible )
890  rSet.DisableItem( nWhich );
891  break;
892  case SID_CLIPBOARD_FORMAT_ITEMS:
893  if( bPastePossible )
894  {
895  SvxClipboardFormatItem aFormats( SID_CLIPBOARD_FORMAT_ITEMS );
896  TransferableDataHelper aDataHelper(
898 
899  if ( aDataHelper.HasFormat( SotClipboardFormatId::STRING ) )
900  aFormats.AddClipbrdFormat( SotClipboardFormatId::STRING );
901  if ( aDataHelper.HasFormat( SotClipboardFormatId::RTF ) )
902  aFormats.AddClipbrdFormat( SotClipboardFormatId::RTF );
903 
904  rSet.Put( aFormats );
905  }
906  else
907  rSet.DisableItem( nWhich );
908  break;
909  }
910  nWhich = aIter.NextWhich();
911  }
912 }
913 
914 static void lcl_InvalidateUnder( SfxBindings& rBindings )
915 {
916  rBindings.Invalidate( SID_ATTR_CHAR_UNDERLINE );
917  rBindings.Invalidate( SID_ULINE_VAL_NONE );
918  rBindings.Invalidate( SID_ULINE_VAL_SINGLE );
919  rBindings.Invalidate( SID_ULINE_VAL_DOUBLE );
920  rBindings.Invalidate( SID_ULINE_VAL_DOTTED );
921 }
922 
924 {
926  SfxBindings& rBindings = rViewData.GetBindings();
927  const SfxItemSet* pArgs = rReq.GetArgs();
928  sal_uInt16 nSlot = rReq.GetSlot();
929 
930  switch ( nSlot )
931  {
932  case SID_ATTR_CHAR_FONTHEIGHT:
933  case SID_ATTR_CHAR_FONT:
934  {
935  if (pArgs)
936  {
937  // #i78017 establish the same behaviour as in Writer
938  SvtScriptType nScript = SvtScriptType::LATIN | SvtScriptType::ASIAN | SvtScriptType::COMPLEX;
939  if (nSlot == SID_ATTR_CHAR_FONT)
940  {
941  nScript = pEditView->GetSelectedScriptType();
942  if (nScript == SvtScriptType::NONE) nScript = ScGlobal::GetDefaultScriptType();
943  }
944 
945  SfxItemPool& rPool = GetPool();
946  SvxScriptSetItem aSetItem( nSlot, rPool );
947  sal_uInt16 nWhich = rPool.GetWhich( nSlot );
948  aSetItem.PutItemForScriptType( nScript, pArgs->Get( nWhich ) );
949 
950  aSet.Put( aSetItem.GetItemSet(), false );
951  }
952  }
953  break;
954 
955  case SID_ATTR_CHAR_COLOR:
956  {
957  if (pArgs)
958  {
959  const SfxPoolItem* pColorStringItem = nullptr;
960 
961  if ( pArgs && SfxItemState::SET == pArgs->GetItemState( SID_ATTR_COLOR_STR, false, &pColorStringItem ) )
962  {
963  Color aColor;
964  OUString sColor = static_cast<const SfxStringItem*>( pColorStringItem )->GetValue();
965  if ( sColor == "transparent" )
966  aColor = COL_TRANSPARENT;
967  else
968  aColor = Color( sColor.toInt32( 16 ) );
969 
970  aSet.Put( SvxColorItem( aColor, EE_CHAR_COLOR ) );
971  }
972  else
973  {
974  aSet.Put( pArgs->Get( pArgs->GetPool()->GetWhich( nSlot ) ) );
975  }
976  rBindings.Invalidate( nSlot );
977  }
978  }
979  break;
980 
981  // Toggles
982 
983  case SID_ATTR_CHAR_WEIGHT:
984  {
985  // #i78017 establish the same behaviour as in Writer
986  SvtScriptType nScript = SvtScriptType::LATIN | SvtScriptType::ASIAN | SvtScriptType::COMPLEX;
987 
988  SfxItemPool& rPool = GetPool();
989 
990  bool bOld = false;
991  SvxScriptSetItem aOldSetItem( nSlot, rPool );
992  aOldSetItem.GetItemSet().Put( pEditView->GetAttribs(), false );
993  const SfxPoolItem* pCore = aOldSetItem.GetItemOfScript( nScript );
994  if ( pCore && static_cast<const SvxWeightItem*>(pCore)->GetWeight() > WEIGHT_NORMAL )
995  bOld = true;
996 
997  SvxScriptSetItem aSetItem( nSlot, rPool );
998  aSetItem.PutItemForScriptType( nScript,
1000  aSet.Put( aSetItem.GetItemSet(), false );
1001 
1002  rBindings.Invalidate( nSlot );
1003  }
1004  break;
1005 
1006  case SID_ATTR_CHAR_POSTURE:
1007  {
1008  // #i78017 establish the same behaviour as in Writer
1009  SvtScriptType nScript = SvtScriptType::LATIN | SvtScriptType::ASIAN | SvtScriptType::COMPLEX;
1010 
1011  SfxItemPool& rPool = GetPool();
1012 
1013  bool bOld = false;
1014  SvxScriptSetItem aOldSetItem( nSlot, rPool );
1015  aOldSetItem.GetItemSet().Put( pEditView->GetAttribs(), false );
1016  const SfxPoolItem* pCore = aOldSetItem.GetItemOfScript( nScript );
1017  if ( pCore && static_cast<const SvxPostureItem*>(pCore)->GetValue() != ITALIC_NONE )
1018  bOld = true;
1019 
1020  SvxScriptSetItem aSetItem( nSlot, rPool );
1021  aSetItem.PutItemForScriptType( nScript,
1023  aSet.Put( aSetItem.GetItemSet(), false );
1024 
1025  rBindings.Invalidate( nSlot );
1026  }
1027  break;
1028 
1029  case SID_ULINE_VAL_NONE:
1031  lcl_InvalidateUnder( rBindings );
1032  break;
1033 
1034  case SID_ATTR_CHAR_UNDERLINE:
1035  case SID_ULINE_VAL_SINGLE:
1036  case SID_ULINE_VAL_DOUBLE:
1037  case SID_ULINE_VAL_DOTTED:
1038  {
1039  FontLineStyle eOld = pEditView->GetAttribs().Get(EE_CHAR_UNDERLINE).GetLineStyle();
1040  FontLineStyle eNew = eOld;
1041  switch (nSlot)
1042  {
1043  case SID_ATTR_CHAR_UNDERLINE:
1044  if ( pArgs )
1045  {
1046  const SvxTextLineItem& rTextLineItem = static_cast< const SvxTextLineItem& >( pArgs->Get( pArgs->GetPool()->GetWhich(nSlot) ) );
1047  eNew = rTextLineItem.GetLineStyle();
1048  }
1049  else
1050  {
1051  eNew = ( eOld != LINESTYLE_NONE ) ? LINESTYLE_NONE : LINESTYLE_SINGLE;
1052  }
1053  break;
1054  case SID_ULINE_VAL_SINGLE:
1055  eNew = ( eOld == LINESTYLE_SINGLE ) ? LINESTYLE_NONE : LINESTYLE_SINGLE;
1056  break;
1057  case SID_ULINE_VAL_DOUBLE:
1058  eNew = ( eOld == LINESTYLE_DOUBLE ) ? LINESTYLE_NONE : LINESTYLE_DOUBLE;
1059  break;
1060  case SID_ULINE_VAL_DOTTED:
1061  eNew = ( eOld == LINESTYLE_DOTTED ) ? LINESTYLE_NONE : LINESTYLE_DOTTED;
1062  break;
1063  }
1064  aSet.Put( SvxUnderlineItem( eNew, EE_CHAR_UNDERLINE ) );
1065  lcl_InvalidateUnder( rBindings );
1066  }
1067  break;
1068 
1069  case SID_ATTR_CHAR_OVERLINE:
1070  {
1071  FontLineStyle eOld = pEditView->GetAttribs().Get(EE_CHAR_OVERLINE).GetLineStyle();
1073  aSet.Put( SvxOverlineItem( eNew, EE_CHAR_OVERLINE ) );
1074  rBindings.Invalidate( nSlot );
1075  }
1076  break;
1077 
1078  case SID_ATTR_CHAR_STRIKEOUT:
1079  {
1080  bool bOld = pEditView->GetAttribs().Get(EE_CHAR_STRIKEOUT).GetValue() != STRIKEOUT_NONE;
1082  rBindings.Invalidate( nSlot );
1083  }
1084  break;
1085 
1086  case SID_ATTR_CHAR_SHADOWED:
1087  {
1088  bool bOld = pEditView->GetAttribs().Get(EE_CHAR_SHADOW).GetValue();
1089  aSet.Put( SvxShadowedItem( !bOld, EE_CHAR_SHADOW ) );
1090  rBindings.Invalidate( nSlot );
1091  }
1092  break;
1093 
1094  case SID_ATTR_CHAR_CONTOUR:
1095  {
1096  bool bOld = pEditView->GetAttribs().Get(EE_CHAR_OUTLINE).GetValue();
1097  aSet.Put( SvxContourItem( !bOld, EE_CHAR_OUTLINE ) );
1098  rBindings.Invalidate( nSlot );
1099  }
1100  break;
1101 
1102  case SID_SET_SUPER_SCRIPT:
1103  {
1104  SvxEscapement eOld = static_cast<SvxEscapement>(pEditView->GetAttribs().Get(EE_CHAR_ESCAPEMENT).GetEnumValue());
1105  SvxEscapement eNew = (eOld == SvxEscapement::Superscript) ?
1106  SvxEscapement::Off : SvxEscapement::Superscript;
1107  aSet.Put( SvxEscapementItem( eNew, EE_CHAR_ESCAPEMENT ) );
1108  rBindings.Invalidate( nSlot );
1109  }
1110  break;
1111  case SID_SET_SUB_SCRIPT:
1112  {
1113  SvxEscapement eOld = static_cast<SvxEscapement>(pEditView->GetAttribs().Get(EE_CHAR_ESCAPEMENT).GetEnumValue());
1114  SvxEscapement eNew = (eOld == SvxEscapement::Subscript) ?
1115  SvxEscapement::Off : SvxEscapement::Subscript;
1116  aSet.Put( SvxEscapementItem( eNew, EE_CHAR_ESCAPEMENT ) );
1117  rBindings.Invalidate( nSlot );
1118  }
1119  break;
1120  case SID_ATTR_CHAR_KERNING:
1121  {
1122  if(pArgs)
1123  {
1124  aSet.Put ( pArgs->Get(pArgs->GetPool()->GetWhich(nSlot)));
1125  rBindings.Invalidate( nSlot );
1126  }
1127  }
1128  break;
1129 
1130  case SID_GROW_FONT_SIZE:
1131  case SID_SHRINK_FONT_SIZE:
1132  {
1133  const SvxFontListItem* pFontListItem = static_cast< const SvxFontListItem* >
1134  ( SfxObjectShell::Current()->GetItem( SID_ATTR_CHAR_FONTLIST ) );
1135  const FontList* pFontList = pFontListItem ? pFontListItem->GetFontList() : nullptr;
1136  pEditView->ChangeFontSize( nSlot == SID_GROW_FONT_SIZE, pFontList );
1137  rBindings.Invalidate( SID_ATTR_CHAR_FONTHEIGHT );
1138  }
1139  break;
1140  }
1141 
1142  // apply
1143 
1144  EditEngine* pEngine = pEditView->GetEditEngine();
1145  bool bOld = pEngine->GetUpdateMode();
1146  pEngine->SetUpdateMode(false);
1147 
1148  pEditView->SetAttribs( aSet );
1149 
1150  pEngine->SetUpdateMode(bOld);
1151  pEditView->Invalidate();
1152 
1153  ScInputHandler* pHdl = GetMyInputHdl();
1154  pHdl->SetModified();
1155 
1156  rReq.Done();
1157 }
1158 
1160 {
1162  {
1163  lcl_DisableAll( rSet );
1164  return;
1165  }
1166 
1167  SfxItemSet aAttribs = pEditView->GetAttribs();
1168  rSet.Put( aAttribs );
1169 
1170  // choose font info according to selection script type
1171 
1173  if (nScript == SvtScriptType::NONE) nScript = ScGlobal::GetDefaultScriptType();
1174 
1175  // #i55929# input-language-dependent script type (depends on input language if nothing selected)
1176  SvtScriptType nInputScript = nScript;
1177  if ( !pEditView->GetSelection().HasRange() )
1178  {
1180  if (nInputLang != LANGUAGE_DONTKNOW && nInputLang != LANGUAGE_SYSTEM)
1181  nInputScript = SvtLanguageOptions::GetScriptTypeOfLanguage( nInputLang );
1182  }
1183 
1184  // #i55929# according to spec, nInputScript is used for font and font height only
1185  if ( rSet.GetItemState( EE_CHAR_FONTINFO ) != SfxItemState::UNKNOWN )
1186  ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_FONTINFO, nInputScript );
1187  if ( rSet.GetItemState( EE_CHAR_FONTHEIGHT ) != SfxItemState::UNKNOWN )
1188  ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_FONTHEIGHT, nInputScript );
1189  if ( rSet.GetItemState( EE_CHAR_WEIGHT ) != SfxItemState::UNKNOWN )
1190  ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_WEIGHT, nScript );
1191  if ( rSet.GetItemState( EE_CHAR_ITALIC ) != SfxItemState::UNKNOWN )
1192  ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_ITALIC, nScript );
1193 
1194  // underline
1195  SfxItemState eState = aAttribs.GetItemState( EE_CHAR_UNDERLINE );
1196  if ( eState == SfxItemState::DONTCARE )
1197  {
1198  rSet.InvalidateItem( SID_ULINE_VAL_NONE );
1199  rSet.InvalidateItem( SID_ULINE_VAL_SINGLE );
1200  rSet.InvalidateItem( SID_ULINE_VAL_DOUBLE );
1201  rSet.InvalidateItem( SID_ULINE_VAL_DOTTED );
1202  }
1203  else
1204  {
1205  FontLineStyle eUnderline = aAttribs.Get(EE_CHAR_UNDERLINE).GetLineStyle();
1206  rSet.Put(SfxBoolItem(SID_ULINE_VAL_SINGLE, eUnderline == LINESTYLE_SINGLE));
1207  rSet.Put(SfxBoolItem(SID_ULINE_VAL_DOUBLE, eUnderline == LINESTYLE_DOUBLE));
1208  rSet.Put(SfxBoolItem(SID_ULINE_VAL_DOTTED, eUnderline == LINESTYLE_DOTTED));
1209  rSet.Put(SfxBoolItem(SID_ULINE_VAL_NONE, eUnderline == LINESTYLE_NONE));
1210  }
1211 
1213  ScInputHandler* pHdl = GetMyInputHdl();
1214  if ( pHdl && pHdl->IsFormulaMode() )
1215  rSet.ClearItem( EE_CHAR_WEIGHT ); // Highlighted brace not here
1216 
1217  SvxEscapement eEsc = static_cast<SvxEscapement>(aAttribs.Get( EE_CHAR_ESCAPEMENT ).GetEnumValue());
1218  rSet.Put(SfxBoolItem(SID_SET_SUPER_SCRIPT, eEsc == SvxEscapement::Superscript));
1219  rSet.Put(SfxBoolItem(SID_SET_SUB_SCRIPT, eEsc == SvxEscapement::Subscript));
1220  rViewData.GetBindings().Invalidate( SID_SET_SUPER_SCRIPT );
1221  rViewData.GetBindings().Invalidate( SID_SET_SUB_SCRIPT );
1222 
1223  eState = aAttribs.GetItemState( EE_CHAR_KERNING );
1224  rViewData.GetBindings().Invalidate( SID_ATTR_CHAR_KERNING );
1225  if ( eState == SfxItemState::DONTCARE )
1226  {
1228  }
1229 }
1230 
1231 OUString ScEditShell::GetSelectionText( bool bWholeWord )
1232 {
1233  OUString aStrSelection;
1234 
1236  {
1237  if ( bWholeWord )
1238  {
1239  EditEngine* pEngine = pEditView->GetEditEngine();
1240  ESelection aSel = pEditView->GetSelection();
1241  OUString aStrCurrentDelimiters = pEngine->GetWordDelimiters();
1242 
1243  pEngine->SetWordDelimiters(" .,;\"'");
1244  aStrSelection = pEngine->GetWord( aSel.nEndPara, aSel.nEndPos );
1245  pEngine->SetWordDelimiters( aStrCurrentDelimiters );
1246  }
1247  else
1248  {
1249  aStrSelection = pEditView->GetSelected();
1250  }
1251  }
1252 
1253  return aStrSelection;
1254 }
1255 
1257 {
1258  // Undo must be handled here because it's called for both EditViews
1259 
1260  ScInputHandler* pHdl = GetMyInputHdl();
1261  OSL_ENSURE(pHdl,"no ScInputHandler");
1262  EditView* pTopView = pHdl->GetTopView();
1263  EditView* pTableView = pHdl->GetTableView();
1264  OSL_ENSURE(pTableView,"no EditView");
1265 
1266  pHdl->DataChanging();
1267 
1268  const SfxItemSet* pReqArgs = rReq.GetArgs();
1269  sal_uInt16 nSlot = rReq.GetSlot();
1270  switch ( nSlot )
1271  {
1272  case SID_UNDO:
1273  case SID_REDO:
1274  {
1275  bool bIsUndo = ( nSlot == SID_UNDO );
1276 
1277  sal_uInt16 nCount = 1;
1278  const SfxPoolItem* pItem;
1279  if ( pReqArgs && pReqArgs->GetItemState( nSlot, true, &pItem ) == SfxItemState::SET )
1280  nCount = static_cast<const SfxUInt16Item*>(pItem)->GetValue();
1281 
1282  for (sal_uInt16 i=0; i<nCount; i++)
1283  {
1284  if ( bIsUndo )
1285  {
1286  pTableView->Undo();
1287  if (pTopView)
1288  pTopView->Undo();
1289  }
1290  else
1291  {
1292  pTableView->Redo();
1293  if (pTopView)
1294  pTopView->Redo();
1295  }
1296  }
1297  }
1298  break;
1299  }
1301 
1302  pHdl->DataChanged();
1303 }
1304 
1306 {
1307  // Undo state is taken from normal ViewFrame state function
1308 
1310  if ( pViewFrm && GetUndoManager() )
1311  {
1312  SfxWhichIter aIter(rSet);
1313  sal_uInt16 nWhich = aIter.FirstWhich();
1314  while( nWhich )
1315  {
1316  pViewFrm->GetSlotState( nWhich, nullptr, &rSet );
1317  nWhich = aIter.NextWhich();
1318  }
1319  }
1320 
1321  // disable if no action in input line EditView
1322 
1323  ScInputHandler* pHdl = GetMyInputHdl();
1324  OSL_ENSURE(pHdl,"no ScInputHandler");
1325  EditView* pTopView = pHdl->GetTopView();
1326  if (pTopView)
1327  {
1328  SfxUndoManager& rTopMgr = pTopView->GetEditEngine()->GetUndoManager();
1329  if ( rTopMgr.GetUndoActionCount() == 0 )
1330  rSet.DisableItem( SID_UNDO );
1331  if ( rTopMgr.GetRedoActionCount() == 0 )
1332  rSet.DisableItem( SID_REDO );
1333  }
1334 }
1335 
1337 {
1339  if ( nType == TransliterationFlags::NONE )
1340  return;
1341 
1342  ScInputHandler* pHdl = GetMyInputHdl();
1343  assert(pHdl && "no ScInputHandler");
1344 
1345  EditView* pTopView = pHdl->GetTopView();
1346  EditView* pTableView = pHdl->GetTableView();
1347  assert(pTableView && "no EditView");
1348 
1349  pHdl->DataChanging();
1350 
1351  pTableView->TransliterateText( nType );
1352  if (pTopView)
1353  pTopView->TransliterateText( nType );
1354 
1355  pHdl->DataChanged();
1356 }
1357 
1358 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
OString stripEnd(const OString &rIn, char c)
void SetURL(const OUString &rURL)
SfxViewFrame * GetViewFrame() const
ScInputHandler * GetMyInputHdl()
Definition: editsh.cxx:115
void Adjust()
void SetControlWord(EVControlBits nWord)
#define LANGUAGE_NONE
void PasteSpecial()
OUString GetText(LineEnd eEnd=LINEEND_LF) const
constexpr TypedWhichId< SvxFontItem > EE_CHAR_FONTINFO_CJK(EE_CHAR_START+17)
void SetTargetFrame(const OUString &rFrm)
sal_Int32 nStartPara
static void HideDisabledSlot(SfxItemSet &rSet, SfxBindings &rBindings, sal_uInt16 nSlotId)
Definition: viewutil.cxx:285
ScDocShell * GetDocShell() const
Definition: viewdata.hxx:354
OUString GetWord(sal_Int32 nPara, sal_Int32 nIndex)
ScEditShell(EditView *pView, ScViewData &rData)
Definition: editsh.cxx:91
const SvxURLField * GetURLField()
Definition: editsh.cxx:835
constexpr TypedWhichId< SvxKerningItem > EE_CHAR_KERNING(EE_CHAR_START+12)
static void lclInsertCharacter(EditView *pTableView, EditView *pTopView, sal_Unicode cChar)
Definition: editsh.cxx:149
void PutItemForScriptType(SvtScriptType nScriptType, const SfxPoolItem &rItem)
void Execute(SfxRequest &rReq)
Definition: editsh.cxx:158
#define SFX_IMPL_INTERFACE(Class, SuperClass)
#define EMPTY_OUSTRING
Definition: global.hxx:215
void Cut()
const sal_Unicode CHAR_ZWSP
Definition: global.hxx:66
static void PutItemScript(SfxItemSet &rShellSet, const SfxItemSet &rCoreSet, sal_uInt16 nWhichId, SvtScriptType nScript)
Definition: viewutil.cxx:49
void SetModified()
Definition: inputhdl.hxx:241
const SfxItemSet & GetEmptyItemSet() const
virtual const SfxItemSet * GetOutputItemSet() const =0
std::string GetValue
void SetUpdateMode(bool bUpdate, bool bRestoring=false)
bool IsFormulaMode() const
Definition: inputhdl.hxx:258
const sal_Unicode CHAR_NNBSP
Definition: global.hxx:71
const sal_Unicode CHAR_ZWNBSP
Definition: global.hxx:70
const OUString & GetTargetFrame() const
bool DataChanging(sal_Unicode cTyped=0, bool bFromCommand=false)
Definition: inputhdl.cxx:2572
SfxDispatcher * GetDispatcher()
static SvxAbstractDialogFactory * Create()
void disposeAndClear()
virtual VclPtr< AbstractScNamePasteDlg > CreateScNamePasteDlg(weld::Window *pParent, ScDocShell *pShell)=0
FilterGroup & rTarget
OUString ReplacementString()
void Redo()
constexpr TypedWhichId< SvxPostureItem > EE_CHAR_ITALIC(EE_CHAR_START+7)
static void OpenURL(const OUString &rURL, const OUString &rTarget, bool bIgnoreSettings=false)
Open the specified URL.
Definition: global.cxx:760
void InvalidateItem(sal_uInt16 nWhich)
sal_uInt16 FirstWhich()
const SfxItemSet & GetEmptyItemSet() const
bool HasEditView(ScSplitPos eWhich) const
Definition: viewdata.hxx:564
SCTAB GetTabNo() const
Definition: viewdata.hxx:395
css::uno::Reference< css::datatransfer::clipboard::XClipboard > VCL_DLLPUBLIC GetSystemClipboard()
ScSplitPos GetActivePart() const
Definition: viewdata.hxx:398
void Done(bool bRemove=false)
ScDocument & GetDocument() const
Definition: viewdata.hxx:380
void ChangeFontSize(bool bGrow, const FontList *pList)
void ToggleRel(sal_Int32 nStartPos, sal_Int32 nEndPos)
Definition: reffind.cxx:234
static bool HasThesaurusLanguage(LanguageType nLang)
Definition: scmod.cxx:2230
static SfxObjectShell * Current()
constexpr TypedWhichId< SvxFontItem > ATTR_FONT(100)
virtual SfxUndoManager * GetUndoManager()
const SfxItemSet * GetArgs() const
void Invalidate(sal_uInt16 nId)
void SetWordDelimiters(const OUString &rDelimiters)
virtual short Execute()=0
bool HasStringWeakCharacters(const OUString &rString)
Definition: documen6.cxx:51
void GetUndoState(SfxItemSet &rSet)
Definition: editsh.cxx:1305
static void lcl_RemoveAttribs(EditView &rEditView)
Definition: editsh.cxx:128
bool HasFormat(SotClipboardFormatId nFormat) const
const OUString & GetTargetFrame() const
void SetEditView(EditView *pView)
Definition: editsh.cxx:120
virtual SvxFontItem * Clone(SfxItemPool *pPool=nullptr) const override
SC_DLLPUBLIC formula::FormulaGrammar::AddressConvention GetAddressConvention() const
Definition: documen3.cxx:489
constexpr TypedWhichId< SvxFontHeightItem > EE_CHAR_FONTHEIGHT(EE_CHAR_START+2)
const OUString & GetWordDelimiters() const
SC_DLLPUBLIC SvtScriptType GetStringScriptType(const OUString &rString)
Definition: documen6.cxx:76
sal_uInt16 NextWhich()
EditView * GetTableView()
Definition: inputhdl.hxx:233
SvtScriptType GetSelectedScriptType() const
EditView * GetActiveView()
Definition: inputhdl.cxx:2218
WEIGHT_BOLD
sal_uInt16 sal_Unicode
OUString GetSelectionText(bool bWholeWord)
Definition: editsh.cxx:1231
constexpr::Color COL_TRANSPARENT(0xFF, 0xFF, 0xFF, 0xFF)
bool bPastePossible
Definition: editsh.hxx:43
void SetTargetFrame(const OUString &rTarget)
void Copy()
LINESTYLE_NONE
void SetText(const OUString &rStr)
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
constexpr TypedWhichId< SvxFontItem > EE_CHAR_FONTINFO_CTL(EE_CHAR_START+18)
static void lcl_DisableAll(SfxItemSet &rSet)
Definition: editsh.cxx:713
void TransliterateText(TransliterationFlags nTransliterationMode)
virtual VclPtr< SfxAbstractTabDialog > CreateScCharDlg(weld::Window *pParent, const SfxItemSet *pAttr, const SfxObjectShell *pDocShell, bool bDrawText)=0
int nCount
void libreOfficeKitViewCallback(int nType, const char *pPayload) const override
static TransferableDataHelper CreateFromSystemClipboard(vcl::Window *pWindow)
oslFileHandle & pOut
Mode eMode
void SetUndoManager(SfxUndoManager *pNewUndoMgr)
SotClipboardFormatId
static SvtScriptType GetScriptTypeOfLanguage(LanguageType nLang)
sal_Int32 nEndPos
virtual size_t GetRedoActionCount(bool const i_currentLevel=CurrentLevel) const
STRIKEOUT_SINGLE
constexpr TypedWhichId< SvxContourItem > EE_CHAR_OUTLINE(EE_CHAR_START+8)
TransliterationFlags
constexpr TypedWhichId< SvxWeightItem > EE_CHAR_WEIGHT(EE_CHAR_START+4)
SfxItemPool & GetPool() const
const sal_Unicode CHAR_SHY
Definition: global.hxx:65
ScTabViewShell * GetViewShell() const
Definition: viewdata.hxx:357
exports com.sun.star. text
void InsertField(const SvxFieldItem &rFld)
constexpr TypedWhichId< SvxShadowedItem > EE_CHAR_SHADOW(EE_CHAR_START+9)
const SfxPoolItem * GetItem(sal_uInt16 nSlotId) const
void SelectFieldAtCursor()
sal_Int32 nEndPara
sal_uInt16 ClearItem(sal_uInt16 nWhich=0)
SvtScriptType
const OUString & GetURL() const
void ExecuteTrans(const SfxRequest &rReq)
Definition: editsh.cxx:1336
const SvxFieldData * GetFieldAtCursor() const
SfxItemState GetItemState(sal_uInt16 nWhich, bool bSrchInParent=true, const SfxPoolItem **ppItem=nullptr) const
int i
const SfxPoolItem * GetSlotState(sal_uInt16 nSlotId, const SfxInterface *pIF=nullptr, SfxItemSet *pStateSet=nullptr)
OUString StringToReplace()
const sal_Unicode CHAR_RLM
Definition: global.hxx:68
sal_uInt32 GetTextLen() const
bool bIsInsertMode
Definition: editsh.hxx:44
SfxBindings & GetBindings()
Definition: viewdata.cxx:3034
#define LANGUAGE_SYSTEM
void SetAttribs(const SfxItemSet &rSet)
SfxItemSet GetAttribs()
EditEngine * GetEditEngine() const
#define SC_MOD()
Definition: scmod.hxx:253
void GetClipState(SfxItemSet &rSet)
Definition: editsh.cxx:862
void RepeatDefaults()
Re-apply existing defaults if set, same as in SetText, but without EnableUndo/SetUpdateMode.
Definition: editutil.cxx:631
SfxUndoManager & GetUndoManager()
const OUString & GetValue() const
const T * GetArg(sal_uInt16 nSlotId) const
const sal_Unicode CHAR_NBSP
Definition: global.hxx:64
void SetPool(SfxItemPool *pNewPool)
SvxLinkInsertMode
WEIGHT_NORMAL
LINESTYLE_SINGLE
void ExecuteAttr(SfxRequest &rReq)
Definition: editsh.cxx:923
OUString ScResId(const char *pId)
Definition: scdll.cxx:95
virtual void SetCurPageId(const OString &rName)=0
vcl::Window * GetWindow() const
virtual SotClipboardFormatId GetFormat(const TransferableDataHelper &aHelper)=0
ScGridWindow * GetActiveWin()
Definition: viewdata.cxx:3062
#define LANGUAGE_DONTKNOW
HLINK_FIELD
void RemoveAttribs(bool bRemoveParaAttribs=false, sal_uInt16 nWhich=0)
void Undo()
static void CopyStringTo(const OUString &rContent, const css::uno::Reference< css::datatransfer::clipboard::XClipboard > &rxClipboard, std::function< void(int, const char *)> *callback=nullptr)
const OUString & GetRepresentation() const
void InsertText(const OUString &rNew, bool bSelect=false)
void SetName(const OUString &rName)
static void lcl_InvalidateUnder(SfxBindings &rBindings)
Definition: editsh.cxx:914
ITALIC_NONE
void SetName(const OUString &rName)
weld::Window * GetDialogParent()
Definition: viewdata.cxx:3056
const sal_Unicode CHAR_NBHY
Definition: global.hxx:69
virtual size_t GetUndoActionCount(bool const i_currentLevel=CurrentLevel) const
SfxItemPool * GetPool() const
static void RemoveURLField(EditView &pEditView)
sal_Int32 GetParagraphCount() const
size_t LeaveListAction()
void SetInsertMode(bool bInsert)
virtual void Insert(SotClipboardFormatId nFormat, const OUString &rFormatName)=0
const OUString & GetURL() const
ScAddress GetCurPos() const
Definition: viewdata.cxx:4007
FontLineStyle GetLineStyle() const
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
const sal_Unicode CHAR_LRM
Definition: global.hxx:67
sal_uInt16 GetSlot() const
static const OUString & GetContextName(const Context eContext)
constexpr TypedWhichId< SvxCrossedOutItem > EE_CHAR_STRIKEOUT(EE_CHAR_START+6)
static SC_DLLPUBLIC SvtScriptType GetDefaultScriptType()
Definition: global.cxx:850
HLINK_DEFAULT
std::unique_ptr< char[]> aBuffer
ScViewData & rViewData
Definition: editsh.hxx:41
bool HasRange() const
void GetAttrState(SfxItemSet &rSet)
Definition: editsh.cxx:1159
bool EDITENG_DLLPUBLIC GetStatusValueForThesaurusFromContext(OUString &rStatusVal, LanguageType &rLang, const EditView &rEditView)
static ScTabViewShell * GetActiveViewShell()
Definition: tabvwsh4.cxx:1023
SfxItemState
void DisableItem(sal_uInt16 nWhich)
bool AllowMoreInput(sal_Unicode uChar)
const SfxPoolItem & Get(sal_uInt16 nWhich, bool bSrchInParent=true) const
sal_uInt16 GetWhich(sal_uInt16 nSlot, bool bDeep=true) const
static TransliterationFlags GetTransliterationType(sal_uInt16 nSlotID)
Definition: viewutil.cxx:98
ITALIC_NORMAL
IMPL_LINK(ScEditShell, ClipboardChanged, TransferableDataHelper *, pDataHelper, void)
Definition: editsh.cxx:849
#define GetWhich(nSlot)
constexpr TypedWhichId< SvxEscapementItem > EE_CHAR_ESCAPEMENT(EE_CHAR_START+10)
LINESTYLE_DOTTED
bool GetUpdateMode() const
OUString aName
static SC_DLLPUBLIC ScAbstractDialogFactory * Create()
Definition: scabstdlg.cxx:38
constexpr TypedWhichId< SvxColorItem > EE_CHAR_COLOR(EE_CHAR_START+0)
RET_OK
virtual ~ScEditShell() override
Definition: editsh.cxx:103
constexpr TypedWhichId< SvxOverlineItem > EE_CHAR_OVERLINE(EE_CHAR_START+29)
void QuickSetAttribs(const SfxItemSet &rSet, const ESelection &rSel)
virtual void EnterListAction(const OUString &rComment, const OUString &rRepeatComment, sal_uInt16 nId, ViewShellId nViewShellId)
QPRO_FUNC_TYPE nType
Definition: qproform.cxx:401
constexpr TypedWhichId< SvxFontItem > EE_CHAR_FONTINFO(EE_CHAR_START+1)
void DataChanged(bool bFromTopNotify=false, bool bSetModified=true)
Definition: inputhdl.cxx:2584
EVControlBits
static void ExecuteCharMap(const SvxFontItem &rOldFont, SfxViewFrame &rFrame)
Definition: viewutil.cxx:320
void Invalidate()
void SetSelection(const ESelection &rNewSel)
void AddClipbrdFormat(SotClipboardFormatId nId)
SvxEscapement
constexpr TypedWhichId< SvxUnderlineItem > EE_CHAR_UNDERLINE(EE_CHAR_START+5)
const OUString & GetName() const
void DeleteSelected()
SvxLinkInsertMode GetInsertMode() const
void InvalidateAll(bool bWithMsg)
rtl::Reference< TransferableClipboardListener > mxClipEvtLstnr
Definition: editsh.hxx:42
void AppendItem(const SfxPoolItem &)
SfxObjectShell * GetSfxDocShell() const
Definition: viewdata.hxx:358
ESelection GetSelection() const
constexpr sal_uInt16 EE_FEATURE_FIELD(EE_FEATURE_NOTCONV+1)
const SfxPoolItem * Execute(sal_uInt16 nSlot, SfxCallMode nCall=SfxCallMode::SLOT, const SfxPoolItem **pArgs=nullptr, sal_uInt16 nModi=0, const SfxPoolItem **pInternalArgs=nullptr)
LINESTYLE_DOUBLE
const FontList * GetFontList() const
OUString GetSelected() const
STRIKEOUT_NONE
LanguageType GetInputLanguage() const
FontLineStyle
const css::uno::Reference< css::datatransfer::XTransferable > & GetTransferable() const
void SetSelIsRef(bool bSet)
Definition: inputhdl.hxx:244
void Paste()
static bool IsCursorAtURLField(const EditView &pEditView)
void ExecuteUndo(const SfxRequest &rReq)
Definition: editsh.cxx:1256
void SetContextName(const OUString &rsContextName)
EditView * GetTopView()
Definition: inputhdl.hxx:234
void GetState(SfxItemSet &rSet)
Definition: editsh.cxx:724
const SfxPoolItem * GetItemOfScript(SvtScriptType nScript) const
virtual SfxObjectShell * GetObjectShell()
void EDITENG_DLLPUBLIC ReplaceTextWithSynonym(EditView &rEditView, const OUString &rSynonmText)
virtual std::vector< OUString > GetSelectedNames() const =0
EVControlBits GetControlWord() const
bool IsInsertMode() const
EditView * pEditView
Definition: editsh.hxx:40
#define BTN_PASTE_NAME
Definition: scui_def.hxx:62
sal_Int32 nStartPos
typedef void(CALLTYPE *GetFuncDataPtr)(sal_uInt16 &nNo