/************************************************************** * * 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 #include #include #include #include #include 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