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