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