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 260 : SFX_IMPL_INTERFACE(ScDrawTextObjectBar, SfxShell)
85 :
86 52 : void ScDrawTextObjectBar::InitInterface_Impl()
87 : {
88 : GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_OBJECT|SFX_VISIBILITY_STANDARD|SFX_VISIBILITY_SERVER,
89 52 : RID_TEXT_TOOLBOX);
90 :
91 52 : GetStaticInterface()->RegisterPopupMenu(ScResId(RID_POPUP_DRAWTEXT));
92 :
93 52 : GetStaticInterface()->RegisterChildWindow(ScGetFontWorkId());
94 52 : }
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 : SotClipboardFormatId nFormat = SotClipboardFormatId::NONE;
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<SotClipboardFormatId>(static_cast<const SfxUInt32Item*>(pItem)->GetValue());
186 : }
187 :
188 0 : if ( nFormat != SotClipboardFormatId::NONE )
189 : {
190 0 : if (nFormat == SotClipboardFormatId::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( SotClipboardFormatId::STRING ) || pDataHelper->HasFormat( SotClipboardFormatId::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( SotClipboardFormatId::STRING ) || aDataHelper.HasFormat( SotClipboardFormatId::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 : SvxClipboardFormatItem aFormats( SID_CLIPBOARD_FORMAT_ITEMS );
528 : TransferableDataHelper aDataHelper(
529 0 : TransferableDataHelper::CreateFromSystemClipboard( pViewData->GetActiveWin() ) );
530 :
531 0 : if ( aDataHelper.HasFormat( SotClipboardFormatId::STRING ) )
532 0 : aFormats.AddClipbrdFormat( SotClipboardFormatId::STRING );
533 0 : if ( aDataHelper.HasFormat( SotClipboardFormatId::RTF ) )
534 0 : aFormats.AddClipbrdFormat( SotClipboardFormatId::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 : case SID_PARASPACE_INCREASE:
765 : case SID_PARASPACE_DECREASE:
766 : {
767 : SvxULSpaceItem aULSpace(
768 0 : static_cast< const SvxULSpaceItem& >( aEditAttr.Get( EE_PARA_ULSPACE ) ) );
769 0 : sal_uInt16 nUpper = aULSpace.GetUpper();
770 0 : sal_uInt16 nLower = aULSpace.GetLower();
771 :
772 0 : if ( nSlot == SID_PARASPACE_INCREASE )
773 : {
774 0 : nUpper += 100;
775 0 : nLower += 100;
776 : }
777 : else
778 : {
779 0 : nUpper = std::max< sal_Int16 >( nUpper - 100, 0 );
780 0 : nLower = std::max< sal_Int16 >( nLower - 100, 0 );
781 : }
782 :
783 0 : aULSpace.SetUpper( nUpper );
784 0 : aULSpace.SetLower( nLower );
785 0 : aNewAttr.Put( aULSpace );
786 : }
787 0 : break;
788 :
789 : default:
790 0 : bSet = false;
791 : }
792 :
793 0 : bool bDone = true;
794 0 : bool bArgsInReq = ( pArgs != NULL );
795 :
796 0 : if ( !bArgsInReq )
797 : {
798 0 : switch ( nSlot )
799 : {
800 : case SID_TEXT_STANDARD: // Harte Textattributierung loeschen
801 : {
802 0 : OutlinerView* pOutView = pView->IsTextEdit() ?
803 0 : pView->GetTextEditOutlinerView() : NULL;
804 0 : if ( pOutView )
805 0 : pOutView->Paint( Rectangle() );
806 :
807 0 : SfxItemSet aEmptyAttr( *aEditAttr.GetPool(), EE_ITEMS_START, EE_ITEMS_END );
808 0 : pView->SetAttributes( aEmptyAttr, true );
809 :
810 0 : if ( pOutView )
811 : {
812 0 : lcl_RemoveFields( *pOutView );
813 0 : pOutView->ShowCursor();
814 : }
815 :
816 0 : rReq.Done( aEmptyAttr );
817 0 : pViewData->GetScDrawView()->InvalidateDrawTextAttrs();
818 0 : bDone = false; // bereits hier passiert
819 : }
820 0 : break;
821 :
822 : case SID_CHAR_DLG_EFFECT:
823 : case SID_CHAR_DLG: // Dialog-Button
824 : case SID_ATTR_CHAR_FONT: // Controller nicht angezeigt
825 : case SID_ATTR_CHAR_FONTHEIGHT:
826 0 : bDone = ExecuteCharDlg( aEditAttr, aNewAttr , nSlot);
827 0 : break;
828 :
829 : case SID_PARA_DLG:
830 0 : bDone = ExecuteParaDlg( aEditAttr, aNewAttr );
831 0 : break;
832 :
833 : case SID_ATTR_CHAR_WEIGHT:
834 0 : aNewAttr.Put( static_cast<const SvxWeightItem&>(aEditAttr.Get( EE_CHAR_WEIGHT )) );
835 0 : break;
836 :
837 : case SID_ATTR_CHAR_POSTURE:
838 0 : aNewAttr.Put( static_cast<const SvxPostureItem&>(aEditAttr.Get( EE_CHAR_ITALIC )) );
839 0 : break;
840 :
841 : case SID_ATTR_CHAR_UNDERLINE:
842 0 : aNewAttr.Put( static_cast<const SvxUnderlineItem&>(aEditAttr.Get( EE_CHAR_UNDERLINE )) );
843 0 : break;
844 :
845 : case SID_ATTR_CHAR_OVERLINE:
846 0 : aNewAttr.Put( static_cast<const SvxOverlineItem&>(aEditAttr.Get( EE_CHAR_OVERLINE )) );
847 0 : break;
848 :
849 : case SID_ATTR_CHAR_CONTOUR:
850 0 : aNewAttr.Put( static_cast<const SvxContourItem&>(aEditAttr.Get( EE_CHAR_OUTLINE )) );
851 0 : break;
852 :
853 : case SID_ATTR_CHAR_SHADOWED:
854 0 : aNewAttr.Put( static_cast<const SvxShadowedItem&>(aEditAttr.Get( EE_CHAR_SHADOW )) );
855 0 : break;
856 :
857 : case SID_ATTR_CHAR_STRIKEOUT:
858 0 : aNewAttr.Put( static_cast<const SvxCrossedOutItem&>(aEditAttr.Get( EE_CHAR_STRIKEOUT )) );
859 0 : break;
860 :
861 : case SID_DRAWTEXT_ATTR_DLG:
862 : {
863 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
864 0 : boost::scoped_ptr<SfxAbstractTabDialog> pDlg(pFact->CreateTextTabDialog( pViewData->GetDialogParent(), &aEditAttr, pView ));
865 :
866 0 : bDone = ( RET_OK == pDlg->Execute() );
867 :
868 0 : if ( bDone )
869 0 : aNewAttr.Put( *pDlg->GetOutputItemSet() );
870 :
871 0 : pDlg.reset();
872 :
873 0 : SfxBindings& rBindings = pViewData->GetBindings();
874 0 : rBindings.Invalidate( SID_TABLE_VERT_NONE );
875 0 : rBindings.Invalidate( SID_TABLE_VERT_CENTER );
876 0 : rBindings.Invalidate( SID_TABLE_VERT_BOTTOM );
877 : }
878 0 : break;
879 : }
880 : }
881 :
882 0 : if ( bSet || bDone )
883 : {
884 0 : rReq.Done( aNewAttr );
885 0 : pArgs = rReq.GetArgs();
886 : }
887 :
888 0 : if ( pArgs )
889 : {
890 0 : if ( bArgsInReq &&
891 0 : ( nSlot == SID_ATTR_CHAR_FONT || nSlot == SID_ATTR_CHAR_FONTHEIGHT ||
892 0 : nSlot == SID_ATTR_CHAR_WEIGHT || nSlot == SID_ATTR_CHAR_POSTURE ) )
893 : {
894 : // font items from toolbox controller have to be applied for the right script type
895 :
896 : // #i78017 establish the same behaviour as in Writer
897 0 : SvtScriptType nScript = SvtScriptType::LATIN | SvtScriptType::ASIAN | SvtScriptType::COMPLEX;
898 0 : if (nSlot == SID_ATTR_CHAR_FONT)
899 0 : nScript = pView->GetScriptType();
900 :
901 0 : SfxItemPool& rPool = GetPool();
902 0 : SvxScriptSetItem aSetItem( nSlot, rPool );
903 0 : sal_uInt16 nWhich = rPool.GetWhich( nSlot );
904 0 : aSetItem.PutItemForScriptType( nScript, pArgs->Get( nWhich ) );
905 :
906 0 : pView->SetAttributes( aSetItem.GetItemSet() );
907 : }
908 0 : else if( nSlot == SID_ATTR_PARA_LRSPACE )
909 : {
910 0 : sal_uInt16 nId = SID_ATTR_PARA_LRSPACE;
911 : const SvxLRSpaceItem& rItem = static_cast<const SvxLRSpaceItem&>(
912 0 : pArgs->Get( nId ));
913 0 : SfxItemSet aAttr( GetPool(), EE_PARA_LRSPACE, EE_PARA_LRSPACE );
914 0 : nId = EE_PARA_LRSPACE;
915 : SvxLRSpaceItem aLRSpaceItem( rItem.GetLeft(),
916 : rItem.GetRight(), rItem.GetTextLeft(),
917 0 : rItem.GetTextFirstLineOfst(), nId );
918 0 : aAttr.Put( aLRSpaceItem );
919 0 : pView->SetAttributes( aAttr );
920 : }
921 0 : else if( nSlot == SID_ATTR_PARA_LINESPACE )
922 : {
923 : SvxLineSpacingItem aLineSpaceItem = static_cast<const SvxLineSpacingItem&>(pArgs->Get(
924 0 : GetPool().GetWhich(nSlot)));
925 0 : SfxItemSet aAttr( GetPool(), EE_PARA_SBL, EE_PARA_SBL );
926 0 : aAttr.Put( aLineSpaceItem );
927 0 : pView->SetAttributes( aAttr );
928 : }
929 0 : else if( nSlot == SID_ATTR_PARA_ULSPACE )
930 : {
931 : SvxULSpaceItem aULSpaceItem = static_cast<const SvxULSpaceItem&>(pArgs->Get(
932 0 : GetPool().GetWhich(nSlot)));
933 0 : SfxItemSet aAttr( GetPool(), EE_PARA_ULSPACE, EE_PARA_ULSPACE );
934 0 : aULSpaceItem.SetWhich(EE_PARA_ULSPACE);
935 0 : aAttr.Put( aULSpaceItem );
936 0 : pView->SetAttributes( aAttr );
937 : }
938 : else
939 : {
940 : // use args directly
941 0 : pView->SetAttributes( *pArgs );
942 : }
943 0 : pViewData->GetScDrawView()->InvalidateDrawTextAttrs();
944 0 : }
945 0 : }
946 :
947 0 : void ScDrawTextObjectBar::GetAttrState( SfxItemSet& rDestSet )
948 : {
949 0 : if ( IsNoteEdit() )
950 : {
951 : // issue 21255 - Notes now support rich text formatting.
952 : }
953 :
954 0 : SvtLanguageOptions aLangOpt;
955 0 : bool bDisableCTLFont = !aLangOpt.IsCTLFontEnabled();
956 0 : bool bDisableVerticalText = !aLangOpt.IsVerticalTextEnabled();
957 :
958 0 : SdrView* pView = pViewData->GetScDrawView();
959 0 : SfxItemSet aAttrSet(pView->GetModel()->GetItemPool());
960 0 : pView->GetAttributes(aAttrSet);
961 :
962 : // direkte Attribute
963 :
964 0 : rDestSet.Put( aAttrSet );
965 :
966 : // choose font info according to selection script type
967 :
968 0 : SvtScriptType nScript = pView->GetScriptType();
969 :
970 : // #i55929# input-language-dependent script type (depends on input language if nothing selected)
971 0 : SvtScriptType nInputScript = nScript;
972 0 : OutlinerView* pOutView = pView->GetTextEditOutlinerView();
973 0 : if (pOutView && !pOutView->GetSelection().HasRange())
974 : {
975 0 : LanguageType nInputLang = pViewData->GetActiveWin()->GetInputLanguage();
976 0 : if (nInputLang != LANGUAGE_DONTKNOW && nInputLang != LANGUAGE_SYSTEM)
977 0 : nInputScript = SvtLanguageOptions::GetScriptTypeOfLanguage( nInputLang );
978 : }
979 :
980 : // #i55929# according to spec, nInputScript is used for font and font height only
981 0 : if ( rDestSet.GetItemState( EE_CHAR_FONTINFO ) != SfxItemState::UNKNOWN )
982 0 : ScViewUtil::PutItemScript( rDestSet, aAttrSet, EE_CHAR_FONTINFO, nInputScript );
983 0 : if ( rDestSet.GetItemState( EE_CHAR_FONTHEIGHT ) != SfxItemState::UNKNOWN )
984 0 : ScViewUtil::PutItemScript( rDestSet, aAttrSet, EE_CHAR_FONTHEIGHT, nInputScript );
985 0 : if ( rDestSet.GetItemState( EE_CHAR_WEIGHT ) != SfxItemState::UNKNOWN )
986 0 : ScViewUtil::PutItemScript( rDestSet, aAttrSet, EE_CHAR_WEIGHT, nScript );
987 0 : if ( rDestSet.GetItemState( EE_CHAR_ITALIC ) != SfxItemState::UNKNOWN )
988 0 : ScViewUtil::PutItemScript( rDestSet, aAttrSet, EE_CHAR_ITALIC, nScript );
989 : // Ausrichtung
990 :
991 0 : SvxAdjust eAdj = static_cast<const SvxAdjustItem&>(aAttrSet.Get(EE_PARA_JUST)).GetAdjust();
992 0 : switch( eAdj )
993 : {
994 : case SVX_ADJUST_LEFT:
995 : {
996 0 : rDestSet.Put( SfxBoolItem( SID_ALIGNLEFT, true ) );
997 0 : rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_LEFT, true ) );
998 : }
999 0 : break;
1000 : case SVX_ADJUST_CENTER:
1001 : {
1002 0 : rDestSet.Put( SfxBoolItem( SID_ALIGNCENTERHOR, true ) );
1003 0 : rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_CENTER, true ) );
1004 : }
1005 0 : break;
1006 : case SVX_ADJUST_RIGHT:
1007 : {
1008 0 : rDestSet.Put( SfxBoolItem( SID_ALIGNRIGHT, true ) );
1009 0 : rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_RIGHT, true ) );
1010 : }
1011 0 : break;
1012 : case SVX_ADJUST_BLOCK:
1013 : {
1014 0 : rDestSet.Put( SfxBoolItem( SID_ALIGNBLOCK, true ) );
1015 0 : rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_BLOCK, true ) );
1016 : }
1017 0 : break;
1018 : default:
1019 : {
1020 : // added to avoid warnings
1021 : }
1022 : }
1023 : // pseudo slots for Format menu
1024 0 : rDestSet.Put( SfxBoolItem( SID_ALIGN_ANY_LEFT, eAdj == SVX_ADJUST_LEFT ) );
1025 0 : rDestSet.Put( SfxBoolItem( SID_ALIGN_ANY_HCENTER, eAdj == SVX_ADJUST_CENTER ) );
1026 0 : rDestSet.Put( SfxBoolItem( SID_ALIGN_ANY_RIGHT, eAdj == SVX_ADJUST_RIGHT ) );
1027 0 : rDestSet.Put( SfxBoolItem( SID_ALIGN_ANY_JUSTIFIED, eAdj == SVX_ADJUST_BLOCK ) );
1028 :
1029 0 : SvxLRSpaceItem aLR = static_cast<const SvxLRSpaceItem&>(aAttrSet.Get( EE_PARA_LRSPACE ));
1030 0 : aLR.SetWhich(SID_ATTR_PARA_LRSPACE);
1031 0 : rDestSet.Put(aLR);
1032 0 : Invalidate( SID_ATTR_PARA_LRSPACE );
1033 0 : SfxItemState eState = aAttrSet.GetItemState( EE_PARA_LRSPACE );
1034 0 : if ( eState == SfxItemState::DONTCARE )
1035 0 : rDestSet.InvalidateItem(SID_ATTR_PARA_LRSPACE);
1036 : //xuxu for Line Space
1037 : SvxLineSpacingItem aLineSP = static_cast<const SvxLineSpacingItem&>(aAttrSet.
1038 0 : Get( EE_PARA_SBL ));
1039 0 : aLineSP.SetWhich(SID_ATTR_PARA_LINESPACE);
1040 0 : rDestSet.Put(aLineSP);
1041 0 : Invalidate(SID_ATTR_PARA_LINESPACE);
1042 0 : eState = aAttrSet.GetItemState( EE_PARA_SBL );
1043 0 : if ( eState == SfxItemState::DONTCARE )
1044 0 : rDestSet.InvalidateItem(SID_ATTR_PARA_LINESPACE);
1045 : //xuxu for UL Space
1046 : SvxULSpaceItem aULSP = static_cast<const SvxULSpaceItem&>(aAttrSet.
1047 0 : Get( EE_PARA_ULSPACE ));
1048 0 : aULSP.SetWhich(SID_ATTR_PARA_ULSPACE);
1049 0 : rDestSet.Put(aULSP);
1050 0 : Invalidate(SID_ATTR_PARA_ULSPACE);
1051 0 : Invalidate(SID_PARASPACE_INCREASE);
1052 0 : Invalidate(SID_PARASPACE_DECREASE);
1053 0 : eState = aAttrSet.GetItemState( EE_PARA_ULSPACE );
1054 0 : if( eState >= SfxItemState::DEFAULT )
1055 : {
1056 0 : if ( !aULSP.GetUpper() && !aULSP.GetLower() )
1057 0 : rDestSet.DisableItem( SID_PARASPACE_DECREASE );
1058 : }
1059 : else
1060 : {
1061 0 : rDestSet.DisableItem( SID_PARASPACE_INCREASE );
1062 0 : rDestSet.DisableItem( SID_PARASPACE_DECREASE );
1063 0 : rDestSet.InvalidateItem(SID_ATTR_PARA_ULSPACE);
1064 : }
1065 :
1066 : // Zeilenabstand
1067 :
1068 : sal_uInt16 nLineSpace = (sal_uInt16)
1069 : static_cast<const SvxLineSpacingItem&>(aAttrSet.
1070 0 : Get( EE_PARA_SBL )).GetPropLineSpace();
1071 0 : switch( nLineSpace )
1072 : {
1073 : case 100:
1074 0 : rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_10, true ) );
1075 0 : break;
1076 : case 150:
1077 0 : rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_15, true ) );
1078 0 : break;
1079 : case 200:
1080 0 : rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_20, true ) );
1081 0 : break;
1082 : }
1083 :
1084 : // hoch-/tiefgestellt
1085 :
1086 : SvxEscapement eEsc = (SvxEscapement) static_cast<const SvxEscapementItem&>(
1087 0 : aAttrSet.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();
1088 0 : if( eEsc == SVX_ESCAPEMENT_SUPERSCRIPT )
1089 0 : rDestSet.Put( SfxBoolItem( SID_SET_SUPER_SCRIPT, true ) );
1090 0 : else if( eEsc == SVX_ESCAPEMENT_SUBSCRIPT )
1091 0 : rDestSet.Put( SfxBoolItem( SID_SET_SUB_SCRIPT, true ) );
1092 :
1093 : // Unterstreichung
1094 :
1095 0 : eState = aAttrSet.GetItemState( EE_CHAR_UNDERLINE, true );
1096 0 : if ( eState == SfxItemState::DONTCARE )
1097 : {
1098 0 : rDestSet.InvalidateItem( SID_ULINE_VAL_NONE );
1099 0 : rDestSet.InvalidateItem( SID_ULINE_VAL_SINGLE );
1100 0 : rDestSet.InvalidateItem( SID_ULINE_VAL_DOUBLE );
1101 0 : rDestSet.InvalidateItem( SID_ULINE_VAL_DOTTED );
1102 : }
1103 : else
1104 : {
1105 : FontUnderline eUnderline = static_cast<const SvxUnderlineItem&>(
1106 0 : aAttrSet.Get(EE_CHAR_UNDERLINE)).GetLineStyle();
1107 0 : sal_uInt16 nId = SID_ULINE_VAL_NONE;
1108 0 : switch (eUnderline)
1109 : {
1110 0 : case UNDERLINE_SINGLE: nId = SID_ULINE_VAL_SINGLE; break;
1111 0 : case UNDERLINE_DOUBLE: nId = SID_ULINE_VAL_DOUBLE; break;
1112 0 : case UNDERLINE_DOTTED: nId = SID_ULINE_VAL_DOTTED; break;
1113 : default:
1114 0 : break;
1115 : }
1116 0 : rDestSet.Put( SfxBoolItem( nId, true ) );
1117 : }
1118 :
1119 : // horizontal / vertical
1120 :
1121 0 : bool bLeftToRight = true;
1122 :
1123 0 : SdrOutliner* pOutl = pView->GetTextEditOutliner();
1124 0 : if( pOutl )
1125 : {
1126 0 : if( pOutl->IsVertical() )
1127 0 : bLeftToRight = false;
1128 : }
1129 : else
1130 0 : bLeftToRight = static_cast<const SvxWritingModeItem&>( aAttrSet.Get( SDRATTR_TEXTDIRECTION ) ).GetValue() == com::sun::star::text::WritingMode_LR_TB;
1131 :
1132 0 : if ( bDisableVerticalText )
1133 : {
1134 0 : rDestSet.DisableItem( SID_TEXTDIRECTION_LEFT_TO_RIGHT );
1135 0 : rDestSet.DisableItem( SID_TEXTDIRECTION_TOP_TO_BOTTOM );
1136 : }
1137 : else
1138 : {
1139 0 : rDestSet.Put( SfxBoolItem( SID_TEXTDIRECTION_LEFT_TO_RIGHT, bLeftToRight ) );
1140 0 : rDestSet.Put( SfxBoolItem( SID_TEXTDIRECTION_TOP_TO_BOTTOM, !bLeftToRight ) );
1141 : }
1142 :
1143 : // left-to-right or right-to-left
1144 :
1145 0 : if ( !bLeftToRight || bDisableCTLFont )
1146 : {
1147 : // disabled if vertical
1148 0 : rDestSet.DisableItem( SID_ATTR_PARA_LEFT_TO_RIGHT );
1149 0 : rDestSet.DisableItem( SID_ATTR_PARA_RIGHT_TO_LEFT );
1150 : }
1151 0 : else if ( aAttrSet.GetItemState( EE_PARA_WRITINGDIR ) == SfxItemState::DONTCARE )
1152 : {
1153 0 : rDestSet.InvalidateItem( SID_ATTR_PARA_LEFT_TO_RIGHT );
1154 0 : rDestSet.InvalidateItem( SID_ATTR_PARA_RIGHT_TO_LEFT );
1155 : }
1156 : else
1157 : {
1158 : SvxFrameDirection eAttrDir = (SvxFrameDirection)static_cast<const SvxFrameDirectionItem&>(
1159 0 : aAttrSet.Get( EE_PARA_WRITINGDIR )).GetValue();
1160 0 : if ( eAttrDir == FRMDIR_ENVIRONMENT )
1161 : {
1162 : // get "environment" direction from page style
1163 0 : if ( pViewData->GetDocument()->GetEditTextDirection( pViewData->GetTabNo() ) == EE_HTEXTDIR_R2L )
1164 0 : eAttrDir = FRMDIR_HORI_RIGHT_TOP;
1165 : else
1166 0 : eAttrDir = FRMDIR_HORI_LEFT_TOP;
1167 : }
1168 0 : rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_LEFT_TO_RIGHT, ( eAttrDir == FRMDIR_HORI_LEFT_TOP ) ) );
1169 0 : rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_RIGHT_TO_LEFT, ( eAttrDir == FRMDIR_HORI_RIGHT_TOP ) ) );
1170 0 : }
1171 0 : }
1172 :
1173 0 : void ScDrawTextObjectBar::ExecuteTrans( SfxRequest& rReq )
1174 : {
1175 0 : sal_Int32 nType = ScViewUtil::GetTransliterationType( rReq.GetSlot() );
1176 0 : if ( nType )
1177 : {
1178 0 : ScDrawView* pView = pViewData->GetScDrawView();
1179 0 : OutlinerView* pOutView = pView->GetTextEditOutlinerView();
1180 0 : if ( pOutView )
1181 : {
1182 : // change selected text in object
1183 0 : pOutView->TransliterateText( nType );
1184 : }
1185 : else
1186 : {
1187 : //! apply to whole objects?
1188 : }
1189 : }
1190 0 : }
1191 :
1192 0 : void ScDrawTextObjectBar::GetStatePropPanelAttr(SfxItemSet &rSet)
1193 : {
1194 0 : SfxWhichIter aIter( rSet );
1195 0 : sal_uInt16 nWhich = aIter.FirstWhich();
1196 :
1197 0 : SdrView* pView = pViewData->GetScDrawView();
1198 :
1199 0 : SfxItemSet aEditAttr(pView->GetModel()->GetItemPool());
1200 0 : pView->GetAttributes(aEditAttr);
1201 : //SfxItemSet aAttrs( *aEditAttr.GetPool(), aEditAttr.GetRanges() );
1202 :
1203 0 : while ( nWhich )
1204 : {
1205 0 : sal_uInt16 nSlotId = SfxItemPool::IsWhich(nWhich)
1206 0 : ? GetPool().GetSlotId(nWhich)
1207 0 : : nWhich;
1208 0 : switch ( nSlotId )
1209 : {
1210 : case SID_TABLE_VERT_NONE:
1211 : case SID_TABLE_VERT_CENTER:
1212 : case SID_TABLE_VERT_BOTTOM:
1213 0 : bool bContour = false;
1214 0 : SfxItemState eConState = aEditAttr.GetItemState( SDRATTR_TEXT_CONTOURFRAME );
1215 0 : if( eConState != SfxItemState::DONTCARE )
1216 : {
1217 0 : bContour = static_cast<const SdrOnOffItem&>( aEditAttr.Get( SDRATTR_TEXT_CONTOURFRAME ) ).GetValue();
1218 : }
1219 0 : if (bContour) break;
1220 :
1221 0 : SfxItemState eVState = aEditAttr.GetItemState( SDRATTR_TEXT_VERTADJUST );
1222 : //SfxItemState eHState = aAttrs.GetItemState( SDRATTR_TEXT_HORZADJUST );
1223 :
1224 : //if(SfxItemState::DONTCARE != eVState && SfxItemState::DONTCARE != eHState)
1225 0 : if(SfxItemState::DONTCARE != eVState)
1226 : {
1227 0 : SdrTextVertAdjust eTVA = (SdrTextVertAdjust)static_cast<const SdrTextVertAdjustItem&>(aEditAttr.Get(SDRATTR_TEXT_VERTADJUST)).GetValue();
1228 0 : bool bSet = (nSlotId == SID_TABLE_VERT_NONE && eTVA == SDRTEXTVERTADJUST_TOP) ||
1229 0 : (nSlotId == SID_TABLE_VERT_CENTER && eTVA == SDRTEXTVERTADJUST_CENTER) ||
1230 0 : (nSlotId == SID_TABLE_VERT_BOTTOM && eTVA == SDRTEXTVERTADJUST_BOTTOM);
1231 0 : rSet.Put(SfxBoolItem(nSlotId, bSet));
1232 : }
1233 : else
1234 : {
1235 0 : rSet.Put(SfxBoolItem(nSlotId, false));
1236 : }
1237 0 : break;
1238 : }
1239 0 : nWhich = aIter.NextWhich();
1240 0 : }
1241 156 : }
1242 :
1243 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|