//--------------------------------------------------------------------------- // Parser.h - parses a "themes.ini" file and builds the ThemeInfo entries //--------------------------------------------------------------------------- #pragma once //--------------------------------------------------------------------------- #include "Scanner.h" #include "Utils.h" #include "CFile.h" #include "SimpStr.h" //--------------------------------------------------------------------------- // TMT_XXX ranges: // 1 - 49 SpecialPropVals (see below) // 50 - 60 Primitive Properties // 61 - xx enum definitions & regular Properties //--------------------------------------------------------------------------- enum SpecialPropVals // strings not needed for these { TMT_THEMEMETRICS = 1, // THEMEMETRICS struct in shared data TMT_DIBDATA, // bitmap file converted to DIB data TMT_DIBDATA1, // bitmap file converted to DIB data TMT_DIBDATA2, // bitmap file converted to DIB data TMT_DIBDATA3, // bitmap file converted to DIB data TMT_DIBDATA4, // bitmap file converted to DIB data TMT_DIBDATA5, // bitmap file converted to DIB data TMT_GLYPHDIBDATA, // NTL pcode generated from NTL source file TMT_NTLDATA, // NTL pcode generated from NTL source file TMT_PARTJUMPTABLE, // seen if more than 1 part defined for class TMT_STATEJUMPTABLE, // seen if more than 1 state defined for part TMT_JUMPTOPARENT, // seen at end of every section (index=-1 means stop) // THE FOLLOWING THREE PROPERTIES ARE PERSISTED; FOR BACKWARD COMPAT, // DO NOT UPSET THEIR VALUES! TMT_ENUMDEF, // enum definition (not yet a property) TMT_ENUMVAL, // enum value definition TMT_ENUM, // enum property TMT_DRAWOBJ, // packed struct (CBorderFill and CImageFile objs) TMT_TEXTOBJ, // packed struct (CTextObj) TMT_RGNLIST, // state jump table to access custom region data entries TMT_RGNDATA, // custom region data for an imagefile/state TMT_ENDOFCLASS, // end of data for a class section TMT_STOCKDIBDATA, TMT_UNKNOWN, }; //--------------------------------------------------------------------------- #define HUE_SUBCNT 5 #define COLOR_SUBCNT 5 //--------------------------------------------------------------------------- #define MAX_PROPERTY_VALUE 1024 //--------------------------------------------------------------------------- #define ENUM_SECTION_NAME L"enums" #define TYPE_SECTION_NAME L"types" #define INI_MACRO_SYMBOL L'#' #define SUBST_TABLE_INCLUDE L"Include" #define GLOBALS_SECTION_NAME L"globals" #define SYSMETRICS_SECTION_NAME L"SysMetrics" #define MYAPP_NAME L"ThemeSel" #define OUTFILE_NAME L"tmdefs.h" #define PREDEFINES_NAME L"themes.inc" //--------------------------------------------------------------------------- typedef BYTE PRIMVAL; // first 10 TMT_XXX defines //--------------------------------------------------------------------------- class IParserCallBack // Parser Caller must implement { public: virtual HRESULT AddIndex(LPCWSTR pszAppName, LPCWSTR pszClassName, int iPartNum, int iStateNum, int iIndex, int iLen) = 0; virtual HRESULT AddData(SHORT sTypeNum, PRIMVAL ePrimVal, const void *pData, DWORD dwLen) = 0; virtual int GetNextDataIndex() = 0; }; //--------------------------------------------------------------------------- struct ENUMVAL { CWideString csName; int iValue; int iSymbolIndex; }; //--------------------------------------------------------------------------- struct SYMBOL { CWideString csName; SHORT sTypeNum; // the property number of this property PRIMVAL ePrimVal; // all enums = ENUM_PRIMNUM }; //--------------------------------------------------------------------------- // Stock objects data //--------------------------------------------------------------------------- struct TMBITMAPHEADER // Stock bitmap info, can be followed with a BITMAPINFOHEADER struct { DWORD dwSize; // Size of the structure BOOL fFlipped; // TRUE if the bitmap is flipped (stock or not) HBITMAP hBitmap; // Stock bitmap handle, if NULL then a BITMAPINFOHEADER follows DWORD dwColorDepth; // Bitmap color depth BOOL fTrueAlpha; // TRUE if the bitmap has a non-empty alpha chanel }; // Pointer to the BITMAPINFOHEADER following the structure #define BITMAPDATA(p) (reinterpret_cast((BYTE*) p + p->dwSize)) // Size in bytes preceding the BITMAPINFOHEADER data #define TMBITMAPSIZE (sizeof(TMBITMAPHEADER)) //--------------------------------------------------------------------------- class CThemeParser { public: CThemeParser(BOOL fGlobalTheme = FALSE); HRESULT ParseThemeFile(LPCWSTR pszFileName, LPCWSTR pszColorParam, IParserCallBack *pCallBack, THEMEENUMPROC pNameCallBack=NULL, LPARAM lFnParam=NULL, DWORD dwParseFlags=0); HRESULT ParseThemeBuffer(LPCWSTR pszBuffer, LPCWSTR pszFileName, LPCWSTR pszColorParam, HINSTANCE hInstThemeDll, IParserCallBack *pCallBack, THEMEENUMPROC pNameCallBack=NULL, LPARAM lFnParam=NULL, DWORD dwParseFlags=0, LPCWSTR pszDocProperty=NULL, OUT LPWSTR pszResult=NULL, DWORD dwMaxResultChars=0); HRESULT GetPropertyNum(LPCWSTR pszName, int *piPropNum); void CleanupStockBitmaps(); protected: //---- helpers ---- HRESULT SourceError(int iMsgResId, LPCWSTR pszParam1=NULL, LPCWSTR pszParam2=NULL); HRESULT ParseDocSection(); HRESULT ParseClassSection(LPCWSTR pszFirstName); HRESULT InitializeSymbols(); HRESULT AddSymbol(LPCWSTR pszName, SHORT sTypeNum, PRIMVAL ePrimVal); HRESULT ParseClassSectionName(LPCWSTR pszFirstName, LPWSTR szAppSym, ULONG cchAppSym); HRESULT ValidateEnumSymbol(LPCWSTR pszName, int iSymType, int *pIndex=NULL); HRESULT ParseClassLine(int *piSymType=NULL, int *piValue=NULL, LPWSTR pszBuff=NULL, DWORD dwMaxBuffChars=0); int GetSymbolIndex(LPCWSTR pszName); HRESULT ParseThemeScanner(IParserCallBack *pCallBack, THEMEENUMPROC pNameCallBack, LPARAM lFnParam, DWORD dwParseFlags); HRESULT ParseColorSchemeSection(); COLORREF ApplyColorSubstitution(COLORREF crOld); HRESULT ParseSizeSection(); HRESULT ParseFileSection(); HRESULT ParseSubstSection(); HRESULT PackageImageData(LPCWSTR szFileNameR, LPCWSTR szFileNameG, LPCWSTR szFileNameB, int iDibPropNum); HRESULT LoadResourceProperties(); void EmptyResourceProperties(); HRESULT GetResourceProperty(LPCWSTR pszPropName, LPWSTR pszValueBuff, int cchMaxValueChars); //---- primitive value parsers ---- HRESULT ParseEnumValue(int iSymType); HRESULT ParseStringValue(int iSymType, LPWSTR pszBuff=NULL, DWORD dwMaxBuffChars=0); HRESULT ParseIntValue(int iSymType, int *piValue=NULL); HRESULT ParseBoolValue(int iSymType, LPCWSTR pszPropertyName); HRESULT ParseColorValue(int iSymType, COLORREF *pcrValue=NULL, COLORREF *pcrValue2=NULL); HRESULT ParseMarginsValue(int iSymType); HRESULT ParseIntListValue(int iSymType); HRESULT ParseFileNameValue(int iSymType, LPWSTR pszBuff=NULL, DWORD dwMaxBuffChars=0); HRESULT ParseSizeValue(int iSymType); HRESULT ParsePositionValue(int iSymType); HRESULT ParseRectValue(int iSymType, LPCWSTR pszPropertyName); HRESULT ParseFontValue(int iSymType, LPCWSTR pszPropertyName); HRESULT AddThemeData(int iTypeNum, PRIMVAL ePrimVal, const void *pData, DWORD dwLen); HRESULT ParseSizeInfoUnits(int iVal, LPCWSTR pszDefaultUnits, int *piPixels); HRESULT GetIntList(int *pInts, LPCWSTR *pParts, int iCount, int iMin, int iMax); HRESULT GenerateEmptySection(LPCWSTR pszSectionName, int iPartId, int iStateId); //---- private data ---- CScanner _scan; CSimpleFile _outfile; int _iEnumCount; int _iTypeCount; int _iFontNumber; // for using resource-based strings as font values BOOL _fGlobalTheme; BOOL _fGlobalsDefined; BOOL _fClassSectionDefined; BOOL _fDefiningColorScheme; BOOL _fUsingResourceProperties; UCHAR _uCharSet; //---- current section info ---- int _iPartId; int _iStateId; WCHAR _szClassName[MAX_PATH]; WCHAR _szBaseSectionName[MAX_PATH]; // of current section WCHAR _szFullSectionName[MAX_PATH]; // of current section CSimpleArray _EnumVals; CSimpleArray _Symbols; CSimpleArray _StockBitmapCleanupList; IParserCallBack *_pCallBackObj; THEMEENUMPROC _pNameCallBack; LPARAM _lNameParam; DWORD _dwParseFlags; WCHAR _ColorParam[MAX_PATH+1]; HINSTANCE _hinstThemeDll; LPCWSTR _pszDocProperty; LPWSTR _pszResult; // for querying doc property DWORD _dwMaxResultChars; //---- color substitution table ---- int _iColorCount; COLORREF _crFromColors[5]; COLORREF _crToColors[5]; COLORREF _crBlend; //---- hue substitution table ---- int _iHueCount; BYTE _bFromHues[5]; BYTE _bToHues[5]; //---- theme metrics table ---- BOOL _fDefiningMetrics; BOOL _fMetricsDefined; //---- resource properties ---- CSimpleArray _PropertyNames; CSimpleArray _PropertyValues; CSimpleArray _iPropertyIds; WCHAR _szResPropValue[2*MAX_PATH]; int _iResPropId; }; //---------------------------------------------------------------------------