Updated treeview and listview functionality.

svn path=/trunk/; revision=3241
This commit is contained in:
Robert Dickenson 2002-07-16 22:18:29 +00:00
parent 74571d0428
commit 1ad1b97103
6 changed files with 251 additions and 443 deletions

View file

@ -43,18 +43,6 @@
#include "treeview.h"
#include "listview.h"
//HWND hLeftWnd; // Tree Control Window
//HWND hRightWnd; // List Control Window
#define hLeftWnd hTreeWnd
#define hRightWnd hListWnd
//HWND hTreeWnd; // Tree Control Window
//HWND hListWnd; // List Control Window
//static int nSplitPos = 250;
//static int nFocusPanel;
////////////////////////////////////////////////////////////////////////////////
@ -146,28 +134,9 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa
switch (message) {
case WM_CREATE:
//HWND CreateListView(HWND hwndParent/*, Pane* pane*/, int id, LPTSTR lpszPathName);
/*
typedef struct tagCREATESTRUCT {
LPVOID lpCreateParams;
HINSTANCE hInstance;
HMENU hMenu;
HWND hwndParent;
int cy;
int cx;
int y;
int x;
LONG style;
LPCTSTR lpszName;
LPCTSTR lpszClass;
DWORD dwExStyle;
} CREATESTRUCT, *LPCREATESTRUCT;
*/
pChildWnd = (ChildWnd*)((LPCREATESTRUCT)lParam)->lpCreateParams;
ASSERT(pChildWnd);
pChildWnd->nSplitPos = 250;
pChildWnd->hTreeWnd = CreateTreeView(hWnd, TREE_WINDOW, &pChildWnd->root);
pChildWnd->hListWnd = CreateListView(hWnd, LIST_WINDOW, &pChildWnd->root);
break;
@ -269,9 +238,9 @@ typedef struct tagCREATESTRUCT {
rt.left = x-SPLIT_WIDTH/2;
rt.right = x+SPLIT_WIDTH/2+1;
InvalidateRect(hWnd, &rt, FALSE);
UpdateWindow(hLeftWnd);
UpdateWindow(hTreeWnd);
UpdateWindow(hWnd);
UpdateWindow(hRightWnd);
UpdateWindow(hListWnd);
}
#endif
}
@ -289,7 +258,7 @@ typedef struct tagCREATESTRUCT {
case WM_SETFOCUS:
// SetCurrentDirectory(szPath);
if (pChildWnd != NULL) {
SetFocus(pChildWnd->nFocusPanel? pChildWnd->hRightWnd: pChildWnd->hLeftWnd);
SetFocus(pChildWnd->nFocusPanel? pChildWnd->hListWnd: pChildWnd->hTreeWnd);
}
break;
@ -301,9 +270,13 @@ typedef struct tagCREATESTRUCT {
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);
if (!entry->scanned) {
//scan_entry(pChildWnd, entry);
} else {
//RefreshList(pChildWnd->hListWnd, entry);
}
//RefreshList(pChildWnd->hListWnd, entry->down);
RefreshList(pChildWnd->hListWnd, entry);
}
}
if (!SendMessage(pChildWnd->hTreeWnd, message, wParam, lParam)) {

View file

@ -40,6 +40,8 @@
#include "main.h"
#include "listview.h"
#include "trace.h"
////////////////////////////////////////////////////////////////////////////////
// Global Variables:
@ -52,7 +54,48 @@ static WNDPROC g_orgListWndProc;
// Local module support methods
//
static void AddEntryToList(HWND hwndLV, int idx, Entry* entry)
{
LVITEM item;
item.mask = LVIF_TEXT | LVIF_PARAM;
item.iItem = 0;//idx;
item.iSubItem = 0;
item.state = 0;
item.stateMask = 0;
// item.pszText = entry->data.cFileName;
item.pszText = LPSTR_TEXTCALLBACK;
// item.cchTextMax = strlen(entry->data.cFileName);
item.cchTextMax = 0;
item.iImage = 0;
// item.iImage = I_IMAGECALLBACK;
item.lParam = (LPARAM)entry;
#if (_WIN32_IE >= 0x0300)
item.iIndent = 0;
#endif
ListView_InsertItem(hwndLV, &item);
}
// insert listctrl entries after index idx
static void InsertListEntries(HWND hWnd, Entry* entry, int idx)
{
ShowWindow(hWnd, SW_HIDE);
if (idx == -1) {
}
idx = 0;
for (; entry; entry = entry->next) {
#ifndef _LEFT_FILES
// if (entry->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
// continue;
#endif
//ListBox_InsertItemData(hWnd, idx, entry);
AddEntryToList(hWnd, idx, entry);
++idx;
}
ShowWindow(hWnd, SW_SHOW);
}
#define MAX_LIST_COLUMNS (IDS_LIST_COLUMN_LAST - IDS_LIST_COLUMN_FIRST + 1)
static int default_column_widths[MAX_LIST_COLUMNS] = { 200, 175, 400 };
@ -88,25 +131,61 @@ static void CreateListColumns(HWND hWndListView)
static void OnGetDispInfo(NMLVDISPINFO* plvdi)
{
static TCHAR buffer[200];
// Entry* entry = (Entry*)plvdi->item.lParam;
// ASSERT(entry);
// FILETIME LastWriteTime;
// TCHAR Class[MAX_NAME_LEN];
// DWORD cClass = MAX_NAME_LEN;
// TCHAR Name[MAX_NAME_LEN];
// DWORD cName = MAX_NAME_LEN;
// DWORD dwIndex = 0L;
Entry* pEntry = (Entry*)plvdi->item.lParam;
ASSERT(pEntry);
plvdi->item.pszText = NULL;
plvdi->item.cchTextMax = 0;
switch (plvdi->item.iSubItem) {
case 0:
// plvdi->item.pszText = entry->data.cFileName;
/*
plvdi->item.pszText = _T("(Default)");
plvdi->item.cchTextMax = _tcslen(plvdi->item.pszText);
if (pEntry->bKey == TRUE) {
DWORD nSubKeys;
DWORD MaxSubKeyLen;
DWORD MaxClassLen;
DWORD ValueCount;
DWORD MaxValueNameLen;
DWORD MaxValueLen;
DWORD SecurityDescriptorLen;
HKEY hKey = pEntry->hKey;
LONG result = RegQueryInfoKey(pEntry->hKey, Class, &cClass, 0,
&nSubKeys, &MaxSubKeyLen, &MaxClassLen, &ValueCount,
&MaxValueNameLen, &MaxValueLen, &SecurityDescriptorLen,
&LastWriteTime);
if (result == ERROR_SUCCESS) {
plvdi->item.pszText = Class;
plvdi->item.cchTextMax = cClass;
}
}
*/
plvdi->item.pszText = pEntry->szName;
plvdi->item.cchTextMax = lstrlen(pEntry->szName);
break;
case 1:
plvdi->item.pszText = _T("REG_SZ");
break;
case 2:
plvdi->item.pszText = _T("(value not set)");
break;
case 3:
break;
case 4:
plvdi->item.pszText = _T("");
break;
default:
_tcscpy(buffer, _T(" "));
plvdi->item.pszText = buffer;
// _tcscpy(buffer, _T(" "));
// plvdi->item.pszText = buffer;
break;
}
}
@ -121,6 +200,9 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////
void ListViewPopUpMenu(HWND hWnd, POINT pt)
{
}
static LRESULT CALLBACK ListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
@ -178,19 +260,36 @@ static LRESULT CALLBACK ListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPAR
}
break;
case NM_RCLICK:
{
int idx;
LV_HITTESTINFO lvH;
NM_LISTVIEW *pNm = (NM_LISTVIEW *)lParam;
lvH.pt.x = pNm->ptAction.x;
lvH.pt.y = pNm->ptAction.y;
idx = ListView_HitTest(hWnd, &lvH);
if (idx != -1) {
POINT pt;
GetCursorPos(&pt);
ListViewPopUpMenu(hWnd, pt);
return idx;
}
}
break;
default:
return CallWindowProc(g_orgListWndProc, hWnd, message, wParam, lParam);
}
break;
case WM_KEYDOWN:
if (wParam == VK_TAB) {
//TODO: SetFocus(Globals.hDriveBar)
//SetFocus(child->nFocusPanel? child->left.hWnd: child->right.hWnd);
}
break;
default:
return CallWindowProc(g_orgListWndProc, hWnd, message, wParam, lParam);
break;
case WM_KEYDOWN:
if (wParam == VK_TAB) {
//TODO: SetFocus(Globals.hDriveBar)
//SetFocus(child->nFocusPanel? child->left.hWnd: child->right.hWnd);
}
break;
default:
return CallWindowProc(g_orgListWndProc, hWnd, message, wParam, lParam);
break;
}
return 0;
}
@ -237,12 +336,10 @@ void RefreshList(HWND hWnd, Entry* entry)
{
if (hWnd != NULL) {
ListView_DeleteAllItems(hWnd);
/*
if (entry != NULL) {
TRACE("RefreshList(...) entry name: %s\n", entry->data.cFileName);
TRACE("RefreshList(...) entry name: %p\n", entry);
InsertListEntries(hWnd, entry, -1);
}
*/
}
}

View file

@ -129,7 +129,7 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
hInst = hInstance; // Store instance handle in our global variable
// hFrameWnd = CreateWindow(szFrameClass, szTitle, WS_OVERLAPPEDWINDOW,
// CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
hFrameWnd = CreateWindowEx(0, (LPCTSTR)(int)hFrameWndClass, _T("regedit application"),
hFrameWnd = CreateWindowEx(0, (LPCTSTR)(int)hFrameWndClass, szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, hMenuFrame, hInstance, NULL/*lpParam*/);

View file

@ -35,6 +35,16 @@ extern "C" {
#include "regproc.h"
#define STATUS_WINDOW 2001
#define TREE_WINDOW 2002
#define LIST_WINDOW 2003
#define SPLIT_WINDOW 2004
#define MAX_LOADSTRING 100
#define SPLIT_WIDTH 3
#define MAX_NAME_LEN 500
typedef struct _Entry {
struct _Entry* next;
struct _Entry* down;
@ -46,6 +56,7 @@ typedef struct _Entry {
HKEY hKey;
// BOOL bRoot;
HTREEITEM hTreeItem;
TCHAR szName[MAX_NAME_LEN];
} Entry;
@ -66,14 +77,6 @@ typedef struct {
} ChildWnd;
#define STATUS_WINDOW 2001
#define TREE_WINDOW 2002
#define LIST_WINDOW 2003
#define SPLIT_WINDOW 2004
#define MAX_LOADSTRING 100
#define SPLIT_WIDTH 3
////////////////////////////////////////////////////////////////////////////////
// Global Variables:
//

View file

@ -1,5 +1,6 @@
//Microsoft Developer Studio generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
@ -33,10 +34,14 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
IDI_REGEDIT ICON DISCARDABLE "res/regedit.ico"
IDI_SMALL ICON DISCARDABLE "res/small.ico"
IDB_OPEN_FILE BITMAP DISCARDABLE "res/folder1.bmp"
IDB_CLOSED_FILE BITMAP DISCARDABLE "res/folder2.bmp"
IDB_ROOT BITMAP DISCARDABLE "res/folder3.bmp"
/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//
IDB_OPEN_FILE BITMAP DISCARDABLE "res/folder1.bmp"
IDB_CLOSED_FILE BITMAP DISCARDABLE "res/folder2.bmp"
IDB_ROOT BITMAP DISCARDABLE "res/folder3.bmp"
/////////////////////////////////////////////////////////////////////////////
//
@ -59,16 +64,17 @@ IDR_REGEDIT_MENU MENU DISCARDABLE
BEGIN
POPUP "&Registry"
BEGIN
MENUITEM "&Import Registry File...", ID_REGISTRY_IMPORTREGISTRYFILE, GRAYED
MENUITEM "&Export Registry File...", ID_REGISTRY_EXPORTREGISTRYFILE, GRAYED
MENUITEM "&Import Registry File...", ID_REGISTRY_IMPORTREGISTRYFILE
, GRAYED
MENUITEM "&Export Registry File...", ID_REGISTRY_EXPORTREGISTRYFILE
, GRAYED
MENUITEM SEPARATOR
MENUITEM "&Connect Network Registry...",
ID_REGISTRY_CONNECTNETWORKREGISTRY, GRAYED
ID_REGISTRY_CONNECTNETWORKREGISTRY
, GRAYED
MENUITEM "&Disconnect Network Registry...",
ID_REGISTRY_DISCONNECTNETWORKREGISTRY, GRAYED
ID_REGISTRY_DISCONNECTNETWORKREGISTRY
, GRAYED
MENUITEM SEPARATOR
MENUITEM "&Print\tCtrl+P", ID_REGISTRY_PRINT, GRAYED
MENUITEM SEPARATOR
@ -105,7 +111,8 @@ BEGIN
END
POPUP "&Favourites"
BEGIN
MENUITEM "&Add to Favourites", ID_FAVOURITES_ADDTOFAVOURITES, GRAYED
MENUITEM "&Add to Favourites", ID_FAVOURITES_ADDTOFAVOURITES
, GRAYED
MENUITEM "&Remove Favourite", ID_FAVOURITES_REMOVEFAVOURITE
, GRAYED
END
@ -117,13 +124,6 @@ BEGIN
END
END
STRINGTABLE DISCARDABLE
BEGIN
IDS_LIST_COLUMN_NAME "Name"
IDS_LIST_COLUMN_TYPE "Type"
IDS_LIST_COLUMN_DATA "Data"
END
/////////////////////////////////////////////////////////////////////////////
//
@ -174,46 +174,60 @@ END
STRINGTABLE DISCARDABLE
BEGIN
IDS_APP_TITLE "ReactOS Registry Editor"
IDS_LIST_COLUMN_NAME "Name"
IDS_LIST_COLUMN_TYPE "Type"
IDS_LIST_COLUMN_DATA "Data"
END
STRINGTABLE DISCARDABLE
BEGIN
IDS_APP_TITLE "ReactOS Registry Editor"
IDC_REGEDIT "REGEDIT"
IDC_REGEDIT_FRAME "REGEDIT_FRAME"
END
STRINGTABLE DISCARDABLE
BEGIN
ID_REGISTRY_MENU "Contains commands for working with the whole registry"
ID_EDIT_MENU "Contains commands for editing values or keys"
ID_EDIT_NEW_MENU "Contains commands for creating new keys or values"
ID_VIEW_MENU "Contains commands for customising the registry window"
ID_FAVOURITES_MENU "Contains commands for accessing frequently used keys"
ID_HELP_MENU "Contains commands for displaying help and information about registry editor"
ID_EDIT_NEW_MENU "Contains commands for creating new keys or values"
END
ID_REGISTRY_IMPORTREGISTRYFILE "Imports a text file into the registry"
ID_REGISTRY_EXPORTREGISTRYFILE "Exports all or part of the registry to a text file"
ID_REGISTRY_CONNECTNETWORKREGISTRY "Connects to a remote computer's registry"
ID_REGISTRY_DISCONNECTNETWORKREGISTRY "Disconnects from a remote computer's registry"
ID_REGISTRY_PRINT "Prints all or part of the registry"
ID_REGISTRY_EXIT "Quits the registry editor"
ID_EDIT_MODIFY "Modifies the value's data"
STRINGTABLE DISCARDABLE
BEGIN
ID_EDIT_MODIFY "Modifies the value's data"
ID_EDIT_NEW_KEY "Adds a new key"
ID_EDIT_NEW_STRINGVALUE "Adds a new string value"
ID_EDIT_NEW_BINARYVALUE "Adds a new binary value"
ID_EDIT_NEW_DWORDVALUE "Adds a new double word value"
ID_REGISTRY_IMPORTREGISTRYFILE "Imports a text file into the registry"
ID_REGISTRY_EXPORTREGISTRYFILE
"Exports all or part of the registry to a text file"
ID_REGISTRY_CONNECTNETWORKREGISTRY
"Connects to a remote computer's registry"
ID_REGISTRY_DISCONNECTNETWORKREGISTRY
"Disconnects from a remote computer's registry"
ID_REGISTRY_PRINT "Prints all or part of the registry"
ID_HELP_ABOUT "Displays program information, version number and copyright"
END
STRINGTABLE DISCARDABLE
BEGIN
ID_REGISTRY_EXIT "Quits the registry editor"
ID_HELP_HELPTOPICS "Opens registry editor help"
ID_FAVOURITES_ADDTOFAVOURITES "Adds keys to the favourites list"
ID_FAVOURITES_REMOVEFAVOURITE "Removes keys from the favourites list"
ID_VIEW_STATUSBAR "Shows or hides the status bar"
ID_VIEW_SPLIT "Change position of split between two panes"
ID_VIEW_REFRESH "Refreshes the window"
ID_EDIT_DELETE "Deletes the selection"
ID_EDIT_RENAME "Renames the selection"
ID_EDIT_COPYKEYNAME "Copies the name of the selected key to the clipboard"
ID_EDIT_FIND "Finds a text string in a key, value or data"
ID_EDIT_FINDNEXT "Finds next occurrence of text specified in previous search"
ID_VIEW_STATUSBAR "Shows or hides the status bar"
ID_VIEW_SPLIT "Change position of split between two panes"
ID_VIEW_REFRESH "Refreshes the window"
ID_FAVOURITES_ADDTOFAVOURITES "Adds keys to the favourites list"
ID_FAVOURITES_REMOVEFAVOURITE "Removes keys from the favourites list"
ID_HELP_HELPTOPICS "Opens registry editor help"
ID_HELP_ABOUT "Displays program information, version number and copyright"
IDC_REGEDIT "REGEDIT"
IDC_REGEDIT_FRAME "REGEDIT_FRAME"
END
#endif // English (U.S.) resources

View file

@ -57,93 +57,6 @@ 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.
// lpszItem - text of the item to add.
// nLevel - level at which to add the item.
HTREEITEM AddItemToTree(HWND hwndTV, LPTSTR lpszItem, int nLevel)
{
TVITEM tvi;
TVINSERTSTRUCT tvins;
static HTREEITEM hPrev = (HTREEITEM)TVI_FIRST;
static HTREEITEM hPrevRootItem = NULL;
static HTREEITEM hPrevLev2Item = NULL;
HTREEITEM hti;
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);
// Assume the item is not a parent item, so give it an image.
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;
tvins.item = tvi;
tvins.hInsertAfter = hPrev;
// Set the parent item based on the specified level.
if (nLevel == 1)
tvins.hParent = TVI_ROOT;
else if (nLevel == 2)
tvins.hParent = hPrevRootItem;
else
tvins.hParent = hPrevLev2Item;
// Add the item to the tree view control.
hPrev = (HTREEITEM)SendMessage(hwndTV, TVM_INSERTITEM, 0, (LPARAM)(LPTVINSERTSTRUCT)&tvins);
// Save the handle to the item.
if (nLevel == 1)
hPrevRootItem = hPrev;
else if (nLevel == 2)
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 (nLevel > 1) {
hti = TreeView_GetParent(hwndTV, hPrev);
tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvi.hItem = hti;
tvi.iImage = Image_Closed;
tvi.iSelectedImage = Image_Closed;
TreeView_SetItem(hwndTV, &tvi);
}
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);
}
static HTREEITEM AddEntryToTree(HWND hwndTV, Entry* entry, LPTSTR label)
{
HTREEITEM hItem = 0;
@ -203,84 +116,28 @@ static HTREEITEM AddEntryToTree(HWND hwndTV, Entry* entry, LPTSTR label)
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;
tvi.iImage = Image_Closed;
tvi.iSelectedImage = Image_Closed;
TreeView_SetItem(hwndTV, &tvi);
}
*/
hItem = hPrev;
return hItem;
}
// insert treectrl entries after index idx
static void insert_tree_entries(HWND hWnd, Entry* entry, int idx)
static Entry* CreateEntry(Entry* pParentEntry, HKEY hKey, LPCTSTR szKeyName)
{
static HTREEITEM hItemVisible;
static int hItemVisibleIdx;
Entry* pEntry = NULL;
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;
}
}
//TRACE("Adding item %u [level:%u] - %s\n", ++idx, entry->level, entry->data.cFileName);
*/
if (entry->hTreeItem) continue;
entry->hTreeItem = AddEntryToTree(hWnd, entry, NULL);
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);
pEntry = malloc(sizeof(Entry));
memset(pEntry, 0, sizeof(Entry));
//pEntry->up = pParentEntry;
pEntry->level = 1;
pEntry->hKey = hKey;
_tcsncpy(pEntry->szName, szKeyName, MAX_NAME_LEN);
// pEntry->hTreeItem = AddEntryToTree(hwndTV, pEntry, szKeyName);
return pEntry;
}
static BOOL InitTreeViewItems(HWND hwndTV, Root* pRoot/*LPCTSTR pHostName*/)
{
// HRESULT key;
//HRESULT openKey(LPSTR stdInput)
// key = openKey("HKEY_CLASSES_ROOT");
//LPSTR getRegKeyName(LPSTR lpLine);
//HKEY getRegClass(LPSTR lpLine);
// closeKey();
#define MAX_NAME_LEN 500
HKEY hKey;
LONG errCode;
Entry* pPrevEntry;
// HKEY hKey;
// LONG errCode;
Entry* pEntry = &pRoot->entry;
HTREEITEM hRootItem;
@ -288,131 +145,23 @@ static BOOL InitTreeViewItems(HWND hwndTV, Root* pRoot/*LPCTSTR pHostName*/)
// HTREEITEM hRootItem = AddItemToTree(hwndTV, pHostName, 1);
// pEntry = malloc(sizeof(Entry));
// memset(pEntry, 0, sizeof(Entry));
// memset(pEntry, 0, sizeof(Entry));
//insert_tree_entries(hwndTV, pEntry, 0);
pEntry->level = 0;
pEntry->hTreeItem = AddEntryToTree(hwndTV, pEntry, pRoot->path);
hRootItem = pEntry->hTreeItem;
pPrevEntry = pEntry;
//HTREEITEM AddItemToTree(HWND hwndTV, LPTSTR lpszItem, int nLevel)
//HTREEITEM AddEntryToTree(HWND hwndTV, Entry* entry)
//static void insert_tree_entries(HWND hWnd, Entry* entry, int idx)
pEntry = malloc(sizeof(Entry));
memset(pEntry, 0, sizeof(Entry));
pEntry->up = &pRoot->entry;
pEntry->level = 1;
pEntry->hTreeItem = AddEntryToTree(hwndTV, pEntry, _T("HKEY_CLASSES_ROOT"));
pEntry = malloc(sizeof(Entry));
memset(pEntry, 0, sizeof(Entry));
pEntry->up = &pRoot->entry;
pEntry->level = 1;
pEntry->hTreeItem = AddEntryToTree(hwndTV, pEntry, _T("HKEY_CURRENT_USER"));
pEntry = malloc(sizeof(Entry));
memset(pEntry, 0, sizeof(Entry));
pEntry->up = &pRoot->entry;
pEntry->level = 1;
pEntry->hTreeItem = AddEntryToTree(hwndTV, pEntry, _T("HKEY_LOCAL_MACHINE"));
pPrevEntry = pEntry;
errCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, NULL, 0, KEY_READ, &hKey);
if (errCode == ERROR_SUCCESS) {
TCHAR Name[MAX_NAME_LEN];
TCHAR Class[MAX_NAME_LEN];
FILETIME LastWriteTime;
DWORD dwIndex = 0L;
DWORD cName = MAX_NAME_LEN;
DWORD cClass = MAX_NAME_LEN;
while (RegEnumKeyEx(hKey, dwIndex, Name, &cName, NULL, Class, &cClass, &LastWriteTime) == ERROR_SUCCESS) {
//AddItemToTree(hwndTV, Name, 2);
pEntry = malloc(sizeof(Entry));
memset(pEntry, 0, sizeof(Entry));
pEntry->up = pPrevEntry;
pEntry->hKey = hKey;
pEntry->bKey = TRUE;
//insert_tree_entries(hwndTV, pEntry, 0);
pEntry->level = 2;
// pEntry->hTreeItem = AddEntryToTree(hwndTV, pEntry, Name);
pEntry->hTreeItem = AddEntryToTree(hwndTV, pEntry, NULL);
cName = MAX_NAME_LEN;
cClass = MAX_NAME_LEN;
++dwIndex;
}
RegCloseKey(hKey);
TreeView_Expand(hwndTV, hRootItem, TVE_EXPAND);
}
pEntry = malloc(sizeof(Entry));
memset(pEntry, 0, sizeof(Entry));
pEntry->up = &pRoot->entry;
pEntry->level = 1;
pEntry->hTreeItem = AddEntryToTree(hwndTV, pEntry, _T("HKEY_USERS"));
pEntry = malloc(sizeof(Entry));
memset(pEntry, 0, sizeof(Entry));
pEntry->up = &pRoot->entry;
pEntry->level = 1;
pEntry->hTreeItem = AddEntryToTree(hwndTV, pEntry, _T("HKEY_CURRENT_CONFIG"));
pEntry = CreateEntry(&pRoot->entry, HKEY_CLASSES_ROOT, _T("HKEY_CLASSES_ROOT"));
pEntry->hTreeItem = AddEntryToTree(hwndTV, pEntry, NULL);
pEntry = CreateEntry(&pRoot->entry, HKEY_CURRENT_USER, _T("HKEY_CURRENT_USER"));
pEntry->hTreeItem = AddEntryToTree(hwndTV, pEntry, NULL);
pEntry = CreateEntry(&pRoot->entry, HKEY_LOCAL_MACHINE, _T("HKEY_LOCAL_MACHINE"));
pEntry->hTreeItem = AddEntryToTree(hwndTV, pEntry, NULL);
pEntry = CreateEntry(&pRoot->entry, HKEY_USERS, _T("HKEY_USERS"));
pEntry->hTreeItem = AddEntryToTree(hwndTV, pEntry, NULL);
pEntry = CreateEntry(&pRoot->entry, HKEY_CURRENT_CONFIG, _T("HKEY_CURRENT_CONFIG"));
pEntry->hTreeItem = AddEntryToTree(hwndTV, pEntry, NULL);
return TRUE;
}
/*
AddItemToTree(hwndTV, _T("HKEY_CLASSES_ROOT"), 2);
AddItemToTree(hwndTV, _T("HKEY_CURRENT_USER"), 2);
AddItemToTree(hwndTV, _T("HKEY_LOCAL_MACHINE"), 2);
AddItemToTree(hwndTV, _T("HKEY_USERS"), 2);
AddItemToTree(hwndTV, _T("HKEY_CURRENT_CONFIG"), 2);
*/
/*
LONG RegOpenKeyEx(
HKEY hKey, // handle to open key
LPCTSTR lpSubKey, // subkey name
DWORD ulOptions, // reserved
REGSAM samDesired, // security access mask
PHKEY phkResult // handle to open key
);
LONG RegEnumKey(
HKEY hKey, // handle to key to query
DWORD dwIndex, // index of subkey to query
LPTSTR lpName, // buffer for subkey name
DWORD cbName // size of subkey name buffer
);
LONG RegEnumKeyEx(
HKEY hKey, // handle to key to enumerate
DWORD dwIndex, // subkey index
LPTSTR lpName, // subkey name
LPDWORD lpcName, // size of subkey buffer
LPDWORD lpReserved, // reserved
LPTSTR lpClass, // class string buffer
LPDWORD lpcClass, // size of class string buffer
PFILETIME lpftLastWriteTime // last write time
);
*/
/*
RegCloseKey
RegConnectRegistryW
RegCreateKeyW
RegDeleteKeyW
RegDeleteValueW
RegEnumKeyW
RegEnumValueW
RegFlushKey
RegOpenKeyExA
RegOpenKeyExW
RegOpenKeyW
RegQueryInfoKeyW
RegQueryValueExA
RegQueryValueExW
RegSetValueExA
RegSetValueExW
RegSetValueW
*/
// InitTreeViewImageLists - creates an image list, adds three bitmaps
// to it, and associates the image list with a tree view control.
@ -459,13 +208,6 @@ static BOOL InitTreeViewImageLists(HWND hwndTV)
static void OnGetDispInfo(NMTVDISPINFO* ptvdi)
{
FILETIME LastWriteTime;
TCHAR Class[MAX_NAME_LEN];
DWORD cClass = MAX_NAME_LEN;
// TCHAR Name[MAX_NAME_LEN];
// DWORD cName = MAX_NAME_LEN;
// DWORD dwIndex = 0L;
Entry* pEntry = (Entry*)ptvdi->item.lParam;
ASSERT(pEntry);
@ -479,6 +221,7 @@ static void OnGetDispInfo(NMTVDISPINFO* ptvdi)
ptvdi->item.iSelectedImage = Image_Closed;
}
if (ptvdi->item.mask & TVIF_TEXT) {
/*
ptvdi->item.pszText = _T("Unknown");
ptvdi->item.cchTextMax = _tcslen(ptvdi->item.pszText);
if (pEntry->bKey == TRUE) {
@ -496,32 +239,16 @@ static void OnGetDispInfo(NMTVDISPINFO* ptvdi)
&MaxValueNameLen, &MaxValueLen, &SecurityDescriptorLen,
&LastWriteTime);
if (result == ERROR_SUCCESS) {
// ptvdi->item.pszText = Class;
// ptvdi->item.cchTextMax = cClass;
ptvdi->item.pszText = Class;
ptvdi->item.cchTextMax = cClass;
}
}
// ptvdi->item.pszText = entry->data.cFileName;
// ptvdi->item.cchTextMax = lstrlen(entry->data.cFileName);
*/
ptvdi->item.pszText = pEntry->szName;
ptvdi->item.cchTextMax = lstrlen(pEntry->szName);
}
}
// 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(_T("TreeWndProc(...) OnExpand()\n"));
@ -539,14 +266,32 @@ TVE_TOGGLE Collapses the list if it is expanded or expands it if it is collapsed
static BOOL OnExpanding(HWND hWnd, NMTREEVIEW* pnmtv)
{
static int expanding;
HKEY hKey;
LONG errCode;
Entry* entry = (Entry*)pnmtv->itemNew.lParam;
TRACE(_T("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);
errCode = RegOpenKeyEx(entry->hKey, NULL, 0, KEY_READ, &hKey);
if (errCode == ERROR_SUCCESS) {
TCHAR Name[MAX_NAME_LEN];
DWORD cName = MAX_NAME_LEN;
FILETIME LastWriteTime;
DWORD dwIndex = 0L;
while (RegEnumKeyEx(hKey, dwIndex, Name, &cName, NULL, NULL, NULL, &LastWriteTime) == ERROR_SUCCESS) {
Entry* pEntry = CreateEntry(entry, hKey, Name);
pEntry->up = entry;
pEntry->hKey = hKey;
pEntry->bKey = TRUE;
pEntry->level = 2;
pEntry->hTreeItem = AddEntryToTree(hWnd, pEntry, NULL);
cName = MAX_NAME_LEN;
++dwIndex;
}
RegCloseKey(hKey);
}
}
expanding = FALSE;
return TRUE;
@ -567,8 +312,8 @@ static WNDPROC g_orgTreeWndProc;
static LRESULT CALLBACK TreeWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// ChildWnd* child = (ChildWnd*)GetWindowLong(GetParent(hWnd), GWL_USERDATA);
// Pane* pane = (Pane*)GetWindowLong(hWnd, GWL_USERDATA);
// ASSERT(child);
switch (message) {
case WM_NOTIFY:
switch (((LPNMHDR)lParam)->code) {
@ -582,7 +327,7 @@ static LRESULT CALLBACK TreeWndProc(HWND hWnd, UINT message, WPARAM wParam, LPAR
case TVN_ITEMEXPANDING:
return OnExpanding(hWnd, (NMTREEVIEW*)lParam);
break;
case TVN_SELCHANGED:
// case TVN_SELCHANGED:
// return OnSelChanged((NMTREEVIEW*)lParam);
// break;
#if 0
@ -594,15 +339,8 @@ static LRESULT CALLBACK TreeWndProc(HWND hWnd, UINT message, WPARAM wParam, LPAR
// return TVNRET_SKIPNEW; // Skip default processing of the item being selected.
break;
#endif
case TVN_ENDLABELEDIT:
return OnEndLabelEdit((NMTVDISPINFO*)lParam);
break;
}
return 0;
break;
case WM_SETFOCUS:
//child->nFocusPanel = pane == &child->right? 1: 0;
//TODO: check menu items
// return 0;
break;
case WM_KEYDOWN:
if (wParam == VK_TAB) {
@ -614,20 +352,16 @@ static LRESULT CALLBACK TreeWndProc(HWND hWnd, UINT message, WPARAM wParam, LPAR
}
// CreateTreeView - creates a tree view control.
// Returns the handle to the new control if successful,
// or NULL otherwise.
// Returns the handle to the new control if successful, or NULL otherwise.
// hwndParent - handle to the control's parent window.
HWND CreateTreeView(HWND hwndParent/*, Pane* pane*/, int id, Root* pRoot/*LPTSTR lpszPathName*/)
HWND CreateTreeView(HWND hwndParent, int id, Root* pRoot)
{
RECT rcClient; // dimensions of client area
HWND hwndTV; // handle to tree view control
// static int s_init = 0;
// Entry* entry = pane->root;
// pane->treePane = 1;
RECT rcClient;
HWND hwndTV;
// Entry* entry = ;
// Get the dimensions of the parent window's client area, and create
// the tree view control.
// Get the dimensions of the parent window's client area, and create the tree view control.
GetClientRect(hwndParent, &rcClient);
hwndTV = CreateWindowEx(0, WC_TREEVIEW, _T("Tree View"),
WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT,
@ -638,22 +372,9 @@ HWND CreateTreeView(HWND hwndParent/*, Pane* pane*/, int id, Root* pRoot/*LPTSTR
DestroyWindow(hwndTV);
return NULL;
}
SetWindowLong(hwndTV, GWL_USERDATA, (LPARAM)0);
g_orgTreeWndProc = SubclassWindow(hwndTV, TreeWndProc);
//SendMessage(hwndTV, WM_SETFONT, (WPARAM)Globals.hFont, FALSE);
// insert entries into treectrl
// if (entry) {
// insert_tree_entries(hwndTV, entry, 0);
// }
// calculate column widths
// if (!s_init) {
// s_init = 1;
// init_output(hwndTV);
// }
return hwndTV;
}