ftaction.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 11k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #include "shellprv.h"
  2. #include "ids.h"
  3. #include "ftadv.h"
  4. #include "ftcmmn.h"
  5. #include "ftaction.h"
  6. #include "ftassoc.h"
  7. const static DWORD cs_rgdwHelpIDsArray[] =
  8. {  // Context Help IDs
  9.     IDC_FT_CMD_ACTION,         IDH_FCAB_FT_CMD_ACTION,
  10.     IDC_FT_CMD_EXETEXT,        IDH_FCAB_FT_CMD_EXE,
  11.     IDC_FT_CMD_EXE,            IDH_FCAB_FT_CMD_EXE,
  12.     IDC_FT_CMD_BROWSE,         IDH_FCAB_FT_CMD_BROWSE,
  13.     IDC_FT_CMD_DDEGROUP,       IDH_FCAB_FT_CMD_USEDDE,
  14.     IDC_FT_CMD_USEDDE,         IDH_FCAB_FT_CMD_USEDDE,
  15.     IDC_FT_CMD_DDEMSG,         IDH_FCAB_FT_CMD_DDEMSG,
  16.     IDC_FT_CMD_DDEAPP,         IDH_FCAB_FT_CMD_DDEAPP,
  17.     IDC_FT_CMD_DDEAPPNOT,      IDH_FCAB_FT_CMD_DDEAPPNOT,
  18.     IDC_FT_CMD_DDETOPIC,       IDH_FCAB_FT_CMD_DDETOPIC,
  19.     0, 0
  20. };
  21. CFTActionDlg::CFTActionDlg(PROGIDACTION* pProgIDAction, LPTSTR pszProgIDDescr,
  22.                 BOOL fEdit, BOOL fAutoDelete) :
  23.                 CFTDlg((ULONG_PTR)cs_rgdwHelpIDsArray, fAutoDelete), 
  24.                 _pProgIDAction(pProgIDAction), _pszProgIDDescr(pszProgIDDescr),
  25.                 _fEdit(fEdit)
  26. {
  27. }
  28. CFTActionDlg::~CFTActionDlg()
  29. {
  30. }
  31. ///////////////////////////////////////////////////////////////////////////////
  32. // Logic specific to our problem
  33. LRESULT CFTActionDlg::OnInitDialog(WPARAM wParam, LPARAM lParam)
  34. {
  35.     DECLAREWAITCURSOR;
  36.     SetWaitCursor();
  37.     if (_fEdit || _fShowAgain)
  38.     {
  39.         TCHAR szTitle[50 + MAX_PROGIDDESCR + 5];
  40.         TCHAR szTitleTemplate[50];
  41.         _fShowAgain = FALSE;
  42.         if (LoadString(g_hinst, IDS_FT_EDITTITLE, szTitleTemplate, ARRAYSIZE(szTitleTemplate)))
  43.         {
  44.             wnsprintf(szTitle, ARRAYSIZE(szTitle), szTitleTemplate, _pszProgIDDescr);
  45.             SetWindowText(_hwnd, szTitle);
  46.         }
  47.         SetDlgItemText(_hwnd, IDC_FT_CMD_ACTION, _pProgIDAction->szAction);
  48.         SetDlgItemText(_hwnd, IDC_FT_CMD_EXE, _pProgIDAction->szCmdLine);
  49.         SetDlgItemText(_hwnd, IDC_FT_CMD_DDEMSG, _pProgIDAction->szDDEMsg);
  50.         SetDlgItemText(_hwnd, IDC_FT_CMD_DDEAPP, _pProgIDAction->szDDEApplication);
  51.         SetDlgItemText(_hwnd, IDC_FT_CMD_DDEAPPNOT, _pProgIDAction->szDDEAppNotRunning);
  52.         SetDlgItemText(_hwnd, IDC_FT_CMD_DDETOPIC, _pProgIDAction->szDDETopic);
  53.         CheckDlgButton(_hwnd, IDC_FT_CMD_USEDDE, _pProgIDAction->fUseDDE);
  54.         _ResizeDlgForDDE(_pProgIDAction->fUseDDE);
  55.     }
  56.     else
  57.     {
  58.         CheckDlgButton(_hwnd, IDC_FT_CMD_USEDDE, FALSE);
  59.         _ResizeDlgForDDE(FALSE);
  60.     }
  61.     Edit_LimitText(GetDlgItem(_hwnd, IDC_FT_CMD_ACTION), MAX_ACTION - 1);
  62.     Edit_LimitText(GetDlgItem(_hwnd, IDC_FT_CMD_EXE), MAX_ACTIONCMDLINE - 1);
  63.     Edit_LimitText(GetDlgItem(_hwnd, IDC_FT_CMD_DDEMSG), MAX_ACTIONDDEMSG - 1);
  64.     Edit_LimitText(GetDlgItem(_hwnd, IDC_FT_CMD_DDEAPP), MAX_ACTIONAPPL - 1);
  65.     Edit_LimitText(GetDlgItem(_hwnd, IDC_FT_CMD_DDEAPPNOT), MAX_ACTIONDDEAPPNOTRUN - 1);
  66.     Edit_LimitText(GetDlgItem(_hwnd, IDC_FT_CMD_DDETOPIC), MAX_ACTIONTOPIC - 1);
  67.     ResetWaitCursor();
  68.     // Return TRUE so that system set focus
  69.     return TRUE;
  70. }
  71. BOOL CFTActionDlg::_Validate()
  72. {
  73.     BOOL bRet = TRUE;
  74.     // Check the Action
  75.     TCHAR szAction[MAX_ACTION];
  76.     if (!GetDlgItemText(_hwnd, IDC_FT_CMD_ACTION, szAction, ARRAYSIZE(szAction)) ||
  77.         !*szAction)
  78.     {
  79.         ShellMessageBox(g_hinst, _hwnd, MAKEINTRESOURCE(IDS_FT_MB_NOACTION), 
  80.             MAKEINTRESOURCE(IDS_FT), MB_OK | MB_ICONSTOP);
  81.         PostMessage(_hwnd, WM_CTRL_SETFOCUS, (WPARAM)0, 
  82.             (LPARAM)GetDlgItem(_hwnd, IDC_FT_CMD_ACTION));
  83.         bRet = FALSE;
  84.     }
  85.     if (bRet)
  86.     {
  87.         TCHAR szPath[MAX_PATH];
  88.         LPTSTR pszFileName = NULL;
  89.     
  90.         // Check for valid exe
  91.         GetDlgItemText(_hwnd, IDC_FT_CMD_EXE, szPath, ARRAYSIZE(szPath));
  92.         PathRemoveArgs(szPath);
  93.         PathUnquoteSpaces(szPath);
  94.         pszFileName = PathFindFileName(szPath);
  95.         if(!(*szPath) ||
  96.             !(PathIsExe(szPath)) ||
  97.             ((!(PathFileExists(szPath))) && (!(PathFindOnPath(pszFileName, NULL)))))
  98.         {
  99.             // Tell user that this exe is invalid
  100.             ShellMessageBox(g_hinst, _hwnd, MAKEINTRESOURCE(IDS_FT_MB_EXETEXT),
  101.                 MAKEINTRESOURCE(IDS_FT), MB_OK | MB_ICONSTOP);
  102.             PostMessage(_hwnd, WM_CTRL_SETFOCUS, (WPARAM)0,
  103.                 (LPARAM)GetDlgItem(_hwnd, IDC_FT_CMD_EXE));
  104.             bRet = FALSE;
  105.         }
  106.     }
  107.     return bRet;
  108. }
  109. void CFTActionDlg::SetShowAgain()
  110. {
  111.     _fShowAgain = TRUE;
  112. }
  113. BOOL _IsThereAnyPercentArgument(LPTSTR pszCommand)
  114. {
  115.     BOOL fRet = FALSE;
  116.     LPTSTR pszArgs = PathGetArgs(pszCommand);
  117.     if (pszArgs && *pszArgs)
  118.     {
  119.         if (StrStr(pszArgs, TEXT("%")))
  120.         {
  121.             fRet = TRUE;
  122.         }
  123.     }
  124.     return fRet;
  125. }
  126. LRESULT CFTActionDlg::OnOK(WORD wNotif)
  127. {
  128.     BOOL fChecksPassed = FALSE;
  129.     if (_Validate())
  130.     {
  131.         GetDlgItemText(_hwnd, IDC_FT_CMD_ACTION, _pProgIDAction->szAction, MAX_ACTION);
  132.         // Is this a new action?
  133.         if (!_fEdit)
  134.             // Yes, initialize the old action field
  135.             StrCpyN(_pProgIDAction->szOldAction, _pProgIDAction->szAction,
  136.                 ARRAYSIZE(_pProgIDAction->szOldAction));
  137.         GetDlgItemText(_hwnd, IDC_FT_CMD_EXE, _pProgIDAction->szCmdLine, MAX_ACTIONCMDLINE);
  138.         GetDlgItemText(_hwnd, IDC_FT_CMD_DDEMSG, _pProgIDAction->szDDEMsg, MAX_ACTIONDDEMSG);
  139.         GetDlgItemText(_hwnd, IDC_FT_CMD_DDEAPP, _pProgIDAction->szDDEApplication, MAX_ACTIONAPPL);
  140.         GetDlgItemText(_hwnd, IDC_FT_CMD_DDEAPPNOT, _pProgIDAction->szDDEAppNotRunning, MAX_ACTIONDDEAPPNOTRUN);
  141.         GetDlgItemText(_hwnd, IDC_FT_CMD_DDETOPIC, _pProgIDAction->szDDETopic, MAX_ACTIONTOPIC);
  142.         _pProgIDAction->fUseDDE = IsDlgButtonChecked(_hwnd, IDC_FT_CMD_USEDDE);
  143.         // Append %1 to action field, if required
  144.         if (!_IsThereAnyPercentArgument(_pProgIDAction->szCmdLine))
  145.         {
  146.             TCHAR* pszPercentToAppend;
  147.             if (StrChr(_pProgIDAction->szCmdLine,TEXT('\')))
  148.             {
  149.                 if (App_IsLFNAware(_pProgIDAction->szCmdLine))
  150.                     pszPercentToAppend = TEXT(" "%1"");
  151.                 else
  152.                     pszPercentToAppend = TEXT(" %1");
  153.             }
  154.             else
  155.             {
  156.                 TCHAR szFullPathFileName[MAX_PATH];
  157.                 //
  158.                 StrCpyN(szFullPathFileName, _pProgIDAction->szCmdLine,
  159.                     ARRAYSIZE(szFullPathFileName));
  160.                 //PathFindOnPath: first param is the filename, if it is on the path
  161.                 //  then it returns fully qualified, if not return false.
  162.                 //Second param is optional directory to look in first
  163.                 if (PathFindOnPath(szFullPathFileName, NULL))
  164.                 {
  165.                     if (App_IsLFNAware(szFullPathFileName))
  166.                         pszPercentToAppend = TEXT(" "%1"");
  167.                     else
  168.                         pszPercentToAppend = TEXT(" %1");
  169.                 }
  170.                 else
  171.                 {//just in case, default to good old behavior.  Should not come here because
  172.                     // ActionExeIsValid was done earlier
  173.                     pszPercentToAppend = TEXT(" %1");
  174.                 }
  175.             }
  176.             //append...
  177.             StrCatN(_pProgIDAction->szCmdLine, pszPercentToAppend, 
  178.                 ARRAYSIZE(_pProgIDAction->szCmdLine));
  179.         }
  180.         EndDialog(_hwnd, IDOK);
  181.     }
  182.     
  183.     return FALSE;
  184. }
  185. LRESULT CFTActionDlg::OnCancel(WORD wNotif)
  186. {
  187.     EndDialog(_hwnd, IDCANCEL);
  188.     return FALSE;
  189. }
  190. LRESULT CFTActionDlg::OnUseDDE(WORD wNotif)
  191. {
  192.     _ResizeDlgForDDE(IsDlgButtonChecked(_hwnd, IDC_FT_CMD_USEDDE));
  193.     return FALSE;
  194. }
  195. LRESULT CFTActionDlg::OnBrowse(WORD wNotif)
  196. {
  197.     TCHAR szPath[MAX_PATH];
  198.     TCHAR szTitle[40];
  199.     TCHAR szEXE[MAX_PATH];
  200.     TCHAR szFilters[MAX_PATH];
  201.     LPTSTR psz;
  202.     
  203.     szPath[0] = 0;
  204.     
  205.     LoadString(g_hinst, IDS_CAP_OPENAS, szTitle, ARRAYSIZE(szTitle));
  206.     LoadString(g_hinst, IDS_FT_EXE, szEXE, ARRAYSIZE(szEXE));
  207.     
  208.     // And we need to convert #'s to 's...
  209.     LoadString(g_hinst, IDS_PROGRAMSFILTER, szFilters, ARRAYSIZE(szFilters));
  210.     psz = szFilters;
  211.     while (*psz)
  212.     {
  213.         if (*psz == TEXT('#'))
  214.         {
  215.             LPTSTR pszT = psz;
  216.             psz = CharNext(psz);
  217.             *pszT = TEXT('');
  218.         }
  219.         else
  220.             psz = CharNext(psz);
  221.     }
  222.     
  223.     if (GetFileNameFromBrowse(_hwnd, szPath, ARRAYSIZE(szPath), NULL, szEXE, szFilters, szTitle))
  224.     {
  225.         PathQuoteSpaces(szPath);
  226.         SetDlgItemText(_hwnd, IDC_FT_CMD_EXE, szPath);
  227.     }
  228.     
  229.     return FALSE;
  230. }
  231. void CFTActionDlg::_ResizeDlgForDDE(BOOL fShow)
  232. {
  233.     RECT rcDialog;
  234.     RECT rcControl;
  235.     
  236.     GetWindowRect(_hwnd, &rcDialog);
  237.     
  238.     if(fShow)
  239.         GetWindowRect(GetDlgItem(_hwnd, IDC_FT_CMD_DDEGROUP), &rcControl);
  240.     else
  241.         GetWindowRect(GetDlgItem(_hwnd, IDC_FT_CMD_USEDDE), &rcControl);
  242.     
  243.     // Hide/Show the windows to take care of the Tabbing.  If we don't hide them then
  244.     // we tab through the "visible" window outside of the dialog.
  245.     ShowWindow(GetDlgItem(_hwnd, IDC_FT_CMD_DDEMSG), fShow);
  246.     ShowWindow(GetDlgItem(_hwnd, IDC_FT_CMD_DDEAPP), fShow);
  247.     ShowWindow(GetDlgItem(_hwnd, IDC_FT_CMD_DDEAPPNOT), fShow);
  248.     ShowWindow(GetDlgItem(_hwnd, IDC_FT_CMD_DDETOPIC), fShow);
  249.     ShowWindow(GetDlgItem(_hwnd, IDC_FT_CMD_DDEGROUP), fShow);
  250.     SetWindowPos(GetDlgItem(_hwnd, IDC_FT_CMD_USEDDE), HWND_TOPMOST, 
  251.         0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);
  252.     
  253.     MoveWindow(_hwnd, rcDialog.left, rcDialog.top, rcDialog.right - rcDialog.left,
  254.         (rcControl.bottom - rcDialog.top) + 10, TRUE);
  255.     
  256.     SetFocus(GetDlgItem(_hwnd, IDC_FT_CMD_USEDDE));
  257. }
  258. LRESULT CFTActionDlg::OnDestroy(WPARAM wParam, LPARAM lParam)
  259. {
  260.     CFTDlg::OnDestroy(wParam, lParam);
  261.     return FALSE;
  262. }
  263. ///////////////////////////////////////////////////////////////////////////////
  264. // Windows boiler plate code
  265. LRESULT CFTActionDlg::OnCommand(WPARAM wParam, LPARAM lParam)
  266. {
  267.     LRESULT lRes = FALSE;
  268.     switch(GET_WM_COMMAND_ID(wParam, lParam))
  269.     {
  270.         case IDC_FT_CMD_USEDDE:
  271.             // Resize Dialog to see/hide DDE controls
  272.             lRes = OnUseDDE(GET_WM_COMMAND_CMD(wParam, lParam));
  273.             break;
  274.         case IDC_FT_CMD_BROWSE:
  275.             lRes = OnBrowse(GET_WM_COMMAND_CMD(wParam, lParam));
  276.             break;
  277.         default:
  278.             lRes = CFTDlg::OnCommand(wParam, lParam);
  279.             break;
  280.     }
  281.     return lRes;    
  282. }