LCOV - code coverage report
Current view: top level - libreoffice/sc/source/core/tool - editutil.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 180 397 45.3 %
Date: 2012-12-27 Functions: 26 39 66.7 %
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 "scitems.hxx"
      21             : #include <comphelper/string.hxx>
      22             : #include <editeng/eeitem.hxx>
      23             : 
      24             : #include <svx/algitem.hxx>
      25             : #include <svtools/colorcfg.hxx>
      26             : #include <editeng/editview.hxx>
      27             : #include <editeng/editstat.hxx>
      28             : #include <editeng/escpitem.hxx>
      29             : #include <editeng/flditem.hxx>
      30             : #include <editeng/numitem.hxx>
      31             : #include <editeng/justifyitem.hxx>
      32             : #include <vcl/svapp.hxx>
      33             : #include <vcl/outdev.hxx>
      34             : #include <svl/inethist.hxx>
      35             : #include <unotools/syslocale.hxx>
      36             : 
      37             : #include <com/sun/star/text/textfield/Type.hpp>
      38             : #include <com/sun/star/document/XDocumentProperties.hpp>
      39             : 
      40             : #include "editutil.hxx"
      41             : #include "global.hxx"
      42             : #include "attrib.hxx"
      43             : #include "document.hxx"
      44             : #include "docpool.hxx"
      45             : #include "patattr.hxx"
      46             : #include "scmod.hxx"
      47             : #include "inputopt.hxx"
      48             : #include "compiler.hxx"
      49             : 
      50             : using namespace com::sun::star;
      51             : 
      52             : // STATIC DATA -----------------------------------------------------------
      53             : 
      54             : //  Delimiters zusaetzlich zu EditEngine-Default:
      55             : 
      56             : const sal_Char ScEditUtil::pCalcDelimiters[] = "=()+-*/^&<>";
      57             : 
      58             : 
      59             : //------------------------------------------------------------------------
      60             : 
      61          63 : String ScEditUtil::ModifyDelimiters( const String& rOld )
      62             : {
      63             :     // underscore is used in function argument names
      64          63 :     String aRet = comphelper::string::remove(rOld, '_');
      65          63 :     aRet.AppendAscii( RTL_CONSTASCII_STRINGPARAM( pCalcDelimiters ) );
      66          63 :     aRet.Append(ScCompiler::GetNativeSymbol(ocSep)); // argument separator is localized.
      67          63 :     return aRet;
      68             : }
      69             : 
      70          43 : static String lcl_GetDelimitedString( const EditEngine& rEngine, const sal_Char c )
      71             : {
      72          43 :     String aRet;
      73          43 :     sal_uInt16 nParCount = rEngine.GetParagraphCount();
      74         109 :     for (sal_uInt16 nPar=0; nPar<nParCount; nPar++)
      75             :     {
      76          66 :         if (nPar > 0)
      77          23 :             aRet += c;
      78          66 :         aRet += rEngine.GetText( nPar );
      79             :     }
      80          43 :     return aRet;
      81             : }
      82             : 
      83          24 : String ScEditUtil::GetSpaceDelimitedString( const EditEngine& rEngine )
      84             : {
      85          24 :     return lcl_GetDelimitedString(rEngine, ' ');
      86             : }
      87             : 
      88          19 : String ScEditUtil::GetMultilineString( const EditEngine& rEngine )
      89             : {
      90          19 :     return lcl_GetDelimitedString(rEngine, '\n');
      91             : }
      92             : 
      93             : //------------------------------------------------------------------------
      94             : 
      95           0 : Rectangle ScEditUtil::GetEditArea( const ScPatternAttr* pPattern, sal_Bool bForceToTop )
      96             : {
      97             :     // bForceToTop = always align to top, for editing
      98             :     // (sal_False for querying URLs etc.)
      99             : 
     100           0 :     if (!pPattern)
     101           0 :         pPattern = pDoc->GetPattern( nCol, nRow, nTab );
     102             : 
     103           0 :     Point aStartPos = aScrPos;
     104             : 
     105           0 :     sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
     106           0 :     long nLayoutSign = bLayoutRTL ? -1 : 1;
     107             : 
     108           0 :     const ScMergeAttr* pMerge = (const ScMergeAttr*)&pPattern->GetItem(ATTR_MERGE);
     109           0 :     long nCellX = (long) ( pDoc->GetColWidth(nCol,nTab) * nPPTX );
     110           0 :     if ( pMerge->GetColMerge() > 1 )
     111             :     {
     112           0 :         SCCOL nCountX = pMerge->GetColMerge();
     113           0 :         for (SCCOL i=1; i<nCountX; i++)
     114           0 :             nCellX += (long) ( pDoc->GetColWidth(nCol+i,nTab) * nPPTX );
     115             :     }
     116           0 :     long nCellY = (long) ( pDoc->GetRowHeight(nRow,nTab) * nPPTY );
     117           0 :     if ( pMerge->GetRowMerge() > 1 )
     118             :     {
     119           0 :         SCROW nCountY = pMerge->GetRowMerge();
     120           0 :         nCellY += (long) pDoc->GetScaledRowHeight( nRow+1, nRow+nCountY-1, nTab, nPPTY);
     121             :     }
     122             : 
     123           0 :     const SvxMarginItem* pMargin = (const SvxMarginItem*)&pPattern->GetItem(ATTR_MARGIN);
     124           0 :     sal_uInt16 nIndent = 0;
     125           0 :     if ( ((const SvxHorJustifyItem&)pPattern->GetItem(ATTR_HOR_JUSTIFY)).GetValue() ==
     126             :                 SVX_HOR_JUSTIFY_LEFT )
     127           0 :         nIndent = ((const SfxUInt16Item&)pPattern->GetItem(ATTR_INDENT)).GetValue();
     128           0 :     long nPixDifX   = (long) ( ( pMargin->GetLeftMargin() + nIndent ) * nPPTX );
     129           0 :     aStartPos.X()   += nPixDifX * nLayoutSign;
     130           0 :     nCellX          -= nPixDifX + (long) ( pMargin->GetRightMargin() * nPPTX );     // wegen Umbruch etc.
     131             : 
     132             :     //  vertikale Position auf die in der Tabelle anpassen
     133             : 
     134             :     long nPixDifY;
     135           0 :     long nTopMargin = (long) ( pMargin->GetTopMargin() * nPPTY );
     136             :     SvxCellVerJustify eJust = (SvxCellVerJustify) ((const SvxVerJustifyItem&)pPattern->
     137           0 :                                                 GetItem(ATTR_VER_JUSTIFY)).GetValue();
     138             : 
     139             :     //  asian vertical is always edited top-aligned
     140           0 :     sal_Bool bAsianVertical = ((const SfxBoolItem&)pPattern->GetItem( ATTR_STACKED )).GetValue() &&
     141           0 :         ((const SfxBoolItem&)pPattern->GetItem( ATTR_VERTICAL_ASIAN )).GetValue();
     142             : 
     143           0 :     if ( eJust == SVX_VER_JUSTIFY_TOP ||
     144           0 :             ( bForceToTop && ( SC_MOD()->GetInputOptions().GetTextWysiwyg() || bAsianVertical ) ) )
     145           0 :         nPixDifY = nTopMargin;
     146             :     else
     147             :     {
     148           0 :         MapMode aMode = pDev->GetMapMode();
     149           0 :         pDev->SetMapMode( MAP_PIXEL );
     150             : 
     151             :         long nTextHeight = pDoc->GetNeededSize( nCol, nRow, nTab,
     152           0 :                                                 pDev, nPPTX, nPPTY, aZoomX, aZoomY, false );
     153           0 :         if (!nTextHeight)
     154             :         {                                   // leere Zelle
     155           0 :             Font aFont;
     156             :             // font color doesn't matter here
     157           0 :             pPattern->GetFont( aFont, SC_AUTOCOL_BLACK, pDev, &aZoomY );
     158           0 :             pDev->SetFont(aFont);
     159           0 :             nTextHeight = pDev->GetTextHeight() + nTopMargin +
     160           0 :                             (long) ( pMargin->GetBottomMargin() * nPPTY );
     161             :         }
     162             : 
     163           0 :         pDev->SetMapMode(aMode);
     164             : 
     165           0 :         if ( nTextHeight > nCellY + nTopMargin || bForceToTop )
     166           0 :             nPixDifY = 0;                           // zu gross -> oben anfangen
     167             :         else
     168             :         {
     169           0 :             if ( eJust == SVX_VER_JUSTIFY_CENTER )
     170           0 :                 nPixDifY = nTopMargin + ( nCellY - nTextHeight ) / 2;
     171             :             else
     172           0 :                 nPixDifY = nCellY - nTextHeight + nTopMargin;       // JUSTIFY_BOTTOM
     173           0 :         }
     174             :     }
     175             : 
     176           0 :     aStartPos.Y() += nPixDifY;
     177           0 :     nCellY      -= nPixDifY;
     178             : 
     179           0 :     if ( bLayoutRTL )
     180           0 :         aStartPos.X() -= nCellX - 2;    // excluding grid on both sides
     181             : 
     182             :                                                         //  -1 -> Gitter nicht ueberschreiben
     183           0 :     return Rectangle( aStartPos, Size(nCellX-1,nCellY-1) );
     184             : }
     185             : 
     186             : //------------------------------------------------------------------------
     187             : 
     188          16 : ScEditAttrTester::ScEditAttrTester( ScEditEngineDefaulter* pEng ) :
     189             :     pEngine( pEng ),
     190             :     pEditAttrs( NULL ),
     191             :     bNeedsObject( false ),
     192          16 :     bNeedsCellAttr( false )
     193             : {
     194          16 :     if ( pEngine->GetParagraphCount() > 1 )
     195             :     {
     196           8 :         bNeedsObject = sal_True;            //! Zellatribute finden ?
     197             :     }
     198             :     else
     199             :     {
     200           8 :         const SfxPoolItem* pItem = NULL;
     201             :         pEditAttrs = new SfxItemSet( pEngine->GetAttribs(
     202           8 :                                         ESelection(0,0,0,pEngine->GetTextLen(0)), EditEngineAttribs_OnlyHard ) );
     203           8 :         const SfxItemSet& rEditDefaults = pEngine->GetDefaults();
     204             : 
     205         195 :         for (sal_uInt16 nId = EE_CHAR_START; nId <= EE_CHAR_END && !bNeedsObject; nId++)
     206             :         {
     207         187 :             SfxItemState eState = pEditAttrs->GetItemState( nId, false, &pItem );
     208         187 :             if (eState == SFX_ITEM_DONTCARE)
     209           2 :                 bNeedsObject = sal_True;
     210         185 :             else if (eState == SFX_ITEM_SET)
     211             :             {
     212           0 :                 if ( nId == EE_CHAR_ESCAPEMENT || nId == EE_CHAR_PAIRKERNING ||
     213             :                         nId == EE_CHAR_KERNING || nId == EE_CHAR_XMLATTRIBS )
     214             :                 {
     215             :                     //  Escapement and kerning are kept in EditEngine because there are no
     216             :                     //  corresponding cell format items. User defined attributes are kept in
     217             :                     //  EditEngine because "user attributes applied to all the text" is different
     218             :                     //  from "user attributes applied to the cell".
     219             : 
     220           0 :                     if ( *pItem != rEditDefaults.Get(nId) )
     221           0 :                         bNeedsObject = sal_True;
     222             :                 }
     223             :                 else
     224           0 :                     if (!bNeedsCellAttr)
     225           0 :                         if ( *pItem != rEditDefaults.Get(nId) )
     226           0 :                             bNeedsCellAttr = sal_True;
     227             :                 //  rEditDefaults contains the defaults from the cell format
     228             :             }
     229             :         }
     230             : 
     231             :         //  Feldbefehle enthalten?
     232             : 
     233           8 :         SfxItemState eFieldState = pEditAttrs->GetItemState( EE_FEATURE_FIELD, false );
     234           8 :         if ( eFieldState == SFX_ITEM_DONTCARE || eFieldState == SFX_ITEM_SET )
     235           0 :             bNeedsObject = sal_True;
     236             : 
     237             :         //  not converted characters?
     238             : 
     239           8 :         SfxItemState eConvState = pEditAttrs->GetItemState( EE_FEATURE_NOTCONV, false );
     240           8 :         if ( eConvState == SFX_ITEM_DONTCARE || eConvState == SFX_ITEM_SET )
     241           0 :             bNeedsObject = sal_True;
     242             :     }
     243          16 : }
     244             : 
     245          16 : ScEditAttrTester::~ScEditAttrTester()
     246             : {
     247          16 :     delete pEditAttrs;
     248          16 : }
     249             : 
     250             : 
     251             : //------------------------------------------------------------------------
     252             : 
     253        1051 : ScEnginePoolHelper::ScEnginePoolHelper( SfxItemPool* pEnginePoolP,
     254             :                 sal_Bool bDeleteEnginePoolP )
     255             :             :
     256             :             pEnginePool( pEnginePoolP ),
     257             :             pDefaults( NULL ),
     258             :             bDeleteEnginePool( bDeleteEnginePoolP ),
     259        1051 :             bDeleteDefaults( false )
     260             : {
     261        1051 : }
     262             : 
     263             : 
     264           0 : ScEnginePoolHelper::ScEnginePoolHelper( const ScEnginePoolHelper& rOrg )
     265             :             :
     266           0 :             pEnginePool( rOrg.bDeleteEnginePool ? rOrg.pEnginePool->Clone() : rOrg.pEnginePool ),
     267             :             pDefaults( NULL ),
     268             :             bDeleteEnginePool( rOrg.bDeleteEnginePool ),
     269           0 :             bDeleteDefaults( false )
     270             : {
     271           0 : }
     272             : 
     273             : 
     274        1051 : ScEnginePoolHelper::~ScEnginePoolHelper()
     275             : {
     276        1051 :     if ( bDeleteDefaults )
     277         316 :         delete pDefaults;
     278        1051 :     if ( bDeleteEnginePool )
     279        1025 :         SfxItemPool::Free(pEnginePool);
     280        1051 : }
     281             : 
     282             : 
     283             : //------------------------------------------------------------------------
     284             : 
     285        1051 : ScEditEngineDefaulter::ScEditEngineDefaulter( SfxItemPool* pEnginePoolP,
     286             :                 sal_Bool bDeleteEnginePoolP )
     287             :             :
     288             :             ScEnginePoolHelper( pEnginePoolP, bDeleteEnginePoolP ),
     289        1051 :             EditEngine( pEnginePoolP )
     290             : {
     291             :     //  All EditEngines use ScGlobal::GetEditDefaultLanguage as DefaultLanguage.
     292             :     //  DefaultLanguage for InputHandler's EditEngine is updated later.
     293             : 
     294        1051 :     SetDefaultLanguage( ScGlobal::GetEditDefaultLanguage() );
     295        1051 : }
     296             : 
     297             : 
     298           0 : ScEditEngineDefaulter::ScEditEngineDefaulter( const ScEditEngineDefaulter& rOrg )
     299             :             :
     300             :             ScEnginePoolHelper( rOrg ),
     301           0 :             EditEngine( pEnginePool )
     302             : {
     303           0 :     SetDefaultLanguage( ScGlobal::GetEditDefaultLanguage() );
     304           0 : }
     305             : 
     306             : 
     307        1127 : ScEditEngineDefaulter::~ScEditEngineDefaulter()
     308             : {
     309        1127 : }
     310             : 
     311             : 
     312        1215 : void ScEditEngineDefaulter::SetDefaults( const SfxItemSet& rSet, sal_Bool bRememberCopy )
     313             : {
     314        1215 :     if ( bRememberCopy )
     315             :     {
     316         314 :         if ( bDeleteDefaults )
     317          19 :             delete pDefaults;
     318         314 :         pDefaults = new SfxItemSet( rSet );
     319         314 :         bDeleteDefaults = sal_True;
     320             :     }
     321        1215 :     const SfxItemSet& rNewSet = bRememberCopy ? *pDefaults : rSet;
     322        1215 :     sal_Bool bUndo = IsUndoEnabled();
     323        1215 :     EnableUndo( false );
     324        1215 :     sal_Bool bUpdateMode = GetUpdateMode();
     325        1215 :     if ( bUpdateMode )
     326         289 :         SetUpdateMode( false );
     327        1215 :     sal_uInt16 nPara = GetParagraphCount();
     328        2473 :     for ( sal_uInt16 j=0; j<nPara; j++ )
     329             :     {
     330        1258 :         SetParaAttribs( j, rNewSet );
     331             :     }
     332        1215 :     if ( bUpdateMode )
     333         289 :         SetUpdateMode( sal_True );
     334        1215 :     if ( bUndo )
     335          17 :         EnableUndo( sal_True );
     336        1215 : }
     337             : 
     338             : 
     339          37 : void ScEditEngineDefaulter::SetDefaults( SfxItemSet* pSet, sal_Bool bTakeOwnership )
     340             : {
     341          37 :     if ( bDeleteDefaults )
     342          16 :         delete pDefaults;
     343          37 :     pDefaults = pSet;
     344          37 :     bDeleteDefaults = bTakeOwnership;
     345          37 :     if ( pDefaults )
     346          37 :         SetDefaults( *pDefaults, false );
     347          37 : }
     348             : 
     349             : 
     350           0 : void ScEditEngineDefaulter::SetDefaultItem( const SfxPoolItem& rItem )
     351             : {
     352           0 :     if ( !pDefaults )
     353             :     {
     354           0 :         pDefaults = new SfxItemSet( GetEmptyItemSet() );
     355           0 :         bDeleteDefaults = sal_True;
     356             :     }
     357           0 :     pDefaults->Put( rItem );
     358           0 :     SetDefaults( *pDefaults, false );
     359           0 : }
     360             : 
     361           8 : const SfxItemSet& ScEditEngineDefaulter::GetDefaults()
     362             : {
     363           8 :     if ( !pDefaults )
     364             :     {
     365           0 :         pDefaults = new SfxItemSet( GetEmptyItemSet() );
     366           0 :         bDeleteDefaults = sal_True;
     367             :     }
     368           8 :     return *pDefaults;
     369             : }
     370             : 
     371         168 : void ScEditEngineDefaulter::SetText( const EditTextObject& rTextObject )
     372             : {
     373         168 :     sal_Bool bUpdateMode = GetUpdateMode();
     374         168 :     if ( bUpdateMode )
     375         168 :         SetUpdateMode( false );
     376         168 :     EditEngine::SetText( rTextObject );
     377         168 :     if ( pDefaults )
     378         144 :         SetDefaults( *pDefaults, false );
     379         168 :     if ( bUpdateMode )
     380         168 :         SetUpdateMode( sal_True );
     381         168 : }
     382             : 
     383         736 : void ScEditEngineDefaulter::SetTextNewDefaults( const EditTextObject& rTextObject,
     384             :             const SfxItemSet& rSet, sal_Bool bRememberCopy )
     385             : {
     386         736 :     sal_Bool bUpdateMode = GetUpdateMode();
     387         736 :     if ( bUpdateMode )
     388         734 :         SetUpdateMode( false );
     389         736 :     EditEngine::SetText( rTextObject );
     390         736 :     SetDefaults( rSet, bRememberCopy );
     391         736 :     if ( bUpdateMode )
     392         734 :         SetUpdateMode( sal_True );
     393         736 : }
     394             : 
     395          17 : void ScEditEngineDefaulter::SetTextNewDefaults( const EditTextObject& rTextObject,
     396             :             SfxItemSet* pSet, sal_Bool bTakeOwnership )
     397             : {
     398          17 :     sal_Bool bUpdateMode = GetUpdateMode();
     399          17 :     if ( bUpdateMode )
     400           0 :         SetUpdateMode( false );
     401          17 :     EditEngine::SetText( rTextObject );
     402          17 :     SetDefaults( pSet, bTakeOwnership );
     403          17 :     if ( bUpdateMode )
     404           0 :         SetUpdateMode( sal_True );
     405          17 : }
     406             : 
     407             : 
     408         939 : void ScEditEngineDefaulter::SetText( const String& rText )
     409             : {
     410         939 :     sal_Bool bUpdateMode = GetUpdateMode();
     411         939 :     if ( bUpdateMode )
     412         528 :         SetUpdateMode( false );
     413         939 :     EditEngine::SetText( rText );
     414         939 :     if ( pDefaults )
     415           0 :         SetDefaults( *pDefaults, false );
     416         939 :     if ( bUpdateMode )
     417         528 :         SetUpdateMode( sal_True );
     418         939 : }
     419             : 
     420          10 : void ScEditEngineDefaulter::SetTextNewDefaults( const String& rText,
     421             :             const SfxItemSet& rSet, sal_Bool bRememberCopy )
     422             : {
     423          10 :     sal_Bool bUpdateMode = GetUpdateMode();
     424          10 :     if ( bUpdateMode )
     425          10 :         SetUpdateMode( false );
     426          10 :     EditEngine::SetText( rText );
     427          10 :     SetDefaults( rSet, bRememberCopy );
     428          10 :     if ( bUpdateMode )
     429          10 :         SetUpdateMode( sal_True );
     430          10 : }
     431             : 
     432           0 : void ScEditEngineDefaulter::SetTextNewDefaults( const String& rText,
     433             :             SfxItemSet* pSet, sal_Bool bTakeOwnership )
     434             : {
     435           0 :     sal_Bool bUpdateMode = GetUpdateMode();
     436           0 :     if ( bUpdateMode )
     437           0 :         SetUpdateMode( false );
     438           0 :     EditEngine::SetText( rText );
     439           0 :     SetDefaults( pSet, bTakeOwnership );
     440           0 :     if ( bUpdateMode )
     441           0 :         SetUpdateMode( sal_True );
     442           0 : }
     443             : 
     444           0 : void ScEditEngineDefaulter::RepeatDefaults()
     445             : {
     446           0 :     if ( pDefaults )
     447             :     {
     448           0 :         sal_uInt16 nPara = GetParagraphCount();
     449           0 :         for ( sal_uInt16 j=0; j<nPara; j++ )
     450           0 :             SetParaAttribs( j, *pDefaults );
     451             :     }
     452           0 : }
     453             : 
     454           0 : void ScEditEngineDefaulter::RemoveParaAttribs()
     455             : {
     456           0 :     SfxItemSet* pCharItems = NULL;
     457           0 :     sal_Bool bUpdateMode = GetUpdateMode();
     458           0 :     if ( bUpdateMode )
     459           0 :         SetUpdateMode( false );
     460           0 :     sal_uInt16 nParCount = GetParagraphCount();
     461           0 :     for (sal_uInt16 nPar=0; nPar<nParCount; nPar++)
     462             :     {
     463           0 :         const SfxItemSet& rParaAttribs = GetParaAttribs( nPar );
     464             :         sal_uInt16 nWhich;
     465           0 :         for (nWhich = EE_CHAR_START; nWhich <= EE_CHAR_END; nWhich ++)
     466             :         {
     467             :             const SfxPoolItem* pParaItem;
     468           0 :             if ( rParaAttribs.GetItemState( nWhich, false, &pParaItem ) == SFX_ITEM_SET )
     469             :             {
     470             :                 //  if defaults are set, use only items that are different from default
     471           0 :                 if ( !pDefaults || *pParaItem != pDefaults->Get(nWhich) )
     472             :                 {
     473           0 :                     if (!pCharItems)
     474           0 :                         pCharItems = new SfxItemSet( GetEmptyItemSet() );
     475           0 :                     pCharItems->Put( *pParaItem );
     476             :                 }
     477             :             }
     478             :         }
     479             : 
     480           0 :         if ( pCharItems )
     481             :         {
     482           0 :             std::vector<sal_uInt16> aPortions;
     483           0 :             GetPortions( nPar, aPortions );
     484             : 
     485             :             //  loop through the portions of the paragraph, and set only those items
     486             :             //  that are not overridden by existing character attributes
     487             : 
     488           0 :             sal_uInt16 nStart = 0;
     489           0 :             for ( std::vector<sal_uInt16>::const_iterator it(aPortions.begin()); it != aPortions.end(); ++it )
     490             :             {
     491           0 :                 sal_uInt16 nEnd = *it;
     492           0 :                 ESelection aSel( nPar, nStart, nPar, nEnd );
     493           0 :                 SfxItemSet aOldCharAttrs = GetAttribs( aSel );
     494           0 :                 SfxItemSet aNewCharAttrs = *pCharItems;
     495           0 :                 for (nWhich = EE_CHAR_START; nWhich <= EE_CHAR_END; nWhich ++)
     496             :                 {
     497             :                     //  Clear those items that are different from existing character attributes.
     498             :                     //  Where no character attributes are set, GetAttribs returns the paragraph attributes.
     499             :                     const SfxPoolItem* pItem;
     500           0 :                     if ( aNewCharAttrs.GetItemState( nWhich, false, &pItem ) == SFX_ITEM_SET &&
     501           0 :                          *pItem != aOldCharAttrs.Get(nWhich) )
     502             :                     {
     503           0 :                         aNewCharAttrs.ClearItem(nWhich);
     504             :                     }
     505             :                 }
     506           0 :                 if ( aNewCharAttrs.Count() )
     507           0 :                     QuickSetAttribs( aNewCharAttrs, aSel );
     508             : 
     509           0 :                 nStart = nEnd;
     510           0 :             }
     511             : 
     512           0 :             DELETEZ( pCharItems );
     513             :         }
     514             : 
     515           0 :         if ( rParaAttribs.Count() )
     516             :         {
     517             :             //  clear all paragraph attributes (including defaults),
     518             :             //  so they are not contained in resulting EditTextObjects
     519             : 
     520           0 :             SetParaAttribs( nPar, SfxItemSet( *rParaAttribs.GetPool(), rParaAttribs.GetRanges() ) );
     521             :         }
     522             :     }
     523           0 :     if ( bUpdateMode )
     524           0 :         SetUpdateMode( sal_True );
     525           0 : }
     526             : 
     527             : //------------------------------------------------------------------------
     528             : 
     529           0 : ScTabEditEngine::ScTabEditEngine( ScDocument* pDoc )
     530           0 :         : ScEditEngineDefaulter( pDoc->GetEnginePool() )
     531             : {
     532           0 :     SetEditTextObjectPool( pDoc->GetEditPool() );
     533           0 :     Init((const ScPatternAttr&)pDoc->GetPool()->GetDefaultItem(ATTR_PATTERN));
     534           0 : }
     535             : 
     536           1 : ScTabEditEngine::ScTabEditEngine( const ScPatternAttr& rPattern,
     537             :             SfxItemPool* pEnginePoolP, SfxItemPool* pTextObjectPool )
     538           1 :         : ScEditEngineDefaulter( pEnginePoolP )
     539             : {
     540           1 :     if ( pTextObjectPool )
     541           0 :         SetEditTextObjectPool( pTextObjectPool );
     542           1 :     Init( rPattern );
     543           1 : }
     544             : 
     545           1 : void ScTabEditEngine::Init( const ScPatternAttr& rPattern )
     546             : {
     547           1 :     SetRefMapMode(MAP_100TH_MM);
     548           1 :     SfxItemSet* pEditDefaults = new SfxItemSet( GetEmptyItemSet() );
     549           1 :     rPattern.FillEditItemSet( pEditDefaults );
     550           1 :     SetDefaults( pEditDefaults );
     551             :     // wir haben keine StyleSheets fuer Text
     552           1 :     SetControlWord( GetControlWord() & ~EE_CNTRL_RTFSTYLESHEETS );
     553           1 : }
     554             : 
     555             : //------------------------------------------------------------------------
     556             : //      Feldbefehle fuer Kopf- und Fusszeilen
     557             : //------------------------------------------------------------------------
     558             : 
     559             : //
     560             : //      Zahlen aus \sw\source\core\doc\numbers.cxx
     561             : //
     562             : 
     563           0 : static String lcl_GetCharStr( sal_Int32 nNo )
     564             : {
     565             :     OSL_ENSURE( nNo, "0 ist eine ungueltige Nummer !!" );
     566           0 :     String aStr;
     567             : 
     568           0 :     const sal_Int32 coDiff = 'Z' - 'A' +1;
     569             :     sal_Int32 nCalc;
     570             : 
     571           0 :     do {
     572           0 :         nCalc = nNo % coDiff;
     573           0 :         if( !nCalc )
     574           0 :             nCalc = coDiff;
     575           0 :         aStr.Insert( (sal_Unicode)('a' - 1 + nCalc ), 0 );
     576           0 :         nNo = sal::static_int_cast<sal_Int32>( nNo - nCalc );
     577           0 :         if( nNo )
     578           0 :             nNo /= coDiff;
     579             :     } while( nNo );
     580           0 :     return aStr;
     581             : }
     582             : 
     583         106 : static OUString lcl_GetNumStr(sal_Int32 nNo, SvxNumType eType)
     584             : {
     585         106 :     OUString aTmpStr('0');
     586         106 :     if( nNo )
     587             :     {
     588          30 :         switch( eType )
     589             :         {
     590             :         case SVX_CHARS_UPPER_LETTER:
     591             :         case SVX_CHARS_LOWER_LETTER:
     592           0 :             aTmpStr = lcl_GetCharStr( nNo );
     593           0 :             break;
     594             : 
     595             :         case SVX_ROMAN_UPPER:
     596             :         case SVX_ROMAN_LOWER:
     597           0 :             if( nNo < 4000 )
     598           0 :                 aTmpStr = SvxNumberFormat::CreateRomanString( nNo, ( eType == SVX_ROMAN_UPPER ) );
     599             :             else
     600           0 :                 aTmpStr = OUString();
     601           0 :             break;
     602             : 
     603             :         case SVX_NUMBER_NONE:
     604           0 :             aTmpStr = OUString();
     605           0 :             break;
     606             : 
     607             : //      CHAR_SPECIAL:
     608             : //          ????
     609             : 
     610             : //      case ARABIC:    ist jetzt default
     611             :         default:
     612          30 :             aTmpStr = OUString::valueOf(nNo);
     613          30 :             break;
     614             :         }
     615             : 
     616          30 :         if( SVX_CHARS_UPPER_LETTER == eType )
     617           0 :             aTmpStr = aTmpStr.toAsciiUpperCase();
     618             :     }
     619         106 :     return aTmpStr;
     620             : }
     621             : 
     622        1291 : ScHeaderFieldData::ScHeaderFieldData()
     623             :     :
     624             :         aDate( Date::EMPTY ),
     625        1291 :         aTime( Time::EMPTY )
     626             : {
     627        1291 :     nPageNo = nTotalPages = 0;
     628        1291 :     eNumType = SVX_ARABIC;
     629        1291 : }
     630             : 
     631         916 : ScHeaderEditEngine::ScHeaderEditEngine( SfxItemPool* pEnginePoolP, sal_Bool bDeleteEnginePoolP )
     632         916 :         : ScEditEngineDefaulter( pEnginePoolP, bDeleteEnginePoolP )
     633             : {
     634         916 : }
     635             : 
     636         232 : String ScHeaderEditEngine::CalcFieldValue( const SvxFieldItem& rField,
     637             :                                     sal_uInt16 /* nPara */, sal_uInt16 /* nPos */,
     638             :                                     Color*& /* rTxtColor */, Color*& /* rFldColor */ )
     639             : {
     640         232 :     const SvxFieldData* pFieldData = rField.GetField();
     641         232 :     if (!pFieldData)
     642           0 :         return rtl::OUString("?");
     643             : 
     644         232 :     OUString aRet;
     645         232 :     sal_Int32 nClsId = pFieldData->GetClassId();
     646         232 :     switch (nClsId)
     647             :     {
     648             :         case text::textfield::Type::PAGE:
     649          96 :             aRet = lcl_GetNumStr( aData.nPageNo,aData.eNumType );
     650          96 :         break;
     651             :         case text::textfield::Type::PAGES:
     652          10 :             aRet = lcl_GetNumStr( aData.nTotalPages,aData.eNumType );
     653          10 :         break;
     654             :         case text::textfield::Type::EXTENDED_TIME:
     655             :         case text::textfield::Type::TIME:
     656             :             // For now, time field in the header / footer is always dynamic.
     657          10 :             aRet = ScGlobal::pLocaleData->getTime(aData.aTime);
     658          10 :         break;
     659             :         case text::textfield::Type::DOCINFO_TITLE:
     660          10 :             aRet = aData.aTitle;
     661          10 :         break;
     662             :         case text::textfield::Type::EXTENDED_FILE:
     663             :         {
     664           0 :             switch (static_cast<const SvxExtFileField*>(pFieldData)->GetFormat())
     665             :             {
     666             :                 case SVXFILEFORMAT_FULLPATH :
     667           0 :                     aRet = aData.aLongDocName;
     668           0 :                 break;
     669             :                 default:
     670           0 :                     aRet = aData.aShortDocName;
     671             :             }
     672             :         }
     673           0 :         break;
     674             :         case text::textfield::Type::TABLE:
     675          96 :             aRet = aData.aTabName;
     676          96 :         break;
     677             :         case text::textfield::Type::DATE:
     678          10 :             aRet = ScGlobal::pLocaleData->getDate(aData.aDate);
     679          10 :         break;
     680             :         default:
     681           0 :             aRet = "?";
     682             :     }
     683             : 
     684         232 :     return aRet;
     685             : }
     686             : 
     687             : //------------------------------------------------------------------------
     688             : //
     689             : //                          Feld-Daten
     690             : //
     691             : //------------------------------------------------------------------------
     692             : 
     693          20 : ScFieldEditEngine::ScFieldEditEngine(
     694             :     ScDocument* pDoc, SfxItemPool* pEnginePoolP,
     695             :     SfxItemPool* pTextObjectPool, bool bDeleteEnginePoolP) :
     696             :         ScEditEngineDefaulter( pEnginePoolP, bDeleteEnginePoolP ),
     697          20 :         mpDoc(pDoc), bExecuteURL(true)
     698             : {
     699          20 :     if ( pTextObjectPool )
     700          20 :         SetEditTextObjectPool( pTextObjectPool );
     701             :     //  EE_CNTRL_URLSFXEXECUTE nicht, weil die Edit-Engine den ViewFrame nicht kennt
     702             :     // wir haben keine StyleSheets fuer Text
     703          20 :     SetControlWord( (GetControlWord() | EE_CNTRL_MARKFIELDS) & ~EE_CNTRL_RTFSTYLESHEETS );
     704          20 : }
     705             : 
     706           0 : String ScFieldEditEngine::CalcFieldValue( const SvxFieldItem& rField,
     707             :                                     sal_uInt16 /* nPara */, sal_uInt16 /* nPos */,
     708             :                                     Color*& rTxtColor, Color*& /* rFldColor */ )
     709             : {
     710           0 :     rtl::OUString aRet;
     711           0 :     const SvxFieldData* pFieldData = rField.GetField();
     712             : 
     713           0 :     if (!pFieldData)
     714           0 :         return rtl::OUString(" ");
     715             : 
     716           0 :     sal_uInt16 nClsId = pFieldData->GetClassId();
     717           0 :     switch (nClsId)
     718             :     {
     719             :         case text::textfield::Type::URL:
     720             :         {
     721           0 :             const SvxURLField* pField = static_cast<const SvxURLField*>(pFieldData);
     722           0 :             rtl::OUString aURL = pField->GetURL();
     723             : 
     724           0 :             switch (pField->GetFormat())
     725             :             {
     726             :                 case SVXURLFORMAT_APPDEFAULT: //!!! einstellbar an App???
     727             :                 case SVXURLFORMAT_REPR:
     728           0 :                     aRet = pField->GetRepresentation();
     729           0 :                 break;
     730             :                 case SVXURLFORMAT_URL:
     731           0 :                     aRet = aURL;
     732           0 :                 break;
     733             :                 default:
     734             :                     ;
     735             :             }
     736             : 
     737             :             svtools::ColorConfigEntry eEntry =
     738           0 :                 INetURLHistory::GetOrCreate()->QueryUrl(String(aURL)) ? svtools::LINKSVISITED : svtools::LINKS;
     739           0 :             rTxtColor = new Color( SC_MOD()->GetColorConfig().GetColorValue(eEntry).nColor );
     740             :         }
     741           0 :         break;
     742             :         case text::textfield::Type::EXTENDED_TIME:
     743             :         {
     744           0 :             const SvxExtTimeField* pField = static_cast<const SvxExtTimeField*>(pFieldData);
     745           0 :             if (mpDoc)
     746           0 :                 aRet = pField->GetFormatted(*mpDoc->GetFormatTable(), ScGlobal::eLnge);
     747             :         }
     748           0 :         break;
     749             :         case text::textfield::Type::DATE:
     750             :         {
     751           0 :             Date aDate(Date::SYSTEM);
     752           0 :             aRet = ScGlobal::pLocaleData->getDate(aDate);
     753             :         }
     754           0 :         break;
     755             :         case text::textfield::Type::DOCINFO_TITLE:
     756             :         {
     757           0 :             SfxObjectShell* pDocShell = mpDoc->GetDocumentShell();
     758           0 :             aRet = pDocShell->getDocProperties()->getTitle();
     759           0 :             if (aRet.isEmpty())
     760           0 :                 aRet = pDocShell->GetTitle();
     761             :         }
     762           0 :         break;
     763             :         case text::textfield::Type::TABLE:
     764             :         {
     765           0 :             const SvxTableField* pField = static_cast<const SvxTableField*>(pFieldData);
     766           0 :             SCTAB nTab = pField->GetTab();
     767           0 :             rtl::OUString aName;
     768           0 :             if (mpDoc->GetName(nTab, aName))
     769           0 :                 aRet = aName;
     770             :             else
     771           0 :                 aRet = "?";
     772             :         }
     773           0 :         break;
     774             :         default:
     775           0 :             aRet = "?";
     776             :     }
     777             : 
     778           0 :     if (aRet.isEmpty())        // leer ist baeh
     779           0 :         aRet = " ";         // Space ist Default der Editengine
     780             : 
     781           0 :     return aRet;
     782             : }
     783             : 
     784           0 : void ScFieldEditEngine::FieldClicked( const SvxFieldItem& rField, sal_uInt16, sal_uInt16 )
     785             : {
     786           0 :     const SvxFieldData* pFld = rField.GetField();
     787             : 
     788           0 :     if ( pFld && pFld->ISA( SvxURLField ) && bExecuteURL )
     789             :     {
     790           0 :         const SvxURLField* pURLField = (const SvxURLField*) pFld;
     791           0 :         ScGlobal::OpenURL( pURLField->GetURL(), pURLField->GetTargetFrame() );
     792             :     }
     793           0 : }
     794             : 
     795             : //------------------------------------------------------------------------
     796             : 
     797           0 : ScNoteEditEngine::ScNoteEditEngine( SfxItemPool* pEnginePoolP,
     798             :             SfxItemPool* pTextObjectPool, sal_Bool bDeleteEnginePoolP ) :
     799           0 :     ScEditEngineDefaulter( pEnginePoolP, bDeleteEnginePoolP )
     800             : {
     801           0 :     if ( pTextObjectPool )
     802           0 :         SetEditTextObjectPool( pTextObjectPool );
     803           0 :     SetControlWord( (GetControlWord() | EE_CNTRL_MARKFIELDS) & ~EE_CNTRL_RTFSTYLESHEETS );
     804           0 : }
     805             : 
     806             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10