| /************************************************************** |
| * |
| * 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 SC_DIF_HXX |
| #define SC_DIF_HXX |
| |
| #include <tools/debug.hxx> |
| #include <tools/list.hxx> |
| #include <tools/string.hxx> |
| #include "global.hxx" |
| #include "address.hxx" |
| |
| |
| class SvStream; |
| class SvNumberFormatter; |
| class ScDocument; |
| class ScPatternAttr; |
| |
| extern const sal_Unicode pKeyTABLE[]; |
| extern const sal_Unicode pKeyVECTORS[]; |
| extern const sal_Unicode pKeyTUPLES[]; |
| extern const sal_Unicode pKeyDATA[]; |
| extern const sal_Unicode pKeyBOT[]; |
| extern const sal_Unicode pKeyEOD[]; |
| extern const sal_Unicode pKeyTRUE[]; |
| extern const sal_Unicode pKeyFALSE[]; |
| extern const sal_Unicode pKeyNA[]; |
| extern const sal_Unicode pKeyV[]; |
| extern const sal_Unicode pKey1_0[]; |
| |
| |
| enum TOPIC |
| { |
| T_UNKNOWN, |
| T_TABLE, T_VECTORS, T_TUPLES, T_DATA, T_LABEL, T_COMMENT, T_SIZE, |
| T_PERIODICITY, T_MAJORSTART, T_MINORSTART, T_TRUELENGTH, T_UINITS, |
| T_DISPLAYUNITS, |
| T_END |
| }; |
| |
| enum DATASET { D_BOT, D_EOD, D_NUMERIC, D_STRING, D_UNKNOWN, D_SYNT_ERROR }; |
| |
| |
| class DifParser |
| { |
| public: |
| String aData; |
| double fVal; |
| sal_uInt32 nVector; |
| sal_uInt32 nVal; |
| sal_uInt32 nNumFormat; |
| CharSet eCharSet; |
| private: |
| SvNumberFormatter* pNumFormatter; |
| SvStream& rIn; |
| sal_Bool bPlain; |
| String aLookAheadLine; |
| |
| bool ReadNextLine( String& rStr ); |
| bool LookAhead(); |
| DATASET GetNumberDataset( const sal_Unicode* pPossibleNumericData ); |
| static inline sal_Bool IsBOT( const sal_Unicode* pRef ); |
| static inline sal_Bool IsEOD( const sal_Unicode* pRef ); |
| static inline sal_Bool Is1_0( const sal_Unicode* pRef ); |
| public: |
| DifParser( SvStream&, const sal_uInt32 nOption, ScDocument&, CharSet ); |
| |
| TOPIC GetNextTopic( void ); |
| |
| DATASET GetNextDataset( void ); |
| |
| const sal_Unicode* ScanIntVal( const sal_Unicode* pStart, sal_uInt32& rRet ); |
| sal_Bool ScanFloatVal( const sal_Unicode* pStart ); |
| |
| inline sal_Bool IsNumber( const sal_Unicode cChar ); |
| inline sal_Bool IsNumberEnding( const sal_Unicode cChar ); |
| |
| static inline sal_Bool IsV( const sal_Unicode* pRef ); |
| |
| inline sal_Bool IsPlain( void ) const; |
| }; |
| |
| |
| inline sal_Bool DifParser::IsBOT( const sal_Unicode* pRef ) |
| { |
| return ( pRef[ 0 ] == pKeyBOT[0] && |
| pRef[ 1 ] == pKeyBOT[1] && |
| pRef[ 2 ] == pKeyBOT[2] && |
| pRef[ 3 ] == pKeyBOT[3] ); |
| } |
| |
| |
| inline sal_Bool DifParser::IsEOD( const sal_Unicode* pRef ) |
| { |
| return ( pRef[ 0 ] == pKeyEOD[0] && |
| pRef[ 1 ] == pKeyEOD[1] && |
| pRef[ 2 ] == pKeyEOD[2] && |
| pRef[ 3 ] == pKeyEOD[3] ); |
| } |
| |
| |
| inline sal_Bool DifParser::Is1_0( const sal_Unicode* pRef ) |
| { |
| return ( pRef[ 0 ] == pKey1_0[0] && |
| pRef[ 1 ] == pKey1_0[1] && |
| pRef[ 2 ] == pKey1_0[2] && |
| pRef[ 3 ] == pKey1_0[3] ); |
| } |
| |
| |
| inline sal_Bool DifParser::IsV( const sal_Unicode* pRef ) |
| { |
| return ( pRef[ 0 ] == pKeyV[0] && |
| pRef[ 1 ] == pKeyV[1] ); |
| } |
| |
| |
| inline sal_Bool DifParser::IsNumber( const sal_Unicode cChar ) |
| { |
| return ( cChar >= '0' && cChar <= '9' ); |
| } |
| |
| |
| inline sal_Bool DifParser::IsNumberEnding( const sal_Unicode cChar ) |
| { |
| return ( cChar == 0x00 ); |
| } |
| |
| |
| inline sal_Bool DifParser::IsPlain( void ) const |
| { |
| return bPlain; |
| } |
| |
| |
| |
| |
| class DifAttrCache; |
| class ScPatternAttr; |
| |
| |
| class DifColumn : private List |
| { |
| private: |
| friend class DifAttrCache; |
| struct ENTRY |
| { |
| sal_uInt32 nNumFormat; |
| |
| SCROW nStart; |
| SCROW nEnd; |
| }; |
| |
| ENTRY* pAkt; |
| |
| inline DifColumn( void ); |
| ~DifColumn(); |
| void SetLogical( SCROW nRow ); |
| void SetNumFormat( SCROW nRow, const sal_uInt32 nNumFormat ); |
| void NewEntry( const SCROW nPos, const sal_uInt32 nNumFormat ); |
| void Apply( ScDocument&, const SCCOL nCol, const SCTAB nTab, const ScPatternAttr& ); |
| void Apply( ScDocument &rDoc, const SCCOL nCol, const SCTAB nTab ); |
| public: // geht niemanden etwas an... |
| }; |
| |
| |
| inline DifColumn::DifColumn( void ) |
| { |
| pAkt = NULL; |
| } |
| |
| |
| |
| |
| class DifAttrCache |
| { |
| private: |
| DifColumn** ppCols; |
| sal_Bool bPlain; |
| public: |
| DifAttrCache( const sal_Bool bPlain ); |
| ~DifAttrCache(); |
| inline void SetLogical( const SCCOL nCol, const SCROW nRow ); |
| void SetNumFormat( const SCCOL nCol, const SCROW nRow, const sal_uInt32 nNumFormat ); |
| void Apply( ScDocument&, SCTAB nTab ); |
| }; |
| |
| |
| inline void DifAttrCache::SetLogical( const SCCOL nCol, const SCROW nRow ) |
| { |
| DBG_ASSERT( ValidCol(nCol), "-DifAttrCache::SetLogical(): Col zu gross!" ); |
| DBG_ASSERT( bPlain, "*DifAttrCache::SetLogical(): muss Plain sein!" ); |
| |
| if( !ppCols[ nCol ] ) |
| ppCols[ nCol ] = new DifColumn; |
| ppCols[ nCol ]->SetLogical( nRow ); |
| } |
| |
| |
| #endif |
| |
| |