diff options
author | Sebastien Barre <sebastien.barre@kitware.com> | 2001-11-14 19:39:26 (GMT) |
---|---|---|
committer | Sebastien Barre <sebastien.barre@kitware.com> | 2001-11-14 19:39:26 (GMT) |
commit | 669f7e7f07944c4e50ccf0bf765f6fe6068f51ff (patch) | |
tree | 567f19d10e9cc7035518e76d5bec724d51d395e2 /Source/MFCDialog | |
parent | f978b6f7ea62b54c4190e0f20633c2823c21beea (diff) | |
download | CMake-669f7e7f07944c4e50ccf0bf765f6fe6068f51ff.zip CMake-669f7e7f07944c4e50ccf0bf765f6fe6068f51ff.tar.gz CMake-669f7e7f07944c4e50ccf0bf765f6fe6068f51ff.tar.bz2 |
Quick addition: "Create shortcut" menu entry.
Diffstat (limited to 'Source/MFCDialog')
-rw-r--r-- | Source/MFCDialog/CMakeSetup.rc | 3 | ||||
-rw-r--r-- | Source/MFCDialog/CMakeSetupDialog.cpp | 158 | ||||
-rw-r--r-- | Source/MFCDialog/CMakeSetupDialog.h | 3 | ||||
-rw-r--r-- | Source/MFCDialog/resource.h | 4 |
4 files changed, 164 insertions, 4 deletions
diff --git a/Source/MFCDialog/CMakeSetup.rc b/Source/MFCDialog/CMakeSetup.rc index 6cbe57e..49bc8ba 100644 --- a/Source/MFCDialog/CMakeSetup.rc +++ b/Source/MFCDialog/CMakeSetup.rc @@ -90,7 +90,7 @@ STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME EXSTYLE WS_EX_APPWINDOW CAPTION "CMakeSetupDialog" -FONT 8, "MS Sans Serif" +FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN COMBOBOX IDC_WhereSource,96,6,133,66,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP @@ -191,6 +191,7 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_ABOUTBOX "&About CMakeSetup..." + IDS_CREATESHORTCUT "&Create shortcut" END #endif // English (U.S.) resources diff --git a/Source/MFCDialog/CMakeSetupDialog.cpp b/Source/MFCDialog/CMakeSetupDialog.cpp index 11da2ca..cca009d 100644 --- a/Source/MFCDialog/CMakeSetupDialog.cpp +++ b/Source/MFCDialog/CMakeSetupDialog.cpp @@ -149,6 +149,12 @@ BOOL CMakeSetupDialog::OnInitDialog() { CDialog::OnInitDialog(); + // Add "Create shortcut" menu item to system menu. + + // IDM_CREATESHORTCUT must be in the system command range. + ASSERT((IDM_CREATESHORTCUT & 0xFFF0) == IDM_CREATESHORTCUT); + ASSERT(IDM_CREATESHORTCUT < 0xF000); + // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. @@ -158,12 +164,24 @@ BOOL CMakeSetupDialog::OnInitDialog() CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { + CString strCreateShortcutMenu; + strCreateShortcutMenu.LoadString(IDS_CREATESHORTCUT); + if (!strCreateShortcutMenu.IsEmpty()) + { + pSysMenu->AppendMenu(MF_SEPARATOR); + pSysMenu->AppendMenu(MF_STRING, + IDM_CREATESHORTCUT, + strCreateShortcutMenu); + } + CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); - pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); + pSysMenu->AppendMenu(MF_STRING, + IDM_ABOUTBOX, + strAboutMenu); } } @@ -207,6 +225,10 @@ void CMakeSetupDialog::OnSysCommand(UINT nID, LPARAM lParam) CAboutDlg dlgAbout; dlgAbout.DoModal(); } + else if ((nID & 0xFFF0) == IDM_CREATESHORTCUT) + { + CreateShortcut(); + } else { CDialog::OnSysCommand(nID, lParam); @@ -816,3 +838,137 @@ void CMakeSetupDialog::OnEditchangeGenerator() // TODO: Add your control notification handler code here } + + +// Create a shortcut on the desktop with the current Source/Build dir. +int CMakeSetupDialog::CreateShortcut() +{ + // m_WhereSource = cmdInfo.m_WhereSource; + // m_WhereBuild = cmdInfo.m_WhereBuild; + + // Find the desktop folder and create the link name + + HKEY hKey; + if(RegOpenKeyEx(HKEY_CURRENT_USER, + "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", + 0, KEY_READ, &hKey) != ERROR_SUCCESS) + { + AfxMessageBox ("Create shortcut: unable to find 'Shell Folders' key in registry!"); + return 1; + } + + DWORD dwType, dwSize; +#define MAXPATH 1024 + char link_name[MAXPATH]; + dwSize = MAXPATH; + if(RegQueryValueEx(hKey, + (LPCTSTR)"Desktop", + NULL, + &dwType, + (BYTE *)link_name, + &dwSize) != ERROR_SUCCESS) + { + AfxMessageBox ("Create shortcut: unable to find 'Desktop' registry value in 'Shell Folders' key!"); + return 1; + } + + if(dwType != REG_SZ) + { + AfxMessageBox ("Create shortcut: 'Desktop' registry value in 'Shell Folders' key has wrong type!"); + return 1; + } + + strcat(link_name, "\\CMake - "); + std::string current_dir = cmSystemTools::GetFilenameName((LPCTSTR)m_WhereSource); + strcat(link_name, current_dir.c_str()); + strcat(link_name, ".lnk"); + + // Find the path to the current executable + + char path_to_current_exe[MAXPATH]; + ::GetModuleFileName(NULL, path_to_current_exe, MAXPATH); + + // Create the shortcut + + HRESULT hres; + IShellLink *psl; + + // Initialize the COM library + + hres = CoInitialize(NULL); + + if (! SUCCEEDED (hres)) + { + AfxMessageBox ("Create shortcut: unable to initialize the COM library!"); + return 1; + } + + // Create an IShellLink object and get a pointer to the IShellLink + // interface (returned from CoCreateInstance). + + hres = CoCreateInstance(CLSID_ShellLink, + NULL, + CLSCTX_INPROC_SERVER, + IID_IShellLink, + (void **)&psl); + + if (! SUCCEEDED (hres)) + { + AfxMessageBox ("Create shortcut: unable to create IShellLink instance!"); + return 1; + } + + IPersistFile *ppf; + + // Query IShellLink for the IPersistFile interface for + // saving the shortcut in persistent storage. + + hres = psl->QueryInterface(IID_IPersistFile, (void **)&ppf); + + if (SUCCEEDED (hres)) + { + // Set the path to the shortcut target. + hres = psl->SetPath(path_to_current_exe); + + if (! SUCCEEDED (hres)) + { + AfxMessageBox ("Create shortcut: SetPath failed!"); + } + + // Set the arguments of the shortcut. + CString args = " /H=" + m_WhereSource + " /B=" + m_WhereBuild; + hres = psl->SetArguments(args); + + if (! SUCCEEDED (hres)) + { + AfxMessageBox ("Create shortcut: SetArguments failed!"); + } + + // Set the description of the shortcut. + hres = psl->SetDescription("Shortcut to CMakeSetup"); + + if (! SUCCEEDED (hres)) + { + AfxMessageBox ("Create shortcut: SetDescription failed!"); + } + + // Ensure that the string consists of ANSI characters. + WORD wsz[MAX_PATH]; + MultiByteToWideChar(CP_ACP, 0, link_name, -1, wsz, MAX_PATH); + + // Save the shortcut via the IPersistFile::Save member function. + hres = ppf->Save(wsz, TRUE); + + if (! SUCCEEDED (hres)) + { + AfxMessageBox ("Create shortcut: Save failed!"); + } + + // Release the pointer to IPersistFile. + ppf->Release (); + } + // Release the pointer to IShellLink. + psl->Release (); + + return 0; +} diff --git a/Source/MFCDialog/CMakeSetupDialog.h b/Source/MFCDialog/CMakeSetupDialog.h index 7cac124..bef4dbc 100644 --- a/Source/MFCDialog/CMakeSetupDialog.h +++ b/Source/MFCDialog/CMakeSetupDialog.h @@ -65,7 +65,8 @@ protected: void FillCacheGUIFromCacheManager(); // copy from the list box to the cache manager void FillCacheManagerFromCacheGUI(); - + // Create a shortcut on the desktop with the current Source/Build dir. + int CreateShortcut(); HICON m_hIcon; CString m_RegistryKey; diff --git a/Source/MFCDialog/resource.h b/Source/MFCDialog/resource.h index 69dfa66..56200d0 100644 --- a/Source/MFCDialog/resource.h +++ b/Source/MFCDialog/resource.h @@ -3,9 +3,11 @@ // Used by CMakeSetup.rc // #define IDM_ABOUTBOX 0x0010 +#define IDM_CREATESHORTCUT 0x0020 #define IDD_ABOUTBOX 100 #define IDS_ABOUTBOX 101 #define IDD_CMakeSetupDialog_DIALOG 102 +#define IDS_CREATESHORTCUT 102 #define IDR_MAINFRAME 128 #define IDC_WhereSource 1001 #define IDC_BUTTON2 1002 @@ -28,6 +30,6 @@ #define _APS_NEXT_RESOURCE_VALUE 133 #define _APS_NEXT_COMMAND_VALUE 32771 #define _APS_NEXT_CONTROL_VALUE 1021 -#define _APS_NEXT_SYMED_VALUE 101 +#define _APS_NEXT_SYMED_VALUE 102 #endif #endif |