LCOV - code coverage report
Current view: top level - sc/source/ui/drawfunc - drtxtob.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 7 630 1.1 %
Date: 2015-06-13 12:38:46 Functions: 5 26 19.2 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.11