/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ #include #include #include #include "scitems.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "sc.hrc" #include "globstr.hrc" #include "scmod.hxx" #include "drtxtob.hxx" #include "fudraw.hxx" #include "viewdata.hxx" #include "document.hxx" #include "drawview.hxx" #include "viewutil.hxx" #include "scresid.hxx" #include "tabvwsh.hxx" #include #define ScDrawTextObjectBar #include "scslots.hxx" #include using namespace ::com::sun::star; SFX_IMPL_INTERFACE(ScDrawTextObjectBar, SfxShell) void ScDrawTextObjectBar::InitInterface_Impl() { GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_OBJECT|SFX_VISIBILITY_STANDARD|SFX_VISIBILITY_SERVER, RID_TEXT_TOOLBOX); GetStaticInterface()->RegisterPopupMenu(ScResId(RID_POPUP_DRAWTEXT)); GetStaticInterface()->RegisterChildWindow(ScGetFontWorkId()); } TYPEINIT1( ScDrawTextObjectBar, SfxShell ); // abschalten der nicht erwuenschten Acceleratoren: void ScDrawTextObjectBar::StateDisableItems( SfxItemSet &rSet ) { SfxWhichIter aIter(rSet); sal_uInt16 nWhich = aIter.FirstWhich(); while (nWhich) { rSet.DisableItem( nWhich ); nWhich = aIter.NextWhich(); } } ScDrawTextObjectBar::ScDrawTextObjectBar(ScViewData* pData) : SfxShell(pData->GetViewShell()), pViewData(pData), pClipEvtLstnr(NULL), bPastePossible(false) { SetPool( pViewData->GetScDrawView()->GetDefaultAttr().GetPool() ); // UndoManager wird beim Umschalten in den Edit-Modus umgesetzt... ::svl::IUndoManager* pMgr = pViewData->GetSfxDocShell()->GetUndoManager(); SetUndoManager( pMgr ); if ( !pViewData->GetDocument()->IsUndoEnabled() ) { pMgr->SetMaxUndoActionCount( 0 ); } SetHelpId( HID_SCSHELL_DRTXTOB ); SetName(OUString("DrawText")); SfxShell::SetContextName(sfx2::sidebar::EnumContext::GetContextName(sfx2::sidebar::EnumContext::Context_DrawText)); } ScDrawTextObjectBar::~ScDrawTextObjectBar() { if ( pClipEvtLstnr ) { pClipEvtLstnr->AddRemoveListener( pViewData->GetActiveWin(), false ); // The listener may just now be waiting for the SolarMutex and call the link // afterwards, in spite of RemoveListener. So the link has to be reset, too. pClipEvtLstnr->ClearCallbackLink(); pClipEvtLstnr->release(); } } // Funktionen void ScDrawTextObjectBar::Execute( SfxRequest &rReq ) { ScDrawView* pView = pViewData->GetScDrawView(); OutlinerView* pOutView = pView->GetTextEditOutlinerView(); Outliner* pOutliner = pView->GetTextEditOutliner(); if (!pOutView || !pOutliner) { ExecuteGlobal( rReq ); // auf ganze Objekte return; } const SfxItemSet* pReqArgs = rReq.GetArgs(); sal_uInt16 nSlot = rReq.GetSlot(); switch ( nSlot ) { case SID_COPY: pOutView->Copy(); break; case SID_CUT: pOutView->Cut(); break; case SID_PASTE: pOutView->PasteSpecial(); break; case SID_CLIPBOARD_FORMAT_ITEMS: { SotClipboardFormatId nFormat = SotClipboardFormatId::NONE; const SfxPoolItem* pItem; if ( pReqArgs && pReqArgs->GetItemState(nSlot, true, &pItem) == SfxItemState::SET && pItem->ISA(SfxUInt32Item) ) { nFormat = static_cast(static_cast(pItem)->GetValue()); } if ( nFormat != SotClipboardFormatId::NONE ) { if (nFormat == SotClipboardFormatId::STRING) pOutView->Paste(); else pOutView->PasteSpecial(); } } break; case SID_PASTE_SPECIAL: ExecutePasteContents( rReq ); break; case SID_SELECTALL: { sal_Int32 nCount = pOutliner->GetParagraphCount(); ESelection aSel( 0,0,nCount,0 ); pOutView->SetSelection( aSel ); } break; case SID_CHARMAP: { const SvxFontItem& rItem = static_cast( pOutView->GetAttribs().Get(EE_CHAR_FONTINFO)); OUString aString; SvxFontItem aNewItem( EE_CHAR_FONTINFO ); const SfxItemSet *pArgs = rReq.GetArgs(); const SfxPoolItem* pItem = 0; if( pArgs ) pArgs->GetItemState(GetPool().GetWhich(SID_CHARMAP), false, &pItem); if ( pItem ) { aString = static_cast(pItem)->GetValue(); const SfxPoolItem* pFtItem = NULL; pArgs->GetItemState( GetPool().GetWhich(SID_ATTR_SPECIALCHAR), false, &pFtItem); const SfxStringItem* pFontItem = PTR_CAST( SfxStringItem, pFtItem ); if ( pFontItem ) { OUString aFontName(pFontItem->GetValue()); vcl::Font aFont(aFontName, Size(1,1)); // Size nur wg. CTOR aNewItem = SvxFontItem( aFont.GetFamily(), aFont.GetName(), aFont.GetStyleName(), aFont.GetPitch(), aFont.GetCharSet(), ATTR_FONT ); } else aNewItem = rItem; } else ScViewUtil::ExecuteCharMap( rItem, *pViewData->GetViewShell()->GetViewFrame(), aNewItem, aString ); if ( !aString.isEmpty() ) { SfxItemSet aSet( pOutliner->GetEmptyItemSet() ); aSet.Put( aNewItem ); // SetAttribs an der View selektiert ein Wort, wenn nichts selektiert ist pOutView->GetOutliner()->QuickSetAttribs( aSet, pOutView->GetSelection() ); pOutView->InsertText(aString); } Invalidate( SID_ATTR_CHAR_FONT ); } break; case SID_HYPERLINK_SETLINK: if( pReqArgs ) { const SfxPoolItem* pItem; if ( pReqArgs->GetItemState( SID_HYPERLINK_SETLINK, true, &pItem ) == SfxItemState::SET ) { const SvxHyperlinkItem* pHyper = static_cast(pItem); const OUString& rName = pHyper->GetName(); const OUString& rURL = pHyper->GetURL(); const OUString& rTarget = pHyper->GetTargetFrame(); SvxLinkInsertMode eMode = pHyper->GetInsertMode(); bool bDone = false; if ( pOutView && ( eMode == HLINK_DEFAULT || eMode == HLINK_FIELD ) ) { const SvxFieldItem* pFieldItem = pOutView->GetFieldAtSelection(); if (pFieldItem) { const SvxFieldData* pField = pFieldItem->GetField(); if ( pField && pField->ISA(SvxURLField) ) { // altes Feld selektieren ESelection aSel = pOutView->GetSelection(); aSel.Adjust(); aSel.nEndPara = aSel.nStartPara; aSel.nEndPos = aSel.nStartPos + 1; pOutView->SetSelection( aSel ); } } // neues Feld einfuegen SvxURLField aURLField( rURL, rName, SVXURLFORMAT_REPR ); aURLField.SetTargetFrame( rTarget ); SvxFieldItem aURLItem( aURLField, EE_FEATURE_FIELD ); pOutView->InsertField( aURLItem ); // select new field ESelection aSel = pOutView->GetSelection(); if ( aSel.nStartPos == aSel.nEndPos && aSel.nStartPos > 0 ) { // Cursor is behind the inserted field -> extend selection to the left --aSel.nStartPos; pOutView->SetSelection( aSel ); } bDone = true; } if (!bDone) ExecuteGlobal( rReq ); // normal an der View // InsertURL an der ViewShell schaltet bei "Text" die DrawShell ab !!! } } break; case SID_OPEN_HYPERLINK: { if ( pOutView ) { const SvxFieldItem* pFieldItem = pOutView->GetFieldAtSelection(); if ( pFieldItem ) { const SvxFieldData* pField = pFieldItem->GetField(); if( pField && pField->ISA( SvxURLField ) ) { const SvxURLField* pURLField = static_cast< const SvxURLField* >( pField ); ScGlobal::OpenURL( pURLField->GetURL(), pURLField->GetTargetFrame() ); } } } } break; case SID_ENABLE_HYPHENATION: case SID_TEXTDIRECTION_LEFT_TO_RIGHT: case SID_TEXTDIRECTION_TOP_TO_BOTTOM: pView->ScEndTextEdit(); // end text edit before switching direction ExecuteGlobal( rReq ); // restore consistent state between shells and functions: pViewData->GetDispatcher().Execute(SID_OBJECT_SELECT, SfxCallMode::SLOT | SfxCallMode::RECORD); break; case SID_THES: { OUString aReplaceText; SFX_REQUEST_ARG( rReq, pItem2, SfxStringItem, SID_THES, false ); if (pItem2) aReplaceText = pItem2->GetValue(); if (!aReplaceText.isEmpty()) ReplaceTextWithSynonym( pOutView->GetEditView(), aReplaceText ); } break; case SID_THESAURUS: { pOutView->StartThesaurus(); } break; } } void ScDrawTextObjectBar::GetState( SfxItemSet& rSet ) { SfxViewFrame* pViewFrm = pViewData->GetViewShell()->GetViewFrame(); bool bHasFontWork = pViewFrm->HasChildWindow(SID_FONTWORK); bool bDisableFontWork = false; if (IsNoteEdit()) { // #i21255# notes now support rich text formatting (#i74140# but not fontwork) bDisableFontWork = true; } if ( bDisableFontWork ) rSet.DisableItem( SID_FONTWORK ); else rSet.Put(SfxBoolItem(SID_FONTWORK, bHasFontWork)); if ( rSet.GetItemState( SID_HYPERLINK_GETLINK ) != SfxItemState::UNKNOWN ) { SvxHyperlinkItem aHLinkItem; SdrView* pView = pViewData->GetScDrawView(); OutlinerView* pOutView = pView->GetTextEditOutlinerView(); if ( pOutView ) { bool bField = false; const SvxFieldItem* pFieldItem = pOutView->GetFieldAtSelection(); if (pFieldItem) { const SvxFieldData* pField = pFieldItem->GetField(); if ( pField && pField->ISA(SvxURLField) ) { const SvxURLField* pURLField = static_cast(pField); aHLinkItem.SetName( pURLField->GetRepresentation() ); aHLinkItem.SetURL( pURLField->GetURL() ); aHLinkItem.SetTargetFrame( pURLField->GetTargetFrame() ); bField = true; } } if (!bField) { // use selected text as name for urls OUString sReturn = pOutView->GetSelected(); sal_Int32 nLen = std::min(sReturn.getLength(), 255); sReturn = sReturn.copy(0, nLen); aHLinkItem.SetName(comphelper::string::stripEnd(sReturn, ' ')); } } rSet.Put(aHLinkItem); } if ( rSet.GetItemState( SID_OPEN_HYPERLINK ) != SfxItemState::UNKNOWN ) { SdrView* pView = pViewData->GetScDrawView(); OutlinerView* pOutView = pView->GetTextEditOutlinerView(); bool bEnable = false; if ( pOutView ) { const SvxFieldItem* pFieldItem = pOutView->GetFieldAtSelection(); if ( pFieldItem ) { const SvxFieldData* pField = pFieldItem->GetField(); bEnable = pField && pField->ISA( SvxURLField ); } } if( !bEnable ) rSet.DisableItem( SID_OPEN_HYPERLINK ); } if( rSet.GetItemState( SID_TRANSLITERATE_HALFWIDTH ) != SfxItemState::UNKNOWN ) ScViewUtil::HideDisabledSlot( rSet, pViewFrm->GetBindings(), SID_TRANSLITERATE_HALFWIDTH ); if( rSet.GetItemState( SID_TRANSLITERATE_FULLWIDTH ) != SfxItemState::UNKNOWN ) ScViewUtil::HideDisabledSlot( rSet, pViewFrm->GetBindings(), SID_TRANSLITERATE_FULLWIDTH ); if( rSet.GetItemState( SID_TRANSLITERATE_HIRAGANA ) != SfxItemState::UNKNOWN ) ScViewUtil::HideDisabledSlot( rSet, pViewFrm->GetBindings(), SID_TRANSLITERATE_HIRAGANA ); if( rSet.GetItemState( SID_TRANSLITERATE_KATAGANA ) != SfxItemState::UNKNOWN ) ScViewUtil::HideDisabledSlot( rSet, pViewFrm->GetBindings(), SID_TRANSLITERATE_KATAGANA ); if ( rSet.GetItemState( SID_ENABLE_HYPHENATION ) != SfxItemState::UNKNOWN ) { SdrView* pView = pViewData->GetScDrawView(); SfxItemSet aAttrs( pView->GetModel()->GetItemPool() ); pView->GetAttributes( aAttrs ); if( aAttrs.GetItemState( EE_PARA_HYPHENATE ) >= SfxItemState::DEFAULT ) { bool bValue = static_cast( aAttrs.Get( EE_PARA_HYPHENATE ) ).GetValue(); rSet.Put( SfxBoolItem( SID_ENABLE_HYPHENATION, bValue ) ); } } if ( rSet.GetItemState( SID_THES ) != SfxItemState::UNKNOWN || rSet.GetItemState( SID_THESAURUS ) != SfxItemState::UNKNOWN ) { SdrView * pView = pViewData->GetScDrawView(); OutlinerView* pOutView = pView->GetTextEditOutlinerView(); OUString aStatusVal; LanguageType nLang = LANGUAGE_NONE; bool bIsLookUpWord = false; if ( pOutView ) { EditView& rEditView = pOutView->GetEditView(); bIsLookUpWord = GetStatusValueForThesaurusFromContext( aStatusVal, nLang, rEditView ); } rSet.Put( SfxStringItem( SID_THES, aStatusVal ) ); // disable thesaurus main menu and context menu entry if there is nothing to look up bool bCanDoThesaurus = ScModule::HasThesaurusLanguage( nLang ); if (!bIsLookUpWord || !bCanDoThesaurus) rSet.DisableItem( SID_THES ); if (!bCanDoThesaurus) rSet.DisableItem( SID_THESAURUS ); } } IMPL_LINK( ScDrawTextObjectBar, ClipboardChanged, TransferableDataHelper*, pDataHelper ) { if ( pDataHelper ) { bPastePossible = ( pDataHelper->HasFormat( SotClipboardFormatId::STRING ) || pDataHelper->HasFormat( SotClipboardFormatId::RTF ) ); SfxBindings& rBindings = pViewData->GetBindings(); rBindings.Invalidate( SID_PASTE ); rBindings.Invalidate( SID_PASTE_SPECIAL ); rBindings.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS ); } return 0; } void ScDrawTextObjectBar::GetClipState( SfxItemSet& rSet ) { SdrView* pView = pViewData->GetScDrawView(); if ( !pView->GetTextEditOutlinerView() ) { GetGlobalClipState( rSet ); return; } if ( !pClipEvtLstnr ) { // create listener pClipEvtLstnr = new TransferableClipboardListener( LINK( this, ScDrawTextObjectBar, ClipboardChanged ) ); pClipEvtLstnr->acquire(); vcl::Window* pWin = pViewData->GetActiveWin(); pClipEvtLstnr->AddRemoveListener( pWin, true ); // get initial state TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( pViewData->GetActiveWin() ) ); bPastePossible = ( aDataHelper.HasFormat( SotClipboardFormatId::STRING ) || aDataHelper.HasFormat( SotClipboardFormatId::RTF ) ); } SfxWhichIter aIter( rSet ); sal_uInt16 nWhich = aIter.FirstWhich(); while (nWhich) { switch (nWhich) { case SID_PASTE: case SID_PASTE_SPECIAL: if( !bPastePossible ) rSet.DisableItem( nWhich ); break; case SID_CLIPBOARD_FORMAT_ITEMS: if ( bPastePossible ) { SvxClipboardFmtItem aFormats( SID_CLIPBOARD_FORMAT_ITEMS ); TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( pViewData->GetActiveWin() ) ); if ( aDataHelper.HasFormat( SotClipboardFormatId::STRING ) ) aFormats.AddClipbrdFormat( SotClipboardFormatId::STRING ); if ( aDataHelper.HasFormat( SotClipboardFormatId::RTF ) ) aFormats.AddClipbrdFormat( SotClipboardFormatId::RTF ); rSet.Put( aFormats ); } else rSet.DisableItem( nWhich ); break; } nWhich = aIter.NextWhich(); } } // Attribute void ScDrawTextObjectBar::ExecuteToggle( SfxRequest &rReq ) { // Unterstreichung SdrView* pView = pViewData->GetScDrawView(); sal_uInt16 nSlot = rReq.GetSlot(); SfxItemSet aSet( pView->GetDefaultAttr() ); SfxItemSet aViewAttr(pView->GetModel()->GetItemPool()); pView->GetAttributes(aViewAttr); // Unterstreichung FontUnderline eOld = static_cast( aViewAttr. Get(EE_CHAR_UNDERLINE)).GetLineStyle(); FontUnderline eNew = eOld; switch (nSlot) { case SID_ULINE_VAL_NONE: eNew = UNDERLINE_NONE; break; case SID_ULINE_VAL_SINGLE: eNew = ( eOld == UNDERLINE_SINGLE ) ? UNDERLINE_NONE : UNDERLINE_SINGLE; break; case SID_ULINE_VAL_DOUBLE: eNew = ( eOld == UNDERLINE_DOUBLE ) ? UNDERLINE_NONE : UNDERLINE_DOUBLE; break; case SID_ULINE_VAL_DOTTED: eNew = ( eOld == UNDERLINE_DOTTED ) ? UNDERLINE_NONE : UNDERLINE_DOTTED; break; default: break; } aSet.Put( SvxUnderlineItem( eNew, EE_CHAR_UNDERLINE ) ); pView->SetAttributes( aSet ); rReq.Done(); pViewData->GetScDrawView()->InvalidateDrawTextAttrs(); } static void lcl_RemoveFields( OutlinerView& rOutView ) { //! Outliner should have RemoveFields with a selection Outliner* pOutliner = rOutView.GetOutliner(); if (!pOutliner) return; ESelection aOldSel = rOutView.GetSelection(); ESelection aSel = aOldSel; aSel.Adjust(); sal_Int32 nNewEnd = aSel.nEndPos; bool bUpdate = pOutliner->GetUpdateMode(); bool bChanged = false; //! GetPortions and GetAttribs should be const! EditEngine& rEditEng = (EditEngine&)pOutliner->GetEditEngine(); sal_Int32 nParCount = pOutliner->GetParagraphCount(); for (sal_Int32 nPar=0; nPar= aSel.nStartPara && nPar <= aSel.nEndPara ) { std::vector aPortions; rEditEng.GetPortions( nPar, aPortions ); for ( size_t nPos = aPortions.size(); nPos; ) { --nPos; sal_Int32 nEnd = aPortions[ nPos ]; sal_Int32 nStart = nPos ? aPortions[ nPos - 1 ] : 0; // fields are single characters if ( nEnd == nStart+1 && ( nPar > aSel.nStartPara || nStart >= aSel.nStartPos ) && ( nPar < aSel.nEndPara || nEnd <= aSel.nEndPos ) ) { ESelection aFieldSel( nPar, nStart, nPar, nEnd ); SfxItemSet aSet = rEditEng.GetAttribs( aFieldSel ); if ( aSet.GetItemState( EE_FEATURE_FIELD ) == SfxItemState::SET ) { if (!bChanged) { if (bUpdate) pOutliner->SetUpdateMode( false ); OUString aName = ScGlobal::GetRscString( STR_UNDO_DELETECONTENTS ); pOutliner->GetUndoManager().EnterListAction( aName, aName ); bChanged = true; } OUString aFieldText = rEditEng.GetText( aFieldSel ); pOutliner->QuickInsertText( aFieldText, aFieldSel ); if ( nPar == aSel.nEndPara ) { nNewEnd = nNewEnd + aFieldText.getLength(); --nNewEnd; } } } } } if (bUpdate && bChanged) { pOutliner->GetUndoManager().LeaveListAction(); pOutliner->SetUpdateMode( true ); } if ( aOldSel.IsEqual( aSel ) ) // aSel is adjusted aOldSel.nEndPos = nNewEnd; else aOldSel.nStartPos = nNewEnd; // if aOldSel is backwards rOutView.SetSelection( aOldSel ); } void ScDrawTextObjectBar::ExecuteAttr( SfxRequest &rReq ) { SdrView* pView = pViewData->GetScDrawView(); const SfxItemSet* pArgs = rReq.GetArgs(); sal_uInt16 nSlot = rReq.GetSlot(); SfxItemSet aEditAttr( pView->GetModel()->GetItemPool() ); pView->GetAttributes( aEditAttr ); SfxItemSet aNewAttr( *aEditAttr.GetPool(), aEditAttr.GetRanges() ); bool bSet = true; switch ( nSlot ) { case SID_ALIGNLEFT: case SID_ALIGN_ANY_LEFT: case SID_ATTR_PARA_ADJUST_LEFT: aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_LEFT, EE_PARA_JUST ) ); break; case SID_ALIGNCENTERHOR: case SID_ALIGN_ANY_HCENTER: case SID_ATTR_PARA_ADJUST_CENTER: aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_CENTER, EE_PARA_JUST ) ); break; case SID_ALIGNRIGHT: case SID_ALIGN_ANY_RIGHT: case SID_ATTR_PARA_ADJUST_RIGHT: aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_RIGHT, EE_PARA_JUST ) ); break; case SID_ALIGNBLOCK: case SID_ALIGN_ANY_JUSTIFIED: case SID_ATTR_PARA_ADJUST_BLOCK: aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_BLOCK, EE_PARA_JUST ) ); break; case SID_ATTR_PARA_LINESPACE_10: { SvxLineSpacingItem aItem( SVX_LINESPACE_ONE_LINE, EE_PARA_SBL ); aItem.SetPropLineSpace( 100 ); aNewAttr.Put( aItem ); } break; case SID_ATTR_PARA_LINESPACE_15: { SvxLineSpacingItem aItem( SVX_LINESPACE_ONE_POINT_FIVE_LINES, EE_PARA_SBL ); aItem.SetPropLineSpace( 150 ); aNewAttr.Put( aItem ); } break; case SID_ATTR_PARA_LINESPACE_20: { SvxLineSpacingItem aItem( SVX_LINESPACE_TWO_LINES, EE_PARA_SBL ); aItem.SetPropLineSpace( 200 ); aNewAttr.Put( aItem ); } break; case SID_SET_SUPER_SCRIPT: { SvxEscapementItem aItem(EE_CHAR_ESCAPEMENT); SvxEscapement eEsc = (SvxEscapement) static_cast( aEditAttr.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue(); if( eEsc == SVX_ESCAPEMENT_SUPERSCRIPT ) aItem.SetEscapement( SVX_ESCAPEMENT_OFF ); else aItem.SetEscapement( SVX_ESCAPEMENT_SUPERSCRIPT ); aNewAttr.Put( aItem ); } break; case SID_SET_SUB_SCRIPT: { SvxEscapementItem aItem(EE_CHAR_ESCAPEMENT); SvxEscapement eEsc = (SvxEscapement) static_cast( aEditAttr.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue(); if( eEsc == SVX_ESCAPEMENT_SUBSCRIPT ) aItem.SetEscapement( SVX_ESCAPEMENT_OFF ); else aItem.SetEscapement( SVX_ESCAPEMENT_SUBSCRIPT ); aNewAttr.Put( aItem ); } break; case SID_TABLE_VERT_NONE: case SID_TABLE_VERT_CENTER: case SID_TABLE_VERT_BOTTOM: { SdrTextVertAdjust eTVA = SDRTEXTVERTADJUST_TOP; if (nSlot == SID_TABLE_VERT_CENTER) eTVA = SDRTEXTVERTADJUST_CENTER; else if (nSlot == SID_TABLE_VERT_BOTTOM) eTVA = SDRTEXTVERTADJUST_BOTTOM; aNewAttr.Put(SdrTextVertAdjustItem(eTVA)); } break; case SID_PARASPACE_INCREASE: case SID_PARASPACE_DECREASE: { SvxULSpaceItem aULSpace( static_cast< const SvxULSpaceItem& >( aEditAttr.Get( EE_PARA_ULSPACE ) ) ); sal_uInt16 nUpper = aULSpace.GetUpper(); sal_uInt16 nLower = aULSpace.GetLower(); if ( nSlot == SID_PARASPACE_INCREASE ) { nUpper += 100; nLower += 100; } else { nUpper = std::max< sal_Int16 >( nUpper - 100, 0 ); nLower = std::max< sal_Int16 >( nLower - 100, 0 ); } aULSpace.SetUpper( nUpper ); aULSpace.SetLower( nLower ); aNewAttr.Put( aULSpace ); } break; default: bSet = false; } bool bDone = true; bool bArgsInReq = ( pArgs != NULL ); if ( !bArgsInReq ) { switch ( nSlot ) { case SID_TEXT_STANDARD: // Harte Textattributierung loeschen { OutlinerView* pOutView = pView->IsTextEdit() ? pView->GetTextEditOutlinerView() : NULL; if ( pOutView ) pOutView->Paint( Rectangle() ); SfxItemSet aEmptyAttr( *aEditAttr.GetPool(), EE_ITEMS_START, EE_ITEMS_END ); pView->SetAttributes( aEmptyAttr, true ); if ( pOutView ) { lcl_RemoveFields( *pOutView ); pOutView->ShowCursor(); } rReq.Done( aEmptyAttr ); pViewData->GetScDrawView()->InvalidateDrawTextAttrs(); bDone = false; // bereits hier passiert } break; case SID_CHAR_DLG_EFFECT: case SID_CHAR_DLG: // Dialog-Button case SID_ATTR_CHAR_FONT: // Controller nicht angezeigt case SID_ATTR_CHAR_FONTHEIGHT: bDone = ExecuteCharDlg( aEditAttr, aNewAttr , nSlot); break; case SID_PARA_DLG: bDone = ExecuteParaDlg( aEditAttr, aNewAttr ); break; case SID_ATTR_CHAR_WEIGHT: aNewAttr.Put( static_cast(aEditAttr.Get( EE_CHAR_WEIGHT )) ); break; case SID_ATTR_CHAR_POSTURE: aNewAttr.Put( static_cast(aEditAttr.Get( EE_CHAR_ITALIC )) ); break; case SID_ATTR_CHAR_UNDERLINE: aNewAttr.Put( static_cast(aEditAttr.Get( EE_CHAR_UNDERLINE )) ); break; case SID_ATTR_CHAR_OVERLINE: aNewAttr.Put( static_cast(aEditAttr.Get( EE_CHAR_OVERLINE )) ); break; case SID_ATTR_CHAR_CONTOUR: aNewAttr.Put( static_cast(aEditAttr.Get( EE_CHAR_OUTLINE )) ); break; case SID_ATTR_CHAR_SHADOWED: aNewAttr.Put( static_cast(aEditAttr.Get( EE_CHAR_SHADOW )) ); break; case SID_ATTR_CHAR_STRIKEOUT: aNewAttr.Put( static_cast(aEditAttr.Get( EE_CHAR_STRIKEOUT )) ); break; case SID_DRAWTEXT_ATTR_DLG: { SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); boost::scoped_ptr pDlg(pFact->CreateTextTabDialog( pViewData->GetDialogParent(), &aEditAttr, pView )); bDone = ( RET_OK == pDlg->Execute() ); if ( bDone ) aNewAttr.Put( *pDlg->GetOutputItemSet() ); pDlg.reset(); SfxBindings& rBindings = pViewData->GetBindings(); rBindings.Invalidate( SID_TABLE_VERT_NONE ); rBindings.Invalidate( SID_TABLE_VERT_CENTER ); rBindings.Invalidate( SID_TABLE_VERT_BOTTOM ); } break; } } if ( bSet || bDone ) { rReq.Done( aNewAttr ); pArgs = rReq.GetArgs(); } if ( pArgs ) { if ( bArgsInReq && ( nSlot == SID_ATTR_CHAR_FONT || nSlot == SID_ATTR_CHAR_FONTHEIGHT || nSlot == SID_ATTR_CHAR_WEIGHT || nSlot == SID_ATTR_CHAR_POSTURE ) ) { // font items from toolbox controller have to be applied for the right script type // #i78017 establish the same behaviour as in Writer SvtScriptType nScript = SvtScriptType::LATIN | SvtScriptType::ASIAN | SvtScriptType::COMPLEX; if (nSlot == SID_ATTR_CHAR_FONT) nScript = pView->GetScriptType(); SfxItemPool& rPool = GetPool(); SvxScriptSetItem aSetItem( nSlot, rPool ); sal_uInt16 nWhich = rPool.GetWhich( nSlot ); aSetItem.PutItemForScriptType( nScript, pArgs->Get( nWhich ) ); pView->SetAttributes( aSetItem.GetItemSet() ); } else if( nSlot == SID_ATTR_PARA_LRSPACE ) { sal_uInt16 nId = SID_ATTR_PARA_LRSPACE; const SvxLRSpaceItem& rItem = static_cast( pArgs->Get( nId )); SfxItemSet aAttr( GetPool(), EE_PARA_LRSPACE, EE_PARA_LRSPACE ); nId = EE_PARA_LRSPACE; SvxLRSpaceItem aLRSpaceItem( rItem.GetLeft(), rItem.GetRight(), rItem.GetTxtLeft(), rItem.GetTxtFirstLineOfst(), nId ); aAttr.Put( aLRSpaceItem ); pView->SetAttributes( aAttr ); } else if( nSlot == SID_ATTR_PARA_LINESPACE ) { SvxLineSpacingItem aLineSpaceItem = static_cast(pArgs->Get( GetPool().GetWhich(nSlot))); SfxItemSet aAttr( GetPool(), EE_PARA_SBL, EE_PARA_SBL ); aAttr.Put( aLineSpaceItem ); pView->SetAttributes( aAttr ); } else if( nSlot == SID_ATTR_PARA_ULSPACE ) { SvxULSpaceItem aULSpaceItem = static_cast(pArgs->Get( GetPool().GetWhich(nSlot))); SfxItemSet aAttr( GetPool(), EE_PARA_ULSPACE, EE_PARA_ULSPACE ); aULSpaceItem.SetWhich(EE_PARA_ULSPACE); aAttr.Put( aULSpaceItem ); pView->SetAttributes( aAttr ); } else { // use args directly pView->SetAttributes( *pArgs ); } pViewData->GetScDrawView()->InvalidateDrawTextAttrs(); } } void ScDrawTextObjectBar::GetAttrState( SfxItemSet& rDestSet ) { if ( IsNoteEdit() ) { // issue 21255 - Notes now support rich text formatting. } SvtLanguageOptions aLangOpt; bool bDisableCTLFont = !aLangOpt.IsCTLFontEnabled(); bool bDisableVerticalText = !aLangOpt.IsVerticalTextEnabled(); SdrView* pView = pViewData->GetScDrawView(); SfxItemSet aAttrSet(pView->GetModel()->GetItemPool()); pView->GetAttributes(aAttrSet); // direkte Attribute rDestSet.Put( aAttrSet ); // choose font info according to selection script type SvtScriptType nScript = pView->GetScriptType(); // #i55929# input-language-dependent script type (depends on input language if nothing selected) SvtScriptType nInputScript = nScript; OutlinerView* pOutView = pView->GetTextEditOutlinerView(); if (pOutView && !pOutView->GetSelection().HasRange()) { LanguageType nInputLang = pViewData->GetActiveWin()->GetInputLanguage(); if (nInputLang != LANGUAGE_DONTKNOW && nInputLang != LANGUAGE_SYSTEM) nInputScript = SvtLanguageOptions::GetScriptTypeOfLanguage( nInputLang ); } // #i55929# according to spec, nInputScript is used for font and font height only if ( rDestSet.GetItemState( EE_CHAR_FONTINFO ) != SfxItemState::UNKNOWN ) ScViewUtil::PutItemScript( rDestSet, aAttrSet, EE_CHAR_FONTINFO, nInputScript ); if ( rDestSet.GetItemState( EE_CHAR_FONTHEIGHT ) != SfxItemState::UNKNOWN ) ScViewUtil::PutItemScript( rDestSet, aAttrSet, EE_CHAR_FONTHEIGHT, nInputScript ); if ( rDestSet.GetItemState( EE_CHAR_WEIGHT ) != SfxItemState::UNKNOWN ) ScViewUtil::PutItemScript( rDestSet, aAttrSet, EE_CHAR_WEIGHT, nScript ); if ( rDestSet.GetItemState( EE_CHAR_ITALIC ) != SfxItemState::UNKNOWN ) ScViewUtil::PutItemScript( rDestSet, aAttrSet, EE_CHAR_ITALIC, nScript ); // Ausrichtung SvxAdjust eAdj = static_cast(aAttrSet.Get(EE_PARA_JUST)).GetAdjust(); switch( eAdj ) { case SVX_ADJUST_LEFT: { rDestSet.Put( SfxBoolItem( SID_ALIGNLEFT, true ) ); rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_LEFT, true ) ); } break; case SVX_ADJUST_CENTER: { rDestSet.Put( SfxBoolItem( SID_ALIGNCENTERHOR, true ) ); rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_CENTER, true ) ); } break; case SVX_ADJUST_RIGHT: { rDestSet.Put( SfxBoolItem( SID_ALIGNRIGHT, true ) ); rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_RIGHT, true ) ); } break; case SVX_ADJUST_BLOCK: { rDestSet.Put( SfxBoolItem( SID_ALIGNBLOCK, true ) ); rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_BLOCK, true ) ); } break; default: { // added to avoid warnings } } // pseudo slots for Format menu rDestSet.Put( SfxBoolItem( SID_ALIGN_ANY_LEFT, eAdj == SVX_ADJUST_LEFT ) ); rDestSet.Put( SfxBoolItem( SID_ALIGN_ANY_HCENTER, eAdj == SVX_ADJUST_CENTER ) ); rDestSet.Put( SfxBoolItem( SID_ALIGN_ANY_RIGHT, eAdj == SVX_ADJUST_RIGHT ) ); rDestSet.Put( SfxBoolItem( SID_ALIGN_ANY_JUSTIFIED, eAdj == SVX_ADJUST_BLOCK ) ); SvxLRSpaceItem aLR = static_cast(aAttrSet.Get( EE_PARA_LRSPACE )); aLR.SetWhich(SID_ATTR_PARA_LRSPACE); rDestSet.Put(aLR); Invalidate( SID_ATTR_PARA_LRSPACE ); SfxItemState eState = aAttrSet.GetItemState( EE_PARA_LRSPACE ); if ( eState == SfxItemState::DONTCARE ) rDestSet.InvalidateItem(SID_ATTR_PARA_LRSPACE); //xuxu for Line Space SvxLineSpacingItem aLineSP = static_cast(aAttrSet. Get( EE_PARA_SBL )); aLineSP.SetWhich(SID_ATTR_PARA_LINESPACE); rDestSet.Put(aLineSP); Invalidate(SID_ATTR_PARA_LINESPACE); eState = aAttrSet.GetItemState( EE_PARA_SBL ); if ( eState == SfxItemState::DONTCARE ) rDestSet.InvalidateItem(SID_ATTR_PARA_LINESPACE); //xuxu for UL Space SvxULSpaceItem aULSP = static_cast(aAttrSet. Get( EE_PARA_ULSPACE )); aULSP.SetWhich(SID_ATTR_PARA_ULSPACE); rDestSet.Put(aULSP); Invalidate(SID_ATTR_PARA_ULSPACE); Invalidate(SID_PARASPACE_INCREASE); Invalidate(SID_PARASPACE_DECREASE); eState = aAttrSet.GetItemState( EE_PARA_ULSPACE ); if( eState >= SfxItemState::DEFAULT ) { if ( !aULSP.GetUpper() && !aULSP.GetLower() ) rDestSet.DisableItem( SID_PARASPACE_DECREASE ); } else { rDestSet.DisableItem( SID_PARASPACE_INCREASE ); rDestSet.DisableItem( SID_PARASPACE_DECREASE ); rDestSet.InvalidateItem(SID_ATTR_PARA_ULSPACE); } // Zeilenabstand sal_uInt16 nLineSpace = (sal_uInt16) static_cast(aAttrSet. Get( EE_PARA_SBL )).GetPropLineSpace(); switch( nLineSpace ) { case 100: rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_10, true ) ); break; case 150: rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_15, true ) ); break; case 200: rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_20, true ) ); break; } // hoch-/tiefgestellt SvxEscapement eEsc = (SvxEscapement) static_cast( aAttrSet.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue(); if( eEsc == SVX_ESCAPEMENT_SUPERSCRIPT ) rDestSet.Put( SfxBoolItem( SID_SET_SUPER_SCRIPT, true ) ); else if( eEsc == SVX_ESCAPEMENT_SUBSCRIPT ) rDestSet.Put( SfxBoolItem( SID_SET_SUB_SCRIPT, true ) ); // Unterstreichung eState = aAttrSet.GetItemState( EE_CHAR_UNDERLINE, true ); if ( eState == SfxItemState::DONTCARE ) { rDestSet.InvalidateItem( SID_ULINE_VAL_NONE ); rDestSet.InvalidateItem( SID_ULINE_VAL_SINGLE ); rDestSet.InvalidateItem( SID_ULINE_VAL_DOUBLE ); rDestSet.InvalidateItem( SID_ULINE_VAL_DOTTED ); } else { FontUnderline eUnderline = static_cast( aAttrSet.Get(EE_CHAR_UNDERLINE)).GetLineStyle(); sal_uInt16 nId = SID_ULINE_VAL_NONE; switch (eUnderline) { case UNDERLINE_SINGLE: nId = SID_ULINE_VAL_SINGLE; break; case UNDERLINE_DOUBLE: nId = SID_ULINE_VAL_DOUBLE; break; case UNDERLINE_DOTTED: nId = SID_ULINE_VAL_DOTTED; break; default: break; } rDestSet.Put( SfxBoolItem( nId, true ) ); } // horizontal / vertical bool bLeftToRight = true; SdrOutliner* pOutl = pView->GetTextEditOutliner(); if( pOutl ) { if( pOutl->IsVertical() ) bLeftToRight = false; } else bLeftToRight = static_cast( aAttrSet.Get( SDRATTR_TEXTDIRECTION ) ).GetValue() == com::sun::star::text::WritingMode_LR_TB; if ( bDisableVerticalText ) { rDestSet.DisableItem( SID_TEXTDIRECTION_LEFT_TO_RIGHT ); rDestSet.DisableItem( SID_TEXTDIRECTION_TOP_TO_BOTTOM ); } else { rDestSet.Put( SfxBoolItem( SID_TEXTDIRECTION_LEFT_TO_RIGHT, bLeftToRight ) ); rDestSet.Put( SfxBoolItem( SID_TEXTDIRECTION_TOP_TO_BOTTOM, !bLeftToRight ) ); } // left-to-right or right-to-left if ( !bLeftToRight || bDisableCTLFont ) { // disabled if vertical rDestSet.DisableItem( SID_ATTR_PARA_LEFT_TO_RIGHT ); rDestSet.DisableItem( SID_ATTR_PARA_RIGHT_TO_LEFT ); } else if ( aAttrSet.GetItemState( EE_PARA_WRITINGDIR ) == SfxItemState::DONTCARE ) { rDestSet.InvalidateItem( SID_ATTR_PARA_LEFT_TO_RIGHT ); rDestSet.InvalidateItem( SID_ATTR_PARA_RIGHT_TO_LEFT ); } else { SvxFrameDirection eAttrDir = (SvxFrameDirection)static_cast( aAttrSet.Get( EE_PARA_WRITINGDIR )).GetValue(); if ( eAttrDir == FRMDIR_ENVIRONMENT ) { // get "environment" direction from page style if ( pViewData->GetDocument()->GetEditTextDirection( pViewData->GetTabNo() ) == EE_HTEXTDIR_R2L ) eAttrDir = FRMDIR_HORI_RIGHT_TOP; else eAttrDir = FRMDIR_HORI_LEFT_TOP; } rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_LEFT_TO_RIGHT, ( eAttrDir == FRMDIR_HORI_LEFT_TOP ) ) ); rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_RIGHT_TO_LEFT, ( eAttrDir == FRMDIR_HORI_RIGHT_TOP ) ) ); } } void ScDrawTextObjectBar::ExecuteTrans( SfxRequest& rReq ) { sal_Int32 nType = ScViewUtil::GetTransliterationType( rReq.GetSlot() ); if ( nType ) { ScDrawView* pView = pViewData->GetScDrawView(); OutlinerView* pOutView = pView->GetTextEditOutlinerView(); if ( pOutView ) { // change selected text in object pOutView->TransliterateText( nType ); } else { //! apply to whole objects? } } } void ScDrawTextObjectBar::GetStatePropPanelAttr(SfxItemSet &rSet) { SfxWhichIter aIter( rSet ); sal_uInt16 nWhich = aIter.FirstWhich(); SdrView* pView = pViewData->GetScDrawView(); SfxItemSet aEditAttr(pView->GetModel()->GetItemPool()); pView->GetAttributes(aEditAttr); //SfxItemSet aAttrs( *aEditAttr.GetPool(), aEditAttr.GetRanges() ); while ( nWhich ) { sal_uInt16 nSlotId = SfxItemPool::IsWhich(nWhich) ? GetPool().GetSlotId(nWhich) : nWhich; switch ( nSlotId ) { case SID_TABLE_VERT_NONE: case SID_TABLE_VERT_CENTER: case SID_TABLE_VERT_BOTTOM: bool bContour = false; SfxItemState eConState = aEditAttr.GetItemState( SDRATTR_TEXT_CONTOURFRAME ); if( eConState != SfxItemState::DONTCARE ) { bContour = static_cast( aEditAttr.Get( SDRATTR_TEXT_CONTOURFRAME ) ).GetValue(); } if (bContour) break; SfxItemState eVState = aEditAttr.GetItemState( SDRATTR_TEXT_VERTADJUST ); //SfxItemState eHState = aAttrs.GetItemState( SDRATTR_TEXT_HORZADJUST ); //if(SfxItemState::DONTCARE != eVState && SfxItemState::DONTCARE != eHState) if(SfxItemState::DONTCARE != eVState) { SdrTextVertAdjust eTVA = (SdrTextVertAdjust)static_cast(aEditAttr.Get(SDRATTR_TEXT_VERTADJUST)).GetValue(); bool bSet = (nSlotId == SID_TABLE_VERT_NONE && eTVA == SDRTEXTVERTADJUST_TOP) || (nSlotId == SID_TABLE_VERT_CENTER && eTVA == SDRTEXTVERTADJUST_CENTER) || (nSlotId == SID_TABLE_VERT_BOTTOM && eTVA == SDRTEXTVERTADJUST_BOTTOM); rSet.Put(SfxBoolItem(nSlotId, bSet)); } else { rSet.Put(SfxBoolItem(nSlotId, false)); } break; } nWhich = aIter.NextWhich(); } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */