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