📄 cdlgfunclist.cpp
字号:
ListView_SetColumnWidth( hwndList, 1, ListView_GetColumnWidth( hwndList, 1 ) + 16 );
ListView_SetColumnWidth( hwndList, 2, ListView_GetColumnWidth( hwndList, 2 ) + 16 );
if( bSelected ){
ListView_GetItemRect( hwndList, 0, &rc, LVIR_BOUNDS );
ListView_Scroll( hwndList, 0, nSelectedLine * ( rc.bottom - rc.top ) );
ListView_SetItemState( hwndList, nSelectedLine, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED );
}
}
/* アウトライン ダイアログを自動的に閉じる */
::CheckDlgButton( m_hWnd, IDC_CHECK_bAutoCloseDlgFuncList, m_pShareData->m_Common.m_bAutoCloseDlgFuncList );
/* アウトライン ブックマーク一覧で空行を無視する */
::CheckDlgButton( m_hWnd, IDC_CHECK_bMarkUpBlankLineEnable, m_pShareData->m_Common.m_bMarkUpBlankLineEnable );
/* アウトライン ジャンプしたらフォーカスを移す */
::CheckDlgButton( m_hWnd, IDC_CHECK_bFunclistSetFocusOnJump, m_pShareData->m_Common.m_bFunclistSetFocusOnJump );
/* ダイアログを自動的に閉じるならフォーカス移動オプションは関係ない */
if(m_pShareData->m_Common.m_bAutoCloseDlgFuncList){
::EnableWindow( ::GetDlgItem( m_hWnd, IDC_CHECK_bFunclistSetFocusOnJump ), FALSE );
}else{
::EnableWindow( ::GetDlgItem( m_hWnd, IDC_CHECK_bFunclistSetFocusOnJump ), TRUE );
}
//2002.02.08 hor
//(IDC_LIST1もIDC_TREE1も常に存在していて、m_nViewTypeによって、どちらを表示するかを選んでいる)
if(m_nViewType){
::ShowWindow( hwndTree, SW_SHOW );
::SetFocus( hwndTree );
}else{
// ::ShowWindow( hwndList, SW_SHOW );
::SetFocus( hwndList );
}
//2002.02.08 hor
//空行をどう扱うかのチェックボックスはブックマーク一覧のときだけ表示する
if(OUTLINE_BOOKMARK == m_nListType){
::EnableWindow( ::GetDlgItem( m_hWnd, IDC_CHECK_bMarkUpBlankLineEnable ), TRUE );
::ShowWindow( GetDlgItem( m_hWnd, IDC_CHECK_bMarkUpBlankLineEnable ), SW_SHOW );
}else{
::ShowWindow( GetDlgItem( m_hWnd, IDC_CHECK_bMarkUpBlankLineEnable ), SW_HIDE );
::EnableWindow( ::GetDlgItem( m_hWnd, IDC_CHECK_bMarkUpBlankLineEnable ), FALSE );
}
// 2002/11/1 frozen 項目のソート基準を設定するコンボボックスはブックマーク一覧の以外の時に表示する
// Nov. 5, 2002 genta ツリー表示の時だけソート基準コンボボックスを表示
if( m_nViewType == 1 ){
HWND hWnd_Combo_Sort = ::GetDlgItem( m_hWnd, IDC_COMBO_nSortType );
::EnableWindow( hWnd_Combo_Sort , TRUE );
::ShowWindow( hWnd_Combo_Sort , SW_SHOW );
::SendMessage( hWnd_Combo_Sort , CB_RESETCONTENT, 0, 0 ); // 2002.11.10 Moca 追加
::SendMessage( hWnd_Combo_Sort , CB_ADDSTRING, 0, (LPARAM)(_T("デフォルト")));
::SendMessage( hWnd_Combo_Sort , CB_ADDSTRING, 0, (LPARAM)(_T("アルファベット順")));
::SendMessage( hWnd_Combo_Sort , CB_SETCURSEL, m_nSortType, 0L);
::ShowWindow( GetDlgItem( m_hWnd, IDC_STATIC_nSortType ), SW_SHOW );
// 2002.11.10 Moca 追加 ソートする
if( 1 == m_nSortType ){
SortTree(::GetDlgItem( m_hWnd , IDC_TREE1),TVI_ROOT);
}
}
else {
::EnableWindow( ::GetDlgItem( m_hWnd, IDC_COMBO_nSortType ), FALSE );
::ShowWindow( GetDlgItem( m_hWnd, IDC_COMBO_nSortType ), SW_HIDE );
::ShowWindow( GetDlgItem( m_hWnd, IDC_STATIC_nSortType ), SW_HIDE );
//ListView_SortItems( hwndList, _CompareFunc_, (LPARAM)this ); // 2005.04.05 zenryaku ソート状態を保持
SortListView( hwndList, m_nSortCol ); // 2005.04.23 genta 関数化(ヘッダ書き換えのため)
}
return;
}
/* ダイアログデータの取得 */
/* 0==条件未入力 0より大きい==正常 0より小さい==入力エラー */
int CDlgFuncList::GetData( void )
{
HWND hwndList;
HWND hwndTree;
int nItem;
CFuncInfo* pcFuncInfo;
LV_ITEM item;
int nLineTo;
HTREEITEM htiItem;
TV_ITEM tvi;
char szLabel[32];
//2002.02.08 hor OnBnClicked内に移動
// /* アウトライン ダイアログを自動的に閉じる */
// m_pShareData->m_Common.m_bAutoCloseDlgFuncList = ::IsDlgButtonChecked( m_hWnd, IDC_CHECK_bAutoCloseDlgFuncList );
nLineTo = -1;
hwndList = ::GetDlgItem( m_hWnd, IDC_LIST1 );
if( m_nViewType == 0 ){
// List
nItem = ListView_GetNextItem( hwndList, -1, LVNI_ALL | LVNI_SELECTED );
if( -1 == nItem ){
return -1;
}
item.mask = LVIF_PARAM;
item.iItem = nItem;
item.iSubItem = 0;
ListView_GetItem( hwndList, &item );
pcFuncInfo = m_pcFuncInfoArr->GetAt( item.lParam );
nLineTo = pcFuncInfo->m_nFuncLineCRLF;
}else{
hwndTree = ::GetDlgItem( m_hWnd, IDC_TREE1 );
if( NULL != hwndTree ){
htiItem = TreeView_GetSelection( hwndTree );
tvi.mask = TVIF_HANDLE | TVIF_TEXT | TVIF_PARAM;
tvi.hItem = htiItem;
tvi.pszText = szLabel;
tvi.cchTextMax = sizeof( szLabel );
if( TreeView_GetItem( hwndTree, &tvi ) ){
// lParamが-1以下は pcFuncInfoArrには含まれない項目
if( 0 <= tvi.lParam ){
pcFuncInfo = m_pcFuncInfoArr->GetAt( tvi.lParam );
nLineTo = pcFuncInfo->m_nFuncLineCRLF;
}
}
}
}
return nLineTo;
}
#if 0
Jan. 04, 2001 genta Java Treeに統合
/*! ツリーコントロールの初期化:C++メソッドツリー */
void CDlgFuncList::SetTreeCpp( HWND hwndDlg )
{
int i;
char szText[2048];
CFuncInfo* pcFuncInfo;
HWND hwndTree;
int bSelected;
int nFuncLineOld;
int nSelectedLine;
TV_INSERTSTRUCT tvis;
char* pWork;
char* pPos;
char* pClassName;
char* pFuncName;
// Jul. 7, 2001 genta
char szLabel[64];
HTREEITEM htiGlobal;
HTREEITEM htiClass;
HTREEITEM htiItem;
HTREEITEM htiItemOld;
HTREEITEM htiSelected;
TV_ITEM tvi;
// char szText[2048];
::EnableWindow( ::GetDlgItem( m_hWnd , IDC_BUTTON_COPY ), TRUE );
hwndTree = ::GetDlgItem( m_hWnd, IDC_TREE1 );
tvis.hParent = TVI_ROOT;
tvis.hInsertAfter = TVI_LAST;
tvis.item.mask = TVIF_TEXT | TVIF_PARAM;
tvis.item.pszText = "グローバル";
tvis.item.lParam = -1;
htiGlobal = TreeView_InsertItem( hwndTree, &tvis );
nFuncLineOld = 0;
bSelected = FALSE;
htiItemOld = NULL;
for( i = 0; i < m_pcFuncInfoArr->GetNum(); ++i ){
pcFuncInfo = m_pcFuncInfoArr->GetAt( i );
pWork = pcFuncInfo->m_cmemFuncName.GetPtr();
/* クラス名::メソッドの場合 */
if( NULL != ( pPos = strstr( pWork, "::" ) ) ){
// Apr. 1, 2000 genta
// 追加文字列を全角にしたのでメモリもそれだけ必要
// 6 == strlen( "クラス" ), 1 == strlen( '\0' )
pClassName = new char[pPos - pWork + 6 + 1 ];
memcpy( pClassName, pWork, pPos - pWork );
strcpy( &pClassName[pPos - pWork], "クラス" );
pFuncName = new char[ lstrlen( pPos + lstrlen( "::" ) ) + 1 ];
strcpy( pFuncName, pPos + lstrlen( "::" ) );
/* クラス名のアイテムが登録されているか */
htiClass = TreeView_GetFirstVisible( hwndTree );
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 ){
tvis.hParent = TVI_ROOT;
tvis.hInsertAfter = TVI_LAST;
tvis.item.mask = TVIF_TEXT | TVIF_PARAM;
tvis.item.pszText = pClassName;
tvis.item.lParam = -1;
htiClass = TreeView_InsertItem( hwndTree, &tvis );
}
/* 該当クラス名のアイテムの子として、メソッドのアイテムを登録 */
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\r\n",
m_pcFuncInfoArr->m_szFilePath, /* 解析対象ファイル名 */
pcFuncInfo->m_nFuncLineCRLF, /* 検出行番号 */
pcFuncInfo->m_cmemFuncName.GetPtr() /* 検出結果 */
);
// m_cmemClipText.Append( (const char *)szText, lstrlen( szText ) ); /* クリップボードコピー用テキスト */
m_cmemClipText.AppendSz( (const char *)szText ); /* クリップボードコピー用テキスト */
}else{
/* グローバル関数の場合 */
pClassName = NULL;
pFuncName = new char[ lstrlen( pWork ) + 1 ];
strcpy( pFuncName, pWork );
strcpy( szText, pFuncName );
/* 関数宣言か */
if( 1 == pcFuncInfo->m_nInfo ){
strcat( szText, "(宣言)" );
}
/* グローバル関数のアイテムを登録 */
tvis.hParent = htiGlobal;
tvis.hInsertAfter = TVI_LAST;
tvis.item.mask = TVIF_TEXT | TVIF_PARAM;
tvis.item.pszText = szText;
tvis.item.lParam = i;
htiItem = TreeView_InsertItem( hwndTree, &tvis );
/* 関数宣言か */
if( 1 == pcFuncInfo->m_nInfo ){
/* クリップボードにコピーするテキストを編集 */
wsprintf( szText, "%s(%d): %s(宣言)\r\n",
m_pcFuncInfoArr->m_szFilePath, /* 解析対象ファイル名 */
pcFuncInfo->m_nFuncLineCRLF, /* 検出行番号 */
pcFuncInfo->m_cmemFuncName.GetPtr() /* 検出結果 */
);
// m_cmemClipText.Append( (const char *)szText, lstrlen( szText ) ); /* クリップボードコピー用テキスト */
m_cmemClipText.AppendSz( (const char *)szText ); /* クリップボードコピー用テキスト */
}else{
/* クリップボードにコピーするテキストを編集 */
wsprintf( szText, "%s(%d): %s\r\n",
m_pcFuncInfoArr->m_szFilePath, /* 解析対象ファイル名 */
pcFuncInfo->m_nFuncLineCRLF, /* 検出行番号 */
pcFuncInfo->m_cmemFuncName.GetPtr() /* 検出結果 */
);
// m_cmemClipText.Append( (const char *)szText, lstrlen( szText ) ); /* クリップボードコピー用テキスト */
m_cmemClipText.AppendSz( (const char *)szText ); /* クリップボードコピー用テキスト */
}
}
/* 現在カーソル位置のメソッドかどうか調べる */
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;
if( NULL != pClassName ){
delete [] pClassName;
pClassName = NULL;
}
if( NULL != pFuncName ){
delete [] pFuncName;
pFuncName = NULL;
}
htiItemOld = htiItem;
}
/* ソート、ノードの展開をする */
// 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;
}
#endif
/*! ツリーコントロールの初期化:Javaメソッドツリー
Java Method Treeの構築: 関数リストを元にTreeControlを初期化する。
@date 2002.01.04 genta C++ツリーを統合
*/
void CDlgFuncList::SetTreeJava( HWND hwndDlg, BOOL bAddClass )
{
int i;
char szText[2048];
CFuncInfo* pcFuncInfo;
HWND hwndTree;
int bSelected;
int nFuncLineOld;
int nSelectedLine;
TV_INSERTSTRUCT tvis;
char* pWork;
char* pPos;
char* pClassName;
char* pFuncName;
char szLabel[64+6]; // Jan. 07, 2001 genta クラス名エリアの拡大
HTREEITEM htiGlobal = NULL; // Jan. 04, 2001 genta C++と統合
HTREEITEM htiClass;
HTREEITEM htiItem;
HTREEITEM htiItemOld;
HTREEITEM htiSelected;
TV_ITEM tvi;
int nClassNest;
int nDummylParam = -64000; // 2002.11.10 Moca クラス名のダミーlParam ソートのため
char szClassArr[16][64]; // Jan. 04, 2001 genta クラス名エリアの拡大
::EnableWindow( ::GetDlgItem( m_hWnd , IDC_BUTTON_COPY ), TRUE );
hwndTree = ::GetDlgItem( m_hWnd, IDC_TREE1 );
nFuncLineOld = 0;
bSelected = FALSE;
htiItemOld = NULL;
for( i = 0; i < m_pcFuncInfoArr->GetNum(); ++i ){
pcFuncInfo = m_pcFuncInfoArr->GetAt( i );
pWork = pcFuncInfo->m_cmemFuncName.GetPtr();
/* クラス名::メソッドの場合 */
if( NULL != ( pPos = strstr( pWork, "::" ) ) ){
/* インナークラスのネストレベルを調べる */
int k, m;
int nWorkLen;
int nCharChars;
nClassNest = 0;
m = 0;
nWorkLen = lstrlen( pWork );
for( k = 0; k < nWorkLen; ++k ){
nCharChars = CMemory::MemCharNext( pWork, nWorkLen, &pWork[k] ) - &pWork[k];
if( 1 == nCharChars && ':' == pWork[k] ){
// Jan. 04, 2001 genta
// C++の統合のため、\に加えて::をクラス区切りとみなすように
if( k < nWorkLen - 1 && ':' == pWork[k+1] ){
memcpy( szClassArr[nClassNest], &pWork[m], k - m );
szClassArr[nClassNest][k - m] = '\0';
++nClassNest;
m = k + 2;
++k;
}
else
break;
}
else if( 1 == nCharChars && '\\' == pWork[k] ){
memcpy( szClassArr[nClassNest], &pWork[m], k - m );
szClassArr[nClassNest][k - m] = '\0';
++nClassNest;
m = k + 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -