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

📄 cdlgfunclist.cpp

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