Module: wine Branch: master Commit: a97ee60209d9bb02f30ac2b8a33ff27a5c1cd784 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=a97ee60209d9bb02f30ac2b8...
Author: Piotr Caban piotr.caban@gmail.com Date: Sun Aug 20 18:48:29 2006 +0200
oleview: Added idl displaying.
- Added idl displaying. - Fixed AddToTLDataStrWithTabsW function.
---
programs/oleview/main.h | 1 + programs/oleview/typelib.c | 86 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 80 insertions(+), 7 deletions(-)
diff --git a/programs/oleview/main.h b/programs/oleview/main.h index d9f4a75..4c5f204 100644 --- a/programs/oleview/main.h +++ b/programs/oleview/main.h @@ -117,6 +117,7 @@ typedef struct WCHAR *idl; WCHAR wszInsertAfter[MAX_LOAD_STRING]; INT idlLen; + BOOL bPredefine; }TYPELIB_DATA;
extern GLOBALS globals; diff --git a/programs/oleview/typelib.c b/programs/oleview/typelib.c index 632b028..dee9655 100644 --- a/programs/oleview/typelib.c +++ b/programs/oleview/typelib.c @@ -105,35 +105,43 @@ void AddToTLDataStrW(TYPELIB_DATA *pTLDa pTLData->idlLen += SourceLen; }
-void AddToTLDataStrWithTabsW(TYPELIB_DATA *pTLData, const WCHAR *wszSource) +void AddToTLDataStrWithTabsW(TYPELIB_DATA *pTLData, WCHAR *wszSource) { int lineLen = lstrlenW(wszSource); int newLinesNo = 0; WCHAR *pSourcePos = (WCHAR *)wszSource; WCHAR *pSourceBeg;
+ if(!lineLen) return; while(*pSourcePos) { if(*pSourcePos == *wszNewLine) newLinesNo++; pSourcePos += 1; } + if(*(pSourcePos - 1) != *wszNewLine) newLinesNo++;
pTLData->idl = HeapReAlloc(GetProcessHeap(), 0, pTLData->idl, sizeof(WCHAR)*(pTLData->idlLen+lineLen+4*newLinesNo+1));
pSourcePos = (WCHAR *)wszSource; pSourceBeg = (WCHAR *)wszSource; - while(*pSourcePos) + while(newLinesNo) { - if(*pSourcePos != *wszNewLine) + if(*pSourcePos != *wszNewLine && *pSourcePos) { pSourcePos += 1; continue; } - *pSourcePos = '\0'; - lineLen = lstrlenW(pSourceBeg)+1; - *pSourcePos = '\n'; - pSourcePos += 1; + newLinesNo--; + + if(pSourcePos) + { + *pSourcePos = '\0'; + lineLen = lstrlenW(pSourceBeg)+1; + *pSourcePos = '\n'; + pSourcePos += 1; + } + else lineLen = lstrlenW(pSourceBeg)+1;
pTLData->idl[pTLData->idlLen] = *wszSpace; pTLData->idl[pTLData->idlLen+1] = *wszSpace; @@ -464,6 +472,56 @@ int EnumImplTypes(ITypeInfo *pTypeInfo, return 0; }
+void AddIdlData(HTREEITEM hCur, TYPELIB_DATA *pTLData) +{ + TVITEM tvi; + + hCur = TreeView_GetChild(typelib.hTree, hCur); + memset(&tvi, 0, sizeof(TVITEM)); + tvi.mask = TVIF_PARAM; + + while(hCur) + { + tvi.hItem = hCur; + SendMessage(typelib.hTree, TVM_GETITEM, 0, (LPARAM)&tvi); + AddToTLDataStrW(pTLData, wszNewLine); + AddToTLDataStrWithTabsW(pTLData, ((TYPELIB_DATA*)(tvi.lParam))->idl); + hCur = TreeView_GetNextSibling(typelib.hTree, hCur); + } +} + +void AddPredefinitions(HTREEITEM hFirst, TYPELIB_DATA *pTLData) +{ + HTREEITEM hCur; + TVITEM tvi; + WCHAR wszText[MAX_LOAD_STRING]; + WCHAR wszPredefinition[] = { '/','/',' ','T','L','i','b',' ',':','\n', + '/','/',' ','F','o','r','w','a','r','d',' ','d','e','c','l','a','r','e',' ', + 'a','l','l',' ','t','y','p','e','s',' ','d','e','f','i','n','e','d',' ', + 'i','n',' ','t','h','i','s',' ','t','y','p','e','l','i','b','\0' }; + + hFirst = TreeView_GetChild(typelib.hTree, hFirst); + + AddToTLDataStrWithTabsW(pTLData, wszPredefinition); + + hCur = hFirst; + memset(&tvi, 0, sizeof(TVITEM)); + tvi.mask = TVIF_TEXT|TVIF_PARAM; + tvi.cchTextMax = MAX_LOAD_STRING; + tvi.pszText = wszText; + while(hCur) + { + tvi.hItem = hCur; + SendMessage(typelib.hTree, TVM_GETITEM, 0, (LPARAM)&tvi); + if(((TYPELIB_DATA*)(tvi.lParam))->bPredefine) + { + AddToStrW(wszText, wszSemicolon); + AddToTLDataStrWithTabsW(pTLData, wszText); + } + hCur = TreeView_GetNextSibling(typelib.hTree, hCur); + } +} + void CreateInterfaceInfo(ITypeInfo *pTypeInfo, int cImplTypes, WCHAR *wszName, WCHAR *wszHelpString, unsigned long ulHelpContext, TYPEATTR *pTypeAttr, TYPELIB_DATA *pTLData) @@ -602,6 +660,7 @@ #define ENUM_FLAGS(x) if(pTypeAttr->wTyp int PopulateTree(void) { TVINSERTSTRUCT tvis; + TVITEM tvi; ITypeLib *pTypeLib; TLIBATTR *pTLibAttr; ITypeInfo *pTypeInfo, *pRefTypeInfo; @@ -755,6 +814,7 @@ int PopulateTree(void) CreateInterfaceInfo(pTypeInfo, pTypeAttr->cImplTypes, bstrName, bstrData, ulHelpContext, pTypeAttr, (TYPELIB_DATA*)(U(tvis).item.lParam)); + ((TYPELIB_DATA*)(U(tvis).item.lParam))->bPredefine = TRUE;
AddToStrW(wszText, wszTKIND_INTERFACE); AddToStrW(wszText, bstrName); @@ -768,6 +828,7 @@ int PopulateTree(void) AddToStrW(wszText, bstrName); break; case TKIND_DISPATCH: + ((TYPELIB_DATA*)(U(tvis).item.lParam))->bPredefine = TRUE; AddToStrW(wszText, wszTKIND_DISPATCH); AddToStrW(wszText, bstrName); if(SUCCEEDED(ITypeInfo_GetRefTypeOfImplType(pTypeInfo, -1, &hRefType))) @@ -787,6 +848,7 @@ int PopulateTree(void) CreateInterfaceInfo(pTypeInfo, pTypeAttr->cImplTypes, bstrName, bstrData, ulHelpContext, pTypeAttr, (TYPELIB_DATA*)(U(tvis).item.lParam)); + ((TYPELIB_DATA*)(U(tvis).item.lParam))->bPredefine = TRUE;
AddToStrW(wszText, wszTKIND_INTERFACE); AddToStrW(wszText, bstrName); @@ -823,6 +885,16 @@ int PopulateTree(void) } SendMessage(typelib.hTree, TVM_EXPAND, TVE_EXPAND, (LPARAM)tvis.hParent);
+ memset(&tvi, 0, sizeof(TVITEM)); + tvi.mask = TVIF_PARAM; + tvi.hItem = tvis.hParent; + + SendMessage(typelib.hTree, TVM_GETITEM, 0, (LPARAM)&tvi); + AddPredefinitions(tvi.hItem, (TYPELIB_DATA*)(tvi.lParam)); + AddIdlData(tvi.hItem, (TYPELIB_DATA*)(tvi.lParam)); + AddToTLDataStrW((TYPELIB_DATA*)(tvi.lParam), + ((TYPELIB_DATA*)(tvi.lParam))->wszInsertAfter); + ITypeLib_Release(pTypeLib); return 0; }