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