1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: zforscan.hxx,v $
10 * $Revision: 1.24.136.1 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
33 #include <tools/string.hxx>
34 #include <tools/date.hxx>
35 #include <i18npool/lang.h>
36 #include <tools/color.hxx>
37 #include <svtools/nfkeytab.hxx>
38 #include "nfsymbol.hxx"
40 class SvNumberFormatter
;
41 struct ImpSvNumberformatInfo
;
44 const size_t NF_MAX_FORMAT_SYMBOLS
= 100;
45 const size_t NF_MAX_DEFAULT_COLORS
= 10;
47 // Hack: nThousand==1000 => "Default" occurs in format string
48 const USHORT FLAG_STANDARD_IN_FORMAT
= 1000;
50 class ImpSvNumberformatScan
54 ImpSvNumberformatScan( SvNumberFormatter
* pFormatter
);
55 ~ImpSvNumberformatScan();
56 void ChangeIntl(); // tauscht Keywords aus
58 void ChangeNullDate(USHORT nDay
, USHORT nMonth
, USHORT nYear
);
59 // tauscht Referenzdatum aus
60 void ChangeStandardPrec(short nPrec
); // tauscht Standardprecision aus
62 xub_StrLen
ScanFormat( String
& rString
, String
& rComment
); // Aufruf der Scan-Analyse
64 void CopyInfo(ImpSvNumberformatInfo
* pInfo
,
65 USHORT nAnz
); // Kopiert die FormatInfo
66 USHORT
GetAnzResStrings() const { return nAnzResStrings
; }
68 const CharClass
& GetChrCls() const { return *pFormatter
->GetCharClass(); }
69 const LocaleDataWrapper
& GetLoc() const { return *pFormatter
->GetLocaleData(); }
70 CalendarWrapper
& GetCal() const { return *pFormatter
->GetCalendar(); }
72 const String
* GetKeywords() const
74 if ( bKeywordsNeedInit
)
78 // Keywords used in output like TRUE and FALSE
79 const String
& GetSpecialKeyword( NfKeywordIndex eIdx
) const
81 if ( !sKeyword
[eIdx
].Len() )
82 InitSpecialKeyword( eIdx
);
83 return sKeyword
[eIdx
];
85 const String
& GetTrueString() const { return GetSpecialKeyword( NF_KEY_TRUE
); }
86 const String
& GetFalseString() const { return GetSpecialKeyword( NF_KEY_FALSE
); }
87 const String
& GetColorString() const { return GetKeywords()[NF_KEY_COLOR
]; }
88 const String
& GetRedString() const { return GetKeywords()[NF_KEY_RED
]; }
89 const String
& GetBooleanString() const { return GetKeywords()[NF_KEY_BOOLEAN
]; }
90 const String
& GetErrorString() const { return sErrStr
; }
92 Date
* GetNullDate() const { return pNullDate
; }
93 const String
& GetStandardName() const
95 if ( bKeywordsNeedInit
)
97 return sNameStandardFormat
;
99 short GetStandardPrec() const { return nStandardPrec
; }
100 const Color
& GetRedColor() const { return StandardColor
[4]; }
101 Color
* GetColor(String
& sStr
); // Setzt Hauptfarben oder
104 // the compatibility currency symbol for old automatic currency formats
105 const String
& GetCurSymbol() const
107 if ( bCompatCurNeedInit
)
112 // the compatibility currency abbreviation for CCC format code
113 const String
& GetCurAbbrev() const
115 if ( bCompatCurNeedInit
)
120 // the compatibility currency symbol upper case for old automatic currency formats
121 const String
& GetCurString() const
123 if ( bCompatCurNeedInit
)
128 void SetConvertMode(LanguageType eTmpLge
, LanguageType eNewLge
,
129 BOOL bSystemToSystem
= FALSE
)
134 bConvertSystemToSystem
= bSystemToSystem
;
136 void SetConvertMode(BOOL bMode
) { bConvertMode
= bMode
; }
137 // Veraendert nur die Bool-Variable
138 // (zum temporaeren Unterbrechen des
140 BOOL
GetConvertMode() const { return bConvertMode
; }
141 LanguageType
GetNewLnge() const { return eNewLnge
; }
142 // Lesezugriff auf ConvertMode
143 // und Konvertierungsland/Spr.
144 LanguageType
GetTmpLnge() const { return eTmpLnge
; }
146 // und Ausgangsland/Spr.
148 /// get Thai T speciality
149 BYTE
GetNatNumModifier() const { return nNatNumModifier
; }
150 /// set Thai T speciality
151 void SetNatNumModifier( BYTE n
) { nNatNumModifier
= n
; }
153 SvNumberFormatter
* GetNumberformatter() { return pFormatter
; }
154 // Zugriff auf Formatierer
155 // (fuer zformat.cxx)
158 private: // ---- privater Teil
159 NfKeywordTable sKeyword
; // Schluesselworte der Syntax
160 Color StandardColor
[NF_MAX_DEFAULT_COLORS
];
161 // Array der Standardfarben
162 Date
* pNullDate
; // 30Dec1899
163 String sNameStandardFormat
; // "Standard"
164 short nStandardPrec
; // default Precision fuer Standardformat (2)
165 SvNumberFormatter
* pFormatter
; // Pointer auf die Formatliste
167 String sStrArray
[NF_MAX_FORMAT_SYMBOLS
]; // Array der Symbole
168 short nTypeArray
[NF_MAX_FORMAT_SYMBOLS
]; // Array der Infos
170 USHORT nAnzResStrings
; // Anzahl der Ergebnissymbole
171 #if !(defined SOLARIS && defined X86)
172 short eScannedType
; // Typ gemaess Scan
174 int eScannedType
; // wg. Optimierung
176 BOOL bThousand
; // Mit Tausenderpunkt
177 USHORT nThousand
; // Zaehlt ....-Folgen
178 USHORT nCntPre
; // Zaehlt Vorkommastellen
179 USHORT nCntPost
; // Zaehlt Nachkommastellen
180 USHORT nCntExp
; // Zaehlt Exp.Stellen, AM/PM
182 USHORT nAnzStrings
; // Anzahl der Symbole
183 USHORT nRepPos
; // Position eines '*'
184 USHORT nExpPos
; // interne Position des E
185 USHORT nBlankPos
; // interne Position des Blank
186 short nDecPos
; // interne Pos. des ,
187 BOOL bExp
; // wird bei Lesen des E gesetzt
188 BOOL bFrac
; // wird bei Lesen des / gesetzt
189 BOOL bBlank
; // wird bei ' '(Fraction) ges.
190 BOOL bDecSep
; // Wird beim ersten , gesetzt
191 mutable BOOL bKeywordsNeedInit
; // Locale dependent keywords need to be initialized
192 mutable BOOL bCompatCurNeedInit
; // Locale dependent compatibility currency need to be initialized
193 String sCurSymbol
; // Currency symbol for compatibility format codes
194 String sCurString
; // Currency symbol in upper case
195 String sCurAbbrev
; // Currency abbreviation
196 String sErrStr
; // String fuer Fehlerausgaben
198 BOOL bConvertMode
; // Wird im Convert-Mode gesetzt
199 // Land/Sprache, in die der
200 LanguageType eNewLnge
; // gescannte String konvertiert
201 // wird (fuer Excel Filter)
202 // Land/Sprache, aus der der
203 LanguageType eTmpLnge
; // gescannte String konvertiert
204 // wird (fuer Excel Filter)
205 BOOL bConvertSystemToSystem
; // Whether the conversion is
206 // from one system locale to
207 // another system locale (in
208 // this case the automatic
209 // currency symbol is converted
212 xub_StrLen nCurrPos
; // Position des Waehrungssymbols
214 BYTE nNatNumModifier
; // Thai T speciality
216 void InitKeywords() const;
217 void InitSpecialKeyword( NfKeywordIndex eIdx
) const;
218 void InitCompatCur() const;
220 #ifdef _ZFORSCAN_CXX // ----- private Methoden -----
221 void SetDependentKeywords();
222 // Setzt die Sprachabh. Keyw.
223 void SkipStrings(USHORT
& i
,xub_StrLen
& nPos
);// Ueberspringt StringSymbole
224 USHORT
PreviousKeyword(USHORT i
); // Gibt Index des vorangeh.
225 // Schluesselworts oder 0
226 USHORT
NextKeyword(USHORT i
); // Gibt Index des naechsten
227 // Schluesselworts oder 0
228 sal_Unicode
PreviousChar(USHORT i
); // Gibt letzten Buchstaben
230 // skipt EMPTY, STRING, STAR, BLANK
231 sal_Unicode
NextChar(USHORT i
); // Gibt ersten Buchst. danach
232 short PreviousType( USHORT i
); // Gibt Typ vor Position,
234 BOOL
IsLastBlankBeforeFrac(USHORT i
); // True <=> es kommt kein ' '
236 void Reset(); // Reset aller Variablen
238 short GetKeyWord( const String
& sSymbol
, // determine keyword at nPos
239 xub_StrLen nPos
); // return 0 <=> not found
241 inline BOOL
IsAmbiguousE( short nKey
) // whether nKey is ambiguous E of NF_KEY_E/NF_KEY_EC
243 return (nKey
== NF_KEY_EC
|| nKey
== NF_KEY_E
) &&
244 (GetKeywords()[NF_KEY_EC
] == GetKeywords()[NF_KEY_E
]);
247 // if 0 at strArray[i] is of S,00 or SS,00 or SS"any"00 in ScanType() or FinalScan()
248 BOOL
Is100SecZero( USHORT i
, BOOL bHadDecSep
);
250 short Next_Symbol(const String
& rStr
,
252 String
& sSymbol
); // Naechstes Symbol
253 xub_StrLen
Symbol_Division(const String
& rString
);// lexikalische Voranalyse
254 xub_StrLen
ScanType(const String
& rString
); // Analyse des Formattyps
255 xub_StrLen
FinalScan( String
& rString
, String
& rComment
); // Endanalyse mit Vorgabe
257 // -1:= error, return nPos in FinalScan; 0:= no calendar, 1:= calendar found
258 int FinalScanGetCalendar( xub_StrLen
& nPos
, USHORT
& i
, USHORT
& nAnzResStrings
);
260 /** Insert symbol into nTypeArray and sStrArray, e.g. grouping separator.
261 If at nPos-1 a symbol type NF_SYMBOLTYPE_EMPTY is present, that is
262 reused instead of shifting all one up and nPos is decremented! */
263 bool InsertSymbol( USHORT
& nPos
, svt::NfSymbolType eType
, const String
& rStr
);
265 static inline BOOL
StringEqualsChar( const String
& rStr
, sal_Unicode ch
)
266 { return rStr
.GetChar(0) == ch
&& rStr
.Len() == 1; }
267 // Yes, for efficiency get the character first and then compare length
268 // because in most places where this is used the string is one char.
270 // remove "..." and \... quotes from rStr, return how many chars removed
271 static xub_StrLen
RemoveQuotes( String
& rStr
);
273 #endif //_ZFORSCAN_CXX
278 #endif // _ZFORSCAN_HXX