File: | home/maarten/src/libreoffice/core/sc/source/ui/view/editsh.cxx |
Warning: | line 789, column 26 Forming reference to null pointer |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
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> | |||
29 | #include <editeng/crossedoutitem.hxx> | |||
30 | #include <editeng/editeng.hxx> | |||
31 | #include <editeng/editview.hxx> | |||
32 | #include <editeng/escapementitem.hxx> | |||
33 | #include <editeng/flditem.hxx> | |||
34 | #include <editeng/flstitem.hxx> | |||
35 | #include <editeng/fontitem.hxx> | |||
36 | #include <editeng/urlfieldhelper.hxx> | |||
37 | #include <svx/hlnkitem.hxx> | |||
38 | #include <vcl/EnumContext.hxx> | |||
39 | #include <editeng/postitem.hxx> | |||
40 | #include <editeng/scripttypeitem.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 | ||||
84 | SFX_IMPL_INTERFACE(ScEditShell, SfxShell)SfxInterface* ScEditShell::pInterface = nullptr; SfxInterface * ScEditShell::GetStaticInterface() { if ( !pInterface ) { pInterface = new SfxInterface( "ScEditShell", false, GetInterfaceId(), SfxShell ::GetStaticInterface(), aScEditShellSlots_Impl[0], sal_uInt16 (sizeof(aScEditShellSlots_Impl) / sizeof(SfxSlot) ) ); InitInterface_Impl (); } return pInterface; } SfxInterface* ScEditShell::GetInterface () const { return GetStaticInterface(); } void ScEditShell::RegisterInterface (const SfxModule* pMod) { GetStaticInterface()->Register(pMod ); } | |||
85 | ||||
86 | void ScEditShell::InitInterface_Impl() | |||
87 | { | |||
88 | GetStaticInterface()->RegisterPopupMenu("celledit"); | |||
89 | } | |||
90 | ||||
91 | ScEditShell::ScEditShell(EditView* pView, ScViewData& rData) : | |||
92 | pEditView (pView), | |||
93 | rViewData (rData), | |||
94 | bPastePossible (false), | |||
95 | bIsInsertMode (true) | |||
96 | { | |||
97 | SetPool( pEditView->GetEditEngine()->GetEmptyItemSet().GetPool() ); | |||
98 | SetUndoManager( &pEditView->GetEditEngine()->GetUndoManager() ); | |||
99 | SetName("EditCell"); | |||
100 | SfxShell::SetContextName(vcl::EnumContext::GetContextName(vcl::EnumContext::Context::EditCell)); | |||
101 | } | |||
102 | ||||
103 | ScEditShell::~ScEditShell() | |||
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 | ||||
115 | ScInputHandler* ScEditShell::GetMyInputHdl() | |||
116 | { | |||
117 | return SC_MOD()( static_cast<ScModule*>(SfxApplication::GetModule(SfxToolsModule ::Calc)) )->GetInputHdl( rViewData.GetViewShell() ); | |||
118 | } | |||
119 | ||||
120 | void ScEditShell::SetEditView(EditView* pView) | |||
121 | { | |||
122 | pEditView = pView; | |||
123 | pEditView->SetInsertMode( bIsInsertMode ); | |||
124 | SetPool( pEditView->GetEditEngine()->GetEmptyItemSet().GetPool() ); | |||
125 | SetUndoManager( &pEditView->GetEditEngine()->GetUndoManager() ); | |||
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_DELETECONTENTSreinterpret_cast<char const *>("STR_UNDO_DELETECONTENTS" "\004" u8"Delete") ); | |||
136 | ViewShellId nViewShellId(-1); | |||
137 | if (ScTabViewShell* pViewSh = ScTabViewShell::GetActiveViewShell()) | |||
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 | ||||
158 | void ScEditShell::Execute( SfxRequest& rReq ) | |||
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")do { if (true && (!(pHdl))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/home/maarten/src/libreoffice/core/sc/source/ui/view/editsh.cxx" ":" "165" ": "), "%s", "no ScInputHandler"); } } while (false ); | |||
166 | ||||
167 | EditView* pTopView = pHdl->GetTopView(); // Has thee input cell the focus? | |||
168 | EditView* pTableView = pHdl->GetTableView(); | |||
169 | ||||
170 | OSL_ENSURE(pTableView,"no EditView :-(")do { if (true && (!(pTableView))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/home/maarten/src/libreoffice/core/sc/source/ui/view/editsh.cxx" ":" "170" ": "), "%s", "no EditView :-("); } } while (false); | |||
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_INSERTTypedWhichId<SfxBoolItem>( 10000 + 221 ): | |||
189 | case FID_INS_CELL_CONTENTS((((((((26000 + 200) + 20)) + 20)) + 20)) + 5): // 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_INSERTTypedWhichId<SfxBoolItem>( 10000 + 221 ) ); | |||
195 | break; | |||
196 | ||||
197 | case SID_THES(5000 + 698): | |||
198 | { | |||
199 | OUString aReplaceText; | |||
200 | const SfxStringItem* pItem2 = rReq.GetArg<SfxStringItem>(SID_THES(5000 + 698)); | |||
201 | if (pItem2) | |||
202 | aReplaceText = pItem2->GetValue(); | |||
203 | if (!aReplaceText.isEmpty()) | |||
204 | ReplaceTextWithSynonym( *pEditView, aReplaceText ); | |||
205 | } | |||
206 | break; | |||
207 | ||||
208 | case SID_COPY(5000 + 711): | |||
209 | pTableView->Copy(); | |||
210 | bSetModified = false; | |||
211 | break; | |||
212 | ||||
213 | case SID_CUT(5000 + 710): | |||
214 | pTableView->Cut(); | |||
215 | if (pTopView) | |||
216 | pTopView->DeleteSelected(); | |||
217 | break; | |||
218 | ||||
219 | case SID_PASTE(5000 + 712): | |||
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(5000 + 713): | |||
234 | pTableView->DeleteSelected(); | |||
235 | if (pTopView) | |||
236 | pTopView->DeleteSelected(); | |||
237 | break; | |||
238 | ||||
239 | case SID_CELL_FORMAT_RESET((26000) + 67): // "Standard" | |||
240 | lcl_RemoveAttribs( *pTableView ); | |||
241 | if ( pTopView ) | |||
242 | lcl_RemoveAttribs( *pTopView ); | |||
243 | break; | |||
244 | ||||
245 | case SID_CLIPBOARD_FORMAT_ITEMS(5000 + 312): | |||
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(5000 + 311): | |||
270 | { | |||
271 | SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); | |||
272 | ScopedVclPtr<SfxAbstractPasteDialog> pDlg(pFact->CreatePasteDialog(rViewData.GetDialogParent())); | |||
273 | SotClipboardFormatId nFormat = SotClipboardFormatId::NONE; | |||
274 | pDlg->Insert( SotClipboardFormatId::STRING, EMPTY_OUSTRINGScGlobal::GetEmptyOUString() ); | |||
275 | pDlg->Insert( SotClipboardFormatId::RTF, EMPTY_OUSTRINGScGlobal::GetEmptyOUString() ); | |||
276 | pDlg->Insert( SotClipboardFormatId::RICHTEXT, EMPTY_OUSTRINGScGlobal::GetEmptyOUString() ); | |||
277 | // Do not offer SotClipboardFormatId::STRING_TSVC for | |||
278 | // in-cell paste. | |||
279 | ||||
280 | TransferableDataHelper aDataHelper( | |||
281 | TransferableDataHelper::CreateFromSystemClipboard( rViewData.GetActiveWin() ) ); | |||
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()( static_cast<ScModule*>(SfxApplication::GetModule(SfxToolsModule ::Calc)) )->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 (pTopView) | |||
302 | pTopView->GetWindow()->GrabFocus(); | |||
303 | } | |||
304 | break; | |||
305 | ||||
306 | case SID_PASTE_UNFORMATTED(5000 + 314): | |||
307 | { | |||
308 | pTableView->Paste(); | |||
309 | ||||
310 | if (pTopView) | |||
311 | { | |||
312 | pTopView->Paste(); | |||
313 | pTopView->GetWindow()->GrabFocus(); | |||
314 | } | |||
315 | } | |||
316 | break; | |||
317 | ||||
318 | case SID_SELECTALL(5000 + 723): | |||
319 | { | |||
320 | sal_Int32 nPar = pEngine->GetParagraphCount(); | |||
321 | if (nPar) | |||
322 | { | |||
323 | sal_Int32 nLen = pEngine->GetTextLen(nPar-1); | |||
324 | pTableView->SetSelection(ESelection(0,0,nPar-1,nLen)); | |||
325 | if (pTopView) | |||
326 | pTopView->SetSelection(ESelection(0,0,nPar-1,nLen)); | |||
327 | rBindings.Invalidate( SID_ATTR_CHAR_FONT( 10000 + 7 ) ); | |||
328 | rBindings.Invalidate( SID_ATTR_CHAR_FONTHEIGHT( 10000 + 15 ) ); | |||
329 | rBindings.Invalidate( SID_ATTR_CHAR_WEIGHT( 10000 + 9 ) ); | |||
330 | rBindings.Invalidate( SID_ATTR_CHAR_POSTURE( 10000 + 8 ) ); | |||
331 | rBindings.Invalidate( SID_ATTR_CHAR_UNDERLINE( 10000 + 14 ) ); | |||
332 | rBindings.Invalidate( SID_ATTR_CHAR_STRIKEOUT( 10000 + 13 ) ); | |||
333 | rBindings.Invalidate( SID_ATTR_CHAR_SHADOWED( 10000 + 10 ) ); | |||
334 | rBindings.Invalidate( SID_ATTR_CHAR_KERNING( 10000 + 18 ) ); | |||
335 | rBindings.Invalidate( SID_ATTR_CHAR_COLOR( 10000 + 17 ) ); | |||
336 | rBindings.Invalidate( SID_SET_SUPER_SCRIPT( 10000 + 294 ) ); | |||
337 | rBindings.Invalidate( SID_SET_SUB_SCRIPT( 10000 + 295 ) ); | |||
338 | } | |||
339 | } | |||
340 | return; | |||
341 | case SID_UNICODE_NOTATION_TOGGLE(5000 + 792): | |||
342 | { | |||
343 | EditView* pActiveView = pHdl->GetActiveView(); | |||
344 | if( pActiveView ) | |||
345 | { | |||
346 | OUString sInput = pEngine->GetText(); | |||
347 | ESelection aSel( pActiveView->GetSelection() ); | |||
348 | if( aSel.HasRange() ) | |||
349 | sInput = pActiveView->GetSelected(); | |||
350 | ||||
351 | if( aSel.nStartPos > aSel.nEndPos ) | |||
352 | aSel.nEndPos = aSel.nStartPos; | |||
353 | ||||
354 | //calculate a valid end-position by reading logical characters | |||
355 | sal_Int32 nUtf16Pos=0; | |||
356 | while( (nUtf16Pos < sInput.getLength()) && (nUtf16Pos < aSel.nEndPos) ) | |||
357 | { | |||
358 | sInput.iterateCodePoints(&nUtf16Pos); | |||
359 | if( nUtf16Pos > aSel.nEndPos ) | |||
360 | aSel.nEndPos = nUtf16Pos; | |||
361 | } | |||
362 | ||||
363 | ToggleUnicodeCodepoint aToggle; | |||
364 | while( nUtf16Pos && aToggle.AllowMoreInput( sInput[nUtf16Pos-1]) ) | |||
365 | --nUtf16Pos; | |||
366 | OUString sReplacement = aToggle.ReplacementString(); | |||
367 | if( !sReplacement.isEmpty() ) | |||
368 | { | |||
369 | aSel.nStartPos = aSel.nEndPos - aToggle.StringToReplace().getLength(); | |||
370 | pTableView->SetSelection( aSel ); | |||
371 | pTableView->InsertText(sReplacement, true); | |||
372 | if( pTopView ) | |||
373 | { | |||
374 | pTopView->SetSelection( aSel ); | |||
375 | pTopView->InsertText(sReplacement, true); | |||
376 | } | |||
377 | } | |||
378 | } | |||
379 | } | |||
380 | break; | |||
381 | ||||
382 | case SID_CHARMAP((10000 + 500) + 3): | |||
383 | { | |||
384 | SvtScriptType nScript = pTableView->GetSelectedScriptType(); | |||
385 | sal_uInt16 nFontWhich = ( nScript == SvtScriptType::ASIAN ) ? EE_CHAR_FONTINFO_CJK : | |||
386 | ( ( nScript == SvtScriptType::COMPLEX ) ? EE_CHAR_FONTINFO_CTL : | |||
387 | EE_CHAR_FONTINFO ); | |||
388 | const SvxFontItem& rItem = static_cast<const SvxFontItem&>( | |||
389 | pTableView->GetAttribs().Get(nFontWhich)); | |||
390 | ||||
391 | OUString aString; | |||
392 | std::shared_ptr<SvxFontItem> aNewItem(std::make_shared<SvxFontItem>(EE_CHAR_FONTINFO)); | |||
393 | ||||
394 | const SfxItemSet *pArgs = rReq.GetArgs(); | |||
395 | const SfxPoolItem* pItem = nullptr; | |||
396 | if( pArgs ) | |||
397 | pArgs->GetItemState(GetPool().GetWhich(SID_CHARMAP((10000 + 500) + 3)), false, &pItem); | |||
398 | ||||
399 | if ( pItem ) | |||
400 | { | |||
401 | aString = static_cast<const SfxStringItem*>(pItem)->GetValue(); | |||
402 | const SfxPoolItem* pFtItem = nullptr; | |||
403 | pArgs->GetItemState( GetPool().GetWhich(SID_ATTR_SPECIALCHAR( 10000 + 1120 )), false, &pFtItem); | |||
404 | const SfxStringItem* pFontItem = dynamic_cast<const SfxStringItem*>( pFtItem ); | |||
405 | if ( pFontItem ) | |||
406 | { | |||
407 | const OUString& aFontName(pFontItem->GetValue()); | |||
408 | vcl::Font aFont(aFontName, Size(1,1)); // Size just because CTOR | |||
409 | // tdf#125054 see comment in drtxob.cxx, same ID | |||
410 | aNewItem = std::make_shared<SvxFontItem>( | |||
411 | aFont.GetFamilyType(), aFont.GetFamilyName(), | |||
412 | aFont.GetStyleName(), aFont.GetPitch(), | |||
413 | aFont.GetCharSet(), ATTR_FONT); | |||
414 | } | |||
415 | else | |||
416 | { | |||
417 | aNewItem.reset(rItem.Clone()); | |||
418 | } | |||
419 | ||||
420 | // tdf#125054 force Item to correct intended ID | |||
421 | aNewItem->SetWhich(EE_CHAR_FONTINFO); | |||
422 | } | |||
423 | else | |||
424 | { | |||
425 | ScViewUtil::ExecuteCharMap( rItem, *rViewData.GetViewShell()->GetViewFrame() ); | |||
426 | ||||
427 | // while the dialog was open, edit mode may have been stopped | |||
428 | if (!SC_MOD()( static_cast<ScModule*>(SfxApplication::GetModule(SfxToolsModule ::Calc)) )->IsInputMode()) | |||
429 | return; | |||
430 | } | |||
431 | ||||
432 | if ( !aString.isEmpty() ) | |||
433 | { | |||
434 | // if string contains WEAK characters, set all fonts | |||
435 | SvtScriptType nSetScript; | |||
436 | ScDocument& rDoc = rViewData.GetDocument(); | |||
437 | if ( rDoc.HasStringWeakCharacters( aString ) ) | |||
438 | nSetScript = SvtScriptType::LATIN | SvtScriptType::ASIAN | SvtScriptType::COMPLEX; | |||
439 | else | |||
440 | nSetScript = rDoc.GetStringScriptType( aString ); | |||
441 | ||||
442 | SfxItemSet aSet( pTableView->GetEmptyItemSet() ); | |||
443 | SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONT( 10000 + 7 ), GetPool() ); | |||
444 | aSetItem.PutItemForScriptType( nSetScript, *aNewItem ); | |||
445 | aSet.Put( aSetItem.GetItemSet(), false ); | |||
446 | ||||
447 | // SetAttribs on the View selects a word, when nothing is selected | |||
448 | pTableView->GetEditEngine()->QuickSetAttribs( aSet, pTableView->GetSelection() ); | |||
449 | pTableView->InsertText(aString); | |||
450 | if (pTopView) | |||
451 | pTopView->InsertText(aString); | |||
452 | ||||
453 | SfxStringItem aStringItem( SID_CHARMAP((10000 + 500) + 3), aString ); | |||
454 | SfxStringItem aFontItem( SID_ATTR_SPECIALCHAR( 10000 + 1120 ), aNewItem->GetFamilyName() ); | |||
455 | rReq.AppendItem( aFontItem ); | |||
456 | rReq.AppendItem( aStringItem ); | |||
457 | rReq.Done(); | |||
458 | ||||
459 | } | |||
460 | ||||
461 | if (pTopView) | |||
462 | pTopView->GetWindow()->GrabFocus(); | |||
463 | } | |||
464 | break; | |||
465 | ||||
466 | case FID_INSERT_NAME((((((((26000 + 200) + 20)) + 20)) + 20)) + 12): | |||
467 | { | |||
468 | ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); | |||
469 | ||||
470 | ScopedVclPtr<AbstractScNamePasteDlg> pDlg(pFact->CreateScNamePasteDlg(rViewData.GetDialogParent(), rViewData.GetDocShell())); | |||
471 | short nRet = pDlg->Execute(); | |||
472 | // pDlg is needed below | |||
473 | ||||
474 | // while the dialog was open, edit mode may have been stopped | |||
475 | if (!SC_MOD()( static_cast<ScModule*>(SfxApplication::GetModule(SfxToolsModule ::Calc)) )->IsInputMode()) | |||
476 | return; | |||
477 | ||||
478 | if ( nRet == BTN_PASTE_NAME100 ) | |||
479 | { | |||
480 | std::vector<OUString> aNames = pDlg->GetSelectedNames(); | |||
481 | if (!aNames.empty()) | |||
482 | { | |||
483 | OUStringBuffer aBuffer; | |||
484 | for (const auto& rName : aNames) | |||
485 | { | |||
486 | aBuffer.append(rName).append(' '); | |||
487 | } | |||
488 | pTableView->InsertText(aBuffer.toString()); | |||
489 | if (pTopView) | |||
490 | pTopView->InsertText(aBuffer.makeStringAndClear()); | |||
491 | } | |||
492 | } | |||
493 | pDlg.disposeAndClear(); | |||
494 | ||||
495 | if (pTopView) | |||
496 | pTopView->GetWindow()->GrabFocus(); | |||
497 | } | |||
498 | break; | |||
499 | ||||
500 | case SID_CHAR_DLG_EFFECT( 10000 + 1133 ): | |||
501 | case SID_CHAR_DLG( 10000 + 296 ): | |||
502 | { | |||
503 | SfxItemSet aAttrs( pTableView->GetAttribs() ); | |||
504 | ||||
505 | SfxObjectShell* pObjSh = rViewData.GetSfxDocShell(); | |||
506 | ||||
507 | ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); | |||
508 | ||||
509 | ScopedVclPtr<SfxAbstractTabDialog> pDlg(pFact->CreateScCharDlg( | |||
510 | rViewData.GetDialogParent(), &aAttrs, pObjSh, false)); | |||
511 | if (nSlot == SID_CHAR_DLG_EFFECT( 10000 + 1133 )) | |||
512 | { | |||
513 | pDlg->SetCurPageId("fonteffects"); | |||
514 | } | |||
515 | short nRet = pDlg->Execute(); | |||
516 | // pDlg is needed below | |||
517 | ||||
518 | // while the dialog was open, edit mode may have been stopped | |||
519 | if (!SC_MOD()( static_cast<ScModule*>(SfxApplication::GetModule(SfxToolsModule ::Calc)) )->IsInputMode()) | |||
520 | return; | |||
521 | ||||
522 | if ( nRet == RET_OK ) | |||
523 | { | |||
524 | const SfxItemSet* pOut = pDlg->GetOutputItemSet(); | |||
525 | pTableView->SetAttribs( *pOut ); | |||
526 | } | |||
527 | } | |||
528 | break; | |||
529 | ||||
530 | case SID_TOGGLE_REL((((26000 + 521) + 50))+38): | |||
531 | { | |||
532 | if (pEngine->GetParagraphCount() == 1) | |||
533 | { | |||
534 | OUString aText = pEngine->GetText(); | |||
535 | ESelection aSel = pEditView->GetSelection(); // current View | |||
536 | ||||
537 | ScDocument& rDoc = rViewData.GetDocument(); | |||
538 | ScRefFinder aFinder(aText, rViewData.GetCurPos(), rDoc, rDoc.GetAddressConvention()); | |||
539 | aFinder.ToggleRel( aSel.nStartPos, aSel.nEndPos ); | |||
540 | if (aFinder.GetFound()) | |||
541 | { | |||
542 | const OUString& aNew = aFinder.GetText(); | |||
543 | ESelection aNewSel( 0,aFinder.GetSelStart(), 0,aFinder.GetSelEnd() ); | |||
544 | pEngine->SetText( aNew ); | |||
545 | pTableView->SetSelection( aNewSel ); | |||
546 | if ( pTopView ) | |||
547 | { | |||
548 | pTopView->GetEditEngine()->SetText( aNew ); | |||
549 | pTopView->SetSelection( aNewSel ); | |||
550 | } | |||
551 | ||||
552 | // reference is being selected -> do not overwrite when typing | |||
553 | bSetSelIsRef = true; | |||
554 | } | |||
555 | } | |||
556 | } | |||
557 | break; | |||
558 | ||||
559 | case SID_HYPERLINK_SETLINKTypedWhichId<SvxHyperlinkItem>(10000 + 362): | |||
560 | if( pReqArgs ) | |||
561 | { | |||
562 | const SfxPoolItem* pItem; | |||
563 | if ( pReqArgs->GetItemState( SID_HYPERLINK_SETLINKTypedWhichId<SvxHyperlinkItem>(10000 + 362), true, &pItem ) == SfxItemState::SET ) | |||
564 | { | |||
565 | const SvxHyperlinkItem* pHyper = static_cast<const SvxHyperlinkItem*>(pItem); | |||
566 | const OUString& rName = pHyper->GetName(); | |||
567 | const OUString& rURL = pHyper->GetURL(); | |||
568 | const OUString& rTarget = pHyper->GetTargetFrame(); | |||
569 | SvxLinkInsertMode eMode = pHyper->GetInsertMode(); | |||
570 | ||||
571 | bool bDone = false; | |||
572 | if ( eMode == HLINK_DEFAULT || eMode == HLINK_FIELD ) | |||
573 | { | |||
574 | const SvxURLField* pURLField = GetURLField(); | |||
575 | if ( pURLField ) | |||
576 | { | |||
577 | // select old field | |||
578 | ||||
579 | ESelection aSel = pTableView->GetSelection(); | |||
580 | aSel.Adjust(); | |||
581 | aSel.nEndPara = aSel.nStartPara; | |||
582 | aSel.nEndPos = aSel.nStartPos + 1; | |||
583 | pTableView->SetSelection( aSel ); | |||
584 | ||||
585 | // insert new field | |||
586 | ||||
587 | SvxURLField aURLField( rURL, rName, SvxURLFormat::Repr ); | |||
588 | aURLField.SetTargetFrame( rTarget ); | |||
589 | SvxFieldItem aURLItem( aURLField, EE_FEATURE_FIELD ); | |||
590 | pTableView->InsertField( aURLItem ); | |||
591 | pTableView->SetSelection( aSel ); // select inserted field | |||
592 | ||||
593 | // now also fields in the Top-View | |||
594 | ||||
595 | if ( pTopView ) | |||
596 | { | |||
597 | aSel = pTopView->GetSelection(); | |||
598 | aSel.nEndPara = aSel.nStartPara; | |||
599 | aSel.nEndPos = aSel.nStartPos + 1; | |||
600 | pTopView->SetSelection( aSel ); | |||
601 | pTopView->InsertField( aURLItem ); | |||
602 | pTopView->SetSelection( aSel ); // select inserted field | |||
603 | } | |||
604 | ||||
605 | bDone = true; | |||
606 | } | |||
607 | } | |||
608 | ||||
609 | if (!bDone) | |||
610 | { | |||
611 | rViewData.GetViewShell()-> | |||
612 | InsertURL( rName, rURL, rTarget, static_cast<sal_uInt16>(eMode) ); | |||
613 | ||||
614 | // when "Button", the InsertURL in ViewShell turns the EditShell off | |||
615 | // thus the immediate return statement | |||
616 | return; | |||
617 | } | |||
618 | } | |||
619 | } | |||
620 | break; | |||
621 | ||||
622 | case SID_OPEN_HYPERLINK( 10000 + 955 ): | |||
623 | { | |||
624 | const SvxURLField* pURLField = GetURLField(); | |||
625 | if ( pURLField ) | |||
626 | ScGlobal::OpenURL( pURLField->GetURL(), pURLField->GetTargetFrame(), true ); | |||
627 | return; | |||
628 | } | |||
629 | case SID_EDIT_HYPERLINK( 10000 + 978 ): | |||
630 | { | |||
631 | // Ensure the field is selected first | |||
632 | pEditView->SelectFieldAtCursor(); | |||
633 | rViewData.GetViewShell()->GetViewFrame()->GetDispatcher()->Execute( | |||
634 | SID_HYPERLINK_DIALOG(5000 + 678)); | |||
635 | } | |||
636 | break; | |||
637 | case SID_COPY_HYPERLINK_LOCATION( 10000 + 1193 ): | |||
638 | { | |||
639 | const SvxFieldData* pField = pEditView->GetFieldAtCursor(); | |||
640 | if (const SvxURLField* pURLField = dynamic_cast<const SvxURLField*>(pField)) | |||
641 | { | |||
642 | uno::Reference<datatransfer::clipboard::XClipboard> xClipboard | |||
643 | = pEditView->GetWindow()->GetClipboard(); | |||
644 | ||||
645 | if (comphelper::LibreOfficeKit::isActive()) | |||
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( 10000 + 459 ): | |||
656 | { | |||
657 | URLFieldHelper::RemoveURLField(*pEditView); | |||
658 | } | |||
659 | break; | |||
660 | ||||
661 | case FN_INSERT_SOFT_HYPHEN((20000 + 300) + 43): | |||
662 | lclInsertCharacter( pTableView, pTopView, CHAR_SHY ); | |||
663 | break; | |||
664 | case FN_INSERT_HARDHYPHEN((20000 + 300) + 85): | |||
665 | lclInsertCharacter( pTableView, pTopView, CHAR_NBHY ); | |||
666 | break; | |||
667 | case FN_INSERT_HARD_SPACE((20000 + 300) + 44): | |||
668 | lclInsertCharacter( pTableView, pTopView, CHAR_NBSP ); | |||
669 | break; | |||
670 | case FN_INSERT_NNBSP((20000 + 300) + 45): | |||
671 | lclInsertCharacter( pTableView, pTopView, CHAR_NNBSP ); | |||
672 | break; | |||
673 | case SID_INSERT_RLM( 10000 + 1056 ): | |||
674 | lclInsertCharacter( pTableView, pTopView, CHAR_RLM ); | |||
675 | break; | |||
676 | case SID_INSERT_LRM( 10000 + 1057 ): | |||
677 | lclInsertCharacter( pTableView, pTopView, CHAR_LRM ); | |||
678 | break; | |||
679 | case SID_INSERT_ZWSP( 10000 + 1058 ): | |||
680 | lclInsertCharacter( pTableView, pTopView, CHAR_ZWSP ); | |||
681 | break; | |||
682 | case SID_INSERT_ZWNBSP( 10000 + 1059 ): | |||
683 | lclInsertCharacter( pTableView, pTopView, CHAR_ZWNBSP ); | |||
684 | break; | |||
685 | case SID_INSERT_FIELD_SHEET((((26000 + 521) + 50))+97): | |||
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((((26000 + 521) + 50))+98): | |||
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((((26000 + 521) + 50))+99): | |||
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 | ||||
724 | void ScEditShell::GetState( SfxItemSet& rSet ) | |||
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. | |||
729 | if ( !rViewData.HasEditView( rViewData.GetActivePart() ) ) | |||
| ||||
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_INSERTTypedWhichId<SfxBoolItem>( 10000 + 221 ): // 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(10000 + 361): | |||
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( 10000 + 955 ): | |||
785 | case SID_EDIT_HYPERLINK( 10000 + 978 ): | |||
786 | case SID_COPY_HYPERLINK_LOCATION( 10000 + 1193 ): | |||
787 | case SID_REMOVE_HYPERLINK( 10000 + 459 ): | |||
788 | { | |||
789 | if (!URLFieldHelper::IsCursorAtURLField(*pEditView)) | |||
| ||||
790 | rSet.DisableItem (nWhich); | |||
791 | } | |||
792 | break; | |||
793 | ||||
794 | case SID_TRANSLITERATE_HALFWIDTH( 10000 + 914 ): | |||
795 | case SID_TRANSLITERATE_FULLWIDTH( 10000 + 915 ): | |||
796 | case SID_TRANSLITERATE_HIRAGANA( 10000 + 916 ): | |||
797 | case SID_TRANSLITERATE_KATAKANA( 10000 + 917 ): | |||
798 | case SID_INSERT_RLM( 10000 + 1056 ): | |||
799 | case SID_INSERT_LRM( 10000 + 1057 ): | |||
800 | ScViewUtil::HideDisabledSlot( rSet, rViewData.GetBindings(), nWhich ); | |||
801 | break; | |||
802 | ||||
803 | case SID_THES(5000 + 698): | |||
804 | { | |||
805 | OUString aStatusVal; | |||
806 | LanguageType nLang = LANGUAGE_NONELanguageType(0x00FF); | |||
807 | bool bIsLookUpWord = pActiveView && | |||
808 | GetStatusValueForThesaurusFromContext(aStatusVal, nLang, *pActiveView); | |||
809 | rSet.Put( SfxStringItem( SID_THES(5000 + 698), 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(5000 + 698) ); | |||
815 | } | |||
816 | break; | |||
817 | case SID_INSERT_FIELD_SHEET((((26000 + 521) + 50))+97): | |||
818 | case SID_INSERT_FIELD_TITLE((((26000 + 521) + 50))+98): | |||
819 | case SID_INSERT_FIELD_DATE_VAR((((26000 + 521) + 50))+99): | |||
820 | break; | |||
821 | case SID_COPY(5000 + 711): | |||
822 | case SID_CUT(5000 + 710): | |||
823 | if (GetObjectShell() && GetObjectShell()->isContentExtractionLocked()) | |||
824 | { | |||
825 | rSet.DisableItem(SID_COPY(5000 + 711)); | |||
826 | rSet.DisableItem(SID_CUT(5000 + 710)); | |||
827 | } | |||
828 | break; | |||
829 | ||||
830 | } | |||
831 | nWhich = aIter.NextWhich(); | |||
832 | } | |||
833 | } | |||
834 | ||||
835 | const SvxURLField* ScEditShell::GetURLField() | |||
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 )void ScEditShell::LinkStubClipboardChanged(void * instance, TransferableDataHelper * data) { return static_cast<ScEditShell *>(instance)-> ClipboardChanged(data); } void ScEditShell::ClipboardChanged( TransferableDataHelper* pDataHelper) | |||
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(5000 + 712) ); | |||
857 | rBindings.Invalidate( SID_PASTE_SPECIAL(5000 + 311) ); | |||
858 | rBindings.Invalidate( SID_PASTE_UNFORMATTED(5000 + 314) ); | |||
859 | rBindings.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS(5000 + 312) ); | |||
860 | } | |||
861 | ||||
862 | void ScEditShell::GetClipState( SfxItemSet& rSet ) | |||
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 )::tools::detail::makeLink( ::tools::detail::castTo<ScEditShell *>(this), &ScEditShell::LinkStubClipboardChanged) ); | |||
870 | vcl::Window* pWin = rViewData.GetActiveWin(); | |||
871 | mxClipEvtLstnr->AddListener( pWin ); | |||
872 | ||||
873 | // get initial state | |||
874 | TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( rViewData.GetActiveWin() ) ); | |||
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(5000 + 712): | |||
887 | case SID_PASTE_SPECIAL(5000 + 311): | |||
888 | case SID_PASTE_UNFORMATTED(5000 + 314): | |||
889 | if( !bPastePossible ) | |||
890 | rSet.DisableItem( nWhich ); | |||
891 | break; | |||
892 | case SID_CLIPBOARD_FORMAT_ITEMS(5000 + 312): | |||
893 | if( bPastePossible ) | |||
894 | { | |||
895 | SvxClipboardFormatItem aFormats( SID_CLIPBOARD_FORMAT_ITEMS(5000 + 312) ); | |||
896 | TransferableDataHelper aDataHelper( | |||
897 | TransferableDataHelper::CreateFromSystemClipboard( rViewData.GetActiveWin() ) ); | |||
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( 10000 + 14 ) ); | |||
917 | rBindings.Invalidate( SID_ULINE_VAL_NONE(10000 + 1195) ); | |||
918 | rBindings.Invalidate( SID_ULINE_VAL_SINGLE(10000 + 1196) ); | |||
919 | rBindings.Invalidate( SID_ULINE_VAL_DOUBLE(10000 + 1197) ); | |||
920 | rBindings.Invalidate( SID_ULINE_VAL_DOTTED(10000 + 1198) ); | |||
921 | } | |||
922 | ||||
923 | void ScEditShell::ExecuteAttr(SfxRequest& rReq) | |||
924 | { | |||
925 | SfxItemSet aSet( pEditView->GetEmptyItemSet() ); | |||
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( 10000 + 15 ): | |||
933 | case SID_ATTR_CHAR_FONT( 10000 + 7 ): | |||
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( 10000 + 7 )) | |||
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( 10000 + 17 ): | |||
956 | { | |||
957 | if (pArgs) | |||
958 | { | |||
959 | const SfxPoolItem* pColorStringItem = nullptr; | |||
960 | ||||
961 | if ( pArgs && SfxItemState::SET == pArgs->GetItemState( SID_ATTR_COLOR_STR(10000 + 540), 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( 10000 + 9 ): | |||
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, | |||
999 | SvxWeightItem( bOld ? WEIGHT_NORMAL : WEIGHT_BOLD, EE_CHAR_WEIGHT ) ); | |||
1000 | aSet.Put( aSetItem.GetItemSet(), false ); | |||
1001 | ||||
1002 | rBindings.Invalidate( nSlot ); | |||
1003 | } | |||
1004 | break; | |||
1005 | ||||
1006 | case SID_ATTR_CHAR_POSTURE( 10000 + 8 ): | |||
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, | |||
1022 | SvxPostureItem( bOld ? ITALIC_NONE : ITALIC_NORMAL, EE_CHAR_ITALIC ) ); | |||
1023 | aSet.Put( aSetItem.GetItemSet(), false ); | |||
1024 | ||||
1025 | rBindings.Invalidate( nSlot ); | |||
1026 | } | |||
1027 | break; | |||
1028 | ||||
1029 | case SID_ULINE_VAL_NONE(10000 + 1195): | |||
1030 | aSet.Put( SvxUnderlineItem( LINESTYLE_NONE, EE_CHAR_UNDERLINE ) ); | |||
1031 | lcl_InvalidateUnder( rBindings ); | |||
1032 | break; | |||
1033 | ||||
1034 | case SID_ATTR_CHAR_UNDERLINE( 10000 + 14 ): | |||
1035 | case SID_ULINE_VAL_SINGLE(10000 + 1196): | |||
1036 | case SID_ULINE_VAL_DOUBLE(10000 + 1197): | |||
1037 | case SID_ULINE_VAL_DOTTED(10000 + 1198): | |||
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( 10000 + 14 ): | |||
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(10000 + 1196): | |||
1055 | eNew = ( eOld == LINESTYLE_SINGLE ) ? LINESTYLE_NONE : LINESTYLE_SINGLE; | |||
1056 | break; | |||
1057 | case SID_ULINE_VAL_DOUBLE(10000 + 1197): | |||
1058 | eNew = ( eOld == LINESTYLE_DOUBLE ) ? LINESTYLE_NONE : LINESTYLE_DOUBLE; | |||
1059 | break; | |||
1060 | case SID_ULINE_VAL_DOTTED(10000 + 1198): | |||
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( ((10000 + 1499) + 1) + 68 ): | |||
1070 | { | |||
1071 | FontLineStyle eOld = pEditView->GetAttribs().Get(EE_CHAR_OVERLINE).GetLineStyle(); | |||
1072 | FontLineStyle eNew = ( eOld != LINESTYLE_NONE ) ? LINESTYLE_NONE : LINESTYLE_SINGLE; | |||
1073 | aSet.Put( SvxOverlineItem( eNew, EE_CHAR_OVERLINE ) ); | |||
1074 | rBindings.Invalidate( nSlot ); | |||
1075 | } | |||
1076 | break; | |||
1077 | ||||
1078 | case SID_ATTR_CHAR_STRIKEOUT( 10000 + 13 ): | |||
1079 | { | |||
1080 | bool bOld = pEditView->GetAttribs().Get(EE_CHAR_STRIKEOUT).GetValue() != STRIKEOUT_NONE; | |||
1081 | aSet.Put( SvxCrossedOutItem( bOld ? STRIKEOUT_NONE : STRIKEOUT_SINGLE, EE_CHAR_STRIKEOUT ) ); | |||
1082 | rBindings.Invalidate( nSlot ); | |||
1083 | } | |||
1084 | break; | |||
1085 | ||||
1086 | case SID_ATTR_CHAR_SHADOWED( 10000 + 10 ): | |||
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( 10000 + 12 ): | |||
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( 10000 + 294 ): | |||
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( 10000 + 295 ): | |||
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( 10000 + 18 ): | |||
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( 10000 + 1042 ): | |||
1131 | case SID_SHRINK_FONT_SIZE( 10000 + 1043 ): | |||
1132 | { | |||
1133 | const SvxFontListItem* pFontListItem = static_cast< const SvxFontListItem* > | |||
1134 | ( SfxObjectShell::Current()->GetItem( SID_ATTR_CHAR_FONTLIST( 10000 + 22 ) ) ); | |||
1135 | const FontList* pFontList = pFontListItem ? pFontListItem->GetFontList() : nullptr; | |||
1136 | pEditView->ChangeFontSize( nSlot == SID_GROW_FONT_SIZE( 10000 + 1042 ), pFontList ); | |||
1137 | rBindings.Invalidate( SID_ATTR_CHAR_FONTHEIGHT( 10000 + 15 ) ); | |||
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 | ||||
1159 | void ScEditShell::GetAttrState(SfxItemSet &rSet) | |||
1160 | { | |||
1161 | if ( !rViewData.HasEditView( rViewData.GetActivePart() ) ) | |||
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 | ||||
1172 | SvtScriptType nScript = pEditView->GetSelectedScriptType(); | |||
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 | { | |||
1179 | LanguageType nInputLang = rViewData.GetActiveWin()->GetInputLanguage(); | |||
1180 | if (nInputLang != LANGUAGE_DONTKNOWLanguageType(0x03FF) && nInputLang != LANGUAGE_SYSTEMLanguageType(0x0000)) | |||
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(10000 + 1195) ); | |||
1199 | rSet.InvalidateItem( SID_ULINE_VAL_SINGLE(10000 + 1196) ); | |||
1200 | rSet.InvalidateItem( SID_ULINE_VAL_DOUBLE(10000 + 1197) ); | |||
1201 | rSet.InvalidateItem( SID_ULINE_VAL_DOTTED(10000 + 1198) ); | |||
1202 | } | |||
1203 | else | |||
1204 | { | |||
1205 | FontLineStyle eUnderline = aAttribs.Get(EE_CHAR_UNDERLINE).GetLineStyle(); | |||
1206 | rSet.Put(SfxBoolItem(SID_ULINE_VAL_SINGLE(10000 + 1196), eUnderline == LINESTYLE_SINGLE)); | |||
1207 | rSet.Put(SfxBoolItem(SID_ULINE_VAL_DOUBLE(10000 + 1197), eUnderline == LINESTYLE_DOUBLE)); | |||
1208 | rSet.Put(SfxBoolItem(SID_ULINE_VAL_DOTTED(10000 + 1198), eUnderline == LINESTYLE_DOTTED)); | |||
1209 | rSet.Put(SfxBoolItem(SID_ULINE_VAL_NONE(10000 + 1195), eUnderline == LINESTYLE_NONE)); | |||
1210 | } | |||
1211 | ||||
1212 | //! Testing whether brace highlighting is active !!!! | |||
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( 10000 + 294 ), eEsc == SvxEscapement::Superscript)); | |||
1219 | rSet.Put(SfxBoolItem(SID_SET_SUB_SCRIPT( 10000 + 295 ), eEsc == SvxEscapement::Subscript)); | |||
1220 | rViewData.GetBindings().Invalidate( SID_SET_SUPER_SCRIPT( 10000 + 294 ) ); | |||
1221 | rViewData.GetBindings().Invalidate( SID_SET_SUB_SCRIPT( 10000 + 295 ) ); | |||
1222 | ||||
1223 | eState = aAttribs.GetItemState( EE_CHAR_KERNING ); | |||
1224 | rViewData.GetBindings().Invalidate( SID_ATTR_CHAR_KERNING( 10000 + 18 ) ); | |||
1225 | if ( eState == SfxItemState::DONTCARE ) | |||
1226 | { | |||
1227 | rSet.InvalidateItem(EE_CHAR_KERNING); | |||
1228 | } | |||
1229 | } | |||
1230 | ||||
1231 | OUString ScEditShell::GetSelectionText( bool bWholeWord ) | |||
1232 | { | |||
1233 | OUString aStrSelection; | |||
1234 | ||||
1235 | if ( rViewData.HasEditView( rViewData.GetActivePart() ) ) | |||
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 | ||||
1256 | void ScEditShell::ExecuteUndo(const SfxRequest& rReq) | |||
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")do { if (true && (!(pHdl))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/home/maarten/src/libreoffice/core/sc/source/ui/view/editsh.cxx" ":" "1261" ": "), "%s", "no ScInputHandler"); } } while (false ); | |||
1262 | EditView* pTopView = pHdl->GetTopView(); | |||
1263 | EditView* pTableView = pHdl->GetTableView(); | |||
1264 | OSL_ENSURE(pTableView,"no EditView")do { if (true && (!(pTableView))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/home/maarten/src/libreoffice/core/sc/source/ui/view/editsh.cxx" ":" "1264" ": "), "%s", "no EditView"); } } while (false); | |||
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(5000 + 701): | |||
1273 | case SID_REDO(5000 + 700): | |||
1274 | { | |||
1275 | bool bIsUndo = ( nSlot == SID_UNDO(5000 + 701) ); | |||
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 | } | |||
1300 | rViewData.GetBindings().InvalidateAll(false); | |||
1301 | ||||
1302 | pHdl->DataChanged(); | |||
1303 | } | |||
1304 | ||||
1305 | void ScEditShell::GetUndoState(SfxItemSet &rSet) | |||
1306 | { | |||
1307 | // Undo state is taken from normal ViewFrame state function | |||
1308 | ||||
1309 | SfxViewFrame* pViewFrm = rViewData.GetViewShell()->GetViewFrame(); | |||
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")do { if (true && (!(pHdl))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/home/maarten/src/libreoffice/core/sc/source/ui/view/editsh.cxx" ":" "1324" ": "), "%s", "no ScInputHandler"); } } while (false ); | |||
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(5000 + 701) ); | |||
1331 | if ( rTopMgr.GetRedoActionCount() == 0 ) | |||
1332 | rSet.DisableItem( SID_REDO(5000 + 700) ); | |||
1333 | } | |||
1334 | } | |||
1335 | ||||
1336 | void ScEditShell::ExecuteTrans( const SfxRequest& rReq ) | |||
1337 | { | |||
1338 | TransliterationFlags nType = ScViewUtil::GetTransliterationType( rReq.GetSlot() ); | |||
1339 | if ( nType == TransliterationFlags::NONE ) | |||
1340 | return; | |||
1341 | ||||
1342 | ScInputHandler* pHdl = GetMyInputHdl(); | |||
1343 | assert(pHdl && "no ScInputHandler")(static_cast <bool> (pHdl && "no ScInputHandler" ) ? void (0) : __assert_fail ("pHdl && \"no ScInputHandler\"" , "/home/maarten/src/libreoffice/core/sc/source/ui/view/editsh.cxx" , 1343, __extension__ __PRETTY_FUNCTION__)); | |||
1344 | ||||
1345 | EditView* pTopView = pHdl->GetTopView(); | |||
1346 | EditView* pTableView = pHdl->GetTableView(); | |||
1347 | assert(pTableView && "no EditView")(static_cast <bool> (pTableView && "no EditView" ) ? void (0) : __assert_fail ("pTableView && \"no EditView\"" , "/home/maarten/src/libreoffice/core/sc/source/ui/view/editsh.cxx" , 1347, __extension__ __PRETTY_FUNCTION__)); | |||
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: */ |