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

📄 cproptypesregex.cpp

📁 日本的开源编辑器源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				if( nIndex2 <= 1 ) return TRUE;
				nIndex2 = nIndex - 1;
				ListView_GetItemText(hwndList, nIndex, 0, szKeyWord, sizeof(szKeyWord));
				ListView_GetItemText(hwndList, nIndex, 1, szColorIndex, sizeof(szColorIndex));
				ListView_DeleteItem(hwndList, nIndex);	//古いキーを削除
				//キーを追加する。
				lvi.mask     = LVIF_TEXT | LVIF_PARAM;
				lvi.pszText  = szKeyWord;
				lvi.iItem    = nIndex2;
				lvi.iSubItem = 0;
				lvi.lParam   = 0;
				ListView_InsertItem( hwndList, &lvi );
				lvi.mask     = LVIF_TEXT;
				lvi.iItem    = nIndex2;
				lvi.iSubItem = 1;
				lvi.pszText  = szColorIndex;
				ListView_SetItem( hwndList, &lvi );
				//移動したキーを選択状態にする。
				ListView_SetItemState( hwndList, nIndex2, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED );
				GetData_Regex( hwndDlg );
				return TRUE;

			case IDC_BUTTON_REGEX_DOWN:	/* 下へ */
				nIndex = ListView_GetNextItem( hwndList, -1, LVNI_ALL | LVNI_SELECTED );
				if( -1 == nIndex ) return FALSE;
				nIndex2 = ListView_GetItemCount(hwndList);
				if( nIndex2 - 1 == nIndex ) return TRUE;	//すでに最終にある。
				if( nIndex2 <= 1 ) return TRUE;
				nIndex2 = nIndex + 2;
				ListView_GetItemText(hwndList, nIndex, 0, szKeyWord, sizeof(szKeyWord));
				ListView_GetItemText(hwndList, nIndex, 1, szColorIndex, sizeof(szColorIndex));
				//キーを追加する。
				lvi.mask     = LVIF_TEXT | LVIF_PARAM;
				lvi.pszText  = szKeyWord;
				lvi.iItem    = nIndex2;
				lvi.iSubItem = 0;
				lvi.lParam   = 0;
				ListView_InsertItem( hwndList, &lvi );
				lvi.mask     = LVIF_TEXT;
				lvi.iItem    = nIndex2;
				lvi.iSubItem = 1;
				lvi.pszText  = szColorIndex;
				ListView_SetItem( hwndList, &lvi );
				//移動したキーを選択状態にする。
				ListView_SetItemState( hwndList, nIndex2, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED );
				ListView_DeleteItem(hwndList, nIndex);	//古いキーを削除
				GetData_Regex( hwndDlg );
				return TRUE;

			case IDC_BUTTON_REGEX_IMPORT:	/* インポート */
				Import_Regex(hwndDlg);
				m_Types.m_nRegexKeyMagicNumber++;	//Need Compile	//@@@ 2001.11.17 add MIK 正規表現キーワードのため
				return TRUE;

			case IDC_BUTTON_REGEX_EXPORT:	/* エクスポート */
				Export_Regex(hwndDlg);
				return TRUE;
			}
			break;
		}
		break;

	case WM_NOTIFY:
		idCtrl = (int)wParam;
		pNMHDR = (NMHDR*)lParam;
		switch( pNMHDR->code ){
		case PSN_HELP:
			OnHelp( hwndDlg, IDD_PROP_REGEX );
			return TRUE;
		case PSN_KILLACTIVE:
			/* ダイアログデータの取得 正規表現キーワード */
			GetData_Regex( hwndDlg );
			return TRUE;
//@@@ 2002.01.03 YAZAKI 最後に表示していたシートを正しく覚えていないバグ修正
		case PSN_SETACTIVE:
			m_nPageNum = 3;
			return TRUE;
		case LVN_ITEMCHANGED:
			if( pNMHDR->hwndFrom == hwndList )
			{
				HWND	hwndCombo;
				nIndex = ListView_GetNextItem( hwndList, -1, LVNI_ALL | LVNI_SELECTED );
				if( -1 == nIndex )	//削除、範囲外でクリック時反映されないバグ修正	//@@@ 2003.06.17 MIK
				{
					nIndex = ListView_GetNextItem( hwndList, -1, LVNI_ALL | LVNI_FOCUSED );
				}
				if( -1 == nIndex )
				{
					/* 初期値を設定する */
					::SetDlgItemText( hwndDlg, IDC_EDIT_REGEX, "//k" );	/* 正規表現 */
					j = 0;
					k = 0;
					for( i = 0; i < COLORIDX_LAST; i++ )
					{
						if( m_Types.m_ColorInfoArr[i].m_nColorIdx == COLORIDX_UNDERLINE )
						{
							k++;
							continue;
						}
						if( m_Types.m_ColorInfoArr[i].m_nColorIdx == COLORIDX_REGEX1 ) j = i;
					}
					j -= k;	//スキップした分を差し引く
					if( j >= 0 )
					{
						hwndCombo = GetDlgItem( hwndDlg, IDC_COMBO_REGEX_COLOR );
						::SendMessage( hwndCombo, CB_SETCURSEL, (WPARAM)j, (LPARAM)0 );	/* コンボボックスのデフォルト選択 */
					}
					return FALSE;
				}
				if( nPrevIndex != nIndex )	//@@@ 2003.03.26 MIK
				{	//更新時にListViewのSubItemを正しく取得できないので、その対策
					ListView_GetItemText(hwndList, nIndex, 0, szKeyWord, sizeof(szKeyWord));
					ListView_GetItemText(hwndList, nIndex, 1, szColorIndex, sizeof(szColorIndex));
					::SetDlgItemText( hwndDlg, IDC_EDIT_REGEX, szKeyWord );	/* 正規表現 */
					hwndCombo = GetDlgItem( hwndDlg, IDC_COMBO_REGEX_COLOR );
					for(i = 0, j = 0; i < COLORIDX_LAST; i++)
					{
						//if(strcmp(m_Types.m_ColorInfoArr[i].m_szName, "カーソル行アンダーライン") != 0)
						if( m_Types.m_ColorInfoArr[i].m_nColorIdx != COLORIDX_UNDERLINE )
						{
							if(strcmp(m_Types.m_ColorInfoArr[i].m_szName, szColorIndex) == 0)
							{
								::SendMessage(hwndCombo, CB_SETCURSEL, j, 0);
								break;
							}
							j++;
						}
					}
				}
				nPrevIndex = nIndex;
			}
			break;
		}
		break;

	case WM_HELP:
		{
			HELPINFO *p = (HELPINFO *)lParam;
			::WinHelp( (HWND)p->hItemHandle, m_szHelpFile, HELP_WM_HELP, (ULONG_PTR)(LPVOID)p_helpids );
		}
		return TRUE;
		/*NOTREACHED*/
		//break;

	//Context Menu
	case WM_CONTEXTMENU:
		::WinHelp( hwndDlg, m_szHelpFile, HELP_CONTEXTMENU, (ULONG_PTR)(LPVOID)p_helpids );
		return TRUE;

	}
	return FALSE;
}

/* ダイアログデータの設定 正規表現キーワード */
void CPropTypes::SetData_Regex( HWND hwndDlg )
{
	HWND		hwndWork;
	int		i, nItem, j, k;
	LV_ITEM		lvi;
	DWORD		dwStyle;

	/* ユーザーがエディット コントロールに入力できるテキストの長さを制限する */
	::SendMessage( ::GetDlgItem( hwndDlg, IDC_EDIT_REGEX ), EM_LIMITTEXT, (WPARAM)(sizeof( m_Types.m_RegexKeywordArr[0].m_szKeyword ) - 1 ), (LPARAM)0 );
	::SetDlgItemText( hwndDlg, IDC_EDIT_REGEX, "//k" );	/* 正規表現 */

	/* 色種類のリスト */
	hwndWork = ::GetDlgItem( hwndDlg, IDC_COMBO_REGEX_COLOR );
	::SendMessage( hwndWork, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0 );  /* コンボボックスを空にする */
	j = 0;
	k = 0;
	for( i = 0; i < COLORIDX_LAST; i++ )
	{
		//if( strcmp(m_Types.m_ColorInfoArr[i].m_szName, "カーソル行アンダーライン") == 0 )
		if( m_Types.m_ColorInfoArr[i].m_nColorIdx == COLORIDX_UNDERLINE )
		{
			k++;
			continue;
		}
		nItem = ::SendMessage( hwndWork, CB_ADDSTRING, (WPARAM)0, (LPARAM)(char*)m_Types.m_ColorInfoArr[i].m_szName );
		//if( strcmp(m_Types.m_ColorInfoArr[i].m_szName, "正規表現キーワード1") == 0 ) j = i;
		if( m_Types.m_ColorInfoArr[i].m_nColorIdx == COLORIDX_REGEX1 ) j = i;
	}
	j -= k;	//スキップした分を差し引く
	if( j >= 0 )
		::SendMessage( hwndWork, CB_SETCURSEL, (WPARAM)j, (LPARAM)0 );	/* コンボボックスのデフォルト選択 */

	if( m_Types.m_bUseRegexKeyword )
		CheckDlgButton( hwndDlg, IDC_CHECK_REGEX, BST_CHECKED );
	else
		CheckDlgButton( hwndDlg, IDC_CHECK_REGEX, BST_UNCHECKED );

	/* リスト */
	hwndWork = ::GetDlgItem( hwndDlg, IDC_LIST_REGEX );
	ListView_DeleteAllItems(hwndWork);  /* リストを空にする */

	/* 行選択 */
	dwStyle = (DWORD)::SendMessage( hwndWork, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0 );
	dwStyle |= LVS_EX_FULLROWSELECT;
	::SendMessage( hwndWork, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle );

	/* データ表示 */
	for(i = 0; i < MAX_REGEX_KEYWORD; i++)
	{
		if( m_Types.m_RegexKeywordArr[i].m_szKeyword[0] == '\0' ) break;
		
		lvi.mask     = LVIF_TEXT | LVIF_PARAM;
		lvi.pszText  = m_Types.m_RegexKeywordArr[i].m_szKeyword;
		lvi.iItem    = i;
		lvi.iSubItem = 0;
		lvi.lParam   = 0; //m_Types.m_RegexKeywordArr[i].m_nColorIndex;
		ListView_InsertItem( hwndWork, &lvi );
		lvi.mask     = LVIF_TEXT;
		lvi.iItem    = i;
		lvi.iSubItem = 1;
		lvi.pszText  = m_Types.m_ColorInfoArr[m_Types.m_RegexKeywordArr[i].m_nColorIndex].m_szName;
		ListView_SetItem( hwndWork, &lvi );
	}
	ListView_SetItemState( hwndWork, 0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED );

	return;
}

/* ダイアログデータの取得 正規表現キーワード */
int CPropTypes::GetData_Regex( HWND hwndDlg )
{
	HWND	hwndList;
	int	nIndex, i, j;
	char	szKeyWord[256], szColorIndex[256];

//@@@ 2002.01.03 YAZAKI 最後に表示していたシートを正しく覚えていないバグ修正
//	//自分のページ番号
//	m_nPageNum = 3;

	//使用する?使用しない
	if( IsDlgButtonChecked( hwndDlg, IDC_CHECK_REGEX ) )
		m_Types.m_bUseRegexKeyword = TRUE;
	else
		m_Types.m_bUseRegexKeyword = FALSE;

	//リストに登録されている情報を配列に取り込む
	hwndList = GetDlgItem( hwndDlg, IDC_LIST_REGEX );
	nIndex = ListView_GetItemCount(hwndList);
	for(i = 0; i < MAX_REGEX_KEYWORD; i++)
	{
		if( i < nIndex )
		{
			szKeyWord[0]    = '\0';
			szColorIndex[0] = '\0';
			ListView_GetItemText(hwndList, i, 0, szKeyWord,    sizeof(szKeyWord)   );
			ListView_GetItemText(hwndList, i, 1, szColorIndex, sizeof(szColorIndex));
			strcpy(m_Types.m_RegexKeywordArr[i].m_szKeyword, szKeyWord);
			//色指定文字列を番号に変換する
			m_Types.m_RegexKeywordArr[i].m_nColorIndex = COLORIDX_REGEX1;
			for(j = 0; j < COLORIDX_LAST; j++)
			{
				if(strcmp(m_Types.m_ColorInfoArr[j].m_szName, szColorIndex) == 0)
				{
					m_Types.m_RegexKeywordArr[i].m_nColorIndex = j;
					break;
				}
			}
		}
		else	//未登録部分はクリアする
		{
			m_Types.m_RegexKeywordArr[i].m_szKeyword[0] = '\0';
			m_Types.m_RegexKeywordArr[i].m_nColorIndex = COLORIDX_REGEX1;
		}
	}

	//タイプ設定の変更があった
	m_Types.m_nRegexKeyMagicNumber++;
//	m_Types.m_nRegexKeyMagicNumber = 0;	//Not Compiled.

	return TRUE;
}

BOOL CPropTypes::RegexKakomiCheck(const char *s)
{
	const char	*p;
	int	length, i;
	static const char *kakomi[7 * 2] = {
		"/",  "/k",
		"m/", "/k",
		"m#", "#k",
		"/",  "/ki",
		"m/", "/ki",
		"m#", "#ki",
		NULL, NULL,
	};

	length = strlen(s);

	for(i = 0; kakomi[i] != NULL; i += 2)
	{
		//文字長を確かめる
		if( length > (int)strlen(kakomi[i]) + (int)strlen(kakomi[i+1]) )
		{
			//始まりを確かめる
			if( strncmp(kakomi[i], s, strlen(kakomi[i])) == 0 )
			{
				//終わりを確かめる
				p = &s[length - strlen(kakomi[i+1])];
				if( strcmp(p, kakomi[i+1]) == 0 )
				{
					//正常
					return TRUE;
				}
			}
		}
	}

	return FALSE;
}

//@@@ 2001.11.17 add end MIK


/*[EOF]*/

⌨️ 快捷键说明

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