| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| #ifndef _ZFORSCAN_HXX |
| #define _ZFORSCAN_HXX |
| |
| #include <tools/string.hxx> |
| #include <tools/date.hxx> |
| #include <i18npool/lang.h> |
| #include <tools/color.hxx> |
| #include <svl/nfkeytab.hxx> |
| #include <svl/nfsymbol.hxx> |
| |
| class SvNumberFormatter; |
| struct ImpSvNumberformatInfo; |
| |
| |
| const size_t NF_MAX_FORMAT_SYMBOLS = 100; |
| const size_t NF_MAX_DEFAULT_COLORS = 10; |
| |
| // Hack: nThousand==1000 => "Default" occurs in format string |
| const sal_uInt16 FLAG_STANDARD_IN_FORMAT = 1000; |
| |
| class ImpSvNumberformatScan |
| { |
| public: |
| |
| ImpSvNumberformatScan( SvNumberFormatter* pFormatter ); |
| ~ImpSvNumberformatScan(); |
| void ChangeIntl(); // tauscht Keywords aus |
| |
| void ChangeNullDate(sal_uInt16 nDay, sal_uInt16 nMonth, sal_uInt16 nYear); |
| // tauscht Referenzdatum aus |
| void ChangeStandardPrec(sal_uInt16 nPrec); // tauscht Standardprecision aus |
| |
| xub_StrLen ScanFormat( String& rString, String& rComment ); // Aufruf der Scan-Analyse |
| |
| void CopyInfo(ImpSvNumberformatInfo* pInfo, |
| sal_uInt16 nAnz); // Kopiert die FormatInfo |
| sal_uInt16 GetAnzResStrings() const { return nAnzResStrings; } |
| |
| const CharClass& GetChrCls() const { return *pFormatter->GetCharClass(); } |
| const LocaleDataWrapper& GetLoc() const { return *pFormatter->GetLocaleData(); } |
| CalendarWrapper& GetCal() const { return *pFormatter->GetCalendar(); } |
| |
| const NfKeywordTable & GetKeywords() const |
| { |
| if ( bKeywordsNeedInit ) |
| InitKeywords(); |
| return sKeyword; |
| } |
| // Keywords used in output like sal_True and sal_False |
| const String& GetSpecialKeyword( NfKeywordIndex eIdx ) const |
| { |
| if ( !sKeyword[eIdx].Len() ) |
| InitSpecialKeyword( eIdx ); |
| return sKeyword[eIdx]; |
| } |
| const String& GetTrueString() const { return GetSpecialKeyword( NF_KEY_TRUE ); } |
| const String& GetFalseString() const { return GetSpecialKeyword( NF_KEY_FALSE ); } |
| const String& GetColorString() const { return GetKeywords()[NF_KEY_COLOR]; } |
| const String& GetRedString() const { return GetKeywords()[NF_KEY_RED]; } |
| const String& GetBooleanString() const { return GetKeywords()[NF_KEY_BOOLEAN]; } |
| const String& GetErrorString() const { return sErrStr; } |
| |
| Date* GetNullDate() const { return pNullDate; } |
| const String& GetStandardName() const |
| { |
| if ( bKeywordsNeedInit ) |
| InitKeywords(); |
| return sNameStandardFormat; |
| } |
| sal_uInt16 GetStandardPrec() const { return nStandardPrec; } |
| const Color& GetRedColor() const { return StandardColor[4]; } |
| Color* GetColor(String& sStr); // Setzt Hauptfarben oder |
| // definierte Farben |
| |
| // the compatibility currency symbol for old automatic currency formats |
| const String& GetCurSymbol() const |
| { |
| if ( bCompatCurNeedInit ) |
| InitCompatCur(); |
| return sCurSymbol; |
| } |
| |
| // the compatibility currency abbreviation for CCC format code |
| const String& GetCurAbbrev() const |
| { |
| if ( bCompatCurNeedInit ) |
| InitCompatCur(); |
| return sCurAbbrev; |
| } |
| |
| // the compatibility currency symbol upper case for old automatic currency formats |
| const String& GetCurString() const |
| { |
| if ( bCompatCurNeedInit ) |
| InitCompatCur(); |
| return sCurString; |
| } |
| |
| void SetConvertMode(LanguageType eTmpLge, LanguageType eNewLge, |
| sal_Bool bSystemToSystem = sal_False ) |
| { |
| bConvertMode = sal_True; |
| eNewLnge = eNewLge; |
| eTmpLnge = eTmpLge; |
| bConvertSystemToSystem = bSystemToSystem; |
| } |
| void SetConvertMode(sal_Bool bMode) { bConvertMode = bMode; } |
| // Veraendert nur die Bool-Variable |
| // (zum temporaeren Unterbrechen des |
| // Convert-Modus) |
| sal_Bool GetConvertMode() const { return bConvertMode; } |
| LanguageType GetNewLnge() const { return eNewLnge; } |
| // Lesezugriff auf ConvertMode |
| // und Konvertierungsland/Spr. |
| LanguageType GetTmpLnge() const { return eTmpLnge; } |
| // Lesezugriff auf |
| // und Ausgangsland/Spr. |
| |
| /// get Thai T speciality |
| sal_uInt8 GetNatNumModifier() const { return nNatNumModifier; } |
| /// set Thai T speciality |
| void SetNatNumModifier( sal_uInt8 n ) { nNatNumModifier = n; } |
| |
| SvNumberFormatter* GetNumberformatter() { return pFormatter; } |
| // Zugriff auf Formatierer |
| // (fuer zformat.cxx) |
| |
| |
| private: // ---- privater Teil |
| NfKeywordTable sKeyword; // Schluesselworte der Syntax |
| Color StandardColor[NF_MAX_DEFAULT_COLORS]; |
| // Array der Standardfarben |
| Date* pNullDate; // 30Dec1899 |
| String sNameStandardFormat; // "Standard" |
| sal_uInt16 nStandardPrec; // default Precision for Standardformat |
| SvNumberFormatter* pFormatter; // Pointer auf die Formatliste |
| |
| String sStrArray[NF_MAX_FORMAT_SYMBOLS]; // Array der Symbole |
| short nTypeArray[NF_MAX_FORMAT_SYMBOLS]; // Array der Infos |
| // externe Infos: |
| sal_uInt16 nAnzResStrings; // Anzahl der Ergebnissymbole |
| #if !(defined SOLARIS && defined X86) |
| short eScannedType; // Typ gemaess Scan |
| #else |
| int eScannedType; // wg. Optimierung |
| #endif |
| sal_Bool bThousand; // Mit Tausenderpunkt |
| sal_uInt16 nThousand; // Zaehlt ....-Folgen |
| sal_uInt16 nCntPre; // Zaehlt Vorkommastellen |
| sal_uInt16 nCntPost; // Zaehlt Nachkommastellen |
| sal_uInt16 nCntExp; // Zaehlt Exp.Stellen, AM/PM |
| // interne Infos: |
| sal_uInt16 nAnzStrings; // Anzahl der Symbole |
| sal_uInt16 nRepPos; // Position eines '*' |
| sal_uInt16 nExpPos; // interne Position des E |
| sal_uInt16 nBlankPos; // interne Position des Blank |
| short nDecPos; // interne Pos. des , |
| sal_Bool bExp; // wird bei Lesen des E gesetzt |
| sal_Bool bFrac; // wird bei Lesen des / gesetzt |
| sal_Bool bBlank; // wird bei ' '(Fraction) ges. |
| sal_Bool bDecSep; // Wird beim ersten , gesetzt |
| mutable sal_Bool bKeywordsNeedInit; // Locale dependent keywords need to be initialized |
| mutable sal_Bool bCompatCurNeedInit; // Locale dependent compatibility currency need to be initialized |
| String sCurSymbol; // Currency symbol for compatibility format codes |
| String sCurString; // Currency symbol in upper case |
| String sCurAbbrev; // Currency abbreviation |
| String sErrStr; // String fuer Fehlerausgaben |
| |
| sal_Bool bConvertMode; // Wird im Convert-Mode gesetzt |
| // Land/Sprache, in die der |
| LanguageType eNewLnge; // gescannte String konvertiert |
| // wird (fuer Excel Filter) |
| // Land/Sprache, aus der der |
| LanguageType eTmpLnge; // gescannte String konvertiert |
| // wird (fuer Excel Filter) |
| sal_Bool bConvertSystemToSystem; // Whether the conversion is |
| // from one system locale to |
| // another system locale (in |
| // this case the automatic |
| // currency symbol is converted |
| // too). |
| |
| xub_StrLen nCurrPos; // Position des Waehrungssymbols |
| |
| sal_uInt8 nNatNumModifier; // Thai T speciality |
| |
| void InitKeywords() const; |
| void InitSpecialKeyword( NfKeywordIndex eIdx ) const; |
| void InitCompatCur() const; |
| |
| #ifdef _ZFORSCAN_CXX // ----- private Methoden ----- |
| void SetDependentKeywords(); |
| // Setzt die Sprachabh. Keyw. |
| void SkipStrings(sal_uInt16& i,xub_StrLen& nPos);// Ueberspringt StringSymbole |
| sal_uInt16 PreviousKeyword(sal_uInt16 i); // Gibt Index des vorangeh. |
| // Schluesselworts oder 0 |
| sal_uInt16 NextKeyword(sal_uInt16 i); // Gibt Index des naechsten |
| // Schluesselworts oder 0 |
| sal_Unicode PreviousChar(sal_uInt16 i); // Gibt letzten Buchstaben |
| // vor der Position, |
| // skipt EMPTY, STRING, STAR, BLANK |
| sal_Unicode NextChar(sal_uInt16 i); // Gibt ersten Buchst. danach |
| short PreviousType( sal_uInt16 i ); // Gibt Typ vor Position, |
| // skipt EMPTY |
| sal_Bool IsLastBlankBeforeFrac(sal_uInt16 i); // True <=> es kommt kein ' ' |
| // mehr bis zum '/' |
| void Reset(); // Reset aller Variablen |
| // vor Analysestart |
| short GetKeyWord( const String& sSymbol, // determine keyword at nPos |
| xub_StrLen nPos ); // return 0 <=> not found |
| |
| inline sal_Bool IsAmbiguousE( short nKey ) // whether nKey is ambiguous E of NF_KEY_E/NF_KEY_EC |
| { |
| return (nKey == NF_KEY_EC || nKey == NF_KEY_E) && |
| (GetKeywords()[NF_KEY_EC] == GetKeywords()[NF_KEY_E]); |
| } |
| |
| // if 0 at strArray[i] is of S,00 or SS,00 or SS"any"00 in ScanType() or FinalScan() |
| sal_Bool Is100SecZero( sal_uInt16 i, sal_Bool bHadDecSep ); |
| |
| short Next_Symbol(const String& rStr, |
| xub_StrLen& nPos, |
| String& sSymbol); // Naechstes Symbol |
| xub_StrLen Symbol_Division(const String& rString);// lexikalische Voranalyse |
| xub_StrLen ScanType(const String& rString); // Analyse des Formattyps |
| xub_StrLen FinalScan( String& rString, String& rComment ); // Endanalyse mit Vorgabe |
| // des Typs |
| // -1:= error, return nPos in FinalScan; 0:= no calendar, 1:= calendar found |
| int FinalScanGetCalendar( xub_StrLen& nPos, sal_uInt16& i, sal_uInt16& nAnzResStrings ); |
| |
| /** Insert symbol into nTypeArray and sStrArray, e.g. grouping separator. |
| If at nPos-1 a symbol type NF_SYMBOLTYPE_EMPTY is present, that is |
| reused instead of shifting all one up and nPos is decremented! */ |
| bool InsertSymbol( sal_uInt16 & nPos, svt::NfSymbolType eType, const String& rStr ); |
| |
| static inline sal_Bool StringEqualsChar( const String& rStr, sal_Unicode ch ) |
| { return rStr.GetChar(0) == ch && rStr.Len() == 1; } |
| // Yes, for efficiency get the character first and then compare length |
| // because in most places where this is used the string is one char. |
| |
| // remove "..." and \... quotes from rStr, return how many chars removed |
| static xub_StrLen RemoveQuotes( String& rStr ); |
| |
| #endif //_ZFORSCAN_CXX |
| }; |
| |
| |
| |
| #endif // _ZFORSCAN_HXX |