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