diff options
Diffstat (limited to 'sc/source/core/tool/editutil.cxx')
-rw-r--r-- | sc/source/core/tool/editutil.cxx | 780 |
1 files changed, 780 insertions, 0 deletions
diff --git a/sc/source/core/tool/editutil.cxx b/sc/source/core/tool/editutil.cxx new file mode 100644 index 000000000000..fe31cd9a0d79 --- /dev/null +++ b/sc/source/core/tool/editutil.cxx @@ -0,0 +1,780 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + +// System - Includes ----------------------------------------------------- + + + +// INCLUDE --------------------------------------------------------------- + +#include "scitems.hxx" +#include <editeng/eeitem.hxx> + +#include <svx/algitem.hxx> +#include <svtools/colorcfg.hxx> +#include <editeng/editview.hxx> +#include <editeng/editstat.hxx> +#include <editeng/escpitem.hxx> +#include <editeng/flditem.hxx> +#include <editeng/numitem.hxx> +#include <editeng/justifyitem.hxx> +#include <vcl/svapp.hxx> +#include <vcl/outdev.hxx> +#include <svl/inethist.hxx> +#include <unotools/syslocale.hxx> +#ifndef _SVSTDARR_USHORTS +#define _SVSTDARR_USHORTS +#include <svl/svstdarr.hxx> +#endif + +#include "editutil.hxx" +#include "global.hxx" +#include "attrib.hxx" +#include "document.hxx" +#include "docpool.hxx" +#include "patattr.hxx" +#include "scmod.hxx" +#include "inputopt.hxx" +#include "compiler.hxx" + +// STATIC DATA ----------------------------------------------------------- + +// Delimiters zusaetzlich zu EditEngine-Default: + +const sal_Char ScEditUtil::pCalcDelimiters[] = "=()+-*/^&<>"; + + +//------------------------------------------------------------------------ + +String ScEditUtil::ModifyDelimiters( const String& rOld ) +{ + String aRet = rOld; + aRet.EraseAllChars( '_' ); // underscore is used in function argument names + aRet.AppendAscii( RTL_CONSTASCII_STRINGPARAM( pCalcDelimiters ) ); + aRet.Append(ScCompiler::GetNativeSymbol(ocSep)); // argument separator is localized. + return aRet; +} + +static String lcl_GetDelimitedString( const EditEngine& rEngine, const sal_Char c ) +{ + String aRet; + sal_uInt16 nParCount = rEngine.GetParagraphCount(); + for (sal_uInt16 nPar=0; nPar<nParCount; nPar++) + { + if (nPar > 0) + aRet += c; + aRet += rEngine.GetText( nPar ); + } + return aRet; +} + +String ScEditUtil::GetSpaceDelimitedString( const EditEngine& rEngine ) +{ + return lcl_GetDelimitedString(rEngine, ' '); +} + +String ScEditUtil::GetMultilineString( const EditEngine& rEngine ) +{ + return lcl_GetDelimitedString(rEngine, '\n'); +} + +//------------------------------------------------------------------------ + +Rectangle ScEditUtil::GetEditArea( const ScPatternAttr* pPattern, sal_Bool bForceToTop ) +{ + // bForceToTop = always align to top, for editing + // (sal_False for querying URLs etc.) + + if (!pPattern) + pPattern = pDoc->GetPattern( nCol, nRow, nTab ); + + Point aStartPos = aScrPos; + + sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab ); + long nLayoutSign = bLayoutRTL ? -1 : 1; + + const ScMergeAttr* pMerge = (const ScMergeAttr*)&pPattern->GetItem(ATTR_MERGE); + long nCellX = (long) ( pDoc->GetColWidth(nCol,nTab) * nPPTX ); + if ( pMerge->GetColMerge() > 1 ) + { + SCCOL nCountX = pMerge->GetColMerge(); + for (SCCOL i=1; i<nCountX; i++) + nCellX += (long) ( pDoc->GetColWidth(nCol+i,nTab) * nPPTX ); + } + long nCellY = (long) ( pDoc->GetRowHeight(nRow,nTab) * nPPTY ); + if ( pMerge->GetRowMerge() > 1 ) + { + SCROW nCountY = pMerge->GetRowMerge(); + nCellY += (long) pDoc->GetScaledRowHeight( nRow+1, nRow+nCountY-1, nTab, nPPTY); + } + + const SvxMarginItem* pMargin = (const SvxMarginItem*)&pPattern->GetItem(ATTR_MARGIN); + sal_uInt16 nIndent = 0; + if ( ((const SvxHorJustifyItem&)pPattern->GetItem(ATTR_HOR_JUSTIFY)).GetValue() == + SVX_HOR_JUSTIFY_LEFT ) + nIndent = ((const SfxUInt16Item&)pPattern->GetItem(ATTR_INDENT)).GetValue(); + long nPixDifX = (long) ( ( pMargin->GetLeftMargin() + nIndent ) * nPPTX ); + aStartPos.X() += nPixDifX * nLayoutSign; + nCellX -= nPixDifX + (long) ( pMargin->GetRightMargin() * nPPTX ); // wegen Umbruch etc. + + // vertikale Position auf die in der Tabelle anpassen + + long nPixDifY; + long nTopMargin = (long) ( pMargin->GetTopMargin() * nPPTY ); + SvxCellVerJustify eJust = (SvxCellVerJustify) ((const SvxVerJustifyItem&)pPattern-> + GetItem(ATTR_VER_JUSTIFY)).GetValue(); + + // asian vertical is always edited top-aligned + sal_Bool bAsianVertical = ((const SfxBoolItem&)pPattern->GetItem( ATTR_STACKED )).GetValue() && + ((const SfxBoolItem&)pPattern->GetItem( ATTR_VERTICAL_ASIAN )).GetValue(); + + if ( eJust == SVX_VER_JUSTIFY_TOP || + ( bForceToTop && ( SC_MOD()->GetInputOptions().GetTextWysiwyg() || bAsianVertical ) ) ) + nPixDifY = nTopMargin; + else + { + MapMode aMode = pDev->GetMapMode(); + pDev->SetMapMode( MAP_PIXEL ); + + long nTextHeight = pDoc->GetNeededSize( nCol, nRow, nTab, + pDev, nPPTX, nPPTY, aZoomX, aZoomY, false ); + if (!nTextHeight) + { // leere Zelle + Font aFont; + // font color doesn't matter here + pPattern->GetFont( aFont, SC_AUTOCOL_BLACK, pDev, &aZoomY ); + pDev->SetFont(aFont); + nTextHeight = pDev->GetTextHeight() + nTopMargin + + (long) ( pMargin->GetBottomMargin() * nPPTY ); + } + + pDev->SetMapMode(aMode); + + if ( nTextHeight > nCellY + nTopMargin || bForceToTop ) + nPixDifY = 0; // zu gross -> oben anfangen + else + { + if ( eJust == SVX_VER_JUSTIFY_CENTER ) + nPixDifY = nTopMargin + ( nCellY - nTextHeight ) / 2; + else + nPixDifY = nCellY - nTextHeight + nTopMargin; // JUSTIFY_BOTTOM + } + } + + aStartPos.Y() += nPixDifY; + nCellY -= nPixDifY; + + if ( bLayoutRTL ) + aStartPos.X() -= nCellX - 2; // excluding grid on both sides + + // -1 -> Gitter nicht ueberschreiben + return Rectangle( aStartPos, Size(nCellX-1,nCellY-1) ); +} + +//------------------------------------------------------------------------ + +ScEditAttrTester::ScEditAttrTester( ScEditEngineDefaulter* pEng ) : + pEngine( pEng ), + pEditAttrs( NULL ), + bNeedsObject( false ), + bNeedsCellAttr( false ) +{ + if ( pEngine->GetParagraphCount() > 1 ) + { + bNeedsObject = sal_True; //! Zellatribute finden ? + } + else + { + const SfxPoolItem* pItem = NULL; + pEditAttrs = new SfxItemSet( pEngine->GetAttribs( + ESelection(0,0,0,pEngine->GetTextLen(0)), EditEngineAttribs_OnlyHard ) ); + const SfxItemSet& rEditDefaults = pEngine->GetDefaults(); + + for (sal_uInt16 nId = EE_CHAR_START; nId <= EE_CHAR_END && !bNeedsObject; nId++) + { + SfxItemState eState = pEditAttrs->GetItemState( nId, false, &pItem ); + if (eState == SFX_ITEM_DONTCARE) + bNeedsObject = sal_True; + else if (eState == SFX_ITEM_SET) + { + if ( nId == EE_CHAR_ESCAPEMENT || nId == EE_CHAR_PAIRKERNING || + nId == EE_CHAR_KERNING || nId == EE_CHAR_XMLATTRIBS ) + { + // Escapement and kerning are kept in EditEngine because there are no + // corresponding cell format items. User defined attributes are kept in + // EditEngine because "user attributes applied to all the text" is different + // from "user attributes applied to the cell". + + if ( *pItem != rEditDefaults.Get(nId) ) + bNeedsObject = sal_True; + } + else + if (!bNeedsCellAttr) + if ( *pItem != rEditDefaults.Get(nId) ) + bNeedsCellAttr = sal_True; + // rEditDefaults contains the defaults from the cell format + } + } + + // Feldbefehle enthalten? + + SfxItemState eFieldState = pEditAttrs->GetItemState( EE_FEATURE_FIELD, false ); + if ( eFieldState == SFX_ITEM_DONTCARE || eFieldState == SFX_ITEM_SET ) + bNeedsObject = sal_True; + + // not converted characters? + + SfxItemState eConvState = pEditAttrs->GetItemState( EE_FEATURE_NOTCONV, false ); + if ( eConvState == SFX_ITEM_DONTCARE || eConvState == SFX_ITEM_SET ) + bNeedsObject = sal_True; + } +} + +ScEditAttrTester::~ScEditAttrTester() +{ + delete pEditAttrs; +} + + +//------------------------------------------------------------------------ + +ScEnginePoolHelper::ScEnginePoolHelper( SfxItemPool* pEnginePoolP, + sal_Bool bDeleteEnginePoolP ) + : + pEnginePool( pEnginePoolP ), + pDefaults( NULL ), + bDeleteEnginePool( bDeleteEnginePoolP ), + bDeleteDefaults( false ) +{ +} + + +ScEnginePoolHelper::ScEnginePoolHelper( const ScEnginePoolHelper& rOrg ) + : + pEnginePool( rOrg.bDeleteEnginePool ? rOrg.pEnginePool->Clone() : rOrg.pEnginePool ), + pDefaults( NULL ), + bDeleteEnginePool( rOrg.bDeleteEnginePool ), + bDeleteDefaults( false ) +{ +} + + +ScEnginePoolHelper::~ScEnginePoolHelper() +{ + if ( bDeleteDefaults ) + delete pDefaults; + if ( bDeleteEnginePool ) + SfxItemPool::Free(pEnginePool); +} + + +//------------------------------------------------------------------------ + +ScEditEngineDefaulter::ScEditEngineDefaulter( SfxItemPool* pEnginePoolP, + sal_Bool bDeleteEnginePoolP ) + : + ScEnginePoolHelper( pEnginePoolP, bDeleteEnginePoolP ), + EditEngine( pEnginePoolP ) +{ + // All EditEngines use ScGlobal::GetEditDefaultLanguage as DefaultLanguage. + // DefaultLanguage for InputHandler's EditEngine is updated later. + + SetDefaultLanguage( ScGlobal::GetEditDefaultLanguage() ); +} + + +ScEditEngineDefaulter::ScEditEngineDefaulter( const ScEditEngineDefaulter& rOrg ) + : + ScEnginePoolHelper( rOrg ), + EditEngine( pEnginePool ) +{ + SetDefaultLanguage( ScGlobal::GetEditDefaultLanguage() ); +} + + +ScEditEngineDefaulter::~ScEditEngineDefaulter() +{ +} + + +void ScEditEngineDefaulter::SetDefaults( const SfxItemSet& rSet, sal_Bool bRememberCopy ) +{ + if ( bRememberCopy ) + { + if ( bDeleteDefaults ) + delete pDefaults; + pDefaults = new SfxItemSet( rSet ); + bDeleteDefaults = sal_True; + } + const SfxItemSet& rNewSet = bRememberCopy ? *pDefaults : rSet; + sal_Bool bUndo = IsUndoEnabled(); + EnableUndo( false ); + sal_Bool bUpdateMode = GetUpdateMode(); + if ( bUpdateMode ) + SetUpdateMode( false ); + sal_uInt16 nPara = GetParagraphCount(); + for ( sal_uInt16 j=0; j<nPara; j++ ) + { + SetParaAttribs( j, rNewSet ); + } + if ( bUpdateMode ) + SetUpdateMode( sal_True ); + if ( bUndo ) + EnableUndo( sal_True ); +} + + +void ScEditEngineDefaulter::SetDefaults( SfxItemSet* pSet, sal_Bool bTakeOwnership ) +{ + if ( bDeleteDefaults ) + delete pDefaults; + pDefaults = pSet; + bDeleteDefaults = bTakeOwnership; + if ( pDefaults ) + SetDefaults( *pDefaults, false ); +} + + +void ScEditEngineDefaulter::SetDefaultItem( const SfxPoolItem& rItem ) +{ + if ( !pDefaults ) + { + pDefaults = new SfxItemSet( GetEmptyItemSet() ); + bDeleteDefaults = sal_True; + } + pDefaults->Put( rItem ); + SetDefaults( *pDefaults, false ); +} + +const SfxItemSet& ScEditEngineDefaulter::GetDefaults() +{ + if ( !pDefaults ) + { + pDefaults = new SfxItemSet( GetEmptyItemSet() ); + bDeleteDefaults = sal_True; + } + return *pDefaults; +} + +void ScEditEngineDefaulter::SetText( const EditTextObject& rTextObject ) +{ + sal_Bool bUpdateMode = GetUpdateMode(); + if ( bUpdateMode ) + SetUpdateMode( false ); + EditEngine::SetText( rTextObject ); + if ( pDefaults ) + SetDefaults( *pDefaults, false ); + if ( bUpdateMode ) + SetUpdateMode( sal_True ); +} + +void ScEditEngineDefaulter::SetTextNewDefaults( const EditTextObject& rTextObject, + const SfxItemSet& rSet, sal_Bool bRememberCopy ) +{ + sal_Bool bUpdateMode = GetUpdateMode(); + if ( bUpdateMode ) + SetUpdateMode( false ); + EditEngine::SetText( rTextObject ); + SetDefaults( rSet, bRememberCopy ); + if ( bUpdateMode ) + SetUpdateMode( sal_True ); +} + +void ScEditEngineDefaulter::SetTextNewDefaults( const EditTextObject& rTextObject, + SfxItemSet* pSet, sal_Bool bTakeOwnership ) +{ + sal_Bool bUpdateMode = GetUpdateMode(); + if ( bUpdateMode ) + SetUpdateMode( false ); + EditEngine::SetText( rTextObject ); + SetDefaults( pSet, bTakeOwnership ); + if ( bUpdateMode ) + SetUpdateMode( sal_True ); +} + + +void ScEditEngineDefaulter::SetText( const String& rText ) +{ + sal_Bool bUpdateMode = GetUpdateMode(); + if ( bUpdateMode ) + SetUpdateMode( false ); + EditEngine::SetText( rText ); + if ( pDefaults ) + SetDefaults( *pDefaults, false ); + if ( bUpdateMode ) + SetUpdateMode( sal_True ); +} + +void ScEditEngineDefaulter::SetTextNewDefaults( const String& rText, + const SfxItemSet& rSet, sal_Bool bRememberCopy ) +{ + sal_Bool bUpdateMode = GetUpdateMode(); + if ( bUpdateMode ) + SetUpdateMode( false ); + EditEngine::SetText( rText ); + SetDefaults( rSet, bRememberCopy ); + if ( bUpdateMode ) + SetUpdateMode( sal_True ); +} + +void ScEditEngineDefaulter::SetTextNewDefaults( const String& rText, + SfxItemSet* pSet, sal_Bool bTakeOwnership ) +{ + sal_Bool bUpdateMode = GetUpdateMode(); + if ( bUpdateMode ) + SetUpdateMode( false ); + EditEngine::SetText( rText ); + SetDefaults( pSet, bTakeOwnership ); + if ( bUpdateMode ) + SetUpdateMode( sal_True ); +} + +void ScEditEngineDefaulter::RepeatDefaults() +{ + if ( pDefaults ) + { + sal_uInt16 nPara = GetParagraphCount(); + for ( sal_uInt16 j=0; j<nPara; j++ ) + SetParaAttribs( j, *pDefaults ); + } +} + +void ScEditEngineDefaulter::RemoveParaAttribs() +{ + SfxItemSet* pCharItems = NULL; + sal_Bool bUpdateMode = GetUpdateMode(); + if ( bUpdateMode ) + SetUpdateMode( false ); + sal_uInt16 nParCount = GetParagraphCount(); + for (sal_uInt16 nPar=0; nPar<nParCount; nPar++) + { + const SfxItemSet& rParaAttribs = GetParaAttribs( nPar ); + sal_uInt16 nWhich; + for (nWhich = EE_CHAR_START; nWhich <= EE_CHAR_END; nWhich ++) + { + const SfxPoolItem* pParaItem; + if ( rParaAttribs.GetItemState( nWhich, false, &pParaItem ) == SFX_ITEM_SET ) + { + // if defaults are set, use only items that are different from default + if ( !pDefaults || *pParaItem != pDefaults->Get(nWhich) ) + { + if (!pCharItems) + pCharItems = new SfxItemSet( GetEmptyItemSet() ); + pCharItems->Put( *pParaItem ); + } + } + } + + if ( pCharItems ) + { + SvUShorts aPortions; + GetPortions( nPar, aPortions ); + + // loop through the portions of the paragraph, and set only those items + // that are not overridden by existing character attributes + + sal_uInt16 nPCount = aPortions.Count(); + sal_uInt16 nStart = 0; + for ( sal_uInt16 nPos=0; nPos<nPCount; nPos++ ) + { + sal_uInt16 nEnd = aPortions.GetObject( nPos ); + ESelection aSel( nPar, nStart, nPar, nEnd ); + SfxItemSet aOldCharAttrs = GetAttribs( aSel ); + SfxItemSet aNewCharAttrs = *pCharItems; + for (nWhich = EE_CHAR_START; nWhich <= EE_CHAR_END; nWhich ++) + { + // Clear those items that are different from existing character attributes. + // Where no character attributes are set, GetAttribs returns the paragraph attributes. + const SfxPoolItem* pItem; + if ( aNewCharAttrs.GetItemState( nWhich, false, &pItem ) == SFX_ITEM_SET && + *pItem != aOldCharAttrs.Get(nWhich) ) + { + aNewCharAttrs.ClearItem(nWhich); + } + } + if ( aNewCharAttrs.Count() ) + QuickSetAttribs( aNewCharAttrs, aSel ); + + nStart = nEnd; + } + + DELETEZ( pCharItems ); + } + + if ( rParaAttribs.Count() ) + { + // clear all paragraph attributes (including defaults), + // so they are not contained in resulting EditTextObjects + + SetParaAttribs( nPar, SfxItemSet( *rParaAttribs.GetPool(), rParaAttribs.GetRanges() ) ); + } + } + if ( bUpdateMode ) + SetUpdateMode( sal_True ); +} + +//------------------------------------------------------------------------ + +ScTabEditEngine::ScTabEditEngine( ScDocument* pDoc ) + : ScEditEngineDefaulter( pDoc->GetEnginePool() ) +{ + SetEditTextObjectPool( pDoc->GetEditPool() ); + Init((const ScPatternAttr&)pDoc->GetPool()->GetDefaultItem(ATTR_PATTERN)); +} + +ScTabEditEngine::ScTabEditEngine( const ScPatternAttr& rPattern, + SfxItemPool* pEnginePoolP, SfxItemPool* pTextObjectPool ) + : ScEditEngineDefaulter( pEnginePoolP ) +{ + if ( pTextObjectPool ) + SetEditTextObjectPool( pTextObjectPool ); + Init( rPattern ); +} + +void ScTabEditEngine::Init( const ScPatternAttr& rPattern ) +{ + SetRefMapMode(MAP_100TH_MM); + SfxItemSet* pEditDefaults = new SfxItemSet( GetEmptyItemSet() ); + rPattern.FillEditItemSet( pEditDefaults ); + SetDefaults( pEditDefaults ); + // wir haben keine StyleSheets fuer Text + SetControlWord( GetControlWord() & ~EE_CNTRL_RTFSTYLESHEETS ); +} + +//------------------------------------------------------------------------ +// Feldbefehle fuer Kopf- und Fusszeilen +//------------------------------------------------------------------------ + +// +// Zahlen aus \sw\source\core\doc\numbers.cxx +// + +String lcl_GetCharStr( sal_Int32 nNo ) +{ + DBG_ASSERT( nNo, "0 ist eine ungueltige Nummer !!" ); + String aStr; + + const sal_Int32 coDiff = 'Z' - 'A' +1; + sal_Int32 nCalc; + + do { + nCalc = nNo % coDiff; + if( !nCalc ) + nCalc = coDiff; + aStr.Insert( (sal_Unicode)('a' - 1 + nCalc ), 0 ); + nNo = sal::static_int_cast<sal_Int32>( nNo - nCalc ); + if( nNo ) + nNo /= coDiff; + } while( nNo ); + return aStr; +} + +String lcl_GetNumStr( sal_Int32 nNo, SvxNumType eType ) +{ + String aTmpStr( '0' ); + if( nNo ) + { + switch( eType ) + { + case SVX_CHARS_UPPER_LETTER: + case SVX_CHARS_LOWER_LETTER: + aTmpStr = lcl_GetCharStr( nNo ); + break; + + case SVX_ROMAN_UPPER: + case SVX_ROMAN_LOWER: + if( nNo < 4000 ) + aTmpStr = SvxNumberFormat::CreateRomanString( nNo, ( eType == SVX_ROMAN_UPPER ) ); + else + aTmpStr.Erase(); + break; + + case SVX_NUMBER_NONE: + aTmpStr.Erase(); + break; + +// CHAR_SPECIAL: +// ???? + +// case ARABIC: ist jetzt default + default: + aTmpStr = String::CreateFromInt32( nNo ); + break; + } + + if( SVX_CHARS_UPPER_LETTER == eType ) + aTmpStr.ToUpperAscii(); + } + return aTmpStr; +} + +ScHeaderFieldData::ScHeaderFieldData() +{ + nPageNo = nTotalPages = 0; + eNumType = SVX_ARABIC; +} + +ScHeaderEditEngine::ScHeaderEditEngine( SfxItemPool* pEnginePoolP, sal_Bool bDeleteEnginePoolP ) + : ScEditEngineDefaulter( pEnginePoolP, bDeleteEnginePoolP ) +{ +} + +String ScHeaderEditEngine::CalcFieldValue( const SvxFieldItem& rField, + sal_uInt16 /* nPara */, sal_uInt16 /* nPos */, + Color*& /* rTxtColor */, Color*& /* rFldColor */ ) +{ + String aRet; + const SvxFieldData* pFieldData = rField.GetField(); + if ( pFieldData ) + { + TypeId aType = pFieldData->Type(); + if (aType == TYPE(SvxPageField)) + aRet = lcl_GetNumStr( aData.nPageNo,aData.eNumType ); + else if (aType == TYPE(SvxPagesField)) + aRet = lcl_GetNumStr( aData.nTotalPages,aData.eNumType ); + else if (aType == TYPE(SvxTimeField)) + aRet = ScGlobal::pLocaleData->getTime(aData.aTime); + else if (aType == TYPE(SvxFileField)) + aRet = aData.aTitle; + else if (aType == TYPE(SvxExtFileField)) + { + switch ( ((const SvxExtFileField*)pFieldData)->GetFormat() ) + { + case SVXFILEFORMAT_FULLPATH : + aRet = aData.aLongDocName; + break; + default: + aRet = aData.aShortDocName; + } + } + else if (aType == TYPE(SvxTableField)) + aRet = aData.aTabName; + else if (aType == TYPE(SvxDateField)) + aRet = ScGlobal::pLocaleData->getDate(aData.aDate); + else + { + aRet = '?'; + } + } + else + { + OSL_FAIL("FieldData ist 0"); + aRet = '?'; + } + + return aRet; +} + +//------------------------------------------------------------------------ +// +// Feld-Daten +// +//------------------------------------------------------------------------ + +ScFieldEditEngine::ScFieldEditEngine( SfxItemPool* pEnginePoolP, + SfxItemPool* pTextObjectPool, sal_Bool bDeleteEnginePoolP ) + : + ScEditEngineDefaulter( pEnginePoolP, bDeleteEnginePoolP ), + bExecuteURL( sal_True ) +{ + if ( pTextObjectPool ) + SetEditTextObjectPool( pTextObjectPool ); + // EE_CNTRL_URLSFXEXECUTE nicht, weil die Edit-Engine den ViewFrame nicht kennt + // wir haben keine StyleSheets fuer Text + SetControlWord( (GetControlWord() | EE_CNTRL_MARKFIELDS) & ~EE_CNTRL_RTFSTYLESHEETS ); +} + +String ScFieldEditEngine::CalcFieldValue( const SvxFieldItem& rField, + sal_uInt16 /* nPara */, sal_uInt16 /* nPos */, + Color*& rTxtColor, Color*& /* rFldColor */ ) +{ + String aRet; + const SvxFieldData* pFieldData = rField.GetField(); + + if ( pFieldData ) + { + TypeId aType = pFieldData->Type(); + + if (aType == TYPE(SvxURLField)) + { + String aURL = ((const SvxURLField*)pFieldData)->GetURL(); + + switch ( ((const SvxURLField*)pFieldData)->GetFormat() ) + { + case SVXURLFORMAT_APPDEFAULT: //!!! einstellbar an App??? + case SVXURLFORMAT_REPR: + aRet = ((const SvxURLField*)pFieldData)->GetRepresentation(); + break; + + case SVXURLFORMAT_URL: + aRet = aURL; + break; + } + + svtools::ColorConfigEntry eEntry = + INetURLHistory::GetOrCreate()->QueryUrl( aURL ) ? svtools::LINKSVISITED : svtools::LINKS; + rTxtColor = new Color( SC_MOD()->GetColorConfig().GetColorValue(eEntry).nColor ); + } + else + { + aRet = '?'; + } + } + + if (!aRet.Len()) // leer ist baeh + aRet = ' '; // Space ist Default der Editengine + + return aRet; +} + +void ScFieldEditEngine::FieldClicked( const SvxFieldItem& rField, sal_uInt16, sal_uInt16 ) +{ + const SvxFieldData* pFld = rField.GetField(); + + if ( pFld && pFld->ISA( SvxURLField ) && bExecuteURL ) + { + const SvxURLField* pURLField = (const SvxURLField*) pFld; + ScGlobal::OpenURL( pURLField->GetURL(), pURLField->GetTargetFrame() ); + } +} + +//------------------------------------------------------------------------ + +ScNoteEditEngine::ScNoteEditEngine( SfxItemPool* pEnginePoolP, + SfxItemPool* pTextObjectPool, sal_Bool bDeleteEnginePoolP ) : + ScEditEngineDefaulter( pEnginePoolP, bDeleteEnginePoolP ) +{ + if ( pTextObjectPool ) + SetEditTextObjectPool( pTextObjectPool ); + SetControlWord( (GetControlWord() | EE_CNTRL_MARKFIELDS) & ~EE_CNTRL_RTFSTYLESHEETS ); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |