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

Generated by: LCOV version 1.10