summaryrefslogtreecommitdiff
path: root/binfilter/bf_sc/source/core/tool/sc_editutil.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'binfilter/bf_sc/source/core/tool/sc_editutil.cxx')
-rw-r--r--binfilter/bf_sc/source/core/tool/sc_editutil.cxx511
1 files changed, 511 insertions, 0 deletions
diff --git a/binfilter/bf_sc/source/core/tool/sc_editutil.cxx b/binfilter/bf_sc/source/core/tool/sc_editutil.cxx
new file mode 100644
index 000000000000..dec195f79768
--- /dev/null
+++ b/binfilter/bf_sc/source/core/tool/sc_editutil.cxx
@@ -0,0 +1,511 @@
+/* -*- 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.
+ *
+ ************************************************************************/
+
+#ifdef _MSC_VER
+#pragma hdrstop
+#endif
+
+#include "scitems.hxx"
+#include <bf_svx/eeitem.hxx>
+#define ITEMID_FIELD EE_FEATURE_FIELD
+
+#include <bf_svtools/colorcfg.hxx>
+#include <bf_svx/editstat.hxx>
+
+
+#include <bf_svtools/poolitem.hxx>
+
+#include <bf_svx/itemdata.hxx>
+
+#include <tools/date.hxx>
+
+#include <tools/time.hxx>
+
+#include <bf_svx/flditem.hxx>
+#include <bf_svtools/inethist.hxx>
+#include <bf_svtools/syslocale.hxx>
+#ifndef _SVSTDARR_USHORTS
+#define _SVSTDARR_USHORTS
+#endif
+
+#include "editutil.hxx"
+#include "docpool.hxx"
+#include "patattr.hxx"
+#include "scmod.hxx"
+namespace binfilter {
+
+// STATIC DATA -----------------------------------------------------------
+
+// Delimiters zusaetzlich zu EditEngine-Default:
+
+const sal_Char __FAR_DATA ScEditUtil::pCalcDelimiters[] = "=();+-*/^&<>";
+
+
+//------------------------------------------------------------------------
+
+/*N*/ String ScEditUtil::ModifyDelimiters( const String& rOld )
+/*N*/ {
+/*N*/ String aRet = rOld;
+/*N*/ aRet.EraseAllChars( '_' ); // underscore is used in function argument names
+/*N*/ aRet.AppendAscii( RTL_CONSTASCII_STRINGPARAM( pCalcDelimiters ) );
+/*N*/ return aRet;
+/*N*/ }
+
+/*N*/ String ScEditUtil::GetSpaceDelimitedString( const EditEngine& rEngine )
+/*N*/ {
+/*N*/ String aRet;
+/*N*/ USHORT nParCount = rEngine.GetParagraphCount();
+/*N*/ for (USHORT nPar=0; nPar<nParCount; nPar++)
+/*N*/ {
+/*N*/ if (nPar > 0)
+/*N*/ aRet += ' ';
+/*N*/ aRet += rEngine.GetText( nPar );
+/*N*/ }
+/*N*/ return aRet;
+/*N*/ }
+
+//------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------
+
+/*N*/ ScEditAttrTester::ScEditAttrTester( EditEngine* pEng ) :
+/*N*/ pEngine( pEng ),
+/*N*/ pEditAttrs( NULL ),
+/*N*/ bNeedsObject( FALSE ),
+/*N*/ bNeedsCellAttr( FALSE )
+/*N*/ {
+/*N*/ if ( pEngine->GetParagraphCount() > 1 )
+/*N*/ {
+/*N*/ bNeedsObject = TRUE; //! Zellatribute finden ?
+/*N*/ }
+/*N*/ else
+/*N*/ {
+/*N*/ const SfxPoolItem* pItem = NULL;
+/*N*/ pEditAttrs = new SfxItemSet( pEngine->GetAttribs(
+/*N*/ ESelection(0,0,0,pEngine->GetTextLen(0)) ) );
+/*N*/ const SfxItemPool* pEditPool = pEditAttrs->GetPool();
+/*N*/
+/*N*/ for (USHORT nId = EE_CHAR_START; nId <= EE_CHAR_END && !bNeedsObject; nId++)
+/*N*/ {
+/*N*/ SfxItemState eState = pEditAttrs->GetItemState( nId, FALSE, &pItem );
+/*N*/ if (eState == SFX_ITEM_DONTCARE)
+/*N*/ bNeedsObject = TRUE;
+/*N*/ else if (eState == SFX_ITEM_SET)
+/*N*/ {
+/*N*/ if ( nId == EE_CHAR_ESCAPEMENT || nId == EE_CHAR_PAIRKERNING ||
+/*N*/ nId == EE_CHAR_KERNING || nId == EE_CHAR_XMLATTRIBS )
+/*N*/ {
+/*N*/ // Escapement and kerning are kept in EditEngine because there are no
+/*N*/ // corresponding cell format items. User defined attributes are kept in
+/*N*/ // EditEngine because "user attributes applied to all the text" is different
+/*N*/ // from "user attributes applied to the cell".
+/*N*/
+/*N*/ if ( *pItem != pEditPool->GetDefaultItem(nId) )
+/*N*/ bNeedsObject = TRUE;
+/*N*/ }
+/*N*/ else
+/*N*/ if (!bNeedsCellAttr)
+/*N*/ if ( *pItem != pEditPool->GetDefaultItem(nId) )
+/*N*/ bNeedsCellAttr = TRUE;
+/*N*/ // SetDefaults an der EditEngine setzt Pool-Defaults
+/*N*/ }
+/*N*/ }
+/*N*/
+/*N*/ // Feldbefehle enthalten?
+/*N*/
+/*N*/ SfxItemState eFieldState = pEditAttrs->GetItemState( EE_FEATURE_FIELD, FALSE );
+/*N*/ if ( eFieldState == SFX_ITEM_DONTCARE || eFieldState == SFX_ITEM_SET )
+/*N*/ bNeedsObject = TRUE;
+/*N*/
+/*N*/ // not converted characters?
+/*N*/
+/*N*/ SfxItemState eConvState = pEditAttrs->GetItemState( EE_FEATURE_NOTCONV, FALSE );
+/*N*/ if ( eConvState == SFX_ITEM_DONTCARE || eConvState == SFX_ITEM_SET )
+/*N*/ bNeedsObject = TRUE;
+/*N*/ }
+/*N*/ }
+
+/*N*/ ScEditAttrTester::~ScEditAttrTester()
+/*N*/ {
+/*N*/ delete pEditAttrs;
+/*N*/ }
+
+
+//------------------------------------------------------------------------
+
+/*N*/ ScEnginePoolHelper::ScEnginePoolHelper( SfxItemPool* pEnginePoolP,
+/*N*/ BOOL bDeleteEnginePoolP )
+/*N*/ :
+/*N*/ pEnginePool( pEnginePoolP ),
+/*N*/ bDeleteEnginePool( bDeleteEnginePoolP ),
+/*N*/ pDefaults( NULL ),
+/*N*/ bDeleteDefaults( FALSE )
+/*N*/ {
+/*N*/ }
+
+
+/*N*/ ScEnginePoolHelper::ScEnginePoolHelper( const ScEnginePoolHelper& rOrg )
+/*N*/ :
+/*N*/ pEnginePool( rOrg.bDeleteEnginePool ? rOrg.pEnginePool->Clone() : rOrg.pEnginePool ),
+/*N*/ bDeleteEnginePool( rOrg.bDeleteEnginePool ),
+/*N*/ pDefaults( NULL ),
+/*N*/ bDeleteDefaults( FALSE )
+/*N*/ {
+/*N*/ }
+
+
+/*N*/ ScEnginePoolHelper::~ScEnginePoolHelper()
+/*N*/ {
+/*N*/ if ( bDeleteDefaults )
+/*N*/ delete pDefaults;
+/*N*/ if ( bDeleteEnginePool )
+/*N*/ delete pEnginePool;
+/*N*/ }
+
+
+//------------------------------------------------------------------------
+
+/*N*/ ScEditEngineDefaulter::ScEditEngineDefaulter( SfxItemPool* pEnginePoolP,
+/*N*/ BOOL bDeleteEnginePoolP )
+/*N*/ :
+/*N*/ ScEnginePoolHelper( pEnginePoolP, bDeleteEnginePoolP ),
+/*N*/ EditEngine( pEnginePoolP )
+/*N*/ {
+/*N*/ // All EditEngines use ScGlobal::GetEditDefaultLanguage as DefaultLanguage.
+/*N*/ // DefaultLanguage for InputHandler's EditEngine is updated later.
+/*N*/
+/*N*/ SetDefaultLanguage( ScGlobal::GetEditDefaultLanguage() );
+/*N*/ }
+
+
+/*N*/ ScEditEngineDefaulter::ScEditEngineDefaulter( const ScEditEngineDefaulter& rOrg )
+/*N*/ :
+/*N*/ ScEnginePoolHelper( rOrg ),
+/*N*/ EditEngine( pEnginePool )
+/*N*/ {
+/*N*/ SetDefaultLanguage( ScGlobal::GetEditDefaultLanguage() );
+/*N*/ }
+
+
+/*N*/ ScEditEngineDefaulter::~ScEditEngineDefaulter()
+/*N*/ {
+/*N*/ }
+
+
+/*N*/ void ScEditEngineDefaulter::SetDefaults( const SfxItemSet& rSet, BOOL bRememberCopy )
+/*N*/ {
+/*N*/ if ( bRememberCopy )
+/*N*/ {
+/*N*/ if ( bDeleteDefaults )
+/*N*/ delete pDefaults;
+/*N*/ pDefaults = new SfxItemSet( rSet );
+/*N*/ bDeleteDefaults = TRUE;
+/*N*/ }
+/*N*/ const SfxItemSet& rNewSet = bRememberCopy ? *pDefaults : rSet;
+/*N*/ BOOL bUndo = IsUndoEnabled();
+/*N*/ EnableUndo( FALSE );
+/*N*/ BOOL bUpdateMode = GetUpdateMode();
+/*N*/ if ( bUpdateMode )
+/*N*/ SetUpdateMode( FALSE );
+/*N*/ USHORT nPara = GetParagraphCount();
+/*N*/ for ( USHORT j=0; j<nPara; j++ )
+/*N*/ {
+/*N*/ SetParaAttribs( j, rNewSet );
+/*N*/ }
+/*N*/ if ( bUpdateMode )
+/*N*/ SetUpdateMode( TRUE );
+/*N*/ if ( bUndo )
+/*N*/ EnableUndo( TRUE );
+/*N*/ }
+
+
+/*N*/ void ScEditEngineDefaulter::SetDefaults( SfxItemSet* pSet, BOOL bTakeOwnership )
+/*N*/ {
+/*N*/ if ( bDeleteDefaults )
+/*N*/ delete pDefaults;
+/*N*/ pDefaults = pSet;
+/*N*/ bDeleteDefaults = bTakeOwnership;
+/*N*/ if ( pDefaults )
+/*N*/ SetDefaults( *pDefaults, FALSE );
+/*N*/ }
+
+
+
+
+/*N*/ void ScEditEngineDefaulter::SetText( const EditTextObject& rTextObject )
+/*N*/ {
+/*N*/ BOOL bUpdateMode = GetUpdateMode();
+/*N*/ if ( bUpdateMode )
+/*N*/ SetUpdateMode( FALSE );
+/*N*/ EditEngine::SetText( rTextObject );
+/*N*/ if ( pDefaults )
+/*N*/ SetDefaults( *pDefaults, FALSE );
+/*N*/ if ( bUpdateMode )
+/*N*/ SetUpdateMode( TRUE );
+/*N*/ }
+
+/*N*/ void ScEditEngineDefaulter::SetTextNewDefaults( const EditTextObject& rTextObject,
+/*N*/ const SfxItemSet& rSet, BOOL bRememberCopy )
+/*N*/ {
+/*N*/ BOOL bUpdateMode = GetUpdateMode();
+/*N*/ if ( bUpdateMode )
+/*N*/ SetUpdateMode( FALSE );
+/*N*/ EditEngine::SetText( rTextObject );
+/*N*/ SetDefaults( rSet, bRememberCopy );
+/*N*/ if ( bUpdateMode )
+/*N*/ SetUpdateMode( TRUE );
+/*N*/ }
+
+/*N*/ void ScEditEngineDefaulter::SetTextNewDefaults( const EditTextObject& rTextObject,
+/*N*/ SfxItemSet* pSet, BOOL bTakeOwnership )
+/*N*/ {
+/*N*/ BOOL bUpdateMode = GetUpdateMode();
+/*N*/ if ( bUpdateMode )
+/*?*/ SetUpdateMode( FALSE );
+/*N*/ EditEngine::SetText( rTextObject );
+/*N*/ SetDefaults( pSet, bTakeOwnership );
+/*N*/ if ( bUpdateMode )
+/*?*/ SetUpdateMode( TRUE );
+/*N*/ }
+
+
+/*N*/ void ScEditEngineDefaulter::SetText( const String& rText )
+/*N*/ {
+/*N*/ BOOL bUpdateMode = GetUpdateMode();
+/*N*/ if ( bUpdateMode )
+/*N*/ SetUpdateMode( FALSE );
+/*N*/ EditEngine::SetText( rText );
+/*N*/ if ( pDefaults )
+/*?*/ SetDefaults( *pDefaults, FALSE );
+/*N*/ if ( bUpdateMode )
+/*N*/ SetUpdateMode( TRUE );
+/*N*/ }
+
+/*N*/ void ScEditEngineDefaulter::SetTextNewDefaults( const String& rText,
+/*N*/ const SfxItemSet& rSet, BOOL bRememberCopy )
+/*N*/ {
+/*N*/ BOOL bUpdateMode = GetUpdateMode();
+/*N*/ if ( bUpdateMode )
+/*N*/ SetUpdateMode( FALSE );
+/*N*/ EditEngine::SetText( rText );
+/*N*/ SetDefaults( rSet, bRememberCopy );
+/*N*/ if ( bUpdateMode )
+/*N*/ SetUpdateMode( TRUE );
+/*N*/ }
+
+/*N*/ void ScEditEngineDefaulter::SetTextNewDefaults( const String& rText,
+/*N*/ SfxItemSet* pSet, BOOL bTakeOwnership )
+/*N*/ {
+/*N*/ BOOL bUpdateMode = GetUpdateMode();
+/*N*/ if ( bUpdateMode )
+/*?*/ SetUpdateMode( FALSE );
+/*N*/ EditEngine::SetText( rText );
+/*N*/ SetDefaults( pSet, bTakeOwnership );
+/*N*/ if ( bUpdateMode )
+/*?*/ SetUpdateMode( TRUE );
+/*N*/ }
+
+
+
+//------------------------------------------------------------------------
+
+
+
+
+//------------------------------------------------------------------------
+// Feldbefehle fuer Kopf- und Fusszeilen
+//------------------------------------------------------------------------
+
+//
+// Zahlen aus \sw\source\core\doc\numbers.cxx
+//
+
+
+
+/*N*/ String lcl_GetNumStr( USHORT nNo, SvxNumType eType )
+/*N*/ {
+/*N*/ String aTmpStr( '0' );
+/*N*/ if( nNo )
+/*N*/ {
+/*N*/ switch( eType )
+/*N*/ {
+/*?*/ case SVX_CHARS_UPPER_LETTER:
+/*?*/ case SVX_CHARS_LOWER_LETTER:
+/*?*/ DBG_BF_ASSERT(0, "STRIP"); //STRIP001 aTmpStr = lcl_GetCharStr( nNo );
+/*?*/ break;
+/*?*/
+/*?*/ case SVX_ROMAN_UPPER:
+/*?*/ case SVX_ROMAN_LOWER:
+/*?*/ DBG_BF_ASSERT(0, "STRIP"); //STRIP001 aTmpStr = lcl_GetRomanStr( nNo );
+/*?*/ break;
+/*?*/
+/*?*/ case SVX_NUMBER_NONE:
+/*?*/ aTmpStr.Erase();
+/*?*/ break;
+/*?*/
+/*?*/ // CHAR_SPECIAL:
+/*?*/ // ????
+/*?*/
+/*?*/ // case ARABIC: ist jetzt default
+/*N*/ default:
+/*N*/ aTmpStr = String::CreateFromInt32( nNo );
+/*N*/ break;
+/*N*/ }
+/*N*/
+/*N*/ if( SVX_CHARS_UPPER_LETTER == eType || SVX_ROMAN_UPPER == eType )
+/*N*/ aTmpStr.ToUpperAscii();
+/*N*/ }
+/*N*/ return aTmpStr;
+/*N*/ }
+
+/*N*/ ScHeaderFieldData::ScHeaderFieldData()
+/*N*/ {
+/*N*/ nPageNo = nTotalPages = 0;
+/*N*/ eNumType = SVX_ARABIC;
+/*N*/ }
+
+/*N*/ ScHeaderEditEngine::ScHeaderEditEngine( SfxItemPool* pEnginePool, BOOL bDeleteEnginePool )
+/*N*/ : ScEditEngineDefaulter( pEnginePool, bDeleteEnginePool )
+/*N*/ {
+/*N*/ }
+
+/*N*/ String __EXPORT ScHeaderEditEngine::CalcFieldValue( const SvxFieldItem& rField,
+/*N*/ USHORT nPara, USHORT nPos,
+/*N*/ Color*& rTxtColor, Color*& rFldColor )
+/*N*/ {
+/*N*/ String aRet;
+/*N*/ const SvxFieldData* pFieldData = rField.GetField();
+/*N*/ if ( pFieldData )
+/*N*/ {
+/*N*/ TypeId aType = pFieldData->Type();
+/*N*/ if (aType == TYPE(SvxPageField))
+/*N*/ aRet = lcl_GetNumStr( (USHORT)aData.nPageNo,aData.eNumType );
+/*N*/ else if (aType == TYPE(SvxPagesField))
+/*?*/ aRet = lcl_GetNumStr( (USHORT)aData.nTotalPages,aData.eNumType );
+/*N*/ else if (aType == TYPE(SvxTimeField))
+/*N*/ aRet = ScGlobal::pLocaleData->getTime(aData.aTime);
+/*N*/ else if (aType == TYPE(SvxFileField))
+/*N*/ aRet = aData.aTitle;
+/*N*/ else if (aType == TYPE(SvxExtFileField))
+/*N*/ {
+/*?*/ switch ( ((const SvxExtFileField*)pFieldData)->GetFormat() )
+/*?*/ {
+/*?*/ case SVXFILEFORMAT_FULLPATH :
+/*?*/ aRet = aData.aLongDocName;
+/*?*/ break;
+/*?*/ default:
+/*?*/ aRet = aData.aShortDocName;
+/*?*/ }
+/*N*/ }
+/*N*/ else if (aType == TYPE(SvxTableField))
+/*N*/ aRet = aData.aTabName;
+/*N*/ else if (aType == TYPE(SvxDateField))
+/*N*/ aRet = ScGlobal::pLocaleData->getDate(aData.aDate);
+/*N*/ else
+/*N*/ {
+/*N*/ //DBG_ERROR("unbekannter Feldbefehl");
+/*N*/ aRet = '?';
+/*N*/ }
+/*N*/ }
+/*N*/ else
+/*N*/ {
+ // #i75599# no assertion - can happen with old files
+/*N*/ //DBG_ERROR("FieldData ist 0");
+/*N*/ aRet = '?';
+/*N*/ }
+/*N*/
+/*N*/ return aRet;
+/*N*/ }
+
+//------------------------------------------------------------------------
+//
+// Feld-Daten
+//
+//------------------------------------------------------------------------
+
+/*N*/ ScFieldEditEngine::ScFieldEditEngine( SfxItemPool* pEnginePool,
+/*N*/ SfxItemPool* pTextObjectPool, BOOL bDeleteEnginePool )
+/*N*/ :
+/*N*/ ScEditEngineDefaulter( pEnginePool, bDeleteEnginePool ),
+/*N*/ bExecuteURL( TRUE )
+/*N*/ {
+/*N*/ if ( pTextObjectPool )
+/*N*/ SetEditTextObjectPool( pTextObjectPool );
+/*N*/ // EE_CNTRL_URLSFXEXECUTE nicht, weil die Edit-Engine den ViewFrame nicht kennt
+/*N*/ // wir haben keine StyleSheets fuer Text
+/*N*/ SetControlWord( (GetControlWord() | EE_CNTRL_MARKFIELDS) & ~EE_CNTRL_RTFSTYLESHEETS );
+/*N*/ }
+
+/*N*/ String __EXPORT ScFieldEditEngine::CalcFieldValue( const SvxFieldItem& rField,
+/*N*/ USHORT nPara, USHORT nPos,
+/*N*/ Color*& rTxtColor, Color*& rFldColor )
+/*N*/ {
+/*N*/ String aRet;
+/*N*/ const SvxFieldData* pFieldData = rField.GetField();
+/*N*/
+/*N*/ if ( pFieldData )
+/*N*/ {
+/*N*/ TypeId aType = pFieldData->Type();
+/*N*/
+/*N*/ if (aType == TYPE(SvxURLField))
+/*N*/ {
+/*N*/ String aURL = ((const SvxURLField*)pFieldData)->GetURL();
+/*N*/
+/*N*/ switch ( ((const SvxURLField*)pFieldData)->GetFormat() )
+/*N*/ {
+/*N*/ case SVXURLFORMAT_APPDEFAULT: //!!! einstellbar an App???
+/*N*/ case SVXURLFORMAT_REPR:
+/*N*/ aRet = ((const SvxURLField*)pFieldData)->GetRepresentation();
+/*N*/ break;
+/*N*/
+/*N*/ case SVXURLFORMAT_URL:
+/*N*/ aRet = aURL;
+/*N*/ break;
+/*N*/ }
+/*N*/
+ ColorConfigEntry eEntry = INetURLHistory::GetOrCreate()->QueryUrl( aURL ) ? LINKSVISITED : LINKS;
+/*N*/ rTxtColor = new Color( SC_MOD()->GetColorConfig().GetColorValue(eEntry).nColor );
+/*N*/ }
+/*N*/ else
+/*N*/ {
+/*N*/ //DBG_ERROR("unbekannter Feldbefehl");
+/*N*/ aRet = '?';
+/*N*/ }
+/*N*/ }
+/*N*/
+/*N*/ if (!aRet.Len()) // leer ist baeh
+/*N*/ aRet = ' '; // Space ist Default der Editengine
+/*N*/
+/*N*/ return aRet;
+/*N*/ }
+
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */