oleview: Add idl displaying (resend)
Piotr Caban
piotr.caban at gmail.com
Sun Aug 20 10:03:49 CDT 2006
Hi,
Changelog:
- Add idl displaying
- Fixed AddToTLDataStrWithTabsW function
programs/oleview/typelib.c | 86
++++++++++++++++++++++++++++++++++++++++----
1 files changed, 79 insertions(+), 7 deletions(-)
--
Piotr
-------------- next part --------------
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;
}
More information about the wine-patches
mailing list