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

Generated by: LCOV version 1.10