📄 cedtviewcommand.cpp
字号:
#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 + -