flatten Entry/ShellEntry class hierarchy
Modified: branches/lean-explorer/reactos/subsys/system/explorer/explorer.cpp
Modified: branches/lean-explorer/reactos/subsys/system/explorer/explorer.dsp
Modified: branches/lean-explorer/reactos/subsys/system/explorer/explorer.h
Modified: branches/lean-explorer/reactos/subsys/system/explorer/globals.h
Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.cpp
Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.h
Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser.cpp
Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser.h
Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/shellfs.cpp
Deleted: branches/lean-explorer/reactos/subsys/system/explorer/shell/shellfs.h
Modified: branches/lean-explorer/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp
Modified: branches/lean-explorer/reactos/subsys/system/explorer/taskbar/quicklaunch.h
Modified: branches/lean-explorer/reactos/subsys/system/explorer/taskbar/startmenu.cpp
Modified: branches/lean-explorer/reactos/subsys/system/explorer/taskbar/startmenu.h

Modified: branches/lean-explorer/reactos/subsys/system/explorer/explorer.cpp
--- branches/lean-explorer/reactos/subsys/system/explorer/explorer.cpp	2005-12-31 15:47:15 UTC (rev 20485)
+++ branches/lean-explorer/reactos/subsys/system/explorer/explorer.cpp	2005-12-31 15:54:25 UTC (rev 20486)
@@ -86,35 +86,6 @@
 }
 
 
-bool FileTypeManager::is_exe_file(LPCTSTR ext)
-{
-	static const LPCTSTR s_executable_extensions[] = {
-		TEXT("COM"),
-		TEXT("EXE"),
-		TEXT("BAT"),
-		TEXT("CMD"),
-		TEXT("CMM"),
-		TEXT("BTM"),
-		TEXT("AWK"),
-		0
-	};
-
-	TCHAR ext_buffer[_MAX_EXT];
-	const LPCTSTR* p;
-	LPCTSTR s;
-	LPTSTR d;
-
-	for(s=ext+1,d=ext_buffer; (*d=toupper(*s)); s++)
-		++d;
-
-	for(p=s_executable_extensions; *p; p++)
-		if (!lstrcmp(ext_buffer, *p))
-			return true;
-
-	return false;
-}
-
-
 const FileTypeInfo& FileTypeManager::operator[](String ext)
 {
 	_tcslwr((LPTSTR)ext.c_str());
@@ -149,7 +120,7 @@
 	return ftype;
 }
 
-LPCTSTR FileTypeManager::set_type(Entry* entry, bool dont_hide_ext)
+LPCTSTR FileTypeManager::set_type(ShellEntry* entry, bool dont_hide_ext)
 {
 	LPCTSTR ext = _tcsrchr(entry->_data.cFileName, TEXT('.'));
 
@@ -163,9 +134,6 @@
 			_tcsncpy(entry->_display_name, entry->_data.cFileName, len);
 			entry->_display_name[len] = TEXT('\0');
 		}
-
-		if (is_exe_file(ext))
-			entry->_data.dwFileAttributes |= ATTRIBUTE_EXECUTABLE;
 	}
 
 	return ext;

Modified: branches/lean-explorer/reactos/subsys/system/explorer/explorer.dsp
--- branches/lean-explorer/reactos/subsys/system/explorer/explorer.dsp	2005-12-31 15:47:15 UTC (rev 20485)
+++ branches/lean-explorer/reactos/subsys/system/explorer/explorer.dsp	2005-12-31 15:54:25 UTC (rev 20486)
@@ -406,10 +406,6 @@
 # End Source File
 # Begin Source File
 
-SOURCE=.\shell\shellfs.h
-# End Source File
-# Begin Source File
-
 SOURCE=.\shell\startup.c
 # SUBTRACT CPP /YX /Yc /Yu
 # End Source File

Modified: branches/lean-explorer/reactos/subsys/system/explorer/explorer.h
--- branches/lean-explorer/reactos/subsys/system/explorer/explorer.h	2005-12-31 15:47:15 UTC (rev 20485)
+++ branches/lean-explorer/reactos/subsys/system/explorer/explorer.h	2005-12-31 15:54:25 UTC (rev 20486)
@@ -34,7 +34,6 @@
 #include "utility/shellclasses.h"
 
 #include "shell/entries.h"
-#include "shell/shellfs.h"
 
 #include "utility/window.h"
 

Modified: branches/lean-explorer/reactos/subsys/system/explorer/globals.h
--- branches/lean-explorer/reactos/subsys/system/explorer/globals.h	2005-12-31 15:47:15 UTC (rev 20485)
+++ branches/lean-explorer/reactos/subsys/system/explorer/globals.h	2005-12-31 15:54:25 UTC (rev 20486)
@@ -39,9 +39,7 @@
 
 	const FileTypeInfo& operator[](String ext);
 
-	static bool is_exe_file(LPCTSTR ext);
-
-	LPCTSTR set_type(struct Entry* entry, bool dont_hide_ext=false);
+	LPCTSTR set_type(struct ShellEntry* entry, bool dont_hide_ext=false);
 };
 
 

Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.cpp
--- branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.cpp	2005-12-31 15:47:15 UTC (rev 20485)
+++ branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.cpp	2005-12-31 15:54:25 UTC (rev 20486)
@@ -30,7 +30,7 @@
 
 
  // allocate and initialise a directory entry
-Entry::Entry()
+ShellEntry::ShellEntry()
 {
 	_up = NULL;
 	_next = NULL;
@@ -42,9 +42,10 @@
 	_display_name = _data.cFileName;
 }
 
-Entry::Entry(Entry* parent)
- :	_up(parent)
+ShellEntry::ShellEntry(LPITEMIDLIST shell_path)
+ : _pidl(shell_path)
 {
+	_up = NULL;
 	_next = NULL;
 	_down = NULL;
 	_expanded = false;
@@ -54,10 +55,51 @@
 	_display_name = _data.cFileName;
 }
 
-Entry::Entry(const Entry& other)
+ShellEntry::ShellEntry(const ShellPath& shell_path)
+ : _pidl(shell_path)
 {
+	_up = NULL;
 	_next = NULL;
 	_down = NULL;
+	_expanded = false;
+	_scanned = false;
+	_level = 0;
+	_icon_id = ICID_UNKNOWN;
+	_display_name = _data.cFileName;
+}
+
+
+ShellEntry::ShellEntry(ShellDirectory* parent, const ShellPath& shell_path)
+ :	_up(parent),
+	_pidl(shell_path)
+{
+	_next = NULL;
+	_down = NULL;
+	_expanded = false;
+	_scanned = false;
+	_level = 0;
+	_icon_id = ICID_UNKNOWN;
+	_display_name = _data.cFileName;
+}
+
+ShellEntry::ShellEntry(ShellDirectory* parent, LPITEMIDLIST shell_path)
+ :	_up(parent),
+	_pidl(shell_path)
+{
+	_next = NULL;
+	_down = NULL;
+	_expanded = false;
+	_scanned = false;
+	_level = 0;
+	_icon_id = ICID_UNKNOWN;
+	_display_name = _data.cFileName;
+}
+
+ShellEntry::ShellEntry(const ShellEntry& other)
+ :	_pidl(other._pidl)
+{
+	_next = NULL;
+	_down = NULL;
 	_up = NULL;
 
 	assert(!other._next);
@@ -77,7 +119,7 @@
 }
 
  // free a directory entry
-Entry::~Entry()
+ShellEntry::~ShellEntry()
 {
 	if (_icon_id > ICID_NONE)
 		g_Globals._icon_cache.free_icon(_icon_id);
@@ -88,24 +130,27 @@
 
 
  // read directory tree and expand to the given location
-Entry* Entry::read_tree(const void* path, SORT_ORDER sortOrder)
+ShellEntry* ShellDirectory::read_tree(const void* path, SORT_ORDER sortOrder)
 {
-	CONTEXT("Entry::read_tree()");
+	CONTEXT("ShellEntry::read_tree()");
 
 	HCURSOR old_cursor = SetCursor(LoadCursor(0, IDC_WAIT));
 
-	Entry* entry = this;
+	ShellDirectory* entry = this;
 
 	for(const void*p=path; p && entry; ) {
+		if (!(entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
+			break;
+
 		entry->read_directory(sortOrder);
 
 		if (entry->_down)
 			entry->_expanded = true;
 
-		Entry* next_entry = entry->find_entry(p);
+		ShellEntry* next_entry = entry->find_entry(p);
 		p = entry->get_next_path_component(p);
 
-		entry = next_entry;
+		entry = static_cast<ShellDirectory*>(next_entry);
 	}
 
 	SetCursor(old_cursor);
@@ -114,19 +159,21 @@
 }
 
 
-void Entry::read_directory(SORT_ORDER sortOrder, int scan_flags)
+void ShellDirectory::read_directory(SORT_ORDER sortOrder, int scan_flags)
 {
-	CONTEXT("Entry::read_directory(SORT_ORDER)");
+	CONTEXT("ShellEntry::read_directory(SORT_ORDER)");
 
 	 // call into subclass
 	read_directory(scan_flags);
 
 #ifndef ROSSHELL
 	if (g_Globals._prescan_nodes) {	//@todo _prescan_nodes should not be used for reading the start menu.
-		for(Entry*entry=_down; entry; entry=entry->_next)
+		for(ShellEntry*entry=_down; entry; entry=entry->_next)
 			if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
-				entry->read_directory(scan_flags);
-				entry->sort_directory(sortOrder);
+				ShellDirectory* dir = static_cast<ShellDirectory*>(entry);
+
+				dir->read_directory(scan_flags);
+				dir->sort_directory(sortOrder);
 			}
 	}
 #endif
@@ -170,8 +217,8 @@
 
 static int compareName(const void* arg1, const void* arg2)
 {
-	const WIN32_FIND_DATA* fd1 = &(*(Entry**)arg1)->_data;
-	const WIN32_FIND_DATA* fd2 = &(*(Entry**)arg2)->_data;
+	const WIN32_FIND_DATA* fd1 = &(*(ShellEntry**)arg1)->_data;
+	const WIN32_FIND_DATA* fd2 = &(*(ShellEntry**)arg2)->_data;
 
 	int cmp = compareType(fd1, fd2);
 	if (cmp)
@@ -182,8 +229,8 @@
 
 static int compareExt(const void* arg1, const void* arg2)
 {
-	const WIN32_FIND_DATA* fd1 = &(*(Entry**)arg1)->_data;
-	const WIN32_FIND_DATA* fd2 = &(*(Entry**)arg2)->_data;
+	const WIN32_FIND_DATA* fd1 = &(*(ShellEntry**)arg1)->_data;
+	const WIN32_FIND_DATA* fd2 = &(*(ShellEntry**)arg2)->_data;
 	const TCHAR *name1, *name2, *ext1, *ext2;
 
 	int cmp = compareType(fd1, fd2);
@@ -215,8 +262,8 @@
 
 static int compareSize(const void* arg1, const void* arg2)
 {
-	WIN32_FIND_DATA* fd1 = &(*(Entry**)arg1)->_data;
-	WIN32_FIND_DATA* fd2 = &(*(Entry**)arg2)->_data;
+	WIN32_FIND_DATA* fd1 = &(*(ShellEntry**)arg1)->_data;
+	WIN32_FIND_DATA* fd2 = &(*(ShellEntry**)arg2)->_data;
 
 	int cmp = compareType(fd1, fd2);
 	if (cmp)
@@ -236,8 +283,8 @@
 
 static int compareDate(const void* arg1, const void* arg2)
 {
-	WIN32_FIND_DATA* fd1 = &(*(Entry**)arg1)->_data;
-	WIN32_FIND_DATA* fd2 = &(*(Entry**)arg2)->_data;
+	WIN32_FIND_DATA* fd1 = &(*(ShellEntry**)arg1)->_data;
+	WIN32_FIND_DATA* fd2 = &(*(ShellEntry**)arg2)->_data;
 
 	int cmp = compareType(fd1, fd2);
 	if (cmp)
@@ -256,11 +303,11 @@
 };
 
 
-void Entry::sort_directory(SORT_ORDER sortOrder)
+void ShellDirectory::sort_directory(SORT_ORDER sortOrder)
 {
 	if (sortOrder != SORT_NONE) {
-		Entry* entry = _down;
-		Entry** array, **p;
+		ShellEntry* entry = _down;
+		ShellEntry** array, **p;
 		int len;
 
 		len = 0;
@@ -268,7 +315,7 @@
 			++len;
 
 		if (len) {
-			array = (Entry**) alloca(len*sizeof(Entry*));
+			array = (ShellEntry**) alloca(len*sizeof(ShellEntry*));
 
 			p = array;
 			for(entry=_down; entry; entry=entry->_next)
@@ -288,9 +335,9 @@
 }
 
 
-void Entry::smart_scan(int scan_flags)
+void ShellDirectory::smart_scan(int scan_flags)
 {
-	CONTEXT("Entry::smart_scan()");
+	CONTEXT("ShellEntry::smart_scan()");
 
 	if (!_scanned) {
 		free_subentries();
@@ -299,7 +346,7 @@
 }
 
 
-int Entry::extract_icon()
+int ShellEntry::extract_icon()
 {
 	TCHAR path[MAX_PATH];
 
@@ -367,7 +414,7 @@
 	return icon_id;
 }
 
-int Entry::safe_extract_icon()
+int ShellEntry::safe_extract_icon()
 {
 	try {
 		return extract_icon();
@@ -379,82 +426,10 @@
 }
 
 
-BOOL Entry::launch_entry(HWND hwnd, UINT nCmdShow)
-{
-	TCHAR cmd[MAX_PATH];
-
-	if (!get_path(cmd))
-		return FALSE;
-
-	 // add path to the recent file list
-	SHAddToRecentDocs(SHARD_PATH, cmd);
-
-	 // start program, open document...
-	return launch_file(hwnd, cmd, nCmdShow);
-}
-
-
-HRESULT Entry::GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut)
-{
-	TCHAR path[MAX_PATH];
-/*
-	if (!get_path(path))
-		return E_FAIL;
-
-	ShellPath shell_path(path);
-
-	IShellFolder* pFolder;
-	LPCITEMIDLIST pidl_last = NULL;
-
-	static DynamicFct<HRESULT(WINAPI*)(LPCITEMIDLIST, REFIID, LPVOID*, LPCITEMIDLIST*)> SHBindToParent(TEXT("SHELL32"), "SHBindToParent");
-
-	if (!SHBindToParent)
-		return E_NOTIMPL;
-
-	HRESULT hr = (*SHBindToParent)(shell_path, IID_IShellFolder, (LPVOID*)&pFolder, &pidl_last);
-	if (FAILED(hr))
-		return hr;
-
-	ShellFolder shell_folder(pFolder);
-
-	shell_folder->Release();
-
-	return shell_folder->GetUIObjectOf(hWnd, 1, &pidl_last, riid, NULL, ppvOut);
-*/
-	if (!_up)
-		return E_INVALIDARG;
-
-	if (!_up->get_path(path))
-		return E_FAIL;
-
-	ShellPath shell_path(path);
-	ShellFolder shell_folder(shell_path);
-
-#ifdef UNICODE
-	LPWSTR wname = _data.cFileName;
-#else
-	WCHAR wname[MAX_PATH];
-	MultiByteToWideChar(CP_ACP, 0, _data.cFileName, -1, wname, MAX_PATH);
-#endif
-
-	LPITEMIDLIST pidl_last = NULL;
-	HRESULT hr = shell_folder->ParseDisplayName(hWnd, NULL, wname, NULL, &pidl_last, NULL);
-
-	if (FAILED(hr))
-		return hr;
-
-	hr = shell_folder->GetUIObjectOf(hWnd, 1, (LPCITEMIDLIST*)&pidl_last, riid, NULL, ppvOut);
-
-	ShellMalloc()->Free((void*)pidl_last);
-
-	return hr;
-}
-
-
  // recursively free all child entries
-void Entry::free_subentries()
+void ShellEntry::free_subentries()
 {
-	Entry *entry, *next=_down;
+	ShellEntry *entry, *next=_down;
 
 	if (next) {
 		_down = 0;

Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.h
--- branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.h	2005-12-31 15:47:15 UTC (rev 20485)
+++ branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.h	2005-12-31 15:54:25 UTC (rev 20486)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2003, 2004 Martin Fuchs
+ * Copyright 2003, 2004, 2005 Martin Fuchs
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -40,28 +40,32 @@
 };
 
 #ifndef ATTRIBUTE_SYMBOLIC_LINK
-#define	ATTRIBUTE_LONGNAME			0x08000000
-#define	ATTRIBUTE_VOLNAME			0x10000000
-#define	ATTRIBUTE_ERASED			0x20000000
 #define ATTRIBUTE_SYMBOLIC_LINK		0x40000000
 #define	ATTRIBUTE_EXECUTABLE		0x80000000
 #endif
 
 
- /// base of all file and directory entries
-struct Entry
+struct ShellDirectory;
+
+
+ /// base of all file entries
+struct ShellEntry
 {
+	ShellEntry();
+	ShellEntry(const ShellEntry& other);
+	ShellEntry(ShellDirectory* parent, LPITEMIDLIST shell_path);
+	ShellEntry(ShellDirectory* parent, const ShellPath& shell_path);
+
 protected:
-	Entry();
-	Entry(Entry* parent);
-	Entry(const Entry&);
+	ShellEntry(LPITEMIDLIST shell_path);
+	ShellEntry(const ShellPath& shell_path);
 
 public:
-	virtual ~Entry();
+	virtual ~ShellEntry();
 
-	Entry*		_next;
-	Entry*		_down;
-	Entry*		_up;
+	ShellEntry*	_next;
+	ShellEntry*	_down;
+	ShellDirectory*	_up;
 
 	bool		_expanded;
 	bool		_scanned;
@@ -74,22 +78,19 @@
 
 	int /*ICON_ID*/ _icon_id;
 
+	ShellPath	_pidl;	// parent relative PIDL
+
 	void	free_subentries();
 
-	void	read_directory(SORT_ORDER sortOrder, int scan_flags=0);
-	Entry*	read_tree(const void* path, SORT_ORDER sortOrder);
-	void	sort_directory(SORT_ORDER sortOrder);
-	void	smart_scan(int scan_flags=0);
 	int		extract_icon();
 	int		safe_extract_icon();
 
-	virtual void read_directory(int scan_flags=0) {}
-	virtual const void* get_next_path_component(const void*) const {return NULL;}
-	virtual Entry* find_entry(const void*) {return NULL;}
-	virtual bool get_path(PTSTR path) const = 0;
-	virtual ShellPath create_absolute_pidl() const {return (LPCITEMIDLIST)NULL;}
-	virtual HRESULT GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut);
-	virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow=SW_SHOWNORMAL);
+	virtual bool get_path(PTSTR path) const;
+	ShellPath create_absolute_pidl() const;
+	BOOL launch_entry(HWND hwnd, UINT nCmdShow=SW_SHOWNORMAL);
+	HRESULT GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut);
+
+	IShellFolder* get_parent_folder() const;
 };
 
 
@@ -103,12 +104,92 @@
 };
 
 
+ /// shell folder entry
+struct ShellDirectory : public ShellEntry, public Directory
+{
+	ShellDirectory(ShellFolder& root_folder, const ShellPath& shell_path, HWND hwnd)
+	 :	ShellEntry(shell_path),
+		_folder(root_folder, shell_path),
+		_hwnd(hwnd)
+	{
+		CONTEXT("ShellDirectory::ShellDirectory()");
+
+		lstrcpy(_data.cFileName, root_folder.get_name(shell_path, SHGDN_FORPARSING));
+		_data.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
+		_shell_attribs = SFGAO_FOLDER;
+
+		ShellFolder subfolder(root_folder, shell_path);
+		IShellFolder* pFolder = subfolder;
+		pFolder->AddRef();
+		_path = pFolder;
+	}
+
+	explicit ShellDirectory(ShellDirectory* parent, LPITEMIDLIST shell_path, HWND hwnd)
+	 :	ShellEntry(parent, shell_path),
+		_folder(parent->_folder, shell_path),
+		_hwnd(hwnd)
+	{
+		/* not neccessary - the caller will fill the info
+		lstrcpy(_data.cFileName, _folder.get_name(shell_path));
+		_data.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
+		_shell_attribs = SFGAO_FOLDER; */
+
+		_folder->AddRef();
+		_path = _folder;
+	}
+
+	ShellDirectory(const ShellDirectory& other)
+	 :	ShellEntry(other),
+		Directory(other),
+		_folder(other._folder),
+		_hwnd(other._hwnd)
+	{
+		IShellFolder* pFolder = (IShellFolder*)_path;
+		pFolder->AddRef();
+	}
+
+	~ShellDirectory()
+	{
+		IShellFolder* pFolder = (IShellFolder*)_path;
+		_path = NULL;
+		pFolder->Release();
+	}
+
+	ShellEntry*	read_tree(const void* path, SORT_ORDER sortOrder);
+	void	read_directory(SORT_ORDER sortOrder, int scan_flags=0);
+	void	read_directory(int scan_flags=0);
+	void	sort_directory(SORT_ORDER sortOrder);
+	void	smart_scan(int scan_flags=0);
+	virtual const void* get_next_path_component(const void*) const;
+	virtual ShellEntry* find_entry(const void* p);
+
+	virtual bool get_path(PTSTR path) const;
+
+	int	extract_icons();
+
+	ShellFolder _folder;
+	HWND	_hwnd;
+
+protected:
+	void	fill_w32fdata_shell(LPCITEMIDLIST pidl, SFGAOF attribs, WIN32_FIND_DATA*, bool do_access=true);
+};
+
+
+inline IShellFolder* ShellEntry::get_parent_folder() const
+{
+	if (_up)
+		return static_cast<ShellDirectory*>(_up)->_folder;
+	else
+		return GetDesktopFolder();
+}
+
+
  /// root entry for file system trees
 struct Root {
 	Root();
 	~Root();
 
-	Entry*	_entry;
+	ShellDirectory*	_entry;
 	TCHAR	_path[MAX_PATH];
 	TCHAR	_volname[_MAX_FNAME];
 	TCHAR	_fs[_MAX_DIR];

Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser.cpp
--- branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser.cpp	2005-12-31 15:47:15 UTC (rev 20485)
+++ branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser.cpp	2005-12-31 15:54:25 UTC (rev 20486)
@@ -201,9 +201,9 @@
 	LPARAM itemData = TreeView_GetItemData(hwndTreeView, hItem);
 
 	if (itemData) {
-		Entry* entry = (Entry*)itemData;
+		ShellEntry* entry = (ShellEntry*)itemData;
 
-		ShellDirectory* dir = static_cast<ShellDirectory*>(entry->_up);
+		ShellDirectory* dir = entry->_up;
 		ShellFolder folder = dir? dir->_folder: GetDesktopFolder();
 		LPCITEMIDLIST pidl = static_cast<ShellEntry*>(entry)->_pidl;
 
@@ -238,7 +238,7 @@
 	}
 }
 
-int ShellBrowserChild::get_entry_image(Entry* entry, LPCITEMIDLIST pidl, int shgfi_flags, ImageMap& cache)
+int ShellBrowserChild::get_entry_image(ShellEntry* entry, LPCITEMIDLIST pidl, int shgfi_flags, ImageMap& cache)
 {
 	SHFILEINFO sfi;
 	int idx = -1;
@@ -296,7 +296,7 @@
 	}
 }
 
-int ShellBrowserChild::InsertSubitems(HTREEITEM hParentItem, Entry* entry)
+int ShellBrowserChild::InsertSubitems(HTREEITEM hParentItem, ShellDirectory* dir)
 {
 	CONTEXT("ShellBrowserChild::InsertSubitems()");
 
@@ -307,15 +307,21 @@
 	SendMessage(_left_hwnd, WM_SETREDRAW, FALSE, 0);
 
 	try {
-		entry->smart_scan();
+		dir->smart_scan();
 	} catch(COMException& e) {
 		HandleException(e, g_Globals._hMainWnd);
 	}
 
+	 // remove old children items
+	for(HTREEITEM hchild,hnext=TreeView_GetChild(_left_hwnd, hParentItem); hchild=hnext; ) {
+		hnext = TreeView_GetNextSibling(_left_hwnd, hchild);
+		TreeView_DeleteItem(_left_hwnd, hchild);
+	}
+
 	TV_ITEM tvItem;
 	TV_INSERTSTRUCT tvInsert;
 
-	for(entry=entry->_down; entry; entry=entry->_next) {
+	for(ShellEntry*entry=dir->_down; entry; entry=entry->_next) {
 #ifndef _LEFT_FILES
 		if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
 #endif
@@ -354,7 +360,7 @@
 	CONTEXT("ShellBrowserChild::OnTreeItemSelected()");
 
 	_last_sel = pnmtv->itemNew.hItem;
-	Entry* entry = (Entry*)pnmtv->itemNew.lParam;
+	ShellDirectory* entry = (ShellDirectory*)pnmtv->itemNew.lParam;
 
 	jump_to(entry);
 }
@@ -583,7 +589,7 @@
 					UINT firstOffset = pida->aoffset[1];
 					LPITEMIDLIST pidl = (LPITEMIDLIST)((LPBYTE)pida+firstOffset);
 
-					Entry* entry = parent->find_entry(pidl);
+					ShellEntry* entry = parent->find_entry(pidl);
 
 					if (entry && (entry->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
 						if (expand_folder(static_cast<ShellDirectory*>(entry)))
@@ -639,10 +645,10 @@
 
 void ShellBrowserChild::jump_to(LPCITEMIDLIST pidl)
 {
-	Entry* entry = NULL;
+	ShellDirectory* entry = NULL;
 
 	if (!_cur_dir)
-		_cur_dir = static_cast<ShellDirectory*>(_root._entry);
+		_cur_dir = _root._entry;
 
 	if (_cur_dir) {
 		static DynamicFct<LPITEMIDLIST(WINAPI*)(LPCITEMIDLIST, LPCITEMIDLIST)> ILFindChild(TEXT("SHELL32"), 24);
@@ -655,7 +661,7 @@
 
 				_cur_dir->smart_scan();
 
-				entry = _cur_dir->find_entry(child_pidl);
+				entry = static_cast<ShellDirectory*>(_cur_dir->find_entry(child_pidl));
 				if (!entry)
 					break;
 
@@ -664,7 +670,7 @@
 		} else {
 			_cur_dir->smart_scan();
 
-			entry = _cur_dir->find_entry(pidl);	// This is not correct in the common case, but works on the desktop level.
+			entry = static_cast<ShellDirectory*>(_cur_dir->find_entry(pidl));	// This is not correct in the common case, but works on the desktop level.
 
 			if (entry)
 				jump_to(entry);
@@ -676,10 +682,10 @@
 		UpdateFolderView(ShellFolder(pidl));
 }
 
-void ShellBrowserChild::jump_to(Entry* entry)
+void ShellBrowserChild::jump_to(ShellDirectory* entry)
 {
 	IShellFolder* folder;
-	ShellDirectory* se = static_cast<ShellDirectory*>(entry);
+	ShellDirectory* se = entry;
 
 	if (se->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
 		folder = static_cast<ShellDirectory*>(se)->_folder;

Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser.h
--- branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser.h	2005-12-31 15:47:15 UTC (rev 20485)
+++ branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser.h	2005-12-31 15:54:25 UTC (rev 20486)
@@ -102,8 +102,6 @@
 		return E_NOTIMPL;
 	}
 
-	const Root& get_root() const {return _root;}
-
 protected:
 	HWND	_hwnd;
 	HWND	_left_hwnd;
@@ -128,7 +126,7 @@
 
 	LRESULT	Init();
 	void	InitializeTree();
-	int		InsertSubitems(HTREEITEM hParentItem, Entry* entry);
+	int		InsertSubitems(HTREEITEM hParentItem, ShellDirectory* dir);
 	bool	InitDragDrop();
 
 	HRESULT OnDefaultCommand(LPIDA pida);
@@ -152,16 +150,16 @@
 	void	jump_to(LPCTSTR path);
 	void	jump_to(LPCITEMIDLIST pidl);
 
-	void	jump_to(Entry* entry);
+	void	jump_to(ShellDirectory* entry);
 
 protected:
 	ShellDirectory*	_cur_dir;
 	CtxMenuInterfaces& _cm_ifs;
 
-	typedef map<Entry*, int> ImageMap;
+	typedef map<ShellEntry*, int> ImageMap;
 	ImageMap _image_map;
 	ImageMap _image_map_open;
 
-	int		get_entry_image(Entry* entry, LPCITEMIDLIST pidl, int shgfi_flags, ImageMap& cache);
+	int		get_entry_image(ShellEntry* entry, LPCITEMIDLIST pidl, int shgfi_flags, ImageMap& cache);
 	void	invalidate_cache();
 };

Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/shellfs.cpp
--- branches/lean-explorer/reactos/subsys/system/explorer/shell/shellfs.cpp	2005-12-31 15:47:15 UTC (rev 20485)
+++ branches/lean-explorer/reactos/subsys/system/explorer/shell/shellfs.cpp	2005-12-31 15:54:25 UTC (rev 20486)
@@ -195,8 +195,8 @@
 
 	int level = _level + 1;
 
-	Entry* first_entry = NULL;
-	Entry* last = NULL;
+	ShellEntry* first_entry = NULL;
+	ShellEntry* last = NULL;
 
 	/*if (_folder.empty())
 		return;*/
@@ -251,7 +251,7 @@
 			fill_w32fdata_shell(pidls[n], attribs, &w32fd, !(scan_flags&SCAN_DONT_ACCESS)&&!removeable);
 
 			try {
-				Entry* entry = NULL;	// eliminate useless GCC warning by initializing entry
+				ShellEntry* entry = NULL;	// eliminate useless GCC warning by initializing entry
 
 				if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
 					entry = new ShellDirectory(this, pidls[n], _hwnd);
@@ -319,11 +319,11 @@
 	return pidl;
 }
 
-Entry* ShellDirectory::find_entry(const void* p)
+ShellEntry* ShellDirectory::find_entry(const void* p)
 {
 	LPITEMIDLIST pidl = (LPITEMIDLIST) p;
 
-	for(Entry*entry=_down; entry; entry=entry->_next) {
+	for(ShellEntry*entry=_down; entry; entry=entry->_next) {
 		ShellEntry* se = static_cast<ShellEntry*>(entry);
 
 		if (se->_pidl && se->_pidl->mkid.cb==pidl->mkid.cb && !memcmp(se->_pidl, pidl, se->_pidl->mkid.cb))
@@ -337,7 +337,7 @@
 {
 	int cnt = 0;
 
-	for(Entry*entry=_down; entry; entry=entry->_next)
+	for(ShellEntry*entry=_down; entry; entry=entry->_next)
 		if (entry->_icon_id == ICID_UNKNOWN) {
 			entry->_icon_id = entry->extract_icon();
 

Deleted: branches/lean-explorer/reactos/subsys/system/explorer/shell/shellfs.h
--- branches/lean-explorer/reactos/subsys/system/explorer/shell/shellfs.h	2005-12-31 15:47:15 UTC (rev 20485)
+++ branches/lean-explorer/reactos/subsys/system/explorer/shell/shellfs.h	2005-12-31 15:54:25 UTC (rev 20486)
@@ -1,123 +0,0 @@
-/*
- * Copyright 2003, 2004 Martin Fuchs
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
- //
- // Explorer clone, lean version
- //
- // shellfs.h
- //
- // Martin Fuchs, 23.07.2003
- //
-
-
- /// shell file/directory entry
-struct ShellEntry : public Entry
-{
-	ShellEntry(Entry* parent, LPITEMIDLIST shell_path) : Entry(parent), _pidl(shell_path) {}
-	ShellEntry(Entry* parent, const ShellPath& shell_path) : Entry(parent), _pidl(shell_path) {}
-
-	virtual bool get_path(PTSTR path) const;
-	virtual ShellPath create_absolute_pidl() const;
-	virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow=SW_SHOWNORMAL);
-	virtual HRESULT GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut);
-
-	IShellFolder* get_parent_folder() const;
-
-	ShellPath	_pidl;	// parent relative PIDL
-
-protected:
-	ShellEntry(LPITEMIDLIST shell_path) : _pidl(shell_path) {}
-	ShellEntry(const ShellPath& shell_path) : _pidl(shell_path) {}
-};
-
-
- /// shell folder entry
-struct ShellDirectory : public ShellEntry, public Directory
-{
-	ShellDirectory(ShellFolder& root_folder, const ShellPath& shell_path, HWND hwnd)
-	 :	ShellEntry(shell_path),
-		_folder(root_folder, shell_path),
-		_hwnd(hwnd)
-	{
-		CONTEXT("ShellDirectory::ShellDirectory()");
-
-		lstrcpy(_data.cFileName, root_folder.get_name(shell_path, SHGDN_FORPARSING));
-		_data.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
-		_shell_attribs = SFGAO_FOLDER;
-
-		ShellFolder subfolder(root_folder, shell_path);
-		IShellFolder* pFolder = subfolder;
-		pFolder->AddRef();
-		_path = pFolder;
-	}
-
-	explicit ShellDirectory(ShellDirectory* parent, LPITEMIDLIST shell_path, HWND hwnd)
-	 :	ShellEntry(parent, shell_path),
-		_folder(parent->_folder, shell_path),
-		_hwnd(hwnd)
-	{
-		/* not neccessary - the caller will fill the info
-		lstrcpy(_data.cFileName, _folder.get_name(shell_path));
-		_data.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
-		_shell_attribs = SFGAO_FOLDER; */
-
-		_folder->AddRef();
-		_path = _folder;
-	}
-
-	ShellDirectory(const ShellDirectory& other)
-	 :	ShellEntry(other),
-		Directory(other),
-		_folder(other._folder),
-		_hwnd(other._hwnd)
-	{
-		IShellFolder* pFolder = (IShellFolder*)_path;
-		pFolder->AddRef();
-	}
-
-	~ShellDirectory()
-	{
-		IShellFolder* pFolder = (IShellFolder*)_path;
-		_path = NULL;
-		pFolder->Release();
-	}
-
-	virtual void read_directory(int scan_flags=0);
-	virtual const void* get_next_path_component(const void*) const;
-	virtual Entry* find_entry(const void* p);
-
-	virtual bool get_path(PTSTR path) const;
-
-	int	extract_icons();
-
-	ShellFolder _folder;
-	HWND	_hwnd;
-
-protected:
-	void	fill_w32fdata_shell(LPCITEMIDLIST pidl, SFGAOF attribs, WIN32_FIND_DATA*, bool do_access=true);
-};
-
-
-inline IShellFolder* ShellEntry::get_parent_folder() const
-{
-	if (_up)
-		return static_cast<ShellDirectory*>(_up)->_folder;
-	else
-		return GetDesktopFolder();
-}

Modified: branches/lean-explorer/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp
--- branches/lean-explorer/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp	2005-12-31 15:47:15 UTC (rev 20485)
+++ branches/lean-explorer/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp	2005-12-31 15:54:25 UTC (rev 20486)
@@ -149,7 +149,7 @@
 
 	SendMessage(_hwnd, TB_INSERTBUTTON, INT_MAX, (LPARAM)&sep);
 
-	for(Entry*entry=_dir->_down; entry; entry=entry->_next) {
+	for(ShellEntry*entry=_dir->_down; entry; entry=entry->_next) {
 		 // hide files like "desktop.ini"
 		if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
 			continue;
@@ -168,7 +168,7 @@
 	SendMessage(GetParent(_hwnd), PM_RESIZE_CHILDREN, 0, 0);
 }
 
-void QuickLaunchBar::AddButton(int id, HBITMAP hbmp, LPCTSTR name, Entry* entry, int flags)
+void QuickLaunchBar::AddButton(int id, HBITMAP hbmp, LPCTSTR name, ShellEntry* entry, int flags)
 {
 	TBADDBITMAP ab = {0, (UINT_PTR)hbmp};
 	int bmp_idx = SendMessage(_hwnd, TB_ADDBITMAP, 1, (LPARAM)&ab);

Modified: branches/lean-explorer/reactos/subsys/system/explorer/taskbar/quicklaunch.h
--- branches/lean-explorer/reactos/subsys/system/explorer/taskbar/quicklaunch.h	2005-12-31 15:47:15 UTC (rev 20485)
+++ branches/lean-explorer/reactos/subsys/system/explorer/taskbar/quicklaunch.h	2005-12-31 15:54:25 UTC (rev 20486)
@@ -47,7 +47,7 @@
 
 	HBITMAP	_hbmp;
 	String	_title;
-	Entry*	_entry;
+	ShellEntry*	_entry;
 };
 
  /// map for managing the task bar buttons
@@ -80,6 +80,6 @@
 	int				_size;
 
 	void	AddShortcuts();
-	void	AddButton(int id, HBITMAP hbmp, LPCTSTR name, Entry* entry, int flags=TBSTATE_ENABLED);
+	void	AddButton(int id, HBITMAP hbmp, LPCTSTR name, ShellEntry* entry, int flags=TBSTATE_ENABLED);
 	void	UpdateDesktopButtons(int desktop_idx);
 };

Modified: branches/lean-explorer/reactos/subsys/system/explorer/taskbar/startmenu.cpp
--- branches/lean-explorer/reactos/subsys/system/explorer/taskbar/startmenu.cpp	2005-12-31 15:47:15 UTC (rev 20485)
+++ branches/lean-explorer/reactos/subsys/system/explorer/taskbar/startmenu.cpp	2005-12-31 15:54:25 UTC (rev 20486)
@@ -254,7 +254,7 @@
 		*ignore_name = '\0';
 
[truncated at 1000 lines; 90 more skipped]