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 <com/sun/star/lang/Locale.hpp>
22 : #include <comphelper/string.hxx>
23 : #include "scitems.hxx"
24 :
25 : #include <editeng/adjitem.hxx>
26 : #include <svx/clipfmtitem.hxx>
27 : #include <editeng/cntritem.hxx>
28 : #include <editeng/crsditem.hxx>
29 : #include <editeng/editeng.hxx>
30 : #include <editeng/escpitem.hxx>
31 : #include <editeng/flditem.hxx>
32 : #include <editeng/fontitem.hxx>
33 : #include <editeng/frmdiritem.hxx>
34 : #include <svx/hlnkitem.hxx>
35 : #include <editeng/lspcitem.hxx>
36 : #include <svx/svdoutl.hxx>
37 : #include <editeng/unolingu.hxx>
38 : #include <editeng/outlobj.hxx>
39 : #include <editeng/postitem.hxx>
40 : #include <editeng/scripttypeitem.hxx>
41 : #include <editeng/shdditem.hxx>
42 : #include <svl/srchitem.hxx>
43 : #include <editeng/udlnitem.hxx>
44 : #include <editeng/wghtitem.hxx>
45 : #include <editeng/writingmodeitem.hxx>
46 : #include <sfx2/app.hxx>
47 : #include <sfx2/dispatch.hxx>
48 : #include <sfx2/objface.hxx>
49 : #include <sfx2/objsh.hxx>
50 : #include <sfx2/request.hxx>
51 : #include <sfx2/viewfrm.hxx>
52 : #include <svtools/cliplistener.hxx>
53 : #include <svtools/transfer.hxx>
54 : #include <svl/whiter.hxx>
55 : #include <svl/languageoptions.hxx>
56 : #include <vcl/msgbox.hxx>
57 :
58 : #include <svx/svxdlg.hxx>
59 : #include <svx/dialogs.hrc>
60 :
61 : #include "sc.hrc"
62 : #include "globstr.hrc"
63 : #include "scmod.hxx"
64 : #include "drtxtob.hxx"
65 : #include "fudraw.hxx"
66 : #include "viewdata.hxx"
67 : #include "document.hxx"
68 : #include "drawview.hxx"
69 : #include "viewutil.hxx"
70 : #include "scresid.hxx"
71 : #include "tabvwsh.hxx"
72 :
73 : #define ScDrawTextObjectBar
74 : #include "scslots.hxx"
75 :
76 :
77 : using namespace ::com::sun::star;
78 :
79 :
80 30 : SFX_IMPL_INTERFACE( ScDrawTextObjectBar, SfxShell, ScResId(SCSTR_DRAWTEXTSHELL) )
81 : {
82 10 : SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_OBJECT|SFX_VISIBILITY_STANDARD|SFX_VISIBILITY_SERVER,
83 5 : ScResId(RID_TEXT_TOOLBOX) );
84 5 : SFX_POPUPMENU_REGISTRATION( ScResId(RID_POPUP_DRAWTEXT) );
85 5 : SFX_CHILDWINDOW_REGISTRATION( ScGetFontWorkId() );
86 5 : }
87 :
88 0 : TYPEINIT1( ScDrawTextObjectBar, SfxShell );
89 :
90 :
91 :
92 : // abschalten der nicht erwuenschten Acceleratoren:
93 :
94 0 : void ScDrawTextObjectBar::StateDisableItems( SfxItemSet &rSet )
95 : {
96 0 : SfxWhichIter aIter(rSet);
97 0 : sal_uInt16 nWhich = aIter.FirstWhich();
98 :
99 0 : while (nWhich)
100 : {
101 0 : rSet.DisableItem( nWhich );
102 0 : nWhich = aIter.NextWhich();
103 0 : }
104 0 : }
105 :
106 0 : ScDrawTextObjectBar::ScDrawTextObjectBar(ScViewData* pData) :
107 0 : SfxShell(pData->GetViewShell()),
108 : pViewData(pData),
109 : pClipEvtLstnr(NULL),
110 0 : bPastePossible(false)
111 : {
112 0 : SetPool( pViewData->GetScDrawView()->GetDefaultAttr().GetPool() );
113 :
114 : // UndoManager wird beim Umschalten in den Edit-Modus umgesetzt...
115 0 : ::svl::IUndoManager* pMgr = pViewData->GetSfxDocShell()->GetUndoManager();
116 0 : SetUndoManager( pMgr );
117 0 : if ( !pViewData->GetDocument()->IsUndoEnabled() )
118 : {
119 0 : pMgr->SetMaxUndoActionCount( 0 );
120 : }
121 :
122 0 : SetHelpId( HID_SCSHELL_DRTXTOB );
123 0 : SetName(rtl::OUString("DrawText"));
124 0 : }
125 :
126 0 : ScDrawTextObjectBar::~ScDrawTextObjectBar()
127 : {
128 0 : if ( pClipEvtLstnr )
129 : {
130 0 : pClipEvtLstnr->AddRemoveListener( pViewData->GetActiveWin(), false );
131 :
132 : // The listener may just now be waiting for the SolarMutex and call the link
133 : // afterwards, in spite of RemoveListener. So the link has to be reset, too.
134 0 : pClipEvtLstnr->ClearCallbackLink();
135 :
136 0 : pClipEvtLstnr->release();
137 : }
138 0 : }
139 :
140 : //========================================================================
141 : //
142 : // Funktionen
143 : //
144 : //========================================================================
145 :
146 0 : void ScDrawTextObjectBar::Execute( SfxRequest &rReq )
147 : {
148 0 : ScDrawView* pView = pViewData->GetScDrawView();
149 0 : OutlinerView* pOutView = pView->GetTextEditOutlinerView();
150 0 : Outliner* pOutliner = pView->GetTextEditOutliner();
151 :
152 0 : if (!pOutView || !pOutliner)
153 : {
154 0 : ExecuteGlobal( rReq ); // auf ganze Objekte
155 0 : return;
156 : }
157 :
158 0 : const SfxItemSet* pReqArgs = rReq.GetArgs();
159 0 : sal_uInt16 nSlot = rReq.GetSlot();
160 0 : switch ( nSlot )
161 : {
162 : case SID_COPY:
163 0 : pOutView->Copy();
164 0 : break;
165 :
166 : case SID_CUT:
167 0 : pOutView->Cut();
168 0 : break;
169 :
170 : case SID_PASTE:
171 0 : pOutView->PasteSpecial();
172 0 : break;
173 :
174 : case SID_CLIPBOARD_FORMAT_ITEMS:
175 : {
176 0 : sal_uLong nFormat = 0;
177 : const SfxPoolItem* pItem;
178 0 : if ( pReqArgs &&
179 0 : pReqArgs->GetItemState(nSlot, sal_True, &pItem) == SFX_ITEM_SET &&
180 0 : pItem->ISA(SfxUInt32Item) )
181 : {
182 0 : nFormat = ((const SfxUInt32Item*)pItem)->GetValue();
183 : }
184 :
185 0 : if ( nFormat )
186 : {
187 0 : if (nFormat == SOT_FORMAT_STRING)
188 0 : pOutView->Paste();
189 : else
190 0 : pOutView->PasteSpecial();
191 : }
192 : }
193 0 : break;
194 :
195 : case SID_PASTE_SPECIAL:
196 0 : ExecutePasteContents( rReq );
197 0 : break;
198 :
199 : case SID_SELECTALL:
200 : {
201 0 : sal_uLong nCount = pOutliner->GetParagraphCount();
202 0 : ESelection aSel( 0,0,(sal_uInt16)nCount,0 );
203 0 : pOutView->SetSelection( aSel );
204 : }
205 0 : break;
206 :
207 : case SID_CHARMAP:
208 : {
209 : const SvxFontItem& rItem = (const SvxFontItem&)
210 0 : pOutView->GetAttribs().Get(EE_CHAR_FONTINFO);
211 :
212 0 : String aString;
213 0 : SvxFontItem aNewItem( EE_CHAR_FONTINFO );
214 :
215 0 : const SfxItemSet *pArgs = rReq.GetArgs();
216 0 : const SfxPoolItem* pItem = 0;
217 0 : if( pArgs )
218 0 : pArgs->GetItemState(GetPool().GetWhich(SID_CHARMAP), false, &pItem);
219 :
220 0 : if ( pItem )
221 : {
222 0 : aString = ((const SfxStringItem*)pItem)->GetValue();
223 0 : const SfxPoolItem* pFtItem = NULL;
224 0 : pArgs->GetItemState( GetPool().GetWhich(SID_ATTR_SPECIALCHAR), false, &pFtItem);
225 0 : const SfxStringItem* pFontItem = PTR_CAST( SfxStringItem, pFtItem );
226 0 : if ( pFontItem )
227 : {
228 0 : String aFontName(pFontItem->GetValue());
229 0 : Font aFont(aFontName, Size(1,1)); // Size nur wg. CTOR
230 0 : aNewItem = SvxFontItem( aFont.GetFamily(), aFont.GetName(),
231 0 : aFont.GetStyleName(), aFont.GetPitch(),
232 0 : aFont.GetCharSet(), ATTR_FONT );
233 : }
234 : else
235 0 : aNewItem = rItem;
236 : }
237 : else
238 0 : ScViewUtil::ExecuteCharMap( rItem, *pViewData->GetViewShell()->GetViewFrame(), aNewItem, aString );
239 :
240 0 : if ( aString.Len() )
241 : {
242 0 : SfxItemSet aSet( pOutliner->GetEmptyItemSet() );
243 0 : aSet.Put( aNewItem );
244 : // SetAttribs an der View selektiert ein Wort, wenn nichts selektiert ist
245 0 : pOutView->GetOutliner()->QuickSetAttribs( aSet, pOutView->GetSelection() );
246 0 : pOutView->InsertText(aString);
247 : }
248 :
249 0 : Invalidate( SID_ATTR_CHAR_FONT );
250 : }
251 0 : break;
252 :
253 : case SID_HYPERLINK_SETLINK:
254 0 : if( pReqArgs )
255 : {
256 : const SfxPoolItem* pItem;
257 0 : if ( pReqArgs->GetItemState( SID_HYPERLINK_SETLINK, sal_True, &pItem ) == SFX_ITEM_SET )
258 : {
259 0 : const SvxHyperlinkItem* pHyper = (const SvxHyperlinkItem*) pItem;
260 0 : const String& rName = pHyper->GetName();
261 0 : const String& rURL = pHyper->GetURL();
262 0 : const String& rTarget = pHyper->GetTargetFrame();
263 0 : SvxLinkInsertMode eMode = pHyper->GetInsertMode();
264 :
265 0 : sal_Bool bDone = false;
266 0 : if ( pOutView && ( eMode == HLINK_DEFAULT || eMode == HLINK_FIELD ) )
267 : {
268 0 : const SvxFieldItem* pFieldItem = pOutView->GetFieldAtSelection();
269 0 : if (pFieldItem)
270 : {
271 0 : const SvxFieldData* pField = pFieldItem->GetField();
272 0 : if ( pField && pField->ISA(SvxURLField) )
273 : {
274 : // altes Feld selektieren
275 :
276 0 : ESelection aSel = pOutView->GetSelection();
277 0 : aSel.Adjust();
278 0 : aSel.nEndPara = aSel.nStartPara;
279 0 : aSel.nEndPos = aSel.nStartPos + 1;
280 0 : pOutView->SetSelection( aSel );
281 : }
282 : }
283 :
284 : // neues Feld einfuegen
285 :
286 0 : SvxURLField aURLField( rURL, rName, SVXURLFORMAT_REPR );
287 0 : aURLField.SetTargetFrame( rTarget );
288 0 : SvxFieldItem aURLItem( aURLField, EE_FEATURE_FIELD );
289 0 : pOutView->InsertField( aURLItem );
290 :
291 : // select new field
292 :
293 0 : ESelection aSel = pOutView->GetSelection();
294 0 : if ( aSel.nStartPos == aSel.nEndPos && aSel.nStartPos > 0 )
295 : {
296 : // Cursor is behind the inserted field -> extend selection to the left
297 :
298 0 : --aSel.nStartPos;
299 0 : pOutView->SetSelection( aSel );
300 : }
301 :
302 0 : bDone = sal_True;
303 : }
304 :
305 0 : if (!bDone)
306 0 : ExecuteGlobal( rReq ); // normal an der View
307 :
308 : // InsertURL an der ViewShell schaltet bei "Text" die DrawShell ab !!!
309 : }
310 : }
311 0 : break;
312 :
313 : case SID_OPEN_HYPERLINK:
314 : {
315 0 : if ( pOutView )
316 : {
317 0 : const SvxFieldItem* pFieldItem = pOutView->GetFieldAtSelection();
318 0 : if ( pFieldItem )
319 : {
320 0 : const SvxFieldData* pField = pFieldItem->GetField();
321 0 : if( pField && pField->ISA( SvxURLField ) )
322 : {
323 0 : const SvxURLField* pURLField = static_cast< const SvxURLField* >( pField );
324 0 : ScGlobal::OpenURL( pURLField->GetURL(), pURLField->GetTargetFrame() );
325 : }
326 : }
327 : }
328 : }
329 0 : break;
330 :
331 : case SID_ENABLE_HYPHENATION:
332 : case SID_TEXTDIRECTION_LEFT_TO_RIGHT:
333 : case SID_TEXTDIRECTION_TOP_TO_BOTTOM:
334 0 : pView->ScEndTextEdit(); // end text edit before switching direction
335 0 : ExecuteGlobal( rReq );
336 : // restore consistent state between shells and functions:
337 0 : pViewData->GetDispatcher().Execute(SID_OBJECT_SELECT, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
338 0 : break;
339 :
340 : case SID_THES:
341 : {
342 0 : String aReplaceText;
343 0 : SFX_REQUEST_ARG( rReq, pItem2, SfxStringItem, SID_THES, false );
344 0 : if (pItem2)
345 0 : aReplaceText = pItem2->GetValue();
346 0 : if (aReplaceText.Len() > 0)
347 0 : ReplaceTextWithSynonym( pOutView->GetEditView(), aReplaceText );
348 : }
349 0 : break;
350 :
351 : case SID_THESAURUS:
352 : {
353 0 : pOutView->StartThesaurus();
354 : }
355 0 : break;
356 :
357 : }
358 : }
359 :
360 0 : void ScDrawTextObjectBar::GetState( SfxItemSet& rSet )
361 : {
362 0 : SfxViewFrame* pViewFrm = pViewData->GetViewShell()->GetViewFrame();
363 0 : sal_Bool bHasFontWork = pViewFrm->HasChildWindow(SID_FONTWORK);
364 0 : sal_Bool bDisableFontWork = false;
365 :
366 0 : if (IsNoteEdit())
367 : {
368 : // #i21255# notes now support rich text formatting (#i74140# but not fontwork)
369 0 : bDisableFontWork = sal_True;
370 : }
371 :
372 0 : if ( bDisableFontWork )
373 0 : rSet.DisableItem( SID_FONTWORK );
374 : else
375 0 : rSet.Put(SfxBoolItem(SID_FONTWORK, bHasFontWork));
376 :
377 0 : if ( rSet.GetItemState( SID_HYPERLINK_GETLINK ) != SFX_ITEM_UNKNOWN )
378 : {
379 0 : SvxHyperlinkItem aHLinkItem;
380 0 : SdrView* pView = pViewData->GetScDrawView();
381 0 : OutlinerView* pOutView = pView->GetTextEditOutlinerView();
382 0 : if ( pOutView )
383 : {
384 0 : sal_Bool bField = false;
385 0 : const SvxFieldItem* pFieldItem = pOutView->GetFieldAtSelection();
386 0 : if (pFieldItem)
387 : {
388 0 : const SvxFieldData* pField = pFieldItem->GetField();
389 0 : if ( pField && pField->ISA(SvxURLField) )
390 : {
391 0 : const SvxURLField* pURLField = (const SvxURLField*) pField;
392 0 : aHLinkItem.SetName( pURLField->GetRepresentation() );
393 0 : aHLinkItem.SetURL( pURLField->GetURL() );
394 0 : aHLinkItem.SetTargetFrame( pURLField->GetTargetFrame() );
395 0 : bField = sal_True;
396 : }
397 : }
398 0 : if (!bField)
399 : {
400 : // use selected text as name for urls
401 0 : String sReturn = pOutView->GetSelected();
402 0 : sReturn.Erase(255);
403 0 : aHLinkItem.SetName(comphelper::string::stripEnd(sReturn, ' '));
404 : }
405 : }
406 0 : rSet.Put(aHLinkItem);
407 : }
408 :
409 0 : if ( rSet.GetItemState( SID_OPEN_HYPERLINK ) != SFX_ITEM_UNKNOWN )
410 : {
411 0 : SdrView* pView = pViewData->GetScDrawView();
412 0 : OutlinerView* pOutView = pView->GetTextEditOutlinerView();
413 0 : bool bEnable = false;
414 0 : if ( pOutView )
415 : {
416 0 : const SvxFieldItem* pFieldItem = pOutView->GetFieldAtSelection();
417 0 : if ( pFieldItem )
418 : {
419 0 : const SvxFieldData* pField = pFieldItem->GetField();
420 0 : bEnable = pField && pField->ISA( SvxURLField );
421 : }
422 : }
423 0 : if( !bEnable )
424 0 : rSet.DisableItem( SID_OPEN_HYPERLINK );
425 : }
426 :
427 0 : if( rSet.GetItemState( SID_TRANSLITERATE_HALFWIDTH ) != SFX_ITEM_UNKNOWN )
428 0 : ScViewUtil::HideDisabledSlot( rSet, pViewFrm->GetBindings(), SID_TRANSLITERATE_HALFWIDTH );
429 0 : if( rSet.GetItemState( SID_TRANSLITERATE_FULLWIDTH ) != SFX_ITEM_UNKNOWN )
430 0 : ScViewUtil::HideDisabledSlot( rSet, pViewFrm->GetBindings(), SID_TRANSLITERATE_FULLWIDTH );
431 0 : if( rSet.GetItemState( SID_TRANSLITERATE_HIRAGANA ) != SFX_ITEM_UNKNOWN )
432 0 : ScViewUtil::HideDisabledSlot( rSet, pViewFrm->GetBindings(), SID_TRANSLITERATE_HIRAGANA );
433 0 : if( rSet.GetItemState( SID_TRANSLITERATE_KATAGANA ) != SFX_ITEM_UNKNOWN )
434 0 : ScViewUtil::HideDisabledSlot( rSet, pViewFrm->GetBindings(), SID_TRANSLITERATE_KATAGANA );
435 :
436 0 : if ( rSet.GetItemState( SID_ENABLE_HYPHENATION ) != SFX_ITEM_UNKNOWN )
437 : {
438 0 : SdrView* pView = pViewData->GetScDrawView();
439 0 : SfxItemSet aAttrs( pView->GetModel()->GetItemPool() );
440 0 : pView->GetAttributes( aAttrs );
441 0 : if( aAttrs.GetItemState( EE_PARA_HYPHENATE ) >= SFX_ITEM_AVAILABLE )
442 : {
443 0 : sal_Bool bValue = ( (const SfxBoolItem&) aAttrs.Get( EE_PARA_HYPHENATE ) ).GetValue();
444 0 : rSet.Put( SfxBoolItem( SID_ENABLE_HYPHENATION, bValue ) );
445 0 : }
446 : }
447 :
448 0 : if ( rSet.GetItemState( SID_THES ) != SFX_ITEM_UNKNOWN ||
449 0 : rSet.GetItemState( SID_THESAURUS ) != SFX_ITEM_UNKNOWN )
450 : {
451 0 : SdrView * pView = pViewData->GetScDrawView();
452 0 : OutlinerView* pOutView = pView->GetTextEditOutlinerView();
453 :
454 0 : String aStatusVal;
455 0 : LanguageType nLang = LANGUAGE_NONE;
456 0 : bool bIsLookUpWord = false;
457 0 : if ( pOutView )
458 : {
459 0 : EditView& rEditView = pOutView->GetEditView();
460 0 : bIsLookUpWord = GetStatusValueForThesaurusFromContext( aStatusVal, nLang, rEditView );
461 : }
462 0 : rSet.Put( SfxStringItem( SID_THES, aStatusVal ) );
463 :
464 : // disable thesaurus main menu and context menu entry if there is nothing to look up
465 0 : sal_Bool bCanDoThesaurus = ScModule::HasThesaurusLanguage( nLang );
466 0 : if (!bIsLookUpWord || !bCanDoThesaurus)
467 0 : rSet.DisableItem( SID_THES );
468 0 : if (!bCanDoThesaurus)
469 0 : rSet.DisableItem( SID_THESAURUS );
470 : }
471 0 : }
472 :
473 0 : IMPL_LINK( ScDrawTextObjectBar, ClipboardChanged, TransferableDataHelper*, pDataHelper )
474 : {
475 0 : if ( pDataHelper )
476 : {
477 0 : bPastePossible = ( pDataHelper->HasFormat( SOT_FORMAT_STRING ) || pDataHelper->HasFormat( SOT_FORMAT_RTF ) );
478 :
479 0 : SfxBindings& rBindings = pViewData->GetBindings();
480 0 : rBindings.Invalidate( SID_PASTE );
481 0 : rBindings.Invalidate( SID_PASTE_SPECIAL );
482 0 : rBindings.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS );
483 : }
484 0 : return 0;
485 : }
486 :
487 0 : void ScDrawTextObjectBar::GetClipState( SfxItemSet& rSet )
488 : {
489 0 : SdrView* pView = pViewData->GetScDrawView();
490 0 : if ( !pView->GetTextEditOutlinerView() )
491 : {
492 0 : GetGlobalClipState( rSet );
493 0 : return;
494 : }
495 :
496 0 : if ( !pClipEvtLstnr )
497 : {
498 : // create listener
499 0 : pClipEvtLstnr = new TransferableClipboardListener( LINK( this, ScDrawTextObjectBar, ClipboardChanged ) );
500 0 : pClipEvtLstnr->acquire();
501 0 : Window* pWin = pViewData->GetActiveWin();
502 0 : pClipEvtLstnr->AddRemoveListener( pWin, sal_True );
503 :
504 : // get initial state
505 0 : TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( pViewData->GetActiveWin() ) );
506 0 : bPastePossible = ( aDataHelper.HasFormat( SOT_FORMAT_STRING ) || aDataHelper.HasFormat( SOT_FORMAT_RTF ) );
507 : }
508 :
509 0 : SfxWhichIter aIter( rSet );
510 0 : sal_uInt16 nWhich = aIter.FirstWhich();
511 0 : while (nWhich)
512 : {
513 0 : switch (nWhich)
514 : {
515 : case SID_PASTE:
516 : case SID_PASTE_SPECIAL:
517 0 : if( !bPastePossible )
518 0 : rSet.DisableItem( nWhich );
519 0 : break;
520 : case SID_CLIPBOARD_FORMAT_ITEMS:
521 0 : if ( bPastePossible )
522 : {
523 0 : SvxClipboardFmtItem aFormats( SID_CLIPBOARD_FORMAT_ITEMS );
524 : TransferableDataHelper aDataHelper(
525 0 : TransferableDataHelper::CreateFromSystemClipboard( pViewData->GetActiveWin() ) );
526 :
527 0 : if ( aDataHelper.HasFormat( SOT_FORMAT_STRING ) )
528 0 : aFormats.AddClipbrdFormat( SOT_FORMAT_STRING );
529 0 : if ( aDataHelper.HasFormat( SOT_FORMAT_RTF ) )
530 0 : aFormats.AddClipbrdFormat( SOT_FORMAT_RTF );
531 :
532 0 : rSet.Put( aFormats );
533 : }
534 : else
535 0 : rSet.DisableItem( nWhich );
536 0 : break;
537 : }
538 0 : nWhich = aIter.NextWhich();
539 0 : }
540 : }
541 :
542 : //========================================================================
543 : //
544 : // Attribute
545 : //
546 : //========================================================================
547 :
548 0 : void ScDrawTextObjectBar::ExecuteToggle( SfxRequest &rReq )
549 : {
550 : // Unterstreichung
551 :
552 0 : SdrView* pView = pViewData->GetScDrawView();
553 :
554 0 : sal_uInt16 nSlot = rReq.GetSlot();
555 :
556 0 : SfxItemSet aSet( pView->GetDefaultAttr() );
557 :
558 0 : SfxItemSet aViewAttr(pView->GetModel()->GetItemPool());
559 0 : pView->GetAttributes(aViewAttr);
560 :
561 : // Unterstreichung
562 : FontUnderline eOld = ((const SvxUnderlineItem&) aViewAttr.
563 0 : Get(EE_CHAR_UNDERLINE)).GetLineStyle();
564 0 : FontUnderline eNew = eOld;
565 0 : switch (nSlot)
566 : {
567 : case SID_ULINE_VAL_NONE:
568 0 : eNew = UNDERLINE_NONE;
569 0 : break;
570 : case SID_ULINE_VAL_SINGLE:
571 0 : eNew = ( eOld == UNDERLINE_SINGLE ) ? UNDERLINE_NONE : UNDERLINE_SINGLE;
572 0 : break;
573 : case SID_ULINE_VAL_DOUBLE:
574 0 : eNew = ( eOld == UNDERLINE_DOUBLE ) ? UNDERLINE_NONE : UNDERLINE_DOUBLE;
575 0 : break;
576 : case SID_ULINE_VAL_DOTTED:
577 0 : eNew = ( eOld == UNDERLINE_DOTTED ) ? UNDERLINE_NONE : UNDERLINE_DOTTED;
578 0 : break;
579 : default:
580 0 : break;
581 : }
582 0 : aSet.Put( SvxUnderlineItem( eNew, EE_CHAR_UNDERLINE ) );
583 :
584 0 : pView->SetAttributes( aSet );
585 0 : rReq.Done();
586 0 : pViewData->GetScDrawView()->InvalidateDrawTextAttrs();
587 0 : }
588 :
589 0 : static void lcl_RemoveFields( OutlinerView& rOutView )
590 : {
591 : //! Outliner should have RemoveFields with a selection
592 :
593 0 : Outliner* pOutliner = rOutView.GetOutliner();
594 0 : if (!pOutliner) return;
595 :
596 0 : ESelection aOldSel = rOutView.GetSelection();
597 0 : ESelection aSel = aOldSel;
598 0 : aSel.Adjust();
599 0 : xub_StrLen nNewEnd = aSel.nEndPos;
600 :
601 0 : sal_Bool bUpdate = pOutliner->GetUpdateMode();
602 0 : sal_Bool bChanged = false;
603 :
604 : //! GetPortions and GetAttribs should be const!
605 0 : EditEngine& rEditEng = (EditEngine&)pOutliner->GetEditEngine();
606 :
607 0 : sal_uLong nParCount = pOutliner->GetParagraphCount();
608 0 : for (sal_uLong nPar=0; nPar<nParCount; nPar++)
609 0 : if ( nPar >= aSel.nStartPara && nPar <= aSel.nEndPara )
610 : {
611 0 : std::vector<sal_uInt16> aPortions;
612 0 : rEditEng.GetPortions( (sal_uInt16)nPar, aPortions );
613 : //! GetPortions should use xub_StrLen instead of USHORT
614 :
615 0 : for ( size_t nPos = aPortions.size(); nPos; )
616 : {
617 0 : --nPos;
618 0 : sal_uInt16 nEnd = aPortions[ nPos ];
619 0 : sal_uInt16 nStart = nPos ? aPortions[ nPos - 1 ] : 0;
620 : // fields are single characters
621 0 : if ( nEnd == nStart+1 &&
622 : ( nPar > aSel.nStartPara || nStart >= aSel.nStartPos ) &&
623 : ( nPar < aSel.nEndPara || nEnd <= aSel.nEndPos ) )
624 : {
625 0 : ESelection aFieldSel( (sal_uInt16)nPar, nStart, (sal_uInt16)nPar, nEnd );
626 0 : SfxItemSet aSet = rEditEng.GetAttribs( aFieldSel );
627 0 : if ( aSet.GetItemState( EE_FEATURE_FIELD ) == SFX_ITEM_ON )
628 : {
629 0 : if (!bChanged)
630 : {
631 0 : if (bUpdate)
632 0 : pOutliner->SetUpdateMode( false );
633 0 : String aName = ScGlobal::GetRscString( STR_UNDO_DELETECONTENTS );
634 0 : pOutliner->GetUndoManager().EnterListAction( aName, aName );
635 0 : bChanged = sal_True;
636 : }
637 :
638 0 : String aFieldText = rEditEng.GetText( aFieldSel );
639 0 : pOutliner->QuickInsertText( aFieldText, aFieldSel );
640 0 : if ( nPar == aSel.nEndPara )
641 : {
642 0 : nNewEnd = sal::static_int_cast<xub_StrLen>( nNewEnd + aFieldText.Len() );
643 0 : --nNewEnd;
644 0 : }
645 0 : }
646 : }
647 0 : }
648 : }
649 :
650 0 : if (bUpdate && bChanged)
651 : {
652 0 : pOutliner->GetUndoManager().LeaveListAction();
653 0 : pOutliner->SetUpdateMode( sal_True );
654 : }
655 :
656 0 : if ( aOldSel.IsEqual( aSel ) ) // aSel is adjusted
657 0 : aOldSel.nEndPos = nNewEnd;
658 : else
659 0 : aOldSel.nStartPos = nNewEnd; // if aOldSel is backwards
660 0 : rOutView.SetSelection( aOldSel );
661 : }
662 :
663 0 : void ScDrawTextObjectBar::ExecuteAttr( SfxRequest &rReq )
664 : {
665 0 : SdrView* pView = pViewData->GetScDrawView();
666 0 : const SfxItemSet* pArgs = rReq.GetArgs();
667 0 : sal_uInt16 nSlot = rReq.GetSlot();
668 :
669 0 : sal_Bool bArgsInReq = ( pArgs != NULL );
670 0 : if ( !bArgsInReq )
671 : {
672 0 : SfxItemSet aEditAttr(pView->GetModel()->GetItemPool());
673 0 : pView->GetAttributes(aEditAttr);
674 0 : SfxItemSet aNewAttr( *aEditAttr.GetPool(), aEditAttr.GetRanges() );
675 0 : sal_Bool bDone = sal_True;
676 :
677 0 : switch ( nSlot )
678 : {
679 : case SID_TEXT_STANDARD: // Harte Textattributierung loeschen
680 : {
681 0 : OutlinerView* pOutView = pView->IsTextEdit() ?
682 0 : pView->GetTextEditOutlinerView() : NULL;
683 0 : if ( pOutView )
684 0 : pOutView->Paint( Rectangle() );
685 :
686 0 : SfxItemSet aEmptyAttr( *aEditAttr.GetPool(), EE_ITEMS_START, EE_ITEMS_END );
687 0 : pView->SetAttributes( aEmptyAttr, sal_True );
688 :
689 0 : if ( pOutView )
690 : {
691 0 : lcl_RemoveFields( *pOutView );
692 0 : pOutView->ShowCursor();
693 : }
694 :
695 0 : rReq.Done( aEmptyAttr );
696 0 : pViewData->GetScDrawView()->InvalidateDrawTextAttrs();
697 0 : bDone = false; // bereits hier passiert
698 : }
699 0 : break;
700 :
701 : case SID_CHAR_DLG: // Dialog-Button
702 : case SID_ATTR_CHAR_FONT: // Controller nicht angezeigt
703 : case SID_ATTR_CHAR_FONTHEIGHT:
704 0 : bDone = ExecuteCharDlg( aEditAttr, aNewAttr );
705 0 : break;
706 :
707 : case SID_PARA_DLG:
708 0 : bDone = ExecuteParaDlg( aEditAttr, aNewAttr );
709 0 : break;
710 :
711 : case SID_ATTR_CHAR_WEIGHT:
712 0 : aNewAttr.Put( (const SvxWeightItem&)aEditAttr.Get( EE_CHAR_WEIGHT ) );
713 0 : break;
714 :
715 : case SID_ATTR_CHAR_POSTURE:
716 0 : aNewAttr.Put( (const SvxPostureItem&)aEditAttr.Get( EE_CHAR_ITALIC ) );
717 0 : break;
718 :
719 : case SID_ATTR_CHAR_UNDERLINE:
720 0 : aNewAttr.Put( (const SvxUnderlineItem&)aEditAttr.Get( EE_CHAR_UNDERLINE ) );
721 0 : break;
722 :
723 : case SID_ATTR_CHAR_OVERLINE:
724 0 : aNewAttr.Put( (const SvxOverlineItem&)aEditAttr.Get( EE_CHAR_OVERLINE ) );
725 0 : break;
726 :
727 : case SID_ATTR_CHAR_CONTOUR:
728 0 : aNewAttr.Put( (const SvxContourItem&)aEditAttr.Get( EE_CHAR_OUTLINE ) );
729 0 : break;
730 :
731 : case SID_ATTR_CHAR_SHADOWED:
732 0 : aNewAttr.Put( (const SvxShadowedItem&)aEditAttr.Get( EE_CHAR_SHADOW ) );
733 0 : break;
734 :
735 : case SID_ATTR_CHAR_STRIKEOUT:
736 0 : aNewAttr.Put( (const SvxCrossedOutItem&)aEditAttr.Get( EE_CHAR_STRIKEOUT ) );
737 0 : break;
738 :
739 : case SID_ALIGNLEFT:
740 : case SID_ALIGN_ANY_LEFT:
741 0 : aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_LEFT, EE_PARA_JUST ) );
742 0 : break;
743 :
744 : case SID_ALIGNCENTERHOR:
745 : case SID_ALIGN_ANY_HCENTER:
746 0 : aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_CENTER, EE_PARA_JUST ) );
747 0 : break;
748 :
749 : case SID_ALIGNRIGHT:
750 : case SID_ALIGN_ANY_RIGHT:
751 0 : aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_RIGHT, EE_PARA_JUST ) );
752 0 : break;
753 :
754 : case SID_ALIGNBLOCK:
755 : case SID_ALIGN_ANY_JUSTIFIED:
756 0 : aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_BLOCK, EE_PARA_JUST ) );
757 0 : break;
758 :
759 : case SID_ATTR_PARA_LINESPACE_10:
760 : {
761 0 : SvxLineSpacingItem aItem( SVX_LINESPACE_ONE_LINE, EE_PARA_SBL );
762 0 : aItem.SetPropLineSpace( 100 );
763 0 : aNewAttr.Put( aItem );
764 : }
765 0 : break;
766 :
767 : case SID_ATTR_PARA_LINESPACE_15:
768 : {
769 0 : SvxLineSpacingItem aItem( SVX_LINESPACE_ONE_POINT_FIVE_LINES, EE_PARA_SBL );
770 0 : aItem.SetPropLineSpace( 150 );
771 0 : aNewAttr.Put( aItem );
772 : }
773 0 : break;
774 :
775 : case SID_ATTR_PARA_LINESPACE_20:
776 : {
777 0 : SvxLineSpacingItem aItem( SVX_LINESPACE_TWO_LINES, EE_PARA_SBL );
778 0 : aItem.SetPropLineSpace( 200 );
779 0 : aNewAttr.Put( aItem );
780 : }
781 0 : break;
782 :
783 : case SID_SET_SUPER_SCRIPT:
784 : {
785 0 : SvxEscapementItem aItem(EE_CHAR_ESCAPEMENT);
786 : SvxEscapement eEsc = (SvxEscapement) ( (const SvxEscapementItem&)
787 0 : aEditAttr.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();
788 :
789 0 : if( eEsc == SVX_ESCAPEMENT_SUPERSCRIPT )
790 0 : aItem.SetEscapement( SVX_ESCAPEMENT_OFF );
791 : else
792 0 : aItem.SetEscapement( SVX_ESCAPEMENT_SUPERSCRIPT );
793 0 : aNewAttr.Put( aItem );
794 : }
795 0 : break;
796 : case SID_SET_SUB_SCRIPT:
797 : {
798 0 : SvxEscapementItem aItem(EE_CHAR_ESCAPEMENT);
799 : SvxEscapement eEsc = (SvxEscapement) ( (const SvxEscapementItem&)
800 0 : aEditAttr.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();
801 :
802 0 : if( eEsc == SVX_ESCAPEMENT_SUBSCRIPT )
803 0 : aItem.SetEscapement( SVX_ESCAPEMENT_OFF );
804 : else
805 0 : aItem.SetEscapement( SVX_ESCAPEMENT_SUBSCRIPT );
806 0 : aNewAttr.Put( aItem );
807 : }
808 0 : break;
809 :
810 : case SID_DRAWTEXT_ATTR_DLG:
811 : {
812 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
813 0 : SfxAbstractTabDialog *pDlg = pFact->CreateTextTabDialog( pViewData->GetDialogParent(), &aEditAttr, pView );
814 :
815 0 : bDone = ( RET_OK == pDlg->Execute() );
816 :
817 0 : if ( bDone )
818 0 : aNewAttr.Put( *pDlg->GetOutputItemSet() );
819 :
820 0 : delete pDlg;
821 : }
822 0 : break;
823 : }
824 :
825 0 : if ( bDone ) // wurden Attribute geaendert?
826 : {
827 0 : rReq.Done( aNewAttr );
828 0 : pArgs = rReq.GetArgs();
829 0 : }
830 : }
831 :
832 0 : if ( pArgs )
833 : {
834 0 : if ( bArgsInReq &&
835 : ( nSlot == SID_ATTR_CHAR_FONT || nSlot == SID_ATTR_CHAR_FONTHEIGHT ||
836 : nSlot == SID_ATTR_CHAR_WEIGHT || nSlot == SID_ATTR_CHAR_POSTURE ) )
837 : {
838 : // font items from toolbox controller have to be applied for the right script type
839 :
840 : // #i78017 establish the same behaviour as in Writer
841 0 : sal_uInt16 nScript = SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN | SCRIPTTYPE_COMPLEX;
842 0 : if (nSlot == SID_ATTR_CHAR_FONT)
843 0 : nScript = pView->GetScriptType();
844 :
845 0 : SfxItemPool& rPool = GetPool();
846 0 : SvxScriptSetItem aSetItem( nSlot, rPool );
847 0 : sal_uInt16 nWhich = rPool.GetWhich( nSlot );
848 0 : aSetItem.PutItemForScriptType( nScript, pArgs->Get( nWhich ) );
849 :
850 0 : pView->SetAttributes( aSetItem.GetItemSet() );
851 : }
852 : else
853 : {
854 : // use args directly
855 :
856 0 : pView->SetAttributes( *pArgs );
857 : }
858 0 : pViewData->GetScDrawView()->InvalidateDrawTextAttrs();
859 : }
860 0 : }
861 :
862 0 : void ScDrawTextObjectBar::GetAttrState( SfxItemSet& rDestSet )
863 : {
864 0 : if ( IsNoteEdit() )
865 : {
866 : // issue 21255 - Notes now support rich text formatting.
867 : }
868 :
869 0 : SvtLanguageOptions aLangOpt;
870 0 : sal_Bool bDisableCTLFont = !aLangOpt.IsCTLFontEnabled();
871 0 : sal_Bool bDisableVerticalText = !aLangOpt.IsVerticalTextEnabled();
872 :
873 0 : SdrView* pView = pViewData->GetScDrawView();
874 0 : SfxItemSet aAttrSet(pView->GetModel()->GetItemPool());
875 0 : pView->GetAttributes(aAttrSet);
876 :
877 : // direkte Attribute
878 :
879 0 : rDestSet.Put( aAttrSet );
880 :
881 : // choose font info according to selection script type
882 :
883 0 : sal_uInt16 nScript = pView->GetScriptType();
884 :
885 : // #i55929# input-language-dependent script type (depends on input language if nothing selected)
886 0 : sal_uInt16 nInputScript = nScript;
887 0 : OutlinerView* pOutView = pView->GetTextEditOutlinerView();
888 0 : if (pOutView && !pOutView->GetSelection().HasRange())
889 : {
890 0 : LanguageType nInputLang = pViewData->GetActiveWin()->GetInputLanguage();
891 0 : if (nInputLang != LANGUAGE_DONTKNOW && nInputLang != LANGUAGE_SYSTEM)
892 0 : nInputScript = SvtLanguageOptions::GetScriptTypeOfLanguage( nInputLang );
893 : }
894 :
895 : // #i55929# according to spec, nInputScript is used for font and font height only
896 0 : if ( rDestSet.GetItemState( EE_CHAR_FONTINFO ) != SFX_ITEM_UNKNOWN )
897 0 : ScViewUtil::PutItemScript( rDestSet, aAttrSet, EE_CHAR_FONTINFO, nInputScript );
898 0 : if ( rDestSet.GetItemState( EE_CHAR_FONTHEIGHT ) != SFX_ITEM_UNKNOWN )
899 0 : ScViewUtil::PutItemScript( rDestSet, aAttrSet, EE_CHAR_FONTHEIGHT, nInputScript );
900 0 : if ( rDestSet.GetItemState( EE_CHAR_WEIGHT ) != SFX_ITEM_UNKNOWN )
901 0 : ScViewUtil::PutItemScript( rDestSet, aAttrSet, EE_CHAR_WEIGHT, nScript );
902 0 : if ( rDestSet.GetItemState( EE_CHAR_ITALIC ) != SFX_ITEM_UNKNOWN )
903 0 : ScViewUtil::PutItemScript( rDestSet, aAttrSet, EE_CHAR_ITALIC, nScript );
904 :
905 : // Ausrichtung
906 :
907 0 : SvxAdjust eAdj = ((const SvxAdjustItem&)aAttrSet.Get(EE_PARA_JUST)).GetAdjust();
908 0 : switch( eAdj )
909 : {
910 : case SVX_ADJUST_LEFT:
911 0 : rDestSet.Put( SfxBoolItem( SID_ALIGNLEFT, sal_True ) );
912 0 : break;
913 : case SVX_ADJUST_CENTER:
914 0 : rDestSet.Put( SfxBoolItem( SID_ALIGNCENTERHOR, sal_True ) );
915 0 : break;
916 : case SVX_ADJUST_RIGHT:
917 0 : rDestSet.Put( SfxBoolItem( SID_ALIGNRIGHT, sal_True ) );
918 0 : break;
919 : case SVX_ADJUST_BLOCK:
920 0 : rDestSet.Put( SfxBoolItem( SID_ALIGNBLOCK, sal_True ) );
921 0 : break;
922 : default:
923 : {
924 : // added to avoid warnings
925 : }
926 : }
927 : // pseudo slots for Format menu
928 0 : rDestSet.Put( SfxBoolItem( SID_ALIGN_ANY_LEFT, eAdj == SVX_ADJUST_LEFT ) );
929 0 : rDestSet.Put( SfxBoolItem( SID_ALIGN_ANY_HCENTER, eAdj == SVX_ADJUST_CENTER ) );
930 0 : rDestSet.Put( SfxBoolItem( SID_ALIGN_ANY_RIGHT, eAdj == SVX_ADJUST_RIGHT ) );
931 0 : rDestSet.Put( SfxBoolItem( SID_ALIGN_ANY_JUSTIFIED, eAdj == SVX_ADJUST_BLOCK ) );
932 :
933 : // Zeilenabstand
934 :
935 : sal_uInt16 nLineSpace = (sal_uInt16)
936 : ((const SvxLineSpacingItem&)aAttrSet.
937 0 : Get( EE_PARA_SBL )).GetPropLineSpace();
938 0 : switch( nLineSpace )
939 : {
940 : case 100:
941 0 : rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_10, sal_True ) );
942 0 : break;
943 : case 150:
944 0 : rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_15, sal_True ) );
945 0 : break;
946 : case 200:
947 0 : rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_20, sal_True ) );
948 0 : break;
949 : }
950 :
951 : // hoch-/tiefgestellt
952 :
953 : SvxEscapement eEsc = (SvxEscapement) ( (const SvxEscapementItem&)
954 0 : aAttrSet.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();
955 0 : if( eEsc == SVX_ESCAPEMENT_SUPERSCRIPT )
956 0 : rDestSet.Put( SfxBoolItem( SID_SET_SUPER_SCRIPT, sal_True ) );
957 0 : else if( eEsc == SVX_ESCAPEMENT_SUBSCRIPT )
958 0 : rDestSet.Put( SfxBoolItem( SID_SET_SUB_SCRIPT, sal_True ) );
959 :
960 : // Unterstreichung
961 :
962 0 : SfxItemState eState = aAttrSet.GetItemState( EE_CHAR_UNDERLINE, sal_True );
963 0 : if ( eState == SFX_ITEM_DONTCARE )
964 : {
965 0 : rDestSet.InvalidateItem( SID_ULINE_VAL_NONE );
966 0 : rDestSet.InvalidateItem( SID_ULINE_VAL_SINGLE );
967 0 : rDestSet.InvalidateItem( SID_ULINE_VAL_DOUBLE );
968 0 : rDestSet.InvalidateItem( SID_ULINE_VAL_DOTTED );
969 : }
970 : else
971 : {
972 : FontUnderline eUnderline = ((const SvxUnderlineItem&)
973 0 : aAttrSet.Get(EE_CHAR_UNDERLINE)).GetLineStyle();
974 0 : sal_uInt16 nId = SID_ULINE_VAL_NONE;
975 0 : switch (eUnderline)
976 : {
977 0 : case UNDERLINE_SINGLE: nId = SID_ULINE_VAL_SINGLE; break;
978 0 : case UNDERLINE_DOUBLE: nId = SID_ULINE_VAL_DOUBLE; break;
979 0 : case UNDERLINE_DOTTED: nId = SID_ULINE_VAL_DOTTED; break;
980 : default:
981 0 : break;
982 : }
983 0 : rDestSet.Put( SfxBoolItem( nId, sal_True ) );
984 : }
985 :
986 : // horizontal / vertical
987 :
988 0 : sal_Bool bLeftToRight = sal_True;
989 :
990 0 : SdrOutliner* pOutl = pView->GetTextEditOutliner();
991 0 : if( pOutl )
992 : {
993 0 : if( pOutl->IsVertical() )
994 0 : bLeftToRight = false;
995 : }
996 : else
997 0 : bLeftToRight = ( (const SvxWritingModeItem&) aAttrSet.Get( SDRATTR_TEXTDIRECTION ) ).GetValue() == com::sun::star::text::WritingMode_LR_TB;
998 :
999 0 : if ( bDisableVerticalText )
1000 : {
1001 0 : rDestSet.DisableItem( SID_TEXTDIRECTION_LEFT_TO_RIGHT );
1002 0 : rDestSet.DisableItem( SID_TEXTDIRECTION_TOP_TO_BOTTOM );
1003 : }
1004 : else
1005 : {
1006 0 : rDestSet.Put( SfxBoolItem( SID_TEXTDIRECTION_LEFT_TO_RIGHT, bLeftToRight ) );
1007 0 : rDestSet.Put( SfxBoolItem( SID_TEXTDIRECTION_TOP_TO_BOTTOM, !bLeftToRight ) );
1008 : }
1009 :
1010 : // left-to-right or right-to-left
1011 :
1012 0 : if ( !bLeftToRight || bDisableCTLFont )
1013 : {
1014 : // disabled if vertical
1015 0 : rDestSet.DisableItem( SID_ATTR_PARA_LEFT_TO_RIGHT );
1016 0 : rDestSet.DisableItem( SID_ATTR_PARA_RIGHT_TO_LEFT );
1017 : }
1018 0 : else if ( aAttrSet.GetItemState( EE_PARA_WRITINGDIR ) == SFX_ITEM_DONTCARE )
1019 : {
1020 0 : rDestSet.InvalidateItem( SID_ATTR_PARA_LEFT_TO_RIGHT );
1021 0 : rDestSet.InvalidateItem( SID_ATTR_PARA_RIGHT_TO_LEFT );
1022 : }
1023 : else
1024 : {
1025 : SvxFrameDirection eAttrDir = (SvxFrameDirection)((const SvxFrameDirectionItem&)
1026 0 : aAttrSet.Get( EE_PARA_WRITINGDIR )).GetValue();
1027 0 : if ( eAttrDir == FRMDIR_ENVIRONMENT )
1028 : {
1029 : // get "environment" direction from page style
1030 0 : if ( pViewData->GetDocument()->GetEditTextDirection( pViewData->GetTabNo() ) == EE_HTEXTDIR_R2L )
1031 0 : eAttrDir = FRMDIR_HORI_RIGHT_TOP;
1032 : else
1033 0 : eAttrDir = FRMDIR_HORI_LEFT_TOP;
1034 : }
1035 0 : rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_LEFT_TO_RIGHT, ( eAttrDir == FRMDIR_HORI_LEFT_TOP ) ) );
1036 0 : rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_RIGHT_TO_LEFT, ( eAttrDir == FRMDIR_HORI_RIGHT_TOP ) ) );
1037 0 : }
1038 0 : }
1039 :
1040 0 : void ScDrawTextObjectBar::ExecuteTrans( SfxRequest& rReq )
1041 : {
1042 0 : sal_Int32 nType = ScViewUtil::GetTransliterationType( rReq.GetSlot() );
1043 0 : if ( nType )
1044 : {
1045 0 : ScDrawView* pView = pViewData->GetScDrawView();
1046 0 : OutlinerView* pOutView = pView->GetTextEditOutlinerView();
1047 0 : if ( pOutView )
1048 : {
1049 : // change selected text in object
1050 0 : pOutView->TransliterateText( nType );
1051 : }
1052 : else
1053 : {
1054 : //! apply to whole objects?
1055 : }
1056 : }
1057 15 : }
1058 :
1059 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|