void LabelControl::SetText(const char *psz) { if (psz == NULL) { if (m_szLabel != NULL) { gmmgr.FreePtr(m_szLabel); m_szLabel = NULL; } } else { if (strcmp(psz, m_szLabel) == 0) return; if (m_szLabel != NULL) gmmgr.FreePtr(m_szLabel); // Use the tail end of the scratch buffer because ExpandVars // (potentially) calls StringTable::GetString which reads from the // database, decompressing to the front of the scratch buffer as part // of the process. char *pszT = (char *)gpbScratch + (gcbScratch / 2); ExpandVars((char *)psz, pszT, kcbLabelTextMax); m_szLabel = (char *)gmmgr.AllocPtr(strlen(pszT) + 1); gmmgr.WritePtr(m_szLabel, 0, pszT, strlen(pszT) + 1); } CalcRect(); }
bool LabelControl::Init(int nfnt, char *pszLabel, char *pszFlag1, char *pszFlag2) { m_nfnt = nfnt; char *pszT = (char *)gpbScratch + (gcbScratch / 2); ExpandVars(pszLabel, pszT, kcbLabelTextMax); m_szLabel = (char *)gmmgr.AllocPtr(strlen(pszT) + 1); gmmgr.WritePtr(m_szLabel, 0, pszT, strlen(pszT) + 1); if (strcmp(pszFlag1, "center") == 0) m_wf |= kfLblCenterText; else if (strcmp(pszFlag1, "multiline") == 0) m_wf |= kfLblMultiLine; else if (strcmp(pszFlag1, "right") == 0) m_wf |= kfLblRightText; if (strcmp(pszFlag2, "center") == 0) m_wf |= kfLblCenterText; else if (strcmp(pszFlag2, "multiline") == 0) m_wf |= kfLblMultiLine; else if (strcmp(pszFlag2, "right") == 0) m_wf |= kfLblRightText; else if (strcmp(pszFlag2, "clipvert") == 0) m_wf |= kfLblClipVertical; CalcRect(); return true; }
BOOL CTreeItem::Expand( HTREEITEM hitem ) { BOOL fExpand = FALSE ; switch(m_Type) { case typeUnknown: case typeUnknown2: break ; case typeTypeLib: fExpand = ExpandTypeLib( hitem ); break ; case typeTypeLib2: { // CTypeLibWnd::m_fGroupByType == TRUE CTreeItem* pItem ; TV_INSERTSTRUCT tvis ; tvis.hParent = hitem ; tvis.hInsertAfter = TVI_LAST ; tvis.item.mask = TVIF_TEXT | TVIF_CHILDREN | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE ; tvis.item.iImage = CTreeItem::typeUnknown ; tvis.item.iSelectedImage = tvis.item.iImage + 1 ; tvis.item.cChildren = 1 ; #pragma warning (suppress: 6211) // Not Leaking. pItem is inserted into m_pTree pItem = new CTreeItem(m_pTree) ; pItem->SetTypeLib( GetTypeLib() ) ; GetTypeLib()->AddRef() ; pItem->m_Type = CTreeItem::typeEnums ; tvis.item.lParam = (LPARAM)pItem ; tvis.item.pszText = _T("Enums") ; m_pTree->InsertItem(&tvis) ; pItem = new CTreeItem(m_pTree) ; pItem->SetTypeLib( GetTypeLib() ) ; GetTypeLib()->AddRef() ; pItem->m_Type = CTreeItem::typeRecords ; tvis.item.lParam = (LPARAM)pItem ; tvis.item.pszText = _T("Structs") ; m_pTree->InsertItem(&tvis) ; pItem = new CTreeItem(m_pTree) ; pItem->SetTypeLib( GetTypeLib() ) ; GetTypeLib()->AddRef() ; pItem->m_Type = CTreeItem::typeModules ; tvis.item.lParam = (LPARAM)pItem ; tvis.item.pszText = _T("Modules") ; m_pTree->InsertItem(&tvis) ; pItem = new CTreeItem(m_pTree) ; pItem->SetTypeLib( GetTypeLib() ) ; GetTypeLib()->AddRef() ; pItem->m_Type = CTreeItem::typeInterfaces ; tvis.item.lParam = (LPARAM)pItem ; tvis.item.pszText = _T("Interfaces") ; m_pTree->InsertItem(&tvis) ; pItem = new CTreeItem(m_pTree) ; pItem->SetTypeLib( GetTypeLib() ) ; GetTypeLib()->AddRef() ; pItem->m_Type = CTreeItem::typeDispinterfaces ; tvis.item.lParam = (LPARAM)pItem ; tvis.item.pszText = _T("Dispinterfaces") ; m_pTree->InsertItem(&tvis) ; pItem = new CTreeItem(m_pTree) ; pItem->SetTypeLib( GetTypeLib() ) ; GetTypeLib()->AddRef() ; pItem->m_Type = CTreeItem::typeCoClasses ; tvis.item.lParam = (LPARAM)pItem ; tvis.item.pszText = _T("CoClasses") ; m_pTree->InsertItem(&tvis) ; pItem = new CTreeItem(m_pTree) ; pItem->SetTypeLib( GetTypeLib() ) ; GetTypeLib()->AddRef() ; pItem->m_Type = CTreeItem::typeAliases ; tvis.item.lParam = (LPARAM)pItem ; tvis.item.pszText = _T("Typedefs") ; m_pTree->InsertItem(&tvis) ; pItem = new CTreeItem(m_pTree) ; pItem->SetTypeLib( GetTypeLib() ) ; GetTypeLib()->AddRef() ; pItem->m_Type = CTreeItem::typeUnions ; tvis.item.lParam = (LPARAM)pItem ; tvis.item.pszText = _T("Unions") ; m_pTree->InsertItem(&tvis) ; fExpand = TRUE ; } break ; case typeEnums: case typeRecords: case typeModules: case typeInterfaces: case typeDispinterfaces: case typeCoClasses: case typeAliases: case typeUnions: fExpand = ExpandTypeLib( hitem ) ; break ; case typeTypeInfo: case typeTypeInfo2: case typeEnum: case typeRecord: case typeModule: case typeInterface: case typeDispinterface: case typeCoClass: case typeAlias: case typeUnion: fExpand = ExpandTypeInfo( hitem ) ; break ; case typeMethods: case typeMethods2: fExpand = ExpandFuncs( hitem ) ; break ; case typeProperties: case typeProperties2: case typeConstants: case typeConstants2: fExpand = ExpandVars( hitem ) ; break ; case typeImplTypes: case typeImplTypes2: fExpand = ExpandImplTypes( hitem ) ; break ; case typeMethod: case typeProperty: case typeConstant: default: break ; } return fExpand ; }
BOOL CTreeItem::ExpandTypeInfo( HTREEITEM hitem ) { ASSERT(m_pTree) ; ASSERT(hitem) ; CTreeItem* pNewItem = NULL ; HRESULT hr = S_OK ; TV_INSERTSTRUCT tvis ; CString strError = "Enumerating TypeInfo" ; TYPEATTR* pattr = NULL ; ITypeInfo* pti = GetTypeInfo() ; ASSERT(pti) ; BOOL fExpand = FALSE ; tvis.hParent = hitem ; tvis.hInsertAfter = TVI_LAST ; tvis.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN ; tvis.item.iImage = typeUnknown ; tvis.item.iSelectedImage = tvis.item.iImage + 1 ; TRY { ENSURE(pti); hr = pti->GetTypeAttr(&pattr) ; if FAILED(hr) { strError.Format(_T("ITypeInfo::GetTypeAttr() failed"), hr ) ; AfxThrowMemoryException() ; } switch(pattr->typekind) { // typedef [attributes] enum [tag] { // enumlist // } enumname; // // "typedef enum enumname" case TKIND_ENUM: fExpand = ExpandVars( hitem ) ; break ; // typedef [attributes] // struct [tag] { // memberlist // } structname; // // "typedef struct structname" case TKIND_RECORD: fExpand = ExpandVars( hitem ) ; break ; // [attributes] // module modulename { // elementlist // }; case TKIND_MODULE: if (pattr->cVars) { // Add "Constants" folder // #pragma warning (suppress: 6211) #pragma warning (suppress: 6014) pNewItem = new CTreeItem(m_pTree) ; pNewItem->m_Type = typeProperties ; pNewItem->SetTypeInfo(pti) ; pti->AddRef() ; tvis.item.cChildren = pattr->cVars ; tvis.item.lParam = (LPARAM)pNewItem ; tvis.item.pszText = _T("Constants") ; tvis.item.iImage = typeConstants ; tvis.item.iSelectedImage = tvis.item.iImage + 1 ; m_pTree->InsertItem( &tvis ) ; fExpand = TRUE ; } if (pattr->cFuncs) { pNewItem = new CTreeItem(m_pTree) ; pNewItem->m_Type = typeMethods ; pNewItem->SetTypeInfo(pti) ; pti->AddRef() ; tvis.item.cChildren = pattr->cFuncs ; tvis.item.lParam = (LPARAM)pNewItem ; tvis.item.pszText = _T("Functions") ; tvis.item.iImage = typeMethods ; tvis.item.iSelectedImage = tvis.item.iImage + 1 ; m_pTree->InsertItem( &tvis ) ; fExpand = TRUE ; } break ; // [attributes] // interface interfacename [:baseinterface] { // functionlist // }; case TKIND_INTERFACE: fExpand = ExpandFuncs( hitem) ; if (pattr->cImplTypes) { pNewItem = new CTreeItem(m_pTree) ; pNewItem->m_Type = typeImplTypes ; pNewItem->SetTypeInfo(pti) ; pti->AddRef() ; tvis.item.pszText = _T("Inherited Interfaces") ; tvis.item.iImage = typeInterface ; tvis.item.cChildren = pattr->cImplTypes ; tvis.item.lParam = (LPARAM)pNewItem ; tvis.item.iSelectedImage = tvis.item.iImage ; m_pTree->InsertItem( &tvis ) ; fExpand = TRUE ; } break ; // [attributes] // dispinterface intfname { // interface interfacename // }; case TKIND_DISPATCH : if (pattr->cVars) { // Add "Constants" folder // pNewItem = new CTreeItem(m_pTree) ; pNewItem->m_Type = typeConstants ; pNewItem->SetTypeInfo(pti) ; pti->AddRef() ; tvis.item.cChildren = pattr->cVars ; tvis.item.lParam = (LPARAM)pNewItem ; tvis.item.pszText = _T("Constants") ; tvis.item.iImage = typeConstants ; tvis.item.iSelectedImage = tvis.item.iImage + 1 ; m_pTree->InsertItem( &tvis ) ; // Add "Properties" folder // pNewItem = new CTreeItem(m_pTree) ; pNewItem->m_Type = typeProperties ; pNewItem->SetTypeInfo(pti) ; pti->AddRef() ; tvis.item.cChildren = pattr->cVars ; tvis.item.lParam = (LPARAM)pNewItem ; tvis.item.pszText = _T("Properties") ; tvis.item.iImage = typeProperties ; tvis.item.iSelectedImage = tvis.item.iImage + 1 ; m_pTree->InsertItem( &tvis ) ; fExpand = TRUE ; } if (pattr->cFuncs) { pNewItem = new CTreeItem(m_pTree) ; pNewItem->m_Type = typeMethods ; pNewItem->SetTypeInfo(pti) ; pti->AddRef() ; tvis.item.cChildren = pattr->cFuncs ; tvis.item.lParam = (LPARAM)pNewItem ; tvis.item.pszText = _T("Methods") ; tvis.item.iImage = typeMethods ; tvis.item.iSelectedImage = tvis.item.iImage + 1 ; m_pTree->InsertItem( &tvis ) ; fExpand = TRUE ; } if (pattr->cImplTypes) { pNewItem = new CTreeItem(m_pTree) ; pNewItem->m_Type = typeImplTypes ; pNewItem->SetTypeInfo(pti) ; pti->AddRef() ; tvis.item.pszText = _T("Inherited Interfaces") ; tvis.item.iImage = typeInterface ; tvis.item.cChildren = pattr->cImplTypes ; tvis.item.lParam = (LPARAM)pNewItem ; tvis.item.iSelectedImage = tvis.item.iImage ; m_pTree->InsertItem( &tvis ) ; fExpand = TRUE ; } break ; // [attributes] // coclass classname { // [attributes2] [interface | dispinterface] interfacename; // ... // }; case TKIND_COCLASS: fExpand = ExpandImplTypes( hitem ) ; break ; // typedef [attributes] basetype aliasname; case TKIND_ALIAS: if (pattr->tdescAlias.vt == VT_USERDEFINED) { ITypeInfo* ptiRefType = NULL ; #pragma warning (suppress: 6246) HRESULT hr = pti->GetRefTypeInfo( pattr->tdescAlias.hreftype, &ptiRefType ) ; if (FAILED(hr)) AfxThrowOleException( hr ) ; pNewItem = new CTreeItem(m_pTree) ; pNewItem->SetTypeInfo( ptiRefType ) ; pNewItem->m_Type = TypeKindToItemType( pNewItem->GetTypeKind() ) ; tvis.item.iImage = TypeKindToItemType( pNewItem->GetTypeKind() ) ; tvis.item.cChildren = 1 ; tvis.item.lParam = (LPARAM)pNewItem ; tvis.item.iSelectedImage = tvis.item.iImage ; CString sName; pNewItem->GetName(sName, TRUE ); tvis.item.pszText = sName.GetBuffer(0) ; m_pTree->InsertItem( &tvis ) ; sName.ReleaseBuffer(); fExpand = TRUE ; } break ; // typedef [attributes] union [tag] { // memberlist // } unionname; case TKIND_UNION: fExpand = ExpandVars( hitem ) ; break ; default: break ; } if (pattr) pti->ReleaseTypeAttr( pattr ) ; } CATCH(CException, pException) { ErrorMessage( strError, hr ) ; if (pNewItem) delete pNewItem ; if (pattr) pti->ReleaseTypeAttr( pattr ) ; return FALSE ; }