strcview.cpp
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C++ 代码 · 共 642 行 · 第 1/2 页
CPP
642 行
{
char * tmp;
initState();
if( _indentLevel > 0 ) {
tmp = new char[ _indentLevel * 2 + 3 + _name.size() ];
memset( tmp, ' ', _indentLevel * 2 );
tmp[ _indentLevel * 2 ] = '\0';
} else {
tmp = new char[ _name.size() + 3 ];
tmp[ 0 ] = '\0';
}
switch( _expandState ) {
case LeafNode:
strcat( tmp, " " );
break;
case Collapsed:
strcat( tmp, "+ " );
break;
case Expanded:
strcat( tmp, "- " );
break;
default:
REQUIRE( 0, "strcview name -- _expandState out of range" );
}
strcat( tmp, _name );
return tmp;
}
void StrucViewItem::expandNode( int index )
//-----------------------------------------
{
VerboseListBox * listbox = _parent->getListBox();
WVList * listobjs = _parent->getObjs();
int childIndex = index + 1;
int i;
initState();
if( _expandState == Collapsed ) {
_expandState=Expanded;
} else {
return;
}
char * tmp = name();
listbox->deleteString( index );
listbox->insertString( tmp, index );
delete tmp;
listobjs->removeAt( index );
listobjs->insertAt( index, this );
for( i = 0; i < _kids.count(); i++ ) {
char *tmp = ((StrucViewItem *)_kids[i])->name();
listbox->insertString( tmp, childIndex );
delete tmp;
listobjs->insertAt( childIndex, _kids[i] );
childIndex ++;
}
listbox->select( index );
return;
}
void StrucViewItem::collapseNode( int &index )
//--------------------------------------------
{
WVList * listobjs = _parent->getObjs();
VerboseListBox * listbox = _parent->getListBox();
initState();
if( _expandState == Expanded ) {
index += 1;
for( int i = 0; i < _kids.count(); i++ ) {
((StrucViewItem *)_kids[ i ])->collapseNode( index );
}
index -= 1;
}
listobjs->removeAt( index );
listbox->deleteString( index );
if( _expandState == Expanded ) {
_expandState = Collapsed;
}
}
void StrucViewItem::expandAllNode( int &index )
//---------------------------------------------
{
WVList * listobjs = _parent->getObjs();
VerboseListBox * listbox = _parent->getListBox();
initState();
if( (*listobjs)[ index ] != this ) {
if( _expandState == Collapsed ) {
_expandState = Expanded;
}
listobjs->insertAt( index, this );
char * tmp = name();
listbox->insertString( tmp, index );
delete tmp;
if( _expandState == Collapsed ) {
_expandState = Expanded;
}
} else {
if( _expandState == Collapsed ) {
_expandState = Expanded;
listbox->deleteString( index );
char * tmp = name();
listbox->insertString( tmp, index );
delete tmp;
}
}
index += 1;
if( _expandState != LeafNode ) {
for( int i = 0; i < _kids.count(); i++ ) {
((StrucViewItem *)_kids[ i ])->expandAllNode( index );
}
}
}
const char * StrucViewItem::typeStr(void)
//---------------------------------------
{
initState();
return _type;
}
void StrucViewItem::initState()
//-----------------------------
// if i represent a variable, i must find my type
// if the base type is a ClassType, then i am Collapsed
// else i am LeafNode
{
bool do_inherited = FALSE;
ClassType * classType;
dr_sym_type stype = _info->symtype();
REQUIRE( stype != DR_SYM_NOT_SYM,"strucview::initstate ack");
if( !_initialized ) {
if( _classNode != NULL ) {
REQUIRE( stype == DR_SYM_CLASS,"strucview::initstate nak");
classType = (ClassType *)_info;
_type = _name;
} else {
classType = flattenTypeDesc( _info, _type );
_name = _info->name();
}
if( classType ) {
WVList kidInfos;
FilterFlags flags = _parent->getFilter();
if( ( flags & FILT_INHERITED ) || ( flags & FILT_ALL_INHERITED )) {
do_inherited = TRUE;
FILT_RESET_INHERITED( flags );
}
classType->dataMembers( kidInfos, flags );
if( kidInfos.count() != 0 ) {
_expandState = Collapsed;
_parent->addSeen( this );
for( int i = 0; i < kidInfos.count(); i++ ) {
_kids.add( new StrucViewItem( _parent, ((Symbol *)kidInfos[i]),
_indentLevel + 1 ) );
}
} else {
_expandState = LeafNode;
}
if( classType != _info ) {
delete classType;
}
if( do_inherited ) {
startInherited();
}
} else {
_expandState = LeafNode;
}
_initialized = TRUE;
}
}
ClassType * StrucViewItem::flattenTypeDesc( Symbol * sym, WString & desc )
//------------------------------------------------------------------------
{
ClassType * classType = NULL;
char * str = NULL;
WVList typeParts;
Description * entry;
int i;
REQUIRE( sym != NULL, "strucview::flatten passed null symbol!" );
dr_sym_type stype = sym->symtype();
REQUIRE( stype != DR_SYM_NOT_SYM,"strucview::flatten bad set");
switch( stype ) {
case DR_SYM_VARIABLE:
// need to find out the type of the data member
((VariableSym *) sym)->loadTypeInfo( typeParts );
for( i = 0; i < typeParts.count(); i++ ) {
entry = (Description *) typeParts[i];
if( entry->_nameGoesHere ) {
desc.concat( entry->u.text );
} else {
if( !sym->isEqual( entry->u.sym ) ){
if( classType == NULL ) {
classType = flattenTypeDesc( entry->u.sym, desc );
} else {
desc.concat( entry->u.sym->name() );
}
}
}
}
break;
case DR_SYM_TYPEDEF:
case DR_SYM_ENUM:
sym->description( typeParts );
for( i = 0; i < typeParts.count(); i++ ) {
entry = (Description *) typeParts[ i ];
if( entry->_isUserDefined ) {
if( entry->u.sym->symtype() == DR_SYM_CLASS && classType == NULL ) {
classType = (ClassType *) entry->u.sym;
}
}
}
desc.concat( sym->name() );
break;
case DR_SYM_CLASS:
if( _parent->isSeen( sym ) ) {
desc.concat( sym->name() );
classType = NULL;
} else {
classType = (ClassType *) sym;
desc.concat( classType->name() );
}
break;
default: {}
}
for( i=0; i < typeParts.count(); i++ ) {
entry = (Description *) typeParts[ i ];
if( entry->_isUserDefined && entry->u.sym != classType &&
entry->u.sym != sym ) {
delete entry->u.sym;
}
}
typeParts.deleteContents();
return classType;
}
struct InheritedData
{
StrucViewItem * me;
WString * name;
};
void StrucViewItem::startInherited( void )
//----------------------------------------
{
WString start( _name );
InheritedData data;
data.me = this;
data.name = &start;
if( _classNode != NULL ) {
_classNode->enumerateBases( &inhHook, &data );
} else {
_parent->getLattice()->enumerateBases( &inhHook, &data );
}
}
bool StrucViewItem::inhHook( DerivationPtr & ptr, void * info )
//-------------------------------------------------------------
{
InheritedData * data = (InheritedData *) info;
WString name( *data->name );
StrucViewItem * item = NULL;
name.concat( "::" );
name.concat( ptr._class->name() );
if( ptr._virtuality == DR_VIRTUALITY_VIRTUAL ) {
WVList * list = data->me->_parent->getSeen();
for( int i = list->count(); i > 0; i -= 1 ) {
StrucViewItem * test = (StrucViewItem *) (*list)[ i - 1 ];
if( test->_info->getHandle() == ptr._class->getHandle() ) {
item = test;
}
}
}
if( item != NULL ) {
item->_name.concat( ", " );
item->_name.concat( name );
} else {
item = new StrucViewItem( data->me->_parent, ptr._class,
data->me->_indentLevel );
item->_name = name;
item->initState();
data->me->_kids.add( item );
}
return TRUE;
}
void StrucViewItem::reset( void )
//-------------------------------
{
_kids.deleteContents();
_initialized = FALSE;
initState();
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?