PropDlg.h
上传用户:hy_wanghao
上传日期:2007-01-08
资源大小:279k
文件大小:8k
源码类别:

Shell编程

开发平台:

Visual C++

  1. #if !defined(AFX_PROPFILE_H__20010103_C70B_4547_8230_0080AD509054__INCLUDED_)
  2. #define AFX_PROPFILE_H__20010103_C70B_4547_8230_0080AD509054__INCLUDED_
  3. #pragma once
  4. #include "Folder.h"
  5. // The "Properties" dialog for folders and files.
  6. //
  7. // It is *not* a COM PropertySheet Shell extension
  8. // but a normal dialog that fakes a Property Sheet by placing
  9. // a TabView control around all child controls.
  10. class CPropertiesDlg : 
  11.    public CDialogImpl<CPropertiesDlg>
  12. {
  13. public:
  14.    enum {IDD = IDD_PROP_FILE};
  15. BEGIN_MSG_MAP(CPropertiesDlg)
  16.    MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
  17.    COMMAND_ID_HANDLER(IDOK, OnOk)
  18.    COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
  19.    COMMAND_ID_HANDLER(IDC_APPLY, OnApply)
  20.    COMMAND_ID_HANDLER(IDC_READONLY, OnChange)
  21.    COMMAND_ID_HANDLER(IDC_HIDDEN, OnChange)
  22.    COMMAND_ID_HANDLER(IDC_ARCHIVE, OnChange)
  23.    COMMAND_HANDLER(IDC_FILENAME, EN_CHANGE, OnChange)
  24.    COMMAND_HANDLER(IDC_COMMENT, EN_CHANGE, OnChange)
  25. END_MSG_MAP()
  26.    CFolder *m_pFolder;
  27.    CPidl m_pidlFolder;
  28.    CPidl m_pidlItem;
  29.    //
  30.    WORD m_retcode;
  31.    CPropertiesDlg()
  32.    {
  33.       m_pFolder = NULL;
  34.       m_retcode = IDCANCEL; // default return-code is "no changes"
  35.    }
  36.    HRESULT _Init(CFolder *pFolder, LPCITEMIDLIST pidlItem)
  37.    {
  38.       ATLASSERT(pFolder);
  39.       m_pFolder = pFolder;
  40.       m_pidlItem.Copy(pidlItem);
  41.       m_pidlFolder.Copy(m_pFolder->m_pidlPath);
  42.       if( m_pidlItem.IsEmpty() ) {
  43.          // If we're looking at the folder itself, go one back and get path right
  44.          m_pidlItem.Copy( m_pidlFolder.GetLastItem() );
  45.          m_pidlFolder.RemoveLast();
  46.       }
  47.       if( m_pidlItem.IsEmpty() ) return E_INVALIDARG;
  48.       return S_OK;
  49.    }
  50.    LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
  51.    {
  52.       ATLASSERT(m_pFolder);
  53.       ATLASSERT(m_pidlItem);
  54.       USES_CONVERSION;   
  55.       // Open the volume so we can read attributes.
  56.       // We open with read/write access so we can determine if the
  57.       // volume is read-only!
  58.       HRESULT hr;
  59.       CAdfDevice dev;
  60.       CAdfVolume vol;
  61.       hr = m_pFolder->_OpenAmigaDevice(m_pFolder->m_pidl, FALSE, m_pidlFolder, dev, vol);
  62.       if( FAILED(hr) ) return 1;
  63.       LPCPIDLDATA pData = pidl_cast((LPITEMIDLIST)m_pidlItem);
  64.       // Setup the TabView control.
  65.       // Need to create a default page and put the Tab in the background.
  66.       CResString<64> sTabName(IDS_GENERAL);
  67.       HWND hwnd = ::GetDlgItem(m_hWnd, IDC_TAB);
  68.       TCITEM itm = { 0 };
  69.       itm.mask = TCIF_TEXT;
  70.       itm.pszText = (LPTSTR)sTabName;
  71.       itm.cchTextMax = _tcslen(sTabName);
  72.       TabCtrl_InsertItem(hwnd, 0, &itm);
  73.       ::SetWindowPos(hwnd, HWND_BOTTOM, 0,0,0,0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
  74.       // Set the icon
  75.       UINT iIconIndex = pData->type==PT_FILE ? ICON_INDEX_FILE : ICON_INDEX_FOLDER;
  76.       HICON hIcon = ImageList_GetIcon(_Module.m_ImageLists.m_hImageListLarge, iIconIndex, ILD_TRANSPARENT);      
  77.       SendDlgItemMessage(IDC_APPICON, STM_SETICON, (WPARAM)hIcon, 0); // BUG: We leak HICON
  78.       TCHAR szTemp[MAX_PATH];
  79.       
  80.       SetDlgItemText(IDC_FILENAME, pData->szName);
  81.       SendDlgItemMessage(IDC_FILENAME, EM_LIMITTEXT, MAXNAMELEN-1, 0);
  82.       SetDlgItemText(IDC_COMMENT, pData->szComment);
  83.       SendDlgItemMessage(IDC_COMMENT, EM_LIMITTEXT, MAXCMMTLEN-1, 0);
  84.       PidlGetFullPath(szTemp, m_pidlFolder);
  85.       SetDlgItemText(IDC_LOCATION, szTemp);
  86.       TCHAR szDate[32];
  87.       TCHAR szTime[32];
  88.       ::GetDateFormat( LOCALE_USER_DEFAULT, DATE_LONGDATE, &pData->ftTime, NULL, szDate, lengthof(szDate) );
  89.       ::GetTimeFormat( LOCALE_USER_DEFAULT, 0, &pData->ftTime, NULL, szTime, lengthof(szTime) );
  90.       ::wsprintf(szTemp, _T("%s %s"), szDate, szTime);
  91.       SetDlgItemText(IDC_CREATED, szTemp);
  92.       WCHAR szwTemp[256];
  93.       LONGLONG longlong = 0;
  94.       longlong = pData->dwSize;
  95.       ::StrFormatByteSizeW(longlong, szwTemp, lengthof(szwTemp));
  96.       SetDlgItemText(IDC_FILESIZE, W2CT(szwTemp));
  97.       // BUG: Hardcoded block-size
  98.       const int blocksize = LOGICAL_BLOCK_SIZE;
  99.       ULONG dwSize = CAdfFile::_CalcBlocksNeeded(pData->dwSize, blocksize) * blocksize;
  100.       longlong = dwSize;
  101.       ::StrFormatByteSizeW(longlong, szwTemp, lengthof(szwTemp));
  102.       SetDlgItemText(IDC_FILESIZEONDISK, W2CT(szwTemp));
  103.       CheckDlgButton(IDC_READONLY, hasW(pData->dwAccess) ? BST_CHECKED : BST_UNCHECKED);
  104.       CheckDlgButton(IDC_HIDDEN, hasH(pData->dwAccess) ? BST_CHECKED : BST_UNCHECKED);
  105.       CheckDlgButton(IDC_ARCHIVE, hasA(pData->dwAccess) ? BST_CHECKED : BST_UNCHECKED);
  106.       // In case of a read-only volume, disable some controls
  107.       if( vol.IsReadOnly() ) {
  108.          SendDlgItemMessage(IDC_FILENAME, EM_SETREADONLY, TRUE, 0);
  109.          SendDlgItemMessage(IDC_COMMENT, EM_SETREADONLY, TRUE, 0);
  110.          ::EnableWindow(GetDlgItem(IDC_READONLY), FALSE);
  111.          ::EnableWindow(GetDlgItem(IDC_HIDDEN), FALSE);
  112.          ::EnableWindow(GetDlgItem(IDC_ARCHIVE), FALSE);
  113.       }
  114.       ::EnableWindow(GetDlgItem(IDC_APPLY), FALSE);
  115.       return 0;
  116.    }
  117.    LRESULT OnOk(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& bHandled)
  118.    {
  119.       if( ::IsWindowEnabled(GetDlgItem(IDC_APPLY)) ) OnApply(0,0,0,bHandled);
  120.       EndDialog(m_retcode);
  121.       return 0;
  122.    }
  123.    LRESULT OnCancel(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  124.    {
  125.       EndDialog(m_retcode);
  126.       return 0;
  127.    }
  128.    LRESULT OnApply(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  129.    {
  130.       USES_CONVERSION;
  131.       HRESULT hr;
  132.       // Save changes...
  133.       LPCPIDLDATA pData = pidl_cast((LPITEMIDLIST)m_pidlItem);
  134.       // Rename object if nessecary
  135.       TCHAR szNewName[MAXNAMELEN+1];
  136.       GetDlgItemText(IDC_FILENAME, szNewName, MAXNAMELEN);
  137.       if( _tcscmp(pData->szName, szNewName)!=0 ) {
  138.          // BUG: Won't this fail if we rename twice? Need to store 'pidlNew' argument?
  139.          hr = m_pFolder->SetNameOf(m_hWnd, m_pidlItem, T2OLE(szNewName), 0, NULL);
  140.          if( FAILED(hr) ) {
  141.             SetDlgItemText(IDC_FILENAME, pData->szName);
  142.             ::MessageBeep(MB_ICONEXCLAMATION);
  143.             return 0;
  144.          }
  145.       }
  146.       // Open the volume so we can change attributes
  147.       CAdfDevice dev;
  148.       CAdfVolume vol;
  149.       hr = m_pFolder->_OpenAmigaDevice(m_pFolder->m_pidl, FALSE, m_pidlFolder, dev, vol);
  150.       if( FAILED(hr) ) return 0;
  151.       // Check for change in comment
  152.       TCHAR szNewComment[MAXCMMTLEN+1];
  153.       GetDlgItemText(IDC_COMMENT, szNewComment, MAXCMMTLEN);
  154.       if( _tcscmp(pData->szComment, szNewComment)!=0 ) {
  155.          vol.SetFileComment(szNewName, vol.GetDirectoryPtr(), szNewComment);
  156.       }
  157.       // Get the status of the file attributes
  158.       bool bReadOnly = IsDlgButtonChecked(IDC_READONLY)==BST_CHECKED;
  159.       bool bHidden = IsDlgButtonChecked(IDC_HIDDEN)==BST_CHECKED;
  160.       bool bArchived = IsDlgButtonChecked(IDC_ARCHIVE)==BST_CHECKED;
  161.       // Calculate new access rights for file
  162.       DWORD dwAccess = pData->dwAccess;
  163.       if( bReadOnly ) dwAccess |= ACCMASK_W; else dwAccess &= ~ACCMASK_W;
  164.       if( bHidden ) dwAccess |= ACCMASK_H; else dwAccess &= ~ACCMASK_H;
  165.       if( bArchived ) dwAccess |= ACCMASK_A; else dwAccess &= ~ACCMASK_A;
  166.       // Set the access rights for the file if changed
  167.       if( pData->dwAccess != dwAccess ) {
  168.          vol.SetFileAccess(szNewName, vol.GetDirectoryPtr(), dwAccess);
  169.       };
  170.       // Ask Shell to refresh parent directory and the item itself
  171.       CPidl pidl;
  172.       pidl.Copy(m_pFolder->m_pidl);
  173.       pidl.Concatenate(m_pidlFolder);
  174.       ::SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_IDLIST | SHCNF_FLUSH, pidl, NULL);
  175.       pidl.Concatenate(m_pidlItem);
  176.       ::SHChangeNotify(SHCNE_ATTRIBUTES, SHCNF_IDLIST | SHCNF_FLUSH, pidl, NULL);
  177.       // Back to unmodified state...
  178.       ::EnableWindow(GetDlgItem(IDC_APPLY), FALSE);
  179.       m_retcode = IDOK;
  180.       return 0;
  181.    }
  182.    LRESULT OnChange(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  183.    {
  184.       ::EnableWindow(GetDlgItem(IDC_APPLY), TRUE);
  185.       return 0;
  186.    }
  187. };
  188. #endif // !defined(AFX_PROPFILE_H__20010103_C70B_4547_8230_0080AD509054__INCLUDED_)