#endif // _MSC_VER > 1000
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
-
-
// Windows Header Files:
#include <windows.h>
#include <commctrl.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
+#include <process.h>
+#include <stdio.h>
// Local Header Files
////////////////////////////////////////////////////////////////////////////////
/*
-TotalFileSize
-[in] Specifies the total size of the file, in bytes.
-TotalBytesTransferred
-[in] Specifies the total number of bytes transferred from the source file to the destination file since the copy operation began.
-StreamSize
-[in] Specifies the total size of the current file stream, in bytes.
-StreamBytesTransferred
-[in] Specifies the total number of bytes in the current stream that have been transferred from the source file to the destination file since the copy operation began.
-dwStreamNumber
-[in] Handle to the current stream. The stream number is 1 the first time CopyProgressRoutine is called.
-dwCallbackReason
-[in] Specifies the reason that CopyProgressRoutine was called. This parameter can be one of the following values. Value Meaning
-CALLBACK_CHUNK_FINISHED Another part of the data file was copied.
-CALLBACK_STREAM_SWITCH Another stream was created and is about to be copied. This is the callback reason given when the callback routine is first invoked.
-
-
-hSourceFile
-[in] Handle to the source file.
-hDestinationFile
-[in] Handle to the destination file
-lpData
-[in] The argument passed to CopyProgressRoutine by the CopyFileEx or MoveFileWithProgress function.
-Return Values
-The CopyProgressRoutine function should return one of the following values.
-
-Value Meaning
-PROGRESS_CONTINUE Continue the copy operation.
-PROGRESS_CANCEL Cancel the copy operation and delete the destination file.
-PROGRESS_STOP Stop the copy operation. It can be restarted at a later time.
-PROGRESS_QUIET Continue the copy operation, but stop invoking CopyProgressRoutine to report progress.
+TotalFileSize [in] Specifies the total size of the file, in bytes.
+TotalBytesTransferred [in] Specifies the total number of bytes transferred from the source file to the destination file since the copy operation began.
+StreamSize [in] Specifies the total size of the current file stream, in bytes.
+StreamBytesTransferred [in] Specifies the total number of bytes in the current stream that have been transferred from the source file to the destination file since the copy operation began.
+dwStreamNumber [in] Handle to the current stream. The stream number is 1 the first time CopyProgressRoutine is called.
+dwCallbackReason [in] Specifies the reason that CopyProgressRoutine was called. This parameter can be one of the following values. Value Meaning
+ CALLBACK_CHUNK_FINISHED Another part of the data file was copied.
+ CALLBACK_STREAM_SWITCH Another stream was created and is about to be copied. This is the callback reason given when the callback routine is first invoked.
+hSourceFile [in] Handle to the source file.
+hDestinationFile [in] Handle to the destination file
+lpData [in] The argument passed to CopyProgressRoutine by the CopyFileEx or MoveFileWithProgress function.
+
+Return Values The CopyProgressRoutine function should return one of the following values.
+ Value Meaning
+ PROGRESS_CONTINUE Continue the copy operation.
+ PROGRESS_CANCEL Cancel the copy operation and delete the destination file.
+ PROGRESS_STOP Stop the copy operation. It can be restarted at a later time.
+ PROGRESS_QUIET Continue the copy operation, but stop invoking CopyProgressRoutine to report progress.
*/
DWORD CALLBACK CopyProgressRoutine(
LARGE_INTEGER TotalFileSize, // file size
LPPROGRESS_ROUTINE lpProgressRoutine, // callback function
LPVOID lpData, // parameter for callback
DWORD dwFlags // move options
-);
-DWORD FormatMessage(
- DWORD dwFlags, // source and processing options
- LPCVOID lpSource, // message source
- DWORD dwMessageId, // message identifier
- DWORD dwLanguageId, // language identifier
- LPTSTR lpBuffer, // message buffer
- DWORD nSize, // maximum size of message buffer
- va_list *Arguments // array of message inserts
);
*/
// if (!MoveFileWithProgress(buffer_from, buffer_to, &CopyProgressRoutine, lpData, dwFlags)) {
extern TCHAR ViewTypeMaskStr[MAX_TYPE_MASK_LEN];
*/
+void ShowFixedFileInfo(HWND hDlg, VS_FIXEDFILEINFO* pFixedFileInfo)
+{
+ TCHAR* str = NULL;
+
+ switch (pFixedFileInfo->dwFileType) {
+ case VFT_UNKNOWN: str = _T("The file type is unknown to the system."); break;
+ case VFT_APP: str = _T("The file contains an application."); break;
+ case VFT_DLL: str = _T("The file contains a dynamic-link library (DLL)."); break;
+ case VFT_DRV:
+ str = _T("The file contains a device driver. If dwFileType is VFT_DRV, dwFileSubtype contains a more specific description of the driver.");
+ switch (pFixedFileInfo->dwFileSubtype) {
+ case VFT2_UNKNOWN: str = _T("The driver type is unknown by the system."); break;
+ case VFT2_DRV_COMM: str = _T("The file contains a communications driver."); break;
+ case VFT2_DRV_PRINTER: str = _T("The file contains a printer driver."); break;
+ case VFT2_DRV_KEYBOARD: str = _T("The file contains a keyboard driver"); break;
+ case VFT2_DRV_LANGUAGE: str = _T("The file contains a language driver"); break;
+ case VFT2_DRV_DISPLAY: str = _T("The file contains a display driver"); break;
+ case VFT2_DRV_MOUSE: str = _T("The file contains a mouse driver"); break;
+ case VFT2_DRV_NETWORK: str = _T("The file contains a network driver"); break;
+ case VFT2_DRV_SYSTEM: str = _T("The file contains a system driver"); break;
+ case VFT2_DRV_INSTALLABLE: str = _T("The file contains an installable driver"); break;
+ case VFT2_DRV_SOUND: str = _T("The file contains a sound driver"); break;
+ }
+ break;
+ case VFT_FONT:
+ str = _T("The file contains a font. If dwFileType is VFT_FONT, dwFileSubtype contains a more specific description of the font file.");
+ switch (pFixedFileInfo->dwFileSubtype) {
+ case VFT2_UNKNOWN: str = _T("The font type is unknown the system."); break;
+ case VFT2_FONT_RASTER: str = _T("The file contains a raster font."); break;
+ case VFT2_FONT_VECTOR: str = _T("The file contains a vector font."); break;
+ case VFT2_FONT_TRUETYPE: str = _T("The file contains a TrueType font."); break;
+
+ }
+ break;
+ case VFT_VXD: str = _T("The file contains a virtual device."); break;
+ case VFT_STATIC_LIB: str = _T("The file contains a static-link library."); break;
+ }
+ if (str != NULL) {
+ SetDlgItemText(hDlg, IDC_STATIC_PROP_VERSION, str);
+// SetDlgItemText(hDlg, IDC_STATIC_PROP_COPYRIGHT, pVersionData);
+ }
+}
+
+// Structure used to store enumerated languages and code pages.
+struct LANGANDCODEPAGE {
+ WORD wLanguage;
+ WORD wCodePage;
+} *lpTranslate;
+
+void AddFileInfoValue(HWND hDlg, void* pVersionData, struct LANGANDCODEPAGE lpTranslate, UINT i, LPCTSTR info_str)
+{
+ TCHAR SubBlock[200];
+ TCHAR* pVal;
+ UINT nValLen;
+
+ wsprintf(SubBlock, TEXT("\\StringFileInfo\\%04x%04x\\%s"),
+ lpTranslate.wLanguage, lpTranslate.wCodePage, info_str);
+ // Retrieve file description for language and code page "i".
+ if (VerQueryValue(pVersionData, SubBlock, &pVal, &nValLen)) {
+ ListBox_InsertItemData(GetDlgItem(hDlg, IDC_LIST_PROP_VERSION_TYPES), i, info_str);
+// ListBox_InsertItemData(pane->hwnd, idx, entry);
+ SendMessage(GetDlgItem(hDlg, IDC_LIST_PROP_VERSION_VALUES), WM_SETTEXT, 0, (LPARAM)pVal);
+ }
+}
+
+static TCHAR* InfoStrings[] = {
+ TEXT("Comments"),
+ TEXT("InternalName"),
+ TEXT("ProductName"),
+ TEXT("CompanyName"),
+ TEXT("LegalCopyright"),
+ TEXT("ProductVersion"),
+ TEXT("FileDescription"),
+ TEXT("LegalTrademarks"),
+ TEXT("PrivateBuild"),
+ TEXT("FileVersion"),
+ TEXT("OriginalFilename"),
+ TEXT("SpecialBuild"),
+ TEXT(""),
+ NULL
+};
+
+void SelectVersionString(HWND hDlg, LPARAM lParam)
+{
+ int idx;
+
+// idx = ListBox_FindItemData(hwnd, , child->left.cur);
+ idx = ListBox_GetCurSel(GetDlgItem(hDlg, IDC_LIST_PROP_VERSION_TYPES));
+
+ //Entry* entry = (Entry*) ListBox_GetItemData(GetDlgItem(hDlg, IDC_LIST_PROP_VERSION_TYPES), idx);
+
+// SendMessage(GetDlgItem(hDlg, IDC_LIST_PROP_VERSION_VALUES), WM_SETTEXT, 0, (LPARAM)pVal);
+
+// ListBox_SetCurSel(GetDlgItem(hDlg, IDC_LIST_PROP_VERSION_TYPES), idx);
+
+// ListBox_InsertItemData(GetDlgItem(hDlg, IDC_LIST_PROP_VERSION_TYPES), i, _T("FileDescription"));
+// SendMessage(GetDlgItem(hDlg, IDC_LIST_PROP_VERSION_VALUES), WM_SETTEXT, 0, pVal);
+
+}
+
+void CheckForFileInfo(HWND hDlg, TCHAR* strFilename)
+{
+ TCHAR SubBlock[200];
+ UINT i;
+ DWORD dwHandle;
+ DWORD dwVersionDataLen = GetFileVersionInfoSize(strFilename, &dwHandle);
+ if (dwVersionDataLen != 0L) {
+ void* pVersionData = malloc(dwVersionDataLen);
+ if (GetFileVersionInfo(strFilename, 0, dwVersionDataLen, pVersionData)) {
+ TCHAR* pVal;
+ UINT nValLen;
+// LPTSTR SubBlock = _T("\\");
+ _tcscpy(SubBlock, TEXT("\\"));
+ if (VerQueryValue(pVersionData, SubBlock, &pVal, &nValLen)) {
+ if (nValLen == sizeof(VS_FIXEDFILEINFO)) {
+ ShowFixedFileInfo(hDlg, (VS_FIXEDFILEINFO*)pVal);
+ }
+ }
+#if 1
+ {
+
+ // Read the list of languages and code pages.
+ _tcscpy(SubBlock, TEXT("\\VarFileInfo\\Translation"));
+ if (VerQueryValue(pVersionData, SubBlock, (LPVOID*)&pVal, &nValLen)) {
+ // Read the file description for each language and code page.
+ for (i = 0; i < (nValLen/sizeof(struct LANGANDCODEPAGE)); i++) {
+ int j = 0;
+ TCHAR* pInfoString;
+ while (pInfoString = InfoStrings[j]) {
+ if (pInfoString != NULL && _tcslen(pInfoString)) {
+ struct LANGANDCODEPAGE* lpTranslate = (struct LANGANDCODEPAGE*)pVal;
+ AddFileInfoValue(hDlg, pVersionData, lpTranslate[i],
+ j, pInfoString);
+ }
+ ++j;
+ }
+// lpTranslate = (struct LANGANDCODEPAGE*)pVal;
+/*
+ wsprintf(SubBlock, TEXT("\\StringFileInfo\\%04x%04x\\FileDescription"),
+ lpTranslate[i].wLanguage, lpTranslate[i].wCodePage);
+ // Retrieve file description for language and code page "i".
+ if (VerQueryValue(pVersionData, SubBlock, &pVal, &nValLen)) {
+ ListBox_InsertItemData(GetDlgItem(hDlg, IDC_LIST_PROP_VERSION_TYPES), i, _T("FileDescription"));
+ SendMessage(GetDlgItem(hDlg, IDC_LIST_PROP_VERSION_VALUES), WM_SETTEXT, 0, pVal);
+ }
+ */
+ }
+ }
+ }
+#endif
+ }
+ free(pVersionData);
+ }
+}
+
+BOOL CALLBACK PropertiesDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ static struct PropertiesDialog* dlg;
+ SYSTEMTIME SystemTime;
+ FILETIME LocalFileTime;
+ TCHAR buffer[MAX_PATH];
+ TCHAR text[100];
+ int id;
+ int offset;
+ DWORD dwFileAttributes;
+ Entry* entry;
+
+ switch (message) {
+ case WM_INITDIALOG:
+ dlg = (struct PropertiesDialog*)lParam;
+ ASSERT(dlg);
+ entry = ((struct PropertiesDialog*)lParam)->pEntry;
+ ASSERT(entry);
+
+ GetWindowText(hDlg, text, sizeof(text));
+ wsprintf(buffer, text, dlg->pEntry->data.cFileName);
+ SetWindowText(hDlg, buffer);
+ SetDlgItemText(hDlg, IDC_STATIC_PROP_FILENAME, dlg->pEntry->data.cFileName);
+ SetDlgItemText(hDlg, IDC_STATIC_PROP_PATH, dlg->pEntry->data.cAlternateFileName);
+
+ if (entry->bhfi_valid) {
+ NUMBERFMT numFmt;
+ memset(&numFmt, 0, sizeof(numFmt));
+ numFmt.NumDigits = 0;
+ numFmt.LeadingZero = 0;
+ numFmt.Grouping = 3;
+ numFmt.lpDecimalSep = _T(".");
+ numFmt.lpThousandSep = _T(",");
+ numFmt.NegativeOrder = 0;
+
+ //entry->bhfi.nFileSizeLow;
+ //entry->bhfi.nFileSizeHigh;
+ //entry->bhfi.ftCreationTime
+ wsprintf(buffer, _T("%u"), entry->bhfi.nFileSizeLow);
+ if (GetNumberFormat(LOCALE_USER_DEFAULT, 0, buffer, &numFmt,
+ buffer + sizeof(buffer)/2, sizeof(buffer)/2)) {
+ SetDlgItemText(hDlg, IDC_STATIC_PROP_SIZE, buffer + sizeof(buffer)/2);
+ } else {
+ SetDlgItemText(hDlg, IDC_STATIC_PROP_SIZE, buffer);
+ }
+ } else {
+ }
+
+ SetDlgItemText(hDlg, IDC_STATIC_PROP_LASTCHANGE, _T("Date?"));
+ if (FileTimeToLocalFileTime(&entry->bhfi.ftLastWriteTime, &LocalFileTime)) {
+ if (FileTimeToSystemTime(&LocalFileTime, &SystemTime)) {
+ if (GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &SystemTime, NULL, buffer, sizeof(buffer))) {
+// SetDlgItemText(hDlg, IDC_STATIC_PROP_LASTCHANGE, buffer);
+ }
+ }
+ }
+ _tcscat(buffer, _T(" "));
+ offset = _tcslen(buffer);
+
+ if (FileTimeToLocalFileTime(&entry->bhfi.ftLastWriteTime, &LocalFileTime)) {
+ if (FileTimeToSystemTime(&LocalFileTime, &SystemTime)) {
+ if (GetTimeFormat(LOCALE_USER_DEFAULT, 0, &SystemTime, NULL, buffer + offset, sizeof(buffer) - offset)) {
+ SetDlgItemText(hDlg, IDC_STATIC_PROP_LASTCHANGE, buffer);
+ }
+ }
+ }
+
+ dwFileAttributes = dlg->pEntry->bhfi.dwFileAttributes;
+ Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_READONLY), dwFileAttributes & FILE_ATTRIBUTE_READONLY ? BST_CHECKED : BST_UNCHECKED);
+ Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_ARCHIVE), dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE ? BST_CHECKED : BST_UNCHECKED);
+ Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_COMPRESSED), dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED ? BST_CHECKED : BST_UNCHECKED);
+ Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_HIDDEN), dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ? BST_CHECKED : BST_UNCHECKED);
+ Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_SYSTEM), dwFileAttributes & FILE_ATTRIBUTE_SYSTEM ? BST_CHECKED : BST_UNCHECKED);
+
+ CheckForFileInfo(hDlg, dlg->pEntry->data.cFileName);
+ return 1;
+
+ case WM_COMMAND:
+ id = (int)wParam;
+ if (id == IDOK) {
+// LPVOID lpData = NULL; // parameter for callback
+// DWORD dwFlags = MOVEFILE_COPY_ALLOWED; // move options
+// GetDlgItemText(hDlg, , buffer, sizeof(buffer));
+// GetDlgItemText(hDlg, , buffer, sizeof(buffer));
+ EndDialog(hDlg, id);
+ } else if (id == IDCANCEL) {
+ EndDialog(hDlg, id);
+ } else {
+ switch(HIWORD(wParam)) {
+ case LBN_SELCHANGE:
+ if (LOWORD(wParam) == IDC_LIST_PROP_VERSION_TYPES) {
+ SelectVersionString(hDlg, lParam);
+ }
+// {
+// int idx = ListBox_GetCurSel(pane->hwnd);
+// Entry* entry = (Entry*) ListBox_GetItemData(pane->hwnd, idx);
+// if (pane == &child->left) set_curdir(child, entry);
+// else pane->cur = entry;
+// }
+ break;
+ case LBN_DBLCLK:
+ //activate_entry(child, pane);
+ break;
+ }
+ }
+ return 1;
+ }
+ return 0;
+}
int cmdshow;
};
+struct MoveFileDialog {
+ TCHAR cmd[MAX_PATH];
+ int cmdshow;
+};
+
+struct PropertiesDialog {
+ TCHAR cmd[MAX_PATH];
+ int cmdshow;
+ Entry* pEntry;
+};
+
BOOL CALLBACK ExecuteDialogWndProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK ViewFileTypeWndProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK OptionsConfirmationWndProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK MoveFileWndProc(HWND, UINT, WPARAM, LPARAM);
+BOOL CALLBACK PropertiesDlgProc(HWND, UINT, WPARAM, LPARAM);
#ifdef __cplusplus
//#include <shellapi.h>
#include <windowsx.h>
-#include <process.h>
#include <assert.h>
#define ASSERT assert
#include "about.h"
#include "framewnd.h"
#include "childwnd.h"
+#include "worker.h"
#include "utils.h"
#include "shell.h"
#include "network.h"
int nOldWidth; // Holds the previous client area width
int nOldHeight; // Holds the previous client area height
-static HANDLE hMonitorThreadEvent = NULL; // When this event becomes signaled then we run the monitor thread
-
-void MonitorThreadProc(void *lpParameter);
-
////////////////////////////////////////////////////////////////////////////////
// Local module support methods
//
SendMessage(Globals.hDriveBar, WM_SIZE, 0, 0);
GetClientRect(Globals.hDriveBar, &rt);
// new_top = --prect->top + rt.bottom+3;
- new_top = --prect->top + rt.bottom+1;
+ new_top = --prect->top + rt.bottom+0;
MoveWindow(Globals.hDriveBar, 0, prect->top, rt.right, new_top, TRUE);
prect->top = new_top;
- prect->bottom -= rt.bottom+2;
+// prect->bottom -= rt.bottom+2;
+ prect->bottom -= rt.bottom-1;
}
if (IsWindowVisible(Globals.hStatusBar)) {
SetupStatusBar(TRUE);
pChildWnd->pos.rcNormalPosition.right = CW_USEDEFAULT;
pChildWnd->pos.rcNormalPosition.bottom = CW_USEDEFAULT;
pChildWnd->nFocusPanel = 0;
- pChildWnd->nSplitPos = 200;
+ pChildWnd->nSplitPos = 300;
pChildWnd->sortOrder = SORT_NAME;
pChildWnd->header_wdths_ok = FALSE;
lstrcpy(pChildWnd->szPath, path);
static void OnExitMenuLoop(HWND hWnd)
{
+/*
RECT rc;
int nParts[3];
nParts[2] = rc.right;
SendMessage(Globals.hStatusBar, SB_SETPARTS, 3, (long)nParts);
SendMessage(Globals.hStatusBar, SB_SETTEXT, 0, (LPARAM)_T(""));
- SetupStatusBar(TRUE);
+ */
+ SendMessage(Globals.hStatusBar, SB_SETTEXT, 0, (LPARAM)_T(""));
+ bInMenuLoop = FALSE;
+ SetupStatusBar(TRUE);
UpdateStatusBar();
}
}
CheckShellAvailable();
CheckNetworkAvailable();
- _beginthread(MonitorThreadProc, 0, NULL);
+ CreateMonitorThread(hWnd);
CreateChildWindow(-1);
break;
break;
case WM_TIMER:
- SetEvent(hMonitorThreadEvent);
+ SignalMonitorEvent();
break;
case WM_SIZE:
break;
case WM_DESTROY:
WinHelp(hWnd, _T("winfile"), HELP_QUIT, 0);
- CloseHandle(hMonitorThreadEvent);
+ DestryMonitorThread();
PostQuitMessage(0);
break;
case WM_QUERYENDSESSION:
}
-
-void MonitorThreadProc(void *lpParameter)
-{
-// ULONG OldProcessorUsage = 0;
-// ULONG OldProcessCount = 0;
-
- // Create the event
- hMonitorThreadEvent = CreateEvent(NULL, TRUE, TRUE, "Winfile Monitor Event");
-
- // If we couldn't create the event then exit the thread
- if (!hMonitorThreadEvent)
- return;
-
- while (1) {
- DWORD dwWaitVal;
-
- // Wait on the event
- dwWaitVal = WaitForSingleObject(hMonitorThreadEvent, INFINITE);
-
- // If the wait failed then the event object must have been
- // closed and the task manager is exiting so exit this thread
- if (dwWaitVal == WAIT_FAILED)
- return;
-
- if (dwWaitVal == WAIT_OBJECT_0) {
- // Reset our event
- ResetEvent(hMonitorThreadEvent);
-#if 0
- TCHAR text[260];
- if ((ULONG)SendMessage(hProcessPageListCtrl, LVM_GETITEMCOUNT, 0, 0) != PerfDataGetProcessCount())
- SendMessage(hProcessPageListCtrl, LVM_SETITEMCOUNT, PerfDataGetProcessCount(), /*LVSICF_NOINVALIDATEALL|*/LVSICF_NOSCROLL);
- if (IsWindowVisible(hProcessPage))
- InvalidateRect(hProcessPageListCtrl, NULL, FALSE);
- if (OldProcessorUsage != PerfDataGetProcessorUsage()) {
- OldProcessorUsage = PerfDataGetProcessorUsage();
- wsprintf(text, _T("CPU Usage: %3d%%"), OldProcessorUsage);
- SendMessage(hStatusWnd, SB_SETTEXT, 1, (LPARAM)text);
- }
- if (OldProcessCount != PerfDataGetProcessCount()) {
- OldProcessCount = PerfDataGetProcessCount();
- wsprintf(text, _T("Processes: %d"), OldProcessCount);
- SendMessage(hStatusWnd, SB_SETTEXT, 0, (LPARAM)text);
- }
-#endif
- }
- }
-}
#include "main.h"
#include "listview.h"
+#include "dialogs.h"
#include "run.h"
#include "trace.h"
case ID_FILE_COPY_CLIPBOARD:
case ID_FILE_DELETE:
case ID_FILE_RENAME:
+ break;
case ID_FILE_PROPERTIES:
+ {
+ LVITEM item;
+ item.mask = LVIF_PARAM;
+ item.iItem = ListView_GetNextItem(hWnd, -1, LVNI_SELECTED);
+ if (item.iItem != -1) {
+ if (ListView_GetItem(hWnd, &item)) {
+ Entry* entry = (Entry*)item.lParam;
+ struct PropertiesDialog dlg = { _T("empty"), 0, entry };
+ if (DialogBoxParam(Globals.hInstance, MAKEINTRESOURCE(IDD_DIALOG_PROPERTIES), hWnd, PropertiesDlgProc, (LPARAM)&dlg) == IDOK) {
+ }
+ }
+ }
+ }
+ break;
+
case ID_FILE_COMPRESS:
case ID_FILE_UNCOMPRESS:
break;
// SendMessage(Globals.hStatusBar, SB_SETPARTS, 2, (LPARAM)&parts);
// Create the status bar panes
- nParts[0] = 150;
- nParts[1] = 220;
- nParts[2] = 100;
- nParts[3] = 100;
+ nParts[0] = 350;
+ nParts[1] = 700;
+ nParts[2] = 800;
+ nParts[3] = 900;
+
if (bResize)
SendMessage(Globals.hStatusBar, WM_SIZE, 0, 0);
SendMessage(Globals.hStatusBar, SB_SETPARTS, 4, (long)nParts);
void UpdateStatusBar(void)
{
- TCHAR text[260];
- DWORD size;
+// TCHAR text[260];
+// DWORD size;
// size = sizeof(text)/sizeof(TCHAR);
// GetUserName(text, &size);
-// SendMessage(Globals.hStatusBar, SB_SETTEXT, 2, (LPARAM)text);
- size = sizeof(text)/sizeof(TCHAR);
- GetComputerName(text, &size);
- SendMessage(Globals.hStatusBar, SB_SETTEXT, 3, (LPARAM)text);
+// SendMessage(Globals.hStatusBar, SB_SETTEXT, 0, (LPARAM)text);
+// size = sizeof(text)/sizeof(TCHAR);
+// GetComputerName(text, &size);
+// SendMessage(Globals.hStatusBar, SB_SETTEXT, 1, (LPARAM)text);
}
#define ID_SECURITY_MENU 6
#define ID_WINDOW_MENU 7
#define ID_HELP_MENU 8
-
#define IDS_LIST_COLUMN_FIRST 91
#define IDS_LIST_COLUMN_NAME 91
#define IDS_LIST_COLUMN_SIZE 92
#define IDS_LIST_COLUMN_ATTRIB 95
#define IDS_LIST_COLUMN_DOSNAME 96
#define IDS_LIST_COLUMN_LAST 96
+#define ID_CMD_FIRST 100
#define IDD_ABOUTBOX 104
#define IDS_APP_TITLE 105
#define IDI_WINFILE 107
#define IDD_DIALOG_VIEW_TYPE 145
#define IDD_DIALOG_OPTIONS_CONFIRMATON 146
#define IDR_ACCELERATOR1 147
+#define IDD_DIALOG_PROPERTIES 148
#define ID_WINDOW_CLOSE 798
#define ID_WINDOW_CLOSEALL 799
#define IDC_VIEW_TYPE_MASK 999
#define IDC_VIEW_TYPE_SYSFILES 1005
#define IDC_CONFIRMATION_FILE_DELETE 1006
#define IDC_CONFIRMATION_DIR_DELETE 1007
+#define IDC_CHECK_READONLY 1007
#define IDC_CONFIRMATION_FILE_REPLACE 1008
+#define IDC_CHECK_ARCHIVE 1008
#define IDC_CONFIRMATION_MOUSE_ACTIONS 1009
+#define IDC_CHECK_COMPRESSED 1009
#define IDC_CONFIRMATION_DISK_COMMANDS 1010
+#define IDC_CHECK_HIDDEN 1010
#define IDC_CONFIRMATION_MODIFY_SYSTEM 1011
-
-#define ID_CMD_FIRST 100
-#define ID_CMD_LAST 32830
-
+#define IDC_CHECK_SYSTEM 1011
+#define IDC_LIST_PROP_VERSION_TYPES 1012
+#define IDC_LIST_PROP_VERSION_VALUES 1013
+#define IDC_STATIC_PROP_FILENAME 1015
+#define IDC_STATIC_PROP_PATH 1016
+#define IDC_STATIC_PROP_LASTCHANGE 1017
+#define IDC_STATIC_PROP_VERSION 1018
+#define IDC_STATIC_PROP_COPYRIGHT 1019
+#define IDC_STATIC_PROP_SIZE 1020
+#define IDC_EDIT1 1021
+#define ID_TREE_COLLAPSE_BRANCH 32768
#define ID_FILE_OPEN 32769
#define ID_FILE_MOVE 32770
#define ID_FILE_COPY 32771
#define ID_TREE_EXPAND_ONE_LEVEL 32793
#define ID_TREE_EXPAND_BRANCH 32794
#define ID_TREE_EXPAND_ALL 32795
-#define ID_TREE_COLLAPSE_BRANCH 32768
#define ID_TREE_INDICATE_EXPANDABLE_BRANCHES 32796
#define ID_VIEW_TREE_DIRECTORY 32797
#define ID_VIEW_TREE_ONLY 32798
#define ID_HELP_CONTENTS 32827
#define ID_HELP_SEARCH_HELP 32828
#define ID_HELP_HOW_TO_USE_HELP 32829
+#define ID_CMD_LAST 32830
#define ID_HELP_ABOUT 32830
#define IDC_LICENSE_EDIT 32831
#define IDS_LICENSE 32832
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 148
+#define _APS_NEXT_RESOURCE_VALUE 149
#define _APS_NEXT_COMMAND_VALUE 32832
-#define _APS_NEXT_CONTROL_VALUE 1007
+#define _APS_NEXT_CONTROL_VALUE 1022
#define _APS_NEXT_SYMED_VALUE 110
#endif
#endif
#include <stdio.h>
#endif
-#include <shellapi.h>
-//#include <winspool.h>
#include <windowsx.h>
#include <shellapi.h>
#include <ctype.h>
}
*/
+void UpdateStatus(HWND hWnd, Entry* pEntry)
+{
+ int file_count = 0;
+ int files_size = 0;
+ TCHAR suffix[10];
+ TCHAR number[50];
+ TCHAR Text[260];
+
+ while (pEntry) {
+ if (pEntry->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+ } else {
+ ++file_count;
+ files_size += pEntry->data.nFileSizeLow;
+ }
+ pEntry = pEntry->next;
+ };
+
+ _tcscpy(suffix, _T(" bytes"));
+ {
+ NUMBERFMT numFmt;
+ memset(&numFmt, 0, sizeof(numFmt));
+ numFmt.NumDigits = 0;
+ numFmt.LeadingZero = 0;
+ numFmt.Grouping = 3;
+ numFmt.lpDecimalSep = _T(".");
+ numFmt.lpThousandSep = _T(",");
+ numFmt.NegativeOrder = 0;
+
+ wsprintf(Text, _T("%d"), files_size);
+ if (GetNumberFormat(LOCALE_USER_DEFAULT, 0, Text, &numFmt, number, sizeof(number))) {
+ wsprintf(Text, _T("Total %d file(s) (%s%s)"), file_count, number, suffix);
+ } else {
+ wsprintf(Text, _T("Total %d file(s) (%d%s)"), file_count, files_size, suffix);
+ }
+ SendMessage(Globals.hStatusBar, SB_SETTEXT, 1, (LPARAM)Text);
+ }
+}
+
////////////////////////////////////////////////////////////////////////////////
static WNDPROC g_orgTreeWndProc;
return OnExpanding(hWnd, (NMTREEVIEW*)lParam);
break;
case TVN_SELCHANGED:
+
+ UpdateStatus(hWnd, child->left.cur->down);
+ break;
// return OnSelChanged((NMTREEVIEW*)lParam);
// break;
#if 0
//ListBox_SetSel(hWnd, TRUE, 1);
//TODO: check menu items
if (!child->nFocusPanel) {
- int file_count = 50;
- int files_size = 1115467;
- TCHAR suffix[10];
- TCHAR Text[260];
- wsprintf(Text, _T("Total %d file(s) (%d%s)"), file_count, files_size, suffix);
- SendMessage(Globals.hStatusBar, SB_SETTEXT, 2, (LPARAM)Text);
+ UpdateStatus(hWnd, pane->cur);
}
break;
case WM_KEYDOWN:
, GRAYED
MENUITEM "&Delete...\tDel", ID_FILE_DELETE, GRAYED
MENUITEM "Re&name...\t", ID_FILE_RENAME, GRAYED
- MENUITEM "Proper&ties...\tAlt+Enter", ID_FILE_PROPERTIES, GRAYED
+ MENUITEM "Proper&ties...\tAlt+Enter", ID_FILE_PROPERTIES
MENUITEM SEPARATOR
MENUITEM "Compre&ss...\t", ID_FILE_COMPRESS, GRAYED
MENUITEM "&Uncompress...\t", ID_FILE_UNCOMPRESS, GRAYED
MENUITEM "Expand &Branch\t*", ID_TREE_EXPAND_BRANCH
MENUITEM "Expand &All\tCtrl+*", ID_TREE_EXPAND_ALL
MENUITEM "Collapse Branch\t-", ID_TREE_COLLAPSE_BRANCH
-
MENUITEM SEPARATOR
MENUITEM "&Indicate Expandable Branches",
ID_TREE_INDICATE_EXPANDABLE_BRANCHES
STRINGTABLE DISCARDABLE
BEGIN
+ ID_TREE_COLLAPSE_BRANCH "Collapses all directories of the selected directory"
ID_FILE_OPEN "Opens selected item"
ID_FILE_MOVE "Moves selected item"
ID_FILE_COPY "Copies files and directories"
ID_TREE_EXPAND_ONE_LEVEL "Displays another level of a directory"
ID_TREE_EXPAND_BRANCH "Displays all levels of a directory"
ID_TREE_EXPAND_ALL "Displays all levels of all directories"
- ID_TREE_COLLAPSE_BRANCH "Collapses all directories of the selected directory"
ID_TREE_INDICATE_EXPANDABLE_BRANCHES
"Indicates directories that have sub-directories"
ID_VIEW_TREE_DIRECTORY "Displays the directory tree and the contents of the current directory"
WS_TABSTOP,13,71,132,8
END
+IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Properties for %s"
+FONT 8, "MS Sans Serif"
+BEGIN
+ DEFPUSHBUTTON "OK",IDOK,191,83,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,191,101,50,14
+ LTEXT "&File Name:",IDC_STATIC,7,7,59,9
+ LTEXT "Static",IDC_STATIC_PROP_PATH,71,18,162,9
+ LTEXT "&Path",IDC_STATIC,7,18,59,9
+ LTEXT "Last Change:",IDC_STATIC,7,29,59,9
+ LTEXT "Version:",IDC_STATIC,7,40,59,9
+ LTEXT "Static",IDC_STATIC_PROP_FILENAME,71,7,162,9,WS_TABSTOP
+ LTEXT "Cop&yright:",IDC_STATIC,7,51,59,9
+ LTEXT "Size:",IDC_STATIC,7,62,59,9
+ LTEXT "Static",IDC_STATIC_PROP_LASTCHANGE,71,29,162,9
+ GROUPBOX "Attributes",IDC_STATIC,7,79,158,46
+ GROUPBOX "&Version Information",IDC_STATIC,7,129,234,79
+ CONTROL "&Read Only",IDC_CHECK_READONLY,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,17,91,68,9
+ CONTROL "&Archive",IDC_CHECK_ARCHIVE,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,17,101,68,9
+ CONTROL "&Compressed",IDC_CHECK_COMPRESSED,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,17,111,68,9
+ CONTROL "H&idden",IDC_CHECK_HIDDEN,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,92,91,68,9
+ CONTROL "&System",IDC_CHECK_SYSTEM,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,92,101,68,9
+ LTEXT "Static",IDC_STATIC_PROP_VERSION,71,40,162,9
+ LTEXT "Static",IDC_STATIC_PROP_COPYRIGHT,71,51,162,9
+ LTEXT "Static",IDC_STATIC_PROP_SIZE,71,62,162,9
+ LISTBOX IDC_LIST_PROP_VERSION_TYPES,13,139,107,63,LBS_SORT |
+ LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+// LISTBOX IDC_LIST_PROP_VERSION_VALUES,123,139,111,63,LBS_SORT |
+// LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+ EDITTEXT IDC_LIST_PROP_VERSION_VALUES,123,139,111,63,ES_MULTILINE | ES_READONLY |
+ WS_VSCROLL
+END
+
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
TOPMARGIN, 7
BOTTOMMARGIN, 82
END
+
+ IDD_DIALOG_PROPERTIES, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 241
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 208
+ END
END
#endif // APSTUDIO_INVOKED
BEGIN
BLOCK "0c0904b0"
BEGIN
- VALUE "Comments", "\0"
- VALUE "CompanyName", "None\0"
- VALUE "FileDescription", "winfile\0"
+ VALUE "Comments", "Absolutely no warranties whatsoever - Use at your own risk\0"
+ VALUE "CompanyName", "ReactWare\0"
+ VALUE "FileDescription", "ReactOS File Manager by Robert Dickenson\0"
VALUE "FileVersion", "1, 0, 0, 1\0"
VALUE "InternalName", "winfile\0"
- VALUE "LegalCopyright", "Copyright © 2002\0"
+ VALUE "LegalCopyright", "Copyright © 2002 Robert Dickenson\0"
VALUE "LegalTrademarks", "\0"
VALUE "OriginalFilename", "winfile.exe\0"
VALUE "PrivateBuild", "\0"
- VALUE "ProductName", "None winfile\0"
+ VALUE "ProductName", "ReactOS File Manager\0"
VALUE "ProductVersion", "1, 0, 0, 1\0"
- VALUE "SpecialBuild", "\0"
+ VALUE "SpecialBuild", "Non-versioned Development Beta Release\0"
END
END
BLOCK "VarFileInfo"