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>
25 
26 #include <svx/clipfmtitem.hxx>
27 #include <svx/svxdlg.hxx>
28 #include <editeng/contouritem.hxx>
29 #include <editeng/outliner.hxx>
31 #include <editeng/editeng.hxx>
32 #include <editeng/editview.hxx>
34 #include <editeng/flditem.hxx>
35 #include <editeng/flstitem.hxx>
36 #include <editeng/fontitem.hxx>
38 #include <svx/hlnkitem.hxx>
39 #include <vcl/EnumContext.hxx>
40 #include <editeng/postitem.hxx>
42 #include <editeng/shdditem.hxx>
43 #include <editeng/udlnitem.hxx>
44 #include <editeng/wghtitem.hxx>
45 #include <sfx2/bindings.hxx>
46 #include <sfx2/dispatch.hxx>
47 #include <sfx2/msg.hxx>
48 #include <sfx2/objface.hxx>
49 #include <sfx2/objsh.hxx>
50 #include <sfx2/request.hxx>
51 #include <sfx2/viewfrm.hxx>
52 #include <svtools/cliplistener.hxx>
53 #include <svl/whiter.hxx>
54 #include <sot/formats.hxx>
55 #include <vcl/transfer.hxx>
56 #include <vcl/unohelp2.hxx>
57 #include <svl/stritem.hxx>
58 #include <editeng/colritem.hxx>
59 
60 #include <editsh.hxx>
61 #include <global.hxx>
62 #include <sc.hrc>
63 #include <scmod.hxx>
64 #include <inputhdl.hxx>
65 #include <viewutil.hxx>
66 #include <viewdata.hxx>
67 #include <document.hxx>
68 #include <reffind.hxx>
69 #include <tabvwsh.hxx>
70 #include <editutil.hxx>
71 #include <globstr.hrc>
72 #include <scresid.hxx>
73 #include <gridwin.hxx>
74 
75 #define ShellClass_ScEditShell
76 #include <scslots.hxx>
77 
78 #include <scui_def.hxx>
79 #include <scabstdlg.hxx>
80 #include <memory>
81 
82 using namespace ::com::sun::star;
83 
84 
86 
87 void ScEditShell::InitInterface_Impl()
88 {
89  GetStaticInterface()->RegisterPopupMenu("celledit");
90 }
91 
93  pEditView (pView),
94  rViewData (rData),
95  bPastePossible (false),
96  bIsInsertMode (true)
97 {
100  SetName("EditCell");
102 }
103 
105 {
106  if ( mxClipEvtLstnr.is() )
107  {
108  mxClipEvtLstnr->RemoveListener( rViewData.GetActiveWin() );
109 
110  // The listener may just now be waiting for the SolarMutex and call the link
111  // afterwards, in spite of RemoveListener. So the link has to be reset, too.
112  mxClipEvtLstnr->ClearCallbackLink();
113  }
114 }
115 
117 {
118  return SC_MOD()->GetInputHdl( rViewData.GetViewShell() );
119 }
120 
122 {
123  pEditView = pView;
127 }
128 
129 static void lcl_RemoveAttribs( EditView& rEditView )
130 {
131  ScEditEngineDefaulter* pEngine = static_cast<ScEditEngineDefaulter*>(rEditView.GetEditEngine());
132 
133  bool bOld = pEngine->SetUpdateLayout(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->SetUpdateLayout(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(FN_PARAM_THES_WORD_REPLACE);
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 && pReqArgs->GetItemState(nSlot, true, &pItem) == SfxItemState::SET )
250  if (auto pIntItem = dynamic_cast<const SfxUInt32Item*>( pItem))
251  nFormat = static_cast<SotClipboardFormatId>(pIntItem->GetValue());
252 
253  if ( nFormat != SotClipboardFormatId::NONE )
254  {
255  if (SotClipboardFormatId::STRING == nFormat)
256  pTableView->Paste();
257  else
258  pTableView->PasteSpecial();
259 
260  if (pTopView)
261  pTopView->Paste();
262  }
263  }
264  break;
265 
266  case SID_PASTE_SPECIAL:
267  {
269  ScopedVclPtr<SfxAbstractPasteDialog> pDlg(pFact->CreatePasteDialog(rViewData.GetDialogParent()));
270  SotClipboardFormatId nFormat = SotClipboardFormatId::NONE;
271  pDlg->Insert( SotClipboardFormatId::STRING, OUString() );
272  pDlg->Insert( SotClipboardFormatId::RTF, OUString() );
273  pDlg->Insert( SotClipboardFormatId::RICHTEXT, OUString() );
274  // Do not offer SotClipboardFormatId::STRING_TSVC for
275  // in-cell paste.
276 
277  TransferableDataHelper aDataHelper(
279 
280  nFormat = pDlg->GetFormat( aDataHelper.GetTransferable() );
281  pDlg.disposeAndClear();
282 
283  // while the dialog was open, edit mode may have been stopped
284  if (!SC_MOD()->IsInputMode())
285  return;
286 
287  if (nFormat != SotClipboardFormatId::NONE)
288  {
289  if (SotClipboardFormatId::STRING == nFormat)
290  pTableView->Paste();
291  else
292  pTableView->PasteSpecial();
293 
294  if (pTopView)
295  pTopView->Paste();
296  }
297 
298  if (vcl::Window* pViewWindow = pTopView ? pTopView->GetWindow() : nullptr)
299  pViewWindow->GrabFocus();
300  }
301  break;
302 
303  case SID_PASTE_UNFORMATTED:
304  {
305  pTableView->Paste();
306 
307  if (pTopView)
308  {
309  pTopView->Paste();
310  if (vcl::Window* pViewWindow = pTopView->GetWindow())
311  pViewWindow->GrabFocus();
312  }
313  }
314  break;
315 
316  case SID_SELECTALL:
317  {
318  sal_Int32 nPar = pEngine->GetParagraphCount();
319  if (nPar)
320  {
321  sal_Int32 nLen = pEngine->GetTextLen(nPar-1);
322  pTableView->SetSelection(ESelection(0,0,nPar-1,nLen));
323  if (pTopView)
324  pTopView->SetSelection(ESelection(0,0,nPar-1,nLen));
325  rBindings.Invalidate( SID_ATTR_CHAR_FONT );
326  rBindings.Invalidate( SID_ATTR_CHAR_FONTHEIGHT );
327  rBindings.Invalidate( SID_ATTR_CHAR_WEIGHT );
328  rBindings.Invalidate( SID_ATTR_CHAR_POSTURE );
329  rBindings.Invalidate( SID_ATTR_CHAR_UNDERLINE );
330  rBindings.Invalidate( SID_ATTR_CHAR_STRIKEOUT );
331  rBindings.Invalidate( SID_ATTR_CHAR_SHADOWED );
332  rBindings.Invalidate( SID_ATTR_CHAR_KERNING );
333  rBindings.Invalidate( SID_ATTR_CHAR_COLOR );
334  rBindings.Invalidate( SID_SET_SUPER_SCRIPT );
335  rBindings.Invalidate( SID_SET_SUB_SCRIPT );
336  }
337  }
338  return;
339  case SID_UNICODE_NOTATION_TOGGLE:
340  {
341  EditView* pActiveView = pHdl->GetActiveView();
342  if( pActiveView )
343  {
344  OUString sInput = pEngine->GetText();
345  ESelection aSel( pActiveView->GetSelection() );
346  if( aSel.HasRange() )
347  sInput = pActiveView->GetSelected();
348 
349  if( aSel.nStartPos > aSel.nEndPos )
350  aSel.nEndPos = aSel.nStartPos;
351 
352  //calculate a valid end-position by reading logical characters
353  sal_Int32 nUtf16Pos=0;
354  while( (nUtf16Pos < sInput.getLength()) && (nUtf16Pos < aSel.nEndPos) )
355  {
356  sInput.iterateCodePoints(&nUtf16Pos);
357  if( nUtf16Pos > aSel.nEndPos )
358  aSel.nEndPos = nUtf16Pos;
359  }
360 
361  ToggleUnicodeCodepoint aToggle;
362  while( nUtf16Pos && aToggle.AllowMoreInput( sInput[nUtf16Pos-1]) )
363  --nUtf16Pos;
364  OUString sReplacement = aToggle.ReplacementString();
365  if( !sReplacement.isEmpty() )
366  {
367  aSel.nStartPos = aSel.nEndPos - aToggle.StringToReplace().getLength();
368  pTableView->SetSelection( aSel );
369  pTableView->InsertText(sReplacement, true);
370  if( pTopView )
371  {
372  pTopView->SetSelection( aSel );
373  pTopView->InsertText(sReplacement, true);
374  }
375  }
376  }
377  }
378  break;
379 
380  case SID_CHARMAP:
381  {
382  SvtScriptType nScript = pTableView->GetSelectedScriptType();
383  sal_uInt16 nFontWhich = ( nScript == SvtScriptType::ASIAN ) ? EE_CHAR_FONTINFO_CJK :
384  ( ( nScript == SvtScriptType::COMPLEX ) ? EE_CHAR_FONTINFO_CTL :
386  const SvxFontItem& rItem = static_cast<const SvxFontItem&>(
387  pTableView->GetAttribs().Get(nFontWhich));
388 
389  OUString aString;
390  std::shared_ptr<SvxFontItem> aNewItem(std::make_shared<SvxFontItem>(EE_CHAR_FONTINFO));
391 
392  const SfxItemSet *pArgs = rReq.GetArgs();
393  const SfxPoolItem* pItem = nullptr;
394  if( pArgs )
395  pArgs->GetItemState(SID_CHARMAP, false, &pItem);
396 
397  if ( pItem )
398  {
399  aString = static_cast<const SfxStringItem*>(pItem)->GetValue();
400  const SfxStringItem* pFontItem = pArgs->GetItemIfSet( SID_ATTR_SPECIALCHAR, false);
401  if ( pFontItem )
402  {
403  const OUString& aFontName(pFontItem->GetValue());
404  vcl::Font aFont(aFontName, Size(1,1)); // Size just because CTOR
405  // tdf#125054 see comment in drtxob.cxx, same ID
406  aNewItem = std::make_shared<SvxFontItem>(
407  aFont.GetFamilyType(), aFont.GetFamilyName(),
408  aFont.GetStyleName(), aFont.GetPitch(),
409  aFont.GetCharSet(), ATTR_FONT);
410  }
411  else
412  {
413  aNewItem.reset(rItem.Clone());
414  }
415 
416  // tdf#125054 force Item to correct intended ID
417  aNewItem->SetWhich(EE_CHAR_FONTINFO);
418  }
419  else
420  {
422 
423  // while the dialog was open, edit mode may have been stopped
424  if (!SC_MOD()->IsInputMode())
425  return;
426  }
427 
428  if ( !aString.isEmpty() )
429  {
430  // if string contains WEAK characters, set all fonts
431  SvtScriptType nSetScript;
432  ScDocument& rDoc = rViewData.GetDocument();
433  if ( rDoc.HasStringWeakCharacters( aString ) )
434  nSetScript = SvtScriptType::LATIN | SvtScriptType::ASIAN | SvtScriptType::COMPLEX;
435  else
436  nSetScript = rDoc.GetStringScriptType( aString );
437 
438  SfxItemSet aSet( pTableView->GetEmptyItemSet() );
439  SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONT, GetPool() );
440  aSetItem.PutItemForScriptType( nSetScript, *aNewItem );
441  aSet.Put( aSetItem.GetItemSet(), false );
442 
443  // SetAttribs on the View selects a word, when nothing is selected
444  pTableView->GetEditEngine()->QuickSetAttribs( aSet, pTableView->GetSelection() );
445  pTableView->InsertText(aString);
446  if (pTopView)
447  pTopView->InsertText(aString);
448 
449  SfxStringItem aStringItem( SID_CHARMAP, aString );
450  SfxStringItem aFontItem( SID_ATTR_SPECIALCHAR, aNewItem->GetFamilyName() );
451  rReq.AppendItem( aFontItem );
452  rReq.AppendItem( aStringItem );
453  rReq.Done();
454 
455  }
456 
457  if (vcl::Window* pViewWindow = pTopView ? pTopView->GetWindow() : nullptr)
458  pViewWindow->GrabFocus();
459  }
460  break;
461 
462  case FID_INSERT_NAME:
463  {
465 
467  short nRet = pDlg->Execute();
468  // pDlg is needed below
469 
470  // while the dialog was open, edit mode may have been stopped
471  if (!SC_MOD()->IsInputMode())
472  return;
473 
474  if ( nRet == BTN_PASTE_NAME )
475  {
476  std::vector<OUString> aNames = pDlg->GetSelectedNames();
477  if (!aNames.empty())
478  {
479  OUStringBuffer aBuffer;
480  for (const auto& rName : aNames)
481  {
482  aBuffer.append(rName).append(' ');
483  }
484  const OUString s = aBuffer.makeStringAndClear();
485  pTableView->InsertText(s);
486  if (pTopView)
487  pTopView->InsertText(s);
488  }
489  }
490  pDlg.disposeAndClear();
491 
492  if (vcl::Window* pViewWindow = pTopView ? pTopView->GetWindow() : nullptr)
493  pViewWindow->GrabFocus();
494  }
495  break;
496 
497  case SID_CHAR_DLG_EFFECT:
498  case SID_CHAR_DLG:
499  {
500  SfxItemSet aAttrs( pTableView->GetAttribs() );
501 
503 
505 
507  rViewData.GetDialogParent(), &aAttrs, pObjSh, false));
508  if (nSlot == SID_CHAR_DLG_EFFECT)
509  {
510  pDlg->SetCurPageId("fonteffects");
511  }
512  short nRet = pDlg->Execute();
513  // pDlg is needed below
514 
515  // while the dialog was open, edit mode may have been stopped
516  if (!SC_MOD()->IsInputMode())
517  return;
518 
519  if ( nRet == RET_OK )
520  {
521  const SfxItemSet* pOut = pDlg->GetOutputItemSet();
522  pTableView->SetAttribs( *pOut );
523  }
524  }
525  break;
526 
527  case SID_TOGGLE_REL:
528  {
529  /* TODO: MLFORMULA: this should work also with multi-line formulas. */
530  if (pEngine->GetParagraphCount() == 1)
531  {
532  OUString aText = pEngine->GetText();
533  ESelection aSel = pEditView->GetSelection(); // current View
534 
535  ScDocument& rDoc = rViewData.GetDocument();
536  ScRefFinder aFinder(aText, rViewData.GetCurPos(), rDoc, rDoc.GetAddressConvention());
537  aFinder.ToggleRel( aSel.nStartPos, aSel.nEndPos );
538  if (aFinder.GetFound())
539  {
540  const OUString& aNew = aFinder.GetText();
541  ESelection aNewSel( 0,aFinder.GetSelStart(), 0,aFinder.GetSelEnd() );
542  pEngine->SetText( aNew );
543  pTableView->SetSelection( aNewSel );
544  if ( pTopView )
545  {
546  pTopView->GetEditEngine()->SetText( aNew );
547  pTopView->SetSelection( aNewSel );
548  }
549 
550  // reference is being selected -> do not overwrite when typing
551  bSetSelIsRef = true;
552  }
553  }
554  }
555  break;
556 
557  case SID_HYPERLINK_SETLINK:
558  if( pReqArgs )
559  {
560  const SfxPoolItem* pItem;
561  if ( pReqArgs->GetItemState( SID_HYPERLINK_SETLINK, true, &pItem ) == SfxItemState::SET )
562  {
563  const SvxHyperlinkItem* pHyper = static_cast<const SvxHyperlinkItem*>(pItem);
564  const OUString& rName = pHyper->GetName();
565  const OUString& rURL = pHyper->GetURL();
566  const OUString& rTarget = pHyper->GetTargetFrame();
568 
569  bool bDone = false;
570  if ( eMode == HLINK_DEFAULT || eMode == HLINK_FIELD )
571  {
572  const SvxURLField* pURLField = GetURLField();
573  if ( pURLField )
574  {
575  // select old field
576 
577  ESelection aSel = pTableView->GetSelection();
578  aSel.Adjust();
579  aSel.nEndPara = aSel.nStartPara;
580  aSel.nEndPos = aSel.nStartPos + 1;
581  pTableView->SetSelection( aSel );
582 
583  // insert new field
584 
585  SvxURLField aURLField( rURL, rName, SvxURLFormat::Repr );
586  aURLField.SetTargetFrame( rTarget );
587  SvxFieldItem aURLItem( aURLField, EE_FEATURE_FIELD );
588  pTableView->InsertField( aURLItem );
589  pTableView->SetSelection( aSel ); // select inserted field
590 
591  // now also fields in the Top-View
592 
593  if ( pTopView )
594  {
595  aSel = pTopView->GetSelection();
596  aSel.nEndPara = aSel.nStartPara;
597  aSel.nEndPos = aSel.nStartPos + 1;
598  pTopView->SetSelection( aSel );
599  pTopView->InsertField( aURLItem );
600  pTopView->SetSelection( aSel ); // select inserted field
601  }
602 
603  bDone = true;
604  }
605  }
606 
607  if (!bDone)
608  {
610  InsertURL( rName, rURL, rTarget, static_cast<sal_uInt16>(eMode) );
611 
612  // when "Button", the InsertURL in ViewShell turns the EditShell off
613  // thus the immediate return statement
614  return;
615  }
616  }
617  }
618  break;
619  case SID_OPEN_HYPERLINK:
620  {
621  const SvxURLField* pURLField = GetURLField();
622  if ( pURLField )
623  ScGlobal::OpenURL( pURLField->GetURL(), pURLField->GetTargetFrame(), true );
624  return;
625  }
626  case SID_EDIT_HYPERLINK:
627  {
628  // Ensure the field is selected first
631  SID_HYPERLINK_DIALOG);
632  }
633  break;
634  case SID_COPY_HYPERLINK_LOCATION:
635  {
636  const SvxFieldData* pField = pEditView->GetFieldAtCursor();
637  if (const SvxURLField* pURLField = dynamic_cast<const SvxURLField*>(pField))
638  {
639  uno::Reference<datatransfer::clipboard::XClipboard> xClipboard
640  = pEditView->GetClipboard();
641  vcl::unohelper::TextDataObject::CopyStringTo(pURLField->GetURL(), xClipboard, SfxViewShell::Current());
642  }
643  }
644  break;
645  case SID_REMOVE_HYPERLINK:
646  {
648  }
649  break;
650 
651  case FN_INSERT_SOFT_HYPHEN:
652  lclInsertCharacter( pTableView, pTopView, CHAR_SHY );
653  break;
654  case FN_INSERT_HARDHYPHEN:
655  lclInsertCharacter( pTableView, pTopView, CHAR_NBHY );
656  break;
657  case FN_INSERT_HARD_SPACE:
658  lclInsertCharacter( pTableView, pTopView, CHAR_NBSP );
659  break;
660  case FN_INSERT_NNBSP:
661  lclInsertCharacter( pTableView, pTopView, CHAR_NNBSP );
662  break;
663  case SID_INSERT_RLM:
664  lclInsertCharacter( pTableView, pTopView, CHAR_RLM );
665  break;
666  case SID_INSERT_LRM:
667  lclInsertCharacter( pTableView, pTopView, CHAR_LRM );
668  break;
669  case SID_INSERT_ZWSP:
670  lclInsertCharacter( pTableView, pTopView, CHAR_ZWSP );
671  break;
672  case SID_INSERT_WJ:
673  lclInsertCharacter( pTableView, pTopView, CHAR_WJ );
674  break;
675  case SID_INSERT_FIELD_SHEET:
676  {
677  SvxTableField aField(rViewData.GetTabNo());
678  SvxFieldItem aItem(aField, EE_FEATURE_FIELD);
679  pTableView->InsertField(aItem);
680  }
681  break;
682  case SID_INSERT_FIELD_TITLE:
683  {
684  SvxFileField aField;
685  SvxFieldItem aItem(aField, EE_FEATURE_FIELD);
686  pTableView->InsertField(aItem);
687  }
688  break;
689  case SID_INSERT_FIELD_DATE_VAR:
690  {
691  SvxDateField aField;
692  SvxFieldItem aItem(aField, EE_FEATURE_FIELD);
693  pTableView->InsertField(aItem);
694  }
695  break;
696  }
697 
698  pHdl->DataChanged(false, bSetModified);
699  if (bSetSelIsRef)
700  pHdl->SetSelIsRef(true);
701 }
702 
703 static void lcl_DisableAll( SfxItemSet& rSet ) // disable all slots
704 {
705  SfxWhichIter aIter( rSet );
706  sal_uInt16 nWhich = aIter.FirstWhich();
707  while (nWhich)
708  {
709  rSet.DisableItem( nWhich );
710  nWhich = aIter.NextWhich();
711  }
712 }
713 
715 {
717 }
718 
720 {
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  {
789  bool bDisableEditHyperlink;
791  bDisableEditHyperlink = ShouldDisableEditHyperlink();
792  else
793  {
794  // tdf#140361 if a popup menu was active, use the state as of when the popup was launched and then drop
795  // moAtContextMenu_DisableEditHyperlink
796  bDisableEditHyperlink = *moAtContextMenu_DisableEditHyperlink;
798  }
799 
800  if (bDisableEditHyperlink)
801  rSet.DisableItem (nWhich);
802  }
803  break;
804 
805  case SID_TRANSLITERATE_HALFWIDTH:
806  case SID_TRANSLITERATE_FULLWIDTH:
807  case SID_TRANSLITERATE_HIRAGANA:
808  case SID_TRANSLITERATE_KATAKANA:
809  case SID_INSERT_RLM:
810  case SID_INSERT_LRM:
812  break;
813 
814  case SID_THES:
815  {
816  OUString aStatusVal;
817  LanguageType nLang = LANGUAGE_NONE;
818  bool bIsLookUpWord = pActiveView &&
819  GetStatusValueForThesaurusFromContext(aStatusVal, nLang, *pActiveView);
820  rSet.Put( SfxStringItem( FN_PARAM_THES_WORD_REPLACE, aStatusVal ) );
821 
822  // disable thesaurus context menu entry if there is nothing to look up
823  bool bCanDoThesaurus = ScModule::HasThesaurusLanguage( nLang );
824  if (!bIsLookUpWord || !bCanDoThesaurus)
825  rSet.DisableItem( SID_THES );
826  }
827  break;
828  case SID_INSERT_FIELD_SHEET:
829  case SID_INSERT_FIELD_TITLE:
830  case SID_INSERT_FIELD_DATE_VAR:
831  break;
832  case SID_COPY:
833  case SID_CUT:
834  if (GetObjectShell() && GetObjectShell()->isContentExtractionLocked())
835  {
836  rSet.DisableItem(SID_COPY);
837  rSet.DisableItem(SID_CUT);
838  }
839  break;
840 
841  }
842  nWhich = aIter.NextWhich();
843  }
844 }
845 
847 {
848  ScInputHandler* pHdl = GetMyInputHdl();
849  EditView* pActiveView = pHdl ? pHdl->GetActiveView() : pEditView;
850  if (!pActiveView)
851  return nullptr;
852 
853  const SvxFieldData* pField = pActiveView->GetFieldAtCursor();
854  if (auto pURLField = dynamic_cast<const SvxURLField*>(pField))
855  return pURLField;
856 
857  return nullptr;
858 }
859 
860 IMPL_LINK( ScEditShell, ClipboardChanged, TransferableDataHelper*, pDataHelper, void )
861 {
862  bPastePossible = ( pDataHelper->HasFormat( SotClipboardFormatId::STRING )
863  || pDataHelper->HasFormat( SotClipboardFormatId::RTF )
864  || pDataHelper->HasFormat( SotClipboardFormatId::RICHTEXT ));
865 
866  SfxBindings& rBindings = rViewData.GetBindings();
867  rBindings.Invalidate( SID_PASTE );
868  rBindings.Invalidate( SID_PASTE_SPECIAL );
869  rBindings.Invalidate( SID_PASTE_UNFORMATTED );
870  rBindings.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS );
871 }
872 
874 {
875  // Do not offer SotClipboardFormatId::STRING_TSVC for in-cell paste.
876 
877  if ( !mxClipEvtLstnr.is() )
878  {
879  // create listener
880  mxClipEvtLstnr = new TransferableClipboardListener( LINK( this, ScEditShell, ClipboardChanged ) );
882  mxClipEvtLstnr->AddListener( pWin );
883 
884  // get initial state
886  bPastePossible = ( aDataHelper.HasFormat( SotClipboardFormatId::STRING )
887  || aDataHelper.HasFormat( SotClipboardFormatId::RTF )
888  || aDataHelper.HasFormat( SotClipboardFormatId::RICHTEXT ) );
889  }
890 
891  SfxWhichIter aIter( rSet );
892  sal_uInt16 nWhich = aIter.FirstWhich();
893  while (nWhich)
894  {
895  switch (nWhich)
896  {
897  case SID_PASTE:
898  case SID_PASTE_SPECIAL:
899  case SID_PASTE_UNFORMATTED:
900  if( !bPastePossible )
901  rSet.DisableItem( nWhich );
902  break;
903  case SID_CLIPBOARD_FORMAT_ITEMS:
904  if( bPastePossible )
905  {
906  SvxClipboardFormatItem aFormats( SID_CLIPBOARD_FORMAT_ITEMS );
907  TransferableDataHelper aDataHelper(
909 
910  if ( aDataHelper.HasFormat( SotClipboardFormatId::STRING ) )
911  aFormats.AddClipbrdFormat( SotClipboardFormatId::STRING );
912  if ( aDataHelper.HasFormat( SotClipboardFormatId::RTF ) )
913  aFormats.AddClipbrdFormat( SotClipboardFormatId::RTF );
914 
915  rSet.Put( aFormats );
916  }
917  else
918  rSet.DisableItem( nWhich );
919  break;
920  }
921  nWhich = aIter.NextWhich();
922  }
923 }
924 
925 static void lcl_InvalidateUnder( SfxBindings& rBindings )
926 {
927  rBindings.Invalidate( SID_ATTR_CHAR_UNDERLINE );
928  rBindings.Invalidate( SID_ULINE_VAL_NONE );
929  rBindings.Invalidate( SID_ULINE_VAL_SINGLE );
930  rBindings.Invalidate( SID_ULINE_VAL_DOUBLE );
931  rBindings.Invalidate( SID_ULINE_VAL_DOTTED );
932 }
933 
935 {
937  SfxBindings& rBindings = rViewData.GetBindings();
938  const SfxItemSet* pArgs = rReq.GetArgs();
939  sal_uInt16 nSlot = rReq.GetSlot();
940 
941  switch ( nSlot )
942  {
943  case SID_ATTR_CHAR_FONTHEIGHT:
944  case SID_ATTR_CHAR_FONT:
945  {
946  if (pArgs)
947  {
948  // #i78017 establish the same behaviour as in Writer
949  SvtScriptType nScript = SvtScriptType::LATIN | SvtScriptType::ASIAN | SvtScriptType::COMPLEX;
950  if (nSlot == SID_ATTR_CHAR_FONT)
951  {
952  nScript = pEditView->GetSelectedScriptType();
953  if (nScript == SvtScriptType::NONE) nScript = ScGlobal::GetDefaultScriptType();
954  }
955 
956  SfxItemPool& rPool = GetPool();
957  SvxScriptSetItem aSetItem( nSlot, rPool );
958  sal_uInt16 nWhich = rPool.GetWhich( nSlot );
959  aSetItem.PutItemForScriptType( nScript, pArgs->Get( nWhich ) );
960 
961  aSet.Put( aSetItem.GetItemSet(), false );
962  }
963  }
964  break;
965 
966  case SID_ATTR_CHAR_COLOR:
967  {
968  if (pArgs)
969  {
970  if ( const SfxStringItem* pColorStringItem = pArgs->GetItemIfSet( SID_ATTR_COLOR_STR, false ) )
971  {
972  Color aColor;
973  OUString sColor = pColorStringItem->GetValue();
974  if ( sColor == "transparent" )
975  aColor = COL_TRANSPARENT;
976  else
977  aColor = Color( ColorTransparency, sColor.toInt32( 16 ) );
978 
979  aSet.Put( SvxColorItem( aColor, EE_CHAR_COLOR ) );
980  }
981  else
982  {
983  aSet.Put( pArgs->Get( pArgs->GetPool()->GetWhich( nSlot ) ) );
984  }
985  rBindings.Invalidate( nSlot );
986  }
987  }
988  break;
989 
990  // Toggles
991 
992  case SID_ATTR_CHAR_WEIGHT:
993  {
994  // #i78017 establish the same behaviour as in Writer
995  SvtScriptType nScript = SvtScriptType::LATIN | SvtScriptType::ASIAN | SvtScriptType::COMPLEX;
996 
997  SfxItemPool& rPool = GetPool();
998 
999  bool bOld = false;
1000  SvxScriptSetItem aOldSetItem( nSlot, rPool );
1001  aOldSetItem.GetItemSet().Put( pEditView->GetAttribs(), false );
1002  const SfxPoolItem* pCore = aOldSetItem.GetItemOfScript( nScript );
1003  if ( pCore && static_cast<const SvxWeightItem*>(pCore)->GetWeight() > WEIGHT_NORMAL )
1004  bOld = true;
1005 
1006  SvxScriptSetItem aSetItem( nSlot, rPool );
1007  aSetItem.PutItemForScriptType( nScript,
1009  aSet.Put( aSetItem.GetItemSet(), false );
1010 
1011  rBindings.Invalidate( nSlot );
1012  }
1013  break;
1014 
1015  case SID_ATTR_CHAR_POSTURE:
1016  {
1017  // #i78017 establish the same behaviour as in Writer
1018  SvtScriptType nScript = SvtScriptType::LATIN | SvtScriptType::ASIAN | SvtScriptType::COMPLEX;
1019 
1020  SfxItemPool& rPool = GetPool();
1021 
1022  bool bOld = false;
1023  SvxScriptSetItem aOldSetItem( nSlot, rPool );
1024  aOldSetItem.GetItemSet().Put( pEditView->GetAttribs(), false );
1025  const SfxPoolItem* pCore = aOldSetItem.GetItemOfScript( nScript );
1026  if ( pCore && static_cast<const SvxPostureItem*>(pCore)->GetValue() != ITALIC_NONE )
1027  bOld = true;
1028 
1029  SvxScriptSetItem aSetItem( nSlot, rPool );
1030  aSetItem.PutItemForScriptType( nScript,
1032  aSet.Put( aSetItem.GetItemSet(), false );
1033 
1034  rBindings.Invalidate( nSlot );
1035  }
1036  break;
1037 
1038  case SID_ULINE_VAL_NONE:
1040  lcl_InvalidateUnder( rBindings );
1041  break;
1042 
1043  case SID_ATTR_CHAR_UNDERLINE:
1044  case SID_ULINE_VAL_SINGLE:
1045  case SID_ULINE_VAL_DOUBLE:
1046  case SID_ULINE_VAL_DOTTED:
1047  {
1048  FontLineStyle eOld = pEditView->GetAttribs().Get(EE_CHAR_UNDERLINE).GetLineStyle();
1049  FontLineStyle eNew = eOld;
1050  switch (nSlot)
1051  {
1052  case SID_ATTR_CHAR_UNDERLINE:
1053  if ( pArgs )
1054  {
1055  const SvxTextLineItem& rTextLineItem = static_cast< const SvxTextLineItem& >( pArgs->Get( pArgs->GetPool()->GetWhich(nSlot) ) );
1056  eNew = rTextLineItem.GetLineStyle();
1057  }
1058  else
1059  {
1060  eNew = ( eOld != LINESTYLE_NONE ) ? LINESTYLE_NONE : LINESTYLE_SINGLE;
1061  }
1062  break;
1063  case SID_ULINE_VAL_SINGLE:
1064  eNew = ( eOld == LINESTYLE_SINGLE ) ? LINESTYLE_NONE : LINESTYLE_SINGLE;
1065  break;
1066  case SID_ULINE_VAL_DOUBLE:
1067  eNew = ( eOld == LINESTYLE_DOUBLE ) ? LINESTYLE_NONE : LINESTYLE_DOUBLE;
1068  break;
1069  case SID_ULINE_VAL_DOTTED:
1070  eNew = ( eOld == LINESTYLE_DOTTED ) ? LINESTYLE_NONE : LINESTYLE_DOTTED;
1071  break;
1072  }
1073  aSet.Put( SvxUnderlineItem( eNew, EE_CHAR_UNDERLINE ) );
1074  lcl_InvalidateUnder( rBindings );
1075  }
1076  break;
1077 
1078  case SID_ATTR_CHAR_OVERLINE:
1079  {
1080  FontLineStyle eOld = pEditView->GetAttribs().Get(EE_CHAR_OVERLINE).GetLineStyle();
1082  aSet.Put( SvxOverlineItem( eNew, EE_CHAR_OVERLINE ) );
1083  rBindings.Invalidate( nSlot );
1084  }
1085  break;
1086 
1087  case SID_ATTR_CHAR_STRIKEOUT:
1088  {
1089  bool bOld = pEditView->GetAttribs().Get(EE_CHAR_STRIKEOUT).GetValue() != STRIKEOUT_NONE;
1091  rBindings.Invalidate( nSlot );
1092  }
1093  break;
1094 
1095  case SID_ATTR_CHAR_SHADOWED:
1096  {
1097  bool bOld = pEditView->GetAttribs().Get(EE_CHAR_SHADOW).GetValue();
1098  aSet.Put( SvxShadowedItem( !bOld, EE_CHAR_SHADOW ) );
1099  rBindings.Invalidate( nSlot );
1100  }
1101  break;
1102 
1103  case SID_ATTR_CHAR_CONTOUR:
1104  {
1105  bool bOld = pEditView->GetAttribs().Get(EE_CHAR_OUTLINE).GetValue();
1106  aSet.Put( SvxContourItem( !bOld, EE_CHAR_OUTLINE ) );
1107  rBindings.Invalidate( nSlot );
1108  }
1109  break;
1110 
1111  case SID_SET_SUPER_SCRIPT:
1112  {
1113  SvxEscapement eOld = static_cast<SvxEscapement>(pEditView->GetAttribs().Get(EE_CHAR_ESCAPEMENT).GetEnumValue());
1114  SvxEscapement eNew = (eOld == SvxEscapement::Superscript) ?
1115  SvxEscapement::Off : SvxEscapement::Superscript;
1116  aSet.Put( SvxEscapementItem( eNew, EE_CHAR_ESCAPEMENT ) );
1117  rBindings.Invalidate( nSlot );
1118  }
1119  break;
1120  case SID_SET_SUB_SCRIPT:
1121  {
1122  SvxEscapement eOld = static_cast<SvxEscapement>(pEditView->GetAttribs().Get(EE_CHAR_ESCAPEMENT).GetEnumValue());
1123  SvxEscapement eNew = (eOld == SvxEscapement::Subscript) ?
1124  SvxEscapement::Off : SvxEscapement::Subscript;
1125  aSet.Put( SvxEscapementItem( eNew, EE_CHAR_ESCAPEMENT ) );
1126  rBindings.Invalidate( nSlot );
1127  }
1128  break;
1129  case SID_ATTR_CHAR_KERNING:
1130  {
1131  if(pArgs)
1132  {
1133  aSet.Put ( pArgs->Get(pArgs->GetPool()->GetWhich(nSlot)));
1134  rBindings.Invalidate( nSlot );
1135  }
1136  }
1137  break;
1138 
1139  case SID_GROW_FONT_SIZE:
1140  case SID_SHRINK_FONT_SIZE:
1141  {
1142  const SvxFontListItem* pFontListItem = static_cast< const SvxFontListItem* >
1143  ( SfxObjectShell::Current()->GetItem( SID_ATTR_CHAR_FONTLIST ) );
1144  const FontList* pFontList = pFontListItem ? pFontListItem->GetFontList() : nullptr;
1145  pEditView->ChangeFontSize( nSlot == SID_GROW_FONT_SIZE, pFontList );
1146  rBindings.Invalidate( SID_ATTR_CHAR_FONTHEIGHT );
1147  }
1148  break;
1149  }
1150 
1151  // apply
1152 
1153  EditEngine* pEngine = pEditView->GetEditEngine();
1154  bool bOld = pEngine->SetUpdateLayout(false);
1155 
1156  pEditView->SetAttribs( aSet );
1157 
1158  pEngine->SetUpdateLayout(bOld);
1159  pEditView->Invalidate();
1160 
1161  ScInputHandler* pHdl = GetMyInputHdl();
1162  pHdl->SetModified();
1163 
1164  rReq.Done();
1165 }
1166 
1168 {
1170  {
1171  lcl_DisableAll( rSet );
1172  return;
1173  }
1174 
1175  SfxItemSet aAttribs = pEditView->GetAttribs();
1176  rSet.Put( aAttribs );
1177 
1178  // choose font info according to selection script type
1179 
1181  if (nScript == SvtScriptType::NONE) nScript = ScGlobal::GetDefaultScriptType();
1182 
1183  // #i55929# input-language-dependent script type (depends on input language if nothing selected)
1184  SvtScriptType nInputScript = nScript;
1185  if ( !pEditView->GetSelection().HasRange() )
1186  {
1188  if (nInputLang != LANGUAGE_DONTKNOW && nInputLang != LANGUAGE_SYSTEM)
1189  nInputScript = SvtLanguageOptions::GetScriptTypeOfLanguage( nInputLang );
1190  }
1191 
1192  // #i55929# according to spec, nInputScript is used for font and font height only
1193  if ( rSet.GetItemState( EE_CHAR_FONTINFO ) != SfxItemState::UNKNOWN )
1194  ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_FONTINFO, nInputScript );
1195  if ( rSet.GetItemState( EE_CHAR_FONTHEIGHT ) != SfxItemState::UNKNOWN )
1196  ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_FONTHEIGHT, nInputScript );
1197  if ( rSet.GetItemState( EE_CHAR_WEIGHT ) != SfxItemState::UNKNOWN )
1198  ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_WEIGHT, nScript );
1199  if ( rSet.GetItemState( EE_CHAR_ITALIC ) != SfxItemState::UNKNOWN )
1200  ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_ITALIC, nScript );
1201 
1202  // underline
1203  SfxItemState eState = aAttribs.GetItemState( EE_CHAR_UNDERLINE );
1204  if ( eState == SfxItemState::DONTCARE )
1205  {
1206  rSet.InvalidateItem( SID_ULINE_VAL_NONE );
1207  rSet.InvalidateItem( SID_ULINE_VAL_SINGLE );
1208  rSet.InvalidateItem( SID_ULINE_VAL_DOUBLE );
1209  rSet.InvalidateItem( SID_ULINE_VAL_DOTTED );
1210  }
1211  else
1212  {
1213  FontLineStyle eUnderline = aAttribs.Get(EE_CHAR_UNDERLINE).GetLineStyle();
1214  rSet.Put(SfxBoolItem(SID_ULINE_VAL_SINGLE, eUnderline == LINESTYLE_SINGLE));
1215  rSet.Put(SfxBoolItem(SID_ULINE_VAL_DOUBLE, eUnderline == LINESTYLE_DOUBLE));
1216  rSet.Put(SfxBoolItem(SID_ULINE_VAL_DOTTED, eUnderline == LINESTYLE_DOTTED));
1217  rSet.Put(SfxBoolItem(SID_ULINE_VAL_NONE, eUnderline == LINESTYLE_NONE));
1218  }
1219 
1221  ScInputHandler* pHdl = GetMyInputHdl();
1222  if ( pHdl && pHdl->IsFormulaMode() )
1223  rSet.ClearItem( EE_CHAR_WEIGHT ); // Highlighted brace not here
1224 
1225  SvxEscapement eEsc = static_cast<SvxEscapement>(aAttribs.Get( EE_CHAR_ESCAPEMENT ).GetEnumValue());
1226  rSet.Put(SfxBoolItem(SID_SET_SUPER_SCRIPT, eEsc == SvxEscapement::Superscript));
1227  rSet.Put(SfxBoolItem(SID_SET_SUB_SCRIPT, eEsc == SvxEscapement::Subscript));
1228  rViewData.GetBindings().Invalidate( SID_SET_SUPER_SCRIPT );
1229  rViewData.GetBindings().Invalidate( SID_SET_SUB_SCRIPT );
1230 
1231  eState = aAttribs.GetItemState( EE_CHAR_KERNING );
1232  rViewData.GetBindings().Invalidate( SID_ATTR_CHAR_KERNING );
1233  if ( eState == SfxItemState::DONTCARE )
1234  {
1236  }
1237 }
1238 
1239 OUString ScEditShell::GetSelectionText( bool bWholeWord )
1240 {
1241  OUString aStrSelection;
1242 
1244  {
1245  if ( bWholeWord )
1246  {
1247  EditEngine* pEngine = pEditView->GetEditEngine();
1248  ESelection aSel = pEditView->GetSelection();
1249  OUString aStrCurrentDelimiters = pEngine->GetWordDelimiters();
1250 
1251  pEngine->SetWordDelimiters(" .,;\"'");
1252  aStrSelection = pEngine->GetWord( aSel.nEndPara, aSel.nEndPos );
1253  pEngine->SetWordDelimiters( aStrCurrentDelimiters );
1254  }
1255  else
1256  {
1257  aStrSelection = pEditView->GetSelected();
1258  }
1259  }
1260 
1261  return aStrSelection;
1262 }
1263 
1265 {
1266  // Undo must be handled here because it's called for both EditViews
1267 
1268  ScInputHandler* pHdl = GetMyInputHdl();
1269  OSL_ENSURE(pHdl,"no ScInputHandler");
1270  EditView* pTopView = pHdl->GetTopView();
1271  EditView* pTableView = pHdl->GetTableView();
1272  OSL_ENSURE(pTableView,"no EditView");
1273 
1274  pHdl->DataChanging();
1275 
1276  const SfxItemSet* pReqArgs = rReq.GetArgs();
1277  sal_uInt16 nSlot = rReq.GetSlot();
1278  switch ( nSlot )
1279  {
1280  case SID_UNDO:
1281  case SID_REDO:
1282  {
1283  bool bIsUndo = ( nSlot == SID_UNDO );
1284 
1285  sal_uInt16 nCount = 1;
1286  const SfxPoolItem* pItem;
1287  if ( pReqArgs && pReqArgs->GetItemState( nSlot, true, &pItem ) == SfxItemState::SET )
1288  nCount = static_cast<const SfxUInt16Item*>(pItem)->GetValue();
1289 
1290  for (sal_uInt16 i=0; i<nCount; i++)
1291  {
1292  if ( bIsUndo )
1293  {
1294  pTableView->Undo();
1295  if (pTopView)
1296  pTopView->Undo();
1297  }
1298  else
1299  {
1300  pTableView->Redo();
1301  if (pTopView)
1302  pTopView->Redo();
1303  }
1304  }
1305  }
1306  break;
1307  }
1309 
1310  pHdl->DataChanged();
1311 }
1312 
1314 {
1315  // Undo state is taken from normal ViewFrame state function
1316 
1318  if ( pViewFrm && GetUndoManager() )
1319  {
1320  SfxWhichIter aIter(rSet);
1321  sal_uInt16 nWhich = aIter.FirstWhich();
1322  while( nWhich )
1323  {
1324  pViewFrm->GetSlotState( nWhich, nullptr, &rSet );
1325  nWhich = aIter.NextWhich();
1326  }
1327  }
1328 
1329  // disable if no action in input line EditView
1330 
1331  ScInputHandler* pHdl = GetMyInputHdl();
1332  OSL_ENSURE(pHdl,"no ScInputHandler");
1333  EditView* pTopView = pHdl->GetTopView();
1334  if (pTopView)
1335  {
1336  SfxUndoManager& rTopMgr = pTopView->GetEditEngine()->GetUndoManager();
1337  if ( rTopMgr.GetUndoActionCount() == 0 )
1338  rSet.DisableItem( SID_UNDO );
1339  if ( rTopMgr.GetRedoActionCount() == 0 )
1340  rSet.DisableItem( SID_REDO );
1341  }
1342 }
1343 
1345 {
1347  if ( nType == TransliterationFlags::NONE )
1348  return;
1349 
1350  ScInputHandler* pHdl = GetMyInputHdl();
1351  assert(pHdl && "no ScInputHandler");
1352 
1353  EditView* pTopView = pHdl->GetTopView();
1354  EditView* pTableView = pHdl->GetTableView();
1355  assert(pTableView && "no EditView");
1356 
1357  pHdl->DataChanging();
1358 
1359  pTableView->TransliterateText( nType );
1360  if (pTopView)
1361  pTopView->TransliterateText( nType );
1362 
1363  pHdl->DataChanged();
1364 }
1365 
1366 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
OString stripEnd(const OString &rIn, char c)
void SetURL(const OUString &rURL)
SfxViewFrame * GetViewFrame() const
css::uno::Reference< css::datatransfer::clipboard::XClipboard > GetClipboard() const
ScInputHandler * GetMyInputHdl()
Definition: editsh.cxx:116
void Adjust()
void SetControlWord(EVControlBits nWord)
#define LANGUAGE_NONE
void PasteSpecial()
OUString GetText(LineEnd eEnd=LINEEND_LF) const
static void CopyStringTo(const OUString &rContent, const css::uno::Reference< css::datatransfer::clipboard::XClipboard > &rxClipboard, const vcl::ILibreOfficeKitNotifier *pNotifier=nullptr)
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:284
ScDocShell * GetDocShell() const
Definition: viewdata.hxx:354
OUString GetWord(sal_Int32 nPara, sal_Int32 nIndex)
ScEditShell(EditView *pView, ScViewData &rData)
Definition: editsh.cxx:92
const T * GetItemIfSet(TypedWhichId< T > nWhich, bool bSrchInParent=true) const
const SvxURLField * GetURLField()
Definition: editsh.cxx:846
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)
OUString ScResId(TranslateId aId)
Definition: scdll.cxx:90
void Cut()
const sal_Unicode CHAR_ZWSP
Definition: global.hxx:68
static void PutItemScript(SfxItemSet &rShellSet, const SfxItemSet &rCoreSet, sal_uInt16 nWhichId, SvtScriptType nScript)
Definition: viewutil.cxx:50
void SetModified()
Definition: inputhdl.hxx:245
const SfxItemSet & GetEmptyItemSet() const
virtual const SfxItemSet * GetOutputItemSet() const =0
std::string GetValue
bool IsFormulaMode() const
Definition: inputhdl.hxx:262
const sal_Unicode CHAR_NNBSP
Definition: global.hxx:73
const OUString & GetTargetFrame() const
bool DataChanging(sal_Unicode cTyped=0, bool bFromCommand=false)
Definition: inputhdl.cxx:2676
SfxDispatcher * GetDispatcher()
static SvxAbstractDialogFactory * Create()
constexpr::Color COL_TRANSPARENT(ColorTransparency, 0xFF, 0xFF, 0xFF, 0xFF)
const sal_Unicode CHAR_WJ
Definition: global.hxx:72
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:770
void InvalidateItem(sal_uInt16 nWhich)
sal_uInt16 FirstWhich()
const SfxItemSet & GetEmptyItemSet() const
bool HasEditView(ScSplitPos eWhich) const
Definition: viewdata.hxx:582
SCTAB GetTabNo() const
Definition: viewdata.hxx:395
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:2279
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:1313
static void lcl_RemoveAttribs(EditView &rEditView)
Definition: editsh.cxx:129
bool HasFormat(SotClipboardFormatId nFormat) const
const OUString & GetTargetFrame() const
void SetEditView(EditView *pView)
Definition: editsh.cxx:121
virtual SvxFontItem * Clone(SfxItemPool *pPool=nullptr) const override
SC_DLLPUBLIC formula::FormulaGrammar::AddressConvention GetAddressConvention() const
Definition: documen3.cxx:494
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:237
SvtScriptType GetSelectedScriptType() const
EditView * GetActiveView()
Definition: inputhdl.cxx:2323
WEIGHT_BOLD
SvtScriptType
sal_uInt16 sal_Unicode
OUString GetSelectionText(bool bWholeWord)
Definition: editsh.cxx:1239
bool bPastePossible
Definition: editsh.hxx:42
void SetTargetFrame(const OUString &rTarget)
void Copy()
constexpr TypedWhichId< SvxFieldItem > EE_FEATURE_FIELD(EE_FEATURE_NOTCONV+1)
LINESTYLE_NONE
void SetText(const OUString &rStr)
constexpr TypedWhichId< SvxFontItem > EE_CHAR_FONTINFO_CTL(EE_CHAR_START+18)
static void lcl_DisableAll(SfxItemSet &rSet)
Definition: editsh.cxx:703
void TransliterateText(TransliterationFlags nTransliterationMode)
virtual VclPtr< SfxAbstractTabDialog > CreateScCharDlg(weld::Window *pParent, const SfxItemSet *pAttr, const SfxObjectShell *pDocShell, bool bDrawText)=0
int nCount
static SfxViewShell * Current()
static TransferableDataHelper CreateFromSystemClipboard(vcl::Window *pWindow)
oslFileHandle & pOut
Mode eMode
void SetUndoManager(SfxUndoManager *pNewUndoMgr)
SotClipboardFormatId
sal_Int32 nEndPos
virtual size_t GetRedoActionCount(bool const i_currentLevel=CurrentLevel) const
STRIKEOUT_SINGLE
sal_Int32 GetTextLen() const
const OUStringLiteral sColor
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:67
ScTabViewShell * GetViewShell() const
Definition: viewdata.hxx:357
void InsertField(const SvxFieldItem &rFld)
constexpr TypedWhichId< SvxShadowedItem > EE_CHAR_SHADOW(EE_CHAR_START+9)
const SfxPoolItem * GetItem(sal_uInt16 nSlotId) const
void SelectFieldAtCursor()
std::optional< bool > moAtContextMenu_DisableEditHyperlink
Definition: editsh.hxx:49
sal_Int32 nEndPara
sal_uInt16 ClearItem(sal_uInt16 nWhich=0)
const OUString & GetURL() const
void ExecuteTrans(const SfxRequest &rReq)
Definition: editsh.cxx:1344
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:70
bool bIsInsertMode
Definition: editsh.hxx:43
SfxBindings & GetBindings()
Definition: viewdata.cxx:3123
#define LANGUAGE_SYSTEM
void SetAttribs(const SfxItemSet &rSet)
SfxItemSet GetAttribs()
EditEngine * GetEditEngine() const
#define SC_MOD()
Definition: scmod.hxx:249
void GetClipState(SfxItemSet &rSet)
Definition: editsh.cxx:873
void RepeatDefaults()
Re-apply existing defaults if set, same as in SetText, but without EnableUndo/SetUpdateMode.
Definition: editutil.cxx:656
SfxUndoManager & GetUndoManager()
const OUString & GetValue() const
const T * GetArg(sal_uInt16 nSlotId) const
const sal_Unicode CHAR_NBSP
Definition: global.hxx:66
void SetPool(SfxItemPool *pNewPool)
SvxLinkInsertMode
WEIGHT_NORMAL
LINESTYLE_SINGLE
void ExecuteAttr(SfxRequest &rReq)
Definition: editsh.cxx:934
virtual void SetCurPageId(const OString &rName)=0
void EnableEditHyperlink()
force "Edit Hyperlink" to true, with the expectation that SID_EDIT_HYPERLINK is later Invalidated to ...
Definition: editsh.cxx:719
vcl::Window * GetWindow() const
virtual SotClipboardFormatId GetFormat(const TransferableDataHelper &aHelper)=0
SvtScriptType GetScriptTypeOfLanguage(LanguageType nLang)
ScGridWindow * GetActiveWin()
Definition: viewdata.cxx:3151
#define LANGUAGE_DONTKNOW
bool ShouldDisableEditHyperlink() const
return true if "Edit Hyperlink" in context menu should be disabled
Definition: editsh.cxx:714
HLINK_FIELD
void RemoveAttribs(bool bRemoveParaAttribs=false, sal_uInt16 nWhich=0)
void Undo()
const OUString & GetRepresentation() const
ColorTransparency
void SetName(const OUString &rName)
static void lcl_InvalidateUnder(SfxBindings &rBindings)
Definition: editsh.cxx:925
ITALIC_NONE
void SetName(const OUString &rName)
weld::Window * GetDialogParent()
Definition: viewdata.cxx:3145
const sal_Unicode CHAR_NBHY
Definition: global.hxx:71
virtual size_t GetUndoActionCount(bool const i_currentLevel=CurrentLevel) const
SfxItemPool * GetPool() const
static void RemoveURLField(EditView &pEditView)
sal_Int32 GetParagraphCount() const
bool SetUpdateLayout(bool bUpdate, bool bRestoring=false)
size_t LeaveListAction()
void SetInsertMode(bool bInsert)
void InsertText(const OUString &rNew, bool bSelect=false, bool bLOKShowSelect=true)
virtual void Insert(SotClipboardFormatId nFormat, const OUString &rFormatName)=0
const OUString & GetURL() const
ScAddress GetCurPos() const
Definition: viewdata.cxx:4121
FontLineStyle GetLineStyle() const
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
const sal_Unicode CHAR_LRM
Definition: global.hxx:69
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:860
HLINK_DEFAULT
std::unique_ptr< char[]> aBuffer
ScViewData & rViewData
Definition: editsh.hxx:40
bool HasRange() const
void GetAttrState(SfxItemSet &rSet)
Definition: editsh.cxx:1167
bool EDITENG_DLLPUBLIC GetStatusValueForThesaurusFromContext(OUString &rStatusVal, LanguageType &rLang, const EditView &rEditView)
static ScTabViewShell * GetActiveViewShell()
Definition: tabvwsh4.cxx:1075
SfxItemState
void DisableItem(sal_uInt16 nWhich)
bool AllowMoreInput(sal_Unicode uChar)
const SfxPoolItem & Get(sal_uInt16 nWhich, bool bSrchInParent=true) const
static void ExecuteCharMap(const SvxFontItem &rOldFont, const ScTabViewShell &rShell)
Definition: viewutil.cxx:318
sal_uInt16 GetWhich(sal_uInt16 nSlot, bool bDeep=true) const
static TransliterationFlags GetTransliterationType(sal_uInt16 nSlotID)
Definition: viewutil.cxx:99
ITALIC_NORMAL
IMPL_LINK(ScEditShell, ClipboardChanged, TransferableDataHelper *, pDataHelper, void)
Definition: editsh.cxx:860
constexpr TypedWhichId< SvxEscapementItem > EE_CHAR_ESCAPEMENT(EE_CHAR_START+10)
LINESTYLE_DOTTED
OUString aName
static SC_DLLPUBLIC ScAbstractDialogFactory * Create()
Definition: scabstdlg.cxx:37
constexpr TypedWhichId< SvxColorItem > EE_CHAR_COLOR(EE_CHAR_START+0)
RET_OK
virtual ~ScEditShell() override
Definition: editsh.cxx:104
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:398
constexpr TypedWhichId< SvxFontItem > EE_CHAR_FONTINFO(EE_CHAR_START+1)
void DataChanged(bool bFromTopNotify=false, bool bSetModified=true)
Definition: inputhdl.cxx:2688
EVControlBits
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:41
void AppendItem(const SfxPoolItem &)
SfxObjectShell * GetSfxDocShell() const
Definition: viewdata.hxx:358
ESelection GetSelection() const
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:248
void Paste()
static bool IsCursorAtURLField(const EditView &pEditView)
void ExecuteUndo(const SfxRequest &rReq)
Definition: editsh.cxx:1264
void SetContextName(const OUString &rsContextName)
EditView * GetTopView()
Definition: inputhdl.hxx:238
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
bool m_bDetectedRangeSegmentation false
EditView * pEditView
Definition: editsh.hxx:39
#define BTN_PASTE_NAME
Definition: scui_def.hxx:61
sal_Int32 nStartPos
typedef void(CALLTYPE *GetFuncDataPtr)(sal_uInt16 &nNo