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