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