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 215 : String ScEditUtil::ModifyDelimiters( const String& rOld )
62 : {
63 : // underscore is used in function argument names
64 215 : String aRet = comphelper::string::remove(rOld, '_');
65 215 : aRet.AppendAscii( RTL_CONSTASCII_STRINGPARAM( pCalcDelimiters ) );
66 215 : aRet.Append(ScCompiler::GetNativeSymbol(ocSep)); // argument separator is localized.
67 215 : return aRet;
68 : }
69 :
70 194 : static String lcl_GetDelimitedString( const EditEngine& rEngine, const sal_Char c )
71 : {
72 194 : String aRet;
73 194 : sal_uInt16 nParCount = rEngine.GetParagraphCount();
74 444 : for (sal_uInt16 nPar=0; nPar<nParCount; nPar++)
75 : {
76 250 : if (nPar > 0)
77 56 : aRet += c;
78 250 : aRet += rEngine.GetText( nPar );
79 : }
80 194 : return aRet;
81 : }
82 :
83 100 : String ScEditUtil::GetSpaceDelimitedString( const EditEngine& rEngine )
84 : {
85 100 : return lcl_GetDelimitedString(rEngine, ' ');
86 : }
87 :
88 94 : String ScEditUtil::GetMultilineString( const EditEngine& rEngine )
89 : {
90 94 : 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 60 : ScEditAttrTester::ScEditAttrTester( ScEditEngineDefaulter* pEng ) :
189 : pEngine( pEng ),
190 : pEditAttrs( NULL ),
191 : bNeedsObject( false ),
192 60 : bNeedsCellAttr( false )
193 : {
194 60 : if ( pEngine->GetParagraphCount() > 1 )
195 : {
196 16 : bNeedsObject = sal_True; //! Zellatribute finden ?
197 : }
198 : else
199 : {
200 44 : const SfxPoolItem* pItem = NULL;
201 : pEditAttrs = new SfxItemSet( pEngine->GetAttribs(
202 44 : ESelection(0,0,0,pEngine->GetTextLen(0)), EditEngineAttribs_OnlyHard ) );
203 44 : const SfxItemSet& rEditDefaults = pEngine->GetDefaults();
204 :
205 1258 : for (sal_uInt16 nId = EE_CHAR_START; nId <= EE_CHAR_END && !bNeedsObject; nId++)
206 : {
207 1214 : SfxItemState eState = pEditAttrs->GetItemState( nId, false, &pItem );
208 1214 : if (eState == SFX_ITEM_DONTCARE)
209 4 : bNeedsObject = sal_True;
210 1210 : 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 44 : SfxItemState eFieldState = pEditAttrs->GetItemState( EE_FEATURE_FIELD, false );
234 44 : if ( eFieldState == SFX_ITEM_DONTCARE || eFieldState == SFX_ITEM_SET )
235 28 : bNeedsObject = sal_True;
236 :
237 : // not converted characters?
238 :
239 44 : SfxItemState eConvState = pEditAttrs->GetItemState( EE_FEATURE_NOTCONV, false );
240 44 : if ( eConvState == SFX_ITEM_DONTCARE || eConvState == SFX_ITEM_SET )
241 0 : bNeedsObject = sal_True;
242 : }
243 60 : }
244 :
245 60 : ScEditAttrTester::~ScEditAttrTester()
246 : {
247 60 : delete pEditAttrs;
248 60 : }
249 :
250 :
251 : //------------------------------------------------------------------------
252 :
253 2983 : ScEnginePoolHelper::ScEnginePoolHelper( SfxItemPool* pEnginePoolP,
254 : sal_Bool bDeleteEnginePoolP )
255 : :
256 : pEnginePool( pEnginePoolP ),
257 : pDefaults( NULL ),
258 : bDeleteEnginePool( bDeleteEnginePoolP ),
259 2983 : bDeleteDefaults( false )
260 : {
261 2983 : }
262 :
263 :
264 154 : ScEnginePoolHelper::ScEnginePoolHelper( const ScEnginePoolHelper& rOrg )
265 : :
266 72 : pEnginePool( rOrg.bDeleteEnginePool ? rOrg.pEnginePool->Clone() : rOrg.pEnginePool ),
267 : pDefaults( NULL ),
268 : bDeleteEnginePool( rOrg.bDeleteEnginePool ),
269 226 : bDeleteDefaults( false )
270 : {
271 154 : }
272 :
273 :
274 3133 : ScEnginePoolHelper::~ScEnginePoolHelper()
275 : {
276 3133 : if ( bDeleteDefaults )
277 798 : delete pDefaults;
278 3133 : if ( bDeleteEnginePool )
279 2942 : SfxItemPool::Free(pEnginePool);
280 3133 : }
281 :
282 :
283 : //------------------------------------------------------------------------
284 :
285 2983 : ScEditEngineDefaulter::ScEditEngineDefaulter( SfxItemPool* pEnginePoolP,
286 : sal_Bool bDeleteEnginePoolP )
287 : :
288 : ScEnginePoolHelper( pEnginePoolP, bDeleteEnginePoolP ),
289 2983 : EditEngine( pEnginePoolP )
290 : {
291 : // All EditEngines use ScGlobal::GetEditDefaultLanguage as DefaultLanguage.
292 : // DefaultLanguage for InputHandler's EditEngine is updated later.
293 :
294 2983 : SetDefaultLanguage( ScGlobal::GetEditDefaultLanguage() );
295 2983 : }
296 :
297 :
298 154 : ScEditEngineDefaulter::ScEditEngineDefaulter( const ScEditEngineDefaulter& rOrg )
299 : :
300 : ScEnginePoolHelper( rOrg ),
301 154 : EditEngine( pEnginePool )
302 : {
303 154 : SetDefaultLanguage( ScGlobal::GetEditDefaultLanguage() );
304 154 : }
305 :
306 :
307 3315 : ScEditEngineDefaulter::~ScEditEngineDefaulter()
308 : {
309 3315 : }
310 :
311 :
312 3507 : void ScEditEngineDefaulter::SetDefaults( const SfxItemSet& rSet, sal_Bool bRememberCopy )
313 : {
314 3507 : if ( bRememberCopy )
315 : {
316 776 : if ( bDeleteDefaults )
317 42 : delete pDefaults;
318 776 : pDefaults = new SfxItemSet( rSet );
319 776 : bDeleteDefaults = sal_True;
320 : }
321 3507 : const SfxItemSet& rNewSet = bRememberCopy ? *pDefaults : rSet;
322 3507 : sal_Bool bUndo = IsUndoEnabled();
323 3507 : EnableUndo( false );
324 3507 : sal_Bool bUpdateMode = GetUpdateMode();
325 3507 : if ( bUpdateMode )
326 730 : SetUpdateMode( false );
327 3507 : sal_uInt16 nPara = GetParagraphCount();
328 7135 : for ( sal_uInt16 j=0; j<nPara; j++ )
329 : {
330 3628 : SetParaAttribs( j, rNewSet );
331 : }
332 3507 : if ( bUpdateMode )
333 730 : SetUpdateMode( sal_True );
334 3507 : if ( bUndo )
335 101 : EnableUndo( sal_True );
336 3507 : }
337 :
338 :
339 124 : void ScEditEngineDefaulter::SetDefaults( SfxItemSet* pSet, sal_Bool bTakeOwnership )
340 : {
341 124 : if ( bDeleteDefaults )
342 57 : delete pDefaults;
343 124 : pDefaults = pSet;
344 124 : bDeleteDefaults = bTakeOwnership;
345 124 : if ( pDefaults )
346 124 : SetDefaults( *pDefaults, false );
347 124 : }
348 :
349 :
350 4 : void ScEditEngineDefaulter::SetDefaultItem( const SfxPoolItem& rItem )
351 : {
352 4 : if ( !pDefaults )
353 : {
354 0 : pDefaults = new SfxItemSet( GetEmptyItemSet() );
355 0 : bDeleteDefaults = sal_True;
356 : }
357 4 : pDefaults->Put( rItem );
358 4 : SetDefaults( *pDefaults, false );
359 4 : }
360 :
361 44 : const SfxItemSet& ScEditEngineDefaulter::GetDefaults()
362 : {
363 44 : if ( !pDefaults )
364 : {
365 0 : pDefaults = new SfxItemSet( GetEmptyItemSet() );
366 0 : bDeleteDefaults = sal_True;
367 : }
368 44 : return *pDefaults;
369 : }
370 :
371 659 : void ScEditEngineDefaulter::SetText( const EditTextObject& rTextObject )
372 : {
373 659 : sal_Bool bUpdateMode = GetUpdateMode();
374 659 : if ( bUpdateMode )
375 657 : SetUpdateMode( false );
376 659 : EditEngine::SetText( rTextObject );
377 659 : if ( pDefaults )
378 431 : SetDefaults( *pDefaults, false );
379 659 : if ( bUpdateMode )
380 657 : SetUpdateMode( sal_True );
381 659 : }
382 :
383 2194 : void ScEditEngineDefaulter::SetTextNewDefaults( const EditTextObject& rTextObject,
384 : const SfxItemSet& rSet, sal_Bool bRememberCopy )
385 : {
386 2194 : sal_Bool bUpdateMode = GetUpdateMode();
387 2194 : if ( bUpdateMode )
388 2190 : SetUpdateMode( false );
389 2194 : EditEngine::SetText( rTextObject );
390 2194 : SetDefaults( rSet, bRememberCopy );
391 2194 : if ( bUpdateMode )
392 2190 : SetUpdateMode( sal_True );
393 2194 : }
394 :
395 64 : void ScEditEngineDefaulter::SetTextNewDefaults( const EditTextObject& rTextObject,
396 : SfxItemSet* pSet, sal_Bool bTakeOwnership )
397 : {
398 64 : sal_Bool bUpdateMode = GetUpdateMode();
399 64 : if ( bUpdateMode )
400 0 : SetUpdateMode( false );
401 64 : EditEngine::SetText( rTextObject );
402 64 : SetDefaults( pSet, bTakeOwnership );
403 64 : if ( bUpdateMode )
404 0 : SetUpdateMode( sal_True );
405 64 : }
406 :
407 :
408 2640 : void ScEditEngineDefaulter::SetText( const String& rText )
409 : {
410 2640 : sal_Bool bUpdateMode = GetUpdateMode();
411 2640 : if ( bUpdateMode )
412 1668 : SetUpdateMode( false );
413 2640 : EditEngine::SetText( rText );
414 2640 : if ( pDefaults )
415 12 : SetDefaults( *pDefaults, false );
416 2640 : if ( bUpdateMode )
417 1668 : SetUpdateMode( sal_True );
418 2640 : }
419 :
420 20 : void ScEditEngineDefaulter::SetTextNewDefaults( const String& rText,
421 : const SfxItemSet& rSet, sal_Bool bRememberCopy )
422 : {
423 20 : sal_Bool bUpdateMode = GetUpdateMode();
424 20 : if ( bUpdateMode )
425 20 : SetUpdateMode( false );
426 20 : EditEngine::SetText( rText );
427 20 : SetDefaults( rSet, bRememberCopy );
428 20 : if ( bUpdateMode )
429 20 : SetUpdateMode( sal_True );
430 20 : }
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 3 : ScTabEditEngine::ScTabEditEngine( ScDocument* pDoc )
530 3 : : ScEditEngineDefaulter( pDoc->GetEnginePool() )
531 : {
532 3 : SetEditTextObjectPool( pDoc->GetEditPool() );
533 3 : Init((const ScPatternAttr&)pDoc->GetPool()->GetDefaultItem(ATTR_PATTERN));
534 3 : }
535 :
536 2 : ScTabEditEngine::ScTabEditEngine( const ScPatternAttr& rPattern,
537 : SfxItemPool* pEnginePoolP, SfxItemPool* pTextObjectPool )
538 2 : : ScEditEngineDefaulter( pEnginePoolP )
539 : {
540 2 : if ( pTextObjectPool )
541 0 : SetEditTextObjectPool( pTextObjectPool );
542 2 : Init( rPattern );
543 2 : }
544 :
545 5 : void ScTabEditEngine::Init( const ScPatternAttr& rPattern )
546 : {
547 5 : SetRefMapMode(MAP_100TH_MM);
548 5 : SfxItemSet* pEditDefaults = new SfxItemSet( GetEmptyItemSet() );
549 5 : rPattern.FillEditItemSet( pEditDefaults );
550 5 : SetDefaults( pEditDefaults );
551 : // wir haben keine StyleSheets fuer Text
552 5 : SetControlWord( GetControlWord() & ~EE_CNTRL_RTFSTYLESHEETS );
553 5 : }
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 272 : static String lcl_GetNumStr( sal_Int32 nNo, SvxNumType eType )
584 : {
585 272 : String aTmpStr(rtl::OUString('0'));
586 272 : if( nNo )
587 : {
588 60 : 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.Erase();
601 0 : break;
602 :
603 : case SVX_NUMBER_NONE:
604 0 : aTmpStr.Erase();
605 0 : break;
606 :
607 : // CHAR_SPECIAL:
608 : // ????
609 :
610 : // case ARABIC: ist jetzt default
611 : default:
612 60 : aTmpStr = String::CreateFromInt32( nNo );
613 60 : break;
614 : }
615 :
616 60 : if( SVX_CHARS_UPPER_LETTER == eType )
617 0 : aTmpStr.ToUpperAscii();
618 : }
619 272 : return aTmpStr;
620 : }
621 :
622 3558 : ScHeaderFieldData::ScHeaderFieldData()
623 : :
624 : aDate( Date::EMPTY ),
625 3558 : aTime( Time::EMPTY )
626 : {
627 3558 : nPageNo = nTotalPages = 0;
628 3558 : eNumType = SVX_ARABIC;
629 3558 : }
630 :
631 2622 : ScHeaderEditEngine::ScHeaderEditEngine( SfxItemPool* pEnginePoolP, sal_Bool bDeleteEnginePoolP )
632 2622 : : ScEditEngineDefaulter( pEnginePoolP, bDeleteEnginePoolP )
633 : {
634 2622 : }
635 :
636 584 : String ScHeaderEditEngine::CalcFieldValue( const SvxFieldItem& rField,
637 : sal_uInt16 /* nPara */, sal_uInt16 /* nPos */,
638 : Color*& /* rTxtColor */, Color*& /* rFldColor */ )
639 : {
640 584 : const SvxFieldData* pFieldData = rField.GetField();
641 584 : if (!pFieldData)
642 0 : return rtl::OUString("?");
643 :
644 584 : rtl::OUString aRet;
645 584 : sal_Int32 nClsId = pFieldData->GetClassId();
646 584 : switch (nClsId)
647 : {
648 : case text::textfield::Type::PAGE:
649 252 : aRet = lcl_GetNumStr( aData.nPageNo,aData.eNumType );
650 252 : break;
651 : case text::textfield::Type::PAGES:
652 20 : aRet = lcl_GetNumStr( aData.nTotalPages,aData.eNumType );
653 20 : 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 20 : aRet = ScGlobal::pLocaleData->getTime(aData.aTime);
658 20 : break;
659 : case text::textfield::Type::DOCINFO_TITLE:
660 20 : aRet = aData.aTitle;
661 20 : 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 252 : aRet = aData.aTabName;
676 252 : break;
677 : case text::textfield::Type::DATE:
678 20 : aRet = ScGlobal::pLocaleData->getDate(aData.aDate);
679 20 : break;
680 : default:
681 0 : aRet = "?";
682 : }
683 :
684 584 : return aRet;
685 : }
686 :
687 : //------------------------------------------------------------------------
688 : //
689 : // Feld-Daten
690 : //
691 : //------------------------------------------------------------------------
692 :
693 98 : ScFieldEditEngine::ScFieldEditEngine(
694 : ScDocument* pDoc, SfxItemPool* pEnginePoolP,
695 : SfxItemPool* pTextObjectPool, bool bDeleteEnginePoolP) :
696 : ScEditEngineDefaulter( pEnginePoolP, bDeleteEnginePoolP ),
697 98 : mpDoc(pDoc), bExecuteURL(true)
698 : {
699 98 : if ( pTextObjectPool )
700 96 : SetEditTextObjectPool( pTextObjectPool );
701 : // EE_CNTRL_URLSFXEXECUTE nicht, weil die Edit-Engine den ViewFrame nicht kennt
702 : // wir haben keine StyleSheets fuer Text
703 98 : SetControlWord( (GetControlWord() | EE_CNTRL_MARKFIELDS) & ~EE_CNTRL_RTFSTYLESHEETS );
704 98 : }
705 :
706 84 : String ScFieldEditEngine::CalcFieldValue( const SvxFieldItem& rField,
707 : sal_uInt16 /* nPara */, sal_uInt16 /* nPos */,
708 : Color*& rTxtColor, Color*& /* rFldColor */ )
709 : {
710 84 : rtl::OUString aRet;
711 84 : const SvxFieldData* pFieldData = rField.GetField();
712 :
713 84 : if (!pFieldData)
714 0 : return rtl::OUString(" ");
715 :
716 84 : sal_uInt16 nClsId = pFieldData->GetClassId();
717 84 : switch (nClsId)
718 : {
719 : case text::textfield::Type::URL:
720 : {
721 84 : const SvxURLField* pField = static_cast<const SvxURLField*>(pFieldData);
722 84 : rtl::OUString aURL = pField->GetURL();
723 :
724 84 : switch (pField->GetFormat())
725 : {
726 : case SVXURLFORMAT_APPDEFAULT: //!!! einstellbar an App???
727 : case SVXURLFORMAT_REPR:
728 84 : aRet = pField->GetRepresentation();
729 84 : break;
730 : case SVXURLFORMAT_URL:
731 0 : aRet = aURL;
732 0 : break;
733 : default:
734 : ;
735 : }
736 :
737 : svtools::ColorConfigEntry eEntry =
738 84 : INetURLHistory::GetOrCreate()->QueryUrl(String(aURL)) ? svtools::LINKSVISITED : svtools::LINKS;
739 84 : rTxtColor = new Color( SC_MOD()->GetColorConfig().GetColorValue(eEntry).nColor );
740 : }
741 84 : 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 84 : if (aRet.isEmpty()) // leer ist baeh
779 0 : aRet = " "; // Space ist Default der Editengine
780 :
781 84 : 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: */
|