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