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 #ifndef INCLUDED_SC_INC_GLOBAL_HXX 21 #define INCLUDED_SC_INC_GLOBAL_HXX 22 23 #include "address.hxx" 24 #include <i18nlangtag/lang.h> 25 #include <svx/svdtypes.hxx> 26 #include <tools/ref.hxx> 27 #include <sal/types.h> 28 #include <com/sun/star/i18n/CollatorOptions.hpp> 29 #include "scdllapi.h" 30 #include <rtl/ustring.hxx> 31 32 #include <atomic> 33 // HACK: <atomic> includes <stdbool.h>, which in some Clang versions does '#define bool bool', 34 // which confuses clang plugins. 35 #undef bool 36 #include <map> 37 #include <memory> 38 39 namespace com { namespace sun { namespace star { namespace uno { template <typename > class Reference; } } } } 40 41 class SfxItemSet; 42 class SfxViewShell; 43 struct ScCalcConfig; 44 enum class SvtScriptType; 45 enum class FormulaError : sal_uInt16; 46 enum class SvNumFormatType : sal_Int16; 47 48 #define SC_COLLATOR_IGNORES css::i18n::CollatorOptions::CollatorOptions_IGNORE_CASE 49 50 // Calc has lots of names... 51 // Clipboard names are in so3/soapp.hxx now 52 // STRING_SCAPP was "scalc3", "scalc4", now just "scalc" 53 54 #define STRING_SCAPP "scalc" 55 56 #define STRING_STANDARD "Standard" 57 58 // Have the dreaded programmatic filter name defined in one place. 59 #define SC_TEXT_CSV_FILTER_NAME "Text - txt - csv (StarCalc)" 60 61 // characters 62 63 const sal_Unicode CHAR_NBSP = 0x00A0; 64 const sal_Unicode CHAR_SHY = 0x00AD; 65 const sal_Unicode CHAR_ZWSP = 0x200B; 66 const sal_Unicode CHAR_LRM = 0x200E; 67 const sal_Unicode CHAR_RLM = 0x200F; 68 const sal_Unicode CHAR_NBHY = 0x2011; 69 const sal_Unicode CHAR_ZWNBSP = 0x2060; 70 const sal_Unicode CHAR_NNBSP = 0x202F; //NARROW NO-BREAK SPACE 71 72 #define MINDOUBLE 1.7e-307 73 #define MAXDOUBLE 1.7e307 74 75 #define MINZOOM 20 76 #define MAXZOOM 400 77 78 const SCSIZE MAXSUBTOTAL = 3; 79 80 #define PIXEL_PER_INCH 96.0 81 #define CM_PER_INCH 2.54 82 #define POINTS_PER_INCH 72.0 /**< PostScript points per inch */ 83 #define PIXEL_PER_POINT (PIXEL_PER_INCH / POINTS_PER_INCH) 84 #define TWIPS_PER_POINT 20.0 85 #define TWIPS_PER_INCH (TWIPS_PER_POINT * POINTS_PER_INCH) 86 #define TWIPS_PER_CM (TWIPS_PER_INCH / CM_PER_INCH) 87 #define CM_PER_TWIPS (CM_PER_INCH / TWIPS_PER_INCH) 88 #define TWIPS_PER_PIXEL (TWIPS_PER_INCH / PIXEL_PER_INCH) 89 #define TWIPS_PER_CHAR (TWIPS_PER_INCH / 13.6) 90 #define PIXEL_PER_TWIPS (PIXEL_PER_INCH / TWIPS_PER_INCH) 91 #define HMM_PER_TWIPS (CM_PER_TWIPS * 1000.0) 92 93 #define STD_COL_WIDTH 1280 /* 2.2577cm, 64.00pt PS */ 94 #define STD_EXTRA_WIDTH 113 /* 2mm extra for optimal width, 95 * 0.1986cm with TeX points, 96 * 0.1993cm with PS points. */ 97 98 #define MAX_EXTRA_WIDTH 23811 /* 42cm in TWIPS, 41.8430cm TeX, 41.9999cm PS */ 99 #define MAX_EXTRA_HEIGHT 23811 100 #define MAX_COL_WIDTH 56693 /* 1m in TWIPS, 99.6266cm TeX, 100.0001cm PS */ 101 #define MAX_ROW_HEIGHT 56693 102 103 /* standard row height: text + margin - STD_ROWHEIGHT_DIFF */ 104 #define STD_ROWHEIGHT_DIFF 23 105 106 namespace sc 107 { 108 inline long TwipsToHMM( long nTwips ) { return (nTwips * 127 + 36) / 72; } 109 inline long HMMToTwips( long nHMM ) { return (nHMM * 72 + 63) / 127; } 110 inline long TwipsToEvenHMM( long nTwips ) { return ( (nTwips * 127 + 72) / 144 ) * 2; } 111 } 112 113 // standard size as OLE server (cells) 114 #define OLE_STD_CELLS_X 4 115 #define OLE_STD_CELLS_Y 5 116 117 118 // repaint flags (for messages) 119 enum class PaintPartFlags { 120 NONE = 0x00, 121 Grid = 0x01, 122 Top = 0x02, 123 Left = 0x04, 124 Extras = 0x08, 125 Marks = 0x10, 126 Objects = 0x20, 127 Size = 0x40, 128 All = Grid | Top | Left | Extras | Objects | Size, 129 }; 130 namespace o3tl { 131 template<> struct typed_flags<PaintPartFlags> : is_typed_flags<PaintPartFlags, 0x07f> {}; 132 } 133 134 // flags for columns / rows 135 enum class CRFlags : sal_uInt8 { 136 // Filtered always together with Hidden 137 // Filtered and ManualSize only valid for rows 138 NONE = 0x00, 139 Hidden = 0x01, 140 ManualBreak = 0x02, 141 Filtered = 0x04, 142 ManualSize = 0x08, 143 All = Hidden | ManualBreak | Filtered | ManualSize 144 }; 145 namespace o3tl { 146 template<> struct typed_flags<CRFlags> : is_typed_flags<CRFlags, 0x0f> {}; 147 } 148 149 enum class ScBreakType { 150 NONE = 0x00, 151 Page = 0x01, 152 Manual = 0x02 153 }; 154 namespace o3tl { 155 template<> struct typed_flags<ScBreakType> : is_typed_flags<ScBreakType, 0x03> {}; 156 } 157 158 enum class InsertDeleteFlags : sal_uInt16 159 { 160 NONE = 0x0000, 161 VALUE = 0x0001, /// Numeric values (and numeric results if InsertDeleteFlags::FORMULA is not set). 162 DATETIME = 0x0002, /// Dates, times, datetime values. 163 STRING = 0x0004, /// Strings (and string results if InsertDeleteFlags::FORMULA is not set). 164 NOTE = 0x0008, /// Cell notes. 165 FORMULA = 0x0010, /// Formula cells. 166 HARDATTR = 0x0020, /// Hard cell attributes. 167 STYLES = 0x0040, /// Cell styles. 168 OBJECTS = 0x0080, /// Drawing objects. 169 EDITATTR = 0x0100, /// Rich-text attributes. 170 OUTLINE = 0x0800, /// Sheet / outlining (grouping) information 171 NOCAPTIONS = 0x0200, /// Internal use only (undo etc.): do not copy/delete caption objects of cell notes. 172 ADDNOTES = 0x0400, /// Internal use only (copy from clip): do not delete existing cell contents when pasting notes. 173 SPECIAL_BOOLEAN = 0x1000, 174 FORGETCAPTIONS = 0x2000, /// Internal use only (d&d undo): do not delete caption objects of cell notes. 175 ATTRIB = HARDATTR | STYLES, 176 CONTENTS = VALUE | DATETIME | STRING | NOTE | FORMULA | OUTLINE, 177 ALL = CONTENTS | ATTRIB | OBJECTS, 178 /// Copy flags for auto/series fill functions: do not touch notes and drawing objects. 179 AUTOFILL = ALL & ~(NOTE | OBJECTS) 180 }; 181 namespace o3tl 182 { 183 template<> struct typed_flags<InsertDeleteFlags> : is_typed_flags<InsertDeleteFlags, 0x3fff> {}; 184 } 185 // This doesn't work at the moment, perhaps when we have constexpr we can modify InsertDeleteFlags to make it work. 186 //static_assert((InsertDeleteFlags::ATTRIB & InsertDeleteFlags::CONTENTS) == InsertDeleteFlags::NONE, "these must match"); 187 188 189 enum class ScPasteFunc { 190 NONE, ADD, SUB, MUL, DIV 191 }; 192 // bits for HasAttr 193 enum class HasAttrFlags { 194 NONE = 0x0000, 195 Lines = 0x0001, 196 Merged = 0x0002, 197 Overlapped = 0x0004, 198 Protected = 0x0008, 199 Shadow = 0x0010, 200 NeedHeight = 0x0020, 201 ShadowRight = 0x0040, 202 ShadowDown = 0x0080, 203 AutoFilter = 0x0100, 204 Conditional = 0x0200, 205 Rotate = 0x0400, 206 NotOverlapped = 0x0800, 207 RightOrCenter = 0x1000, // right or centered logical alignment 208 }; 209 namespace o3tl { 210 template<> struct typed_flags<HasAttrFlags> : is_typed_flags<HasAttrFlags, 0x1fff> {}; 211 } 212 213 214 #define EMPTY_OUSTRING ScGlobal::GetEmptyOUString() 215 216 // Layer id's for drawing. 217 // These are both id's and positions. 218 constexpr SdrLayerID SC_LAYER_FRONT (0); 219 constexpr SdrLayerID SC_LAYER_BACK (1); 220 constexpr SdrLayerID SC_LAYER_INTERN (2); 221 constexpr SdrLayerID SC_LAYER_CONTROLS(3); 222 constexpr SdrLayerID SC_LAYER_HIDDEN (4); 223 224 // link tables 225 enum class ScLinkMode { 226 NONE, NORMAL, VALUE 227 }; 228 // input 229 enum class ScEnterMode { 230 NORMAL, BLOCK, MATRIX 231 }; 232 233 // step = 10pt, max. indention = 100 steps 234 #define SC_INDENT_STEP 200 235 236 enum class ScScenarioFlags{ // scenario flags 237 NONE = 0, 238 CopyAll = 1, 239 ShowFrame = 2, 240 PrintFrame = 4, 241 TwoWay = 8, 242 Attrib = 16, 243 Value = 32, 244 Protected = 64 245 }; 246 namespace o3tl { 247 template<> struct typed_flags<ScScenarioFlags> : is_typed_flags<ScScenarioFlags, 127> {}; 248 } 249 250 enum class SubtotalFlags { 251 NONE = 0x00, 252 IgnoreNestedStAg = 0x08, 253 IgnoreErrVal = 0x04, 254 IgnoreHidden = 0x02, 255 IgnoreFiltered = 0x01 256 }; 257 namespace o3tl { 258 template<> struct typed_flags<SubtotalFlags> : is_typed_flags<SubtotalFlags, 0x0f> {}; 259 } 260 261 enum class ScCloneFlags{ 262 /** Default cell clone flags: do not start listening, do not adjust 3D refs to 263 old position, clone note captions of cell notes. */ 264 Default = 0x0000, 265 266 /** If set, cloned formula cells will start to listen to the document. */ 267 StartListening = 0x0001, 268 269 /** If set, absolute refs will not transformed to external references */ 270 NoMakeAbsExternal = 0x0002, 271 272 /** If set, global named expressions will be converted to sheet-local named 273 expressions. */ 274 NamesToLocal = 0x0004 275 }; 276 namespace o3tl 277 { 278 template<> struct typed_flags<ScCloneFlags> : is_typed_flags<ScCloneFlags, 0x0007> {}; 279 } 280 281 enum CellType 282 { 283 CELLTYPE_NONE, 284 CELLTYPE_VALUE, 285 CELLTYPE_STRING, 286 CELLTYPE_FORMULA, 287 CELLTYPE_EDIT, 288 }; 289 290 enum class DelCellCmd 291 { 292 CellsUp, 293 CellsLeft, 294 Rows, 295 Cols, 296 NONE 297 }; 298 299 enum InsCellCmd 300 { 301 INS_CELLSDOWN, 302 INS_CELLSRIGHT, 303 INS_INSROWS_BEFORE, 304 INS_INSCOLS_BEFORE, 305 INS_NONE, 306 INS_INSROWS_AFTER, 307 INS_INSCOLS_AFTER 308 }; 309 310 enum UpdateRefMode 311 { 312 URM_INSDEL, 313 URM_COPY, 314 URM_MOVE, 315 URM_REORDER 316 }; 317 318 enum FillDir 319 { 320 FILL_TO_BOTTOM, 321 FILL_TO_RIGHT, 322 FILL_TO_TOP, 323 FILL_TO_LEFT 324 }; 325 326 enum FillCmd 327 { 328 FILL_SIMPLE, 329 FILL_LINEAR, 330 FILL_GROWTH, 331 FILL_DATE, 332 FILL_AUTO 333 }; 334 335 enum ScMoveDirection 336 { 337 SC_MOVE_RIGHT, 338 SC_MOVE_LEFT, 339 SC_MOVE_UP, 340 SC_MOVE_DOWN 341 }; 342 343 enum FillDateCmd 344 { 345 FILL_DAY, 346 FILL_WEEKDAY, 347 FILL_MONTH, 348 FILL_YEAR 349 }; 350 351 enum ScDirection 352 { 353 DIR_BOTTOM, 354 DIR_RIGHT, 355 DIR_TOP, 356 DIR_LEFT 357 }; 358 359 enum ScSizeMode 360 { 361 SC_SIZE_DIRECT, // set size or hide if value is 0 362 SC_SIZE_OPTIMAL, // set optimal size for everything 363 SC_SIZE_SHOW, // show with original size 364 SC_SIZE_VISOPT, // set optimal size only if visible 365 SC_SIZE_ORIGINAL // only set size, don't change visible flag 366 }; 367 368 enum ScInputMode 369 { 370 SC_INPUT_NONE, 371 SC_INPUT_TYPE, // input, while not in inplace mode 372 SC_INPUT_TABLE, // text cursor in the table 373 SC_INPUT_TOP // text cursor in the input line 374 }; 375 376 enum ScVObjMode // output modes of objects on a page 377 { 378 VOBJ_MODE_SHOW, 379 VOBJ_MODE_HIDE 380 }; 381 382 enum ScAnchorType // anchor of a character object 383 { 384 SCA_CELL, // anchor to cell, move with cell 385 SCA_CELL_RESIZE, // anchor to cell, move and resize with cell 386 SCA_PAGE, // anchor to page, independent of any cells 387 SCA_DONTKNOW // for multi selection 388 }; 389 390 enum ScGetDBMode 391 { 392 SC_DB_MAKE, ///< create "untitled" (if necessary) 393 SC_DB_AUTOFILTER, ///< force use of sheet-local instead of document global anonymous range 394 SC_DB_IMPORT, ///< create "Importx" (if necessary) 395 SC_DB_OLD ///< don't create 396 }; 397 398 /// For ScDBFunc::GetDBData() 399 enum class ScGetDBSelection 400 { 401 /** Keep selection as is, expand to used data area if no selection. */ 402 Keep, 403 404 /** Shrink selection to actually used data area within the selection. */ 405 ShrinkToUsedData, 406 407 /** If only one row or portion thereof is selected, shrink row to used data 408 columns and select further rows down until end of data. If an area is 409 selected, shrink rows to actually used columns. Else, no selection, 410 expand to used data area. */ 411 RowDown, 412 413 /** Behave as if the range corresponding to a ScDBData area was selected, 414 for API use. */ 415 ForceMark 416 }; 417 418 enum ScLkUpdMode // modes for updating links 419 { 420 LM_ALWAYS, 421 LM_NEVER, 422 LM_ON_DEMAND, 423 LM_UNKNOWN 424 }; 425 426 // enum with values equal to old DBObject enum from sdb 427 enum ScDBObject 428 { 429 ScDbTable, 430 ScDbQuery 431 }; 432 433 namespace sc { 434 435 enum class ColRowEditAction 436 { 437 Unknown, 438 InsertColumnsBefore, 439 InsertColumnsAfter, 440 InsertRowsBefore, 441 InsertRowsAfter, 442 DeleteColumns, 443 DeleteRows 444 }; 445 446 } 447 448 struct ScImportParam 449 { 450 SCCOL nCol1; 451 SCROW nRow1; 452 SCCOL nCol2; 453 SCROW nRow2; 454 bool bImport; 455 OUString aDBName; // alias of data base 456 OUString aStatement; 457 bool bNative; 458 bool bSql; // statement or name? 459 sal_uInt8 nType; // enum DBObject 460 461 ScImportParam(); 462 ScImportParam( const ScImportParam& r ); 463 ~ScImportParam(); 464 465 ScImportParam& operator= ( const ScImportParam& r ); 466 bool operator== ( const ScImportParam& r ) const; 467 }; 468 469 class ScDocShell; 470 class SvxSearchItem; 471 class ScAutoFormat; 472 class LegacyFuncCollection; 473 class ScUnoAddInCollection; 474 class ScUserList; 475 class SvxBrushItem; 476 class ScFunctionList; 477 class ScFunctionMgr; 478 class SfxItemPool; 479 class EditTextObject; 480 class SfxObjectShell; 481 class SvNumberFormatter; 482 class ScUnitConverter; 483 class CharClass; 484 class LocaleDataWrapper; 485 class SvtSysLocale; 486 class CalendarWrapper; 487 class CollatorWrapper; 488 class IntlWrapper; 489 class ScFieldEditEngine; 490 491 namespace com { namespace sun { namespace star { 492 namespace lang { 493 struct Locale; 494 } 495 namespace i18n { 496 class XOrdinalSuffix; 497 } 498 }}} 499 namespace utl { 500 class TransliterationWrapper; 501 } 502 503 class ScGlobal 504 { 505 static SvxSearchItem* pSearchItem; 506 static ScAutoFormat* pAutoFormat; 507 static std::atomic<LegacyFuncCollection*> pLegacyFuncCollection; 508 static std::atomic<ScUnoAddInCollection*> pAddInCollection; 509 static ScUserList* pUserList; 510 static std::map<const char*, OUString>* pRscString; 511 static OUString* pStrScDoc; 512 static SC_DLLPUBLIC const OUString aEmptyOUString; 513 static OUString* pStrClipDocName; 514 static SvxBrushItem* pEmptyBrushItem; 515 static SvxBrushItem* pButtonBrushItem; 516 static SvxBrushItem* pEmbeddedBrushItem; 517 518 static ScFunctionList* pStarCalcFunctionList; 519 static ScFunctionMgr* pStarCalcFunctionMgr; 520 521 static std::atomic<ScUnitConverter*> pUnitConverter; 522 523 static SvNumberFormatter* pEnglishFormatter; // for UNO / XML export 524 525 static css::uno::Reference< css::i18n::XOrdinalSuffix> xOrdinalSuffix; 526 static CalendarWrapper* pCalendar; 527 static std::atomic<CollatorWrapper*> pCaseCollator; 528 static std::atomic<CollatorWrapper*> pCollator; 529 static std::atomic<::utl::TransliterationWrapper*> pTransliteration; 530 static std::atomic<::utl::TransliterationWrapper*> pCaseTransliteration; 531 static IntlWrapper* pScIntlWrapper; 532 static std::atomic<css::lang::Locale*> pLocale; 533 534 static ScFieldEditEngine* pFieldEditEngine; 535 536 static void InitPPT(); 537 538 public: 539 static SvtSysLocale* pSysLocale; 540 // for faster access a pointer to the single instance provided by SvtSysLocale 541 SC_DLLPUBLIC static const CharClass* pCharClass; 542 // for faster access a pointer to the single instance provided by SvtSysLocale 543 SC_DLLPUBLIC static const LocaleDataWrapper* pLocaleData; 544 SC_DLLPUBLIC static const LocaleDataWrapper* GetpLocaleData(); 545 546 static CalendarWrapper* GetCalendar(); 547 SC_DLLPUBLIC static CollatorWrapper* GetCollator(); 548 static CollatorWrapper* GetCaseCollator(); 549 static css::lang::Locale* GetLocale(); 550 551 SC_DLLPUBLIC static ::utl::TransliterationWrapper* GetpTransliteration(); 552 static ::utl::TransliterationWrapper* GetCaseTransliteration(); 553 554 SC_DLLPUBLIC static LanguageType eLnge; 555 static constexpr sal_Unicode cListDelimiter = ','; 556 557 static const OUString& GetClipDocName(); 558 static void SetClipDocName( const OUString& rNew ); 559 SC_DLLPUBLIC static const SvxSearchItem& GetSearchItem(); 560 SC_DLLPUBLIC static void SetSearchItem( const SvxSearchItem& rNew ); 561 SC_DLLPUBLIC static ScAutoFormat* GetAutoFormat(); 562 SC_DLLPUBLIC static ScAutoFormat* GetOrCreateAutoFormat(); 563 static void ClearAutoFormat(); //BugId 54209 564 static LegacyFuncCollection* GetLegacyFuncCollection(); 565 SC_DLLPUBLIC static ScUnoAddInCollection* GetAddInCollection(); 566 SC_DLLPUBLIC static ScUserList* GetUserList(); 567 static void SetUserList( const ScUserList* pNewList ); 568 /** 569 * Open the specified URL. 570 * @param bIgnoreSettings - If true, ignore security settings (Ctrl-Click) and just open the URL. 571 */ 572 static void OpenURL(const OUString& rURL, const OUString& rTarget, bool bIgnoreSettings = false); 573 /// Whether the URL can be opened according to current security options (Click/Ctrl-Click) 574 static bool ShouldOpenURL(); 575 SC_DLLPUBLIC static OUString GetAbsDocName( const OUString& rFileName, 576 const SfxObjectShell* pShell ); 577 SC_DLLPUBLIC static OUString GetDocTabName( const OUString& rFileName, 578 const OUString& rTabName ); 579 SC_DLLPUBLIC static sal_uInt32 GetStandardFormat( SvNumberFormatter&, sal_uInt32 nFormat, SvNumFormatType nType ); 580 581 SC_DLLPUBLIC static sal_uInt16 GetStandardRowHeight(); 582 /// Horizontal pixel per twips factor. 583 SC_DLLPUBLIC static double nScreenPPTX; 584 /// Vertical pixel per twips factor. 585 SC_DLLPUBLIC static double nScreenPPTY; 586 587 static tools::SvRef<ScDocShell> xDrawClipDocShellRef; 588 589 static sal_uInt16 nDefFontHeight; 590 SC_DLLPUBLIC static sal_uInt16 nStdRowHeight; 591 592 SC_DLLPUBLIC static long nLastRowHeightExtra; 593 static long nLastColWidthExtra; 594 595 SC_DLLPUBLIC static void Init(); // during start up 596 static void InitAddIns(); 597 static void Clear(); // at the end of the program 598 599 static void InitTextHeight(const SfxItemPool* pPool); 600 static SvxBrushItem* GetEmptyBrushItem() { return pEmptyBrushItem; } 601 static SvxBrushItem* GetButtonBrushItem(); 602 static const OUString& GetEmptyOUString() { return aEmptyOUString; } 603 604 static bool HasStarCalcFunctionList(); 605 static ScFunctionList* GetStarCalcFunctionList(); 606 static ScFunctionMgr* GetStarCalcFunctionMgr(); 607 static void ResetFunctionList(); 608 609 static OUString GetErrorString(FormulaError nErrNumber); 610 static OUString GetLongErrorString(FormulaError nErrNumber); 611 static bool EETextObjEqual( const EditTextObject* pObj1, 612 const EditTextObject* pObj2 ); 613 static bool CheckWidthInvalidate( bool& bNumFormatChanged, 614 const SfxItemSet& rNewAttrs, 615 const SfxItemSet& rOldAttrs ); 616 static bool HasAttrChanged( const SfxItemSet& rNewAttrs, 617 const SfxItemSet& rOldAttrs, 618 const sal_uInt16 nWhich ); 619 620 static ScUnitConverter* GetUnitConverter(); 621 622 /// strchr() functionality on unicode, as long as we need it for FormulaToken etc. 623 static const sal_Unicode* UnicodeStrChr( const sal_Unicode* pStr, sal_Unicode c ); 624 625 static sal_Unicode ToUpperAlpha( sal_Unicode c ) 626 { return ( c >= 'a' && c <= 'z' ) ? ( c-'a'+'A' ) : c; } 627 628 /** Adds the string rToken to rTokenList, using a list separator character. 629 @param rTokenList The string list where the token will be appended to. 630 @param rToken The token string to append to the token list. 631 @param cSep The character to separate the tokens. 632 @param nSepCount Specifies how often cSep is inserted between two tokens. 633 @param bForceSep true = Always insert separator; false = Only, if not at begin or end. */ 634 SC_DLLPUBLIC static OUString addToken( 635 const OUString& rTokenList, const OUString& rToken, 636 sal_Unicode cSep, sal_Int32 nSepCount = 1, 637 bool bForceSep = false ); 638 639 /** Returns true, if the first and last character of the string is cQuote. */ 640 SC_DLLPUBLIC static bool IsQuoted( const OUString& rString, sal_Unicode cQuote ); 641 642 /** Inserts the character cQuote at beginning and end of rString. 643 @param bEscapeEmbedded If <TRUE/>, embedded quote characters are 644 escaped by doubling them. 645 */ 646 SC_DLLPUBLIC static void AddQuotes( OUString& rString, sal_Unicode cQuote, bool bEscapeEmbedded = true ); 647 648 /** Erases the character cQuote from rString, if it exists at beginning AND end. 649 @param bUnescapeEmbedded If <TRUE/>, embedded doubled quote characters 650 are unescaped by replacing them with a 651 single instance. 652 */ 653 SC_DLLPUBLIC static void EraseQuotes( OUString& rString, sal_Unicode cQuote, bool bUnescapeEmbedded = true ); 654 655 /** Finds an unquoted instance of cChar in rString, starting at 656 offset nStart. Unquoted instances may occur when concatenating two 657 quoted strings with a separator, for example, 's1':'s2'. Embedded 658 quotes have to be escaped by being doubled. Caller must ensure that 659 nStart points into an unquoted range or the opening quote. Specialty: 660 if cChar==cQuote the first cQuote character from nStart on is found. 661 @returns offset if found, else -1 662 */ 663 SC_DLLPUBLIC static sal_Int32 FindUnquoted( const OUString& rString, sal_Unicode cChar); 664 665 /** Finds an unquoted instance of cChar in null-terminated pString. Same 666 semantics as FindUnquoted( const String&, ...) 667 @returns: pointer to cChar if found, else NULL 668 */ 669 SC_DLLPUBLIC static const sal_Unicode* FindUnquoted( const sal_Unicode* pString, sal_Unicode cChar ); 670 671 static rtl_TextEncoding GetCharsetValue( const OUString& rCharSet ); 672 static OUString GetCharsetString( rtl_TextEncoding eVal ); 673 674 /// a "ReadOnly" formatter for UNO/XML export 675 static SvNumberFormatter* GetEnglishFormatter(); 676 677 static bool IsSystemRTL(); // depending on system language 678 static LanguageType GetEditDefaultLanguage(); // for EditEngine::SetDefaultLanguage 679 SC_DLLPUBLIC static SvtScriptType GetDefaultScriptType(); // for all WEAK characters 680 /** Map ATTR_((CJK|CTL)_)?FONT_... to proper WhichIDs. 681 If more than one SvtScriptType::... values are or'ed together, prefers 682 first COMPLEX, then ASIAN */ 683 SC_DLLPUBLIC static sal_uInt16 GetScriptedWhichID( SvtScriptType nScriptType, sal_uInt16 nWhich ); 684 685 /** Adds a language item to the item set, if the number format item contains 686 a language that differs from its parent's language. */ 687 SC_DLLPUBLIC static void AddLanguage( SfxItemSet& rSet, const SvNumberFormatter& rFormatter ); 688 689 /** Obtain the ordinal suffix for a number according to the system locale */ 690 static OUString GetOrdinalSuffix( sal_Int32 nNumber); 691 692 /** A static instance of ScFieldEditEngine not capable of resolving 693 document specific fields, to be used only by ScEditUtil::GetString(). */ 694 static ScFieldEditEngine& GetStaticFieldEditEngine(); 695 696 /** Replaces the first occurrence of rPlaceholder in rString with 697 rReplacement, or if rPlaceholder is not found appends one space if 698 rString does not end in a space and appends rReplacement. 699 700 Meant to be used with resource strings ala "Column %1" where a 701 translation may have omitted the %1 placeholder and a simple 702 replacement would end up with nothing replaced so no column indicator 703 in the result string. 704 */ 705 SC_DLLPUBLIC static OUString ReplaceOrAppend( const OUString& rString, 706 const OUString& rPlaceholder, 707 const OUString& rReplacement ); 708 709 710 /** Convert string content to numeric value. 711 712 In any case, if rError is set 0.0 is returned. 713 714 If nStringNoValueError is FormulaError::CellNoValue, that is unconditionally 715 assigned to rError and 0.0 is returned. The caller is expected to 716 handle this situation. Used by the interpreter. 717 718 Usually FormulaError::NoValue is passed as nStringNoValueError. 719 720 Otherwise, depending on the string conversion configuration different 721 approaches are taken: 722 723 724 For ScCalcConfig::StringConversion::ILLEGAL 725 The error value passed in nStringNoValueError is assigned to rError 726 (and 0.0 returned). 727 728 729 For ScCalcConfig::StringConversion::ZERO 730 A zero value is returned and no error assigned. 731 732 733 For ScCalcConfig::StringConversion::LOCALE 734 735 If the string is empty or consists only of spaces, if "treat empty 736 string as zero" is set 0.0 is returned, else nStringNoValueError 737 assigned to rError (and 0.0 returned). 738 739 Else a non-empty string is passed to the number formatter's scanner to 740 be parsed locale dependent. If that does not detect a numeric value 741 nStringNoValueError is assigned to rError (and 0.0 returned). 742 743 If no number formatter was passed, the conversion falls back to 744 UNAMBIGUOUS. 745 746 747 For ScCalcConfig::StringConversion::UNAMBIGUOUS 748 749 If the string is empty or consists only of spaces, if "treat empty 750 string as zero" is set 0.0 is returned, else nStringNoValueError 751 assigned to rError (and 0.0 returned). 752 753 If the string is not empty the following conversion rules are applied: 754 755 Converted are only integer numbers including exponent, and ISO 8601 dates 756 and times in their extended formats with separators. Anything else, 757 especially fractional numeric values with decimal separators or dates other 758 than ISO 8601 would be locale dependent and is a no-no. Leading and 759 trailing blanks are ignored. 760 761 The following ISO 8601 formats are converted: 762 763 CCYY-MM-DD 764 CCYY-MM-DDThh:mm 765 CCYY-MM-DDThh:mm:ss 766 CCYY-MM-DDThh:mm:ss,s 767 CCYY-MM-DDThh:mm:ss.s 768 hh:mm 769 hh:mm:ss 770 hh:mm:ss,s 771 hh:mm:ss.s 772 773 The century CC may not be omitted and the two-digit year setting is not 774 taken into account. Instead of the T date and time separator exactly one 775 blank may be used. 776 777 If a date is given, it must be a valid Gregorian calendar date. In this 778 case the optional time must be in the range 00:00 to 23:59:59.99999... 779 If only time is given, it may have any value for hours, taking elapsed time 780 into account; minutes and seconds are limited to the value 59 as well. 781 782 If the string can not be converted to a numeric value, the error value 783 passed in nStringNoValueError is assigned to rError. 784 785 786 @param rStr 787 The string to be converted. 788 789 @param rConfig 790 The calculation configuration. 791 792 @param rError 793 Contains the error on return, if any. If an error was set before 794 and the conversion did not result in an error, still 0.0 is 795 returned. 796 797 @param nStringNoValueError 798 The error value to be assigned to rError if string could not be 799 converted to number. 800 801 @param pFormatter 802 The number formatter to use in case of 803 ScCalcConfig::StringConversion::LOCALE. Can but should not be 804 nullptr in which case conversion falls back to 805 ScCalcConfig::StringConversion::UNAMBIGUOUS and if a date is 806 detected the null date is assumed to be the standard 1899-12-30 807 instead of the configured null date. 808 809 @param rCurFmtType 810 Can be assigned a format type in case a date or time or date+time 811 string was converted, e.g. SvNumFormatType::DATE or 812 SvNumFormatType::TIME or a combination thereof. 813 814 */ 815 static double ConvertStringToValue( const OUString& rStr, const ScCalcConfig& rConfig, 816 FormulaError & rError, FormulaError nStringNoValueError, 817 SvNumberFormatter* pFormatter, SvNumFormatType & rCurFmtType ); 818 819 /// Calc's threaded group calculation is in progress. 820 SC_DLLPUBLIC static bool bThreadedGroupCalcInProgress; 821 }; 822 823 // maybe move to dbdata.hxx (?): 824 825 enum ScQueryOp 826 { 827 SC_EQUAL, 828 SC_LESS, 829 SC_GREATER, 830 SC_LESS_EQUAL, 831 SC_GREATER_EQUAL, 832 SC_NOT_EQUAL, 833 SC_TOPVAL, 834 SC_BOTVAL, 835 SC_TOPPERC, 836 SC_BOTPERC, 837 SC_CONTAINS, 838 SC_DOES_NOT_CONTAIN, 839 SC_BEGINS_WITH, 840 SC_DOES_NOT_BEGIN_WITH, 841 SC_ENDS_WITH, 842 SC_DOES_NOT_END_WITH 843 }; 844 845 enum ScQueryConnect 846 { 847 SC_AND, 848 SC_OR 849 }; 850 851 enum ScSubTotalFunc 852 { 853 SUBTOTAL_FUNC_NONE = 0, 854 SUBTOTAL_FUNC_AVE = 1, 855 SUBTOTAL_FUNC_CNT = 2, 856 SUBTOTAL_FUNC_CNT2 = 3, 857 SUBTOTAL_FUNC_MAX = 4, 858 SUBTOTAL_FUNC_MIN = 5, 859 SUBTOTAL_FUNC_PROD = 6, 860 SUBTOTAL_FUNC_STD = 7, 861 SUBTOTAL_FUNC_STDP = 8, 862 SUBTOTAL_FUNC_SUM = 9, 863 SUBTOTAL_FUNC_VAR = 10, 864 SUBTOTAL_FUNC_VARP = 11, 865 SUBTOTAL_FUNC_MED = 12, 866 SUBTOTAL_FUNC_SELECTION_COUNT = 13 867 }; 868 869 enum ScAggregateFunc 870 { 871 AGGREGATE_FUNC_AVE = 1, 872 AGGREGATE_FUNC_CNT = 2, 873 AGGREGATE_FUNC_CNT2 = 3, 874 AGGREGATE_FUNC_MAX = 4, 875 AGGREGATE_FUNC_MIN = 5, 876 AGGREGATE_FUNC_PROD = 6, 877 AGGREGATE_FUNC_STD = 7, 878 AGGREGATE_FUNC_STDP = 8, 879 AGGREGATE_FUNC_SUM = 9, 880 AGGREGATE_FUNC_VAR = 10, 881 AGGREGATE_FUNC_VARP = 11, 882 AGGREGATE_FUNC_MEDIAN = 12, 883 AGGREGATE_FUNC_MODSNGL = 13, 884 AGGREGATE_FUNC_LARGE = 14, 885 AGGREGATE_FUNC_SMALL = 15, 886 AGGREGATE_FUNC_PERCINC = 16, 887 AGGREGATE_FUNC_QRTINC = 17, 888 AGGREGATE_FUNC_PERCEXC = 18, 889 AGGREGATE_FUNC_QRTEXC = 19 890 }; 891 892 class ScArea; 893 894 struct ScConsolidateParam 895 { 896 SCCOL nCol; // cursor position / 897 SCROW nRow; // or start of destination area respectively 898 SCTAB nTab; 899 ScSubTotalFunc eFunction; 900 sal_uInt16 nDataAreaCount; // number of data areas 901 std::unique_ptr<ScArea[]> pDataAreas; // array of pointers into data areas 902 bool bByCol; 903 bool bByRow; 904 bool bReferenceData; // reference source data 905 906 ScConsolidateParam(); 907 ScConsolidateParam( const ScConsolidateParam& r ); 908 ~ScConsolidateParam(); 909 910 ScConsolidateParam& operator= ( const ScConsolidateParam& r ); 911 bool operator== ( const ScConsolidateParam& r ) const; 912 void Clear (); // = ClearDataAreas()+Members 913 void ClearDataAreas (); 914 void SetAreas ( std::unique_ptr<ScArea[]> pAreas, sal_uInt16 nCount ); 915 }; 916 917 extern SfxViewShell* pScActiveViewShell; 918 extern sal_uInt16 nScClickMouseModifier; 919 extern sal_uInt16 nScFillModeMouseModifier; 920 921 #endif 922 923 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 924
