From 1ad1b97103e8a04b396815fc21410cb77e394bc3 Mon Sep 17 00:00:00 2001 From: Robert Dickenson Date: Tue, 16 Jul 2002 22:18:29 +0000 Subject: [PATCH] Updated treeview and listview functionality. svn path=/trunk/; revision=3241 --- rosapps/regedit/childwnd.c | 47 +---- rosapps/regedit/listview.c | 135 +++++++++++-- rosapps/regedit/main.c | 2 +- rosapps/regedit/main.h | 19 +- rosapps/regedit/regedit.rc | 96 +++++---- rosapps/regedit/treeview.c | 395 ++++++------------------------------- 6 files changed, 251 insertions(+), 443 deletions(-) diff --git a/rosapps/regedit/childwnd.c b/rosapps/regedit/childwnd.c index 5f22a313a5b..6a385d530a8 100644 --- a/rosapps/regedit/childwnd.c +++ b/rosapps/regedit/childwnd.c @@ -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)) { diff --git a/rosapps/regedit/listview.c b/rosapps/regedit/listview.c index 9d0e714f900..ff9e09af5bb 100644 --- a/rosapps/regedit/listview.c +++ b/rosapps/regedit/listview.c @@ -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); } - */ } } diff --git a/rosapps/regedit/main.c b/rosapps/regedit/main.c index 75f9b353f48..2dac5489ed0 100644 --- a/rosapps/regedit/main.c +++ b/rosapps/regedit/main.c @@ -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*/); diff --git a/rosapps/regedit/main.h b/rosapps/regedit/main.h index 991fe72bd0e..df436c215ea 100644 --- a/rosapps/regedit/main.h +++ b/rosapps/regedit/main.h @@ -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: // diff --git a/rosapps/regedit/regedit.rc b/rosapps/regedit/regedit.rc index 0a47f728a11..6c69148de95 100644 --- a/rosapps/regedit/regedit.rc +++ b/rosapps/regedit/regedit.rc @@ -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 diff --git a/rosapps/regedit/treeview.c b/rosapps/regedit/treeview.c index 52eff0ea32c..c644206021d 100644 --- a/rosapps/regedit/treeview.c +++ b/rosapps/regedit/treeview.c @@ -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; }