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

📄 crecent.cpp

📁 日本的开源编辑器源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	if( nDstIndex < 0 || nDstIndex >= m_nArrayCount ) return false;

	if( nSrcIndex == nDstIndex ) return true;

	memcpy( GetArrayOffset( nDstIndex ), GetArrayOffset( nSrcIndex ), m_nItemSize );

	//(void)SetFavorite( nDstIndex, IsFavorite( nSrcIndex ) );
	//内部処理しないとだめ。
	if( m_pbUserItemFavorite ) m_pbUserItemFavorite[nDstIndex] = m_pbUserItemFavorite[nSrcIndex];

	return true;
}

/*
	アイテムをゼロクリアする。
*/
void CRecent::ZeroItem( int nIndex )
{
	if( ! IsAvailable() ) return;
	if( nIndex < 0 || nIndex >= m_nArrayCount ) return;

	memset( GetArrayOffset( nIndex ), 0, m_nItemSize );

	//(void)SetFavorite( nIndex, false );
	//内部処理しないとだめ。
	if( m_pbUserItemFavorite ) m_pbUserItemFavorite[nIndex] = false;

	return;
}

/*
	アイテムを削除する。
*/
bool CRecent::DeleteItem( int nIndex )
{
	int	i;

	if( ! IsAvailable() ) return false;
	if( nIndex < 0 || nIndex >= *m_pnUserItemCount ) return false;

	ZeroItem( nIndex );

	//以降のアイテムを前に詰める。
	for( i = nIndex; i < *m_pnUserItemCount - 1; i++ )
	{
		CopyItem( i + 1, i );
	}
	ZeroItem( i );

	*m_pnUserItemCount -= 1;

	return true;
}

/*
	すべてのアイテムを削除する。

	@note	ゼロクリアを可能とするため、すべてが対象になる。
*/
void CRecent::DeleteAllItem( void )
{
	int	i;

	if( ! IsAvailable() ) return;

	for( i = 0; i < m_nArrayCount; i++ )
	{
		ZeroItem( i );
	}

	*m_pnUserItemCount = 0;

	return;
}

/*
	アイテムを取得する。

	@note	取得後のポインタはユーザ管理の構造体にキャストして参照してください。
*/
const char *CRecent::GetItem( int nIndex )
{
	if( ! IsAvailable() ) return NULL;
	if( nIndex < 0 || nIndex >= *m_pnUserItemCount ) return NULL;

	return GetArrayOffset( nIndex );
}

/*
	アイテムの比較要素を取得する。

	@note	取得後のポインタはユーザ管理の構造体にキャストして参照してください。
*/
const char *CRecent::GetDataOfItem( int nIndex )
{
	const char	*p;

	if( ! IsAvailable() ) return NULL;
	if( nIndex < 0 || nIndex >= *m_pnUserItemCount ) return NULL;

	p = GetItem( nIndex );
	if( NULL == p ) return NULL;

	return &p[ m_nOffset ];
}

/*
	アイテムを先頭に追加する。

	@note	すでに登録済みの場合は先頭に移動する。
	@note	いっぱいのときは最古のアイテムを削除する。
	@note	お気に入りは削除されない。
*/
bool CRecent::AppendItem( const char *pszItemData )
{
	int		nIndex;
	int		i;
	char	*p;

	if( ! IsAvailable() ) return false;
	if( NULL == pszItemData ) return false;

	//登録済みか調べる。
	nIndex = FindItem( &pszItemData[ m_nOffset ] );
	if( nIndex >= 0 )
	{
		//最新の情報に更新する。
		if( m_nCmpSize > 0 )
			memcpy( GetArrayOffset( nIndex ), pszItemData, m_nItemSize );
		else	//文字列として受け取る。
		{
			p = GetArrayOffset( nIndex );
			strncpy( p, pszItemData, m_nItemSize );
			p[ m_nItemSize - 1 ] = '\0';
			
		}

		//先頭に持ってくる。
		(void)MoveItem( nIndex, 0 );
		goto reconfigure;
	}

	//いっぱいのときは最古の通常アイテムを削除する。
	if( m_nArrayCount <= *m_pnUserItemCount )
	{
		nIndex = GetOldestItem( *m_pnUserItemCount - 1, false );
		if( -1 == nIndex )
		{
			return false;
		}

		(void)DeleteItem( nIndex );
	}

	for( i = *m_pnUserItemCount; i > 0; i-- )
	{
		CopyItem( i - 1, i );
	}

	if( m_nCmpSize > 0 )
		memcpy( GetArrayOffset( 0 ), pszItemData, m_nItemSize );
	else	//文字列として受け取る。
	{
		p = GetArrayOffset( 0 );
		strncpy( p, pszItemData, m_nItemSize );
		p[ m_nItemSize - 1 ] = '\0';
	}

	//(void)SetFavorite( 0, true );
	//内部処理しないとだめ。
	if( m_pbUserItemFavorite ) m_pbUserItemFavorite[0] = false;

	*m_pnUserItemCount += 1;


reconfigure:
	//お気に入りを表示内に移動する。
	if( m_pnUserViewCount )
	{
		(void)ChangeViewCount( *m_pnUserViewCount );
	}
	return true;
}

/*
	アイテムを検索する。
*/
int CRecent::FindItem( const char *pszItemData )
{
	int	i;
	const char	*p, *q;

	if( ! IsAvailable() ) return -1;
	if( NULL == pszItemData ) return -1;

	//p = &pszItemData[m_nOffset];
	p = pszItemData;

	for( i = 0; i < *m_pnUserItemCount; i++ )
	{
		q = GetArrayOffset( i ) + m_nOffset;

		switch( m_nCmpType )
		{
		case RECENT_CMP_STRICMP:	//stricmp
			if( stricmp( p, q ) == 0 ) return i;
			break;

		case RECENT_CMP_STRNCMP:	//strncmp
			if( strncmp( p, q, m_nCmpSize ) == 0 ) return i;
			break;

		case RECENT_CMP_STRNICMP:	//strnicmp
			if( strnicmp( p, q, m_nCmpSize ) == 0 ) return i;
			break;

		case RECENT_CMP_MEMCMP:		//memcmp
			if( memcmp( p, q, m_nCmpSize ) == 0 ) return i;
			break;

		case RECENT_CMP_MEMICMP:	//memicmp
			if( memicmp( p, q, m_nCmpSize ) == 0 ) return i;
			break;

		case RECENT_CMP_STRCMP:		//strcmp
		default:
			if( strcmp( p, q ) == 0 ) return i;
			break;
		}
	}

	return -1;
}

bool CRecent::EasyCreate( int nRecentType )
{
	switch( nRecentType )
	{
	case RECENT_FOR_FILE:	//ファイル
		return Create(
			(char*)m_pShareData->m_fiMRUArr,
			&m_pShareData->m_nMRUArrNum,
			m_pShareData->m_bMRUArrFavorite,
			MAX_MRU,
			&(m_pShareData->m_Common.m_nMRUArrNum_MAX),
			sizeof( FileInfo ),
			(int)(&((FileInfo*)0)->m_szPath[0]),
			sizeof( ((FileInfo*)0)->m_szPath ),	//_MAX_PATH
			RECENT_CMP_STRICMP
		);

	case RECENT_FOR_FOLDER:	//フォルダ
		return Create(
			(char*)m_pShareData->m_szOPENFOLDERArr,
			&m_pShareData->m_nOPENFOLDERArrNum,
			m_pShareData->m_bOPENFOLDERArrFavorite,
			MAX_OPENFOLDER,
			&(m_pShareData->m_Common.m_nOPENFOLDERArrNum_MAX),
			sizeof( m_pShareData->m_szOPENFOLDERArr[0] ),	//_MAX_PATH
			0,
			0,	//AppendItemのデータは文字列
			RECENT_CMP_STRICMP
		);

	case RECENT_FOR_SEARCH:	//検索
		return Create(
			(char*)m_pShareData->m_szSEARCHKEYArr,
			&m_pShareData->m_nSEARCHKEYArrNum,
			NULL /*m_pShareData->m_bSEARCHKEYArrFavorite*/,
			MAX_SEARCHKEY,
			NULL,
			sizeof( m_pShareData->m_szSEARCHKEYArr[0] ),	//_MAX_PATH
			0,
			0,	//AppendItemのデータは文字列
			RECENT_CMP_STRCMP
		);

	case RECENT_FOR_REPLACE:	//置換
		return Create(
			(char*)m_pShareData->m_szREPLACEKEYArr,
			&m_pShareData->m_nREPLACEKEYArrNum,
			NULL /*m_pShareData->m_bREPLACEKEYArrFavorite*/,
			MAX_REPLACEKEY,
			NULL,
			sizeof( m_pShareData->m_szREPLACEKEYArr[0] ),	//_MAX_PATH
			0,
			0,	//AppendItemのデータは文字列
			RECENT_CMP_STRCMP
		);

	case RECENT_FOR_GREP_FILE:	//GREPファイル
		return Create(
			(char*)m_pShareData->m_szGREPFILEArr,
			&m_pShareData->m_nGREPFILEArrNum,
			NULL /*m_pShareData->m_bGREPFILEArrFavorite*/,
			MAX_GREPFILE,
			NULL,
			sizeof( m_pShareData->m_szGREPFILEArr[0] ),	//_MAX_PATH
			0,
			0,	//AppendItemのデータは文字列
			RECENT_CMP_STRICMP
		);

	case RECENT_FOR_GREP_FOLDER:	//GREPフォルダ
		return Create(
			(char*)m_pShareData->m_szGREPFOLDERArr,
			&m_pShareData->m_nGREPFOLDERArrNum,
			NULL /*m_pShareData->m_bGREPFOLDERArrFavorite*/,
			MAX_GREPFOLDER,
			NULL,
			sizeof( m_pShareData->m_szGREPFOLDERArr[0] ),	//_MAX_PATH
			0,
			0,	//AppendItemのデータは文字列
			RECENT_CMP_STRICMP
		);

	case RECENT_FOR_CMD:	//コマンド
		return Create(
			(char*)m_pShareData->m_szCmdArr,
			&m_pShareData->m_nCmdArrNum,
			NULL /*m_pShareData->m_bCmdArrFavorite*/,
			MAX_CMDARR,
			NULL,
			sizeof( m_pShareData->m_szCmdArr[0] ),	//MAX_CMDLEN
			0,
			0,	//AppendItemのデータは文字列
			RECENT_CMP_STRCMP
		);

	//@@@ 2003.06.28 MIK 追加
	case RECENT_FOR_EDITNODE:	//ウインドウリスト
		return Create(
			(char*)m_pShareData->m_pEditArr,
			&m_pShareData->m_nEditArrNum,
			NULL,
			MAX_EDITWINDOWS,
			NULL,
			sizeof( m_pShareData->m_pEditArr[0] ),
			(int)(&((EditNode*)0)->m_hWnd),
			sizeof( ((EditNode*)0)->m_hWnd ),	//sizeof(HWND)
			RECENT_CMP_MEMCMP
		);

	case RECENT_FOR_TAGJUMP_KEYWORD:	//タグジャンプキーワード 2005.04.03 MIK
		return Create(
			(char*)m_pShareData->m_szTagJumpKeywordArr,
			&m_pShareData->m_nTagJumpKeywordArrNum,
			NULL /*m_pShareData->m_bTagJumpKeywordArrFavorite*/,
			MAX_TAGJUMP_KEYWORD,
			NULL,
			sizeof( m_pShareData->m_szTagJumpKeywordArr[0] ),	//_MAX_PATH
			0,
			0,	//AppendItemのデータは文字列
			RECENT_CMP_STRCMP
		);

	default:
		return false;
	}
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -