From 0a8fa54c83ee2f5eb1cf3de6a66a3fec4aa46008 Mon Sep 17 00:00:00 2001 From: Robert Dickenson Date: Wed, 10 Jul 2002 18:39:21 +0000 Subject: [PATCH] Updated with latest work. Still far to go... svn path=/trunk/; revision=3207 --- rosapps/regedt32/Makefile | 42 +- rosapps/regedt32/about.cpp | 71 ---- rosapps/regedt32/childwnd.c | 233 +++++++++++ rosapps/regedt32/{regedt32.h => childwnd.h} | 21 +- rosapps/regedt32/debug.cpp | 39 -- rosapps/regedt32/debug.h | 28 -- rosapps/regedt32/framewnd.c | 227 +++++++++++ rosapps/regedt32/{about.h => framewnd.h} | 19 +- rosapps/regedt32/main.c | 180 +++++++++ rosapps/regedt32/main.h | 75 ++++ rosapps/regedt32/regedt32.cpp | 419 -------------------- rosapps/regedt32/regedt32.rc | 11 +- rosapps/regedt32/{ => res}/regedt32.ico | Bin rosapps/regedt32/{ => res}/small.ico | Bin rosapps/regedt32/resource.h | 41 +- rosapps/winfile/childwnd.c | 14 +- rosapps/winfile/framewnd.c | 83 +++- rosapps/winfile/listview.c | 68 +++- rosapps/winfile/listview.h | 1 + rosapps/winfile/main.c | 35 +- rosapps/winfile/treeview.c | 365 +++++++++++------ rosapps/winfile/treeview.h | 6 +- rosapps/winfile/utils.c | 17 +- rosapps/winfile/winfile.rc | 5 +- 24 files changed, 1217 insertions(+), 783 deletions(-) delete mode 100644 rosapps/regedt32/about.cpp create mode 100644 rosapps/regedt32/childwnd.c rename rosapps/regedt32/{regedt32.h => childwnd.h} (76%) delete mode 100644 rosapps/regedt32/debug.cpp delete mode 100644 rosapps/regedt32/debug.h create mode 100644 rosapps/regedt32/framewnd.c rename rosapps/regedt32/{about.h => framewnd.h} (77%) create mode 100644 rosapps/regedt32/main.c create mode 100644 rosapps/regedt32/main.h delete mode 100644 rosapps/regedt32/regedt32.cpp rename rosapps/regedt32/{ => res}/regedt32.ico (100%) rename rosapps/regedt32/{ => res}/small.ico (100%) diff --git a/rosapps/regedt32/Makefile b/rosapps/regedt32/Makefile index 44fe5dd1647..b02ab95955e 100644 --- a/rosapps/regedt32/Makefile +++ b/rosapps/regedt32/Makefile @@ -29,9 +29,9 @@ BASE_CFLAGS = -DGCC -D_WIN32_IE=0x0400 RCFLAGS = -DGCC -D_WIN32_IE=0x0400 -OBJS = about.o \ - debug.o \ - $(TARGET).o +OBJS = framewnd.o \ + childwnd.o \ + main.o LIBS = -lgdi32 -luser32 -lkernel32 -lcomctl32 @@ -44,41 +44,13 @@ $(TARGET).exe: $(OBJS) $(TARGET).coff $(NM) --numeric-sort $(TARGET).exe > $(TARGET).sym -about.o: about.cpp about.h resource.h +main.o: main.c main.h framewnd.h resource.h -affinity.o: affinity.cpp affinity.h +framewnd.o: framewnd.c framewnd.h resource.h -applicationpage.o: applicationpage.cpp applicationpage.h processpage.h $(TARGET).h resource.h +childwnd.o: childwnd.c childwnd.h resource.h -column.o: column.cpp column.h resource.h - -debug.o: debug.cpp debug.h - -endproc.o: endproc.cpp endproc.h - -font.o: font.cpp font.h - -graph.o: graph.cpp graph.h resource.h - -graphctrl.o: graphctrl.cpp graphctrl.h resource.h - -optnmenu.o: optnmenu.cpp optnmenu.h resource.h - -perfdata.o: perfdata.cpp perfdata.h - -performancepage.o: performancepage.cpp performancepage.h perfdata.h graphctrl.h graph.h $(TARGET).h resource.h - -priority.o: priority.cpp priority.h - -processpage.o: processpage.cpp processpage.h perfdata.h column.h proclist.h $(TARGET).h resource.h - -proclist.o: proclist.cpp proclist.h - -run.o: run.cpp run.h - -trayicon.o: trayicon.cpp trayicon.h resource.h - -$(TARGET).o: $(TARGET).cpp $(TARGET).h resource.h +$(TARGET).o: $(TARGET).c $(TARGET).h resource.h clean: - $(RM) $(OBJS) diff --git a/rosapps/regedt32/about.cpp b/rosapps/regedt32/about.cpp deleted file mode 100644 index 4ff3f941a08..00000000000 --- a/rosapps/regedt32/about.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ReactOS About Dialog Box - * - * about.cpp - * - * Copyright (C) 2002 Robert Dickenson - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifdef _MSC_VER -#include "stdafx.h" -#else -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -#include -#include -#include -#include -#include -#include -#include -#include -#endif - -#include "regedt32.h" -#include "about.h" - - -extern HINSTANCE hInst; -//extern HWND hMainWnd; - -LRESULT CALLBACK AboutDialogWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); - - -void ShowAboutBox(HWND hWnd) -{ - DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, (DLGPROC)AboutDialogWndProc); -} - -LRESULT CALLBACK AboutDialogWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - HWND hLicenseEditWnd; - TCHAR strLicense[0x1000]; - - switch (message) { - case WM_INITDIALOG: - hLicenseEditWnd = GetDlgItem(hDlg, IDC_LICENSE_EDIT); - LoadString(hInst, IDS_LICENSE, strLicense, 0x1000); - SetWindowText(hLicenseEditWnd, strLicense); - return TRUE; - case WM_COMMAND: - if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL)) { - EndDialog(hDlg, LOWORD(wParam)); - return TRUE; - } - break; - } - return 0; -} diff --git a/rosapps/regedt32/childwnd.c b/rosapps/regedt32/childwnd.c new file mode 100644 index 00000000000..780827e1c46 --- /dev/null +++ b/rosapps/regedt32/childwnd.c @@ -0,0 +1,233 @@ +/* + * ReactOS regedt32 + * + * childwnd.c + * + * Copyright (C) 2002 Robert Dickenson + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifdef _MSC_VER +#include "stdafx.h" +#else +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +#include +#define ASSERT assert + +#include "main.h" +#include "childwnd.h" + +//////////////////////////////////////////////////////////////////////////////// + +static void draw_splitbar(HWND hWnd, int x) +{ + RECT rt; + HDC hdc = GetDC(hWnd); + + GetClientRect(hWnd, &rt); + rt.left = x - SPLIT_WIDTH/2; + rt.right = x + SPLIT_WIDTH/2+1; + InvertRect(hdc, &rt); + ReleaseDC(hWnd, hdc); +} + + +static void OnPaint(HWND hWnd, ChildWnd* pChildWnd) +{ + PAINTSTRUCT ps; + RECT rt; + HDC hdc; + + GetClientRect(hWnd, &rt); + hdc = BeginPaint(hWnd, &ps); + FillRect(ps.hdc, &rt, GetStockObject(BLACK_BRUSH)); + EndPaint(hWnd, &ps); +} + + +static void OnSize(ChildWnd* pChildWnd, WPARAM wParam, LPARAM lParam) +{ + if (wParam != SIZE_MINIMIZED) { + //resize_tree(pChildWnd, LOWORD(lParam), HIWORD(lParam)); + } +} + +// +// FUNCTION: ChildWndProc(HWND, unsigned, WORD, LONG) +// +// PURPOSE: Processes messages for the child windows. +// +// WM_COMMAND - process the application menu +// WM_PAINT - Paint the main window +// WM_DESTROY - post a quit message and return +// +// +LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + static int last_split; + ChildWnd* pChildWnd = (ChildWnd*)GetWindowLong(hWnd, GWL_USERDATA); + ASSERT(pChildWnd); + + switch (message) { + case WM_PAINT: + OnPaint(hWnd, pChildWnd); + return 0; + case WM_SETCURSOR: + if (LOWORD(lParam) == HTCLIENT) { + POINT pt; + GetCursorPos(&pt); + ScreenToClient(hWnd, &pt); + if (pt.x>=pChildWnd->nSplitPos-SPLIT_WIDTH/2 && pt.xnSplitPos+SPLIT_WIDTH/2+1) { + SetCursor(LoadCursor(0, IDC_SIZEWE)); + return TRUE; + } + } + //goto def; + break; + + case WM_DESTROY: + PostQuitMessage(0); + break; + case WM_LBUTTONDOWN: { + RECT rt; + int x = LOWORD(lParam); + GetClientRect(hWnd, &rt); + if (x>=pChildWnd->nSplitPos-SPLIT_WIDTH/2 && xnSplitPos+SPLIT_WIDTH/2+1) { + last_split = pChildWnd->nSplitPos; +#ifdef _NO_EXTENSIONS + draw_splitbar(hWnd, last_split); +#endif + SetCapture(hWnd); + } + break;} + + case WM_LBUTTONUP: + if (GetCapture() == hWnd) { +#ifdef _NO_EXTENSIONS + RECT rt; + int x = LOWORD(lParam); + draw_splitbar(hWnd, last_split); + last_split = -1; + GetClientRect(hWnd, &rt); + pChildWnd->nSplitPos = x; + //resize_tree(pChildWnd, rt.right, rt.bottom); +#endif + ReleaseCapture(); + } + break; + +#ifdef _NO_EXTENSIONS + case WM_CAPTURECHANGED: + if (GetCapture()==hWnd && last_split>=0) + draw_splitbar(hWnd, last_split); + break; +#endif + case WM_KEYDOWN: + if (wParam == VK_ESCAPE) + if (GetCapture() == hWnd) { + RECT rt; +#ifdef _NO_EXTENSIONS + draw_splitbar(hWnd, last_split); +#else + pChildWnd->nSplitPos = last_split; +#endif + GetClientRect(hWnd, &rt); + //resize_tree(pChildWnd, rt.right, rt.bottom); + last_split = -1; + ReleaseCapture(); + SetCursor(LoadCursor(0, IDC_ARROW)); + } + break; + + case WM_MOUSEMOVE: + if (GetCapture() == hWnd) { + RECT rt; + int x = LOWORD(lParam); +#ifdef _NO_EXTENSIONS + HDC hdc = GetDC(hWnd); + GetClientRect(hWnd, &rt); + rt.left = last_split-SPLIT_WIDTH/2; + rt.right = last_split+SPLIT_WIDTH/2+1; + InvertRect(hdc, &rt); + last_split = x; + rt.left = x-SPLIT_WIDTH/2; + rt.right = x+SPLIT_WIDTH/2+1; + InvertRect(hdc, &rt); + ReleaseDC(hWnd, hdc); +#else + GetClientRect(hWnd, &rt); + if (x>=0 && xnSplitPos = x; + //resize_tree(pChildWnd, rt.right, rt.bottom); + rt.left = x-SPLIT_WIDTH/2; + rt.right = x+SPLIT_WIDTH/2+1; + InvalidateRect(hWnd, &rt, FALSE); + UpdateWindow(pChildWnd->hLeftWnd); + UpdateWindow(hWnd); + UpdateWindow(pChildWnd->hRightWnd); + } +#endif + } + break; + +#ifndef _NO_EXTENSIONS + case WM_GETMINMAXINFO: + DefMDIChildProc(hWnd, message, wParam, lParam); + {LPMINMAXINFO lpmmi = (LPMINMAXINFO)lParam; + lpmmi->ptMaxTrackSize.x <<= 1;//2*GetSystemMetrics(SM_CXSCREEN) / SM_CXVIRTUALSCREEN + lpmmi->ptMaxTrackSize.y <<= 1;//2*GetSystemMetrics(SM_CYSCREEN) / SM_CYVIRTUALSCREEN + break;} +#endif + + case WM_SETFOCUS: + SetCurrentDirectory(pChildWnd->szPath); + SetFocus(pChildWnd->nFocusPanel? pChildWnd->hRightWnd: pChildWnd->hLeftWnd); + break; + + case WM_TIMER: + break; + + case WM_COMMAND: + // Parse the menu selections: + switch (LOWORD(wParam)) { + case IDM_EXIT: + DestroyWindow(hWnd); + break; + default: + return DefMDIChildProc(hWnd, message, wParam, lParam); + } + break; + + case WM_SIZE: + if (wParam != SIZE_MINIMIZED) { + OnSize(pChildWnd, wParam, lParam); + } + // fall through + default: + return DefMDIChildProc(hWnd, message, wParam, lParam); + } + return 0; +} diff --git a/rosapps/regedt32/regedt32.h b/rosapps/regedt32/childwnd.h similarity index 76% rename from rosapps/regedt32/regedt32.h rename to rosapps/regedt32/childwnd.h index 69ce5c01714..b9e680d6fda 100644 --- a/rosapps/regedt32/regedt32.h +++ b/rosapps/regedt32/childwnd.h @@ -1,7 +1,7 @@ /* - * ReactOS regedt32 + * ReactOS Application MDI Child Window * - * regedt32.h + * childwnd.h * * Copyright (C) 2002 Robert Dickenson * @@ -20,14 +20,23 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#ifndef __REGEDT32_H__ -#define __REGEDT32_H__ +#ifndef __CHILD_WND_H__ +#define __CHILD_WND_H__ + +#ifdef __cplusplus +extern "C" { +#endif #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 -#include "resource.h" +LRESULT CALLBACK ChildWndProc(HWND, UINT, WPARAM, LPARAM); + -#endif // __REGEDT32_H__ +#ifdef __cplusplus +}; +#endif + +#endif // __CHILD_WND_H__ diff --git a/rosapps/regedt32/debug.cpp b/rosapps/regedt32/debug.cpp deleted file mode 100644 index 5310a90bc30..00000000000 --- a/rosapps/regedt32/debug.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/* - * ReactOS Application Debug Routines - * - * debug.cpp - * - * Copyright (C) 2002 Robert Dickenson - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifdef _MSC_VER -#include "stdafx.h" -#else -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -#include -#include -#include -#include -#include -#include -#include -#include -#endif - -#include "regedt32.h" -#include "debug.h" - diff --git a/rosapps/regedt32/debug.h b/rosapps/regedt32/debug.h deleted file mode 100644 index f9f96e67238..00000000000 --- a/rosapps/regedt32/debug.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * ReactOS Application Debug Routines - * - * debug.cpp - * - * Copyright (C) 2002 Robert Dickenson - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __DEBUG_H__ -#define __DEBUG_H__ - - - -#endif // __DEBUG_H__ \ No newline at end of file diff --git a/rosapps/regedt32/framewnd.c b/rosapps/regedt32/framewnd.c new file mode 100644 index 00000000000..1a7312cf896 --- /dev/null +++ b/rosapps/regedt32/framewnd.c @@ -0,0 +1,227 @@ +/* + * ReactOS regedt32 + * + * framewnd.c + * + * Copyright (C) 2002 Robert Dickenson + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifdef _MSC_VER +#include "stdafx.h" +#else +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +#include + +#include "main.h" +#include "framewnd.h" + + +//////////////////////////////////////////////////////////////////////////////// +// Global Variables: +// + +BOOL bInMenuLoop = FALSE; // Tells us if we are in the menu loop + + +//////////////////////////////////////////////////////////////////////////////// +// Local module support methods +// + +//////////////////////////////////////////////////////////////////////////////// +static HHOOK hcbthook; +static ChildWnd* newchild = NULL; + +LRESULT CALLBACK CBTProc(int code, WPARAM wParam, LPARAM lParam) +{ + if (code == HCBT_CREATEWND && newchild) { + ChildWnd* pChildWnd = newchild; + newchild = NULL; + pChildWnd->hWnd = (HWND)wParam; + SetWindowLong(pChildWnd->hWnd, GWL_USERDATA, (LPARAM)pChildWnd); + } + return CallNextHookEx(hcbthook, code, wParam, lParam); +} + +static HWND InitChildWindow(LPTSTR param) +{ + //TCHAR drv[_MAX_DRIVE]; + TCHAR path[MAX_PATH]; + ChildWnd* pChildWnd = NULL; + pChildWnd = (ChildWnd*)malloc(sizeof(ChildWnd)); + if (pChildWnd != NULL) { + MDICREATESTRUCT mcs = { + szChildClass, path, hInst, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + 0/*style*/, 0/*lParam*/ + }; + memset(pChildWnd, 0, sizeof(ChildWnd)); + lstrcpy(pChildWnd->szPath, path); + pChildWnd->pos.length = sizeof(WINDOWPLACEMENT); + pChildWnd->pos.flags = 0; + pChildWnd->pos.showCmd = SW_SHOWNORMAL; + pChildWnd->pos.rcNormalPosition.left = CW_USEDEFAULT; + pChildWnd->pos.rcNormalPosition.top = CW_USEDEFAULT; + pChildWnd->pos.rcNormalPosition.right = CW_USEDEFAULT; + pChildWnd->pos.rcNormalPosition.bottom = CW_USEDEFAULT; + pChildWnd->nFocusPanel = 0; + pChildWnd->nSplitPos = 200; + hcbthook = SetWindowsHookEx(WH_CBT, CBTProc, 0, GetCurrentThreadId()); + newchild = pChildWnd; + pChildWnd->hWnd = (HWND)SendMessage(hMDIClient, WM_MDICREATE, 0, (LPARAM)&mcs); + UnhookWindowsHookEx(hcbthook); + if (pChildWnd->hWnd == NULL) { + free(pChildWnd); + newchild = pChildWnd = NULL; + } + return pChildWnd->hWnd; + } + return 0; +} +BOOL CALLBACK CloseEnumProc(HWND hWnd, LPARAM lParam) +{ + if (!GetWindow(hWnd, GW_OWNER)) { + SendMessage(GetParent(hWnd), WM_MDIRESTORE, (WPARAM)hWnd, 0); + if (SendMessage(hWnd, WM_QUERYENDSESSION, 0, 0)) { + SendMessage(GetParent(hWnd), WM_MDIDESTROY, (WPARAM)hWnd, 0); + } + } + return 1; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// FUNCTION: _CmdWndProc(HWND, unsigned, WORD, LONG) +// +// PURPOSE: Processes WM_COMMAND messages for the main frame window. +// +// + +LRESULT _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + HWND hChildWnd; + if (1) { + switch (LOWORD(wParam)) { + case ID_WINDOW_CLOSEALL: + EnumChildWindows(hMDIClient, &CloseEnumProc, 0); + break; + case ID_WINDOW_CLOSE: + hChildWnd = (HWND) SendMessage(hMDIClient, WM_MDIGETACTIVE, 0, 0); + if (!SendMessage(hChildWnd, WM_QUERYENDSESSION, 0, 0)) + SendMessage(hMDIClient, WM_MDIDESTROY, (WPARAM)hChildWnd, 0); + break; +// case ID_FILE_EXIT: +// SendMessage(hWnd, WM_CLOSE, 0, 0); +// break; +// case IDM_EXIT: +// DestroyWindow(hWnd); +// break; +// case ID_FILE_OPEN: + case ID_REGISTRY_PRINTERSETUP: + //PRINTDLG pd; + //PrintDlg(&pd); + //PAGESETUPDLG psd; + //PageSetupDlg(&psd); + break; + case ID_REGISTRY_OPENLOCAL: + case ID_WINDOW_NEW_WINDOW: + InitChildWindow("Child Window"); + return 0; + case ID_WINDOW_CASCADE: + SendMessage(hMDIClient, WM_MDICASCADE, 0, 0); + break; + case ID_WINDOW_TILE_HORZ: + SendMessage(hMDIClient, WM_MDITILE, MDITILE_HORIZONTAL, 0); + break; + case ID_WINDOW_TILE_VERT: + SendMessage(hMDIClient, WM_MDITILE, MDITILE_VERTICAL, 0); + break; + case ID_WINDOW_ARRANGE_ICONS: + SendMessage(hMDIClient, WM_MDIICONARRANGE, 0, 0); + break; + case ID_HELP_ABOUT: +// ShowAboutBox(hWnd); + { + HICON hIcon = LoadIcon(hInst, (LPCTSTR)IDI_REGEDT32); + ShellAbout(hWnd, szTitle, "FrameWndProc", hIcon); + //if (hIcon) DestroyIcon(hIcon); // NOT REQUIRED + } + break; + default: + hChildWnd = (HWND)SendMessage(hMDIClient, WM_MDIGETACTIVE, 0, 0); + if (IsWindow(hChildWnd)) + SendMessage(hChildWnd, WM_COMMAND, wParam, lParam); + else + return DefFrameProc(hWnd, hMDIClient, message, wParam, lParam); + } + } + return 0; +} + +//////////////////////////////////////////////////////////////////////////////// +// +// FUNCTION: FrameWndProc(HWND, unsigned, WORD, LONG) +// +// PURPOSE: Processes messages for the main frame window. +// +// WM_COMMAND - process the application menu +// WM_DESTROY - post a quit message and return +// +// + +LRESULT CALLBACK FrameWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) { + case WM_CREATE: + { + HMENU hMenuWindow = GetSubMenu(hMenuFrame, GetMenuItemCount(hMenuFrame)-2); + CLIENTCREATESTRUCT ccs = { hMenuWindow, IDW_FIRST_CHILD }; + hMDIClient = CreateWindowEx(0, _T("MDICLIENT"), NULL, + WS_CHILD|WS_CLIPCHILDREN|WS_VSCROLL|WS_HSCROLL|WS_VISIBLE|WS_BORDER, + 0, 0, 0, 0, + hWnd, (HMENU)0, hInst, &ccs); + } + break; + case WM_COMMAND: + return _CmdWndProc(hWnd, message, wParam, lParam); + break; + case WM_DESTROY: + PostQuitMessage(0); + break; + case WM_QUERYENDSESSION: + case WM_CLOSE: + SendMessage(hWnd, WM_COMMAND, ID_WINDOW_CLOSEALL, 0); + if (GetWindow(hMDIClient, GW_CHILD) != NULL) + return 0; + // else fall thru... + default: + return DefFrameProc(hWnd, hMDIClient, message, wParam, lParam); + } + return 0; +} + + diff --git a/rosapps/regedt32/about.h b/rosapps/regedt32/framewnd.h similarity index 77% rename from rosapps/regedt32/about.h rename to rosapps/regedt32/framewnd.h index bfe6e6ed85c..d72290b430a 100644 --- a/rosapps/regedt32/about.h +++ b/rosapps/regedt32/framewnd.h @@ -1,7 +1,7 @@ /* - * ReactOS About Dialog Box + * ReactOS Application Main Window * - * about.h + * framewnd.h * * Copyright (C) 2002 Robert Dickenson * @@ -19,19 +19,24 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#ifndef __ABOUT_H__ -#define __ABOUT_H__ + +#ifndef __FRAME_WND_H__ +#define __FRAME_WND_H__ #ifdef __cplusplus extern "C" { #endif -void ShowAboutBox(HWND hWnd); +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +LRESULT CALLBACK FrameWndProc(HWND, UINT, WPARAM, LPARAM); + + #ifdef __cplusplus }; #endif -#endif // __ABOUT_H__ +#endif // __FRAME_WND_H__ diff --git a/rosapps/regedt32/main.c b/rosapps/regedt32/main.c new file mode 100644 index 00000000000..fe3727a5cfb --- /dev/null +++ b/rosapps/regedt32/main.c @@ -0,0 +1,180 @@ +/* + * ReactOS regedt32 + * + * main.c + * + * Copyright (C) 2002 Robert Dickenson + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifdef _MSC_VER +#include "stdafx.h" +#else +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +#include "main.h" +#include "framewnd.h" +#include "childwnd.h" + + +//////////////////////////////////////////////////////////////////////////////// +// Global Variables: +// + +HINSTANCE hInst; +HACCEL hAccel; +HWND hFrameWnd; +HMENU hMenuFrame; +HWND hMDIClient; +HWND hStatusBar; + +TCHAR szTitle[MAX_LOADSTRING]; +TCHAR szFrameClass[MAX_LOADSTRING]; +TCHAR szChildClass[MAX_LOADSTRING]; + +//////////////////////////////////////////////////////////////////////////////// + +BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) +{ + WNDCLASSEX wcFrame = { + sizeof(WNDCLASSEX), + CS_HREDRAW | CS_VREDRAW/*style*/, + FrameWndProc, + 0/*cbClsExtra*/, + 0/*cbWndExtra*/, + hInstance, + LoadIcon(hInstance, MAKEINTRESOURCE(IDI_REGEDT32)), + LoadCursor(0, IDC_ARROW), + 0/*hbrBackground*/, + 0/*lpszMenuName*/, + szFrameClass, + (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDI_REGEDT32), IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED) + }; + ATOM hFrameWndClass = RegisterClassEx(&wcFrame); // register frame window class + + WNDCLASSEX wcChild = { + sizeof(WNDCLASSEX), + CS_HREDRAW | CS_VREDRAW/*style*/, + ChildWndProc, + 0/*cbClsExtra*/, + sizeof(HANDLE)/*cbWndExtra*/, + hInstance, + LoadIcon(hInstance, MAKEINTRESOURCE(IDI_REGEDT32)), + LoadCursor(0, IDC_ARROW), + 0/*hbrBackground*/, + 0/*lpszMenuName*/, + szChildClass, + (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDI_REGEDT32), IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED) + + }; + ATOM hChildWndClass = RegisterClassEx(&wcChild); // register child windows class + + HMENU hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_REGEDT32_MENU)); + HMENU hMenuOptions = GetSubMenu(hMenu, ID_OPTIONS_MENU); + HMENU hChildMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_REGEDT32_MENU)); + + INITCOMMONCONTROLSEX icc = { + sizeof(INITCOMMONCONTROLSEX), + ICC_BAR_CLASSES + }; + + hMenuFrame = hMenu; + hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_REGEDT32)); + + // Initialize the Windows Common Controls DLL + InitCommonControls(); + + hFrameWnd = CreateWindowEx(0, (LPCTSTR)(int)hFrameWndClass, szTitle, + WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + NULL/*hWndParent*/, hMenuFrame, hInstance, NULL/*lpParam*/); + if (!hFrameWnd) { + return FALSE; + } + +#if 0 + { + int nParts[3]; + // Create the status bar + hStatusBar = CreateStatusWindow(WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|SBT_NOBORDERS, "", hFrameWnd, STATUS_WINDOW); + if (!hStatusBar) + return FALSE; + // Create the status bar panes + nParts[0] = 100; + nParts[1] = 210; + nParts[2] = 400; + SendMessage(hStatusBar, SB_SETPARTS, 3, (long)nParts); + } +#endif + + ShowWindow(hFrameWnd, nCmdShow); + UpdateWindow(hFrameWnd); + return TRUE; +} + +//////////////////////////////////////////////////////////////////////////////// + +void ExitInstance(void) +{ + DestroyMenu(hMenuFrame); +} + +int APIENTRY WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nCmdShow) +{ + MSG msg; +// HACCEL hAccel; + HWND hMDIClient; + + // Initialize global strings + LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); + LoadString(hInstance, IDC_REGEDT32_FRAME, szFrameClass, MAX_LOADSTRING); + LoadString(hInstance, IDC_REGEDT32, szChildClass, MAX_LOADSTRING); + + // Store instance handle in our global variable + hInst = hInstance; + + // Perform application initialization: + if (!InitInstance(hInstance, nCmdShow)) { + return FALSE; + } +// hAccel = LoadAccelerators(hInstance, (LPCTSTR)IDC_REGEDT32); + hMDIClient = GetWindow(hFrameWnd, GW_CHILD); + + // Main message loop: + while (GetMessage(&msg, (HWND)NULL, 0, 0)) { + if (!TranslateMDISysAccel(hMDIClient, &msg) && + !TranslateAccelerator(hFrameWnd, hAccel, &msg)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + ExitInstance(); + return msg.wParam; +} diff --git a/rosapps/regedt32/main.h b/rosapps/regedt32/main.h new file mode 100644 index 00000000000..eb93f5479cf --- /dev/null +++ b/rosapps/regedt32/main.h @@ -0,0 +1,75 @@ +/* + * ReactOS regedt32 + * + * main.h + * + * Copyright (C) 2002 Robert Dickenson + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __MAIN_H__ +#define __MAIN_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "resource.h" + + +//////////////////////////////////////////////////////////////////////////////// + +#define SPLIT_WIDTH 5 +#define MAX_LOADSTRING 100 + +typedef struct { + HWND hWnd; + HWND hLeftWnd; + HWND hRightWnd; + int nFocusPanel; // 0: left 1: right + int nSplitPos; + WINDOWPLACEMENT pos; + TCHAR szPath[MAX_PATH]; +} ChildWnd; + +//void UpdateStatusBar(void); + + +//////////////////////////////////////////////////////////////////////////////// +// Global Variables: + +extern HINSTANCE hInst; +extern HACCEL hAccel; +extern HWND hFrameWnd; +extern HMENU hMenuFrame; +extern HWND hMDIClient; +//extern HWND hStatusBar; +//extern HWND hToolBar; +extern HFONT hFont; + +extern TCHAR szTitle[]; +extern TCHAR szFrameClass[]; +extern TCHAR szChildClass[]; + +#ifdef __cplusplus +}; +#endif + +#endif // __MAIN_H__ diff --git a/rosapps/regedt32/regedt32.cpp b/rosapps/regedt32/regedt32.cpp deleted file mode 100644 index 865429acffd..00000000000 --- a/rosapps/regedt32/regedt32.cpp +++ /dev/null @@ -1,419 +0,0 @@ -/* - * ReactOS regedt32 - * - * regedt32.cpp - * - * Copyright (C) 2002 Robert Dickenson - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifdef _MSC_VER -#include "stdafx.h" -#else -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -#include -#include -#include -#include -#include -#include -#include -#include -#endif - -#include "resource.h" -#include -//#include - -#define STATUS_WINDOW 2001 -#define MAX_LOADSTRING 100 - -// Global Variables: -HINSTANCE hInst; // current instance - -HWND hMainWnd; // Main Window -HWND hStatusWnd; // Status Bar Window -HWND hTabWnd; // Tab Control Window - -int nMinimumWidth; // Minimum width of the dialog (OnSize()'s cx) -int nMinimumHeight; // Minimum height of the dialog (OnSize()'s cy) - -int nOldWidth; // Holds the previous client area width -int nOldHeight; // Holds the previous client area height - -BOOL bInMenuLoop = FALSE; // Tells us if we are in the menu loop - -TCHAR szTitle[MAX_LOADSTRING]; // The title bar text -TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text -TCHAR szFrameClass[MAX_LOADSTRING]; // The title bar text - -// Foward declarations of functions included in this code module: -ATOM MyRegisterClass(HINSTANCE hInstance); -ATOM MyRegisterClass2(HINSTANCE hInstance); -BOOL InitInstance(HINSTANCE, int); -LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); -LRESULT CALLBACK FrameWndProc(HWND, UINT, WPARAM, LPARAM); - - -int APIENTRY WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) -{ - MSG msg; - HACCEL hAccelTable; - - // Initialize global strings - LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); - LoadString(hInstance, IDC_REGEDT32, szWindowClass, MAX_LOADSTRING); - LoadString(hInstance, IDC_REGEDT32_FRAME, szFrameClass, MAX_LOADSTRING); - - MyRegisterClass(hInstance); - MyRegisterClass2(hInstance); - - // Perform application initialization: - if (!InitInstance(hInstance, nCmdShow)) { - return FALSE; - } - hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_REGEDT32); - - // Main message loop: - while (GetMessage(&msg, NULL, 0, 0)) { - if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - return msg.wParam; -} - - - -// -// FUNCTION: MyRegisterClass() -// -// PURPOSE: Registers the window class. -// -// COMMENTS: -// -// This function and its usage is only necessary if you want this code -// to be compatible with Win32 systems prior to the 'RegisterClassEx' -// function that was added to Windows 95. It is important to call this function -// so that the application will get 'well formed' small icons associated -// with it. -// -ATOM MyRegisterClass(HINSTANCE hInstance) -{ - WNDCLASSEX wcex; - - wcex.cbSize = sizeof(WNDCLASSEX); - wcex.style = CS_HREDRAW | CS_VREDRAW; - wcex.lpfnWndProc = (WNDPROC)WndProc; - wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; - wcex.hInstance = hInstance; - wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_REGEDT32); - wcex.hCursor = LoadCursor(NULL, IDC_ARROW); - wcex.hbrBackground = (HBRUSH)SS_BLACKRECT/*(COLOR_WINDOW+1)*/; -// wcex.lpszMenuName = (LPCSTR)IDC_REGEDT32; - wcex.lpszMenuName = (LPCSTR)IDR_REGEDT32_MENU; - wcex.lpszClassName = szWindowClass; - wcex.hIconSm = LoadIcon((HINSTANCE)wcex.hInstance, (LPCTSTR)IDI_SMALL); - return RegisterClassEx(&wcex); -} - -ATOM MyRegisterClass2(HINSTANCE hInstance) -{ - WNDCLASSEX wcex; - - wcex.cbSize = sizeof(WNDCLASSEX); - wcex.style = CS_HREDRAW | CS_VREDRAW; - wcex.lpfnWndProc = (WNDPROC)FrameWndProc; - wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; - wcex.hInstance = hInstance; - wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_REGEDT32); - wcex.hCursor = LoadCursor(NULL, IDC_ARROW); - wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); - wcex.lpszMenuName = (LPCSTR)IDR_REGEDT32_MENU; - wcex.lpszClassName = szFrameClass; - wcex.hIconSm = LoadIcon((HINSTANCE)wcex.hInstance, (LPCTSTR)IDI_SMALL); - return RegisterClassEx(&wcex); -} - -// -// -// FUNCTION: InitInstance(HANDLE, int) -// -// PURPOSE: Saves instance handle and creates main window -// -// COMMENTS: -// -// In this function, we save the instance handle in a global variable and -// create and display the main program window. -// -BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) -{ - int nParts[3]; - - // Initialize the Windows Common Controls DLL - InitCommonControls(); - - hInst = hInstance; // Store instance handle in our global variable - hMainWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); - if (!hMainWnd) { - return FALSE; - } - - // Get the minimum window sizes -// GetWindowRect(hMainWnd, &rc); -// nMinimumWidth = (rc.right - rc.left); -// nMinimumHeight = (rc.bottom - rc.top); - - // Create the status bar - hStatusWnd = CreateStatusWindow(WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|SBT_NOBORDERS, - "", hMainWnd, STATUS_WINDOW); - if (!hStatusWnd) - return FALSE; - - // Create the status bar panes - nParts[0] = 100; - nParts[1] = 210; - nParts[2] = 400; - SendMessage(hStatusWnd, SB_SETPARTS, 3, (long)nParts); - - - ShowWindow(hMainWnd, nCmdShow); - UpdateWindow(hMainWnd); - return TRUE; -} - - -// OnSize() -// This function handles all the sizing events for the application -// It re-sizes every window, and child window that needs re-sizing -void OnSize(UINT nType, int cx, int cy) -{ - int nParts[3]; - int nXDifference; - int nYDifference; - RECT rc; - - if (nType == SIZE_MINIMIZED) - return; - - nXDifference = cx - nOldWidth; - nYDifference = cy - nOldHeight; - nOldWidth = cx; - nOldHeight = cy; - - // Update the status bar size - GetWindowRect(hStatusWnd, &rc); - SendMessage(hStatusWnd, WM_SIZE, nType, MAKELPARAM(cx, cy + (rc.bottom - rc.top))); - - // Update the status bar pane sizes - nParts[0] = bInMenuLoop ? -1 : 100; - nParts[1] = 210; - nParts[2] = cx; - SendMessage(hStatusWnd, SB_SETPARTS, bInMenuLoop ? 1 : 3, (long)nParts); -} - -void OnEnterMenuLoop(HWND hWnd) -{ - int nParts; - - // Update the status bar pane sizes - nParts = -1; - SendMessage(hStatusWnd, SB_SETPARTS, 1, (long)&nParts); - bInMenuLoop = TRUE; - SendMessage(hStatusWnd, SB_SETTEXT, (WPARAM)0, (LPARAM)_T("")); -} - -void OnExitMenuLoop(HWND hWnd) -{ - RECT rc; - int nParts[3]; -// TCHAR text[260]; - - bInMenuLoop = FALSE; - // Update the status bar pane sizes - GetClientRect(hWnd, &rc); - nParts[0] = 100; - nParts[1] = 210; - nParts[2] = rc.right; - SendMessage(hStatusWnd, SB_SETPARTS, 3, (long)nParts); - SendMessage(hStatusWnd, SB_SETTEXT, 0, (LPARAM)_T("")); -// wsprintf(text, _T("CPU Usage: %3d%%"), PerfDataGetProcessorUsage()); -// SendMessage(hStatusWnd, SB_SETTEXT, 1, (LPARAM)text); -// wsprintf(text, _T("Processes: %d"), PerfDataGetProcessCount()); -// SendMessage(hStatusWnd, SB_SETTEXT, 0, (LPARAM)text); -} - -void OnMenuSelect(HWND hWnd, UINT nItemID, UINT nFlags, HMENU hSysMenu) -{ - TCHAR str[100]; - - strcpy(str, TEXT("")); - if (LoadString(hInst, nItemID, str, 100)) { - // load appropriate string - LPTSTR lpsz = str; - // first newline terminates actual string - lpsz = _tcschr(lpsz, '\n'); - if (lpsz != NULL) - *lpsz = '\0'; - } - SendMessage(hStatusWnd, SB_SETTEXT, 0, (LPARAM)str); -} - - -LRESULT CALLBACK FrameWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - int wmId, wmEvent; - PAINTSTRUCT ps; - HDC hdc; - TCHAR szHello[MAX_LOADSTRING]; - LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); - - switch (message) { - case WM_COMMAND: - wmId = LOWORD(wParam); - wmEvent = HIWORD(wParam); - // Parse the menu selections: - switch (wmId) { - case IDM_ABOUT: -// ShowAboutBox(hWnd); - { - HICON hIcon = LoadIcon(hInst, (LPCTSTR)IDI_REGEDT32); - ShellAbout(hWnd, szTitle, "FrameWndProc", hIcon); - //if (hIcon) DestroyIcon(hIcon); // NOT REQUIRED - } - break; - case IDM_EXIT: - DestroyWindow(hWnd); - break; - default: - return DefWindowProc(hWnd, message, wParam, lParam); - } - break; - case WM_PAINT: - hdc = BeginPaint(hWnd, &ps); - // TODO: Add any drawing code here... - RECT rt; - GetClientRect(hWnd, &rt); - DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER); - EndPaint(hWnd, &ps); - break; - case WM_DESTROY: - PostQuitMessage(0); - break; - default: - return DefWindowProc(hWnd, message, wParam, lParam); - } - return 0; -} - - -// -// FUNCTION: WndProc(HWND, unsigned, WORD, LONG) -// -// PURPOSE: Processes messages for the main window. -// -// WM_COMMAND - process the application menu -// WM_PAINT - Paint the main window -// WM_DESTROY - post a quit message and return -// -// -LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - int wmId, wmEvent; - PAINTSTRUCT ps; - HDC hdc; - //TCHAR szHello[MAX_LOADSTRING]; - //LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); - - switch (message) { - case WM_COMMAND: - wmId = LOWORD(wParam); - wmEvent = HIWORD(wParam); - // Parse the menu selections: - switch (wmId) { - case ID_REGISTRY_PRINTERSETUP: - //PRINTDLG pd; - //PrintDlg(&pd); - //PAGESETUPDLG psd; - //PageSetupDlg(&psd); - break; - case ID_REGISTRY_OPENLOCAL: - { - HWND hChildWnd; -// hChildWnd = CreateWindow(szFrameClass, szTitle, WS_OVERLAPPEDWINDOW | WS_CHILD, -// CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, hWnd, NULL, hInst, NULL); - hChildWnd = CreateWindow(szFrameClass, szTitle, WS_OVERLAPPEDWINDOW | WS_CHILD, - 0, 0, 150, 170, hWnd, NULL, hInst, NULL); - if (hChildWnd) { - ShowWindow(hChildWnd, 1); - UpdateWindow(hChildWnd); - } - } - break; - case IDM_ABOUT: -// ShowAboutBox(hWnd); - { - HICON hIcon = LoadIcon(hInst, (LPCTSTR)IDI_REGEDT32); - ShellAbout(hWnd, szTitle, "", hIcon); - //if (hIcon) DestroyIcon(hIcon); // NOT REQUIRED - } - break; - case IDM_EXIT: - DestroyWindow(hWnd); - break; - default: - return DefWindowProc(hWnd, message, wParam, lParam); - } - break; - case WM_SIZE: - // Handle the window sizing in it's own function - OnSize(wParam, LOWORD(lParam), HIWORD(lParam)); - break; - case WM_PAINT: - hdc = BeginPaint(hWnd, &ps); - // TODO: Add any drawing code here... - RECT rt; - GetClientRect(hWnd, &rt); - //DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER); - EndPaint(hWnd, &ps); - break; - case WM_DESTROY: - PostQuitMessage(0); - break; - case WM_TIMER: - break; - - case WM_ENTERMENULOOP: - OnEnterMenuLoop(hWnd); - break; - case WM_EXITMENULOOP: - OnExitMenuLoop(hWnd); - break; - case WM_MENUSELECT: - OnMenuSelect(hWnd, LOWORD(wParam), HIWORD(wParam), (HMENU)lParam); - break; - default: - return DefWindowProc(hWnd, message, wParam, lParam); - } - return 0; -} diff --git a/rosapps/regedt32/regedt32.rc b/rosapps/regedt32/regedt32.rc index cf2e9d4b201..582123ea7e8 100644 --- a/rosapps/regedt32/regedt32.rc +++ b/rosapps/regedt32/regedt32.rc @@ -119,17 +119,16 @@ BEGIN END POPUP "&Window" BEGIN - MENUITEM "&Cascade\tShift+F5", ID_WINDOW_CASCADE, GRAYED - MENUITEM "&Tile\tShift+F4", ID_WINDOW_TILE, GRAYED - MENUITEM "&Arrange Icons", ID_WINDOW_ARRANGEICONS - , GRAYED + MENUITEM "&Cascade\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "&Tile\tShift+F4", ID_WINDOW_TILE + MENUITEM "&Arrange Icons", ID_WINDOW_ARRANGE_ICONS MENUITEM SEPARATOR END POPUP "&Help" BEGIN MENUITEM "&Contents", ID_HELP_CONTENTS MENUITEM SEPARATOR - MENUITEM "&About Registry Editor...", IDM_ABOUT + MENUITEM "&About Registry Editor...", ID_HELP_ABOUT END END @@ -224,7 +223,7 @@ END STRINGTABLE DISCARDABLE BEGIN ID_HELP_HELPTOPICS "Opens Registry Editor Help." - IDM_ABOUT "Displays program information, version number, and copyright." + ID_HELP_ABOUT "Displays program information, version number, and copyright." END #endif // English (Australia) resources diff --git a/rosapps/regedt32/regedt32.ico b/rosapps/regedt32/res/regedt32.ico similarity index 100% rename from rosapps/regedt32/regedt32.ico rename to rosapps/regedt32/res/regedt32.ico diff --git a/rosapps/regedt32/small.ico b/rosapps/regedt32/res/small.ico similarity index 100% rename from rosapps/regedt32/small.ico rename to rosapps/regedt32/res/small.ico diff --git a/rosapps/regedt32/resource.h b/rosapps/regedt32/resource.h index 9e436974803..42cadadde80 100644 --- a/rosapps/regedt32/resource.h +++ b/rosapps/regedt32/resource.h @@ -2,9 +2,23 @@ // Microsoft Developer Studio generated include file. // Used by regedt32.rc // +#define IDW_FIRST_CHILD 200 + +#define ID_REGISTRY_MENU 0 +#define ID_EDIT_MENU 1 +#define ID_TREE_MENU 2 +#define ID_VIEW_MENU 3 +#define ID_SECURITY_MENU 4 +#define ID_OPTIONS_MENU 5 +#define ID_WINDOW_MENU 6 +#define ID_HELP_MENU 7 + +#define ID_WINDOW_CLOSE 798 +#define ID_WINDOW_CLOSEALL 799 +#define STATUS_WINDOW 2001 + #define IDD_ABOUTBOX 103 #define IDS_APP_TITLE 103 -#define IDM_ABOUT 104 #define IDM_EXIT 105 #define IDS_HELLO 106 #define IDI_REGEDT32 107 @@ -13,6 +27,7 @@ #define IDC_REGEDT32_FRAME 110 #define IDR_REGEDT32_MENU 129 #define IDR_REGEDT_MENU 130 +#define ID_HELP_ABOUT 32770 #define ID_HELP_HELPTOPICS 32771 #define ID_FAVORITES_ADDTOFAVOURITES 32772 #define ID_FAVORITES_REMOVEFAVOURITE 32773 @@ -29,15 +44,15 @@ #define ID_EDIT_NEW_STRINGVALUE 32786 #define ID_EDIT_NEW_BINARYVALUE 32787 #define ID_EDIT_NEW_DWORDVALUE 32788 -#define ID_REGISTRY_IMPORTREGISTRYFILE 32789 -#define ID_REGISTRY_EXPORTREGISTRYFILE 32790 -#define ID_REGISTRY_CONNECTNETWORKREGISTRY 32791 -#define ID_REGISTRY_DISCONNECTNETWORKREGISTRY 32792 -#define ID_REGISTRY_PRINT 32793 -#define ID_HELP_CONTENTS 32795 -#define ID_WINDOW_CASCADE 32797 -#define ID_WINDOW_TILE 32798 -#define ID_WINDOW_ARRANGEICONS 32799 + +#define ID_WINDOW_NEW_WINDOW 32794 +#define ID_WINDOW_CASCADE 32795 +#define ID_WINDOW_TILE 32796 +#define ID_WINDOW_TILE_HORZ 32796 +#define ID_WINDOW_TILE_VERT 32797 +#define ID_WINDOW_ARRANGE_ICONS 32798 +#define ID_WINDOW_REFRESH 32799 + #define ID_OPTIONS_FONT 32800 #define ID_OPTIONS_AUTOREFRESH 32801 #define ID_OPTIONS_READONLYMODE 32802 @@ -71,6 +86,12 @@ #define ID_REGISTRY_PRINTSUBTREE 32832 #define ID_REGISTRY_PRINTERSETUP 32833 #define ID_REGISTRY_SAVESUBTREEAS 32834 +#define ID_REGISTRY_IMPORTREGISTRYFILE 32835 +#define ID_REGISTRY_EXPORTREGISTRYFILE 32836 +#define ID_REGISTRY_CONNECTNETWORKREGISTRY 32837 +#define ID_REGISTRY_DISCONNECTNETWORKREGISTRY 32838 +#define ID_REGISTRY_PRINT 32839 +#define ID_HELP_CONTENTS 32840 #define IDC_LICENSE_EDIT 1029 #define IDS_LICENSE 32835 diff --git a/rosapps/winfile/childwnd.c b/rosapps/winfile/childwnd.c index 12a54019597..1b0337b0e8e 100644 --- a/rosapps/winfile/childwnd.c +++ b/rosapps/winfile/childwnd.c @@ -317,7 +317,7 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa switch(message) { case WM_CREATE: - CreateTreeWnd(pChildWnd->hWnd, &pChildWnd->left, IDW_TREE_LEFT, pChildWnd->szPath); + CreateTreeWnd(pChildWnd->hWnd, &pChildWnd->left, IDW_TREE_LEFT); CreateListWnd(pChildWnd->hWnd, &pChildWnd->right, IDW_TREE_RIGHT, pChildWnd->szPath); //create_tree_window(pChildWnd->hWnd, &pChildWnd->left, IDW_TREE_LEFT, IDW_HEADER_LEFT, pChildWnd->szPath); //create_list_window(pChildWnd->hWnd, &pChildWnd->right, IDW_TREE_RIGHT, IDW_HEADER_RIGHT); @@ -515,9 +515,16 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa case WM_NOTIFY: { int idCtrl = (int)wParam; NMHDR* pnmh = (NMHDR*)lParam; - //return pane_notify(pnmh->idFrom==IDW_HEADER_LEFT? &pChildWnd->left: &pChildWnd->right, pnmh); if (idCtrl == IDW_TREE_LEFT) { + if ((((LPNMHDR)lParam)->code) == TVN_SELCHANGED) { + Entry* entry = (Entry*)((NMTREEVIEW*)lParam)->itemNew.lParam; + if (entry != NULL) { + //RefreshList(pChildWnd->right.hWnd, entry); + //void set_curdir(ChildWnd* child, Entry* entry) + set_curdir(pChildWnd, entry); + } + } SendMessage(pChildWnd->left.hWnd, message, wParam, lParam); } if (idCtrl == IDW_TREE_RIGHT) { @@ -538,9 +545,6 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa return 0; } -/* -RegenerateUserEnvironment - */ ATOM RegisterChildWnd(HINSTANCE hInstance, int res_id) { WNDCLASSEX wcFrame = { diff --git a/rosapps/winfile/framewnd.c b/rosapps/winfile/framewnd.c index fb2fb0e28ed..a27b219e3d9 100644 --- a/rosapps/winfile/framewnd.c +++ b/rosapps/winfile/framewnd.c @@ -342,6 +342,69 @@ static void toggle_child(HWND hWnd, UINT cmd, HWND hchild) resize_frame_client(hWnd); } +//////////////////////////////////////////////////////////////////////////////// + + +LRESULT CALLBACK EnumNetConnectionsProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + return 0; +} + +/* +DWORD WNetOpenEnum( + DWORD dwScope, // scope of enumeration + DWORD dwType, // resource types to list + DWORD dwUsage, // resource usage to list + LPNETRESOURCE lpNetResource, // resource structure + LPHANDLE lphEnum // enumeration handle buffer +); + + result = WNetOpenEnum(RESOURCE_CONNECTED, RESOURCETYPE_DISK, RESOURCEUSAGE_ALL, NULL, &EnumNetConnectionsProc); + + */ +DWORD MapNetworkDrives(HWND hWnd, BOOL connect) +{ + DWORD result = 0L; +#if 1 + if (connect) { + WNetConnectionDialog(hWnd, RESOURCETYPE_DISK); + } else { + WNetDisconnectDialog(hWnd, RESOURCETYPE_DISK); + } +#else + if (connect) { + NETRESOURCE netResouce; + CONNECTDLGSTRUCT connectDlg; + + //netResouce.dwScope; + //netResouce.dwType; + netResouce.dwDisplayType = 0; + //netResouce.dwUsage; + //netResouce.lpLocalName; + //netResouce.lpRemoteName; + //netResouce.lpComment; + //netResouce.lpProvider; + + //connectDlg.cbStructure; + connectDlg.hwndOwner = hWnd; + connectDlg.lpConnRes = &netResouce; + //connectDlg.dwFlags; + //connectDlg.dwDevNum; + + result = WNetConnectionDialog1(&connectDlg); + } else { + DISCDLGSTRUCT disconnectDlg; + //disconnectDlg.cbStructure; + disconnectDlg.hwndOwner = hWnd; + //disconnectDlg.lpLocalName; + //disconnectDlg.lpRemoteName; + //disconnectDlg.dwFlags; + result = WNetDisconnectDialog1(&disconnectDlg); + } +#endif + return result; +} + //////////////////////////////////////////////////////////////////////////////// // // FUNCTION: _CmdWndProc(HWND, unsigned, WORD, LONG) @@ -398,7 +461,11 @@ LRESULT _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case ID_FILE_RUN: OnFileRun(); break; - case ID_DISK_FORMAT_DISK: + case ID_DISK_COPY_DISK: + break; + case ID_DISK_LABEL_DISK: + break; + case ID_DISK_FORMAT_DISK: // SHFormatDrive(hWnd, 0 /* A: */, SHFMT_ID_DEFAULT, 0); { UINT OldMode = SetErrorMode(0); // Get the current Error Mode settings. @@ -408,6 +475,20 @@ LRESULT _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) SetErrorMode(OldMode); // Put it back the way it was. } break; + case ID_DISK_CONNECT_NETWORK_DRIVE: + MapNetworkDrives(hWnd, TRUE); + break; + case ID_DISK_DISCONNECT_NETWORK_DRIVE: + MapNetworkDrives(hWnd, FALSE); + break; + case ID_DISK_SHARE_AS: + break; + case ID_DISK_STOP_SHARING: + break; + case ID_DISK_SELECT_DRIVE: + break; + + case ID_VIEW_BY_FILE_TYPE: { struct ExecuteDialog dlg = {{0}}; diff --git a/rosapps/winfile/listview.c b/rosapps/winfile/listview.c index ebbe7758d62..50f8942360c 100644 --- a/rosapps/winfile/listview.c +++ b/rosapps/winfile/listview.c @@ -81,7 +81,8 @@ static void AddEntryToList(HWND hwndLV, int idx, Entry* entry) item.stateMask = 0; // item.pszText = entry->data.cFileName; item.pszText = LPSTR_TEXTCALLBACK; - item.cchTextMax = strlen(entry->data.cFileName); +// item.cchTextMax = strlen(entry->data.cFileName); + item.cchTextMax = 0; item.iImage = 0; // item.iImage = I_IMAGECALLBACK; item.lParam = (LPARAM)entry; @@ -92,28 +93,24 @@ static void AddEntryToList(HWND hwndLV, int idx, Entry* entry) } // insert listctrl entries after index idx -static void InsertListEntries(Pane* pane, Entry* parent, int idx) +static void InsertListEntries(HWND hWnd, Entry* entry, int idx) { - Entry* entry = parent; - - if (!entry) - return; - ShowWindow(pane->hWnd, SW_HIDE); + ShowWindow(hWnd, SW_HIDE); if (idx == -1) { } idx = 0; - for(; entry; entry=entry->next) { + for (; entry; entry = entry->next) { #ifndef _LEFT_FILES - if (entry->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - continue; + if (entry->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + continue; #endif - //ListBox_InsertItemData(pane->hWnd, idx, entry); - AddEntryToList(pane->hWnd, idx, entry); + //ListBox_InsertItemData(hWnd, idx, entry); + AddEntryToList(hWnd, idx, entry); ++idx; - } - ShowWindow(pane->hWnd, SW_SHOW); + } + ShowWindow(hWnd, SW_SHOW); } static void CreateListColumns(HWND hWndListView) @@ -269,7 +266,7 @@ BOOL OnEndLabelEdit(NMLVDISPINFO* plvdi) // To make a more robust application you should send an EM_LIMITTEXT // message to the edit control to prevent the user from entering too // many characters in the field. - } +} //////////////////////////////////////////////////////////////////////////////// @@ -333,8 +330,9 @@ void CreateListWnd(HWND parent, Pane* pane, int id, LPSTR lpszPathName) SendMessage(pane->hWnd, WM_SETFONT, (WPARAM)Globals.hFont, FALSE); // insert entries into listbox - if (entry) - InsertListEntries(pane, entry, -1); + if (entry) { + InsertListEntries(pane->hWnd, entry, -1); + } // calculate column widths // if (!s_init) { @@ -344,3 +342,39 @@ void CreateListWnd(HWND parent, Pane* pane, int id, LPSTR lpszPathName) // calc_widths(pane, TRUE); } +void RefreshList(HWND hWnd, Entry* entry) +{ + if (hWnd != NULL) { + ListView_DeleteAllItems(hWnd); + if (entry != NULL) { + //TRACE("RefreshList(...) entry name: %s\n", entry->data.cFileName); + InsertListEntries(hWnd, entry, -1); + } + } +} +/* +typedef struct _WIN32_FIND_DATA { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD dwReserved0; + DWORD dwReserved1; + TCHAR cFileName[ MAX_PATH ]; + TCHAR cAlternateFileName[ 14 ]; +} WIN32_FIND_DATA, *PWIN32_FIND_DATA; + */ + +/* + Pane* pane = (Pane*)GetWindowLong(hWnd, GWL_USERDATA); + if (pane != NULL) { +// ListBox_RemoveAll(hWnd, TRUE, 1); + ListView_DeleteAllItems(pane->hWnd); + if (entry) { + InsertListEntries(pane->hWnd, entry, -1); + } + } + */ + diff --git a/rosapps/winfile/listview.h b/rosapps/winfile/listview.h index 35582a4df68..c098089a2f7 100644 --- a/rosapps/winfile/listview.h +++ b/rosapps/winfile/listview.h @@ -35,6 +35,7 @@ extern "C" { void CreateListWnd(HWND parent, Pane* pane, int id, LPSTR lpszPathName); +void RefreshList(HWND hWnd, Entry* entry); #ifdef __cplusplus diff --git a/rosapps/winfile/main.c b/rosapps/winfile/main.c index f1bf927a10e..675934b5f7e 100644 --- a/rosapps/winfile/main.c +++ b/rosapps/winfile/main.c @@ -42,6 +42,9 @@ //////////////////////////////////////////////////////////////////////////////// // Global Variables: // +UINT OemCodePage; +UINT AnsiCodePage; +LCID UserDefaultLCID; HINSTANCE hInst; #ifdef USE_GLOBAL_STRUCT @@ -310,6 +313,7 @@ static BOOL CALLBACK EnumWndProc(HWND hWnd, LPARAM lparam) GetClassName(hWnd, cls, 128); if (!lstrcmp(cls, (LPCTSTR)lparam)) { g_foundPrevInstance++; + SetForegroundWindow(hWnd); return FALSE; } return TRUE; @@ -322,6 +326,13 @@ void ExitInstance(void) ImageList_Destroy(Globals.himl); } +/* +struct _cpinfo { + UINT MaxCharSize; + BYTE DefaultChar[MAX_DEFAULTCHAR]; + BYTE LeadByte[MAX_LEADBYTES]; +} CPINFO, *LPCPINFO; + */ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, @@ -332,6 +343,15 @@ int APIENTRY WinMain(HINSTANCE hInstance, HACCEL hAccel; HWND hMDIClient; + CPINFO CPinfo; + + OemCodePage = GetOEMCP(); + AnsiCodePage = GetACP(); + UserDefaultLCID = GetUserDefaultLCID(); + if (GetCPInfo(UserDefaultLCID, &CPinfo)) { + + } + // Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_WINFILE, szFrameClass, MAX_LOADSTRING); @@ -339,8 +359,9 @@ int APIENTRY WinMain(HINSTANCE hInstance, // Allow only one running instance EnumWindows(EnumWndProc, (LPARAM)szFrameClass); - if (g_foundPrevInstance) + if (g_foundPrevInstance) { return 1; + } // Store instance handle in our global variable hInst = hInstance; @@ -365,4 +386,16 @@ int APIENTRY WinMain(HINSTANCE hInstance, return msg.wParam; } +void _GetFreeSpaceEx(void) +{ + BOOL fResult; + TCHAR szDrive[MAX_PATH]; + ULARGE_INTEGER i64FreeBytesToCaller; + ULARGE_INTEGER i64TotalBytes; + ULARGE_INTEGER i64FreeBytes; + fResult = GetDiskFreeSpaceEx(szDrive, + (PULARGE_INTEGER)&i64FreeBytesToCaller, + (PULARGE_INTEGER)&i64TotalBytes, + (PULARGE_INTEGER)&i64FreeBytes); +} diff --git a/rosapps/winfile/treeview.c b/rosapps/winfile/treeview.c index b90f462f4db..007fe30cc1b 100644 --- a/rosapps/winfile/treeview.c +++ b/rosapps/winfile/treeview.c @@ -67,6 +67,8 @@ int Image_Root; #define NUM_BITMAPS 3 +#if 0 +/* // AddItemToTree - adds items to a tree view control. // Returns the handle to the newly added item. // hwndTV - handle to the tree view control. @@ -82,7 +84,7 @@ HTREEITEM AddItemToTree(HWND hwndTV, LPSTR lpszItem, int nLevel) static HTREEITEM hPrevLev2Item = NULL; HTREEITEM hti; - tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; + tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN | TVIF_PARAM; // Set the text of the item. tvi.pszText = lpszItem; tvi.cchTextMax = lstrlen(lpszItem); @@ -90,6 +92,7 @@ HTREEITEM AddItemToTree(HWND hwndTV, LPSTR lpszItem, int nLevel) tvi.iImage = Image_Root; tvi.iSelectedImage = Image_Root; tvi.cChildren = 1; + // Save the heading level in the item's application-defined data area. tvi.lParam = (LPARAM)nLevel; @@ -125,6 +128,27 @@ HTREEITEM AddItemToTree(HWND hwndTV, LPSTR lpszItem, int nLevel) } return hPrev; } + */ +#endif + + +static void init_output(HWND hWnd) +{ + TCHAR b[16]; + HFONT old_font; + HDC hdc = GetDC(hWnd); + + if (GetNumberFormat(LOCALE_USER_DEFAULT, 0, _T("1000"), 0, b, 16) > 4) + Globals.num_sep = b[1]; + else + Globals.num_sep = _T('.'); + + old_font = SelectFont(hdc, Globals.hFont); + GetTextExtentPoint32(hdc, _T(" "), 1, &Globals.spaceSize); + SelectFont(hdc, old_font); + ReleaseDC(hWnd, hdc); +} + HTREEITEM AddEntryToTree(HWND hwndTV, Entry* entry) { @@ -138,11 +162,11 @@ HTREEITEM AddEntryToTree(HWND hwndTV, Entry* entry) static HTREEITEM hPrev = (HTREEITEM)TVI_FIRST; static HTREEITEM hPrevRootItem = NULL; static HTREEITEM hPrevLev2Item = NULL; - HTREEITEM hti; - TRACE("AddEntryToTree(level:%u - %s)\n", entry->level, entry->data.cFileName); + //TRACE("AddEntryToTree(level:%u - %s)\n", entry->level, entry->data.cFileName); - tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; + tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN | TVIF_PARAM; +/* // Set the text of the item. tvi.pszText = entry->data.cFileName; tvi.cchTextMax = lstrlen(entry->data.cFileName); @@ -152,6 +176,12 @@ HTREEITEM AddEntryToTree(HWND hwndTV, Entry* entry) tvi.cChildren = 1; // Save the heading level in the item's application-defined data area. //tvi.lParam = (LPARAM)entry->level; + */ + tvi.pszText = LPSTR_TEXTCALLBACK; + tvi.cchTextMax = 0; + tvi.iImage = I_IMAGECALLBACK; + tvi.iSelectedImage = I_IMAGECALLBACK; + tvi.cChildren = I_CHILDRENCALLBACK; // Save the entry pointer in the item's application-defined data area. tvi.lParam = (LPARAM)entry; @@ -159,15 +189,10 @@ HTREEITEM AddEntryToTree(HWND hwndTV, Entry* entry) tvins.hInsertAfter = hPrev; // Set the parent item based on the specified level. -// if (entry->level == 0 || entry->level == 1) { if (entry->level == 0) { tvins.hParent = TVI_ROOT; } else if (entry->level == 1) { tvins.hParent = hPrevRootItem; - if (hPrevRootItem) { - //tvins.hParent = entry->up->hTreeItem; - int foobar = entry->level * 2; - } } else { tvins.hParent = hPrevLev2Item; if (hPrevLev2Item) { @@ -183,10 +208,11 @@ HTREEITEM AddEntryToTree(HWND hwndTV, Entry* entry) hPrevRootItem = hPrev; else if (entry->level == 1) hPrevLev2Item = hPrev; - +/* // The new item is a child item. Give the parent item a // closed folder bitmap to indicate it now has child items. if (entry->level > 1) { + HTREEITEM hti; hti = TreeView_GetParent(hwndTV, hPrev); tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvi.hItem = hti; @@ -194,34 +220,70 @@ HTREEITEM AddEntryToTree(HWND hwndTV, Entry* entry) tvi.iSelectedImage = Image_Closed; TreeView_SetItem(hwndTV, &tvi); } + */ hItem = hPrev; #endif return hItem; } -// InitTreeViewItems - extracts headings from the specified file and -// passes them to a function that adds them to a tree view control. -// Returns TRUE if successful, or FALSE otherwise. -// hwndTV - handle to the tree view control. -// lpszFileName - name of file with headings. - -static BOOL InitTreeViewItems(HWND hwndTV, LPSTR lpszFileName) +static BOOL InitTreeViewItems(HWND hwndTV) { -/* - HTREEITEM hItem; - - hItem = AddItemToTree(hwndTV, "C:\\ - FAT32", 1); - AddItemToTree(hwndTV, "reactos", 2); - AddItemToTree(hwndTV, "bin", 3); - AddItemToTree(hwndTV, "media", 3); - AddItemToTree(hwndTV, "symbols", 3); - AddItemToTree(hwndTV, "system32", 3); - TreeView_Expand(hwndTV, hItem, TVE_EXPAND); -*/ return TRUE; } +// insert treectrl entries after index idx +static void insert_tree_entries(HWND hWnd, Entry* entry, int idx) +{ + static HTREEITEM hItemVisible; + static int hItemVisibleIdx; + + if (!entry) + return; + + if (entry->hTreeItem) + return; + + ShowWindow(hWnd, SW_HIDE); + for(; entry; entry=entry->next) { +#ifndef _LEFT_FILES + if (!(entry->data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)) + continue; +#endif + // don't display entries "." and ".." in the left pane + if ((entry->data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) && entry->data.cFileName[0]==_T('.')) { + if (entry->data.cFileName[1] == _T('\0') || + (entry->data.cFileName[1] == _T('.') && + entry->data.cFileName[2] == _T('\0'))) { + continue; + } + } +// if (idx != -1) +// idx++; +// ListBox_InsertItemData(hWnd, idx, entry); + //TRACE("Adding item %u [level:%u] - %s\n", ++idx, entry->level, entry->data.cFileName); + + + if (entry->hTreeItem) continue; + + + entry->hTreeItem = AddEntryToTree(hWnd, entry); + if (entry->expanded) { + insert_tree_entries(hWnd, entry->down, idx + 1); + TreeView_Expand(hWnd, entry->hTreeItem, TVE_EXPAND); + } + if (idx > hItemVisibleIdx) { + hItemVisibleIdx = idx; + hItemVisible = entry->hTreeItem; + } + } + if (hItemVisible && idx == 0) { + TreeView_SelectSetFirstVisible(hWnd, hItemVisible); + } + ShowWindow(hWnd, SW_SHOW); +} + + // InitTreeViewImageLists - creates an image list, adds three bitmaps // to it, and associates the image list with a tree view control. // Returns TRUE if successful, or FALSE otherwise. @@ -264,9 +326,8 @@ static BOOL InitTreeViewImageLists(HWND hwndTV) // Returns the handle to the new control if successful, // or NULL otherwise. // hwndParent - handle to the control's parent window. -// lpszFileName - name of the file to parse for tree view items. -static HWND CreateTreeView(HWND hwndParent, int id, LPSTR lpszFileName) +static HWND CreateTreeView(HWND hwndParent, int id) { RECT rcClient; // dimensions of client area HWND hwndTV; // handle to tree view control @@ -284,13 +345,133 @@ static HWND CreateTreeView(HWND hwndParent, int id, LPSTR lpszFileName) 0, 0, 0, 0, parent, (HMENU)id, Globals.hInstance, 0); */ // Initialize the image list, and add items to the control. - if (!InitTreeViewImageLists(hwndTV) || !InitTreeViewItems(hwndTV, lpszFileName)) { + if (!InitTreeViewImageLists(hwndTV) || !InitTreeViewItems(hwndTV)) { DestroyWindow(hwndTV); return NULL; } return hwndTV; } +static void OnGetDispInfo(NMTVDISPINFO* ptvdi) +{ + static char buffer[200]; + +// LVITEM* pItem = &(ptvdi->item); +// Entry* entry = (Entry*)pItem->lParam; + Entry* entry = (Entry*)ptvdi->item.lParam; + ASSERT(entry); + + if (ptvdi->item.mask & TVIF_CHILDREN ) { + ptvdi->item.cChildren = 5; + } + if (ptvdi->item.mask & TVIF_IMAGE) { + ptvdi->item.iImage = Image_Root; + } + if (ptvdi->item.mask & TVIF_SELECTEDIMAGE) { + ptvdi->item.iSelectedImage = Image_Closed; + } + if (ptvdi->item.mask & TVIF_TEXT) { + ptvdi->item.pszText = entry->data.cFileName; + ptvdi->item.cchTextMax = lstrlen(entry->data.cFileName); + } +} +/* +typedef struct tagTVITEM{ + UINT mask; + HTREEITEM hItem; + UINT state; + UINT stateMask; + LPTSTR pszText; + int cchTextMax; + int iImage; + int iSelectedImage; + int cChildren; + LPARAM lParam; +} TVITEM, FAR *LPTVITEM; + +TVITEM structure that identifies and contains information about the tree view item. The mask member of the TVITEM structure specifies which information is being set or retrieved. It can be one or more of the following values: TVIF_CHILDREN The cChildren member specifies, or is to receive, a value that indicates whether the item has child items. +TVIF_IMAGE The iImage member specifies, or is to receive, the index of the item's nonselected icon in the image list. +TVIF_SELECTEDIMAGE The iSelectedImage member specifies, or is to receive, the index of the item's selected icon in the image list. +TVIF_TEXT The pszText member specifies the new item text or the address of a buffer that is to receive the item text. +If the structure is receiving item text, you typically copy the text to the buffer pointed to by the pszText member of the TVITEM structure. However, you can return a string in the pszText member instead. If you do so, you cannot change or delete the string until the corresponding item text is deleted or until two additional TVN_GETDISPINFO notification messages have been sent. + + */ + +/* +typedef struct _BY_HANDLE_FILE_INFORMATION { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD dwVolumeSerialNumber; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD nNumberOfLinks; + DWORD nFileIndexHigh; + DWORD nFileIndexLow; +} BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION; + */ + +// OnEndLabelEdit - processes the LVN_ENDLABELEDIT notification message. +// Returns TRUE if the label is changed, or FALSE otherwise. + +static BOOL OnEndLabelEdit(NMTVDISPINFO* ptvdi) +{ +// if (ptvdi->item.iItem == -1) +// return FALSE; + + // Copy the new label text to the application-defined structure. +// lstrcpyn(rgPetInfo[ptvdi->item.iItem].szKind, ptvdi->item.pszText, 10); + + return TRUE; + // To make a more robust application you should send an EM_LIMITTEXT + // message to the edit control to prevent the user from entering too + // many characters in the field. +} + + +static BOOL OnExpand(int flag, HTREEITEM* pti) +{ + TRACE("TreeWndProc(...) OnExpand()\n"); +// pnmtv = (NMTREEVIEW) lParam + //TRACE("OnExpand(...) entry name: %s\n", entry->data.cFileName); + /* +TVE_COLLAPSE Collapses the list. +TVE_COLLAPSERESET Collapses the list and removes the child items. The TVIS_EXPANDEDONCE state flag is reset. This flag must be used with the TVE_COLLAPSE flag. +TVE_EXPAND Expands the list. +TVE_EXPANDPARTIAL Version 4.70. Partially expands the list. In this state, the child items are visible and the parent item's plus symbol is displayed. This flag must be used in combination with the TVE_EXPAND flag. +TVE_TOGGLE Collapses the list if it is expanded or expands it if it is collapsed. + */ + return TRUE; +} + +static BOOL OnExpanding(HWND hWnd, NMTREEVIEW* pnmtv) +{ + static int expanding; + + //LPARAM parm = pnmtv->itemNew.lParam; + Entry* entry = (Entry*)pnmtv->itemNew.lParam; + + TRACE("TreeWndProc(...) OnExpanding() entry: %p\n", entry); + + if (expanding) return FALSE; + expanding = TRUE; + if (entry) { + insert_tree_entries(hWnd, entry->down, 0); +// insert_tree_entries(hWnd, entry, 0); + } + expanding = FALSE; + return TRUE; +} +/* +static BOOL OnSelChanged(NMTREEVIEW* pnmtv) +{ + LPARAM parm = pnmtv->itemNew.lParam; + ChildWnd* child = (ChildWnd*)pnmtv->itemNew.lParam; + return TRUE; +} + */ + //////////////////////////////////////////////////////////////////////////////// static WNDPROC g_orgTreeWndProc; @@ -308,128 +489,65 @@ static LRESULT CALLBACK TreeWndProc(HWND hWnd, UINT message, WPARAM wParam, LPAR #endif case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { -// case LVN_GETDISPINFO: -// OnGetDispInfo((NMLVDISPINFO*)lParam); -// break; -// case LVN_ENDLABELEDIT: -// return OnEndLabelEdit((NMLVDISPINFO*)lParam); + case TVM_EXPAND: + //return OnExpand((int)wParam, (HTREEITEM*)lParam); + OnExpand((int)wParam, (HTREEITEM*)lParam); + break; + case TVN_GETDISPINFO: + OnGetDispInfo((NMTVDISPINFO*)lParam); + break; + case TVN_ITEMEXPANDING: + return OnExpanding(hWnd, (NMTREEVIEW*)lParam); + break; +// case TVN_SELCHANGED: +// return OnSelChanged((NMTREEVIEW*)lParam); // break; + case TVN_SINGLEEXPAND: + TRACE("TreeWndProc(...) TVN_SINGLEEXPAND\n"); + //lpnmtv = (LPNMTREEVIEW)lParam; + //return TVNRET_DEFAULT; +// return TVNRET_SKIPOLD; // Skip default processing of the item being unselected. +// return TVNRET_SKIPNEW; // Skip default processing of the item being selected. + break; + case TVN_ENDLABELEDIT: + return OnEndLabelEdit((NMTVDISPINFO*)lParam); + break; } -// break; - return 0; - + break; case WM_SETFOCUS: child->nFocusPanel = pane == &child->right? 1: 0; //ListBox_SetSel(hWnd, TRUE, 1); //TODO: check menu items break; - case WM_KEYDOWN: if (wParam == VK_TAB) { //TODO: SetFocus(Globals.hDriveBar) SetFocus(child->nFocusPanel ? child->left.hWnd: child->right.hWnd); } + break; } - return CallWindowProc(g_orgTreeWndProc, hWnd, message, wParam, lParam); } - -static void init_output(HWND hWnd) -{ - TCHAR b[16]; - HFONT old_font; - HDC hdc = GetDC(hWnd); - - if (GetNumberFormat(LOCALE_USER_DEFAULT, 0, _T("1000"), 0, b, 16) > 4) - Globals.num_sep = b[1]; - else - Globals.num_sep = _T('.'); - - old_font = SelectFont(hdc, Globals.hFont); - GetTextExtentPoint32(hdc, _T(" "), 1, &Globals.spaceSize); - SelectFont(hdc, old_font); - ReleaseDC(hWnd, hdc); -} - - -// insert treectrl entries after index idx -static void insert_tree_entries(Pane* pane, Entry* parent, int idx) -{ - static HTREEITEM hItemVisible; - static int hItemVisibleIdx; - - HTREEITEM hItem; - Entry* entry = parent; - - if (!entry) - return; - - ShowWindow(pane->hWnd, SW_HIDE); - for(; entry; entry=entry->next) { -#ifndef _LEFT_FILES - if (pane->treePane && !(entry->data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)) - continue; -#endif - // don't display entries "." and ".." in the left pane - if (pane->treePane && (entry->data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) && entry->data.cFileName[0]==_T('.')) { - if ( -#ifndef _NO_EXTENSIONS - entry->data.cFileName[1]==_T('\0') || -#endif - (entry->data.cFileName[1]==_T('.') && entry->data.cFileName[2]==_T('\0'))) { - continue; - } - } -// if (idx != -1) -// idx++; -// ListBox_InsertItemData(pane->hWnd, idx, entry); - //TRACE("Adding item %u [level:%u] - %s\n", ++idx, entry->level, entry->data.cFileName); - - //hItem = AddItemToTree(pane->hWnd, entry->data.cFileName, idx); - //hItem = AddItemToTree(pane->hWnd, entry->data.cFileName, entry->level); - hItem = AddEntryToTree(pane->hWnd, entry); - if (hItem != NULL) { - entry->hTreeItem = hItem; // already done in AddEntryToTree - - } - //TreeView_Expand(pane->hWnd, hItem, TVE_EXPAND); - if (pane->treePane && entry->expanded) { - insert_tree_entries(pane, entry->down, idx + 1); - TreeView_Expand(pane->hWnd, hItem, TVE_EXPAND); - } - if (idx > hItemVisibleIdx) { - hItemVisibleIdx = idx; - hItemVisible = hItem; - } - } - if (hItemVisible && idx == 0) { - TreeView_SelectSetFirstVisible(pane->hWnd, hItemVisible); - } - ShowWindow(pane->hWnd, SW_SHOW); -} - - //void create_tree_window(HWND parent, Pane* pane, int id, int id_header, LPSTR lpszFileName) -void CreateTreeWnd(HWND parent, Pane* pane, int id, LPSTR lpszFileName) +void CreateTreeWnd(HWND parent, Pane* pane, int id) { static int s_init = 0; Entry* entry = pane->root; pane->treePane = 1; - pane->hWnd = CreateTreeView(parent, id, lpszFileName); + pane->hWnd = CreateTreeView(parent, id); SetWindowLong(pane->hWnd, GWL_USERDATA, (LPARAM)pane); g_orgTreeWndProc = SubclassWindow(pane->hWnd, TreeWndProc); SendMessage(pane->hWnd, WM_SETFONT, (WPARAM)Globals.hFont, FALSE); // insert entries into treectrl if (entry) { - //insert_tree_entries(pane, entry, -1); - insert_tree_entries(pane, entry, 0); + insert_tree_entries(pane->hWnd, entry, 0); } - // calculate column widths + // calculate column widths if (!s_init) { s_init = 1; init_output(pane->hWnd); @@ -439,6 +557,3 @@ void CreateTreeWnd(HWND parent, Pane* pane, int id, LPSTR lpszFileName) // pane->hwndHeader = create_header(parent, pane, id_header); //#endif } - - - diff --git a/rosapps/winfile/treeview.h b/rosapps/winfile/treeview.h index 828fb1503ef..d0087a727a5 100644 --- a/rosapps/winfile/treeview.h +++ b/rosapps/winfile/treeview.h @@ -34,12 +34,12 @@ extern "C" { #include "resource.h" -void CreateTreeWnd(HWND parent, Pane* pane, int id, LPSTR lpszFileName); +void CreateTreeWnd(HWND parent, Pane* pane, int id); HTREEITEM AddItemToTree(HWND hwndTV, LPSTR lpszItem, int nLevel); -//HWND CreateTreeView(HWND hwndParent, LPSTR lpszFileName); -//void create_tree_window(HWND parent, Pane* pane, int id, int id_header, LPSTR lpszFileName); +//HWND CreateTreeView(HWND hwndParent); +//void create_tree_window(HWND parent, Pane* pane, int id, int id_header); //LRESULT CALLBACK TreeWndProc(HWND, UINT, WPARAM, LPARAM); diff --git a/rosapps/winfile/utils.c b/rosapps/winfile/utils.c index 3ae6ad8b7e4..c4481a00e59 100644 --- a/rosapps/winfile/utils.c +++ b/rosapps/winfile/utils.c @@ -319,13 +319,18 @@ void set_curdir(ChildWnd* child, Entry* entry) if (!entry->scanned) scan_entry(child, entry); else { - ListBox_ResetContent(child->right.hWnd); - insert_entries(&child->right, entry->down, -1); - calc_widths(&child->right, FALSE); -#ifndef _NO_EXTENSIONS - set_header(&child->right); -#endif +// ListBox_ResetContent(child->right.hWnd); +// insert_entries(&child->right, entry->down, -1); + +// RefreshList(child->right.hWnd, entry); + +// calc_widths(&child->right, FALSE); +//#ifndef _NO_EXTENSIONS +// set_header(&child->right); +//#endif } + RefreshList(child->right.hWnd, entry->down); + get_path(entry, path); lstrcpy(child->szPath, path); SetWindowText(child->hWnd, path); diff --git a/rosapps/winfile/winfile.rc b/rosapps/winfile/winfile.rc index 770ab63916d..0ebdf36bc6a 100644 --- a/rosapps/winfile/winfile.rc +++ b/rosapps/winfile/winfile.rc @@ -87,10 +87,7 @@ BEGIN MENUITEM "&Format Disk..\t", ID_DISK_FORMAT_DISK MENUITEM SEPARATOR MENUITEM "Connect &Network Drive...", ID_DISK_CONNECT_NETWORK_DRIVE - , GRAYED - MENUITEM "&Disconnect Network Drive...", - ID_DISK_DISCONNECT_NETWORK_DRIVE - , GRAYED + MENUITEM "&Disconnect Network Drive...",ID_DISK_DISCONNECT_NETWORK_DRIVE MENUITEM SEPARATOR MENUITEM "Share &As...", ID_DISK_SHARE_AS, GRAYED MENUITEM "S&top Sharing...", ID_DISK_STOP_SHARING, GRAYED