Wine-20041201 vendor drop
Added: vendor/wine/dlls/shell32/
Added: vendor/wine/dlls/shell32/current/
Added: vendor/wine/dlls/shell32/current/Makefile.in
Added: vendor/wine/dlls/shell32/current/autocomplete.c
Added: vendor/wine/dlls/shell32/current/brsfolder.c
Added: vendor/wine/dlls/shell32/current/changenotify.c
Added: vendor/wine/dlls/shell32/current/classes.c
Added: vendor/wine/dlls/shell32/current/clipboard.c
Added: vendor/wine/dlls/shell32/current/control.c
Added: vendor/wine/dlls/shell32/current/cpanel.h
Added: vendor/wine/dlls/shell32/current/cpanelfolder.c
Added: vendor/wine/dlls/shell32/current/dataobject.c
Added: vendor/wine/dlls/shell32/current/debughlp.c
Added: vendor/wine/dlls/shell32/current/debughlp.h
Added: vendor/wine/dlls/shell32/current/dialogs.c
Added: vendor/wine/dlls/shell32/current/dragdrophelper.c
Added: vendor/wine/dlls/shell32/current/enumidlist.c
Added: vendor/wine/dlls/shell32/current/enumidlist.h
Added: vendor/wine/dlls/shell32/current/folders.c
Added: vendor/wine/dlls/shell32/current/iconcache.c
Added: vendor/wine/dlls/shell32/current/memorystream.c
Added: vendor/wine/dlls/shell32/current/pidl.c
Added: vendor/wine/dlls/shell32/current/pidl.h
Added: vendor/wine/dlls/shell32/current/regsvr.c
Added: vendor/wine/dlls/shell32/current/shell.c
Added: vendor/wine/dlls/shell32/current/shell.spec
Added: vendor/wine/dlls/shell32/current/shell32.spec
Added: vendor/wine/dlls/shell32/current/shell32_Ca.rc
Added: vendor/wine/dlls/shell32/current/shell32_Cn.rc
Added: vendor/wine/dlls/shell32/current/shell32_Cs.rc
Added: vendor/wine/dlls/shell32/current/shell32_Da.rc
Added: vendor/wine/dlls/shell32/current/shell32_De.rc
Added: vendor/wine/dlls/shell32/current/shell32_En.rc
Added: vendor/wine/dlls/shell32/current/shell32_Eo.rc
Added: vendor/wine/dlls/shell32/current/shell32_Es.rc
Added: vendor/wine/dlls/shell32/current/shell32_Fi.rc
Added: vendor/wine/dlls/shell32/current/shell32_Fr.rc
Added: vendor/wine/dlls/shell32/current/shell32_Hu.rc
Added: vendor/wine/dlls/shell32/current/shell32_It.rc
Added: vendor/wine/dlls/shell32/current/shell32_Ja.rc
Added: vendor/wine/dlls/shell32/current/shell32_Ko.rc
Added: vendor/wine/dlls/shell32/current/shell32_Nl.rc
Added: vendor/wine/dlls/shell32/current/shell32_No.rc
Added: vendor/wine/dlls/shell32/current/shell32_Pl.rc
Added: vendor/wine/dlls/shell32/current/shell32_Pt.rc
Added: vendor/wine/dlls/shell32/current/shell32_Ru.rc
Added: vendor/wine/dlls/shell32/current/shell32_Si.rc
Added: vendor/wine/dlls/shell32/current/shell32_Sk.rc
Added: vendor/wine/dlls/shell32/current/shell32_Sv.rc
Added: vendor/wine/dlls/shell32/current/shell32_Uk.rc
Added: vendor/wine/dlls/shell32/current/shell32_Wa.rc
Added: vendor/wine/dlls/shell32/current/shell32_Zh.rc
Added: vendor/wine/dlls/shell32/current/shell32_main.c
Added: vendor/wine/dlls/shell32/current/shell32_main.h
Added: vendor/wine/dlls/shell32/current/shell32_xx.rc
Added: vendor/wine/dlls/shell32/current/shellfolder.h
Added: vendor/wine/dlls/shell32/current/shelllink.c
Added: vendor/wine/dlls/shell32/current/shellole.c
Added: vendor/wine/dlls/shell32/current/shellord.c
Added: vendor/wine/dlls/shell32/current/shellpath.c
Added: vendor/wine/dlls/shell32/current/shellreg.c
Added: vendor/wine/dlls/shell32/current/shellstring.c
Added: vendor/wine/dlls/shell32/current/shfldr.h
Added: vendor/wine/dlls/shell32/current/shfldr_desktop.c
Added: vendor/wine/dlls/shell32/current/shfldr_fs.c
Added: vendor/wine/dlls/shell32/current/shfldr_mycomp.c
Added: vendor/wine/dlls/shell32/current/shlexec.c
Added: vendor/wine/dlls/shell32/current/shlfileop.c
Added: vendor/wine/dlls/shell32/current/shlfolder.c
Added: vendor/wine/dlls/shell32/current/shlfsbind.c
Added: vendor/wine/dlls/shell32/current/shlmenu.c
Added: vendor/wine/dlls/shell32/current/shlview.c
Added: vendor/wine/dlls/shell32/current/shpolicy.c
Added: vendor/wine/dlls/shell32/current/shres.rc
Added: vendor/wine/dlls/shell32/current/shresdef.h
Added: vendor/wine/dlls/shell32/current/shv_bg_cmenu.c
Added: vendor/wine/dlls/shell32/current/shv_item_cmenu.c
Added: vendor/wine/dlls/shell32/current/systray.c
Added: vendor/wine/dlls/shell32/current/undocshell.h
Added: vendor/wine/dlls/shell32/current/version.h
Added: vendor/wine/dlls/shell32/current/version.rc
Added: vendor/wine/dlls/shell32/current/version16.rc

Added: vendor/wine/dlls/shell32/current/Makefile.in
--- vendor/wine/dlls/shell32/current/Makefile.in	2004-12-31 15:52:05 UTC (rev 12595)
+++ vendor/wine/dlls/shell32/current/Makefile.in	2004-12-31 15:56:15 UTC (rev 12596)
@@ -0,0 +1,92 @@
+EXTRADEFS = -D_SHELL32_ -DCOM_NO_WINDOWS_H
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = shell32.dll
+IMPORTS   = shlwapi comctl32 user32 gdi32 advapi32 kernel32
+DELAYIMPORTS = ole32
+EXTRALIBS = -luuid $(LIBUNICODE)
+
+C_SRCS = \
+	authors.c \
+	autocomplete.c \
+	brsfolder.c \
+	changenotify.c \
+	classes.c \
+	clipboard.c \
+	control.c \
+	cpanelfolder.c \
+	dataobject.c \
+	debughlp.c \
+	dialogs.c \
+	dragdrophelper.c \
+	enumidlist.c \
+	folders.c \
+	iconcache.c \
+	memorystream.c \
+	pidl.c \
+	regsvr.c \
+	shell32_main.c \
+	shelllink.c \
+	shellole.c \
+	shellord.c \
+	shellpath.c \
+	shellreg.c \
+	shellstring.c \
+	shfldr_desktop.c \
+	shfldr_fs.c \
+	shfldr_mycomp.c \
+	shlexec.c \
+	shlfileop.c \
+	shlfolder.c \
+	shlfsbind.c \
+	shlmenu.c \
+	shlview.c \
+	shpolicy.c \
+	shv_bg_cmenu.c \
+	shv_item_cmenu.c \
+	systray.c
+
+RC_SRCS = shres.rc
+RC_BINSRC = shres.rc
+RC_BINARIES = \
+	cdrom.ico \
+	desktop.ico \
+	document.ico \
+	drive.ico \
+	floppy.ico \
+	folder.ico \
+	folder_open.ico \
+	mycomputer.ico \
+	netdrive.ico \
+	netdrive2.ico \
+	ramdisk.ico
+
+C_SRCS16  = shell.c
+RC_SRCS16 = version16.rc
+SPEC_SRCS16 = shell.spec
+
+SUBDIRS = tests
+
+@MAKE_DLL_RULES@
+
+# Special rules for 16-bit resource files
+
+version16.res: version16.rc
+	$(LDPATH) $(RC16) $(RC16FLAGS) -fo$@ $(SRCDIR)/version16.rc
+
+shell.spec.c: shell.spec version16.res
+	$(WINEBUILD) $(DEFS) $(DLLFLAGS) -o $@ --main-module $(MODULE) --res version16.res --dll $(SRCDIR)/shell.spec
+
+authors.c: $(TOPSRCDIR)/AUTHORS
+	(LC_ALL=C; export LC_ALL; echo 'const char * const SHELL_Authors[] = {' && \
+	 sed -e '1,2d' -e 's/\(.*\)/  \"\1\",/' $(TOPSRCDIR)/AUTHORS && \
+	 echo '  0 };') >$@ || ($(RM) $@ && false)
+
+depend: authors.c
+
+clean::
+	$(RM) authors.c
+
+### Dependencies:

Added: vendor/wine/dlls/shell32/current/autocomplete.c
--- vendor/wine/dlls/shell32/current/autocomplete.c	2004-12-31 15:52:05 UTC (rev 12595)
+++ vendor/wine/dlls/shell32/current/autocomplete.c	2004-12-31 15:56:15 UTC (rev 12596)
@@ -0,0 +1,646 @@
+/*
+ *	AutoComplete interfaces implementation.
+ *
+ *	Copyright 2004	Maxime Bellengé <maxime.bellenge@laposte.net>
+ *
+ * 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
+ */
+
+/*
+  Implemented:
+  - ACO_AUTOAPPEND style
+  - ACO_AUTOSUGGEST style
+  - ACO_UPDOWNKEYDROPSLIST style
+
+  - Handle pwzsRegKeyPath and pwszQuickComplete in Init
+
+  TODO:
+  - implement ACO_SEARCH style
+  - implement ACO_FILTERPREFIXES style
+  - implement ACO_USETAB style
+  - implement ACO_RTLREADING style
+  
+ */
+#include "config.h"
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define COBJMACROS
+
+#include "wine/debug.h"
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "undocshell.h"
+#include "shlwapi.h"
+#include "winerror.h"
+#include "objbase.h"
+
+#include "pidl.h"
+#include "shlguid.h"
+#include "shlobj.h"
+#include "shldisp.h"
+#include "debughlp.h"
+
+#include "wine/unicode.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(shell);
+
+typedef struct
+{
+    IAutoCompleteVtbl  *lpVtbl;
+    IAutoComplete2Vtbl *lpvtblAutoComplete2;
+    DWORD ref;
+    BOOL  enabled;
+    HWND hwndEdit;
+    HWND hwndListBox;
+    WNDPROC wpOrigEditProc;
+    WNDPROC wpOrigLBoxProc;
+    WCHAR *txtbackup;
+    WCHAR *quickComplete;
+    IEnumString *enumstr;
+    AUTOCOMPLETEOPTIONS options;
+} IAutoCompleteImpl;
+
+static struct IAutoCompleteVtbl acvt;
+static struct IAutoComplete2Vtbl ac2vt;
+
+#define _IAutoComplete2_Offset ((int)(&(((IAutoCompleteImpl*)0)->lpvtblAutoComplete2)))
+#define _ICOM_THIS_From_IAutoComplete2(class, name) class* This = (class*)(((char*)name)-_IAutoComplete2_Offset);
+
+/*
+  converts This to a interface pointer
+*/
+#define _IUnknown_(This) (IUnknown*)&(This->lpVtbl)
+#define _IAutoComplete2_(This)  (IAutoComplete2*)&(This->lpvtblAutoComplete2) 
+
+static LRESULT APIENTRY ACEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+static LRESULT APIENTRY ACLBoxSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+/**************************************************************************
+ *  IAutoComplete_Constructor
+ */
+HRESULT WINAPI IAutoComplete_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv)
+{
+    IAutoCompleteImpl *lpac;
+
+    if (pUnkOuter && !IsEqualIID (riid, &IID_IUnknown))
+	return CLASS_E_NOAGGREGATION;
+
+    lpac = (IAutoCompleteImpl*)HeapAlloc(GetProcessHeap(),
+      HEAP_ZERO_MEMORY, sizeof(IAutoCompleteImpl));
+    if (!lpac) 
+	return E_OUTOFMEMORY;
+
+    lpac->ref = 1;
+    lpac->lpVtbl = &acvt;
+    lpac->lpvtblAutoComplete2 = &ac2vt;
+    lpac->enabled = TRUE;
+    lpac->enumstr = NULL;
+    lpac->options = ACO_AUTOAPPEND;
+    lpac->wpOrigEditProc = NULL;
+    lpac->hwndListBox = NULL;
+    lpac->txtbackup = NULL;
+    lpac->quickComplete = NULL;
+    
+    if (!SUCCEEDED (IUnknown_QueryInterface (_IUnknown_ (lpac), riid, ppv))) {
+	IUnknown_Release (_IUnknown_ (lpac));
+	return E_NOINTERFACE;
+    }
+    
+    TRACE("-- (%p)->\n",lpac);
+
+    return S_OK;
+}
+
+/**************************************************************************
+ *  AutoComplete_QueryInterface
+ */
+static HRESULT WINAPI IAutoComplete_fnQueryInterface(
+    IAutoComplete * iface,
+    REFIID riid,
+    LPVOID *ppvObj)
+{
+    IAutoCompleteImpl *This = (IAutoCompleteImpl *)iface;
+    
+    TRACE("(%p)->(\n\tIID:\t%s,%p)\n", This, shdebugstr_guid(riid), ppvObj);
+    *ppvObj = NULL;
+
+    if(IsEqualIID(riid, &IID_IUnknown)) 
+    {
+	*ppvObj = This;
+    } 
+    else if(IsEqualIID(riid, &IID_IAutoComplete))
+    {
+	*ppvObj = (IAutoComplete*)This;
+    }
+    else if(IsEqualIID(riid, &IID_IAutoComplete2))
+    {
+	*ppvObj = _IAutoComplete2_ (This);
+    }
+
+    if (*ppvObj)
+    {
+	IAutoComplete_AddRef((IAutoComplete*)*ppvObj);
+	TRACE("-- Interface: (%p)->(%p)\n", ppvObj, *ppvObj);
+	return S_OK;
+    }
+    TRACE("-- Interface: E_NOINTERFACE\n");
+    return E_NOINTERFACE;	
+}
+
+/******************************************************************************
+ * IAutoComplete_fnAddRef
+ */
+static ULONG WINAPI IAutoComplete_fnAddRef(
+	IAutoComplete * iface)
+{
+    IAutoCompleteImpl *This = (IAutoCompleteImpl *)iface;
+    
+    TRACE("(%p)->(%lu)\n",This,This->ref);
+    return ++(This->ref);
+}
+
+/******************************************************************************
+ * IAutoComplete_fnRelease
+ */
+static ULONG WINAPI IAutoComplete_fnRelease(
+	IAutoComplete * iface)
+{
+    IAutoCompleteImpl *This = (IAutoCompleteImpl *)iface;
+    
+    TRACE("(%p)->(%lu)\n",This,This->ref);
+
+    if (!--(This->ref)) {
+	TRACE(" destroying IAutoComplete(%p)\n",This);
+	if (This->quickComplete)
+	    HeapFree(GetProcessHeap(), 0, This->quickComplete);
+	if (This->txtbackup)
+	    HeapFree(GetProcessHeap(), 0, This->txtbackup);
+	if (This->hwndListBox)
+	    DestroyWindow(This->hwndListBox);
+	if (This->enumstr)
+	    IEnumString_Release(This->enumstr);
+	HeapFree(GetProcessHeap(), 0, This);
+	return 0;
+    }
+    return This->ref;
+}
+
+/******************************************************************************
+ * IAutoComplete_fnEnable
+ */
+static HRESULT WINAPI IAutoComplete_fnEnable(
+    IAutoComplete * iface,
+    BOOL fEnable)
+{
+    IAutoCompleteImpl *This = (IAutoCompleteImpl *)iface;
+
+    HRESULT hr = S_OK;
+
+    TRACE("(%p)->(%s)\n", This, (fEnable)?"true":"false");
+
+    This->enabled = fEnable;
+
+    return hr;
+}
+
+/******************************************************************************
+ * IAutoComplete_fnInit
+ */
+static HRESULT WINAPI IAutoComplete_fnInit(
+    IAutoComplete * iface,
+    HWND hwndEdit,
+    IUnknown *punkACL,
+    LPCOLESTR pwzsRegKeyPath,
+    LPCOLESTR pwszQuickComplete)
+{
+    IAutoCompleteImpl *This = (IAutoCompleteImpl *)iface;
+    static const WCHAR lbName[] = {'L','i','s','t','B','o','x',0};
+
+    TRACE("(%p)->(0x%08lx, %p, %s, %s)\n", 
+	  This, (long)hwndEdit, punkACL, debugstr_w(pwzsRegKeyPath), debugstr_w(pwszQuickComplete));
+
+    if (This->options & ACO_AUTOSUGGEST) TRACE(" ACO_AUTOSUGGEST\n");
+    if (This->options & ACO_AUTOAPPEND) TRACE(" ACO_AUTOAPPEND\n");
+    if (This->options & ACO_SEARCH) FIXME(" ACO_SEARCH not supported\n");
+    if (This->options & ACO_FILTERPREFIXES) FIXME(" ACO_FILTERPREFIXES not supported\n");
+    if (This->options & ACO_USETAB) FIXME(" ACO_USETAB not supported\n");
+    if (This->options & ACO_UPDOWNKEYDROPSLIST) TRACE(" ACO_UPDOWNKEYDROPSLIST\n");
+    if (This->options & ACO_RTLREADING) FIXME(" ACO_RTLREADING not supported\n");
+
+    This->hwndEdit = hwndEdit;
+
+    if (!SUCCEEDED (IUnknown_QueryInterface (punkACL, &IID_IEnumString, (LPVOID*)&This->enumstr))) {
+	TRACE("No IEnumString interface\n");
+	return  E_NOINTERFACE;
+    }
+
+    This->wpOrigEditProc = (WNDPROC) SetWindowLongPtrW( hwndEdit, GWLP_WNDPROC, (LONG_PTR) ACEditSubclassProc);
+    SetWindowLongPtrW( hwndEdit, GWLP_USERDATA, (LONG_PTR)This);
+
+    if (This->options & ACO_AUTOSUGGEST) {
+	HWND hwndParent;
+
+	hwndParent = GetParent(This->hwndEdit);
+	
+	/* FIXME : The listbox should be resizable with the mouse. WS_THICKFRAME looks ugly */
+	This->hwndListBox = CreateWindowExW(0, lbName, NULL, 
+					    WS_BORDER | WS_CHILD | WS_VSCROLL | LBS_HASSTRINGS | LBS_NOTIFY | LBS_NOINTEGRALHEIGHT, 
+					    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
+					    hwndParent, NULL, 
+					    (HINSTANCE)GetWindowLongPtrW( hwndParent, GWLP_HINSTANCE ), NULL);
+					    
+	if (This->hwndListBox) {
+	    This->wpOrigLBoxProc = (WNDPROC) SetWindowLongPtrW( This->hwndListBox, GWLP_WNDPROC, (LONG_PTR) ACLBoxSubclassProc);
+	    SetWindowLongPtrW( This->hwndListBox, GWLP_USERDATA, (LONG_PTR)This);
+	}
+    }
+
+    if (pwzsRegKeyPath) {
+	WCHAR *key;
+	WCHAR result[MAX_PATH];
+	WCHAR *value;
+	HKEY hKey = 0;
+	LONG res;
+	LONG len;
+
+	/* pwszRegKeyPath contains the key as well as the value, so we split */
+	key = (WCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (lstrlenW(pwzsRegKeyPath)+1)*sizeof(WCHAR));
+	strcpyW(key, pwzsRegKeyPath);
+	value = strrchrW(key, '\\');
+	*value = 0;
+	value++;
+	/* Now value contains the value and buffer the key */
+	res = RegOpenKeyExW(HKEY_CURRENT_USER, key, 0, KEY_READ, &hKey);
+	if (res != ERROR_SUCCESS) {
+	    /* if the key is not found, MSDN states we must seek in HKEY_LOCAL_MACHINE */
+	    res = RegOpenKeyExW(HKEY_LOCAL_MACHINE, key, 0, KEY_READ, &hKey);  
+	}
+	if (res == ERROR_SUCCESS) {
+	    res = RegQueryValueW(hKey, value, result, &len);
+	    if (res == ERROR_SUCCESS) {
+		This->quickComplete = (WCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len*sizeof(WCHAR));
+		strcpyW(This->quickComplete, result);
+	    }
+	    RegCloseKey(hKey);
+	}
+	HeapFree(GetProcessHeap(), 0, key);
+    }
+
+    if ((pwszQuickComplete) && (!This->quickComplete)) {
+	This->quickComplete = (WCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (lstrlenW(pwszQuickComplete)+1)*sizeof(WCHAR));
+	lstrcpyW(This->quickComplete, pwszQuickComplete);
+    }
+
+    return S_OK;
+}
+
+/**************************************************************************
+ *  IAutoComplete_fnVTable
+ */
+static IAutoCompleteVtbl acvt =
+{
+    IAutoComplete_fnQueryInterface,
+    IAutoComplete_fnAddRef,
+    IAutoComplete_fnRelease,
+    IAutoComplete_fnInit,
+    IAutoComplete_fnEnable,
+};
+
+/**************************************************************************
+ *  AutoComplete2_QueryInterface
+ */
+static HRESULT WINAPI IAutoComplete2_fnQueryInterface(
+    IAutoComplete2 * iface,
+    REFIID riid,
+    LPVOID *ppvObj)
+{
+    _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl, iface);
+
+    TRACE ("(%p)->(%s,%p)\n", This, shdebugstr_guid (riid), ppvObj);
+
+    return IAutoComplete_QueryInterface((IAutoComplete*)This, riid, ppvObj);
+}
+
+/******************************************************************************
+ * IAutoComplete2_fnAddRef
+ */
+static ULONG WINAPI IAutoComplete2_fnAddRef(
+	IAutoComplete2 * iface)
+{
+    _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl,iface);
+
+    TRACE ("(%p)->(count=%lu)\n", This, This->ref);
+
+    return IAutoComplete2_AddRef((IAutoComplete*)This);
+}
+
+/******************************************************************************
+ * IAutoComplete2_fnRelease
+ */
+static ULONG WINAPI IAutoComplete2_fnRelease(
+	IAutoComplete2 * iface)
+{
+    _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl,iface);
+
+    TRACE ("(%p)->(count=%lu)\n", This, This->ref);
+
+    return IAutoComplete_Release((IAutoComplete*)This);
+}
+
+/******************************************************************************
+ * IAutoComplete2_fnEnable
+ */
+static HRESULT WINAPI IAutoComplete2_fnEnable(
+    IAutoComplete2 * iface,
+    BOOL fEnable)
+{
+    _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl, iface);
+
+    TRACE ("(%p)->(%s)\n", This, (fEnable)?"true":"false");
+
+    return IAutoComplete_Enable((IAutoComplete*)This, fEnable);
+}
+
+/******************************************************************************
+ * IAutoComplete2_fnInit
+ */
+static HRESULT WINAPI IAutoComplete2_fnInit(
+    IAutoComplete2 * iface,
+    HWND hwndEdit,
+    IUnknown *punkACL,
+    LPCOLESTR pwzsRegKeyPath,
+    LPCOLESTR pwszQuickComplete)
+{
+    _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl, iface);
+
+    TRACE("(%p)\n", This);
+
+    return IAutoComplete_Init((IAutoComplete*)This, hwndEdit, punkACL, pwzsRegKeyPath, pwszQuickComplete);
+}
+
+/**************************************************************************
+ *  IAutoComplete_fnGetOptions
+ */
+static HRESULT WINAPI IAutoComplete2_fnGetOptions(
+    IAutoComplete2 * iface,
+    DWORD *pdwFlag)
+{
+    HRESULT hr = S_OK;
+
+    _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl, iface);
+
+    TRACE("(%p) -> (%p)\n", This, pdwFlag);
+
+    *pdwFlag = This->options;
+
+    return hr;
+}
+
+/**************************************************************************
+ *  IAutoComplete_fnSetOptions
+ */
+static HRESULT WINAPI IAutoComplete2_fnSetOptions(
+    IAutoComplete2 * iface,
+    DWORD dwFlag)
+{
+    HRESULT hr = S_OK;
+
+    _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl, iface);
+
+    TRACE("(%p) -> (0x%lx)\n", This, dwFlag);
+
+    This->options = dwFlag;
+
+    return hr;
+}
+
+/**************************************************************************
+ *  IAutoComplete2_fnVTable
+ */
+static IAutoComplete2Vtbl ac2vt =
+{
+    IAutoComplete2_fnQueryInterface,
+    IAutoComplete2_fnAddRef,
+    IAutoComplete2_fnRelease,
+    IAutoComplete2_fnInit,
+    IAutoComplete2_fnEnable,
+    /* IAutoComplete2 */
+    IAutoComplete2_fnSetOptions,
+    IAutoComplete2_fnGetOptions,
+};
+
+/*
+  Window procedure for autocompletion
+ */
+static LRESULT APIENTRY ACEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+    IAutoCompleteImpl *This = (IAutoCompleteImpl *)GetWindowLongPtrW(hwnd, GWLP_USERDATA);
+    LPOLESTR strs;
+    HRESULT hr;
+    WCHAR hwndText[255];
+    WCHAR *hwndQCText;
+    RECT r;
+    BOOL control, filled, displayall = FALSE;
+    int cpt, height, sel;
+
+    if (!This->enabled) return CallWindowProcW(This->wpOrigEditProc, hwnd, uMsg, wParam, lParam);
+
+    switch (uMsg)
+    {
+	case CB_SHOWDROPDOWN:
+	    ShowWindow(This->hwndListBox, SW_HIDE);
+	    break;
+	case WM_KILLFOCUS:
+	    if ((This->options && ACO_AUTOSUGGEST) && 
+		((HWND)wParam != This->hwndListBox))
+	    {
+		ShowWindow(This->hwndListBox, SW_HIDE);
+	    }
+	    break;
+	case WM_KEYUP:
+	    
+	    GetWindowTextW( hwnd, (LPWSTR)hwndText, 255);
+      
+	    switch(wParam) {
+		case VK_RETURN:
+		    /* If quickComplete is set and control is pressed, replace the string */
+		    control = GetKeyState(VK_CONTROL) & 0x8000;		    
+		    if (control && This->quickComplete) {
+			hwndQCText = (WCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 
+						       (lstrlenW(This->quickComplete)+lstrlenW(hwndText))*sizeof(WCHAR));
+			sel = sprintfW(hwndQCText, This->quickComplete, hwndText);
+			SendMessageW(hwnd, WM_SETTEXT, 0, (LPARAM)hwndQCText);
+			SendMessageW(hwnd, EM_SETSEL, 0, sel);
+			HeapFree(GetProcessHeap(), 0, hwndQCText);
+		    }
+
+		    ShowWindow(This->hwndListBox, SW_HIDE);
+		    return 0;
+		case VK_LEFT:
+		case VK_RIGHT:
+		    return 0;
+		case VK_UP:	      
+		case VK_DOWN:
+		    /* Two cases here : 
+		       - if the listbox is not visible, displays it 
+		       with all the entries if the style ACO_UPDOWNKEYDROPSLIST
+		       is present but does not select anything.
+		       - if the listbox is visible, change the selection
+		    */
+		    if ( (This->options & (ACO_AUTOSUGGEST | ACO_UPDOWNKEYDROPSLIST)) 
+			 && (!IsWindowVisible(This->hwndListBox) && (! *hwndText)) )
+		    {
+			 /* We must dispays all the entries */
+			 displayall = TRUE;
+		    } else {
+			if (IsWindowVisible(This->hwndListBox)) {
+			    int count;
+
+			    count = SendMessageW(This->hwndListBox, LB_GETCOUNT, 0, 0);
+			    /* Change the selection */
+			    sel = SendMessageW(This->hwndListBox, LB_GETCURSEL, 0, 0);
+			    if (wParam == VK_UP)
+				sel = ((sel-1)<0)?count-1:sel-1;
+			    else
+				sel = ((sel+1)>= count)?-1:sel+1;
+			    SendMessageW(This->hwndListBox, LB_SETCURSEL, sel, 0);
+			    if (sel != -1) {
+				WCHAR *msg;
+				int len;
+				
+				len = SendMessageW(This->hwndListBox, LB_GETTEXTLEN, sel, (LPARAM)NULL);
+				msg = (WCHAR*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (len+1)*sizeof(WCHAR));
+				SendMessageW(This->hwndListBox, LB_GETTEXT, sel, (LPARAM)msg);
+				SendMessageW(hwnd, WM_SETTEXT, 0, (LPARAM)msg);
+				SendMessageW(hwnd, EM_SETSEL, lstrlenW(msg), lstrlenW(msg));
+				HeapFree(GetProcessHeap(), 0, msg);
+			    } else {
+				SendMessageW(hwnd, WM_SETTEXT, 0, (LPARAM)This->txtbackup);
+				SendMessageW(hwnd, EM_SETSEL, lstrlenW(This->txtbackup), lstrlenW(This->txtbackup));
+			    }			
+			} 		
+			return 0;
+		    }
+		    break;
+		case VK_BACK:
+		case VK_DELETE:
+		    if ((! *hwndText) && (This->options & ACO_AUTOSUGGEST)) {
+			ShowWindow(This->hwndListBox, SW_HIDE);
+			return CallWindowProcW(This->wpOrigEditProc, hwnd, uMsg, wParam, lParam);
+		    }
+		    if (This->options & ACO_AUTOAPPEND) {
+			DWORD b;
+			SendMessageW(hwnd, EM_GETSEL, (WPARAM)&b, (LPARAM)NULL);
+			if (b>1) {
+			    hwndText[b-1] = '\0';
+			} else {
+			    hwndText[0] = '\0';
+			    SetWindowTextW(hwnd, hwndText); 
+			}			
+		    }
+		    break;
+		default:		    
+		    ;
+	    }
+      
+	    SendMessageW(This->hwndListBox, LB_RESETCONTENT, 0, 0);
+
+	    HeapFree(GetProcessHeap(), 0, This->txtbackup);
+	    This->txtbackup = (WCHAR*) HeapAlloc(GetProcessHeap(),
+						 HEAP_ZERO_MEMORY, (lstrlenW(hwndText)+1)*sizeof(WCHAR));							      
+	    lstrcpyW(This->txtbackup, hwndText);
+
+	    /* Returns if there is no text to search and we doesn't want to display all the entries */
+	    if ((!displayall) && (! *hwndText) )
+		break;
+	    
+	    IEnumString_Reset(This->enumstr);
+	    filled = FALSE;
+	    for(cpt = 0;;) {
+		hr = IEnumString_Next(This->enumstr, 1, &strs, NULL);
+		if (hr != S_OK)
+		    break;
+
+		if ((LPWSTR)strstrW(strs, hwndText) == strs) {
+		    
+		    if (This->options & ACO_AUTOAPPEND) {
+			SetWindowTextW(hwnd, strs);
+			SendMessageW(hwnd, EM_SETSEL, lstrlenW(hwndText), lstrlenW(strs));
+			break;
+		    }		
+
+		    if (This->options & ACO_AUTOSUGGEST) {
+			SendMessageW(This->hwndListBox, LB_ADDSTRING, 0, (LPARAM)strs);
+			filled = TRUE;
+			cpt++;
+		    }
+		}		
+	    }
+	    
+	    if (This->options & ACO_AUTOSUGGEST) {
+		if (filled) {
+		    height = SendMessageW(This->hwndListBox, LB_GETITEMHEIGHT, 0, 0);
+		    SendMessageW(This->hwndListBox, LB_CARETOFF, 0, 0);
+		    GetWindowRect(hwnd, &r);
+		    SetParent(This->hwndListBox, HWND_DESKTOP);
+		    /* It seems that Windows XP displays 7 lines at most 
+		       and otherwise displays a vertical scroll bar */
+		    SetWindowPos(This->hwndListBox, HWND_TOP, 
+				 r.left, r.bottom + 1, r.right - r.left, min(height * 7, height*(cpt+1)), 
+				 SWP_SHOWWINDOW );
+		} else {
+		    ShowWindow(This->hwndListBox, SW_HIDE);
+		}
+	    }
+	    
+	    break; 
+	default:
+	    return CallWindowProcW(This->wpOrigEditProc, hwnd, uMsg, wParam, lParam);
+	    
+    }
+
+    return 0;
+}
+
+static LRESULT APIENTRY ACLBoxSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+    IAutoCompleteImpl *This = (IAutoCompleteImpl *)GetWindowLongPtrW(hwnd, GWLP_USERDATA);
+    WCHAR *msg;
+    int sel = -1, len;
+
+    switch (uMsg) {
+	case WM_MOUSEMOVE:
+	    sel = SendMessageW(hwnd, LB_ITEMFROMPOINT, 0, lParam);
+	    SendMessageW(hwnd, LB_SETCURSEL, (WPARAM)sel, (LPARAM)0);
+	    break;
+	case WM_LBUTTONDOWN:
+	    len = SendMessageW(This->hwndListBox, LB_GETTEXTLEN, sel, (LPARAM)NULL);
+	    msg = (WCHAR*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (len+1)*sizeof(WCHAR));
+	    sel = (INT)SendMessageW(hwnd, LB_GETCURSEL, 0, 0);
+	    SendMessageW(hwnd, LB_GETTEXT, sel, (LPARAM)msg);
+	    SendMessageW(This->hwndEdit, WM_SETTEXT, 0, (LPARAM)msg);
+	    SendMessageW(This->hwndEdit, EM_SETSEL, 0, lstrlenW(msg));
+	    ShowWindow(hwnd, SW_HIDE);
+	    HeapFree(GetProcessHeap(), 0, msg);
+	    break;
+	default:
+	    return CallWindowProcW(This->wpOrigLBoxProc, hwnd, uMsg, wParam, lParam);
+    }
+    return 0;
+}

Added: vendor/wine/dlls/shell32/current/brsfolder.c
--- vendor/wine/dlls/shell32/current/brsfolder.c	2004-12-31 15:52:05 UTC (rev 12595)
+++ vendor/wine/dlls/shell32/current/brsfolder.c	2004-12-31 15:56:15 UTC (rev 12596)
@@ -0,0 +1,517 @@
+/*
+ * Copyright 1999 Juergen Schmied
+ *
+ * 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
+ *
+ * FIXME:
+ *  - many memory leaks
+ *  - many flags unimplemented
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#define COBJMACROS
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+
+#include "wine/debug.h"
+#include "undocshell.h"
+#include "shlguid.h"
+#include "pidl.h"
+#include "shell32_main.h"
+#include "shellapi.h"
+#include "shresdef.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(shell);
+
+static HWND		hwndTreeView;
+static LPBROWSEINFOW	lpBrowseInfo;
+static LPITEMIDLIST	pidlRet;
+
+static void FillTreeView(LPSHELLFOLDER lpsf, LPITEMIDLIST  lpifq, HTREEITEM hParent, IEnumIDList* lpe);
+static HTREEITEM InsertTreeViewItem(IShellFolder * lpsf, LPCITEMIDLIST pidl, LPCITEMIDLIST pidlParent, IEnumIDList* pEnumIL, HTREEITEM hParent);
+
+#define SUPPORTEDFLAGS (BIF_STATUSTEXT | \
+                        BIF_BROWSEFORCOMPUTER | \
+                        BIF_RETURNFSANCESTORS | \
+                        BIF_RETURNONLYFSDIRS | \
+                        BIF_BROWSEINCLUDEFILES)
+
+static inline DWORD BrowseFlagsToSHCONTF(UINT ulFlags)
+{
+    return SHCONTF_FOLDERS | (ulFlags & BIF_BROWSEINCLUDEFILES ? SHCONTF_NONFOLDERS : 0);
+}
+
+static void InitializeTreeView(HWND hwndParent, LPCITEMIDLIST root)
+{
+	HIMAGELIST	hImageList;
+	IShellFolder *	lpsf;
+	HRESULT	hr;
+	IEnumIDList * pEnumIL = NULL;
+	LPITEMIDLIST parentofroot;
+	parentofroot = ILClone(root);
+	ILRemoveLastID(parentofroot);
+
+	hwndTreeView = GetDlgItem (hwndParent, IDD_TREEVIEW);
+	Shell_GetImageList(NULL, &hImageList);
+
+	TRACE("dlg=%p tree=%p\n", hwndParent, hwndTreeView );
+
+	if (hImageList && hwndTreeView)
+	  TreeView_SetImageList(hwndTreeView, hImageList, 0);
+
+	if (_ILIsDesktop (root)) {
+	   hr = SHGetDesktopFolder(&lpsf);
+	} else {
+	   IShellFolder *	lpsfdesktop;
+
+	   hr = SHGetDesktopFolder(&lpsfdesktop);
+	   if (SUCCEEDED(hr)) {
+	      hr = IShellFolder_BindToObject(lpsfdesktop, parentofroot, 0,(REFIID)&IID_IShellFolder,(LPVOID *)&lpsf);
+	      IShellFolder_Release(lpsfdesktop);
+	   }
+	}
+	if (SUCCEEDED(hr))
+	{
+	    IShellFolder * pSFRoot;
+	    if (_ILIsPidlSimple(root))
+	    {
+	        pSFRoot = lpsf;
+	        IShellFolder_AddRef(pSFRoot);
+	    }
+	    else
+	        hr = IShellFolder_BindToObject(lpsf,ILFindLastID(root),0,&IID_IShellFolder,(LPVOID *)&pSFRoot);
+	    if (SUCCEEDED(hr))
+	    {
+	        hr = IShellFolder_EnumObjects(
+	            pSFRoot,
+	            hwndParent,
+	            BrowseFlagsToSHCONTF(lpBrowseInfo->ulFlags),
+	            &pEnumIL);
+	        IShellFolder_Release(pSFRoot);
+	    }
+	}
+
+	if (SUCCEEDED(hr) && hwndTreeView)
+	{
+	  TreeView_DeleteAllItems(hwndTreeView);
+	  TreeView_Expand(hwndTreeView,
+	                  InsertTreeViewItem(lpsf, _ILIsPidlSimple(root) ? root : ILFindLastID(root), parentofroot, pEnumIL,  TVI_ROOT),
+	                  TVE_EXPAND);
+	}
+
+	if (SUCCEEDED(hr))
+	  IShellFolder_Release(lpsf);
+
+	TRACE("done\n");
+}
+
+static int GetIcon(LPITEMIDLIST lpi, UINT uFlags)
+{
+	SHFILEINFOW    sfi;
+	SHGetFileInfoW((LPCWSTR)lpi, 0 ,&sfi, sizeof(SHFILEINFOW), uFlags);
+	return sfi.iIcon;
+}
+
+static void GetNormalAndSelectedIcons(LPITEMIDLIST lpifq, LPTVITEMW lpTV_ITEM)
+{
+	LPITEMIDLIST pidlDesktop = NULL;
+
+	TRACE("%p %p\n",lpifq, lpTV_ITEM);
+
+	if (!lpifq)
+	{
+	    pidlDesktop = _ILCreateDesktop();
+	    lpifq = pidlDesktop;
+	}
+
+	lpTV_ITEM->iImage = GetIcon(lpifq, SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
+	lpTV_ITEM->iSelectedImage = GetIcon(lpifq, SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_OPENICON);
+
+	if (pidlDesktop)
+	    ILFree(pidlDesktop);
+
+	return;
+}
+
+typedef struct tagID
+{
+   LPSHELLFOLDER lpsfParent;
+   LPITEMIDLIST  lpi;
+   LPITEMIDLIST  lpifq;
+   IEnumIDList*  pEnumIL;
+} TV_ITEMDATA, *LPTV_ITEMDATA;
+
+static BOOL GetName(LPSHELLFOLDER lpsf, LPCITEMIDLIST lpi, DWORD dwFlags, LPWSTR lpFriendlyName)
+{
+	BOOL   bSuccess=TRUE;
+	STRRET str;
+
+	TRACE("%p %p %lx %p\n", lpsf, lpi, dwFlags, lpFriendlyName);
+	if (SUCCEEDED(IShellFolder_GetDisplayNameOf(lpsf, lpi, dwFlags, &str)))
+	{
+	  if (FAILED(StrRetToStrNW(lpFriendlyName, MAX_PATH, &str, lpi)))
+	  {
+	      bSuccess = FALSE;
+	  }
+	}
+	else
+	  bSuccess = FALSE;
+
+	TRACE("-- %s\n", debugstr_w(lpFriendlyName));
+	return bSuccess;
+}
+
+static HTREEITEM InsertTreeViewItem(IShellFolder * lpsf, LPCITEMIDLIST pidl, LPCITEMIDLIST pidlParent, IEnumIDList* pEnumIL, HTREEITEM hParent)
+{
+	TVITEMW 	tvi;
+	TVINSERTSTRUCTW	tvins;
+	WCHAR		szBuff[MAX_PATH];
+	LPTV_ITEMDATA	lptvid=0;
+
+	tvi.mask  = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
+
+	tvi.cChildren= pEnumIL ? 1 : 0;
+	tvi.mask |= TVIF_CHILDREN;
+
+	if (!(lptvid = (LPTV_ITEMDATA)SHAlloc(sizeof(TV_ITEMDATA))))
+	    return NULL;
+
+	if (!GetName(lpsf, pidl, SHGDN_NORMAL, szBuff))
+	    return NULL;
+
+	tvi.pszText    = szBuff;
+	tvi.cchTextMax = MAX_PATH;
+	tvi.lParam = (LPARAM)lptvid;
+
+	IShellFolder_AddRef(lpsf);
+	lptvid->lpsfParent = lpsf;
+	lptvid->lpi	= ILClone(pidl);
+	lptvid->lpifq	= pidlParent ? ILCombine(pidlParent, pidl) : ILClone(pidl);
+	lptvid->pEnumIL = pEnumIL;
+	GetNormalAndSelectedIcons(lptvid->lpifq, &tvi);
+
+	tvins.u.item       = tvi;
+	tvins.hInsertAfter = NULL;
+	tvins.hParent      = hParent;
+
+	return (HTREEITEM)TreeView_InsertItemW(hwndTreeView, &tvins);
+}
+
+static void FillTreeView(IShellFolder * lpsf, LPITEMIDLIST  pidl, HTREEITEM hParent, IEnumIDList* lpe)
+{
+	HTREEITEM	hPrev = 0;
+	LPITEMIDLIST	pidlTemp = 0;
+	ULONG		ulFetched;
+	HRESULT		hr;
+	HWND		hwnd=GetParent(hwndTreeView);
+
+	TRACE("%p %p %x\n",lpsf, pidl, (INT)hParent);
+	SetCapture(GetParent(hwndTreeView));
+	SetCursor(LoadCursorA(0, (LPSTR)IDC_WAIT));
+
+	while (NOERROR == IEnumIDList_Next(lpe,1,&pidlTemp,&ulFetched))
+	{
+	    ULONG ulAttrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER;
+	    IEnumIDList* pEnumIL = NULL;
+	    IShellFolder* pSFChild = NULL;
+	    IShellFolder_GetAttributesOf(lpsf, 1, (LPCITEMIDLIST*)&pidlTemp, &ulAttrs);
+	    if (ulAttrs & SFGAO_FOLDER)
+	    {
+	        hr = IShellFolder_BindToObject(lpsf,pidlTemp,NULL,&IID_IShellFolder,(LPVOID*)&pSFChild);
+	        if (SUCCEEDED(hr))
+                {
+	            hr = IShellFolder_EnumObjects(pSFChild, hwnd, BrowseFlagsToSHCONTF(lpBrowseInfo->ulFlags), &pEnumIL);
+                    if (SUCCEEDED(hr))
+                    {
+                        if ((IEnumIDList_Skip(pEnumIL, 1) != S_OK) || FAILED(IEnumIDList_Reset(pEnumIL)))
+                        {
+                            IEnumIDList_Release(pEnumIL);
+                            pEnumIL = NULL;
+                        }
+                    }
+                    IShellFolder_Release(pSFChild);
+                }
[truncated at 1000 lines; 44732 more skipped]