Browse Source

Quick addition: "Create shortcut" menu entry.

Sebastien Barre 24 years ago
parent
commit
669f7e7f07

+ 2 - 1
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

+ 157 - 1
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;
+}

+ 2 - 1
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;

+ 3 - 1
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