📄 cdlgfunclist.cpp
字号:
}
if( 2 == nCharChars ){
++k;
}
}
// Jan. 04, 2001 genta
// ::もクラス区切りとみなすので、最後の文字列は関数名として残しておく
/*
if( 0 < k - m ){
memcpy( szClassArr[nClassNest], &pWork[m], k - m );
szClassArr[nClassNest][k - m] = '\0';
++nClassNest;
}
*/
// for( k = 0; k < nClassNest; ++k ){
// MYTRACE( "%d [%s]\n", k, szClassArr[k] );
// }
// MYTRACE( "\n" );
// Jan. 04, 2001 genta
// 関数先頭のセット(ツリー構築で使う)
pWork = pWork + m; // 2 == lstrlen( "::" );
/* クラス名のアイテムが登録されているか */
htiClass = TreeView_GetFirstVisible( hwndTree );
HTREEITEM htiParent = TVI_ROOT;
for( k = 0; k < nClassNest; ++k ){
// Apr. 1, 2001 genta
// 追加文字列を全角にしたのでメモリもそれだけ必要
// 6 == strlen( "クラス" ), 1 == strlen( '\0' )
// 2002/10/30 frozen
// bAddClass == true の場合の仕様変更
// 既存の項目は 「(クラス名)(半角スペース一個)(追加文字列)」
// となっているとみなし、szClassArr[k] が 「クラス名」と一致すれば、それを親ノードに設定。
// ただし、一致する項目が複数ある場合は最初の項目を親ノードにする。
// 一致しない場合は「(クラス名)(半角スペース一個)クラス」のノードを作成する。
size_t nClassNameLen = strlen( szClassArr[k] );
for( ; NULL != htiClass ; htiClass = TreeView_GetNextSibling( hwndTree, htiClass ))
{
tvi.mask = TVIF_HANDLE | TVIF_TEXT;
tvi.hItem = htiClass;
tvi.pszText = szLabel;
tvi.cchTextMax = sizeof(szLabel);
if( TreeView_GetItem( hwndTree, &tvi ) )
{
if( 0 == strncmp( szClassArr[k],szLabel,nClassNameLen) )
{
if(sizeof(szLabel) < (nClassNameLen +1) )
break;// バッファ不足では無条件にマッチする
else
{
if(bAddClass)
{
if(szLabel[nClassNameLen]==' ')
break;
}
else
{
if(szLabel[nClassNameLen]=='\0')
break;
}
}
}
}
}
// pClassName = new char[ lstrlen( szClassArr[k] ) + 1 + 6 ];
// strcpy( pClassName, szClassArr[k] );
// if( bAddClass ){
// strcat( pClassName, "クラス" );
// }
// while( NULL != htiClass ){
// tvi.mask = TVIF_HANDLE | TVIF_TEXT;
// tvi.hItem = htiClass;
// tvi.pszText = szLabel;
// tvi.cchTextMax = sizeof(szLabel);
// if( TreeView_GetItem( hwndTree, &tvi ) ){
// if( 0 == strcmp( pClassName, szLabel ) ){
// break;
// }
// }
// htiClass = TreeView_GetNextSibling( hwndTree, htiClass );
// }
/* クラス名のアイテムが登録されていないので登録 */
if( NULL == htiClass ){
// 2002/10/28 frozen 上からここへ移動
pClassName = new char[ lstrlen( szClassArr[k] ) + 1 + 9 ]; // 2002/10/28 frozen +9は追加する文字列の最大長(" 名前空間"が最大)
strcpy( pClassName, szClassArr[k] );
tvis.item.lParam = -1;
if( bAddClass )
{
if( pcFuncInfo->m_nInfo == 7 )
{
strcat( pClassName, " 名前空間" );
tvis.item.lParam = i;
}
else
strcat( pClassName, " クラス" );
tvis.item.lParam = nDummylParam;
nDummylParam++;
}
tvis.hParent = htiParent;
tvis.hInsertAfter = TVI_LAST;
tvis.item.mask = TVIF_TEXT | TVIF_PARAM;
tvis.item.pszText = pClassName;
htiClass = TreeView_InsertItem( hwndTree, &tvis );
// Jan. 04, 2001 genta
// 不要になったらさっさと削除
delete [] pClassName; // 2002/10/28 frozen 下からここへ移動
}else{
//none
}
htiParent = htiClass;
//if( k + 1 >= nClassNest ){
// break;
//}
htiClass = TreeView_GetChild( hwndTree, htiClass );
}
htiClass = htiParent;
}else{
// Jan. 04, 2001 genta
// Global空間の場合 (C++のみ)
// 2002/10/27 frozen ここから
if( 3 <= pcFuncInfo->m_nInfo && pcFuncInfo->m_nInfo <= 7 )
htiClass = TVI_ROOT;
else
{
// 2002/10/27 frozen ここまで
if( htiGlobal == NULL ){
TV_INSERTSTRUCT tvg;
::ZeroMemory( &tvg, sizeof(tvg));
tvg.hParent = TVI_ROOT;
tvg.hInsertAfter = TVI_LAST;
tvg.item.mask = TVIF_TEXT | TVIF_PARAM;
tvg.item.pszText = "グローバル";
// tvg.item.lParam = -1;
tvg.item.lParam = nDummylParam;
htiGlobal = TreeView_InsertItem( hwndTree, &tvg );
nDummylParam++;
}
htiClass = htiGlobal;
}
}
pFuncName = new char[ strlen(pWork) + 1 + 7 ]; // +6 は追加する文字列の最大長
strcpy( pFuncName, pWork );
// 2002/10/27 frozen 追加文字列の種類を増やした
switch(pcFuncInfo->m_nInfo)
{// case 4以上の各追加文字列の最初にある半角スペースを省略することはできない。
case 1: strcat( pFuncName, "(宣言)" );break;
case 3: strcat( pFuncName, " クラス" );break;
case 4: strcat( pFuncName, " 構造体" );break;
case 5: strcat( pFuncName, " 列挙体" );break;
case 6: strcat( pFuncName, " 共用体" );break;
// case 7: strcat( pFuncName, " 名前空間" );break;
};
// }
/* 該当クラス名のアイテムの子として、メソッドのアイテムを登録 */
tvis.hParent = htiClass;
tvis.hInsertAfter = TVI_LAST;
tvis.item.mask = TVIF_TEXT | TVIF_PARAM;
tvis.item.pszText = pFuncName;
tvis.item.lParam = i;
htiItem = TreeView_InsertItem( hwndTree, &tvis );
/* クリップボードにコピーするテキストを編集 */
wsprintf( szText, "%s(%d): %s %s\r\n",
m_pcFuncInfoArr->m_szFilePath, /* 解析対象ファイル名 */
pcFuncInfo->m_nFuncLineCRLF, /* 検出行番号 */
pcFuncInfo->m_cmemFuncName.GetPtr(), /* 検出結果 */
( 1 == pcFuncInfo->m_nInfo ? "(宣言)" : "" ) // Jan. 04, 2001 genta C++で使用
);
m_cmemClipText.AppendSz( (const char *)szText ); /* クリップボードコピー用テキスト */
delete [] pFuncName;
/* 現在カーソル位置のメソッドかどうか調べる */
if( !bSelected ){
if( i == 0 && m_nCurLine < pcFuncInfo->m_nFuncLineLAYOUT ){
bSelected = TRUE;
nSelectedLine = i;
htiSelected = htiItem;
}else
if( i > 0 && nFuncLineOld <= m_nCurLine && m_nCurLine < pcFuncInfo->m_nFuncLineLAYOUT ){
bSelected = TRUE;
nSelectedLine = i - 1;
htiSelected = htiItemOld;
}
}
nFuncLineOld = pcFuncInfo->m_nFuncLineLAYOUT;
htiItemOld = htiItem;
// Jan. 04, 2001 genta
// deleteはその都度行うのでここでは不要
}
/* ソート、ノードの展開をする */
// TreeView_SortChildren( hwndTree, TVI_ROOT, 0 );
htiClass = TreeView_GetFirstVisible( hwndTree );
while( NULL != htiClass ){
// TreeView_SortChildren( hwndTree, htiClass, 0 );
TreeView_Expand( hwndTree, htiClass, TVE_EXPAND );
htiClass = TreeView_GetNextSibling( hwndTree, htiClass );
}
/* 現在カーソル位置のメソッドを選択状態にする */
if( bSelected ){
TreeView_SelectItem( hwndTree, htiSelected );
}else{
if( NULL != htiItemOld ){
TreeView_SelectItem( hwndTree, htiItemOld );
}
}
// GetTreeTextNext( hwndTree, NULL, 0 );
return;
}
/*! リストビューコントロールの初期化:VisualBasic
長くなったので独立させました。
@date Jul 10, 2003 little YOSHI
*/
void CDlgFuncList::SetListVB (void)
{
int i;
char szText[2048], szType[128], szOption[256];
CFuncInfo* pcFuncInfo;
LV_ITEM item;
HWND hwndList;
int bSelected;
int nFuncLineOld;
int nSelectedLine;
RECT rc;
::EnableWindow( ::GetDlgItem( m_hWnd , IDC_BUTTON_COPY ), TRUE );
hwndList = ::GetDlgItem( m_hWnd, IDC_LIST1 );
nFuncLineOld = 0;
bSelected = FALSE;
for( i = 0; i < m_pcFuncInfoArr->GetNum(); ++i ){
pcFuncInfo = m_pcFuncInfoArr->GetAt( i );
if( !bSelected ){
if( i == 0 && m_nCurLine < pcFuncInfo->m_nFuncLineLAYOUT ){
bSelected = TRUE;
nSelectedLine = i;
}else
if( i > 0 && nFuncLineOld <= m_nCurLine && m_nCurLine < pcFuncInfo->m_nFuncLineLAYOUT ){
bSelected = TRUE;
nSelectedLine = i - 1;
}
}
nFuncLineOld = pcFuncInfo->m_nFuncLineLAYOUT;
}
if( 0 < m_pcFuncInfoArr->GetNum() && !bSelected ){
bSelected = TRUE;
nSelectedLine = m_pcFuncInfoArr->GetNum() - 1;
}
for( i = 0; i < m_pcFuncInfoArr->GetNum(); ++i ){
/* 現在の解析結果要素 */
pcFuncInfo = m_pcFuncInfoArr->GetAt( i );
// From Here Apr. 23, 2005 genta 行番号を左端へ
/* 行番号の表示 FALSE=折り返し単位/TRUE=改行単位 */
if(m_bLineNumIsCRLF ){
wsprintf( szText, "%d", pcFuncInfo->m_nFuncLineCRLF );
}else{
wsprintf( szText, "%d", pcFuncInfo->m_nFuncLineLAYOUT );
}
item.mask = LVIF_TEXT | LVIF_PARAM;
item.pszText = szText;
item.iItem = i;
item.iSubItem = 0;
item.lParam = i;
ListView_InsertItem( hwndList, &item);
item.mask = LVIF_TEXT;
item.pszText = pcFuncInfo->m_cmemFuncName.GetPtr();
item.iItem = i;
item.iSubItem = 1;
ListView_SetItem( hwndList, &item);
// To Here Apr. 23, 2005 genta 行番号を左端へ
item.mask = LVIF_TEXT;
// 2001/06/23 N.Nakatani for Visual Basic
// Jun. 26, 2001 genta 半角かな→全角に
memset(szText, '\0', sizeof(szText));
memset(szType, '\0', sizeof(szType));
memset(szOption, '\0', sizeof(szOption));
if( 1 == ((pcFuncInfo->m_nInfo >> 8) & 0x01) ){
// スタティック宣言(Static)
strcpy(szOption, "静的");
}
switch ((pcFuncInfo->m_nInfo >> 4) & 0x0f) {
case 2 : // プライベート(Private)
strncat(szOption, "プライベート", sizeof(szText) - strlen(szText));
break;
case 3 : // フレンド(Friend)
strncat(szOption, "フレンド", sizeof(szText) - strlen(szText));
break;
default : // パブリック(Public)
strncat(szOption, "パブリック", sizeof(szText) - strlen(szText));
}
switch (pcFuncInfo->m_nInfo & 0x0f) {
case 1: // 関数(Function)
strcpy(szType, "関数");
break;
case 2: // ステータス(Sub)
strcpy(szType, "ステータス");
break;
case 3: // プロパティ 取得(Property Get)
strcpy(szType, "プロパティ 取得");
break;
case 4: // プロパティ 設定(Property Let)
strcpy(szType, "プロパティ 設定");
break;
case 5: // プロパティ 参照(Property Set)
strcpy(szType, "プロパティ 参照");
break;
case 6: // 定数(Const)
strcpy(szType, "定数");
break;
case 7: // 列挙型(Enum)
strcpy(szType, "列挙型");
break;
case 8: // ユーザ定義型(Type)
strcpy(szType, "ユーザ定義型");
break;
case 9: // イベント(Event)
strcpy(szType, "イベント");
break;
default: // 未定義なのでクリア
pcFuncInfo->m_nInfo = 0;
}
if ( 2 == ((pcFuncInfo->m_nInfo >> 8) & 0x02) ) {
// 宣言(Declareなど)
strncat(szType, "宣言", sizeof(szType) - strlen(szType));
}
if ( 0 == pcFuncInfo->m_nInfo ) {
memset(szText, '\0', sizeof(szText));
} else
if ( 0 == strlen(szOption) ) {
wsprintf(szText, "%s", szType);
} else {
wsprintf(szText, "%s(%s)", szType, szOption);
}
item.pszText = szText;
item.iItem = i;
item.iSubItem = 2;
ListView_SetItem( hwndList, &item);
/* クリップボードにコピーするテキストを編集 */
if(lstrlen(item.pszText)){
// 検出結果の種類(関数,,,)があるとき
wsprintf( szText, "%s(%d): %s(%s)\r\n",
m_pcFuncInfoArr->m_szFilePath, /* 解析対象ファイル名 */
pcFuncInfo->m_nFuncLineCRLF, /* 検出行番号 */
pcFuncInfo->m_cmemFuncName.GetPtr(), /* 検出結果 */
item.pszText /* 検出結果の種類 */
);
}else{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -