www.pudn.com > QuickSYS_0_4_0.zip > QuickSYSDlg.cpp


/* 
 
  QuickSYSDlg.cpp 
 
  Author: Chunhua Liu 
  Last Updated: 2006-02-12 
 
*/ 
 
#include "stdafx.h" 
#include "QuickSYS.h" 
#include "QuickSYSDlg.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX }; 
	//}}AFX_DATA 
 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
		// No message handlers 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CQuickSYSDlg dialog 
 
void SaveLastProjectLocation(const CString &str) 
{ 
	HKEY hKey; 
	if ( ERROR_SUCCESS == RegCreateKeyEx(HKEY_CURRENT_USER, 
		_T("SOFTWARE\\QuickSYS"), 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKey, NULL) ) 
	{ 
		RegSetValueEx(hKey, _T("LastProjectLocation"), 0, REG_SZ, (CONST LPBYTE)(LPCTSTR)str, str.GetLength()+1); 
	} 
} 
 
CString LoadLastProjectLocation() 
{ 
	CString dir; 
	HKEY hKey; 
	if (ERROR_SUCCESS == RegOpenKey(HKEY_CURRENT_USER, _T("SOFTWARE\\QuickSYS"), &hKey)) 
	{ 
		DWORD size = MAX_PATH; 
		DWORD type = REG_SZ; 
		RegQueryValueEx(hKey, _T("LastProjectLocation"), NULL, &type, (LPBYTE)dir.GetBuffer(MAX_PATH), (LPDWORD)&size); 
		dir.ReleaseBuffer(); 
		RegCloseKey(hKey); 
	} 
	return dir; 
} 
 
CQuickSYSDlg::CQuickSYSDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CQuickSYSDlg::IDD, pParent) 
	, m_bVS2008(FALSE) 
{ 
	//{{AFX_DATA_INIT(CQuickSYSDlg) 
	m_strProjectLocation = LoadLastProjectLocation(); 
	m_strProjectName = _T(""); 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CQuickSYSDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CQuickSYSDlg) 
	DDX_Text(pDX, IDC_PROJECT_LOCATION, m_strProjectLocation); 
	DDX_Text(pDX, IDC_PROJECT_NAME, m_strProjectName); 
	//}}AFX_DATA_MAP 
	DDX_Check(pDX, IDC_VS2008, m_bVS2008); 
} 
 
BEGIN_MESSAGE_MAP(CQuickSYSDlg, CDialog) 
	//{{AFX_MSG_MAP(CQuickSYSDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_BROWSE_LOCATION, OnBrowseLocation) 
	ON_BN_CLICKED(IDC_CREATE, OnCreate) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CQuickSYSDlg message handlers 
 
BOOL CQuickSYSDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Add "About..." menu item to system menu. 
 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application's main window is not a dialog 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
	 
	// TODO: Add extra initialization here 
	 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CQuickSYSDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CQuickSYSDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CQuickSYSDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
#include  
#include  
int CreateAllDirectories(LPCTSTR pszDir) 
{ 
	TCHAR szPath[MAX_PATH]; 
    LPCTSTR pszSlash; 
	 
    if (_taccess(pszDir, 0) != -1) 
    { 
        // it already exists 
        return 0; 
    } 
	 
	pszSlash = _tcschr(pszDir, _T('\\')); 
	while (pszSlash) 
    { 
		wcsncpy_s(szPath, pszDir, pszSlash-pszDir); 
		szPath[pszSlash-pszDir] = 0; 
		CreateDirectory(szPath, NULL); 
		pszSlash = _tcschr(pszSlash+1, _T('\\')); 
    } 
 
	if (_taccess(pszDir, 0) != -1) 
		return 0; 
	 
	if (CreateDirectory(pszDir, NULL)) 
		return 0; 
	 
    return -1; 
} 
 
int CALLBACK BrowseForFolderCallback(HWND hwnd,UINT uMsg,LPARAM lp, LPARAM pData) 
{ 
	TCHAR szPath[MAX_PATH]; 
 
	switch(uMsg) 
	{ 
		case BFFM_INITIALIZED: 
			SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData); 
			break; 
 
		case BFFM_SELCHANGED:  
			if (SHGetPathFromIDList((LPITEMIDLIST)lp, szPath))  
			{ 
				SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)szPath);	 
			} 
			break; 
	} 
 
	return 0; 
} 
 
BOOL BrowseFolder(HWND hWnd, TCHAR *dir) 
{ 
	BROWSEINFO bi; 
	LPITEMIDLIST il; 
	 
	bi.hwndOwner = hWnd; 
	bi.pidlRoot = NULL; 
	bi.pszDisplayName = NULL; 
	bi.lpszTitle = _T("Choose directory:"); 
	bi.ulFlags = BIF_RETURNONLYFSDIRS|BIF_STATUSTEXT; 
	bi.lpfn = BrowseForFolderCallback; 
	bi.lParam = LPARAM(dir); 
	bi.iImage = 0; 
	 
	il = SHBrowseForFolder(&bi); 
	 
	if (il) //按下OK键选定了一个目录 
	{ 
		SHGetPathFromIDList(il, dir); 
		 
		LPMALLOC lpMalloc; 
		SHGetMalloc(&lpMalloc); 
		lpMalloc->Free(il); //释放内存 
		lpMalloc->Release(); 
		return TRUE; 
	} 
	return FALSE; 
} 
 
void CQuickSYSDlg::OnBrowseLocation()  
{ 
	// TODO: Add your control notification handler code here 
	UpdateData(); 
	BOOL bNewFolder = BrowseFolder(m_hWnd, m_strProjectLocation.GetBuffer(MAX_PATH)); 
	m_strProjectLocation.ReleaseBuffer(); 
	if ( bNewFolder ) 
	{ 
		SaveLastProjectLocation(m_strProjectLocation); 
		UpdateData(FALSE); 
	} 
} 
 
CStringA strProjectNameUpper; 
CStringA strProjectNameLead; 
CStringA strGuid; 
 
#pragma comment(lib, "Rpcrt4.lib") 
 
void CQuickSYSDlg::PrepareVariables() 
{ 
	// upper case project name 
	strProjectNameUpper = m_strProjectNameA; 
	strProjectNameUpper.MakeUpper(); 
 
	// upper case first character of project name 
	strProjectNameLead = m_strProjectNameA; 
	strProjectNameLead.MakeLower(); 
	strProjectNameLead.SetAt(0, toupper(m_strProjectName[0])); 
 
	UUID m_guid = GUID_NULL; 
	::UuidCreate(&m_guid); 
	strGuid.Format("{%08lX-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X}", 
		m_guid.Data1, m_guid.Data2, m_guid.Data3, 
		m_guid.Data4[0], m_guid.Data4[1], m_guid.Data4[2], m_guid.Data4[3], 
		m_guid.Data4[4], m_guid.Data4[5], m_guid.Data4[6], m_guid.Data4[7]); 
} 
 
void CQuickSYSDlg::OnCreate()  
{ 
	// TODO: Add your control notification handler code here 
	UpdateData(); 
 
	if (m_strProjectName.IsEmpty()) 
	{ 
		MessageBox(_T("Please input project name."), _T("QuickSYS"), MB_ICONSTOP); 
		return; 
	} 
	if (m_strProjectLocation.IsEmpty()) 
	{ 
		MessageBox(_T("Please input project location."), _T("QuickSYS"), MB_ICONSTOP); 
		return; 
	} 
 
	m_strProjectNameA = m_strProjectName; 
 
	int ret; 
	 
	PrepareVariables(); 
 
	if (m_bVS2008) 
		ret = CreateProject2008(); 
	else 
		ret = CreateProject(); 
	switch (ret) 
	{ 
	case -1: 
		MessageBox(_T("Failed to create directory."), _T("QuickSYS"), MB_ICONSTOP); 
		break; 
	case -2: 
		MessageBox(_T("Failed to create file."), _T("QuickSYS"), MB_ICONSTOP); 
		break; 
	case -3: 
		MessageBox(_T("Create project canceled."), _T("QuickSYS"), MB_ICONSTOP); 
		break; 
	default: 
		MessageBox(_T("Create project successfully."), _T("QuickSYS"), MB_ICONINFORMATION); 
		break; 
	} 
} 
 
CStringA LoadText(LPCTSTR lpName) 
{ 
	CStringA strText; 
	HRSRC hRsrc; 
	 
	hRsrc = FindResource(AfxGetInstanceHandle(), lpName, RT_HTML); 
	HGLOBAL hMem = LoadResource(AfxGetInstanceHandle(), hRsrc); 
	DWORD dwSize = SizeofResource(AfxGetInstanceHandle(), hRsrc); 
	char *src = (char*)LockResource(hMem); 
	char *dst = strText.GetBuffer(dwSize+1); 
	memcpy(dst, src, dwSize); 
	dst[dwSize] = 0; 
	strText.ReleaseBuffer(); 
 
	return strText; 
} 
 
CString GetSoftICEInstallDir() 
{ 
	CString dir; 
	HKEY hKey; 
	if ( ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\NuMega\\SoftICE"), &hKey) ) 
	{ 
		DWORD size = MAX_PATH; 
		DWORD type = REG_SZ; 
		RegQueryValueEx(hKey, _T("InstallDir"), NULL, &type, (LPBYTE)dir.GetBuffer(MAX_PATH), (LPDWORD)&size); 
		dir.ReleaseBuffer(); 
	} 
	return dir; 
} 
 
CStringA CQuickSYSDlg::ExpandLoadString(LPCTSTR lpResourceName) 
{ 
	CStringA str; 
 
	str = LoadText(lpResourceName); 
	str.Replace("$(GUID_PROJ)", strGuid); 
	str.Replace("$(PROJECT_NAME)", m_strProjectNameA); 
	str.Replace("$(PROJECT_NAME_U)", strProjectNameUpper); 
	str.Replace("$(PROJECT_NAME_A)", strProjectNameLead); 
 
	return str; 
} 
 
int CQuickSYSDlg::ExpandResourceToFile(LPCTSTR lpResourceName, LPCTSTR lpFileName) 
{ 
	FILE *fp; 
	errno_t err = _tfopen_s(&fp, lpFileName, _T("wb")); 
	if (err != 0) 
		return err; 
 
	CStringA str = ExpandLoadString(lpResourceName); 
	fprintf(fp, "%s", str); 
	fclose(fp); 
 
	return 0; 
} 
 
int CQuickSYSDlg::CreateProject2008() 
{ 
	CString strPrjBaseDir = m_strProjectLocation; 
	if (strPrjBaseDir.Right(1) != _T("\\")) 
		strPrjBaseDir += _T("\\"); 
	strPrjBaseDir += m_strProjectName; 
	 
	if (CreateAllDirectories(strPrjBaseDir) != 0) 
		return -1; 
 
	strPrjBaseDir += _T("\\"); 
 
	// create .sln file 
	{ 
		CString strSlnFileName = strPrjBaseDir + m_strProjectName; 
		strSlnFileName += _T(".sln"); 
 
		if (_taccess(strSlnFileName, 0) != -1) 
		{ // project already exist 
			DWORD ret = MessageBox(_T("Project already exist, overwrite?"), 
				_T("QuickSYS"), MB_YESNO|MB_ICONQUESTION); 
			if (ret == IDNO) 
				return -3; 
		} 
 
		if (ExpandResourceToFile(MAKEINTRESOURCE(IDR_SLN2008), strSlnFileName) != 0) 
			return -2; 
	} 
 
	{ 
		CString strVcprojFileName = strPrjBaseDir + m_strProjectName; 
		strVcprojFileName += _T(".vcproj"); 
 
		if (ExpandResourceToFile(MAKEINTRESOURCE(IDR_VCPROJ2008), strVcprojFileName) != 0) 
			return -2; 
	} 
 
	// 3rd, create .c file 
	CString strCFileName = strPrjBaseDir + m_strProjectName; 
	strCFileName += _T(".c"); 
	 
	if (ExpandResourceToFile(MAKEINTRESOURCE(IDR_CFILE), strCFileName) != 0) 
		return -2; 
 
	// 4th, create .h file 
	CString strHFileName = strPrjBaseDir + m_strProjectName; 
	strHFileName += _T(".h"); 
	 
	if (ExpandResourceToFile(MAKEINTRESOURCE(IDR_HFILE), strHFileName) != 0) 
		return -2; 
 
	// create precomp.h 
	strHFileName = strPrjBaseDir + _T("precomp.h"); 
	 
	if (ExpandResourceToFile(MAKEINTRESOURCE(IDR_PRECOMP), strHFileName) != 0) 
		return -2; 
 
	// 5th, create readme.txt 
	CString strReadmeFileName = strPrjBaseDir + _T("readme.txt"); 
	 
	if (ExpandResourceToFile(MAKEINTRESOURCE(IDR_README), strReadmeFileName) != 0) 
		return -2; 
	 
	return 0; 
} 
 
int CQuickSYSDlg::CreateProject() 
{ 
	CString strPrjBaseDir = m_strProjectLocation; 
	if (strPrjBaseDir.Right(1) != _T("\\")) 
		strPrjBaseDir += _T("\\"); 
	strPrjBaseDir += m_strProjectName; 
	 
	if (CreateAllDirectories(strPrjBaseDir) != 0) 
		return -1; 
 
	strPrjBaseDir += _T("\\"); 
 
	// frist create .dsw 
	{ 
		CString strDSWFileName = strPrjBaseDir + m_strProjectName; 
		strDSWFileName += _T(".dsw"); 
 
		if (_taccess(strDSWFileName, 0) != -1) 
		{ // project already exist 
			DWORD ret = MessageBox(_T("Project already exist, overwrite?"), 
				_T("QuickSYS"), MB_YESNO|MB_ICONQUESTION); 
			if (ret == IDNO) 
				return -3; 
		} 
 
		FILE *fp = _tfopen(strDSWFileName, _T("w")); 
		if (!fp) 
			return -2; 
 
		CStringA strDSWFileContent; 
		strDSWFileContent.LoadString(IDS_DSW); 
		fprintf(fp, strDSWFileContent, m_strProjectNameA, m_strProjectNameA); 
		fclose(fp); 
	} 
 
	// get softice installed directory 
/* 
	CString strNMsym = GetSoftICEInstallDir(); 
	if ( !strNMsym.IsEmpty() ) 
	{ 
		if ( strNMsym.Right(1) != "\\" ) strNMsym += "\\"; 
		strNMsym += "nmsym.exe"; 
	} 
 
	CString strNMsym = "$(DRIVERWORKS)\\bin\\nmsym.exe"; 
*/ 
	// 2nd, create .dsp 
	{ 
		CString strDSPFileName = strPrjBaseDir + m_strProjectName; 
		strDSPFileName += _T(".dsp"); 
 
		if (ExpandResourceToFile(MAKEINTRESOURCE(IDR_DSP), strDSPFileName) != 0) 
			return -2; 
	} 
 
	// create .sln file 
	{ 
		CString strSlnFileName = strPrjBaseDir + m_strProjectName; 
		strSlnFileName += _T(".sln"); 
 
		if (ExpandResourceToFile(MAKEINTRESOURCE(IDR_SLN), strSlnFileName) != 0) 
			return -2; 
	} 
 
	{ 
		CString strVcprojFileName = strPrjBaseDir + m_strProjectName; 
		strVcprojFileName += _T(".vcproj"); 
 
		if (ExpandResourceToFile(MAKEINTRESOURCE(IDR_VCPROJ), strVcprojFileName) != 0) 
			return -2; 
	} 
 
	// 3rd, create .c file 
	CString strCFileName = strPrjBaseDir + m_strProjectName; 
	strCFileName += _T(".c"); 
	 
	if (ExpandResourceToFile(MAKEINTRESOURCE(IDR_CFILE), strCFileName) != 0) 
		return -2; 
 
	// 4th, create .h file 
	CString strHFileName = strPrjBaseDir + m_strProjectName; 
	strHFileName += _T(".h"); 
	 
	if (ExpandResourceToFile(MAKEINTRESOURCE(IDR_HFILE), strHFileName) != 0) 
		return -2; 
 
	// create precomp.h 
	strHFileName = strPrjBaseDir + _T("precomp.h"); 
	 
	if (ExpandResourceToFile(MAKEINTRESOURCE(IDR_PRECOMP), strHFileName) != 0) 
		return -2; 
 
	// 5th, create readme.txt 
	CString strReadmeFileName = strPrjBaseDir + _T("readme.txt"); 
	 
	if (ExpandResourceToFile(MAKEINTRESOURCE(IDR_README), strReadmeFileName) != 0) 
		return -2; 
	 
	return 0; 
}