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 228 : SFX_IMPL_INTERFACE(ScEditShell, SfxShell, ScResId(SCSTR_EDITSHELL))
86 :
87 76 : void ScEditShell::InitInterface_Impl()
88 : {
89 76 : GetStaticInterface()->RegisterPopupMenu(ScResId(RID_POPUP_EDIT));
90 76 : }
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 : sal_uLong nFormat = 0;
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<const SfxUInt32Item*>(pItem)->GetValue();
257 : }
258 :
259 0 : if ( nFormat )
260 : {
261 0 : if (SOT_FORMAT_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 : sal_uLong nFormat = 0;
277 0 : if ( pDlg )
278 : {
279 0 : pDlg->Insert( SOT_FORMAT_STRING, EMPTY_OUSTRING );
280 0 : pDlg->Insert( SOT_FORMAT_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 > 0)
294 : {
295 0 : if (SOT_FORMAT_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 : sal_uInt16 nScript = pTableView->GetSelectedScriptType();
337 : sal_uInt16 nFontWhich = ( nScript == SCRIPTTYPE_ASIAN ) ? EE_CHAR_FONTINFO_CJK :
338 : ( ( nScript == SCRIPTTYPE_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 : sal_uInt8 nSetScript;
381 0 : ScDocument* pDoc = pViewData->GetDocument();
382 0 : if ( pDoc->HasStringWeakCharacters( aString ) )
383 0 : nSetScript = SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN | SCRIPTTYPE_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 : //break;
581 :
582 : case FN_INSERT_SOFT_HYPHEN:
583 0 : lclInsertCharacter( pTableView, pTopView, CHAR_SHY );
584 0 : break;
585 : case FN_INSERT_HARDHYPHEN:
586 0 : lclInsertCharacter( pTableView, pTopView, CHAR_NBHY );
587 0 : break;
588 : case FN_INSERT_HARD_SPACE:
589 0 : lclInsertCharacter( pTableView, pTopView, CHAR_NBSP );
590 0 : break;
591 : case SID_INSERT_RLM:
592 0 : lclInsertCharacter( pTableView, pTopView, CHAR_RLM );
593 0 : break;
594 : case SID_INSERT_LRM:
595 0 : lclInsertCharacter( pTableView, pTopView, CHAR_LRM );
596 0 : break;
597 : case SID_INSERT_ZWSP:
598 0 : lclInsertCharacter( pTableView, pTopView, CHAR_ZWSP );
599 0 : break;
600 : case SID_INSERT_ZWNBSP:
601 0 : lclInsertCharacter( pTableView, pTopView, CHAR_ZWNBSP );
602 0 : break;
603 : case SID_INSERT_FIELD_SHEET:
604 : {
605 0 : SvxTableField aField(pViewData->GetTabNo());
606 0 : SvxFieldItem aItem(aField, EE_FEATURE_FIELD);
607 0 : pTableView->InsertField(aItem);
608 : }
609 0 : break;
610 : case SID_INSERT_FIELD_TITLE:
611 : {
612 0 : SvxFileField aField;
613 0 : SvxFieldItem aItem(aField, EE_FEATURE_FIELD);
614 0 : pTableView->InsertField(aItem);
615 : }
616 0 : break;
617 : case SID_INSERT_FIELD_DATE_VAR:
618 : {
619 0 : SvxDateField aField;
620 0 : SvxFieldItem aItem(aField, EE_FEATURE_FIELD);
621 0 : pTableView->InsertField(aItem);
622 : }
623 0 : break;
624 : }
625 :
626 0 : pHdl->DataChanged(false, bSetModified);
627 0 : if (bSetSelIsRef)
628 0 : pHdl->SetSelIsRef(true);
629 : }
630 :
631 0 : static void lcl_DisableAll( SfxItemSet& rSet ) // disable all slots
632 : {
633 0 : SfxWhichIter aIter( rSet );
634 0 : sal_uInt16 nWhich = aIter.FirstWhich();
635 0 : while (nWhich)
636 : {
637 0 : rSet.DisableItem( nWhich );
638 0 : nWhich = aIter.NextWhich();
639 0 : }
640 0 : }
641 :
642 0 : void ScEditShell::GetState( SfxItemSet& rSet )
643 : {
644 : // When deactivating the view, edit mode is stopped, but the EditShell is left active
645 : // (a shell can't be removed from within Deactivate). In that state, the EditView isn't inserted
646 : // into the EditEngine, so it can have an invalid selection and must not be used.
647 0 : if ( !pViewData->HasEditView( pViewData->GetActivePart() ) )
648 : {
649 0 : lcl_DisableAll( rSet );
650 0 : return;
651 : }
652 :
653 0 : ScInputHandler* pHdl = GetMyInputHdl();
654 0 : EditView* pActiveView = pHdl ? pHdl->GetActiveView() : pEditView;
655 :
656 0 : SfxWhichIter aIter( rSet );
657 0 : sal_uInt16 nWhich = aIter.FirstWhich();
658 0 : while (nWhich)
659 : {
660 0 : switch (nWhich)
661 : {
662 : case SID_ATTR_INSERT: // Statuszeile
663 : {
664 0 : if ( pActiveView )
665 0 : rSet.Put( SfxBoolItem( nWhich, pActiveView->IsInsertMode() ) );
666 : else
667 : {
668 : // Here the code used to pass the value 42 and it used
669 : // to "work" without warnings because the SfxBoolItem
670 : // was based on 'sal_Bool', which is actually 'unsigned
671 : // char'. But now it uses actual 'bool', and passing 42
672 : // for a 'bool' parameter causes a warning at least with
673 : // MSVC. So use 'true'. I really really hope there is
674 : // not code somewhere that retrieves this "boolean" item
675 : // and checks it value for the magic value 42...
676 0 : rSet.Put( SfxBoolItem( nWhich, true) );
677 : }
678 : }
679 0 : break;
680 :
681 : case SID_HYPERLINK_GETLINK:
682 : {
683 0 : SvxHyperlinkItem aHLinkItem;
684 0 : const SvxURLField* pURLField = GetURLField();
685 0 : if ( pURLField )
686 : {
687 0 : aHLinkItem.SetName( pURLField->GetRepresentation() );
688 0 : aHLinkItem.SetURL( pURLField->GetURL() );
689 0 : aHLinkItem.SetTargetFrame( pURLField->GetTargetFrame() );
690 : }
691 0 : else if ( pActiveView )
692 : {
693 : // use selected text as name for urls
694 0 : OUString sReturn = pActiveView->GetSelected();
695 0 : sReturn = sReturn.copy(0, std::min(sReturn.getLength(), static_cast<sal_Int32>(255)));
696 0 : aHLinkItem.SetName(comphelper::string::stripEnd(sReturn, ' '));
697 : }
698 0 : rSet.Put(aHLinkItem);
699 : }
700 0 : break;
701 :
702 : case SID_OPEN_HYPERLINK:
703 : {
704 0 : if ( !GetURLField() )
705 0 : rSet.DisableItem( nWhich );
706 : }
707 0 : break;
708 :
709 : case SID_TRANSLITERATE_HALFWIDTH:
710 : case SID_TRANSLITERATE_FULLWIDTH:
711 : case SID_TRANSLITERATE_HIRAGANA:
712 : case SID_TRANSLITERATE_KATAGANA:
713 : case SID_INSERT_RLM:
714 : case SID_INSERT_LRM:
715 : case SID_INSERT_ZWNBSP:
716 : case SID_INSERT_ZWSP:
717 0 : ScViewUtil::HideDisabledSlot( rSet, pViewData->GetBindings(), nWhich );
718 0 : break;
719 :
720 : case SID_THES:
721 : {
722 0 : OUString aStatusVal;
723 0 : LanguageType nLang = LANGUAGE_NONE;
724 : bool bIsLookUpWord = pActiveView ?
725 0 : GetStatusValueForThesaurusFromContext(aStatusVal, nLang, *pActiveView) : false;
726 0 : rSet.Put( SfxStringItem( SID_THES, aStatusVal ) );
727 :
728 : // disable thesaurus context menu entry if there is nothing to look up
729 0 : bool bCanDoThesaurus = ScModule::HasThesaurusLanguage( nLang );
730 0 : if (!bIsLookUpWord || !bCanDoThesaurus)
731 0 : rSet.DisableItem( SID_THES );
732 : }
733 0 : break;
734 : case SID_INSERT_FIELD_SHEET:
735 : case SID_INSERT_FIELD_TITLE:
736 : case SID_INSERT_FIELD_DATE_VAR:
737 0 : break;
738 :
739 : }
740 0 : nWhich = aIter.NextWhich();
741 0 : }
742 : }
743 :
744 0 : const SvxURLField* ScEditShell::GetURLField()
745 : {
746 0 : ScInputHandler* pHdl = GetMyInputHdl();
747 0 : EditView* pActiveView = pHdl ? pHdl->GetActiveView() : pEditView;
748 0 : if ( pActiveView )
749 : {
750 0 : const SvxFieldItem* pFieldItem = pActiveView->GetFieldAtSelection();
751 0 : if (pFieldItem)
752 : {
753 0 : const SvxFieldData* pField = pFieldItem->GetField();
754 0 : if ( pField && pField->ISA(SvxURLField) )
755 0 : return static_cast<const SvxURLField*>(pField);
756 : }
757 : }
758 :
759 0 : return NULL;
760 : }
761 :
762 0 : IMPL_LINK( ScEditShell, ClipboardChanged, TransferableDataHelper*, pDataHelper )
763 : {
764 0 : if ( pDataHelper )
765 : {
766 0 : bPastePossible = ( pDataHelper->HasFormat( SOT_FORMAT_STRING ) || pDataHelper->HasFormat( SOT_FORMAT_RTF ) );
767 :
768 0 : SfxBindings& rBindings = pViewData->GetBindings();
769 0 : rBindings.Invalidate( SID_PASTE );
770 0 : rBindings.Invalidate( SID_PASTE_SPECIAL );
771 0 : rBindings.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS );
772 : }
773 0 : return 0;
774 : }
775 :
776 0 : void ScEditShell::GetClipState( SfxItemSet& rSet )
777 : {
778 0 : if ( !pClipEvtLstnr )
779 : {
780 : // create listener
781 0 : pClipEvtLstnr = new TransferableClipboardListener( LINK( this, ScEditShell, ClipboardChanged ) );
782 0 : pClipEvtLstnr->acquire();
783 0 : vcl::Window* pWin = pViewData->GetActiveWin();
784 0 : pClipEvtLstnr->AddRemoveListener( pWin, true );
785 :
786 : // get initial state
787 0 : TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( pViewData->GetActiveWin() ) );
788 0 : bPastePossible = ( aDataHelper.HasFormat( SOT_FORMAT_STRING ) || aDataHelper.HasFormat( SOT_FORMAT_RTF ) );
789 : }
790 :
791 0 : SfxWhichIter aIter( rSet );
792 0 : sal_uInt16 nWhich = aIter.FirstWhich();
793 0 : while (nWhich)
794 : {
795 0 : switch (nWhich)
796 : {
797 : case SID_PASTE:
798 : case SID_PASTE_SPECIAL:
799 0 : if( !bPastePossible )
800 0 : rSet.DisableItem( nWhich );
801 0 : break;
802 : case SID_CLIPBOARD_FORMAT_ITEMS:
803 0 : if( bPastePossible )
804 : {
805 0 : SvxClipboardFmtItem aFormats( SID_CLIPBOARD_FORMAT_ITEMS );
806 : TransferableDataHelper aDataHelper(
807 0 : TransferableDataHelper::CreateFromSystemClipboard( pViewData->GetActiveWin() ) );
808 :
809 0 : if ( aDataHelper.HasFormat( SOT_FORMAT_STRING ) )
810 0 : aFormats.AddClipbrdFormat( SOT_FORMAT_STRING );
811 0 : if ( aDataHelper.HasFormat( SOT_FORMAT_RTF ) )
812 0 : aFormats.AddClipbrdFormat( SOT_FORMAT_RTF );
813 :
814 0 : rSet.Put( aFormats );
815 : }
816 : else
817 0 : rSet.DisableItem( nWhich );
818 0 : break;
819 : }
820 0 : nWhich = aIter.NextWhich();
821 0 : }
822 0 : }
823 :
824 0 : static void lcl_InvalidateUnder( SfxBindings& rBindings )
825 : {
826 0 : rBindings.Invalidate( SID_ATTR_CHAR_UNDERLINE );
827 0 : rBindings.Invalidate( SID_ULINE_VAL_NONE );
828 0 : rBindings.Invalidate( SID_ULINE_VAL_SINGLE );
829 0 : rBindings.Invalidate( SID_ULINE_VAL_DOUBLE );
830 0 : rBindings.Invalidate( SID_ULINE_VAL_DOTTED );
831 0 : }
832 :
833 0 : void ScEditShell::ExecuteAttr(SfxRequest& rReq)
834 : {
835 0 : SfxItemSet aSet( pEditView->GetEmptyItemSet() );
836 0 : SfxBindings& rBindings = pViewData->GetBindings();
837 0 : const SfxItemSet* pArgs = rReq.GetArgs();
838 0 : sal_uInt16 nSlot = rReq.GetSlot();
839 :
840 0 : switch ( nSlot )
841 : {
842 : case SID_ATTR_CHAR_FONTHEIGHT:
843 : case SID_ATTR_CHAR_FONT:
844 : {
845 0 : if (pArgs)
846 : {
847 : // #i78017 establish the same behaviour as in Writer
848 0 : sal_uInt16 nScript = SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN | SCRIPTTYPE_COMPLEX;
849 0 : if (nSlot == SID_ATTR_CHAR_FONT)
850 : {
851 0 : nScript = pEditView->GetSelectedScriptType();
852 0 : if (nScript == 0) nScript = ScGlobal::GetDefaultScriptType();
853 : }
854 :
855 0 : SfxItemPool& rPool = GetPool();
856 0 : SvxScriptSetItem aSetItem( nSlot, rPool );
857 0 : sal_uInt16 nWhich = rPool.GetWhich( nSlot );
858 0 : aSetItem.PutItemForScriptType( nScript, pArgs->Get( nWhich ) );
859 :
860 0 : aSet.Put( aSetItem.GetItemSet(), false );
861 : }
862 : }
863 0 : break;
864 :
865 : case SID_ATTR_CHAR_COLOR:
866 : {
867 0 : if (pArgs)
868 : {
869 0 : aSet.Put( pArgs->Get( pArgs->GetPool()->GetWhich( nSlot ) ) );
870 0 : rBindings.Invalidate( nSlot );
871 : }
872 : }
873 0 : break;
874 :
875 : // Toggles
876 :
877 : case SID_ATTR_CHAR_WEIGHT:
878 : {
879 : // #i78017 establish the same behaviour as in Writer
880 0 : sal_uInt16 nScript = SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN | SCRIPTTYPE_COMPLEX;
881 :
882 0 : SfxItemPool& rPool = GetPool();
883 :
884 0 : bool bOld = false;
885 0 : SvxScriptSetItem aOldSetItem( nSlot, rPool );
886 0 : aOldSetItem.GetItemSet().Put( pEditView->GetAttribs(), false );
887 0 : const SfxPoolItem* pCore = aOldSetItem.GetItemOfScript( nScript );
888 0 : if ( pCore && static_cast<const SvxWeightItem*>(pCore)->GetWeight() > WEIGHT_NORMAL )
889 0 : bOld = true;
890 :
891 0 : SvxScriptSetItem aSetItem( nSlot, rPool );
892 : aSetItem.PutItemForScriptType( nScript,
893 0 : SvxWeightItem( bOld ? WEIGHT_NORMAL : WEIGHT_BOLD, EE_CHAR_WEIGHT ) );
894 0 : aSet.Put( aSetItem.GetItemSet(), false );
895 :
896 0 : rBindings.Invalidate( nSlot );
897 : }
898 0 : break;
899 :
900 : case SID_ATTR_CHAR_POSTURE:
901 : {
902 : // #i78017 establish the same behaviour as in Writer
903 0 : sal_uInt16 nScript = SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN | SCRIPTTYPE_COMPLEX;
904 :
905 0 : SfxItemPool& rPool = GetPool();
906 :
907 0 : bool bOld = false;
908 0 : SvxScriptSetItem aOldSetItem( nSlot, rPool );
909 0 : aOldSetItem.GetItemSet().Put( pEditView->GetAttribs(), false );
910 0 : const SfxPoolItem* pCore = aOldSetItem.GetItemOfScript( nScript );
911 0 : if ( pCore && static_cast<const SvxPostureItem*>(pCore)->GetValue() != ITALIC_NONE )
912 0 : bOld = true;
913 :
914 0 : SvxScriptSetItem aSetItem( nSlot, rPool );
915 : aSetItem.PutItemForScriptType( nScript,
916 0 : SvxPostureItem( bOld ? ITALIC_NONE : ITALIC_NORMAL, EE_CHAR_ITALIC ) );
917 0 : aSet.Put( aSetItem.GetItemSet(), false );
918 :
919 0 : rBindings.Invalidate( nSlot );
920 : }
921 0 : break;
922 :
923 : case SID_ULINE_VAL_NONE:
924 0 : aSet.Put( SvxUnderlineItem( UNDERLINE_NONE, EE_CHAR_UNDERLINE ) );
925 0 : lcl_InvalidateUnder( rBindings );
926 0 : break;
927 :
928 : case SID_ATTR_CHAR_UNDERLINE:
929 : case SID_ULINE_VAL_SINGLE:
930 : case SID_ULINE_VAL_DOUBLE:
931 : case SID_ULINE_VAL_DOTTED:
932 : {
933 : FontUnderline eOld = static_cast<const SvxUnderlineItem&>( pEditView->
934 0 : GetAttribs().Get(EE_CHAR_UNDERLINE)).GetLineStyle();
935 0 : FontUnderline eNew = eOld;
936 0 : switch (nSlot)
937 : {
938 : case SID_ATTR_CHAR_UNDERLINE:
939 0 : if ( pArgs )
940 : {
941 0 : const SvxTextLineItem& rTextLineItem = static_cast< const SvxTextLineItem& >( pArgs->Get( pArgs->GetPool()->GetWhich(nSlot) ) );
942 0 : eNew = rTextLineItem.GetLineStyle();
943 : }
944 : else
945 : {
946 0 : eNew = ( eOld != UNDERLINE_NONE ) ? UNDERLINE_NONE : UNDERLINE_SINGLE;
947 : }
948 0 : break;
949 : case SID_ULINE_VAL_SINGLE:
950 0 : eNew = ( eOld == UNDERLINE_SINGLE ) ? UNDERLINE_NONE : UNDERLINE_SINGLE;
951 0 : break;
952 : case SID_ULINE_VAL_DOUBLE:
953 0 : eNew = ( eOld == UNDERLINE_DOUBLE ) ? UNDERLINE_NONE : UNDERLINE_DOUBLE;
954 0 : break;
955 : case SID_ULINE_VAL_DOTTED:
956 0 : eNew = ( eOld == UNDERLINE_DOTTED ) ? UNDERLINE_NONE : UNDERLINE_DOTTED;
957 0 : break;
958 : }
959 0 : aSet.Put( SvxUnderlineItem( eNew, EE_CHAR_UNDERLINE ) );
960 0 : lcl_InvalidateUnder( rBindings );
961 : }
962 0 : break;
963 :
964 : case SID_ATTR_CHAR_OVERLINE:
965 : {
966 : FontUnderline eOld = static_cast<const SvxOverlineItem&>( pEditView->
967 0 : GetAttribs().Get(EE_CHAR_OVERLINE)).GetLineStyle();
968 0 : FontUnderline eNew = ( eOld != UNDERLINE_NONE ) ? UNDERLINE_NONE : UNDERLINE_SINGLE;
969 0 : aSet.Put( SvxOverlineItem( eNew, EE_CHAR_OVERLINE ) );
970 0 : rBindings.Invalidate( nSlot );
971 : }
972 0 : break;
973 :
974 : case SID_ATTR_CHAR_STRIKEOUT:
975 : {
976 : bool bOld = static_cast<const SvxCrossedOutItem&>( pEditView->GetAttribs().
977 0 : Get(EE_CHAR_STRIKEOUT)).GetValue() != STRIKEOUT_NONE;
978 0 : aSet.Put( SvxCrossedOutItem( bOld ? STRIKEOUT_NONE : STRIKEOUT_SINGLE, EE_CHAR_STRIKEOUT ) );
979 0 : rBindings.Invalidate( nSlot );
980 : }
981 0 : break;
982 :
983 : case SID_ATTR_CHAR_SHADOWED:
984 : {
985 : bool bOld = static_cast<const SvxShadowedItem&>(pEditView->GetAttribs().
986 0 : Get(EE_CHAR_SHADOW)).GetValue();
987 0 : aSet.Put( SvxShadowedItem( !bOld, EE_CHAR_SHADOW ) );
988 0 : rBindings.Invalidate( nSlot );
989 : }
990 0 : break;
991 :
992 : case SID_ATTR_CHAR_CONTOUR:
993 : {
994 : bool bOld = static_cast<const SvxContourItem&>(pEditView->GetAttribs().
995 0 : Get(EE_CHAR_OUTLINE)).GetValue();
996 0 : aSet.Put( SvxContourItem( !bOld, EE_CHAR_OUTLINE ) );
997 0 : rBindings.Invalidate( nSlot );
998 : }
999 0 : break;
1000 :
1001 : case SID_SET_SUPER_SCRIPT:
1002 : {
1003 : SvxEscapement eOld = (SvxEscapement) static_cast<const SvxEscapementItem&>(
1004 0 : pEditView->GetAttribs().Get(EE_CHAR_ESCAPEMENT)).GetEnumValue();
1005 : SvxEscapement eNew = (eOld == SVX_ESCAPEMENT_SUPERSCRIPT) ?
1006 0 : SVX_ESCAPEMENT_OFF : SVX_ESCAPEMENT_SUPERSCRIPT;
1007 0 : aSet.Put( SvxEscapementItem( eNew, EE_CHAR_ESCAPEMENT ) );
1008 0 : rBindings.Invalidate( nSlot );
1009 : }
1010 0 : break;
1011 : case SID_SET_SUB_SCRIPT:
1012 : {
1013 : SvxEscapement eOld = (SvxEscapement) static_cast<const SvxEscapementItem&>(
1014 0 : pEditView->GetAttribs().Get(EE_CHAR_ESCAPEMENT)).GetEnumValue();
1015 : SvxEscapement eNew = (eOld == SVX_ESCAPEMENT_SUBSCRIPT) ?
1016 0 : SVX_ESCAPEMENT_OFF : SVX_ESCAPEMENT_SUBSCRIPT;
1017 0 : aSet.Put( SvxEscapementItem( eNew, EE_CHAR_ESCAPEMENT ) );
1018 0 : rBindings.Invalidate( nSlot );
1019 : }
1020 0 : break;
1021 : case SID_ATTR_CHAR_KERNING:
1022 : {
1023 0 : if(pArgs)
1024 : {
1025 0 : aSet.Put ( pArgs->Get(pArgs->GetPool()->GetWhich(nSlot)));
1026 0 : rBindings.Invalidate( nSlot );
1027 : }
1028 : }
1029 0 : break;
1030 : }
1031 :
1032 : // anwenden
1033 :
1034 0 : EditEngine* pEngine = pEditView->GetEditEngine();
1035 0 : bool bOld = pEngine->GetUpdateMode();
1036 0 : pEngine->SetUpdateMode(false);
1037 :
1038 0 : pEditView->SetAttribs( aSet );
1039 :
1040 0 : pEngine->SetUpdateMode(bOld);
1041 0 : pEditView->Invalidate();
1042 :
1043 0 : ScInputHandler* pHdl = GetMyInputHdl();
1044 0 : pHdl->SetModified();
1045 :
1046 0 : rReq.Done();
1047 0 : }
1048 :
1049 0 : void ScEditShell::GetAttrState(SfxItemSet &rSet)
1050 : {
1051 0 : if ( !pViewData->HasEditView( pViewData->GetActivePart() ) ) // #125326#
1052 : {
1053 0 : lcl_DisableAll( rSet );
1054 0 : return;
1055 : }
1056 :
1057 0 : SfxItemSet aAttribs = pEditView->GetAttribs();
1058 0 : rSet.Put( aAttribs );
1059 :
1060 : // choose font info according to selection script type
1061 :
1062 0 : sal_uInt16 nScript = pEditView->GetSelectedScriptType();
1063 0 : if (nScript == 0) nScript = ScGlobal::GetDefaultScriptType();
1064 :
1065 : // #i55929# input-language-dependent script type (depends on input language if nothing selected)
1066 0 : sal_uInt16 nInputScript = nScript;
1067 0 : if ( !pEditView->GetSelection().HasRange() )
1068 : {
1069 0 : LanguageType nInputLang = pViewData->GetActiveWin()->GetInputLanguage();
1070 0 : if (nInputLang != LANGUAGE_DONTKNOW && nInputLang != LANGUAGE_SYSTEM)
1071 0 : nInputScript = SvtLanguageOptions::GetScriptTypeOfLanguage( nInputLang );
1072 : }
1073 :
1074 : // #i55929# according to spec, nInputScript is used for font and font height only
1075 0 : if ( rSet.GetItemState( EE_CHAR_FONTINFO ) != SfxItemState::UNKNOWN )
1076 0 : ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_FONTINFO, nInputScript );
1077 0 : if ( rSet.GetItemState( EE_CHAR_FONTHEIGHT ) != SfxItemState::UNKNOWN )
1078 0 : ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_FONTHEIGHT, nInputScript );
1079 0 : if ( rSet.GetItemState( EE_CHAR_WEIGHT ) != SfxItemState::UNKNOWN )
1080 0 : ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_WEIGHT, nScript );
1081 0 : if ( rSet.GetItemState( EE_CHAR_ITALIC ) != SfxItemState::UNKNOWN )
1082 0 : ScViewUtil::PutItemScript( rSet, aAttribs, EE_CHAR_ITALIC, nScript );
1083 :
1084 : // Unterstreichung
1085 :
1086 0 : SfxItemState eState = aAttribs.GetItemState( EE_CHAR_UNDERLINE, true );
1087 0 : if ( eState == SfxItemState::DONTCARE )
1088 : {
1089 0 : rSet.InvalidateItem( SID_ULINE_VAL_NONE );
1090 0 : rSet.InvalidateItem( SID_ULINE_VAL_SINGLE );
1091 0 : rSet.InvalidateItem( SID_ULINE_VAL_DOUBLE );
1092 0 : rSet.InvalidateItem( SID_ULINE_VAL_DOTTED );
1093 : }
1094 : else
1095 : {
1096 : FontUnderline eUnderline = static_cast<const SvxUnderlineItem&>(
1097 0 : aAttribs.Get(EE_CHAR_UNDERLINE)).GetLineStyle();
1098 0 : sal_uInt16 nId = SID_ULINE_VAL_NONE;
1099 0 : switch (eUnderline)
1100 : {
1101 0 : case UNDERLINE_SINGLE: nId = SID_ULINE_VAL_SINGLE; break;
1102 0 : case UNDERLINE_DOUBLE: nId = SID_ULINE_VAL_DOUBLE; break;
1103 0 : case UNDERLINE_DOTTED: nId = SID_ULINE_VAL_DOTTED; break;
1104 : default:
1105 0 : break;
1106 : }
1107 0 : rSet.Put( SfxBoolItem( nId, true ) );
1108 : }
1109 :
1110 : //! Testen, ob Klammer-Hervorhebung aktiv ist !!!!
1111 0 : ScInputHandler* pHdl = GetMyInputHdl();
1112 0 : if ( pHdl && pHdl->IsFormulaMode() )
1113 0 : rSet.ClearItem( EE_CHAR_WEIGHT ); // hervorgehobene Klammern hier nicht
1114 :
1115 : SvxEscapement eEsc = (SvxEscapement) static_cast<const SvxEscapementItem&>(
1116 0 : aAttribs.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();
1117 0 : if( eEsc == SVX_ESCAPEMENT_SUPERSCRIPT )
1118 : {
1119 0 : rSet.Put( SfxBoolItem( SID_SET_SUPER_SCRIPT, true ) );
1120 : }
1121 0 : else if( eEsc == SVX_ESCAPEMENT_SUBSCRIPT )
1122 : {
1123 0 : rSet.Put( SfxBoolItem( SID_SET_SUB_SCRIPT, true ) );
1124 : }
1125 0 : pViewData->GetBindings().Invalidate( SID_SET_SUPER_SCRIPT );
1126 0 : pViewData->GetBindings().Invalidate( SID_SET_SUB_SCRIPT );
1127 :
1128 0 : eState = aAttribs.GetItemState( EE_CHAR_KERNING, true );
1129 0 : pViewData->GetBindings().Invalidate( SID_ATTR_CHAR_KERNING );
1130 0 : if ( eState == SfxItemState::DONTCARE )
1131 : {
1132 : // rSet.InvalidateItem( SID_ATTR_CHAR_KERNING );
1133 0 : rSet.InvalidateItem(EE_CHAR_KERNING);
1134 0 : }
1135 : }
1136 :
1137 0 : OUString ScEditShell::GetSelectionText( bool bWholeWord )
1138 : {
1139 0 : OUString aStrSelection;
1140 :
1141 0 : if ( pViewData->HasEditView( pViewData->GetActivePart() ) ) // #125326#
1142 : {
1143 0 : if ( bWholeWord )
1144 : {
1145 0 : EditEngine* pEngine = pEditView->GetEditEngine();
1146 0 : ESelection aSel = pEditView->GetSelection();
1147 0 : OUString aStrCurrentDelimiters = pEngine->GetWordDelimiters();
1148 :
1149 0 : pEngine->SetWordDelimiters(" .,;\"'");
1150 0 : aStrSelection = pEngine->GetWord( aSel.nEndPara, aSel.nEndPos );
1151 0 : pEngine->SetWordDelimiters( aStrCurrentDelimiters );
1152 : }
1153 : else
1154 : {
1155 0 : aStrSelection = pEditView->GetSelected();
1156 : }
1157 : }
1158 :
1159 0 : return aStrSelection;
1160 : }
1161 :
1162 0 : void ScEditShell::ExecuteUndo(SfxRequest& rReq)
1163 : {
1164 : // Undo must be handled here because it's called for both EditViews
1165 :
1166 0 : ScInputHandler* pHdl = GetMyInputHdl();
1167 : OSL_ENSURE(pHdl,"no ScInputHandler");
1168 0 : EditView* pTopView = pHdl->GetTopView();
1169 0 : EditView* pTableView = pHdl->GetTableView();
1170 : OSL_ENSURE(pTableView,"no EditView");
1171 :
1172 0 : pHdl->DataChanging();
1173 :
1174 0 : const SfxItemSet* pReqArgs = rReq.GetArgs();
1175 0 : sal_uInt16 nSlot = rReq.GetSlot();
1176 0 : switch ( nSlot )
1177 : {
1178 : case SID_UNDO:
1179 : case SID_REDO:
1180 : {
1181 0 : bool bIsUndo = ( nSlot == SID_UNDO );
1182 :
1183 0 : sal_uInt16 nCount = 1;
1184 : const SfxPoolItem* pItem;
1185 0 : if ( pReqArgs && pReqArgs->GetItemState( nSlot, true, &pItem ) == SfxItemState::SET )
1186 0 : nCount = static_cast<const SfxUInt16Item*>(pItem)->GetValue();
1187 :
1188 0 : for (sal_uInt16 i=0; i<nCount; i++)
1189 : {
1190 0 : if ( bIsUndo )
1191 : {
1192 0 : pTableView->Undo();
1193 0 : if (pTopView)
1194 0 : pTopView->Undo();
1195 : }
1196 : else
1197 : {
1198 0 : pTableView->Redo();
1199 0 : if (pTopView)
1200 0 : pTopView->Redo();
1201 : }
1202 : }
1203 : }
1204 0 : break;
1205 : }
1206 0 : pViewData->GetBindings().InvalidateAll(false);
1207 :
1208 0 : pHdl->DataChanged();
1209 0 : }
1210 :
1211 0 : void ScEditShell::GetUndoState(SfxItemSet &rSet)
1212 : {
1213 : // Undo state is taken from normal ViewFrame state function
1214 :
1215 0 : SfxViewFrame* pViewFrm = pViewData->GetViewShell()->GetViewFrame();
1216 0 : if ( pViewFrm && GetUndoManager() )
1217 : {
1218 0 : SfxWhichIter aIter(rSet);
1219 0 : sal_uInt16 nWhich = aIter.FirstWhich();
1220 0 : while( nWhich )
1221 : {
1222 0 : pViewFrm->GetSlotState( nWhich, NULL, &rSet );
1223 0 : nWhich = aIter.NextWhich();
1224 0 : }
1225 : }
1226 :
1227 : // disable if no action in input line EditView
1228 :
1229 0 : ScInputHandler* pHdl = GetMyInputHdl();
1230 : OSL_ENSURE(pHdl,"no ScInputHandler");
1231 0 : EditView* pTopView = pHdl->GetTopView();
1232 0 : if (pTopView)
1233 : {
1234 0 : ::svl::IUndoManager& rTopMgr = pTopView->GetEditEngine()->GetUndoManager();
1235 0 : if ( rTopMgr.GetUndoActionCount() == 0 )
1236 0 : rSet.DisableItem( SID_UNDO );
1237 0 : if ( rTopMgr.GetRedoActionCount() == 0 )
1238 0 : rSet.DisableItem( SID_REDO );
1239 : }
1240 0 : }
1241 :
1242 0 : void ScEditShell::ExecuteTrans( SfxRequest& rReq )
1243 : {
1244 0 : sal_Int32 nType = ScViewUtil::GetTransliterationType( rReq.GetSlot() );
1245 0 : if ( nType )
1246 : {
1247 0 : ScInputHandler* pHdl = GetMyInputHdl();
1248 : assert(pHdl && "no ScInputHandler");
1249 :
1250 0 : EditView* pTopView = pHdl->GetTopView();
1251 0 : EditView* pTableView = pHdl->GetTableView();
1252 : assert(pTableView && "no EditView");
1253 :
1254 0 : pHdl->DataChanging();
1255 :
1256 0 : pTableView->TransliterateText( nType );
1257 0 : if (pTopView)
1258 0 : pTopView->TransliterateText( nType );
1259 :
1260 0 : pHdl->DataChanged();
1261 : }
1262 228 : }
1263 :
1264 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|