⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdlgfunclist.cpp

📁 日本的开源编辑器源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//	$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 + -