📄 cdlgfunclist.cpp
字号:
// $Id: CDlgFuncList.cpp,v 1.34 2005/04/29 02:29:44 genta Exp $
/*! @file
@brief アウトライン解析ダイアログボックス
@author Norio Nakatani
@date 2001/06/23 N.Nakatani Visual Basicのアウトライン解析
$Revision: 1.34 $
*/
/*
Copyright (C) 1998-2001, Norio Nakatani
Copyright (C) 2001, Stonee, JEPRO, genta, hor
Copyright (C) 2002, genta, MIK, aroka
Copyright (C) 2003, zenryaku
This source code is designed for sakura editor.
Please contact the copyright holder to use this code for other purpose.
*/
#include <windows.h>
#include <commctrl.h>
#include "sakura_rc.h"
#include "CDlgFuncList.h"
#include "etc_uty.h"
#include "debug.h"
#include "global.h"
#include "CEditView.h"
#include "funccode.h" //Stonee, 2001/03/12
#include "CFuncInfoArr.h"// 2002/2/3 aroka
#include "mymessage.h"// 2002/2/3 aroka
#include "Keycode.h"// 2002/2/10 aroka ヘッダ整理
#include "CEditDoc.h" // 2002/5/13 YAZAKI ヘッダ整理
//アウトライン解析 CDlgFuncList.cpp //@@@ 2002.01.07 add start MIK
#include "sakura.hh"
const DWORD p_helpids[] = { //12200
IDC_BUTTON_COPY, HIDC_FL_BUTTON_COPY, //コピー
IDOK, HIDOK_FL, //ジャンプ
IDCANCEL, HIDCANCEL_FL, //キャンセル
IDC_BUTTON_HELP, HIDC_FL_BUTTON_HELP, //ヘルプ
IDC_CHECK_bAutoCloseDlgFuncList, HIDC_FL_CHECK_bAutoCloseDlgFuncList, //自動的に閉じる
IDC_LIST1, HIDC_FL_LIST1, //トピックリスト
IDC_TREE1, HIDC_FL_TREE1, //トピックツリー
IDC_CHECK_bFunclistSetFocusOnJump ,HIDC_FL_CHECK_bFunclistSetFocusOnJump, //ジャンプでフォーカス移動する
IDC_CHECK_bMarkUpBlankLineEnable ,HIDC_FL_CHECK_bMarkUpBlankLineEnable, //空行を無視する
IDC_COMBO_nSortType, HIDC_COMBO_nSortType, //順序
// IDC_STATIC, -1,
0, 0
}; //@@@ 2002.01.07 add end MIK
/*! ソート比較用プロシージャ */
int CALLBACK _CompareFunc_( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort )
{
CFuncInfo* pcFuncInfo1;
CFuncInfo* pcFuncInfo2;
CDlgFuncList* pcDlgFuncList;
pcDlgFuncList = (CDlgFuncList*)lParamSort;
pcFuncInfo1 = pcDlgFuncList->m_pcFuncInfoArr->GetAt( lParam1 );
if( NULL == pcFuncInfo1 ){
return -1;
}
pcFuncInfo2 = pcDlgFuncList->m_pcFuncInfoArr->GetAt( lParam2 );
if( NULL == pcFuncInfo2 ){
return -1;
}
// Apr. 23, 2005 genta 行番号を左端へ
if( 1 == pcDlgFuncList->m_nSortCol){ /* ソートする列番号 */
return strcmp( pcFuncInfo1->m_cmemFuncName.GetPtr(), pcFuncInfo2->m_cmemFuncName.GetPtr() );
}
// Apr. 23, 2005 genta 行番号を左端へ
if( 0 == pcDlgFuncList->m_nSortCol){ /* ソートする列番号 */
if( pcFuncInfo1->m_nFuncLineCRLF < pcFuncInfo2->m_nFuncLineCRLF ){
return -1;
}else
if( pcFuncInfo1->m_nFuncLineCRLF == pcFuncInfo2->m_nFuncLineCRLF ){
return 0;
}else{
return 1;
}
}
// From Here 2001.12.07 hor
if( 2 == pcDlgFuncList->m_nSortCol){ /* ソートする列番号 */
if( pcFuncInfo1->m_nInfo < pcFuncInfo2->m_nInfo ){
return -1;
}else
if( pcFuncInfo1->m_nInfo == pcFuncInfo2->m_nInfo ){
return 0;
}else{
return 1;
}
}
// To Here 2001.12.07 hor
return -1;
}
CDlgFuncList::CDlgFuncList()
{
m_pcFuncInfoArr = NULL; /* 関数情報配列 */
m_nCurLine = 0; /* 現在行 */
// Apr. 23, 2005 genta 行番号を左端へ
m_nSortCol = 0; /* ソートする列番号 2004.04.06 zenryaku 標準は行番号(1列目) */
m_bLineNumIsCRLF = FALSE; /* 行番号の表示 FALSE=折り返し単位/TRUE=改行単位 */
m_bWaitTreeProcess = false; // 2002.02.16 hor Treeのダブルクリックでフォーカス移動できるように 2/4
m_nSortType = 0;
return;
}
// /* モーダルダイアログの表示 */
// int CDlgFuncList::DoModal(
// HINSTANCE hInstance,
// HWND hwndParent,
// LPARAM lParam,
// CFuncInfoArr* pcFuncInfoArr,
// int nCurLine,
// int nListType,
// int bLineNumIsCRLF /* 行番号の表示 FALSE=折り返し単位/TRUE=改行単位 */
// )
// {
// m_pcFuncInfoArr = pcFuncInfoArr; /* 関数情報配列 */
// m_nCurLine = nCurLine; /* 現在行 */
// m_nListType = nListType; /* 一覧の種類 */
// m_bLineNumIsCRLF = bLineNumIsCRLF; /* 行番号の表示 FALSE=折り返し単位/TRUE=改行単位 */
// return CDialog::DoModal( hInstance, hwndParent, IDD_FUNCLIST, lParam );
// }
/* モードレスダイアログの表示 */
HWND CDlgFuncList::DoModeless(
HINSTANCE hInstance,
HWND hwndParent,
LPARAM lParam,
CFuncInfoArr* pcFuncInfoArr,
int nCurLine,
int nListType,
int bLineNumIsCRLF /* 行番号の表示 FALSE=折り返し単位/TRUE=改行単位 */
)
{
m_pcFuncInfoArr = pcFuncInfoArr; /* 関数情報配列 */
m_nCurLine = nCurLine; /* 現在行 */
m_nListType = nListType; /* 一覧の種類 */
m_bLineNumIsCRLF = bLineNumIsCRLF; /* 行番号の表示 FALSE=折り返し単位/TRUE=改行単位 */
return CDialog::DoModeless( hInstance, hwndParent, IDD_FUNCLIST, lParam, SW_SHOW );
}
/* モードレス時:検索対象となるビューの変更 */
void CDlgFuncList::ChangeView( LPARAM pcEditView )
{
m_lParam = pcEditView;
return;
}
/*! ダイアログデータの設定 */
void CDlgFuncList::SetData( void/*HWND hwndDlg*/ )
{
int i;
char szText[2048];
CFuncInfo* pcFuncInfo;
LV_ITEM item;
HWND hwndList;
HWND hwndTree;
int bSelected;
int nFuncLineOld;
int nSelectedLine;
RECT rc;
hwndList = ::GetDlgItem( m_hWnd, IDC_LIST1 );
hwndTree = ::GetDlgItem( m_hWnd, IDC_TREE1 );
//2002.02.08 hor 隠しといてアイテム削除→あとで表示
::ShowWindow( hwndList, SW_HIDE );
::ShowWindow( hwndTree, SW_HIDE );
ListView_DeleteAllItems( hwndList );
TreeView_DeleteAllItems( hwndTree );
m_cmemClipText.SetDataSz( "" ); /* クリップボードコピー用テキスト */
if( OUTLINE_CPP == m_nListType ){ /* C++メソッドリスト */
// May 18, 2001 genta
// Windowがいなくなると後で都合が悪いので、表示しないだけにしておく
// ::DestroyWindow( hwndList );
// ::ShowWindow( hwndList, SW_HIDE );
m_nViewType = 1;
/* ツリーコントロールの初期化:C++メソッドツリー */
//SetTreeCpp( m_hWnd );
// Jan. 04, 2002 genta Java Method Treeに統合
SetTreeJava( m_hWnd, TRUE );
::SetWindowText( m_hWnd, "C++ メソッドツリー" );
}else
if( OUTLINE_FILE == m_nListType ){ //@@@ 2002.04.01 YAZAKI アウトライン解析にルールファイル導入
m_nViewType = 1;
SetTree();
::SetWindowText( m_hWnd, "ルールファイル" );
}else
if( OUTLINE_WZTXT == m_nListType ){ //@@@ 2003.05.20 zenryaku 階層付テキストアウトライン解析
m_nViewType = 1;
SetTree();
// 2003.06.22 Moca 名前変更
::SetWindowText( m_hWnd, "WZ階層付テキスト" );
}else
if( OUTLINE_HTML == m_nListType ){ //@@@ 2003.05.20 zenryaku HTMLアウトライン解析
m_nViewType = 1;
SetTree();
::SetWindowText( m_hWnd, "HTML" );
}else
if( OUTLINE_TEX == m_nListType ){ //@@@ 2003.07.20 naoh TeXアウトライン解析
m_nViewType = 1;
SetTree();
::SetWindowText( m_hWnd, "TeX" );
}else
if( OUTLINE_TEXT == m_nListType ){ /* テキスト?トピックリスト */
// May 18, 2001 genta
// Windowがいなくなると後で都合が悪いので、表示しないだけにしておく
//::DestroyWindow( hwndList );
// ::ShowWindow( hwndList, SW_HIDE );
m_nViewType = 1;
/* ツリーコントロールの初期化:テキストトピックツリー */
// SetTreeTxt();
SetTree(); //@@@ 2002.04.01 YAZAKI テキストトピックツリーも、汎用SetTreeを呼ぶように変更。
::SetWindowText( m_hWnd, "テキスト トピックツリー" );
}else
if( OUTLINE_JAVA == m_nListType ){ /* Javaメソッドツリー */
// May 18, 2001 genta
// Windowがいなくなると後で都合が悪いので、表示しないだけにしておく
// ::DestroyWindow( hwndList );
// ::ShowWindow( hwndList, SW_HIDE );
m_nViewType = 1;
/* ツリーコントロールの初期化:Javaメソッドツリー */
SetTreeJava( m_hWnd, TRUE );
::SetWindowText( m_hWnd, "Java メソッドツリー" );
}else
if( OUTLINE_COBOL == m_nListType ){ /* COBOL アウトライン */
// May 18, 2001 genta
// Windowがいなくなると後で都合が悪いので、表示しないだけにしておく
// ::DestroyWindow( hwndList );
// ::ShowWindow( hwndList, SW_HIDE );
m_nViewType = 1;
/* ツリーコントロールの初期化:COBOL アウトライン */
SetTreeJava( m_hWnd, FALSE );
::SetWindowText( m_hWnd, "COBOL アウトライン" );
}else
if( OUTLINE_VB == m_nListType ){ /* VisualBasic アウトライン */
// Jul 10, 2003 little YOSHI 処理が長くなったので独立
m_nViewType = 0;
/* リストビューコントロールの初期化:Visual Basic アウトライン */
SetListVB();
::SetWindowText( m_hWnd, "Visual Basic アウトライン" );
}else{
m_nViewType = 0;
switch( m_nListType ){
case OUTLINE_C:
::SetWindowText( m_hWnd, "C 関数一覧" );
break;
case OUTLINE_PLSQL:
::SetWindowText( m_hWnd, "PL/SQL 関数一覧" );
break;
case OUTLINE_ASM:
::SetWindowText( m_hWnd, "アセンブラ アウトライン" );
break;
case OUTLINE_PERL: // Sep. 8, 2000 genta
::SetWindowText( m_hWnd, "Perl 関数一覧" );
break;
// Jul 10, 2003 little YOSHI 上に移動しました--->>
// case OUTLINE_VB: // 2001/06/23 N.Nakatani for Visual Basic
// ::SetWindowText( m_hWnd, "Visual Basic アウトライン" );
// break;
// <<---ここまで
case OUTLINE_BOOKMARK:
LV_COLUMN col;
col.mask = LVCF_TEXT;
col.pszText = "テキスト";
col.iSubItem = 0;
// Apr. 23, 2005 genta 行番号を左端へ
ListView_SetColumn( hwndList, 1, &col );
::SetWindowText( m_hWnd, "ブックマーク" );
break;
// case OUTLINE_COBOL:
// ::SetWindowText( m_hWnd, "COBOLアウトライン" );
// break;
}
// May 18, 2001 genta
// Windowがいなくなると後で都合が悪いので、表示しないだけにしておく
//::DestroyWindow( hwndTree );
// ::ShowWindow( hwndTree, SW_HIDE );
::EnableWindow( ::GetDlgItem( m_hWnd , IDC_BUTTON_COPY ), TRUE );
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.lParam = i;
item.iSubItem = 0;
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;
if( 1 == pcFuncInfo->m_nInfo ){item.pszText = "宣言";}else
if( 10 == pcFuncInfo->m_nInfo ){item.pszText = "関数宣言";}else
if( 20 == pcFuncInfo->m_nInfo ){item.pszText = "プロシージャ宣言";}else
if( 11 == pcFuncInfo->m_nInfo ){item.pszText = "関数";}else
if( 21 == pcFuncInfo->m_nInfo ){item.pszText = "プロシージャ";}else
if( 31 == pcFuncInfo->m_nInfo ){item.pszText = "■パッケージ仕様部";}else
if( 41 == pcFuncInfo->m_nInfo ){item.pszText = "■パッケージ本体部";}else
if( 50 == pcFuncInfo->m_nInfo ){item.pszText = "PROC";}else
if( 51 == pcFuncInfo->m_nInfo ){item.pszText = "ラベル";}else
if( 52 == pcFuncInfo->m_nInfo ){item.pszText = "ENDP";}else{
// Jul 10, 2003 little YOSHI
// ここにあったVB関係の処理はSetListVB()メソッドに移動しました。
item.pszText = "";
}
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{
// 検出結果の種類(関数,,,)がないとき
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 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -