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

📄 cedtviewcommand.cpp

📁 Crimson编辑器的英文版,完成从韩文版变成英文版的移植,并且附带可执行文件和注册表文件,无需原先的安装包,是改写编辑器的最理想选择.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "cedtHeader.h"
#include "UserInputDialog.h"
#include "SortStringArray.h"
#include "FolderDialog.h"
#include "HtmlHelp.h"


BOOL CCedtView::RefreshUserCommandFilePathForMenu()
{
	for( INT i = 0; i < 8; i++ ) m_szUserCommandFilePath[i] = "";

	CSortStringArray arrPathName;
	CString szPathName = CCedtApp::m_szInstallDirectory + "\\tools\\*.cmd";

	BOOL bFound = FindAllFilePath(arrPathName, szPathName);
	arrPathName.QuickSort();

	INT size = arrPathName.GetSize(); if( size > 8 ) size = 8;
	for( i = 0; i < size; i++ ) m_szUserCommandFilePath[i] = arrPathName[i];

	return TRUE;
}


CString CCedtView::GetCommandName(INT nCommand)
{
	CUserCommand & rCommand = m_clsUserCommand[nCommand];
	if( rCommand.m_szName.GetLength() ) return rCommand.m_szName;
	else return "- Empty -";
}

CString CCedtView::GetCommandHotKeyText(INT nCommand)
{
	CUserCommand & rCommand = m_clsUserCommand[nCommand];
	CString szHotKeyText = rCommand.GetHotKeyText();
	if( ! szHotKeyText.GetLength() ) szHotKeyText.Format("Ctrl+%d", nCommand % 10);
	return szHotKeyText;
}

BOOL CCedtView::SetChildInputString(LPCTSTR lpszInputString)
{
	m_arrChildInputString.Add( lpszInputString );
	return TRUE;
}

BOOL CCedtView::KillChildProcess()
{
	if( ! TerminateProcess( m_hChildProcess, 1 ) ) return FALSE;
	return TRUE;
}

BOOL CCedtView::TranslateMessageForUserCommand(MSG * pMsg)
{
	if( pMsg->message != WM_KEYDOWN && pMsg->message != WM_SYSKEYDOWN ) return FALSE;

	UINT nFlags = GetKeyState();
	BOOL bShift = (nFlags & KEYSTATE_SHIFT) ? TRUE : FALSE;
	BOOL bCtrl = (nFlags & KEYSTATE_CONTROL) ? TRUE : FALSE;
	BOOL bAlt = (nFlags & KEYSTATE_MENU) ? TRUE : FALSE;

	for( INT i = 1; i <= 10; i++ ) {
		CUserCommand & rCommand = m_clsUserCommand[i];
		BOOL bShift2 = (rCommand.m_wModifiers & HOTKEYF_SHIFT) ? TRUE : FALSE;
		BOOL bCtrl2 = (rCommand.m_wModifiers & HOTKEYF_CONTROL) ? TRUE : FALSE;
		BOOL bAlt2 = (rCommand.m_wModifiers & HOTKEYF_ALT) ? TRUE : FALSE;

		if( rCommand.m_wVirtualKeyCode != pMsg->wParam ) continue;
		if( ! rCommand.IsAssigned() ) continue;
		if( bShift != bShift2 || bCtrl != bCtrl2 || bAlt != bAlt2 ) continue;

		return PostMessage(WM_COMMAND, ID_COMMAND_EXECUTE0 + i, 0L);
	}

	return FALSE;
}

BOOL CCedtView::ExecuteCommand(INT nCommand)
{
	CString szCommand = m_clsUserCommand[nCommand].m_szCommand;
	CString szArgument = m_clsUserCommand[nCommand].m_szArgument;
	CString szDirectory = m_clsUserCommand[nCommand].m_szDirectory;

	BOOL bCloseOnExit = m_clsUserCommand[nCommand].m_bCloseOnExit;
	BOOL bUseShortFileName = m_clsUserCommand[nCommand].m_bUseShortFileName;
	BOOL bCaptureOutput = m_clsUserCommand[nCommand].m_bCaptureOutput;

	CCedtDoc * pDoc = (CCedtDoc *)GetDocument();
	szCommand.TrimRight(); szCommand.TrimLeft();
	CString szPathName = pDoc->GetPathName();
	if( bUseShortFileName ) szPathName = GetShortPathName( szPathName );
	CString szLineNum; szLineNum.Format("%d", GetCurrentLineNumber());
	CString szCurrWord = GetCurrentWord();
	if( m_bSelected ) szCurrWord = GetSelectedString();

	CString szUserInput, szSelectPath1, szSelectPath2, szSelectDir1, szSelectDir2;
	if( szArgument.Find("$(UserInput)")    >= 0 ) { if( ! AskUserInputArguments( szUserInput ) ) return FALSE; }
	if( szArgument.Find("$(SelectPath1)")  >= 0 ) { if( ! AskUserSelectFilePath( pDoc->GetPathName(), szSelectPath1 ) ) return FALSE; }
	if( szArgument.Find("$(SelectPath2)")  >= 0 ) { if( ! AskUserSelectFilePath( pDoc->GetPathName(), szSelectPath2 ) ) return FALSE; }
	if( szArgument.Find("$(SelectDir1)")   >= 0 ) { if( ! AskUserSelectDirectory( pDoc->GetPathName(), szSelectDir1 ) ) return FALSE; }
	if( szArgument.Find("$(SelectDir2)")   >= 0 ) { if( ! AskUserSelectDirectory( pDoc->GetPathName(), szSelectDir2 ) ) return FALSE; }

	CMapStringToString clsVariables;
	SetDefaultShellVariables(clsVariables, szPathName, szLineNum, szCurrWord, szUserInput, szSelectPath1, szSelectPath2, szSelectDir1, szSelectDir2);

	// replace shell variables
	if( szCommand.GetLength() ) ReplaceShellVariables( szCommand, clsVariables );
	TRACE1( "COMMAND EXECUTABLE: '%s'\n", szCommand );

	// replace program argument
	if( szArgument.GetLength() ) ReplaceShellVariables( szArgument, clsVariables );
	TRACE1( "COMMAND ARGUMENTS : '%s'\n", szArgument );

	// replace execute directory
	if( szDirectory.GetLength() ) ReplaceShellVariables( szDirectory, clsVariables );
	INT nLength = szDirectory.GetLength(); 
	if( nLength > 0 && szDirectory[nLength-1] != '\\' ) szDirectory += "\\";
	TRACE1( "COMMAND DIRECTORY : '%s'\n", szDirectory );
	
	// execute command!!!
	CString  szExtension = szCommand.Right(4);
	BOOL bResult = FALSE;
	
	if( ! szExtension.CompareNoCase(".exe") || ! szExtension.CompareNoCase(".com") ||
		! szExtension.CompareNoCase(".bat") || ! szExtension.CompareNoCase(".cmd") ) { // executable file
		bResult = ExecuteExecutable( szCommand, szArgument, szDirectory, bCloseOnExit, bCaptureOutput );
	} else if( ! szExtension.CompareNoCase(".hlp") ) { // windows help file
		bResult = ExecuteWinHelp( szCommand, szArgument );
	} else if( ! szExtension.CompareNoCase(".chm") ) { // html help file
		bResult = ExecuteHtmlHelp( szCommand, szArgument );
	}

	return bResult;
}

BOOL CCedtView::AskUserInputArguments(CString & szUserInput)
{
	CUserInputDialog dlg(IDS_ASKUSR_PROGRAM_ARGS);
	if( dlg.DoModal() != IDOK ) return FALSE;

	szUserInput = dlg.m_szUserInput;
	return TRUE;
}

BOOL CCedtView::AskUserSelectFilePath(LPCTSTR lpszPathName, CString & szSelectPath)
{
	DWORD dwFlags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST;
	CString szFilter = CCedtApp::GetComposedFileFilter();
	CFileDialog dlg(TRUE, NULL, lpszPathName, dwFlags, szFilter);

	TCHAR szCurrentDirectory[MAX_PATH]; GetCurrentDirectory( MAX_PATH, szCurrentDirectory );
	TCHAR szInitialDirectory[MAX_PATH]; strcpy( szInitialDirectory, GetFileDirectory(lpszPathName) );

	CString szTitle; szTitle.LoadString(IDS_DLG_SELECT_FILE);
	dlg.m_ofn.lpstrTitle = szTitle; dlg.m_ofn.lpstrInitialDir = szInitialDirectory;
	dlg.m_ofn.nFilterIndex = CCedtApp::GetFilterIndexDialog() + 1;
	if( dlg.DoModal() != IDOK ) return FALSE;

//	GetCurrentDirectory( MAX_PATH, szInitialDirectory );
	SetCurrentDirectory( szCurrentDirectory );

	CCedtApp::SetFilterIndexDialog(dlg.m_ofn.nFilterIndex - 1);
	szSelectPath = dlg.GetPathName();

	return TRUE;
}

BOOL CCedtView::AskUserSelectDirectory(LPCTSTR lpszPathName, CString & szSelectDirectory)
{
	CString szText( (LPCTSTR)IDS_CHOOSE_DIRECTORY );
	CString szDirectory = GetFileDirectory( lpszPathName );

	CFolderDialog dlg(szText, szDirectory, NULL, this);
	if( dlg.DoModal() != IDOK ) return FALSE;

	szSelectDirectory = dlg.GetPathName();
	return TRUE;
}

BOOL CCedtView::SetDefaultShellVariables(CMapStringToString & clsVariables, LPCTSTR lpszPathName, LPCTSTR lpszLineNum, LPCTSTR lpszCurrWord,
										 LPCTSTR lpszUserInput, LPCTSTR lpszSelectPath1, LPCTSTR lpszSelectPath2, LPCTSTR lpszSelectDir1, LPCTSTR lpszSelectDir2)
{
	clsVariables.SetAt("FilePath", lpszPathName);				clsVariables.SetAt("FileDir", GetFileDirectory(lpszPathName));
	clsVariables.SetAt("FileName", GetFileName(lpszPathName));	clsVariables.SetAt("FileTitle", GetFileTitle(lpszPathName));
	clsVariables.SetAt("LineNum", lpszLineNum);					clsVariables.SetAt("CurrWord", lpszCurrWord);

	clsVariables.SetAt("UserInput", lpszUserInput);				
	clsVariables.SetAt("SelectPath1", lpszSelectPath1);			clsVariables.SetAt("SelectPath2", lpszSelectPath2);
	clsVariables.SetAt("SelectDir1", lpszSelectDir1);			clsVariables.SetAt("SelectDir2", lpszSelectDir2);

	return TRUE;
}

/* Removed by Ingyu Kang, 2004.09.20 --
BOOL CCedtView::ParseProgramArguments(CString & szArgu, LPCTSTR lpszPath, LPCTSTR lpszLineNum, LPCTSTR lpszCurrWord, LPCTSTR lpszUserInput, LPCTSTR lpszSelPath1, LPCTSTR lpszSelPath2, LPCTSTR lpszSelDir1, LPCTSTR lpszSelDir2)
{
	CString szPath = lpszPath;					CString szDir  = GetFileDirectory(lpszPath);
	CString szName = GetFileName(lpszPath);		CString szTtle = GetFileTitle(lpszPath);
	CString szLine = lpszLineNum;				CString szWord = lpszCurrWord;

	CString szUser = lpszUserInput;
	CString szSlP1 = lpszSelPath1;				CString szSlP2 = lpszSelPath2;
	CString szSlD1 = lpszSelDir1;				CString szSlD2 = lpszSelDir2;

	INT nFound = -1;

	while( (nFound = szArgu.Find("$(FilePath)"   )) >= 0 ) szArgu = szArgu.Left(nFound) + szPath + szArgu.Mid(nFound + 11);
	while( (nFound = szArgu.Find("$(FileDir)"    )) >= 0 ) szArgu = szArgu.Left(nFound) + szDir  + szArgu.Mid(nFound + 10);
	while( (nFound = szArgu.Find("$(FileName)"   )) >= 0 ) szArgu = szArgu.Left(nFound) + szName + szArgu.Mid(nFound + 11);
	while( (nFound = szArgu.Find("$(FileTitle)"  )) >= 0 ) szArgu = szArgu.Left(nFound) + szTtle + szArgu.Mid(nFound + 12);
	while( (nFound = szArgu.Find("$(LineNum)"    )) >= 0 ) szArgu = szArgu.Left(nFound) + szLine + szArgu.Mid(nFound + 10);
	while( (nFound = szArgu.Find("$(CurrWord)"   )) >= 0 ) szArgu = szArgu.Left(nFound) + szWord + szArgu.Mid(nFound + 11);

	while( (nFound = szArgu.Find("$(UserInput)"  )) >= 0 ) szArgu = szArgu.Left(nFound) + szUser + szArgu.Mid(nFound + 12);
	while( (nFound = szArgu.Find("$(SelectPath1)")) >= 0 ) szArgu = szArgu.Left(nFound) + szSlP1 + szArgu.Mid(nFound + 14);
	while( (nFound = szArgu.Find("$(SelectPath2)")) >= 0 ) szArgu = szArgu.Left(nFound) + szSlP2 + szArgu.Mid(nFound + 14);
	while( (nFound = szArgu.Find("$(SelectDir1)" )) >= 0 ) szArgu = szArgu.Left(nFound) + szSlD1 + szArgu.Mid(nFound + 13);
	while( (nFound = szArgu.Find("$(SelectDir2)" )) >= 0 ) szArgu = szArgu.Left(nFound) + szSlD2 + szArgu.Mid(nFound + 13);

	return TRUE;
}
-- Removed by Ingyu Kang, 2004.09.20 */

/* Removed by Ingyu Kang, 2004.09.20 --
BOOL CCedtView::ParseExecuteDirectory(CString & szArgu, LPCTSTR lpszPath)
{
	CString szDir = GetFileDirectory(lpszPath);

	INT nFound = -1;
	while( (nFound = szArgu.Find("$(FileDir)"    )) >= 0 ) szArgu = szArgu.Left(nFound) + szDir  + szArgu.Mid(nFound + 10);

	return TRUE;
}
-- Removed by Ingyu Kang, 2004.09.20 */

BOOL CCedtView::ReplaceShellVariables(CString & szArgu, CMapStringToString & clsVariables)
{
	TCHAR * pArgu = (TCHAR *)(LPCTSTR)szArgu;
	TCHAR * pChar = pArgu;

	TRACE1("BEGIN ReplaceShellVariables: %s\n", szArgu);
	while( * pChar && * pChar != '$' ) pChar++;

	while( * pChar ) {
		BOOL bEnclosed = FALSE;
		TCHAR * pSave = pChar;

		if( * pChar == '$' ) pChar++;
		if( * pChar == '(' ) { bEnclosed = TRUE; pChar++; }

		while( * pChar ) {
			if( bEnclosed && * pChar == ')' ) { pChar++; break; }
			if( ! bEnclosed && ! isalnum(* pChar) ) break;
			pChar++;
		}

⌨️ 快捷键说明

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