📄 cdlgfunclist.cpp
字号:
// 検出結果の種類(関数,,,)がないとき
wsprintf( szText, "%s(%d): %s\r\n",
m_pcFuncInfoArr->m_szFilePath, /* 解析対象ファイル名 */
pcFuncInfo->m_nFuncLineCRLF, /* 検出行番号 */
pcFuncInfo->m_cmemFuncName.GetPtr() /* 検出結果 */
);
}
m_cmemClipText.AppendSz( (const char *)szText ); /* クリップボードコピー用テキスト */
}
//2002.02.08 hor Listは列幅調整とかを実行する前に表示しとかないと変になる
::ShowWindow( hwndList, SW_SHOW );
/* 列の幅をデータに合わせて調整 */
ListView_SetColumnWidth( hwndList, 0, LVSCW_AUTOSIZE );
ListView_SetColumnWidth( hwndList, 1, LVSCW_AUTOSIZE );
ListView_SetColumnWidth( hwndList, 2, LVSCW_AUTOSIZE );
ListView_SetColumnWidth( hwndList, 0, ListView_GetColumnWidth( hwndList, 0 ) + 16 );
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 );
}
return;
}
#if 0
2002.04.01 YAZAKI もともと使用されていなかったため
void CDlgFuncList::GetTreeTextNext(
HWND hwndTree,
HTREEITEM htiParent,
int nDepth
)
{
HTREEITEM htiItem;
TV_ITEM tvi;
int i;
char szWork[1024];
if( NULL == htiParent ){
htiItem = TreeView_GetRoot( hwndTree );
}else{
htiItem = TreeView_GetChild( hwndTree, htiParent );
}
while( NULL != htiItem ){
tvi.mask = TVIF_HANDLE | TVIF_TEXT;
tvi.hItem = htiItem;
tvi.pszText = (LPSTR)szWork;
tvi.cchTextMax = sizeof( szWork );
TreeView_GetItem( hwndTree, &tvi );
for( i = 0; i < nDepth; ++i ){
// m_cmemClipText.Append( " ", 2 ); /* クリップボードコピー用テキスト */
m_cmemClipText.AppendSz( " " ); /* クリップボードコピー用テキスト */
}
// m_cmemClipText.Append( (const char *)tvi.pszText, lstrlen( (const char *)tvi.pszText ) ); /* クリップボードコピー用テキスト */
m_cmemClipText.AppendSz( (const char *)tvi.pszText ); /* クリップボードコピー用テキスト */
// m_cmemClipText.Append( (const char *)"\r\n", 2 ); /* クリップボードコピー用テキスト */
m_cmemClipText.AppendSz( (const char *)"\r\n" ); /* クリップボードコピー用テキスト */
GetTreeTextNext( hwndTree, htiItem, nDepth + 1 );
htiItem = TreeView_GetNextSibling( hwndTree, htiItem );
}
return;
}
#endif
/*! 汎用ツリーコントロールの初期化:CFuncInfo::m_nDepthを利用して親子を設定
@date 2002.04.01 YAZAKI
@date 2002.11.10 Moca 階層の制限をなくした
*/
void CDlgFuncList::SetTree()
{
HTREEITEM hItemSelected = NULL;
HWND hwndTree = ::GetDlgItem( m_hWnd, IDC_TREE1 );
int i;
int nFuncInfoArrNum = m_pcFuncInfoArr->GetNum();
int nStackPointer = 0;
int nStackDepth = 32; // phParentStack の確保している数
HTREEITEM* phParentStack;
phParentStack = (HTREEITEM*)malloc( nStackDepth * sizeof( HTREEITEM ) );
phParentStack[ nStackPointer ] = TVI_ROOT;
for (i = 0; i < nFuncInfoArrNum; i++){
CFuncInfo* pcFuncInfo = m_pcFuncInfoArr->GetAt(i);
/* 新しいアイテムを作成
現在の親の下にぶら下げる形で、最後に追加する。
*/
HTREEITEM hItem;
TV_INSERTSTRUCT cTVInsertStruct;
cTVInsertStruct.hParent = phParentStack[ nStackPointer ];
cTVInsertStruct.hInsertAfter = TVI_LAST; // 必ず最後に追加。
cTVInsertStruct.item.mask = TVIF_TEXT | TVIF_PARAM;
cTVInsertStruct.item.pszText = pcFuncInfo->m_cmemFuncName.GetPtr();
cTVInsertStruct.item.lParam = i; // あとでこの数値(=m_pcFuncInfoArrの何番目のアイテムか)を見て、目的地にジャンプするぜ!!。
/* 親子関係をチェック
*/
if (nStackPointer != pcFuncInfo->m_nDepth){
// レベルが変わりました!!
// ※が、2段階深くなることは考慮していないので注意。
// もちろん、2段階以上浅くなることは考慮済み。
// 2002.11.10 Moca 追加 確保したサイズでは足りなくなった。再確保
if( nStackDepth <= pcFuncInfo->m_nDepth + 1 ){
nStackDepth = pcFuncInfo->m_nDepth + 4; // 多めに確保しておく
HTREEITEM* phTi;
phTi = (HTREEITEM*)realloc( phParentStack, nStackDepth * sizeof( HTREEITEM ) );
if( NULL != phTi ){
phParentStack = phTi;
}else{
goto end_of_func;
}
}
nStackPointer = pcFuncInfo->m_nDepth;
cTVInsertStruct.hParent = phParentStack[ nStackPointer ];
}
hItem = TreeView_InsertItem( hwndTree, &cTVInsertStruct );
phParentStack[ nStackPointer+1 ] = hItem;
/* pcFuncInfoに登録されている行数を確認して、選択するアイテムを考える
*/
if ( pcFuncInfo->m_nFuncLineLAYOUT <= m_nCurLine ){
hItemSelected = hItem;
}
/* クリップボードコピー用テキストを作成する */
// 2003.06.22 Moca dummy要素はツリーに入れるがTAGJUMPには加えない
if( pcFuncInfo->IsAddClipText() ){
int j;
for( j = 0; j < nStackPointer; ++j ){
m_cmemClipText.AppendSz( " " );
}
m_cmemClipText.AppendSz( (const char *)pcFuncInfo->m_cmemFuncName.GetPtr() );
m_cmemClipText.AppendSz( (const char *)"\r\n" );
}
}
end_of_func:;
::EnableWindow( ::GetDlgItem( m_hWnd , IDC_BUTTON_COPY ), TRUE );
if( NULL != hItemSelected ){
/* 現在カーソル位置のメソッドを選択状態にする */
TreeView_SelectItem( hwndTree, hItemSelected );
}
free( phParentStack );
}
#if 0
2002.04.01 YAZAKI SetTreeTxt()、SetTreeTxtNest()は廃止。汎用のSetTree()を使うようにしました。
/* ツリーコントロールの初期化:テキスト トピックツリー */
void CDlgFuncList::SetTreeTxt()
{
HWND hwndTree;
int nBgn;
HTREEITEM htiItem;
HTREEITEM htiItemSelected;
TV_INSERTSTRUCT tvis;
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;
htiItem = TreeView_InsertItem( hwndTree, &tvis );
::EnableWindow( ::GetDlgItem( m_hWnd , IDC_BUTTON_COPY ), TRUE );
nBgn = 0;
htiItemSelected = NULL;
SetTreeTxtNest( hwndTree, htiItem, 0, m_pcFuncInfoArr->GetNum(), &htiItemSelected, 0 );
// TreeView_Expand( hwndTree, htiItem, TVE_EXPAND );
if( NULL != htiItemSelected ){
/* 現在カーソル位置のメソッドを選択状態にする */
TreeView_SelectItem( hwndTree, htiItemSelected );
}
return;
}
/* ツリーコントロールの初期化:テキスト トピックツリー 再帰サブ関数 */
int CDlgFuncList::SetTreeTxtNest(
HWND hwndTree,
HTREEITEM htiParent,
int nBgn,
int nEnd,
HTREEITEM* phtiItemSelected,
int nDepth
)
{
CFuncInfo* pcFuncInfoNext;
CFuncInfo* pcFuncInfo;
CFuncInfo* pcFuncInfo2;
unsigned char* pWork;
unsigned char* pWork2;
int nCharChars;
int nCharChars2;
int i;
TV_INSERTSTRUCT tvis;
HTREEITEM htiItem;
while( nBgn < nEnd ){
/* トピック情報取得 */
pcFuncInfo = m_pcFuncInfoArr->GetAt( nBgn );
pWork = (unsigned char*)pcFuncInfo->m_cmemFuncName.GetPtr();
nCharChars = CMemory::MemCharNext( (char*)pWork, lstrlen( (char*)pWork ), (char*)pWork ) - (char*)pWork;
tvis.hParent = htiParent;
tvis.hInsertAfter = TVI_LAST;
tvis.item.mask = TVIF_TEXT | TVIF_PARAM;
tvis.item.pszText = (char*)pWork;
tvis.item.lParam = nBgn;
htiItem = TreeView_InsertItem( hwndTree, &tvis );
for( i = 0; i < nDepth; ++i ){
// m_cmemClipText.Append( " ", 2 ); /* クリップボードコピー用テキスト */
m_cmemClipText.AppendSz( " " ); /* クリップボードコピー用テキスト */
}
// m_cmemClipText.Append( (const char *)pWork, lstrlen( (const char *)pWork ) ); /* クリップボードコピー用テキスト */
m_cmemClipText.AppendSz( (const char *)pWork ); /* クリップボードコピー用テキスト */
// m_cmemClipText.Append( (const char *)"\r\n", 2 ); /* クリップボードコピー用テキスト */
m_cmemClipText.AppendSz( (const char *)"\r\n" ); /* クリップボードコピー用テキスト */
/* 現在カーソル位置のメソッドかどうか調べる */
if( nBgn == 0 && m_nCurLine < pcFuncInfo->m_nFuncLineLAYOUT ){
/* 現在カーソル位置のメソッドを選択状態にする */
// TreeView_SelectItem( hwndTree, htiItem );
*phtiItemSelected = htiItem;
}else{
if( nBgn + 1 < m_pcFuncInfoArr->GetNum() ){
pcFuncInfoNext = m_pcFuncInfoArr->GetAt( nBgn + 1 );
if( m_nCurLine >= pcFuncInfo->m_nFuncLineLAYOUT &&
m_nCurLine < pcFuncInfoNext->m_nFuncLineLAYOUT
){
/* 現在カーソル位置のメソッドを選択状態にする */
// TreeView_SelectItem( hwndTree, htiItem );
*phtiItemSelected = htiItem;
}
}else{
if( m_nCurLine >= pcFuncInfo->m_nFuncLineLAYOUT ){
/* 現在カーソル位置のメソッドを選択状態にする */
// TreeView_SelectItem( hwndTree, htiItem );
*phtiItemSelected = htiItem;
}
}
}
for( i = nBgn + 1; i < nEnd; ++i ){
pcFuncInfo2 = m_pcFuncInfoArr->GetAt( i );
pWork2 = (unsigned char*)pcFuncInfo2->m_cmemFuncName.GetPtr();
nCharChars2 = CMemory::MemCharNext( (char*)pWork2, lstrlen( (char*)pWork2 ), (char*)pWork2 ) - (char*)pWork2;
if( nCharChars == nCharChars2 ){
if( nCharChars == 1 ){
/* 半角数字 */
if( pWork[0] >= '0' && pWork[0] <= '9' &&
pWork2[0] >= '0' && pWork2[0] <= '9' ){
break;
}
}else
if( nCharChars == 2 ){
/* 全角数字 */
if( pWork[0] == 0x82 && ( pWork[1] >= 0x4f && pWork[1] <= 0x58 ) &&
pWork2[0] == 0x82 && ( pWork2[1] >= 0x4f && pWork2[1] <= 0x58 ) ){
break;
}
/* ①~? */
if( pWork[0] == 0x87 && ( pWork[1] >= 0x40 && pWork[1] <= 0x53 ) &&
pWork2[0] == 0x87 && ( pWork2[1] >= 0x40 && pWork2[1] <= 0x53 ) ){
break;
}
/* Ⅰ~Ⅹ */
if( pWork[0] == 0x87 && ( pWork[1] >= 0x54 && pWork[1] <= 0x5d ) &&
pWork2[0] == 0x87 && ( pWork2[1] >= 0x54 && pWork2[1] <= 0x5d ) ){
break;
}
}
if( 0 == memcmp( pWork, pWork2, nCharChars ) ){
break;
}
}
}
SetTreeTxtNest( hwndTree, htiItem, nBgn + 1, i, phtiItemSelected, nDepth + 1 );
// TreeView_Expand( hwndTree, htiItem, TVE_EXPAND );
nBgn = i;
}
return 1;
}
#endif
BOOL CDlgFuncList::OnInitDialog( HWND hwndDlg, WPARAM wParam, LPARAM lParam )
{
m_hWnd = hwndDlg;
HWND hwndList;
int nCxVScroll;
int nColWidthArr[3] = { 0, 46, 80 };
RECT rc;
LV_COLUMN col;
hwndList = ::GetDlgItem( hwndDlg, IDC_LIST1 );
// hwndTree = ::GetDlgItem( m_hWnd, IDC_TREE1 );
::GetWindowRect( hwndList, &rc );
nCxVScroll = ::GetSystemMetrics( SM_CXVSCROLL );
col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
col.fmt = LVCFMT_LEFT;
col.cx = rc.right - rc.left - ( nColWidthArr[1] + nColWidthArr[2] ) - nCxVScroll - 8;
// Apr. 23, 2005 genta 行番号を左端へ
col.pszText = "行 *";
col.iSubItem = 0;
ListView_InsertColumn( hwndList, 0, &col);
col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
col.fmt = LVCFMT_LEFT;
col.cx = nColWidthArr[1];
// Apr. 23, 2005 genta 行番号を左端へ
col.pszText = "関数名";
col.iSubItem = 1;
ListView_InsertColumn( hwndList, 1, &col);
col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
col.fmt = LVCFMT_LEFT;
col.cx = nColWidthArr[2];
col.pszText = " ";
col.iSubItem = 2;
ListView_InsertColumn( hwndList, 2, &col);
/* 基底クラスメンバ */
CreateSizeBox();
return CDialog::OnInitDialog( hwndDlg, wParam, lParam );
}
BOOL CDlgFuncList::OnBnClicked( int wID )
{
switch( wID ){
case IDC_BUTTON_HELP:
/* 「アウトライン解析」のヘルプ */
//Apr. 5, 2001 JEPRO 修正漏れを追加 (Stonee, 2001/03/12 第四引数を、機能番号からヘルプトピック番号を調べるようにした)
::WinHelp( m_hWnd, m_szHelpFile, HELP_CONTEXT, ::FuncID_To_HelpContextID(F_OUTLINE) );
return TRUE;
case IDOK:
return OnJump();
case IDCANCEL:
if( m_bModal ){ /* モーダル ダイアログか */
::EndDialog( m_hWnd, 0 );
}else{
::DestroyWindow( m_hWnd );
}
return TRUE;
case IDC_BUTTON_COPY:
// Windowsクリップボードにコピー
// 2004.02.17 Moca 関数化
SetClipboardText( m_hWnd, m_cmemClipText.GetPtr(), m_cmemClipText.GetLength() );
return TRUE;
//2002.02.08 オプション切替後List/Treeにフォーカス移動
case IDC_CHECK_bAutoCloseDlgFuncList:
case IDC_CHECK_bMarkUpBlankLineEnable:
case IDC_CHECK_bFunclistSetFocusOnJump:
m_pShareData->m_Common.m_bAutoCloseDlgFuncList = ::IsDlgButtonChecked( m_hWnd, IDC_CHECK_bAutoCloseDlgFuncList );
m_pShareData->m_Common.m_bMarkUpBlankLineEnable = ::IsDlgButtonChecked( m_hWnd, IDC_CHECK_bMarkUpBlankLineEnable );
m_pShareData->m_Common.m_bFunclistSetFocusOnJump = ::IsDlgButtonChecked( m_hWnd, IDC_CHECK_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 );
}
if(wID==IDC_CHECK_bMarkUpBlankLineEnable&&m_nListType==OUTLINE_BOOKMARK){
CEditView* pcEditView=(CEditView*)m_lParam;
pcEditView->HandleCommand( F_BOOKMARK_VIEW, TRUE, TRUE, 0, 0, 0 );
m_nCurLine=pcEditView->m_nCaretPosY + 1;
SetData();
}else
if(m_nViewType){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -