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;
}