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