diff --git a/reactos/subsys/system/explorer/De.rc b/reactos/subsys/system/explorer/De.rc new file mode 100644 index 00000000000..13f006a0129 --- /dev/null +++ b/reactos/subsys/system/explorer/De.rc @@ -0,0 +1,163 @@ +/* + * Winefile + * German Language Support + * + * Copyright 2000 Martin Fuchs + * Copyright 2002 Steven Edwards + * Copyright 2002 Alexandre Julliard + * + * 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 + */ + +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) + + +/* Menu */ + +IDM_WINEFILE MENU FIXED IMPURE +{ + POPUP "&Datei" { + MENUITEM "Ö&ffnen\tEingabetaste" , 101 + MENUITEM "&Verschieben...\tF7" , 106 + MENUITEM "&Kopieren...\tF8" , 107 + MENUITEM "&In Zwischenablage...\tF9" , 118 + MENUITEM "&Löschen\tEntf" , 108 + MENUITEM "&Umbenennen..." , 109 + MENUITEM "&Eigenschaften...\tAlt+Eingabetaste" , ID_EDIT_PROPERTIES + MENUITEM SEPARATOR + MENUITEM "K&omprimieren..." , 119 + MENUITEM "Deko&mprimieren..." , 120 + MENUITEM SEPARATOR + MENUITEM "&Ausführen..." , ID_EXECUTE + MENUITEM "&Drucken..." , 102 + MENUITEM "Zuord&nen..." , 103 + MENUITEM SEPARATOR + MENUITEM "Ver&zeichnis erstellen..." , 111 + MENUITEM "&Suchen..." , 104 + MENUITEM "Dateien aus&wählen..." , 116 + MENUITEM SEPARATOR + MENUITEM "&Beenden\tAlt+X" , ID_FILE_EXIT + } + + POPUP "Da&tenträger" { + MENUITEM "Datenträger &kopieren..." , 201 + MENUITEM "Datenträger &benennen..." , 202 + MENUITEM SEPARATOR + MENUITEM "Datenträger &formatieren..." , 203 +#ifdef _WIN95 + MENUITEM "...", -1 //TODO +#endif + MENUITEM SEPARATOR + MENUITEM "Netzwerklaufwerk &verbinden..." , 252 + MENUITEM "Netzwerklaufwerk &trennen..." , 253 + MENUITEM SEPARATOR + MENUITEM "F&reigeben als..." , 254 + MENUITEM "Freigabe been&den..." , 255 + MENUITEM SEPARATOR + MENUITEM "Laufwerk aus&wählen..." , 251 + } + + + POPUP "&Verzeichnisse" { + MENUITEM "&Nächste Ebene einblenden\t+" , 301 + MENUITEM "&Zweig einblenden\t*" , 302 + MENUITEM "Alle &Ebenen einblenden\tStrg+*" , 303 + MENUITEM "Zweig &ausblenden\t-" , 304 + MENUITEM SEPARATOR + MENUITEM "&Verzweigungen kennzeichnen" , 505 + } + + POPUP "&Ansicht" { + MENUITEM "Struktur &und Verzeichnis" , 413 + MENUITEM "Nur St&ruktur" , 411 + MENUITEM "Nur &Verzeichnis" , 412 + MENUITEM SEPARATOR + MENUITEM "&Teilen" , 414 + MENUITEM SEPARATOR + MENUITEM "&Name" , ID_VIEW_NAME + MENUITEM "A&lle Dateiangaben" , ID_VIEW_ALL_ATTRIBUTES, CHECKED + MENUITEM "&Bestimmte Dateiangaben..." , ID_VIEW_SELECTED_ATTRIBUTES + MENUITEM SEPARATOR + MENUITEM "Nach N&ame" , 404 + MENUITEM "Nach T&yp" , 405 + MENUITEM "Nach &Größe" , 406 + MENUITEM "Nach &Datum" , 407 + MENUITEM SEPARATOR + MENUITEM "Angaben ausw&ählen..." , 409 + } + + POPUP "&Optionen" { + MENUITEM "&Bestätigen..." , -1 + MENUITEM "Schrift&art..." , -1 + MENUITEM "Symbolleiste &definieren..." , -1 + MENUITEM SEPARATOR + MENUITEM "Sy&mbolleiste" , ID_VIEW_TOOL_BAR, CHECKED + MENUITEM "Lauf&werkleiste" , ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "&Statusleiste" , ID_VIEW_STATUSBAR, CHECKED +#ifndef _NO_EXTENSIONS + MENUITEM "Vollb&ild\tStrg+Umschalt+S" , ID_VIEW_FULLSCREEN +#endif + MENUITEM SEPARATOR + MENUITEM "&Symbol nach Programmstart" , -1 + MENUITEM "&Einstellungen beim Beenden speichern" , 511 + } + + POPUP "&Sicherheit" { + MENUITEM "&Berechtigungen..." , 605 + MENUITEM "Über&wachen..." , 606 + MENUITEM "Besi&tzer..." , 607 + } + + POPUP "&Fenster" { + MENUITEM "Neues &Fenster" , ID_WINDOW_NEW + MENUITEM "Über&lappend\tUmschalt+F5" , ID_WINDOW_CASCADE + MENUITEM "&Untereinander" , ID_WINDOW_TILE_HORZ + MENUITEM "&Nebeneinander\tUmschalt+F4" , ID_WINDOW_TILE_VERT +#ifndef _NO_EXTENSIONS + MENUITEM "au&tomatisch anordnen" , ID_WINDOW_AUTOSORT +#endif + MENUITEM "&Symbole anordnen" , ID_WINDOW_ARRANGE + MENUITEM "&Aktualisieren\tF5" , ID_REFRESH + } + + POPUP "&?" { + MENUITEM "&Hilfethemen\tF1" , ID_HELP + MENUITEM "&Suchen...\tF1" , ID_HELP + MENUITEM "Hilfe &verwenden\tF1" , ID_HELP_USING + MENUITEM SEPARATOR + MENUITEM "Info about &Winefile..." , ID_ABOUT +/* POPUP "Inf&o..." { + MENUITEM "Info über &Wine..." , ID_ABOUT_WINE +// MENUITEM "&Lizenz" ID_LICENSE +// MENUITEM "&KEINE GARANTIE" ID_NO_WARRANTY + }*/ + } +} + + +IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Ausführen" +FONT 8, "MS Shell Dlg" +{ + CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 + CONTROL "Befehls&zeile:" , -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 + EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL + CONTROL "Als &Symbol" , 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 + DEFPUSHBUTTON "OK" , 1, 158, 6, 47, 14 + PUSHBUTTON "Abbrechen" , 2, 158, 23, 47, 14 + PUSHBUTTON "&Hilfe" , 254, 158, 43, 47, 14 +} diff --git a/reactos/subsys/system/explorer/En.rc b/reactos/subsys/system/explorer/En.rc new file mode 100644 index 00000000000..c17fc8689ba --- /dev/null +++ b/reactos/subsys/system/explorer/En.rc @@ -0,0 +1,167 @@ +/* + * WineFile + * English Language Support + * + * Copyright 2000 Martin Fuchs + * Copyright 2002 Steven Edwards + * Copyright 2002 Alexandre Julliard + * + * 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 + */ + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(850) + + +/* Menu */ + +IDM_WINEFILE MENU FIXED IMPURE +{ + POPUP "&File" { + MENUITEM "&Open\tEnter" , 101 + MENUITEM "&Move...\tF7" , 106 + MENUITEM "&Copy...\tF8" , 107 + MENUITEM "&In Clipboard...\tF9" , 118 + MENUITEM "&Delete\tDel" , 108 + MENUITEM "Re&name..." , 109 + MENUITEM "Propert&ies...\tAlt+Enter" , ID_EDIT_PROPERTIES + MENUITEM SEPARATOR + MENUITEM "C&ompress..." , 119 + MENUITEM "Dec&ompress..." , 120 + MENUITEM SEPARATOR + MENUITEM "&Run..." , ID_EXECUTE + MENUITEM "&Print..." , 102 + MENUITEM "Associate..." , 103 + MENUITEM SEPARATOR + MENUITEM "Cr&eate Directory..." , 111 + MENUITEM "Searc&h..." , 104 + MENUITEM "&Select Files..." , 116 + MENUITEM SEPARATOR +#ifndef _NO_EXTENSIONS + MENUITEM "E&xit\tAlt+X" , ID_FILE_EXIT +#else + MENUITEM "E&xit", ID_FILE_EXIT +#endif + } + + POPUP "&Disk" { + MENUITEM "&Copy Disk..." , 201 + MENUITEM "&Label Disk..." , 202 + MENUITEM SEPARATOR + MENUITEM "&Format Disk..." , 203 +#ifdef _WIN95 + MENUITEM "&Make System Disk...", -1 //TODO +#endif + MENUITEM SEPARATOR + MENUITEM "Connect &Network Drive" , 252 + MENUITEM "&Disconnect Network Drive" , 253 + MENUITEM SEPARATOR + MENUITEM "Share as..." , 254 + MENUITEM "&Remove Share..." , 255 + MENUITEM SEPARATOR + MENUITEM "&Select Drive..." , 251 + } + + POPUP "&Directories" { + MENUITEM "&Next Level\t+" , 301 + MENUITEM "Expand &Tree\t*" , 302 + MENUITEM "Expand &all\tStrg+*" , 303 + MENUITEM "Collapse &Tree\t-" , 304 + MENUITEM SEPARATOR + MENUITEM "&Mark Childs" , 505 + } + + POPUP "&View" { + MENUITEM "T&ree and Directory" , 413 + MENUITEM "Tr&ee Only" , 411 + MENUITEM "Directory &Only" , 412 + MENUITEM SEPARATOR + MENUITEM "Sp&lit" , 414 + MENUITEM SEPARATOR + MENUITEM "&Name" , ID_VIEW_NAME + MENUITEM "&All File Details" , ID_VIEW_ALL_ATTRIBUTES, CHECKED + MENUITEM "&Partial Details..." , ID_VIEW_SELECTED_ATTRIBUTES + MENUITEM SEPARATOR + MENUITEM "&Sort by Name" , 404 + MENUITEM "Sort &by Type" , 405 + MENUITEM "Sort by Si&ze" , 406 + MENUITEM "Sort by &Date" , 407 + MENUITEM SEPARATOR + MENUITEM "Sort by &..." , 409 + } + + POPUP "&Options" { + MENUITEM "&Confirmation..." , -1 + MENUITEM "&Font..." , -1 + MENUITEM "Customize Tool&bar..." , -1 + MENUITEM SEPARATOR + MENUITEM "&Toolbar" , ID_VIEW_TOOL_BAR, CHECKED + MENUITEM "&Drivebar" , ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "&Status Bar" , ID_VIEW_STATUSBAR, CHECKED +#ifndef _NO_EXTENSIONS + MENUITEM "F&ull Screen\tCtrl+Shift+S" , ID_VIEW_FULLSCREEN +#endif + MENUITEM SEPARATOR + MENUITEM "&Symbol nach Programmstart" , -1 + MENUITEM "&Einstellungen beim Beenden speichern" , 511 + } + + + POPUP "&Security" { + MENUITEM "&Access..." , 605 + MENUITEM "&Logging..." , 606 + MENUITEM "&Owner..." , 607 + } + + POPUP "&Window" { + MENUITEM "New &Window" , ID_WINDOW_NEW + MENUITEM "Cascading\tCtrl+F5" , ID_WINDOW_CASCADE + MENUITEM "Tile &Horizontally" , ID_WINDOW_TILE_HORZ + MENUITEM "Tile &Vertically\tCtrl+F4" , ID_WINDOW_TILE_VERT +#ifndef _NO_EXTENSIONS + MENUITEM "Arrange Automatically" , ID_WINDOW_AUTOSORT +#endif + MENUITEM "Arrange &Symbols" , ID_WINDOW_ARRANGE + MENUITEM "&Refresh\tF5" , ID_REFRESH + } + + POPUP "&?" { + MENUITEM "&Help Topics\tF1" , ID_HELP + MENUITEM "Help &Search...\tF1" , ID_HELP + MENUITEM "&Using Help\tF1" , ID_HELP_USING + MENUITEM SEPARATOR + MENUITEM "Info about &Winefile..." , ID_ABOUT +/* POPUP "Info..." { + MENUITEM "Info about &Wine..." , ID_ABOUT_WINE +// MENUITEM "&License..." ID_LICENSE +// MENUITEM "&NO WARRANTY" ID_NO_WARRANTY + } */ + } +} + + +IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Execute" +FONT 8, "MS Shell Dlg" +{ + CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 + CONTROL "&Command:" , -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 + EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL + CONTROL "As &Symbol" , 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 + DEFPUSHBUTTON "OK" , 1, 158, 6, 47, 14 + PUSHBUTTON "Cancel" , 2, 158, 23, 47, 14 + PUSHBUTTON "&Help" , 254, 158, 43, 47, 14 +} diff --git a/reactos/subsys/system/explorer/WineFile.dsp b/reactos/subsys/system/explorer/WineFile.dsp new file mode 100644 index 00000000000..e9ad747ee43 --- /dev/null +++ b/reactos/subsys/system/explorer/WineFile.dsp @@ -0,0 +1,216 @@ +# Microsoft Developer Studio Project File - Name="WineFile" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=WineFile - Win32 Unicode Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "WineFile.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "WineFile.mak" CFG="WineFile - Win32 Unicode Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "WineFile - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE "WineFile - Win32 Unicode Debug" (based on "Win32 (x86) Application") +!MESSAGE "WineFile - Win32 UNICODE Release" (based on "Win32 (x86) Application") +!MESSAGE "WineFile - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.cmd +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "WineFile - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "WineFileDebug" +# PROP Intermediate_Dir "WineFileDebug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "_NO_EXTENSIONS" /D "_WINE_" /D WINE_UNUSED= /FR /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.cmd +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib comdlg32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "WineFile - Win32 Unicode Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Unicode Debug" +# PROP BASE Intermediate_Dir "Unicode Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "WineFileUDebug" +# PROP Intermediate_Dir "WineFileUDebug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /FR /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "_WINE_" /D WINE_UNUSED= /FR /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.cmd +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib comdlg32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "WineFile - Win32 UNICODE Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "WineFile___Win32_UNICODE_Release" +# PROP BASE Intermediate_Dir "WineFile___Win32_UNICODE_Release" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "WineFileURelease" +# PROP Intermediate_Dir "WineFileURelease" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "UNICODE" /D "_WINE_" /D WINE_UNUSED= /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.cmd +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib comdlg32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib comdlg32.lib /nologo /subsystem:windows /machine:I386 + +!ELSEIF "$(CFG)" == "WineFile - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "WineFile___Win32_Release" +# PROP BASE Intermediate_Dir "WineFile___Win32_Release" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "WineFileRelease" +# PROP Intermediate_Dir "WineFileRelease" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "UNICODE" /D WINE_UNUSED= /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "_WINE_" /D WINE_UNUSED= /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.cmd +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib comdlg32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib comdlg32.lib /nologo /subsystem:windows /machine:I386 + +!ENDIF + +# Begin Target + +# Name "WineFile - Win32 Debug" +# Name "WineFile - Win32 Unicode Debug" +# Name "WineFile - Win32 UNICODE Release" +# Name "WineFile - Win32 Release" +# Begin Group "Resources" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\De.rc +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\drivebar.bmp +# End Source File +# Begin Source File + +SOURCE=.\En.rc +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\images.bmp +# End Source File +# Begin Source File + +SOURCE=.\resource.h +# End Source File +# Begin Source File + +SOURCE=.\resource.rc +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\toolbar.bmp +# End Source File +# Begin Source File + +SOURCE=.\winefile.ico +# End Source File +# Begin Source File + +SOURCE=.\winefile.rc +# End Source File +# End Group +# Begin Source File + +SOURCE=.\license.c +# End Source File +# Begin Source File + +SOURCE=.\license.h +# End Source File +# Begin Source File + +SOURCE=.\Makefile.in +# End Source File +# Begin Source File + +SOURCE=.\splitpath.c +# End Source File +# Begin Source File + +SOURCE=.\winefile.c +# End Source File +# Begin Source File + +SOURCE=.\winefile.h +# End Source File +# End Target +# End Project diff --git a/reactos/subsys/system/explorer/desktop.c b/reactos/subsys/system/explorer/desktop.c index 6f98d38c1d6..29d1277e5fd 100644 --- a/reactos/subsys/system/explorer/desktop.c +++ b/reactos/subsys/system/explorer/desktop.c @@ -5,13 +5,14 @@ 5th July 2003 */ - +#include #include -#include "explorer.h" -const char DesktopClassName[] = "DesktopWindow"; +#include "include/explorer.h" +const TCHAR DesktopClassName[] = TEXT("DesktopWindow"); + LRESULT CALLBACK DeskWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -33,7 +34,7 @@ LRESULT CALLBACK DeskWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) PAINTSTRUCT ps; HDC DesktopDC = BeginPaint(hwnd, &ps); - char Text [] = "ReactOS 0.1.2 Desktop Example\nby Silver Blade"; + TCHAR Text [] = TEXT("ReactOS 0.1.2 Desktop Example\nby Silver Blade"); int Width, Height; @@ -43,7 +44,8 @@ LRESULT CALLBACK DeskWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) // This next part could be improved by working out how much // space the text actually needs... - RECT r; + { + RECT r; r.left = Width - 260; r.top = Height - 80; r.right = r.left + 250; @@ -51,10 +53,17 @@ LRESULT CALLBACK DeskWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) SetTextColor(DesktopDC, 0x00ffffff); SetBkMode(DesktopDC, TRANSPARENT); - DrawText(DesktopDC, &Text, -1, &r, DT_RIGHT); + DrawText(DesktopDC, Text, -1, &r, DT_RIGHT); + } EndPaint(hwnd, &ps); + + return 0; } + + case WM_LBUTTONDBLCLK: + ShowFileMgr(hwnd, SW_SHOWNORMAL); + return 0; } return DefWindowProc(hwnd, uMsg, wParam, lParam); @@ -68,16 +77,18 @@ int main(int argc, char *argv[]) WNDCLASSEX wc; HWND Desktop; - STARTUPINFO startupinfo; - int cmdshow = SW_SHOWNORMAL; + STARTUPINFO startupinfo; + int nCmdShow = SW_SHOWNORMAL; + HINSTANCE hInstance = GetModuleHandle(NULL); + HWND hwndExplorerBar; wc.cbSize = sizeof(WNDCLASSEX); - wc.style = 0; + wc.style = CS_DBLCLKS; wc.lpfnWndProc = &DeskWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; - wc.hInstance = GetModuleHandle(NULL); + wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground= (HBRUSH) GetStockObject(BLACK_BRUSH); @@ -85,27 +96,47 @@ int main(int argc, char *argv[]) wc.lpszClassName= DesktopClassName; wc.hIconSm = NULL; - if (! RegisterClassEx(&wc)) + if (!RegisterClassEx(&wc)) return 1; // error + Width = GetSystemMetrics(SM_CXSCREEN); Height = GetSystemMetrics(SM_CYSCREEN); - Desktop = CreateWindowEx(0, DesktopClassName, "Desktop", + Desktop = CreateWindowEx(0, DesktopClassName, TEXT("Desktop"), WS_VISIBLE | WS_POPUP | WS_CLIPCHILDREN, 0, 0, Width, Height, - NULL, NULL, GetModuleHandle(NULL), NULL); + NULL, NULL, hInstance, NULL); if (! Desktop) - return 1; // error + { + fprintf(stderr,"FATAL: Desktop window could not be initialized properly - Exiting.\n"); + return 1; // error + } - // call winefile/menu startup routine + // call winefile startup routine startupinfo.wShowWindow = SW_SHOWNORMAL; GetStartupInfo(&startupinfo); if (startupinfo.dwFlags & STARTF_USESHOWWINDOW) - cmdshow = startupinfo.wShowWindow; + nCmdShow = startupinfo.wShowWindow; - return Ex_BarMain(GetModuleHandle(NULL), Desktop, NULL, cmdshow); - //return startup(argc, argv); // invoke the startup groups + // Initializing the Explorer Bar ! + if (!(hwndExplorerBar=InitializeExplorerBar(hInstance, nCmdShow))) + { + fprintf(stderr,"FATAL: Explorer bar could not be initialized properly ! Exiting !\n"); + return 1; + } + + // Load plugins + if (!ExplorerLoadPlugins(hwndExplorerBar)) + { + fprintf(stderr,"WARNING: No plugin for desktop bar could be loaded.\n"); + } + +#ifndef _DEBUG //MF: disabled for debugging + startup(argc, argv); // invoke the startup groups +#endif + + return winefile_main(hInstance, Desktop, nCmdShow); } diff --git a/reactos/subsys/system/explorer/doc/TODO.txt b/reactos/subsys/system/explorer/doc/TODO.txt new file mode 100644 index 00000000000..a70f63cbcba --- /dev/null +++ b/reactos/subsys/system/explorer/doc/TODO.txt @@ -0,0 +1,211 @@ +1. Fix the Explorer Bar/Start Menu. Currently it is almost nothing like Windows. + +2. Implement support for ICONs on the desktop. + +3. Fix Mingw build. Currently Explorer requires the WINE headers to build. +When build with Mingw headers you will get a error like this: + +G:\src\rosapps\explorer>make1 +windres -DNDEBUG -DWIN32 -DUNICODE -D_ROS_ --include-dir ../../reactos/include - +-include-dir ../../reactos/include explorer.rc -o explorer.coff +gcc -fexceptions -O2 -DNDEBUG -DWIN32 -DUNICODE -D_ROS_ -W -I./ -I../../reactos/ +include -pipe -march=i386 -D_M_IX86 -c desktop.c -o desktop.o +gcc -fexceptions -O2 -DNDEBUG -DWIN32 -DUNICODE -D_ROS_ -W -I./ -I../../reactos/ +include -pipe -march=i386 -D_M_IX86 -c ex_bar.c -o ex_bar.o +gcc -fexceptions -O2 -DNDEBUG -DWIN32 -DUNICODE -D_ROS_ -W -I./ -I../../reactos/ +include -pipe -march=i386 -D_M_IX86 -c license.c -o license.o +gcc -fexceptions -O2 -DNDEBUG -DWIN32 -DUNICODE -D_ROS_ -W -I./ -I../../reactos/ +include -pipe -march=i386 -D_M_IX86 -c splitpath.c -o splitpath.o +In file included from C:/mingw/include/commctrl.h:7, + from winefile.h:38, + from splitpath.c:19: +C:/mingw/include/prsht.h:123: parse error before "LPCDLGTEMPLATE" +C:/mingw/include/prsht.h:138: parse error before '}' token +C:/mingw/include/prsht.h:139: parse error before '*' token +C:/mingw/include/prsht.h:146: parse error before "LPCDLGTEMPLATE" +C:/mingw/include/prsht.h:152: conflicting types for `pszTitle' +C:/mingw/include/prsht.h:129: previous declaration of `pszTitle' +C:/mingw/include/prsht.h:155: conflicting types for `pfnCallback' +C:/mingw/include/prsht.h:132: previous declaration of `pfnCallback' +C:/mingw/include/prsht.h:161: parse error before '}' token +C:/mingw/include/prsht.h:162: parse error before '*' token +C:/mingw/include/prsht.h:163: parse error before "LPPROPSHEETPAGEA" +C:/mingw/include/prsht.h:164: parse error before "LPPROPSHEETPAGEW" +C:/mingw/include/prsht.h:183: parse error before "LPCPROPSHEETPAGEA" +C:/mingw/include/prsht.h:185: parse error before '}' token +C:/mingw/include/prsht.h:186: conflicting types for `pfnCallback' +C:/mingw/include/prsht.h:155: previous declaration of `pfnCallback' +C:/mingw/include/prsht.h:198: parse error before '}' token +C:/mingw/include/prsht.h:199: parse error before '*' token +C:/mingw/include/prsht.h:216: parse error before "LPCPROPSHEETPAGEW" +C:/mingw/include/prsht.h:218: parse error before '}' token +C:/mingw/include/prsht.h:231: parse error before '}' token +C:/mingw/include/prsht.h:232: parse error before '*' token +C:/mingw/include/prsht.h:236: parse error before "NMHDR" +C:/mingw/include/prsht.h:238: parse error before '}' token +In file included from winefile.h:38, + from splitpath.c:19: +C:/mingw/include/commctrl.h:1473: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1478: parse error before '}' token +C:/mingw/include/commctrl.h:1480: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1483: conflicting types for `szText' +C:/mingw/include/commctrl.h:1476: previous declaration of `szText' +C:/mingw/include/commctrl.h:1485: parse error before '}' token +C:/mingw/include/commctrl.h:1493: parse error before "POINT" +C:/mingw/include/commctrl.h:1548: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1553: parse error before '}' token +C:/mingw/include/commctrl.h:1564: parse error before "RECT" +C:/mingw/include/commctrl.h:1606: parse error before "RECT" +C:/mingw/include/commctrl.h:1608: parse error before '}' token +C:/mingw/include/commctrl.h:1611: parse error before "POINT" +C:/mingw/include/commctrl.h:1614: parse error before '}' token +C:/mingw/include/commctrl.h:1616: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1620: parse error before '}' token +C:/mingw/include/commctrl.h:1622: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1625: conflicting types for `pitem' +C:/mingw/include/commctrl.h:1619: previous declaration of `pitem' +C:/mingw/include/commctrl.h:1626: parse error before '}' token +C:/mingw/include/commctrl.h:1631: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1634: conflicting types for `pitem' +C:/mingw/include/commctrl.h:1625: previous declaration of `pitem' +C:/mingw/include/commctrl.h:1635: parse error before '}' token +C:/mingw/include/commctrl.h:1638: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1641: conflicting types for `pitem' +C:/mingw/include/commctrl.h:1634: previous declaration of `pitem' +C:/mingw/include/commctrl.h:1642: parse error before '}' token +C:/mingw/include/commctrl.h:1652: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1655: conflicting types for `pszText' +C:/mingw/include/commctrl.h:1552: previous declaration of `pszText' +C:/mingw/include/commctrl.h:1659: parse error before '}' token +C:/mingw/include/commctrl.h:1661: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1664: conflicting types for `pszText' +C:/mingw/include/commctrl.h:1655: previous declaration of `pszText' +C:/mingw/include/commctrl.h:1668: parse error before '}' token +C:/mingw/include/commctrl.h:1670: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1673: parse error before "rc" +C:/mingw/include/commctrl.h:1677: parse error before '}' token +C:/mingw/include/commctrl.h:1679: parse error before "NMCUSTOMDRAW" +C:/mingw/include/commctrl.h:1685: parse error before '}' token +C:/mingw/include/commctrl.h:1687: parse error before "NMCUSTOMDRAW" +C:/mingw/include/commctrl.h:1693: parse error before '}' token +C:/mingw/include/commctrl.h:1729: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1733: conflicting types for `pszText' +C:/mingw/include/commctrl.h:1664: previous declaration of `pszText' +C:/mingw/include/commctrl.h:1737: parse error before '}' token +C:/mingw/include/commctrl.h:1741: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1745: conflicting types for `pszText' +C:/mingw/include/commctrl.h:1733: previous declaration of `pszText' +C:/mingw/include/commctrl.h:1749: parse error before '}' token +C:/mingw/include/commctrl.h:1757: parse error before "RECT" +C:/mingw/include/commctrl.h:1763: parse error before '}' token +C:/mingw/include/commctrl.h:1769: parse error before "RECT" +C:/mingw/include/commctrl.h:1771: conflicting types for `lpszText' +C:/mingw/include/commctrl.h:1759: previous declaration of `lpszText' +C:/mingw/include/commctrl.h:1775: parse error before '}' token +C:/mingw/include/commctrl.h:1778: parse error before "POINT" +C:/mingw/include/commctrl.h:1783: parse error before "POINT" +C:/mingw/include/commctrl.h:1787: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1788: conflicting types for `lpszText' +C:/mingw/include/commctrl.h:1771: previous declaration of `lpszText' +C:/mingw/include/commctrl.h:1789: conflicting types for `szText' +C:/mingw/include/commctrl.h:1483: previous declaration of `szText' +C:/mingw/include/commctrl.h:1795: parse error before '}' token +C:/mingw/include/commctrl.h:1799: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1800: conflicting types for `lpszText' +C:/mingw/include/commctrl.h:1788: previous declaration of `lpszText' +C:/mingw/include/commctrl.h:1801: conflicting types for `szText' +C:/mingw/include/commctrl.h:1789: previous declaration of `szText' +C:/mingw/include/commctrl.h:1807: parse error before '}' token +C:/mingw/include/commctrl.h:1815: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1818: parse error before '}' token +C:/mingw/include/commctrl.h:1835: parse error before '*' token +C:/mingw/include/commctrl.h:1851: conflicting types for `FAR' +C:/mingw/include/commctrl.h:1835: previous declaration of `FAR' +C:/mingw/include/commctrl.h:1851: parse error before '*' token +C:/mingw/include/commctrl.h:1858: parse error before "POINT" +C:/mingw/include/commctrl.h:1860: parse error before '}' token +C:/mingw/include/commctrl.h:1860: parse error before "FAR" +C:/mingw/include/commctrl.h:1867: parse error before "POINT" +C:/mingw/include/commctrl.h:1869: parse error before '}' token +C:/mingw/include/commctrl.h:1869: parse error before "FAR" +C:/mingw/include/commctrl.h:1873: parse error before "POINT" +C:/mingw/include/commctrl.h:1879: parse error before '}' token +C:/mingw/include/commctrl.h:1893: conflicting types for `FAR' +C:/mingw/include/commctrl.h:1851: previous declaration of `FAR' +C:/mingw/include/commctrl.h:1893: parse error before '*' token +C:/mingw/include/commctrl.h:1907: conflicting types for `FAR' +C:/mingw/include/commctrl.h:1893: previous declaration of `FAR' +C:/mingw/include/commctrl.h:1907: parse error before '*' token +C:/mingw/include/commctrl.h:1912: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1918: parse error before "ptAction" +C:/mingw/include/commctrl.h:1920: parse error before '}' token +C:/mingw/include/commctrl.h:1926: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1928: parse error before '}' token +C:/mingw/include/commctrl.h:1928: parse error before "FAR" +C:/mingw/include/commctrl.h:1932: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1933: conflicting types for `item' +C:/mingw/include/commctrl.h:1927: previous declaration of `item' +C:/mingw/include/commctrl.h:1934: parse error before '}' token +C:/mingw/include/commctrl.h:1934: parse error before "FAR" +C:/mingw/include/commctrl.h:1938: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1941: parse error before '}' token +C:/mingw/include/commctrl.h:1943: parse error before "NMHDR" +C:/mingw/include/commctrl.h:1946: parse error before '}' token +C:/mingw/include/commctrl.h:2038: parse error before "POINT" +C:/mingw/include/commctrl.h:2041: parse error before '}' token +C:/mingw/include/commctrl.h:2055: parse error before "NMHDR" +C:/mingw/include/commctrl.h:2059: parse error before "ptDrag" +C:/mingw/include/commctrl.h:2065: parse error before "NMHDR" +C:/mingw/include/commctrl.h:2067: conflicting types for `itemOld' +C:/mingw/include/commctrl.h:2057: previous declaration of `itemOld' +C:/mingw/include/commctrl.h:2068: conflicting types for `itemNew' +C:/mingw/include/commctrl.h:2058: previous declaration of `itemNew' +C:/mingw/include/commctrl.h:2069: parse error before "ptDrag" +C:/mingw/include/commctrl.h:2075: parse error before "NMHDR" +C:/mingw/include/commctrl.h:2076: conflicting types for `item' +C:/mingw/include/commctrl.h:1933: previous declaration of `item' +C:/mingw/include/commctrl.h:2077: parse error before '}' token +C:/mingw/include/commctrl.h:2079: parse error before "NMHDR" +C:/mingw/include/commctrl.h:2080: conflicting types for `item' +C:/mingw/include/commctrl.h:2076: previous declaration of `item' +C:/mingw/include/commctrl.h:2081: parse error before '}' token +C:/mingw/include/commctrl.h:2083: parse error before "NMHDR" +C:/mingw/include/commctrl.h:2086: parse error before '}' token +C:/mingw/include/commctrl.h:2122: parse error before "POINT" +C:/mingw/include/commctrl.h:2124: parse error before '}' token +C:/mingw/include/commctrl.h:2126: parse error before "NMHDR" +C:/mingw/include/commctrl.h:2129: parse error before '}' token +C:/mingw/include/commctrl.h:2165: parse error before "POINT" +C:/mingw/include/commctrl.h:2168: parse error before '}' token +C:/mingw/include/commctrl.h:2172: parse error before "NMHDR" +C:/mingw/include/commctrl.h:2176: parse error before '}' token +C:/mingw/include/commctrl.h:2329: parse error before "LPRECT" +C:/mingw/include/commctrl.h:2330: parse error before "LPRECT" +C:/mingw/include/commctrl.h:2331: parse error before "LPRECT" +C:/mingw/include/commctrl.h:2361: parse error before "IMAGEINFO" +C:/mingw/include/commctrl.h:2382: parse error before "POINT" +C:/mingw/include/commctrl.h:2585: parse error before "TOOLINFO" +C:/mingw/include/commctrl.h:2586: parse error before "TTHITTESTINFO" +C:/mingw/include/commctrl.h:2587: parse error before "TOOLTIPTEXT" +C:/mingw/include/commctrl.h:2588: parse error before "NMTTDISPINFO" +C:/mingw/include/commctrl.h:2596: parse error before "NM_TREEVIEW" +C:/mingw/include/commctrl.h:2597: parse error before "NMTREEVIEW" +C:/mingw/include/commctrl.h:2598: parse error before "NMHDDISPINFO" +In file included from winefile.h:39, + from splitpath.c:19: +C:/mingw/include/shellapi.h:101: parse error before "RECT" +C:/mingw/include/shellapi.h:103: parse error before '}' token +In file included from winefile.h:39, + from splitpath.c:19: +C:/mingw/include/shellapi.h:199: parse error before "LPPOINT" +C:/mingw/include/shellapi.h:208: parse error before "PAPPBARDATA" +In file included from splitpath.c:19: +winefile.h:131: parse error before "SIZE" +winefile.h:131: warning: no semicolon at end of struct or union +winefile.h:138: parse error before '}' token +winefile.h:138: warning: data definition has no type or storage class +winefile.h:140: parse error before "Globals" +winefile.h:140: warning: data definition has no type or storage class +make1: *** [splitpath.o] Error 1 + +G:\src\rosapps\explorer> diff --git a/reactos/subsys/system/explorer/doc/changes.txt b/reactos/subsys/system/explorer/doc/changes.txt new file mode 100644 index 00000000000..809469285de --- /dev/null +++ b/reactos/subsys/system/explorer/doc/changes.txt @@ -0,0 +1,11 @@ +14.10.2002 m. fuchs Korrektur der Anpassungen durch Übernahme in wine: Anzeige der Verzeichnisnamen in Tree Pane + m. fuchs Wieder-Anpassung an natives Übersetzen unter WIN32 mit VC++ + +15.10.2002 m. fuchs Entfernung der Warnungsmeldung durch SetWindowText(0, ...) + m. fuchs korrekte Anzeige der Header Control-Texte (nicht Unicode -> dlls/comctl32/header.c) + +15.10.2002 m. fuchs sofortige Anzeige der Dateiliste beim Starten und Öffnen neuer Fenster +15.10.2002 m. fuchs Programmaufruf über Doppelklick in der Dateiliste + +07.06.2003 m. fuchs integration with ROS desktop window + diff --git a/reactos/subsys/system/explorer/readme.txt b/reactos/subsys/system/explorer/doc/readme.txt similarity index 100% rename from reactos/subsys/system/explorer/readme.txt rename to reactos/subsys/system/explorer/doc/readme.txt diff --git a/reactos/subsys/system/explorer/ex_bar.c b/reactos/subsys/system/explorer/ex_bar.c index ace98bedc80..e671d35b696 100644 --- a/reactos/subsys/system/explorer/ex_bar.c +++ b/reactos/subsys/system/explorer/ex_bar.c @@ -8,6 +8,8 @@ #include #include +#include "include/explorer.h" + HFONT tf; HINSTANCE PlugInsHI[2]; // PlugIns table int PlugNumber; // Number of loaded plugins @@ -51,7 +53,7 @@ HWND InitializeExplorerBar(HINSTANCE hInstance, int nCmdShow) HWND ExplorerBar; WNDCLASS ExplorerBarClass; - ExplorerBarClass.lpszClassName = "ExplorerBar"; // ExplorerBar classname + ExplorerBarClass.lpszClassName = TEXT("ExplorerBar"); // ExplorerBar classname ExplorerBarClass.lpfnWndProc = ExplorerBarProc; // Default Explorer Callback Procedure ExplorerBarClass.style = CS_VREDRAW | CS_HREDRAW; // Styles ExplorerBarClass.hInstance = hInstance; // Instance @@ -68,8 +70,8 @@ HWND InitializeExplorerBar(HINSTANCE hInstance, int nCmdShow) return NULL; } - ExplorerBar = CreateWindowEx(LoadProperty(1),"ExplorerBar", - "ReactOS Explorer Bar",LoadProperty(2),LoadProperty(3),LoadProperty(4), + ExplorerBar = CreateWindowEx(LoadProperty(1),TEXT("ExplorerBar"), + TEXT("ReactOS Explorer Bar"),LoadProperty(2),LoadProperty(3),LoadProperty(4), LoadProperty(5),LoadProperty(6),NULL,NULL,hInstance,NULL); if (ExplorerBar == NULL) { @@ -128,7 +130,7 @@ HINSTANCE InitializeExplorerPlugIn(HWND ExplorerHandle) printf("1.%s 2.%s\n",ttl,line); strcpy(epl_line[i],line); - epl_AppButtons[i] = CreateWindow( + epl_AppButtons[i] = CreateWindowA( "BUTTON",ttl,WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, (i*102)+2, 2, 100, 20, ExplorerHandle, NULL, (HINSTANCE) GetWindowLong(ExplorerHandle, GWL_HINSTANCE),NULL); } @@ -197,7 +199,7 @@ int ExplorerPlugInMessageProc(HWND PlgnHandle, UINT Msg, WPARAM wParam, LPARAM l if ((HWND)lParam==epl_AppButtons[i]) { printf("Pressed Button Line : %s\n",epl_line[i]); - system(epl_line[i]); + launch_fileA(PlgnHandle, epl_line[i], SW_SHOWNORMAL); } } break; @@ -233,6 +235,7 @@ int ExplorerLoadPlugins(HWND ExplWnd) return 1; } +/* int WINAPI Ex_BarMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, @@ -267,6 +270,7 @@ int WINAPI Ex_BarMain(HINSTANCE hInstance, return 0; } +*/ LRESULT CALLBACK ExplorerBarProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { diff --git a/reactos/subsys/system/explorer/explorer.dsp b/reactos/subsys/system/explorer/explorer.dsp new file mode 100644 index 00000000000..88c1286a54f --- /dev/null +++ b/reactos/subsys/system/explorer/explorer.dsp @@ -0,0 +1,306 @@ +# Microsoft Developer Studio Project File - Name="explorer" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=explorer - Win32 Unicode Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "explorer.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "explorer.mak" CFG="explorer - Win32 Unicode Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "explorer - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "explorer - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "explorer - Win32 Debug Release" (based on "Win32 (x86) Console Application") +!MESSAGE "explorer - Win32 Unicode Release" (based on "Win32 (x86) Console Application") +!MESSAGE "explorer - Win32 Unicode Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.cmd +RSC=rc.exe + +!IF "$(CFG)" == "explorer - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /YX /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.cmd +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "explorer - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /FR /YX /FD /GZ /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.cmd +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "explorer - Win32 Debug Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "explorer___Win32_Debug_Release" +# PROP BASE Intermediate_Dir "explorer___Win32_Debug_Release" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "DRelease" +# PROP Intermediate_Dir "DRelease" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_ROS_" /YX /FD /c +# ADD CPP /nologo /W3 /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /FR /YX /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.cmd +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 + +!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "explorer___Win32_Unicode_Release" +# PROP BASE Intermediate_Dir "explorer___Win32_Unicode_Release" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "." +# PROP Intermediate_Dir "URelease" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /YX /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.cmd +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "explorer___Win32_Unicode_Debug" +# PROP BASE Intermediate_Dir "explorer___Win32_Unicode_Debug" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "UDebug" +# PROP Intermediate_Dir "UDebug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /FR /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /FR /YX /FD /GZ /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.cmd +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "explorer - Win32 Release" +# Name "explorer - Win32 Debug" +# Name "explorer - Win32 Debug Release" +# Name "explorer - Win32 Unicode Release" +# Name "explorer - Win32 Unicode Debug" +# Begin Group "res" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\De.rc + +!IF "$(CFG)" == "explorer - Win32 Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "explorer - Win32 Debug" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "explorer - Win32 Debug Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Release" + +# PROP BASE Exclude_From_Build 1 +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Debug" + +# PROP BASE Exclude_From_Build 1 +# PROP Exclude_From_Build 1 + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\drivebar.bmp +# End Source File +# Begin Source File + +SOURCE=.\En.rc + +!IF "$(CFG)" == "explorer - Win32 Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "explorer - Win32 Debug" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "explorer - Win32 Debug Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Release" + +# PROP BASE Exclude_From_Build 1 +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Debug" + +# PROP BASE Exclude_From_Build 1 +# PROP Exclude_From_Build 1 + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\resource.rc + +!IF "$(CFG)" == "explorer - Win32 Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "explorer - Win32 Debug" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "explorer - Win32 Debug Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Release" + +# PROP BASE Exclude_From_Build 1 +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Debug" + +# PROP BASE Exclude_From_Build 1 +# PROP Exclude_From_Build 1 + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\winefile.ico +# End Source File +# Begin Source File + +SOURCE=.\winefile.rc +# End Source File +# End Group +# Begin Source File + +SOURCE=.\desktop.c +# End Source File +# Begin Source File + +SOURCE=.\ex_bar.c +# End Source File +# Begin Source File + +SOURCE=.\explorer.h +# End Source File +# Begin Source File + +SOURCE=.\license.h +# End Source File +# Begin Source File + +SOURCE=.\resource.h +# End Source File +# Begin Source File + +SOURCE=.\splitpath.c +# End Source File +# Begin Source File + +SOURCE=.\startup.c +# End Source File +# Begin Source File + +SOURCE=.\winefile.c +# End Source File +# Begin Source File + +SOURCE=.\winefile.h +# End Source File +# End Target +# End Project diff --git a/reactos/subsys/system/explorer/explorer.dsw b/reactos/subsys/system/explorer/explorer.dsw new file mode 100644 index 00000000000..4d457e67756 --- /dev/null +++ b/reactos/subsys/system/explorer/explorer.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "explorer"=.\explorer.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/reactos/subsys/system/explorer/explorer.h b/reactos/subsys/system/explorer/explorer.h deleted file mode 100644 index 2607594a4c7..00000000000 --- a/reactos/subsys/system/explorer/explorer.h +++ /dev/null @@ -1,15 +0,0 @@ - - // launch start programs -extern int startup( int argc, char *argv[] ); - - // winefile main routine -extern int winefile_main(HINSTANCE hinstance, HWND hwndParent, int cmdshow); - - // display file manager window -extern void ShowFileMgr(HWND hWndParent, int cmdshow); - -extern int WINAPI Ex_BarMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpszCmdLine, - int nCmdShow); - diff --git a/reactos/subsys/system/explorer/explorer.rc b/reactos/subsys/system/explorer/explorer.rc index e897993f059..197bd89c8f7 100644 --- a/reactos/subsys/system/explorer/explorer.rc +++ b/reactos/subsys/system/explorer/explorer.rc @@ -1,5 +1,6 @@ #include #include +#include "winefile.rc" LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US diff --git a/reactos/subsys/system/explorer/include/explorer.h b/reactos/subsys/system/explorer/include/explorer.h new file mode 100644 index 00000000000..c2f5d3cf8a9 --- /dev/null +++ b/reactos/subsys/system/explorer/include/explorer.h @@ -0,0 +1,24 @@ + + // launch start programs +extern int startup( int argc, char *argv[] ); + + // winefile main routine +extern int winefile_main(HINSTANCE hinstance, HWND hwndParent, int cmdshow); + + // display file manager window +extern void ShowFileMgr(HWND hWndParent, int cmdshow); + + // start desktop bar +extern HWND InitializeExplorerBar(HINSTANCE hInstance, int nCmdShow); + + // load plugins +extern int ExplorerLoadPlugins(HWND ExplWnd); + + // launch a program or document file +extern BOOL launch_file(HWND hwnd, LPCTSTR cmd, UINT nCmdShow); +#ifdef UNICODE +extern BOOL launch_fileA(HWND hwnd, LPSTR cmd, UINT nCmdShow); +#else +#define launch_fileA launch_file +#endif + diff --git a/reactos/subsys/system/explorer/include/license.h b/reactos/subsys/system/explorer/include/license.h new file mode 100644 index 00000000000..112e38faf21 --- /dev/null +++ b/reactos/subsys/system/explorer/include/license.h @@ -0,0 +1,24 @@ +VOID WineLicense(HWND hWnd, LPCSTR lpszLanguage); +VOID WineWarranty(HWND hWnd, LPCSTR language); + +typedef struct +{ + LPCSTR License, LicenseCaption; + LPCSTR Warranty, WarrantyCaption; +} LICENSE; + +extern LICENSE WineLicense_Cz; +extern LICENSE WineLicense_Da; +extern LICENSE WineLicense_De; +extern LICENSE WineLicense_En; +extern LICENSE WineLicense_Eo; +extern LICENSE WineLicense_Es; +extern LICENSE WineLicense_Fi; +extern LICENSE WineLicense_Fr; +extern LICENSE WineLicense_Hu; +extern LICENSE WineLicense_It; +extern LICENSE WineLicense_Ko; +extern LICENSE WineLicense_No; +extern LICENSE WineLicense_Pl; +extern LICENSE WineLicense_Po; +extern LICENSE WineLicense_Va; diff --git a/reactos/subsys/system/explorer/include/resource.h b/reactos/subsys/system/explorer/include/resource.h new file mode 100644 index 00000000000..6996df2bcad --- /dev/null +++ b/reactos/subsys/system/explorer/include/resource.h @@ -0,0 +1,75 @@ +/* + * Copyright 2000 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 + */ + +/* images */ +#define IDB_TOOLBAR 100 +#define IDB_DRIVEBAR 101 +#define IDB_IMAGES 102 +#define IDI_WINEFILE 100 + + +/* accellerators and menus */ + +#define IDA_WINEFILE 101 +#define IDM_WINEFILE 102 + + +/* dialogs */ + +#define IDD_EXECUTE 103 + + +/* control ids */ + +#define ID_ACTIVATE 101 +#define ID_EXECUTE 105 +#define ID_FILE_EXIT 115 +#define ID_VIEW_NAME 401 +#define ID_VIEW_ALL_ATTRIBUTES 402 +#define ID_VIEW_SELECTED_ATTRIBUTES 403 +#define ID_VIEW_TOOL_BAR 508 +#define ID_VIEW_DRIVE_BAR 507 +#define ID_VIEW_STATUSBAR 503 + +#define ID_ABOUT 1803 +#define ID_REFRESH 1704 +#define ID_EDIT_PROPERTIES 57656 +#define ID_WINDOW_NEW 0xE130 +#define ID_WINDOW_ARRANGE 0xE131 +#define ID_WINDOW_CASCADE 0xE132 +#define ID_WINDOW_TILE_HORZ 0xE133 +#define ID_WINDOW_TILE_VERT 0xE134 +#define ID_WINDOW_SPLIT 0xE135 +#define ID_HELP_USING 0xE144 +#define ID_HELP 0xE146 + +/* range for drive bar command ids: 0x9000..0x90FF */ +#define ID_DRIVE_FIRST 0x9001 + + +/* winefile extensions */ +#define ID_ABOUT_WINE 0x8000 +#define ID_LICENSE 0x8001 +#define ID_NO_WARRANTY 0x8002 +#define ID_WINDOW_AUTOSORT 0x8003 +#define ID_VIEW_FULLSCREEN 0x8004 +#define ID_PREFERED_SIZES 0x8005 + +#ifdef __linux__ +#define ID_DRIVE_UNIX_FS 0x9000 +#endif diff --git a/reactos/subsys/system/explorer/include/winefile.h b/reactos/subsys/system/explorer/include/winefile.h new file mode 100644 index 00000000000..049f2007612 --- /dev/null +++ b/reactos/subsys/system/explorer/include/winefile.h @@ -0,0 +1,146 @@ +/* + * Copyright 2000 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 + */ + +#define WIN32_LEAN_AND_MEAN +#define WIN32_EXTRA_LEAN +#define NOSERVICE +#define NOMCX +#define NOIME +#define NOCOMM +#define NOKANJI +#define NORPC +#define NOPROXYSTUB +#define NOIMAGE +#define NOTAPE + +#ifdef UNICODE +#define _UNICODE +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _MSC_VER +#include /* for alloca() */ +#endif + +#ifndef FILE_ATTRIBUTE_NOT_CONTENT_INDEXED +#define FILE_ATTRIBUTE_ENCRYPTED 0x00000040 +#define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200 +#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400 +#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000 +#endif + + +#ifdef _DEBUG +#define ASSERT(x) {if (!(x)) DebugBreak();} +#else +#define ASSERT(x) /* nothing */ +#endif + +#ifdef _MSC_VER +#define LONGLONGARG _T("I64") +#else +#define LONGLONGARG _T("L") +#endif + +#define BUFFER_LEN 1024 + + +enum IMAGE { + IMG_NONE=-1, IMG_FILE=0, IMG_DOCUMENT, IMG_EXECUTABLE, + IMG_FOLDER, IMG_OPEN_FOLDER, IMG_FOLDER_PLUS,IMG_OPEN_PLUS, IMG_OPEN_MINUS, + IMG_FOLDER_UP, IMG_FOLDER_CUR +}; + +#define IMAGE_WIDTH 16 +#define IMAGE_HEIGHT 13 +#define SPLIT_WIDTH 5 + +#define IDW_STATUSBAR 0x100 +#define IDW_TOOLBAR 0x101 +#define IDW_DRIVEBAR 0x102 +#define IDW_FIRST_CHILD 0xC000 /*0x200*/ + +#define IDW_TREE_LEFT 3 +#define IDW_TREE_RIGHT 6 +#define IDW_HEADER_LEFT 2 +#define IDW_HEADER_RIGHT 5 + +#define WM_DISPATCH_COMMAND 0xBF80 + +#define COLOR_COMPRESSED RGB(0,0,255) +#define COLOR_SELECTION RGB(0,0,128) + +#ifdef _NO_EXTENSIONS +#define COLOR_SPLITBAR WHITE_BRUSH +#else +#define COLOR_SPLITBAR LTGRAY_BRUSH +#endif + +#define WINEFILEFRAME _T("WFS_Frame") +#define WINEFILETREE _T("WFS_Tree") +#define WINEFILEDRIVES _T("WFS_Drives") +#define WINEFILEMDICLIENT _T("WFS_MdiClient") + +#define FRM_CALC_CLIENT 0xBF83 +#define Frame_CalcFrameClient(hwnd, prt) ((BOOL)SNDMSG(hwnd, FRM_CALC_CLIENT, 0, (LPARAM)(PRECT)prt)) + + +typedef struct +{ + HANDLE hInstance; + HACCEL haccel; + ATOM hframeClass; + + HWND hMainWnd; + HMENU hMenuFrame; + HMENU hWindowsMenu; + HMENU hLanguageMenu; + HMENU hMenuView; + HMENU hMenuOptions; + HWND hmdiclient; + HWND hstatusbar; + HWND htoolbar; + HWND hdrivebar; + HFONT hfont; + + TCHAR num_sep; + SIZE spaceSize; + HIMAGELIST himl; + + TCHAR drives[BUFFER_LEN]; + BOOL prescan_node; /*TODO*/ + + UINT wStringTableOffset; +} WINEFILE_GLOBALS; + +extern WINEFILE_GLOBALS Globals; + +#ifdef UNICODE +extern void _wsplitpath(const WCHAR* path, WCHAR* drv, WCHAR* dir, WCHAR* name, WCHAR* ext); +#else +extern void _splitpath(const CHAR* path, CHAR* drv, CHAR* dir, CHAR* name, CHAR* ext); +#endif diff --git a/reactos/subsys/system/explorer/license.c b/reactos/subsys/system/explorer/license.c new file mode 100644 index 00000000000..8e666970819 --- /dev/null +++ b/reactos/subsys/system/explorer/license.c @@ -0,0 +1,52 @@ +/* + * Copyright 2000 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 +*/ + +#include "windows.h" + +static const CHAR LicenseCaption[] = "LICENSE"; +static const CHAR License[] = +"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.\n" + +"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.\n" + +"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"; + +static const CHAR NoWarrantyCaption[] = "NO WARRANTY"; +static const CHAR NoWarranty[] = +"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."; + +VOID WineLicense(HWND hwnd) +{ + MessageBoxA(hwnd, License, LicenseCaption, MB_ICONINFORMATION|MB_OK); +} + +VOID WineWarranty(HWND hwnd) +{ + MessageBoxA(hwnd, NoWarranty, NoWarrantyCaption, MB_ICONEXCLAMATION|MB_OK); +} diff --git a/reactos/subsys/system/explorer/makefile_rex b/reactos/subsys/system/explorer/makefile_rex index 8d837fbd922..b6aafa86a96 100644 --- a/reactos/subsys/system/explorer/makefile_rex +++ b/reactos/subsys/system/explorer/makefile_rex @@ -1,17 +1,43 @@ +# +# ReactOS winfile +# +# Makefile +# + PATH_TO_TOP = ../../.. TARGET_TYPE = program TARGET_APPTYPE = windows -TARGET_SDKLIBS = gdi32.a - TARGET_NAME = explorer +TARGET_CFLAGS = -fexceptions -O2 -DNDEBUG -DWIN32 -DUNICODE -D_ROS_ -W + +TARGET_RCFLAGS = -DNDEBUG -DWIN32 -DUNICODE -D_ROS_ + +WINE_MODE = yes + +WINE_RC = $(TARGET_NAME) + +WINE_INCLUDE = ./ + +TARGET_GCCLIBS = comctl32 + +TARGET_SDKLIBS = \ + kernel32.a \ + user32.a \ + gdi32.a \ + advapi32.a \ + version.a \ + TARGET_OBJECTS = \ desktop.o \ ex_bar.o \ - startup.o + license.o \ + splitpath.o \ + startup.o \ + winefile.o include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/subsys/system/explorer/res/drivebar.bmp b/reactos/subsys/system/explorer/res/drivebar.bmp new file mode 100644 index 00000000000..6feabbde694 Binary files /dev/null and b/reactos/subsys/system/explorer/res/drivebar.bmp differ diff --git a/reactos/subsys/system/explorer/res/images.bmp b/reactos/subsys/system/explorer/res/images.bmp new file mode 100644 index 00000000000..aaf3413b88a Binary files /dev/null and b/reactos/subsys/system/explorer/res/images.bmp differ diff --git a/reactos/subsys/system/explorer/res/toolbar.bmp b/reactos/subsys/system/explorer/res/toolbar.bmp new file mode 100644 index 00000000000..9a0d13c4c20 Binary files /dev/null and b/reactos/subsys/system/explorer/res/toolbar.bmp differ diff --git a/reactos/subsys/system/explorer/res/winefile.ico b/reactos/subsys/system/explorer/res/winefile.ico new file mode 100644 index 00000000000..51cb8b248ff Binary files /dev/null and b/reactos/subsys/system/explorer/res/winefile.ico differ diff --git a/reactos/subsys/system/explorer/resource.rc b/reactos/subsys/system/explorer/resource.rc new file mode 100644 index 00000000000..5446e639c15 --- /dev/null +++ b/reactos/subsys/system/explorer/resource.rc @@ -0,0 +1,289 @@ +/* + * Copyright 2000 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 + */ + +IDA_WINEFILE ACCELERATORS DISCARDABLE +{ +// VK_F1, ID_HELP, VIRTKEY, NOINVERT +// VK_F5, ID_REFRESH, VIRTKEY, NOINVERT +// VK_RETURN, ID_ACTIVATE, VIRTKEY, NOINVERT +#ifndef _NO_EXTENSIONS + "X", ID_FILE_EXIT, VIRTKEY, ALT, NOINVERT + "S", ID_VIEW_FULLSCREEN, VIRTKEY, SHIFT, CONTROL, NOINVERT +// VK_ADD, ID_PREFERED_SIZES, VIRTKEY, CONTROL, NOINVERT +#endif +} + +IDI_WINEFILE ICON DISCARDABLE +#ifdef _WIN32 + "res/winefile.ico" +#else +{ + '00 00 01 00 01 00 20 20 10 00 00 00 00 00 E8 02' + '00 00 16 00 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 04 00 00 00 00 00 80 02 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 80 00 00 80 00 00 00 80 80 00 80 00' + '00 00 80 00 80 00 80 80 00 00 C0 C0 C0 00 80 80' + '80 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00' + '00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 B7' + 'B7 B7 B7 B7 B7 B7 B7 70 00 00 00 00 00 00 00 70' + '00 00 00 00 00 00 0B 73 00 00 00 00 00 00 00 B3' + 'F7 B7 B7 B7 B7 B7 07 73 30 00 00 00 00 00 00 73' + 'FB 7B 7B 7B 7B 7B 0B 73 33 00 00 00 00 00 00 B3' + 'F7 BF FF FF F7 B7 07 73 33 00 00 00 00 00 00 73' + 'FB 70 33 33 0B 7B 0B 73 33 00 0F FF FF 00 00 B3' + 'F7 B0 33 33 07 B7 07 73 33 00 F0 00 00 F0 00 73' + 'FB 70 00 00 0B 7B 0B 73 33 00 00 00 00 00 00 B3' + 'F7 B7 B7 B7 B7 B7 07 73 33 00 00 00 00 00 00 73' + 'FF FF FF FF FF FF 0B 73 33 00 00 02 00 00 00 B3' + '33 33 33 33 33 33 07 73 33 00 00 09 00 00 00 7B' + '7B 7B 7B 7B 7B 7B 7B 73 33 00 00 99 90 00 00 B0' + '00 00 00 00 00 00 07 73 33 00 0B BB BB 00 00 73' + 'FB 7B 7B 7B 7B 7B 0B 73 33 00 BB BB BB B0 00 B3' + 'F7 B7 B7 B7 B7 B7 07 73 33 00 00 00 E0 00 00 73' + 'FB 7F FF FF FB 7B 0B 73 33 00 00 00 0E 00 00 B3' + 'F7 B0 33 33 07 B7 07 73 33 00 00 00 00 00 00 73' + 'FB 70 33 33 0B 7B 0B 73 33 00 00 00 00 00 00 B3' + 'F7 B0 00 00 07 B7 07 73 33 00 00 00 00 00 00 73' + 'FB 7B 7B 7B 7B 7B 0B 73 33 00 00 00 00 00 00 B3' + 'FF FF FF FF FF FF 07 73 33 00 00 00 00 00 00 73' + '33 33 33 33 33 33 0B 73 33 00 00 00 00 00 00 B7' + 'B7 B7 B7 B7 B7 B7 B7 73 33 00 00 00 00 00 00 FF' + 'FF FF FF FF FF FF FF F3 33 00 00 00 00 00 00 07' + 'B7 B7 B7 B7 B7 B7 B7 BF 33 00 00 00 00 00 00 00' + '7B 7B 7B 7B 7B 7B 7B 7B F3 00 00 00 00 00 00 00' + '07 B7 B7 B7 B7 B7 B7 B7 BF 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF 80 00 1F FF 80 00 0F FF 80 00 07 FF 80 00' + '03 FF 80 00 01 FF 80 00 01 FF 80 00 01 83 80 00' + '01 39 80 00 01 C7 80 00 01 EF 80 00 01 EF 80 00' + '01 EF 80 00 01 C7 80 00 01 83 80 00 01 01 80 00' + '01 F7 80 00 01 FB 80 00 01 FF 80 00 01 FF 80 00' + '01 FF 80 00 01 FF 80 00 01 FF 80 00 01 FF 80 00' + '01 FF 80 00 01 FF C0 00 01 FF E0 00 01 FF F0 00' + '01 FF F8 00 01 FF FF FF FF FF FF FF FF FF' +} +#endif + +IDB_TOOLBAR BITMAP DISCARDABLE +#ifdef _WIN32 + "res/toolbar.bmp" +#else +{ + '42 4D BE 03 00 00 00 00 00 00 76 00 00 00 28 00' + '00 00 70 00 00 00 0F 00 00 00 01 00 04 00 00 00' + '00 00 48 03 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80' + '00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80' + '00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF' + '00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF' + '00 00 FF FF FF 00 77 77 77 88 88 88 88 88 77 77' + '77 77 77 77 77 77 77 88 88 88 88 88 88 87 77 88' + '88 88 88 88 88 87 77 88 88 88 88 88 88 88 78 88' + '88 88 88 88 88 87 77 77 77 07 07 07 07 07 77 77' + '74 44 44 44 44 48 77 77 77 88 88 88 88 88 74 44' + '44 44 44 44 44 87 74 44 44 44 44 44 44 87 74 44' + '44 44 44 44 44 48 44 44 44 44 44 44 44 87 77 77' + '77 77 77 77 77 70 77 77 74 FF FF FF FF 48 77 77' + '74 44 44 44 44 48 74 FF FF FF FF FF F4 87 74 FF' + 'FF F4 FF FF F4 87 74 FF FF F4 FF FF FF 48 4F FF' + 'FF 4F FF FF F4 87 07 07 07 07 77 77 77 77 77 77' + '74 FF FF FF FF 48 77 77 74 FF FF FF FF 48 74 FF' + 'FF FF FF FF F4 87 74 FF FF F4 FF FF F4 87 74 FF' + 'FF F4 FF FF FF 48 4F FF FF 44 44 44 44 87 77 77' + '77 77 77 77 77 70 77 88 88 88 88 88 FF 48 77 77' + '84 FF FF FF FF 48 74 FF FF FF FF FF F4 87 74 FF' + 'FF F4 FF FF F4 87 74 FF FF F4 44 44 44 48 4F FF' + 'FF 44 44 44 44 87 07 77 77 07 77 77 77 77 74 44' + '8B 44 44 48 44 48 77 74 44 FF FF FF FF 48 74 44' + '44 44 44 44 44 87 74 FF FF F4 FF FF F4 87 74 FF' + 'FF F4 44 44 44 48 4F FF FF 4F FF 4F F4 87 77 77' + '77 70 70 70 70 70 7B FF 8B FF FF 48 44 47 77 74' + 'F4 44 44 44 44 48 74 44 44 44 44 44 44 87 74 FF' + 'FF F4 FF FF F4 87 74 FF FF F4 FF F4 FF 48 44 44' + '44 44 44 44 44 87 07 77 77 07 07 07 07 07 78 B8' + '8B F8 BF 48 77 77 77 84 F4 44 44 44 44 47 74 44' + '44 44 44 44 44 87 74 FF FF F4 FF FF F4 87 74 44' + '44 44 FF F4 FF 48 44 44 44 44 44 44 44 77 70 70' + '70 70 70 77 77 77 74 8B 8B 8B FF 48 88 87 74 44' + 'FF FF FF FF 48 77 74 FF FF FF FF FF F4 87 74 FF' + 'FF F4 FF FF F4 87 74 44 44 44 FF F4 FF 48 77 77' + '77 77 77 77 77 77 00 F7 07 07 07 70 70 77 7B B8' + 'BB B4 44 48 44 87 74 F4 44 44 44 44 48 77 74 FF' + 'FF FF FF FF F4 87 74 FF FF F4 FF FF F4 87 74 FF' + 'FF F4 FF F4 FF 48 7C CC 77 CC 77 C7 7C 77 00 F7' + '78 87 77 77 77 07 74 88 BB B4 44 44 F4 87 74 F4' + '44 44 44 44 47 77 74 FF FF FF FF FF F4 87 74 FF' + 'FF F4 FF FF F4 87 74 FF FF F4 FF F4 FF 48 C7 7C' + '7C 7C 7C 77 C7 C7 70 0F 00 F7 77 77 77 77 77 8B' + '8B 8B FF FF F4 87 74 FF FF FF FF 48 77 77 74 44' + '44 44 44 44 44 87 74 44 44 44 44 44 44 87 74 FF' + 'FF F4 FF F4 FF 48 7C CC 7C 7C 7C 77 C7 C7 77 08' + '07 77 77 77 77 07 78 B7 8B FF FF FF F4 87 74 44' + '44 44 44 48 77 77 74 44 44 44 44 44 44 87 74 44' + '44 44 44 44 44 87 74 44 44 44 44 44 44 48 77 7C' + '7C 7C 7C 77 C7 C7 77 80 0F 77 77 77 77 77 7B 77' + '8B 44 8B 44 44 87 74 44 44 44 44 47 77 77 74 44' + '44 44 44 44 44 77 74 44 44 44 44 44 44 77 74 44' + '44 44 44 44 44 47 7C C7 7C 7C 7C C7 7C 77 80 07' + '70 F7 07 07 07 07 77 77 8B 44 54 44 44 77 77 77' + '77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 77 7C 77 77 77 08 77 70 00 70 70 70 77' +} +#endif + +IDB_DRIVEBAR BITMAP DISCARDABLE +#ifdef _WIN32 + "res/drivebar.bmp" +#else +{ + '42 4D E6 02 00 00 00 00 00 00 76 00 00 00 28 00' + '00 00 60 00 00 00 0D 00 00 00 01 00 04 00 00 00' + '00 00 70 02 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80' + '00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80' + '00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF' + '00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF' + '00 00 FF FF FF 00 77 77 77 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 77 77 77 77 77 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 08 88 88 88 88 88 88 80 08 88' + '88 88 88 88 88 80 08 88 88 88 88 88 88 80 08 88' + '88 88 88 88 88 80 08 88 88 88 88 88 88 80 08 88' + '88 88 88 88 88 80 07 70 07 77 77 70 00 80 0F 77' + '77 77 77 77 77 80 0F 00 77 77 77 77 77 80 0F 77' + '77 77 77 79 97 80 0F 77 70 00 77 77 77 80 0F 77' + '07 07 07 07 77 80 07 77 70 07 00 00 77 80 0F 77' + '70 00 00 07 77 80 0F 00 00 00 00 00 00 80 0F 77' + '70 00 07 77 77 80 0F 77 77 07 77 77 77 80 0F 70' + '00 00 00 00 77 80 07 77 77 00 00 77 77 80 0F 00' + '00 00 00 00 00 80 0F 77 77 77 77 77 77 80 0F 77' + '07 7F 70 77 77 80 0F 77 70 00 77 77 77 80 0F 70' + '70 70 70 70 77 80 07 70 00 77 70 00 77 80 0F 77' + '70 00 00 07 77 80 0F 00 00 00 00 00 00 80 0F 00' + '87 F8 78 00 77 80 0F 00 00 70 00 00 07 80 0F 70' + '00 00 00 00 77 80 07 07 77 77 77 70 00 80 0F 77' + '77 77 77 77 70 80 0F 77 77 77 77 77 77 80 0F 00' + '00 00 00 00 77 80 0F 77 77 77 77 77 77 80 0F 77' + '07 07 07 07 77 80 07 77 77 77 77 77 77 80 0F FF' + 'FF FF FF FF FF 80 0F FF FF FF FF FF FF 80 0F FF' + 'FF FF FF FF FF 80 0F FF FF FF FF FF FF 80 0F FF' + 'FF FF FF FF FF 80 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 77 77 77 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 77 77 77 77 77' +} +#endif + +IDB_IMAGES BITMAP DISCARDABLE +#ifdef _WIN32 + "res/images.bmp" +#else +{ + '42 4D 86 04 00 00 00 00 00 00 76 00 00 00 28 00' + '00 00 A0 00 00 00 0D 00 00 00 01 00 04 00 00 00' + '00 00 10 04 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80' + '00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80' + '00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF' + '00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF' + '00 00 FF FF FF 00 AA AA 00 00 00 00 00 AA AA AA' + '00 00 00 00 00 AA AA 00 00 00 00 00 00 00 AA 00' + '00 00 00 00 00 00 AA A0 00 00 00 00 00 0A AA 00' + '00 00 00 00 00 00 AA A0 00 00 00 00 00 0A AA A0' + '00 00 00 00 00 0A AA AA AA AA AA AA AA AA AA AA' + 'AA AA AA AA AA AA AA A7 77 77 77 77 70 AA AA A7' + '77 77 77 77 70 AA A7 77 77 77 77 77 77 70 A7 77' + '77 77 77 77 77 80 AA 77 77 77 77 77 77 0A A7 77' + '77 77 77 77 77 80 AA 77 77 77 77 77 77 0A AA 77' + '77 77 77 77 77 0A AA AA AA AA AA AA AA AA AA AA' + 'AA AA AA AA AA AA AA A7 FF FF FF FF 70 AA AA A7' + 'FF FF FF FF 70 AA A7 7F 7F 7F 7F 7F 7F 70 A7 FB' + 'FB FB FB FB FB 80 AA 7F BF BF BF BF B7 0A A7 FB' + 'FB FB FB FB FB 80 AA 7F BF BF BF BF B7 0A AA 7F' + 'BF BF BF BF B7 0A AA AA AA 00 00 00 0A AA AA AA' + 'AA 00 AA AA AA AA AA A7 FF FF FF FF 70 AA AA A7' + 'FF 44 44 FF 70 AA A7 F7 F7 F7 F7 F7 F7 70 A7 FF' + 'BF BF BF BF BF 80 A7 FB FB FB FB FB F0 8A A7 FF' + 'BF B0 BF BF BF 80 A7 FB FB F0 FB FB F0 8A A7 FB' + 'FB FB FB FB F0 8A AA AA A0 E6 68 86 0A AA AA AA' + 'A0 E8 0A AA AA AA AA A7 FF FF FF FF 70 AA AA A7' + 'FF FF FF FF 70 AA A7 7F 7F 7F 7F 7F 7F 70 A7 FB' + 'FB FB FB FB FB 80 A7 BF BF BF BF BF 70 8A A7 FB' + 'FB F0 FB FB FB 80 A7 BF B0 00 0F BF 70 8A A7 BF' + 'B0 00 0F BF 70 8A AA AA A0 E0 00 00 AA AA AA AA' + 'A0 E8 0A AA AA AA AA A7 FF FF FF FF 70 AA AA A7' + 'FF 44 44 FF 70 AA A7 F7 F7 F7 F7 F7 F7 70 A7 FF' + 'BF BF BF BF BF 80 7B FB FB FB FB FB 88 8A A7 FF' + 'B0 00 00 BF BF 80 7B FB FB 0B FB FB 88 8A 7B FB' + 'FB FB FB FB 88 8A AA AA A0 E0 AA AA AA AA AA AA' + 'AA 00 AA AA AA AA AA A7 FF FF FF FF 70 AA AA A7' + 'FF FF FF FF 70 AA A7 7F 7F 7F 7F 7F 7F 70 A7 FB' + 'FB FB FB FB FB 80 7F FF FF FF FF F7 0F 8A A7 FB' + 'FB F0 FB FB FB 80 7F FF FF FF FF F7 0F 8A 7F FF' + 'FF FF FF F7 0F 8A AA AA A0 E0 AA AA AA AA AA AA' + 'AA AA AA AA AA AA AA A7 FF FF FF FF 70 AA AA A7' + 'FF 44 44 FF 70 AA A7 F7 F7 F7 F7 F7 F7 70 A7 FF' + 'BF BF BF BF BF 80 77 77 77 77 77 78 FB 8A A7 FF' + 'BF B0 BF BF BF 80 77 77 77 77 77 78 FB 8A 77 77' + '77 77 77 78 FB 8A AA A0 00 E0 00 AA AA AA AA AA' + 'AA AA AA AA AA AA AA A7 FF FF FF FF 70 AA AA A7' + 'FF FF FF FF 70 AA A7 7F 7F 7F 7F 7F 7F 70 A7 FB' + 'FB FB FB FB FB 80 A7 BF BF BF BF BF BF 8A A7 FB' + 'FB FB FB FB FB 80 A7 BF BF BF BF BF BF 8A A7 BF' + 'BF BF BF BF BF 8A AA A0 E6 66 60 AA AA AA AA AA' + 'AA AA AA AA AA AA AA A7 FF FF F7 77 7A AA AA A7' + 'FF 44 F7 77 7A AA A7 F7 F7 F7 F7 F7 F7 70 A7 FF' + 'FF FF FF FF FF 80 A7 FB FB FB FF FF FF 8A A7 FF' + 'FF FF FF FF FF 80 A7 FB FB FB FF FF FF 8A A7 FB' + 'FB FB FF FF FF 8A AA AA 0E 66 0A AA AA AA AA AA' + 'AA AA AA AA AA AA AA A7 FF FF F7 F7 AA AA AA A7' + 'FF FF F7 F7 AA AA A7 77 77 77 77 77 77 70 A7 FB' + 'FB FB F7 77 77 8A A7 BF BF BF F7 77 77 8A A7 FB' + 'FB FB F7 77 77 8A A7 BF BF BF F7 77 77 8A A7 BF' + 'BF BF F7 77 77 8A AA AA A0 E0 AA AA AA AA AA AA' + 'AA AA AA AA AA AA AA A7 FF FF F7 7A AA AA AA A7' + 'FF FF F7 7A AA AA A7 EE EE EE EE EE EE 70 AA 7F' + 'BF BF 7A AA AA AA AA 7F FF FF 7A AA AA AA AA 7F' + 'BF BF 7A AA AA AA AA 7F FF FF 7A AA AA AA AA 7F' + 'FF FF 7A AA AA AA AA AA AA 0A AA AA AA AA AA AA' + 'AA AA AA AA AA AA AA A7 77 77 77 AA AA AA AA A7' + '77 77 77 AA AA AA A7 77 77 77 77 77 77 7A AA A7' + '77 77 AA AA AA AA AA A7 77 77 AA AA AA AA AA A7' + '77 77 AA AA AA AA AA A7 77 77 AA AA AA AA AA A7' + '77 77 AA AA AA AA AA AA AA AA AA AA AA AA AA AA' + 'AA AA AA AA AA AA' +} +#endif diff --git a/reactos/subsys/system/explorer/splitpath.c b/reactos/subsys/system/explorer/splitpath.c new file mode 100644 index 00000000000..b08a81e10de --- /dev/null +++ b/reactos/subsys/system/explorer/splitpath.c @@ -0,0 +1,151 @@ +/* + * Copyright 2000 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 + */ + +#include "include/winefile.h" + +#ifdef UNICODE + +void _wsplitpath(const WCHAR* path, WCHAR* drv, WCHAR* dir, WCHAR* name, WCHAR* ext) +{ + const WCHAR* end; /* end of processed string */ + const WCHAR* p; /* search pointer */ + const WCHAR* s; /* copy pointer */ + + /* extract drive name */ + if (path[0] && path[1]==':') { + if (drv) { + *drv++ = *path++; + *drv++ = *path++; + *drv = L'\0'; + } + } else if (drv) + *drv = L'\0'; + + /* search for end of string or stream separator */ + for(end=path; *end && *end!=L':'; ) + end++; + + /* search for begin of file extension */ + for(p=end; p>path && *--p!=L'\\' && *p!=L'/'; ) + if (*p == L'.') { + end = p; + break; + } + + if (ext) + for(s=end; *ext=*s++; ) + ext++; + + /* search for end of directory name */ + for(p=end; p>path; ) + if (*--p=='\\' || *p=='/') { + p++; + break; + } + + if (name) { + for(s=p; spath && *--p!='\\' && *p!='/'; ) + if (*p == '.') { + end = p; + break; + } + + if (ext) + for(s=end; (*ext=*s++); ) + ext++; + + /* search for end of directory name */ + for(p=end; p>path; ) + if (*--p=='\\' || *p=='/') { + p++; + break; + } + + if (name) { + for(s=p; s +#include +#include +#include +#endif + +#ifdef _NO_EXTENSIONS +#undef _LEFT_FILES +#endif + +#ifndef _MAX_PATH +#define _MAX_DRIVE 3 +#define _MAX_FNAME 256 +#define _MAX_DIR _MAX_FNAME +#define _MAX_EXT _MAX_FNAME +#define _MAX_PATH 260 +#endif + +WINEFILE_GLOBALS Globals; + +extern void WineLicense(HWND hWnd); +extern void WineWarranty(HWND hWnd); + +typedef struct _Entry { + struct _Entry* next; + struct _Entry* down; + struct _Entry* up; + + BOOL expanded; + BOOL scanned; + int level; + + WIN32_FIND_DATA data; + +#ifndef _NO_EXTENSIONS + BY_HANDLE_FILE_INFORMATION bhfi; + BOOL bhfi_valid; + BOOL unix_dir; +#endif +} Entry; + +typedef struct { + Entry entry; + TCHAR path[MAX_PATH]; + TCHAR volname[_MAX_FNAME]; + TCHAR fs[_MAX_DIR]; + DWORD drive_type; + DWORD fs_flags; +} Root; + +enum COLUMN_FLAGS { + COL_SIZE = 0x01, + COL_DATE = 0x02, + COL_TIME = 0x04, + COL_ATTRIBUTES = 0x08, + COL_DOSNAMES = 0x10, +#ifdef _NO_EXTENSIONS + COL_ALL = COL_SIZE|COL_DATE|COL_TIME|COL_ATTRIBUTES|COL_DOSNAMES +#else + COL_INDEX = 0x20, + COL_LINKS = 0x40, + COL_ALL = COL_SIZE|COL_DATE|COL_TIME|COL_ATTRIBUTES|COL_DOSNAMES|COL_INDEX|COL_LINKS +#endif +}; + +typedef enum { + SORT_NAME, + SORT_EXT, + SORT_SIZE, + SORT_DATE +} SORT_ORDER; + +typedef struct { + HWND hwnd; +#ifndef _NO_EXTENSIONS + HWND hwndHeader; +#endif + +#ifndef _NO_EXTENSIONS +#define COLUMNS 10 +#else +#define COLUMNS 5 +#endif + int widths[COLUMNS]; + int positions[COLUMNS+1]; + + BOOL treePane; + int visible_cols; + Entry* root; + Entry* cur; +} Pane; + +typedef struct { + HWND hwnd; + Pane left; + Pane right; + int focus_pane; /* 0: left 1: right */ + WINDOWPLACEMENT pos; + int split_pos; + BOOL header_wdths_ok; + + TCHAR path[MAX_PATH]; + Root root; + + SORT_ORDER sortOrder; +} ChildWnd; + + +static void read_directory(Entry* parent, LPCTSTR path, int sortOrder); +static void set_curdir(ChildWnd* child, Entry* entry); + +LRESULT CALLBACK FrameWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam); +LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam); +LRESULT CALLBACK TreeWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam); + + +static void display_error(HWND hwnd, DWORD error) +{ + PTSTR msg; + + if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, + 0, error, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), (PTSTR)&msg, 0, NULL)) + MessageBox(hwnd, msg, _T("Winefile"), MB_OK); + else + MessageBox(hwnd, _T("Error"), _T("Winefile"), MB_OK); + + LocalFree(msg); +} + + +static void read_directory_win(Entry* parent, LPCTSTR path) +{ + Entry* entry = (Entry*) malloc(sizeof(Entry)); + int level = parent->level + 1; + Entry* last = 0; + HANDLE hFind; +#ifndef _NO_EXTENSIONS + HANDLE hFile; +#endif + + TCHAR buffer[MAX_PATH], *p; + for(p=buffer; *path; ) + *p++ = *path++; + + lstrcpy(p, _T("\\*")); + + hFind = FindFirstFile(buffer, &entry->data); + + if (hFind != INVALID_HANDLE_VALUE) { + parent->down = entry; + + do { + entry->down = 0; + entry->up = parent; + entry->expanded = FALSE; + entry->scanned = FALSE; + entry->level = level; + +#ifdef _NO_EXTENSIONS + /* hide directory entry "." */ + if (entry->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + LPCTSTR name = entry->data.cFileName; + + if (name[0]=='.' && name[1]=='\0') + continue; + } +#else + entry->unix_dir = FALSE; + entry->bhfi_valid = FALSE; + + lstrcpy(p+1, entry->data.cFileName); + + hFile = CreateFile(buffer, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, + 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + + if (hFile != INVALID_HANDLE_VALUE) { + if (GetFileInformationByHandle(hFile, &entry->bhfi)) + entry->bhfi_valid = TRUE; + + CloseHandle(hFile); + } +#endif + + last = entry; + + entry = (Entry*) malloc(sizeof(Entry)); + + if (last) + last->next = entry; + } while(FindNextFile(hFind, &entry->data)); + + last->next = 0; + + FindClose(hFind); + } else + parent->down = 0; + + free(entry); + + parent->scanned = TRUE; +} + + +static Entry* find_entry_win(Entry* parent, LPCTSTR name) +{ + Entry* entry; + + for(entry=parent->down; entry; entry=entry->next) { + LPCTSTR p = name; + LPCTSTR q = entry->data.cFileName; + + do { + if (!*p || *p==_T('\\') || *p==_T('/')) + return entry; + } while(tolower(*p++) == tolower(*q++)); + + p = name; + q = entry->data.cAlternateFileName; + + do { + if (!*p || *p==_T('\\') || *p==_T('/')) + return entry; + } while(tolower(*p++) == tolower(*q++)); + } + + return 0; +} + + +static Entry* read_tree_win(Root* root, LPCTSTR path, int sortOrder) +{ + TCHAR buffer[MAX_PATH]; + Entry* entry = &root->entry; + LPCTSTR s = path; + PTSTR d = buffer; + +#ifndef _NO_EXTENSIONS + entry->unix_dir = FALSE; +#endif + + while(entry) { + while(*s && *s!=_T('\\') && *s!=_T('/')) + *d++ = *s++; + + while(*s==_T('\\') || *s==_T('/')) + s++; + + *d++ = _T('\\'); + *d = _T('\0'); + + read_directory(entry, buffer, sortOrder); + + if (entry->down) + entry->expanded = TRUE; + + if (!*s) + break; + + entry = find_entry_win(entry, s); + } + + return entry; +} + + +#if !defined(_NO_EXTENSIONS) && defined(__linux__) + +BOOL to_filetime(const time_t* t, FILETIME* ftime) +{ + struct tm* tm = gmtime(t); + SYSTEMTIME stime; + + if (!tm) + return FALSE; + + stime.wYear = tm->tm_year+1900; + stime.wMonth = tm->tm_mon+1; + /* stime.wDayOfWeek */ + stime.wDay = tm->tm_mday; + stime.wHour = tm->tm_hour; + stime.wMinute = tm->tm_min; + stime.wSecond = tm->tm_sec; + + return SystemTimeToFileTime(&stime, ftime); +} + +static void read_directory_unix(Entry* parent, LPCTSTR path) +{ + Entry* entry = (Entry*) malloc(sizeof(Entry)); + int level = parent->level + 1; + Entry* last = 0; + + DIR* dir = opendir(path); + + if (dir) { + struct stat st; + struct dirent* ent; + TCHAR buffer[MAX_PATH], *p; + + for(p=buffer; *path; ) + *p++ = *path++; + + if (p==buffer || p[-1]!='/') + *p++ = '/'; + + parent->down = entry; + + while((ent=readdir(dir))) { + entry->unix_dir = TRUE; + lstrcpy(entry->data.cFileName, ent->d_name); + entry->data.dwFileAttributes = ent->d_name[0]=='.'? FILE_ATTRIBUTE_HIDDEN: 0; + + strcpy(p, ent->d_name); + + if (!stat(buffer, &st)) { + if (S_ISDIR(st.st_mode)) + entry->data.dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY; + + entry->data.nFileSizeLow = st.st_size & 0xFFFFFFFF; + entry->data.nFileSizeHigh = st.st_size >> 32; + + memset(&entry->data.ftCreationTime, 0, sizeof(FILETIME)); + to_filetime(&st.st_atime, &entry->data.ftLastAccessTime); + to_filetime(&st.st_mtime, &entry->data.ftLastWriteTime); + + entry->bhfi.nFileIndexLow = ent->d_ino; + entry->bhfi.nFileIndexHigh = 0; + + entry->bhfi.nNumberOfLinks = st.st_nlink; + + entry->bhfi_valid = TRUE; + } else { + entry->data.nFileSizeLow = 0; + entry->data.nFileSizeHigh = 0; + entry->bhfi_valid = FALSE; + } + + entry->down = 0; + entry->up = parent; + entry->expanded = FALSE; + entry->scanned = FALSE; + entry->level = level; + + last = entry; + + entry = (Entry*) malloc(sizeof(Entry)); + + if (last) + last->next = entry; + } + + last->next = 0; + + closedir(dir); + } else + parent->down = 0; + + free(entry); + + parent->scanned = TRUE; +} + +static Entry* find_entry_unix(Entry* parent, LPCTSTR name) +{ + Entry* entry; + + for(entry=parent->down; entry; entry=entry->next) { + LPCTSTR p = name; + LPCTSTR q = entry->data.cFileName; + + do { + if (!*p || *p==_T('/')) + return entry; + } while(*p++ == *q++); + } + + return 0; +} + +static Entry* read_tree_unix(Root* root, LPCTSTR path, int sortOrder) +{ + TCHAR buffer[MAX_PATH]; + Entry* entry = &root->entry; + LPCTSTR s = path; + PTSTR d = buffer; + + entry->unix_dir = TRUE; + + while(entry) { + while(*s && *s!=_T('/')) + *d++ = *s++; + + while(*s == _T('/')) + s++; + + *d++ = _T('/'); + *d = _T('\0'); + + read_directory(entry, buffer, sortOrder); + + if (entry->down) + entry->expanded = TRUE; + + if (!*s) + break; + + entry = find_entry_unix(entry, s); + } + + return entry; +} + +#endif + + +/* directories first... */ +static int compareType(const WIN32_FIND_DATA* fd1, const WIN32_FIND_DATA* fd2) +{ + int dir1 = fd1->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; + int dir2 = fd2->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; + + return dir2==dir1? 0: dir2data; + const WIN32_FIND_DATA* fd2 = &(*(Entry**)arg2)->data; + + int cmp = compareType(fd1, fd2); + if (cmp) + return cmp; + + return lstrcmpi(fd1->cFileName, fd2->cFileName); +} + +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 TCHAR *name1, *name2, *ext1, *ext2; + + int cmp = compareType(fd1, fd2); + if (cmp) + return cmp; + + name1 = fd1->cFileName; + name2 = fd2->cFileName; + + ext1 = _tcsrchr(name1, _T('.')); + ext2 = _tcsrchr(name2, _T('.')); + + if (ext1) + ext1++; + else + ext1 = _T(""); + + if (ext2) + ext2++; + else + ext2 = _T(""); + + cmp = lstrcmpi(ext1, ext2); + if (cmp) + return cmp; + + return lstrcmpi(name1, name2); +} + +static int compareSize(const void* arg1, const void* arg2) +{ + WIN32_FIND_DATA* fd1 = &(*(Entry**)arg1)->data; + WIN32_FIND_DATA* fd2 = &(*(Entry**)arg2)->data; + + int cmp = compareType(fd1, fd2); + if (cmp) + return cmp; + + cmp = fd2->nFileSizeHigh - fd1->nFileSizeHigh; + + if (cmp < 0) + return -1; + else if (cmp > 0) + return 1; + + cmp = fd2->nFileSizeLow - fd1->nFileSizeLow; + + return cmp<0? -1: cmp>0? 1: 0; +} + +static int compareDate(const void* arg1, const void* arg2) +{ + WIN32_FIND_DATA* fd1 = &(*(Entry**)arg1)->data; + WIN32_FIND_DATA* fd2 = &(*(Entry**)arg2)->data; + + int cmp = compareType(fd1, fd2); + if (cmp) + return cmp; + + return CompareFileTime(&fd2->ftLastWriteTime, &fd1->ftLastWriteTime); +} + + +static int (*sortFunctions[])(const void* arg1, const void* arg2) = { + compareName, /* SORT_NAME */ + compareExt, /* SORT_EXT */ + compareSize, /* SORT_SIZE */ + compareDate /* SORT_DATE */ +}; + + +static void SortDirectory(Entry* parent, SORT_ORDER sortOrder) +{ + Entry* entry = parent->down; + Entry** array, **p; + int len; + + len = 0; + for(entry=parent->down; entry; entry=entry->next) + len++; + + if (len) { + array = (Entry**) alloca(len*sizeof(Entry*)); + + p = array; + for(entry=parent->down; entry; entry=entry->next) + *p++ = entry; + + /* call qsort with the appropriate compare function */ + qsort(array, len, sizeof(array[0]), sortFunctions[sortOrder]); + + parent->down = array[0]; + + for(p=array; --len; p++) + p[0]->next = p[1]; + + (*p)->next = 0; + } +} + + +static void read_directory(Entry* parent, LPCTSTR path, int sortOrder) +{ + TCHAR buffer[MAX_PATH]; + Entry* entry; + LPCTSTR s; + PTSTR d; + +#if !defined(_NO_EXTENSIONS) && defined(__linux__) + if (parent->unix_dir) + { + read_directory_unix(parent, path); + + if (Globals.prescan_node) { + s = path; + d = buffer; + + while(*s) + *d++ = *s++; + + *d++ = _T('/'); + + for(entry=parent->down; entry; entry=entry->next) + if (entry->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + lstrcpy(d, entry->data.cFileName); + read_directory_unix(entry, buffer); + SortDirectory(entry, sortOrder); + } + } + } + else +#endif + { + read_directory_win(parent, path); + + if (Globals.prescan_node) { + s = path; + d = buffer; + + while(*s) + *d++ = *s++; + + *d++ = _T('\\'); + + for(entry=parent->down; entry; entry=entry->next) + if (entry->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + lstrcpy(d, entry->data.cFileName); + read_directory_win(entry, buffer); + SortDirectory(entry, sortOrder); + } + } + } + + SortDirectory(parent, sortOrder); +} + + +static ChildWnd* alloc_child_window(LPCTSTR path) +{ + TCHAR drv[_MAX_DRIVE+1], dir[_MAX_DIR], name[_MAX_FNAME], ext[_MAX_EXT]; + ChildWnd* child = (ChildWnd*) malloc(sizeof(ChildWnd)); + Root* root = &child->root; + Entry* entry; + + memset(child, 0, sizeof(ChildWnd)); + + child->left.treePane = TRUE; + child->left.visible_cols = 0; + + child->right.treePane = FALSE; +#ifndef _NO_EXTENSIONS + child->right.visible_cols = COL_SIZE|COL_DATE|COL_TIME|COL_ATTRIBUTES|COL_INDEX|COL_LINKS; +#else + child->right.visible_cols = COL_SIZE|COL_DATE|COL_TIME|COL_ATTRIBUTES; +#endif + + child->pos.length = sizeof(WINDOWPLACEMENT); + child->pos.flags = 0; + child->pos.showCmd = SW_SHOWNORMAL; + child->pos.rcNormalPosition.left = CW_USEDEFAULT; + child->pos.rcNormalPosition.top = CW_USEDEFAULT; + child->pos.rcNormalPosition.right = CW_USEDEFAULT; + child->pos.rcNormalPosition.bottom = CW_USEDEFAULT; + + child->focus_pane = 0; + child->split_pos = 200; + child->sortOrder = SORT_NAME; + child->header_wdths_ok = FALSE; + + lstrcpy(child->path, path); + + _tsplitpath(path, drv, dir, name, ext); + +#if !defined(_NO_EXTENSIONS) && defined(__linux__) + if (*path == '/') + { + root->drive_type = GetDriveType(path); + + lstrcat(drv, _T("/")); + lstrcpy(root->volname, _T("root fs")); + root->fs_flags = 0; + lstrcpy(root->fs, _T("unixfs")); + + lstrcpy(root->path, _T("/")); + entry = read_tree_unix(root, path, child->sortOrder); + } + else +#endif + { + root->drive_type = GetDriveType(path); + + lstrcat(drv, _T("\\")); + GetVolumeInformation(drv, root->volname, _MAX_FNAME, 0, 0, &root->fs_flags, root->fs, _MAX_DIR); + + lstrcpy(root->path, drv); + entry = read_tree_win(root, path, child->sortOrder); + } + + /*FIXME lstrcpy(root->entry.data.cFileName, drv); */ + wsprintf(root->entry.data.cFileName, _T("%s - %s"), drv, root->fs); + + root->entry.data.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; + + child->left.root = &root->entry; + + set_curdir(child, entry); + + return child; +} + + +/* recursively free all child entries */ +static void free_entries(Entry* parent) +{ + Entry *entry, *next=parent->down; + + if (next) { + parent->down = 0; + + do { + entry = next; + next = entry->next; + + free_entries(entry); + free(entry); + } while(next); + } +} + +/* free all memory associated with a child window */ +static void free_child_window(ChildWnd* child) +{ + free_entries(&child->root.entry); + free(child); +} + + +/* get full path of specified directory entry */ +static void get_path(Entry* dir, PTSTR path) +{ + Entry* entry; + int len = 0; + int level = 0; + + for(entry=dir; entry; level++) { + LPCTSTR name = entry->data.cFileName; + LPCTSTR s = name; + int l; + + for(l=0; *s && *s!=_T('/') && *s!=_T('\\'); s++) + l++; + + if (entry->up) { + memmove(path+l+1, path, len*sizeof(TCHAR)); + memcpy(path+1, name, l*sizeof(TCHAR)); + len += l+1; + +#ifndef _NO_EXTENSIONS + if (entry->unix_dir) + path[0] = _T('/'); + else +#endif + path[0] = _T('\\'); + + entry = entry->up; + } else { + memmove(path+l, path, len*sizeof(TCHAR)); + memcpy(path, name, l*sizeof(TCHAR)); + len += l; + break; + } + } + + if (!level) { +#ifndef _NO_EXTENSIONS + if (entry->unix_dir) + path[len++] = _T('/'); + else +#endif + path[len++] = _T('\\'); + } + + path[len] = _T('\0'); +} + + +static void resize_frame_rect(HWND hwnd, PRECT prect) +{ + int new_top; + RECT rt; + + if (IsWindowVisible(Globals.htoolbar)) { + SendMessage(Globals.htoolbar, WM_SIZE, 0, 0); + GetClientRect(Globals.htoolbar, &rt); + prect->top = rt.bottom+3; + prect->bottom -= rt.bottom+3; + } + + if (IsWindowVisible(Globals.hdrivebar)) { + SendMessage(Globals.hdrivebar, WM_SIZE, 0, 0); + GetClientRect(Globals.hdrivebar, &rt); + new_top = --prect->top + rt.bottom+3; + MoveWindow(Globals.hdrivebar, 0, prect->top, rt.right, new_top, TRUE); + prect->top = new_top; + prect->bottom -= rt.bottom+2; + } + + if (IsWindowVisible(Globals.hstatusbar)) { + int parts[] = {300, 500}; + + SendMessage(Globals.hstatusbar, WM_SIZE, 0, 0); + SendMessage(Globals.hstatusbar, SB_SETPARTS, 2, (LPARAM)&parts); + GetClientRect(Globals.hstatusbar, &rt); + prect->bottom -= rt.bottom; + } + + MoveWindow(Globals.hmdiclient, prect->left-1,prect->top-1,prect->right+2,prect->bottom+1, TRUE); +} + +static void resize_frame(HWND hwnd, int cx, int cy) +{ + RECT rect; + + rect.left = 0; + rect.top = 0; + rect.right = cx; + rect.bottom = cy; + + resize_frame_rect(hwnd, &rect); +} + +static void resize_frame_client(HWND hwnd) +{ + RECT rect; + + GetClientRect(hwnd, &rect); + + resize_frame_rect(hwnd, &rect); +} + + +static HHOOK hcbthook; +static ChildWnd* newchild = NULL; + +LRESULT CALLBACK CBTProc(int code, WPARAM wparam, LPARAM lparam) +{ + if (code==HCBT_CREATEWND && newchild) { + ChildWnd* child = newchild; + newchild = NULL; + + child->hwnd = (HWND) wparam; + SetWindowLong(child->hwnd, GWL_USERDATA, (LPARAM)child); + } + + return CallNextHookEx(hcbthook, code, wparam, lparam); +} + +static HWND create_child_window(ChildWnd* child) +{ + MDICREATESTRUCT mcs; + int idx; + + mcs.szClass = WINEFILETREE; + mcs.szTitle = (LPTSTR)child->path; + mcs.hOwner = Globals.hInstance; + mcs.x = child->pos.rcNormalPosition.left; + mcs.y = child->pos.rcNormalPosition.top; + mcs.cx = child->pos.rcNormalPosition.right-child->pos.rcNormalPosition.left; + mcs.cy = child->pos.rcNormalPosition.bottom-child->pos.rcNormalPosition.top; + mcs.style = 0; + mcs.lParam = 0; + + hcbthook = SetWindowsHookEx(WH_CBT, CBTProc, 0, GetCurrentThreadId()); + + newchild = child; + child->hwnd = (HWND) SendMessage(Globals.hmdiclient, WM_MDICREATE, 0, (LPARAM)&mcs); + if (!child->hwnd) + return 0; + + UnhookWindowsHookEx(hcbthook); + + idx = ListBox_FindItemData(child->left.hwnd, ListBox_GetCurSel(child->left.hwnd), child->left.cur); + ListBox_SetCurSel(child->left.hwnd, idx); + + return child->hwnd; +} + + +struct ExecuteDialog { + TCHAR cmd[MAX_PATH]; + int cmdshow; +}; + + +static BOOL CALLBACK ExecuteDialogWndProg(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + static struct ExecuteDialog* dlg; + + switch(nmsg) { + case WM_INITDIALOG: + dlg = (struct ExecuteDialog*) lparam; + return 1; + + case WM_COMMAND: { + int id = (int)wparam; + + if (id == IDOK) { + GetWindowText(GetDlgItem(hwnd, 201), dlg->cmd, MAX_PATH); + dlg->cmdshow = Button_GetState(GetDlgItem(hwnd,214))&BST_CHECKED? + SW_SHOWMINIMIZED: SW_SHOWNORMAL; + EndDialog(hwnd, id); + } else if (id == IDCANCEL) + EndDialog(hwnd, id); + + return 1;} + } + + return 0; +} + + +#ifndef _NO_EXTENSIONS + +static struct FullScreenParameters { + BOOL mode; + RECT orgPos; + BOOL wasZoomed; +} g_fullscreen = { + FALSE /* mode */ +}; + +void frame_get_clientspace(HWND hwnd, PRECT prect) +{ + RECT rt; + + if (!IsIconic(hwnd)) + GetClientRect(hwnd, prect); + else { + WINDOWPLACEMENT wp; + + GetWindowPlacement(hwnd, &wp); + + prect->left = prect->top = 0; + prect->right = wp.rcNormalPosition.right-wp.rcNormalPosition.left- + 2*(GetSystemMetrics(SM_CXSIZEFRAME)+GetSystemMetrics(SM_CXEDGE)); + prect->bottom = wp.rcNormalPosition.bottom-wp.rcNormalPosition.top- + 2*(GetSystemMetrics(SM_CYSIZEFRAME)+GetSystemMetrics(SM_CYEDGE))- + GetSystemMetrics(SM_CYCAPTION)-GetSystemMetrics(SM_CYMENUSIZE); + } + + if (IsWindowVisible(Globals.htoolbar)) { + GetClientRect(Globals.htoolbar, &rt); + prect->top += rt.bottom+2; + } + + if (IsWindowVisible(Globals.hdrivebar)) { + GetClientRect(Globals.hdrivebar, &rt); + prect->top += rt.bottom+2; + } + + if (IsWindowVisible(Globals.hstatusbar)) { + GetClientRect(Globals.hstatusbar, &rt); + prect->bottom -= rt.bottom; + } +} + +static BOOL toggle_fullscreen(HWND hwnd) +{ + RECT rt; + + if ((g_fullscreen.mode=!g_fullscreen.mode)) { + GetWindowRect(hwnd, &g_fullscreen.orgPos); + g_fullscreen.wasZoomed = IsZoomed(hwnd); + + Frame_CalcFrameClient(hwnd, &rt); + ClientToScreen(hwnd, (LPPOINT)&rt.left); + ClientToScreen(hwnd, (LPPOINT)&rt.right); + + rt.left = g_fullscreen.orgPos.left-rt.left; + rt.top = g_fullscreen.orgPos.top-rt.top; + rt.right = GetSystemMetrics(SM_CXSCREEN)+g_fullscreen.orgPos.right-rt.right; + rt.bottom = GetSystemMetrics(SM_CYSCREEN)+g_fullscreen.orgPos.bottom-rt.bottom; + + MoveWindow(hwnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE); + } else { + MoveWindow(hwnd, g_fullscreen.orgPos.left, g_fullscreen.orgPos.top, + g_fullscreen.orgPos.right-g_fullscreen.orgPos.left, + g_fullscreen.orgPos.bottom-g_fullscreen.orgPos.top, TRUE); + + if (g_fullscreen.wasZoomed) + ShowWindow(hwnd, WS_MAXIMIZE); + } + + return g_fullscreen.mode; +} + +static void fullscreen_move(HWND hwnd) +{ + RECT rt, pos; + GetWindowRect(hwnd, &pos); + + Frame_CalcFrameClient(hwnd, &rt); + ClientToScreen(hwnd, (LPPOINT)&rt.left); + ClientToScreen(hwnd, (LPPOINT)&rt.right); + + rt.left = pos.left-rt.left; + rt.top = pos.top-rt.top; + rt.right = GetSystemMetrics(SM_CXSCREEN)+pos.right-rt.right; + rt.bottom = GetSystemMetrics(SM_CYSCREEN)+pos.bottom-rt.bottom; + + MoveWindow(hwnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE); +} + +#endif + + +static void toggle_child(HWND hwnd, UINT cmd, HWND hchild) +{ + BOOL vis = IsWindowVisible(hchild); + + CheckMenuItem(Globals.hMenuOptions, cmd, vis?MF_BYCOMMAND:MF_BYCOMMAND|MF_CHECKED); + + ShowWindow(hchild, vis?SW_HIDE:SW_SHOW); + +#ifndef _NO_EXTENSIONS + if (g_fullscreen.mode) + fullscreen_move(hwnd); +#endif + + resize_frame_client(hwnd); +} + +BOOL activate_drive_window(LPCTSTR path) +{ + TCHAR drv1[_MAX_DRIVE], drv2[_MAX_DRIVE]; + HWND child_wnd; + + _tsplitpath(path, drv1, 0, 0, 0); + + /* search for a already open window for the same drive */ + for(child_wnd=GetNextWindow(Globals.hmdiclient,GW_CHILD); child_wnd; child_wnd=GetNextWindow(child_wnd, GW_HWNDNEXT)) { + ChildWnd* child = (ChildWnd*) GetWindowLong(child_wnd, GWL_USERDATA); + + if (child) { + _tsplitpath(child->root.path, drv2, 0, 0, 0); + + if (!lstrcmpi(drv2, drv1)) { + SendMessage(Globals.hmdiclient, WM_MDIACTIVATE, (WPARAM)child_wnd, 0); + + if (IsMinimized(child_wnd)) + ShowWindow(child_wnd, SW_SHOWNORMAL); + + return TRUE; + } + } + } + + return FALSE; +} + +LRESULT CALLBACK FrameWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case WM_CLOSE: + DestroyWindow(hwnd); + + // clear handle variables + Globals.hMenuFrame = 0; + Globals.hMenuView = 0; + Globals.hMenuOptions = 0; + Globals.hMainWnd = 0; + Globals.hmdiclient = 0; + Globals.hdrivebar = 0; + break; + + case WM_DESTROY: +#ifndef _ROS_ // dont't exit desktop when closing file manager window + PostQuitMessage(0); +#endif + break; + + case WM_COMMAND: { + UINT cmd = LOWORD(wparam); + HWND hwndClient = (HWND) SendMessage(Globals.hmdiclient, WM_MDIGETACTIVE, 0, 0); + + if (SendMessage(hwndClient, WM_DISPATCH_COMMAND, wparam, lparam)) + break; + + if (cmd>=ID_DRIVE_FIRST && cmd<=ID_DRIVE_FIRST+0xFF) { + TCHAR drv[_MAX_DRIVE], path[MAX_PATH]; + ChildWnd* child; + LPCTSTR root = Globals.drives; + int i; + + for(i=cmd-ID_DRIVE_FIRST; i--; root++) + while(*root) + root++; + + if (activate_drive_window(root)) + return 0; + + _tsplitpath(root, drv, 0, 0, 0); + + if (!SetCurrentDirectory(drv)) { + display_error(hwnd, GetLastError()); + return 0; + } + + GetCurrentDirectory(MAX_PATH, path); /*TODO: store last directory per drive */ + child = alloc_child_window(path); + + if (!create_child_window(child)) + free(child); + } else switch(cmd) { + case ID_FILE_EXIT: + PostQuitMessage(0); + break; + + case ID_WINDOW_NEW: { + TCHAR path[MAX_PATH]; + ChildWnd* child; + + GetCurrentDirectory(MAX_PATH, path); + child = alloc_child_window(path); + + if (!create_child_window(child)) + free(child); + break;} + + case ID_WINDOW_CASCADE: + SendMessage(Globals.hmdiclient, WM_MDICASCADE, 0, 0); + break; + + case ID_WINDOW_TILE_HORZ: + SendMessage(Globals.hmdiclient, WM_MDITILE, MDITILE_HORIZONTAL, 0); + break; + + case ID_WINDOW_TILE_VERT: + SendMessage(Globals.hmdiclient, WM_MDITILE, MDITILE_VERTICAL, 0); + break; + + case ID_WINDOW_ARRANGE: + SendMessage(Globals.hmdiclient, WM_MDIICONARRANGE, 0, 0); + break; + + case ID_VIEW_TOOL_BAR: + toggle_child(hwnd, cmd, Globals.htoolbar); + break; + + case ID_VIEW_DRIVE_BAR: + toggle_child(hwnd, cmd, Globals.hdrivebar); + break; + + case ID_VIEW_STATUSBAR: + toggle_child(hwnd, cmd, Globals.hstatusbar); + break; + + case ID_EXECUTE: { + struct ExecuteDialog dlg = {{0}}; + if (DialogBoxParam(Globals.hInstance, MAKEINTRESOURCE(IDD_EXECUTE), hwnd, ExecuteDialogWndProg, (LPARAM)&dlg) == IDOK) { + HINSTANCE hinst = ShellExecute(hwnd, NULL/*operation*/, dlg.cmd/*file*/, NULL/*parameters*/, NULL/*dir*/, dlg.cmdshow); + + if ((int)hinst <= 32) + display_error(hwnd, GetLastError()); + } + break;} + + case ID_HELP: + WinHelp(hwnd, _T("winfile"), HELP_INDEX, 0); + break; + +#ifndef _NO_EXTENSIONS + case ID_VIEW_FULLSCREEN: + CheckMenuItem(Globals.hMenuOptions, cmd, toggle_fullscreen(hwnd)?MF_CHECKED:0); + break; + +#ifdef __linux__ + case ID_DRIVE_UNIX_FS: { + TCHAR path[MAX_PATH]; + ChildWnd* child; + + if (activate_drive_window(_T("/"))) + break; + + getcwd(path, MAX_PATH); + child = alloc_child_window(path); + + if (!create_child_window(child)) + free(child); + break;} +#endif +#endif + + /*TODO: There are even more menu items! */ + +#ifndef _NO_EXTENSIONS +#ifdef _WINE_ + case ID_LICENSE: + WineLicense(Globals.hMainWnd); + break; + + case ID_NO_WARRANTY: + WineWarranty(Globals.hMainWnd); + break; +#endif + + case ID_ABOUT_WINE: + ShellAbout(hwnd, _T("WINE"), _T("Winefile"), 0); + break; + + case ID_ABOUT: //ID_ABOUT_WINE: + ShellAbout(hwnd, _T("Winefile"), NULL, 0); + break; +#endif // _NO_EXTENSIONS + + default: + /*TODO: if (wParam >= PM_FIRST_LANGUAGE && wParam <= PM_LAST_LANGUAGE) + STRING_SelectLanguageByNumber(wParam - PM_FIRST_LANGUAGE); + else */if ((cmd=IDW_FIRST_CHILD+0x100) && + (cmdSC_RESTORE)) + MessageBox(hwnd, _T("Not yet implemented"), _T("Winefile"), MB_OK); + + return DefFrameProc(hwnd, Globals.hmdiclient, nmsg, wparam, lparam); + } + break;} + + case WM_SIZE: + resize_frame(hwnd, LOWORD(lparam), HIWORD(lparam)); + break; /* do not pass message to DefFrameProc */ + +#ifndef _NO_EXTENSIONS + case WM_GETMINMAXINFO: { + LPMINMAXINFO lpmmi = (LPMINMAXINFO)lparam; + + lpmmi->ptMaxTrackSize.x <<= 1;/*2*GetSystemMetrics(SM_CXSCREEN) / SM_CXVIRTUALSCREEN */ + lpmmi->ptMaxTrackSize.y <<= 1;/*2*GetSystemMetrics(SM_CYSCREEN) / SM_CYVIRTUALSCREEN */ + break;} + + case FRM_CALC_CLIENT: + frame_get_clientspace(hwnd, (PRECT)lparam); + return TRUE; +#endif // _NO_EXTENSIONS + + default: + return DefFrameProc(hwnd, Globals.hmdiclient, nmsg, wparam, lparam); + } + + return 0; +} + + +const static LPTSTR g_pos_names[COLUMNS] = { + _T(""), /* symbol */ + _T("Name"), + _T("Size"), + _T("CDate"), +#ifndef _NO_EXTENSIONS + _T("ADate"), + _T("MDate"), + _T("Index/Inode"), + _T("Links"), +#endif // _NO_EXTENSIONS + _T("Attributes"), +#ifndef _NO_EXTENSIONS + _T("Security") +#endif +}; + +const static int g_pos_align[] = { + 0, + HDF_LEFT, /* Name */ + HDF_RIGHT, /* Size */ + HDF_LEFT, /* CDate */ +#ifndef _NO_EXTENSIONS + HDF_LEFT, /* ADate */ + HDF_LEFT, /* MDate */ + HDF_LEFT, /* Index */ + HDF_CENTER, /* Links */ +#endif + HDF_CENTER, /* Attributes */ +#ifndef _NO_EXTENSIONS + HDF_LEFT /* Security */ +#endif +}; + +static void resize_tree(ChildWnd* child, int cx, int cy) +{ + HDWP hdwp = BeginDeferWindowPos(4); + RECT rt; + + rt.left = 0; + rt.top = 0; + rt.right = cx; + rt.bottom = cy; + + cx = child->split_pos + SPLIT_WIDTH/2; + +#ifndef _NO_EXTENSIONS + { + WINDOWPOS wp; + HD_LAYOUT hdl; + + hdl.prc = &rt; + hdl.pwpos = ℘ + + Header_Layout(child->left.hwndHeader, &hdl); + + DeferWindowPos(hdwp, child->left.hwndHeader, wp.hwndInsertAfter, + wp.x-1, wp.y, child->split_pos-SPLIT_WIDTH/2+1, wp.cy, wp.flags); + DeferWindowPos(hdwp, child->right.hwndHeader, wp.hwndInsertAfter, + rt.left+cx+1, wp.y, wp.cx-cx+2, wp.cy, wp.flags); + } +#endif // _NO_EXTENSIONS + + DeferWindowPos(hdwp, child->left.hwnd, 0, rt.left, rt.top, child->split_pos-SPLIT_WIDTH/2-rt.left, rt.bottom-rt.top, SWP_NOZORDER|SWP_NOACTIVATE); + DeferWindowPos(hdwp, child->right.hwnd, 0, rt.left+cx+1, rt.top, rt.right-cx, rt.bottom-rt.top, SWP_NOZORDER|SWP_NOACTIVATE); + + EndDeferWindowPos(hdwp); +} + + +#ifndef _NO_EXTENSIONS + +static HWND create_header(HWND parent, Pane* pane, int id) +{ + HD_ITEM hdi = {HDI_TEXT|HDI_WIDTH|HDI_FORMAT}; + int idx; + + HWND hwnd = CreateWindow(WC_HEADER, 0, WS_CHILD|WS_VISIBLE|HDS_HORZ/*TODO: |HDS_BUTTONS + sort orders*/, + 0, 0, 0, 0, parent, (HMENU)id, Globals.hInstance, 0); + if (!hwnd) + return 0; + + SendMessage(hwnd, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), FALSE); + + for(idx=0; idxwidths[idx]; + Header_InsertItem(hwnd, idx, &hdi); + } + + return hwnd; +} + +#endif // _NO_EXTENSIONS + + +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 void draw_item(Pane* pane, LPDRAWITEMSTRUCT dis, Entry* entry, int calcWidthCol); + + +/* calculate prefered width for all visible columns */ + +static BOOL calc_widths(Pane* pane, BOOL anyway) +{ + int col, x, cx, spc=3*Globals.spaceSize.cx; + int entries = ListBox_GetCount(pane->hwnd); + int orgWidths[COLUMNS]; + int orgPositions[COLUMNS+1]; + HFONT hfontOld; + HDC hdc; + int cnt; + + if (!anyway) { + memcpy(orgWidths, pane->widths, sizeof(orgWidths)); + memcpy(orgPositions, pane->positions, sizeof(orgPositions)); + } + + for(col=0; colwidths[col] = 0; + + hdc = GetDC(pane->hwnd); + hfontOld = SelectFont(hdc, Globals.hfont); + + for(cnt=0; cnthwnd, cnt); + + DRAWITEMSTRUCT dis; + + dis.CtlType = 0; + dis.CtlID = 0; + dis.itemID = 0; + dis.itemAction = 0; + dis.itemState = 0; + dis.hwndItem = pane->hwnd; + dis.hDC = hdc; + dis.rcItem.left = 0; + dis.rcItem.top = 0; + dis.rcItem.right = 0; + dis.rcItem.bottom = 0; + /*dis.itemData = 0; */ + + draw_item(pane, &dis, entry, COLUMNS); + } + + SelectObject(hdc, hfontOld); + ReleaseDC(pane->hwnd, hdc); + + x = 0; + for(col=0; colpositions[col] = x; + cx = pane->widths[col]; + + if (cx) { + cx += spc; + + if (cx < IMAGE_WIDTH) + cx = IMAGE_WIDTH; + + pane->widths[col] = cx; + } + + x += cx; + } + + pane->positions[COLUMNS] = x; + + ListBox_SetHorizontalExtent(pane->hwnd, x); + + /* no change? */ + if (!memcmp(orgWidths, pane->widths, sizeof(orgWidths))) + return FALSE; + + /* don't move, if only collapsing an entry */ + if (!anyway && pane->widths[0]widths+1, sizeof(orgWidths)-sizeof(int))) { + pane->widths[0] = orgWidths[0]; + memcpy(pane->positions, orgPositions, sizeof(orgPositions)); + + return FALSE; + } + + InvalidateRect(pane->hwnd, 0, TRUE); + + return TRUE; +} + + +/* calculate one prefered column width */ + +static void calc_single_width(Pane* pane, int col) +{ + HFONT hfontOld; + int x, cx; + int entries = ListBox_GetCount(pane->hwnd); + int cnt; + HDC hdc; + + pane->widths[col] = 0; + + hdc = GetDC(pane->hwnd); + hfontOld = SelectFont(hdc, Globals.hfont); + + for(cnt=0; cnthwnd, cnt); + DRAWITEMSTRUCT dis; + + dis.CtlType = 0; + dis.CtlID = 0; + dis.itemID = 0; + dis.itemAction = 0; + dis.itemState = 0; + dis.hwndItem = pane->hwnd; + dis.hDC = hdc; + dis.rcItem.left = 0; + dis.rcItem.top = 0; + dis.rcItem.right = 0; + dis.rcItem.bottom = 0; + /*dis.itemData = 0; */ + + draw_item(pane, &dis, entry, col); + } + + SelectObject(hdc, hfontOld); + ReleaseDC(pane->hwnd, hdc); + + cx = pane->widths[col]; + + if (cx) { + cx += 3*Globals.spaceSize.cx; + + if (cx < IMAGE_WIDTH) + cx = IMAGE_WIDTH; + } + + pane->widths[col] = cx; + + x = pane->positions[col] + cx; + + for(; colpositions[++col] = x; + x += pane->widths[col]; + } + + ListBox_SetHorizontalExtent(pane->hwnd, x); +} + + +/* insert listbox entries after index idx */ + +static void insert_entries(Pane* pane, Entry* parent, int idx) +{ + Entry* entry = parent; + + if (!entry) + return; + + ShowWindow(pane->hwnd, SW_HIDE); + + for(; entry; entry=entry->next) { +#ifndef _LEFT_FILES + if (pane->treePane && !(entry->data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)) + continue; +#endif + + /* don't display entries "." and ".." in the left pane */ + if (pane->treePane && (entry->data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) + && entry->data.cFileName[0]==_T('.')) + if ( +#ifndef _NO_EXTENSIONS + entry->data.cFileName[1]==_T('\0') || +#endif + (entry->data.cFileName[1]==_T('.') && entry->data.cFileName[2]==_T('\0'))) + continue; + + if (idx != -1) + idx++; + + ListBox_InsertItemData(pane->hwnd, idx, entry); + + if (pane->treePane && entry->expanded) + insert_entries(pane, entry->down, idx); + } + + ShowWindow(pane->hwnd, SW_SHOW); +} + + +static WNDPROC g_orgTreeWndProc; + +static void create_tree_window(HWND parent, Pane* pane, int id, int id_header) +{ + static int s_init = 0; + Entry* entry = pane->root; + + pane->hwnd = CreateWindow(_T("ListBox"), _T(""), WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL| + LBS_DISABLENOSCROLL|LBS_NOINTEGRALHEIGHT|LBS_OWNERDRAWFIXED|LBS_NOTIFY, + 0, 0, 0, 0, parent, (HMENU)id, Globals.hInstance, 0); + + SetWindowLong(pane->hwnd, GWL_USERDATA, (LPARAM)pane); + g_orgTreeWndProc = SubclassWindow(pane->hwnd, TreeWndProc); + + SendMessage(pane->hwnd, WM_SETFONT, (WPARAM)Globals.hfont, FALSE); + + /* insert entries into listbox */ + if (entry) + insert_entries(pane, entry, -1); + + /* calculate column widths */ + if (!s_init) { + s_init = 1; + init_output(pane->hwnd); + } + + calc_widths(pane, TRUE); + +#ifndef _NO_EXTENSIONS + pane->hwndHeader = create_header(parent, pane, id_header); +#endif +} + + +static void InitChildWindow(ChildWnd* child) +{ + create_tree_window(child->hwnd, &child->left, IDW_TREE_LEFT, IDW_HEADER_LEFT); + create_tree_window(child->hwnd, &child->right, IDW_TREE_RIGHT, IDW_HEADER_RIGHT); +} + + +static void format_date(const FILETIME* ft, TCHAR* buffer, int visible_cols) +{ + SYSTEMTIME systime; + FILETIME lft; + int len = 0; + + *buffer = _T('\0'); + + if (!ft->dwLowDateTime && !ft->dwHighDateTime) + return; + + if (!FileTimeToLocalFileTime(ft, &lft)) + {err: _tcscpy(buffer,_T("???")); return;} + + if (!FileTimeToSystemTime(&lft, &systime)) + goto err; + + if (visible_cols & COL_DATE) { + len = GetDateFormat(LOCALE_USER_DEFAULT, 0, &systime, 0, buffer, BUFFER_LEN); + if (!len) + goto err; + } + + if (visible_cols & COL_TIME) { + if (len) + buffer[len-1] = ' '; + + buffer[len++] = ' '; + + if (!GetTimeFormat(LOCALE_USER_DEFAULT, 0, &systime, 0, buffer+len, BUFFER_LEN-len)) + buffer[len] = _T('\0'); + } +} + + +static void calc_width(Pane* pane, LPDRAWITEMSTRUCT dis, int col, LPCTSTR str) +{ + RECT rt = {0}; + + DrawText(dis->hDC, (LPTSTR)str, -1, &rt, DT_CALCRECT|DT_SINGLELINE|DT_NOPREFIX); + + if (rt.right > pane->widths[col]) + pane->widths[col] = rt.right; +} + +static void calc_tabbed_width(Pane* pane, LPDRAWITEMSTRUCT dis, int col, LPCTSTR str) +{ + RECT rt = {0}; + +/* DRAWTEXTPARAMS dtp = {sizeof(DRAWTEXTPARAMS), 2}; + DrawTextEx(dis->hDC, (LPTSTR)str, -1, &rt, DT_CALCRECT|DT_SINGLELINE|DT_NOPREFIX|DT_EXPANDTABS|DT_TABSTOP, &dtp);*/ + + DrawText(dis->hDC, (LPTSTR)str, -1, &rt, DT_CALCRECT|DT_SINGLELINE|DT_EXPANDTABS|DT_TABSTOP|(2<<8)); + /*FIXME rt (0,0) ??? */ + + if (rt.right > pane->widths[col]) + pane->widths[col] = rt.right; +} + + +static void output_text(Pane* pane, LPDRAWITEMSTRUCT dis, int col, LPCTSTR str, DWORD flags) +{ + int x = dis->rcItem.left; + RECT rt; + + rt.left = x+pane->positions[col]+Globals.spaceSize.cx; + rt.top = dis->rcItem.top; + rt.right = x+pane->positions[col+1]-Globals.spaceSize.cx; + rt.bottom = dis->rcItem.bottom; + + DrawText(dis->hDC, (LPTSTR)str, -1, &rt, DT_SINGLELINE|DT_NOPREFIX|flags); +} + +static void output_tabbed_text(Pane* pane, LPDRAWITEMSTRUCT dis, int col, LPCTSTR str) +{ + int x = dis->rcItem.left; + RECT rt; + + rt.left = x+pane->positions[col]+Globals.spaceSize.cx; + rt.top = dis->rcItem.top; + rt.right = x+pane->positions[col+1]-Globals.spaceSize.cx; + rt.bottom = dis->rcItem.bottom; + +/* DRAWTEXTPARAMS dtp = {sizeof(DRAWTEXTPARAMS), 2}; + DrawTextEx(dis->hDC, (LPTSTR)str, -1, &rt, DT_SINGLELINE|DT_NOPREFIX|DT_EXPANDTABS|DT_TABSTOP, &dtp);*/ + + DrawText(dis->hDC, (LPTSTR)str, -1, &rt, DT_SINGLELINE|DT_EXPANDTABS|DT_TABSTOP|(2<<8)); +} + +static void output_number(Pane* pane, LPDRAWITEMSTRUCT dis, int col, LPCTSTR str) +{ + int x = dis->rcItem.left; + RECT rt; + LPCTSTR s = str; + TCHAR b[128]; + LPTSTR d = b; + int pos; + + rt.left = x+pane->positions[col]+Globals.spaceSize.cx; + rt.top = dis->rcItem.top; + rt.right = x+pane->positions[col+1]-Globals.spaceSize.cx; + rt.bottom = dis->rcItem.bottom; + + if (*s) + *d++ = *s++; + + /* insert number separator characters */ + pos = lstrlen(s) % 3; + + while(*s) + if (pos--) + *d++ = *s++; + else { + *d++ = Globals.num_sep; + pos = 3; + } + + DrawText(dis->hDC, b, d-b, &rt, DT_RIGHT|DT_SINGLELINE|DT_NOPREFIX|DT_END_ELLIPSIS); +} + + +static int is_exe_file(LPCTSTR ext) +{ + const static LPCTSTR executable_extensions[] = { + _T("COM"), + _T("EXE"), + _T("BAT"), + _T("CMD"), +#ifndef _NO_EXTENSIONS + _T("CMM"), + _T("BTM"), + _T("AWK"), +#endif // _NO_EXTENSIONS + 0 + }; + + TCHAR ext_buffer[_MAX_EXT]; + const LPCTSTR* p; + LPCTSTR s; + LPTSTR d; + + for(s=ext+1,d=ext_buffer; (*d=tolower(*s)); s++) + d++; + + for(p=executable_extensions; *p; p++) + if (!_tcscmp(ext_buffer, *p)) + return 1; + + return 0; +} + +static int is_registered_type(LPCTSTR ext) +{ + /* TODO */ + + return 1; +} + + +static void draw_item(Pane* pane, LPDRAWITEMSTRUCT dis, Entry* entry, int calcWidthCol) +{ + TCHAR buffer[BUFFER_LEN]; + DWORD attrs; + int visible_cols = pane->visible_cols; + COLORREF bkcolor, textcolor; + RECT focusRect = dis->rcItem; + HBRUSH hbrush; + enum IMAGE img; + int img_pos, cx; + int col = 0; + + if (entry) { + attrs = entry->data.dwFileAttributes; + + if (attrs & FILE_ATTRIBUTE_DIRECTORY) { + if (entry->data.cFileName[0]==_T('.') && entry->data.cFileName[1]==_T('.') + && entry->data.cFileName[2]==_T('\0')) + img = IMG_FOLDER_UP; +#ifndef _NO_EXTENSIONS + else if (entry->data.cFileName[0]==_T('.') && entry->data.cFileName[1]==_T('\0')) + img = IMG_FOLDER_CUR; +#endif + else if ( +#ifdef _NO_EXTENSIONS + entry->expanded || +#endif + (pane->treePane && (dis->itemState&ODS_FOCUS))) + img = IMG_OPEN_FOLDER; + else + img = IMG_FOLDER; + } else { + LPCTSTR ext = _tcsrchr(entry->data.cFileName, '.'); + if (!ext) + ext = _T(""); + + if (is_exe_file(ext)) + img = IMG_EXECUTABLE; + else if (is_registered_type(ext)) + img = IMG_DOCUMENT; + else + img = IMG_FILE; + } + } else { + attrs = 0; + img = IMG_NONE; + } + + if (pane->treePane) { + if (entry) { + img_pos = dis->rcItem.left + entry->level*(IMAGE_WIDTH+Globals.spaceSize.cx); + + if (calcWidthCol == -1) { + int x; + int y = dis->rcItem.top + IMAGE_HEIGHT/2; + Entry* up; + RECT rt_clip; + HRGN hrgn_org = CreateRectRgn(0, 0, 0, 0); + HRGN hrgn; + + rt_clip.left = dis->rcItem.left; + rt_clip.top = dis->rcItem.top; + rt_clip.right = dis->rcItem.left+pane->widths[col]; + rt_clip.bottom = dis->rcItem.bottom; + + hrgn = CreateRectRgnIndirect(&rt_clip); + + if (!GetClipRgn(dis->hDC, hrgn_org)) { + DeleteObject(hrgn_org); + hrgn_org = 0; + } + + /* HGDIOBJ holdPen = SelectObject(dis->hDC, GetStockObject(BLACK_PEN)); */ + ExtSelectClipRgn(dis->hDC, hrgn, RGN_AND); + DeleteObject(hrgn); + + if ((up=entry->up) != NULL) { + MoveToEx(dis->hDC, img_pos-IMAGE_WIDTH/2, y, 0); + LineTo(dis->hDC, img_pos-2, y); + + x = img_pos - IMAGE_WIDTH/2; + + do { + x -= IMAGE_WIDTH+Globals.spaceSize.cx; + + if (up->next +#ifndef _LEFT_FILES + && (up->next->data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) +#endif + ) { + MoveToEx(dis->hDC, x, dis->rcItem.top, 0); + LineTo(dis->hDC, x, dis->rcItem.bottom); + } + } while((up=up->up) != NULL); + } + + x = img_pos - IMAGE_WIDTH/2; + + MoveToEx(dis->hDC, x, dis->rcItem.top, 0); + LineTo(dis->hDC, x, y); + + if (entry->next +#ifndef _LEFT_FILES + && (entry->next->data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) +#endif + ) + LineTo(dis->hDC, x, dis->rcItem.bottom); + + if (entry->down && entry->expanded) { + x += IMAGE_WIDTH+Globals.spaceSize.cx; + MoveToEx(dis->hDC, x, dis->rcItem.top+IMAGE_HEIGHT, 0); + LineTo(dis->hDC, x, dis->rcItem.bottom); + } + + SelectClipRgn(dis->hDC, hrgn_org); + if (hrgn_org) DeleteObject(hrgn_org); + /* SelectObject(dis->hDC, holdPen); */ + } else if (calcWidthCol==col || calcWidthCol==COLUMNS) { + int right = img_pos + IMAGE_WIDTH - Globals.spaceSize.cx; + + if (right > pane->widths[col]) + pane->widths[col] = right; + } + } else { + img_pos = dis->rcItem.left; + } + } else { + img_pos = dis->rcItem.left; + + if (calcWidthCol==col || calcWidthCol==COLUMNS) + pane->widths[col] = IMAGE_WIDTH; + } + + if (calcWidthCol == -1) { + focusRect.left = img_pos -2; + +#ifdef _NO_EXTENSIONS + if (pane->treePane && entry) { + RECT rt = {0}; + + DrawText(dis->hDC, entry->data.cFileName, -1, &rt, DT_CALCRECT|DT_SINGLELINE|DT_NOPREFIX); + + focusRect.right = dis->rcItem.left+pane->positions[col+1]+Globals.spaceSize.cx + rt.right +2; + } +#else + + if (attrs & FILE_ATTRIBUTE_COMPRESSED) + textcolor = COLOR_COMPRESSED; + else +#endif // _NO_EXTENSIONS + textcolor = RGB(0,0,0); + + if (dis->itemState & ODS_FOCUS) { + textcolor = RGB(255,255,255); + bkcolor = COLOR_SELECTION; + } else { + bkcolor = RGB(255,255,255); + } + + hbrush = CreateSolidBrush(bkcolor); + FillRect(dis->hDC, &focusRect, hbrush); + DeleteObject(hbrush); + + SetBkMode(dis->hDC, TRANSPARENT); + SetTextColor(dis->hDC, textcolor); + + cx = pane->widths[col]; + + if (cx && img!=IMG_NONE) { + if (cx > IMAGE_WIDTH) + cx = IMAGE_WIDTH; + + ImageList_DrawEx(Globals.himl, img, dis->hDC, + img_pos, dis->rcItem.top, cx, + IMAGE_HEIGHT, bkcolor, CLR_DEFAULT, ILD_NORMAL); + } + } + + if (!entry) + return; + +#ifdef _NO_EXTENSIONS + if (img >= IMG_FOLDER_UP) + return; +#endif + + col++; + + /* ouput file name */ + if (calcWidthCol == -1) + output_text(pane, dis, col, entry->data.cFileName, 0); + else if (calcWidthCol==col || calcWidthCol==COLUMNS) + calc_width(pane, dis, col, entry->data.cFileName); + + col++; + +#ifdef _NO_EXTENSIONS + if (!pane->treePane) { +#endif + + /* display file size */ + if (visible_cols & COL_SIZE) { +#ifdef _NO_EXTENSIONS + if (!(attrs&FILE_ATTRIBUTE_DIRECTORY)) +#endif + { + ULONGLONG size; + + size = ((ULONGLONG)entry->data.nFileSizeHigh << 32) | entry->data.nFileSizeLow; + + _stprintf(buffer, _T("%") LONGLONGARG _T("d"), size); + + if (calcWidthCol == -1) + output_number(pane, dis, col, buffer); + else if (calcWidthCol==col || calcWidthCol==COLUMNS) + calc_width(pane, dis, col, buffer);/*TODO: not ever time enough */ + } + + col++; + } + + /* display file date */ + if (visible_cols & (COL_DATE|COL_TIME)) { +#ifndef _NO_EXTENSIONS + format_date(&entry->data.ftCreationTime, buffer, visible_cols); + if (calcWidthCol == -1) + output_text(pane, dis, col, buffer, 0); + else if (calcWidthCol==col || calcWidthCol==COLUMNS) + calc_width(pane, dis, col, buffer); + col++; + + format_date(&entry->data.ftLastAccessTime, buffer, visible_cols); + if (calcWidthCol == -1) + output_text(pane, dis, col, buffer, 0); + else if (calcWidthCol==col || calcWidthCol==COLUMNS) + calc_width(pane, dis, col, buffer); + col++; +#endif // _NO_EXTENSIONS + + format_date(&entry->data.ftLastWriteTime, buffer, visible_cols); + if (calcWidthCol == -1) + output_text(pane, dis, col, buffer, 0); + else if (calcWidthCol==col || calcWidthCol==COLUMNS) + calc_width(pane, dis, col, buffer); + col++; + } + +#ifndef _NO_EXTENSIONS + if (entry->bhfi_valid) { + ULONGLONG index = ((ULONGLONG)entry->bhfi.nFileIndexHigh << 32) | entry->bhfi.nFileIndexLow; + + if (visible_cols & COL_INDEX) { + _stprintf(buffer, _T("%") LONGLONGARG _T("X"), index); + if (calcWidthCol == -1) + output_text(pane, dis, col, buffer, DT_RIGHT); + else if (calcWidthCol==col || calcWidthCol==COLUMNS) + calc_width(pane, dis, col, buffer); + col++; + } + + if (visible_cols & COL_LINKS) { + wsprintf(buffer, _T("%d"), entry->bhfi.nNumberOfLinks); + if (calcWidthCol == -1) + output_text(pane, dis, col, buffer, DT_CENTER); + else if (calcWidthCol==col || calcWidthCol==COLUMNS) + calc_width(pane, dis, col, buffer); + col++; + } + } else + col += 2; +#endif // _NO_EXTENSIONS + + /* show file attributes */ + if (visible_cols & COL_ATTRIBUTES) { +#ifdef _NO_EXTENSIONS + _tcscpy(buffer, _T(" \t \t \t \t ")); +#else + _tcscpy(buffer, _T(" \t \t \t \t \t \t \t \t \t \t \t ")); +#endif + + if (attrs & FILE_ATTRIBUTE_NORMAL) buffer[ 0] = 'N'; + else { + if (attrs & FILE_ATTRIBUTE_READONLY) buffer[ 2] = 'R'; + if (attrs & FILE_ATTRIBUTE_HIDDEN) buffer[ 4] = 'H'; + if (attrs & FILE_ATTRIBUTE_SYSTEM) buffer[ 6] = 'S'; + if (attrs & FILE_ATTRIBUTE_ARCHIVE) buffer[ 8] = 'A'; + if (attrs & FILE_ATTRIBUTE_COMPRESSED) buffer[10] = 'C'; +#ifndef _NO_EXTENSIONS + if (attrs & FILE_ATTRIBUTE_DIRECTORY) buffer[12] = 'D'; + if (attrs & FILE_ATTRIBUTE_ENCRYPTED) buffer[14] = 'E'; + if (attrs & FILE_ATTRIBUTE_TEMPORARY) buffer[16] = 'T'; + if (attrs & FILE_ATTRIBUTE_SPARSE_FILE) buffer[18] = 'P'; + if (attrs & FILE_ATTRIBUTE_REPARSE_POINT) buffer[20] = 'Q'; + if (attrs & FILE_ATTRIBUTE_OFFLINE) buffer[22] = 'O'; + if (attrs & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED) buffer[24] = 'X'; +#endif // _NO_EXTENSIONS + } + + if (calcWidthCol == -1) + output_tabbed_text(pane, dis, col, buffer); + else if (calcWidthCol==col || calcWidthCol==COLUMNS) + calc_tabbed_width(pane, dis, col, buffer); + + col++; + } + +/*TODO + if (flags.security) { + DWORD rights = get_access_mask(); + + tcscpy(buffer, _T(" \t \t \t \t \t \t \t \t \t \t \t ")); + + if (rights & FILE_READ_DATA) buffer[ 0] = 'R'; + if (rights & FILE_WRITE_DATA) buffer[ 2] = 'W'; + if (rights & FILE_APPEND_DATA) buffer[ 4] = 'A'; + if (rights & FILE_READ_EA) {buffer[6] = 'entry'; buffer[ 7] = 'R';} + if (rights & FILE_WRITE_EA) {buffer[9] = 'entry'; buffer[10] = 'W';} + if (rights & FILE_EXECUTE) buffer[12] = 'X'; + if (rights & FILE_DELETE_CHILD) buffer[14] = 'D'; + if (rights & FILE_READ_ATTRIBUTES) {buffer[16] = 'a'; buffer[17] = 'R';} + if (rights & FILE_WRITE_ATTRIBUTES) {buffer[19] = 'a'; buffer[20] = 'W';} + if (rights & WRITE_DAC) buffer[22] = 'C'; + if (rights & WRITE_OWNER) buffer[24] = 'O'; + if (rights & SYNCHRONIZE) buffer[26] = 'S'; + + output_text(dis, col++, buffer, DT_LEFT, 3, psize); + } + + if (flags.description) { + get_description(buffer); + output_text(dis, col++, buffer, 0, psize); + } +*/ + +#ifdef _NO_EXTENSIONS + } + + /* draw focus frame */ + if ((dis->itemState&ODS_FOCUS) && calcWidthCol==-1) { + /* Currently [04/2000] Wine neither behaves exactly the same */ + /* way as WIN 95 nor like Windows NT... */ + HGDIOBJ lastBrush; + HPEN lastPen; + HPEN hpen; + + if (!(GetVersion() & 0x80000000)) { /* Windows NT? */ + LOGBRUSH lb = {PS_SOLID, RGB(255,255,255)}; + hpen = ExtCreatePen(PS_COSMETIC|PS_ALTERNATE, 1, &lb, 0, 0); + } else + hpen = CreatePen(PS_DOT, 0, RGB(255,255,255)); + + lastPen = SelectPen(dis->hDC, hpen); + lastBrush = SelectObject(dis->hDC, GetStockObject(HOLLOW_BRUSH)); + SetROP2(dis->hDC, R2_XORPEN); + Rectangle(dis->hDC, focusRect.left, focusRect.top, focusRect.right, focusRect.bottom); + SelectObject(dis->hDC, lastBrush); + SelectObject(dis->hDC, lastPen); + DeleteObject(hpen); + } +#endif // _NO_EXTENSIONS +} + + +#ifdef _NO_EXTENSIONS + +static void draw_splitbar(HWND hwnd, int x) +{ + RECT rt; + HDC hdc = GetDC(hwnd); + + GetClientRect(hwnd, &rt); + + rt.left = x - SPLIT_WIDTH/2; + rt.right = x + SPLIT_WIDTH/2+1; + + InvertRect(hdc, &rt); + + ReleaseDC(hwnd, hdc); +} + +#endif // _NO_EXTENSIONS + + +#ifndef _NO_EXTENSIONS + +static void set_header(Pane* pane) +{ + HD_ITEM item; + int scroll_pos = GetScrollPos(pane->hwnd, SB_HORZ); + int i=0, x=0; + + item.mask = HDI_WIDTH; + item.cxy = 0; + + for(; x+pane->widths[i]widths[i]; + Header_SetItem(pane->hwndHeader, i, &item); + } + + if (i < COLUMNS) { + x += pane->widths[i]; + item.cxy = x - scroll_pos; + Header_SetItem(pane->hwndHeader, i++, &item); + + for(; iwidths[i]; + x += pane->widths[i]; + Header_SetItem(pane->hwndHeader, i, &item); + } + } +} + +static LRESULT pane_notify(Pane* pane, NMHDR* pnmh) +{ + switch(pnmh->code) { + case HDN_TRACK: + case HDN_ENDTRACK: { + HD_NOTIFY* phdn = (HD_NOTIFY*) pnmh; + int idx = phdn->iItem; + int dx = phdn->pitem->cxy - pane->widths[idx]; + int i; + + RECT clnt; + GetClientRect(pane->hwnd, &clnt); + + /* move immediate to simulate HDS_FULLDRAG (for now [04/2000] not realy needed with WINELIB) */ + Header_SetItem(pane->hwndHeader, idx, phdn->pitem); + + pane->widths[idx] += dx; + + for(i=idx; ++i<=COLUMNS; ) + pane->positions[i] += dx; + + { + int scroll_pos = GetScrollPos(pane->hwnd, SB_HORZ); + RECT rt_scr; + RECT rt_clip; + + rt_scr.left = pane->positions[idx+1]-scroll_pos; + rt_scr.top = 0; + rt_scr.right = clnt.right; + rt_scr.bottom = clnt.bottom; + + rt_clip.left = pane->positions[idx]-scroll_pos; + rt_clip.top = 0; + rt_clip.right = clnt.right; + rt_clip.bottom = clnt.bottom; + + if (rt_scr.left < 0) rt_scr.left = 0; + if (rt_clip.left < 0) rt_clip.left = 0; + + ScrollWindowEx(pane->hwnd, dx, 0, &rt_scr, &rt_clip, 0, 0, SW_INVALIDATE); + + rt_clip.right = pane->positions[idx+1]; + RedrawWindow(pane->hwnd, &rt_clip, 0, RDW_INVALIDATE|RDW_UPDATENOW); + + if (pnmh->code == HDN_ENDTRACK) { + ListBox_SetHorizontalExtent(pane->hwnd, pane->positions[COLUMNS]); + + if (GetScrollPos(pane->hwnd, SB_HORZ) != scroll_pos) + set_header(pane); + } + } + + return FALSE; + } + + case HDN_DIVIDERDBLCLICK: { + HD_NOTIFY* phdn = (HD_NOTIFY*) pnmh; + HD_ITEM item; + + calc_single_width(pane, phdn->iItem); + item.mask = HDI_WIDTH; + item.cxy = pane->widths[phdn->iItem]; + + Header_SetItem(pane->hwndHeader, phdn->iItem, &item); + InvalidateRect(pane->hwnd, 0, TRUE); + break;} + } + + return 0; +} + +#endif // _NO_EXTENSIONS + + +static void scan_entry(ChildWnd* child, Entry* entry) +{ + TCHAR path[MAX_PATH]; + int idx = ListBox_GetCurSel(child->left.hwnd); + HCURSOR crsrOld = SetCursor(LoadCursor(0, IDC_WAIT)); + + /* delete sub entries in left pane */ + for(;;) { + LRESULT res = ListBox_GetItemData(child->left.hwnd, idx+1); + Entry* sub = (Entry*) res; + + if (res==LB_ERR || !sub || sub->level<=entry->level) + break; + + ListBox_DeleteString(child->left.hwnd, idx+1); + } + + /* empty right pane */ + ListBox_ResetContent(child->right.hwnd); + + /* release memory */ + free_entries(entry); + + /* read contents from disk */ + get_path(entry, path); + read_directory(entry, path, child->sortOrder); + + /* insert found entries in right pane */ + insert_entries(&child->right, entry->down, -1); + calc_widths(&child->right, FALSE); +#ifndef _NO_EXTENSIONS + set_header(&child->right); +#endif + + child->header_wdths_ok = FALSE; + + SetCursor(crsrOld); +} + + +/* expand a directory entry */ + +static BOOL expand_entry(ChildWnd* child, Entry* dir) +{ + int idx; + Entry* p; + + if (!dir || dir->expanded || !dir->down) + return FALSE; + + p = dir->down; + + if (p->data.cFileName[0]=='.' && p->data.cFileName[1]=='\0' && p->next) { + p = p->next; + + if (p->data.cFileName[0]=='.' && p->data.cFileName[1]=='.' && + p->data.cFileName[2]=='\0' && p->next) + p = p->next; + } + + /* no subdirectories ? */ + if (!(p->data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)) + return FALSE; + + idx = ListBox_FindItemData(child->left.hwnd, 0, dir); + + dir->expanded = TRUE; + + /* insert entries in left pane */ + insert_entries(&child->left, p, idx); + + if (!child->header_wdths_ok) { + if (calc_widths(&child->left, FALSE)) { +#ifndef _NO_EXTENSIONS + set_header(&child->left); +#endif + + child->header_wdths_ok = TRUE; + } + } + + return TRUE; +} + + +static void collapse_entry(Pane* pane, Entry* dir) +{ + int idx = ListBox_FindItemData(pane->hwnd, 0, dir); + + ShowWindow(pane->hwnd, SW_HIDE); + + /* hide sub entries */ + for(;;) { + LRESULT res = ListBox_GetItemData(pane->hwnd, idx+1); + Entry* sub = (Entry*) res; + + if (res==LB_ERR || !sub || sub->level<=dir->level) + break; + + ListBox_DeleteString(pane->hwnd, idx+1); + } + + dir->expanded = FALSE; + + ShowWindow(pane->hwnd, SW_SHOW); +} + + +static void set_curdir(ChildWnd* child, Entry* entry) +{ + TCHAR path[MAX_PATH]; + + child->left.cur = entry; + child->right.root = entry->down; + child->right.cur = entry; + + if (!entry->scanned) + scan_entry(child, entry); + else { + ListBox_ResetContent(child->right.hwnd); + insert_entries(&child->right, entry->down, -1); + calc_widths(&child->right, FALSE); +#ifndef _NO_EXTENSIONS + set_header(&child->right); +#endif + } + + get_path(entry, path); + lstrcpy(child->path, path); + + if (child->hwnd) /* only change window title, if the window already exists */ + SetWindowText(child->hwnd, path); + + SetCurrentDirectory(path); +} + + +BOOL launch_file(HWND hwnd, LPCTSTR cmd, UINT nCmdShow) +{ + HINSTANCE hinst = ShellExecute(hwnd, NULL/*operation*/, cmd, NULL/*parameters*/, NULL/*dir*/, nCmdShow); + + if ((int)hinst <= 32) { + display_error(hwnd, GetLastError()); + return FALSE; + } + + return TRUE; +} + +#ifdef UNICODE +BOOL launch_fileA(HWND hwnd, LPSTR cmd, UINT nCmdShow) +{ + HINSTANCE hinst = ShellExecuteA(hwnd, NULL/*operation*/, cmd, NULL/*parameters*/, NULL/*dir*/, nCmdShow); + + if ((int)hinst <= 32) { + display_error(hwnd, GetLastError()); + return FALSE; + } + + return TRUE; +} +#endif + + +static void activate_entry(ChildWnd* child, Pane* pane) +{ + Entry* entry = pane->cur; + + if (!entry) + return; + + if (entry->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + int scanned_old = entry->scanned; + + if (!scanned_old) + scan_entry(child, entry); + +#ifndef _NO_EXTENSIONS + if (entry->data.cFileName[0]=='.' && entry->data.cFileName[1]=='\0') + return; +#endif + + if (entry->data.cFileName[0]=='.' && entry->data.cFileName[1]=='.' && entry->data.cFileName[2]=='\0') { + entry = child->left.cur->up; + collapse_entry(&child->left, entry); + goto focus_entry; + } else if (entry->expanded) + collapse_entry(pane, child->left.cur); + else { + expand_entry(child, child->left.cur); + + if (!pane->treePane) focus_entry: { + int idx = ListBox_FindItemData(child->left.hwnd, ListBox_GetCurSel(child->left.hwnd), entry); + ListBox_SetCurSel(child->left.hwnd, idx); + set_curdir(child, entry); + } + } + + if (!scanned_old) { + calc_widths(pane, FALSE); + +#ifndef _NO_EXTENSIONS + set_header(pane); +#endif + } + } else { + TCHAR cmd[MAX_PATH]; + + get_path(entry, cmd); + + /* start program, open document... */ + launch_file(child->hwnd, cmd, SW_SHOWNORMAL); + } +} + + +static BOOL pane_command(Pane* pane, UINT cmd) +{ + switch(cmd) { + case ID_VIEW_NAME: + if (pane->visible_cols) { + pane->visible_cols = 0; + calc_widths(pane, TRUE); +#ifndef _NO_EXTENSIONS + set_header(pane); +#endif + InvalidateRect(pane->hwnd, 0, TRUE); + CheckMenuItem(Globals.hMenuView, ID_VIEW_NAME, MF_BYCOMMAND|MF_CHECKED); + CheckMenuItem(Globals.hMenuView, ID_VIEW_ALL_ATTRIBUTES, MF_BYCOMMAND); + CheckMenuItem(Globals.hMenuView, ID_VIEW_SELECTED_ATTRIBUTES, MF_BYCOMMAND); + } + break; + + case ID_VIEW_ALL_ATTRIBUTES: + if (pane->visible_cols != COL_ALL) { + pane->visible_cols = COL_ALL; + calc_widths(pane, TRUE); +#ifndef _NO_EXTENSIONS + set_header(pane); +#endif + InvalidateRect(pane->hwnd, 0, TRUE); + CheckMenuItem(Globals.hMenuView, ID_VIEW_NAME, MF_BYCOMMAND); + CheckMenuItem(Globals.hMenuView, ID_VIEW_ALL_ATTRIBUTES, MF_BYCOMMAND|MF_CHECKED); + CheckMenuItem(Globals.hMenuView, ID_VIEW_SELECTED_ATTRIBUTES, MF_BYCOMMAND); + } + break; + +#ifndef _NO_EXTENSIONS + case ID_PREFERED_SIZES: { + calc_widths(pane, TRUE); + set_header(pane); + InvalidateRect(pane->hwnd, 0, TRUE); + break;} +#endif + + /* TODO: more command ids... */ + + default: + return FALSE; + } + + return TRUE; +} + + +LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + static int last_split; + + ChildWnd* child = (ChildWnd*) GetWindowLong(hwnd, GWL_USERDATA); + ASSERT(child); + + switch(nmsg) { + case WM_DRAWITEM: { + LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lparam; + Entry* entry = (Entry*) dis->itemData; + + if (dis->CtlID == IDW_TREE_LEFT) + draw_item(&child->left, dis, entry, -1); + else + draw_item(&child->right, dis, entry, -1); + + return TRUE;} + + case WM_CREATE: + InitChildWindow(child); + break; + + case WM_NCDESTROY: + free_child_window(child); + SetWindowLong(hwnd, GWL_USERDATA, 0); + break; + + case WM_PAINT: { + PAINTSTRUCT ps; + HBRUSH lastBrush; + RECT rt; + GetClientRect(hwnd, &rt); + BeginPaint(hwnd, &ps); + rt.left = child->split_pos-SPLIT_WIDTH/2; + rt.right = child->split_pos+SPLIT_WIDTH/2+1; + lastBrush = SelectBrush(ps.hdc, (HBRUSH)GetStockObject(COLOR_SPLITBAR)); + Rectangle(ps.hdc, rt.left, rt.top-1, rt.right, rt.bottom+1); + SelectObject(ps.hdc, lastBrush); +#ifdef _NO_EXTENSIONS + rt.top = rt.bottom - GetSystemMetrics(SM_CYHSCROLL); + FillRect(ps.hdc, &rt, GetStockObject(BLACK_BRUSH)); +#endif + EndPaint(hwnd, &ps); + break;} + + case WM_SETCURSOR: + if (LOWORD(lparam) == HTCLIENT) { + POINT pt; + GetCursorPos(&pt); + ScreenToClient(hwnd, &pt); + + if (pt.x>=child->split_pos-SPLIT_WIDTH/2 && pt.xsplit_pos+SPLIT_WIDTH/2+1) { + SetCursor(LoadCursor(0, IDC_SIZEWE)); + return TRUE; + } + } + goto def; + + case WM_LBUTTONDOWN: { + RECT rt; + int x = LOWORD(lparam); + + GetClientRect(hwnd, &rt); + + if (x>=child->split_pos-SPLIT_WIDTH/2 && xsplit_pos+SPLIT_WIDTH/2+1) { + last_split = child->split_pos; +#ifdef _NO_EXTENSIONS + draw_splitbar(hwnd, last_split); +#endif + SetCapture(hwnd); + } + + break;} + + case WM_LBUTTONUP: + if (GetCapture() == hwnd) { +#ifdef _NO_EXTENSIONS + RECT rt; + int x = LOWORD(lparam); + draw_splitbar(hwnd, last_split); + last_split = -1; + GetClientRect(hwnd, &rt); + child->split_pos = x; + resize_tree(child, rt.right, rt.bottom); +#endif + ReleaseCapture(); + } + break; + +#ifdef _NO_EXTENSIONS + case WM_CAPTURECHANGED: + if (GetCapture()==hwnd && last_split>=0) + draw_splitbar(hwnd, last_split); + break; +#endif + + case WM_KEYDOWN: + if (wparam == VK_ESCAPE) + if (GetCapture() == hwnd) { + RECT rt; +#ifdef _NO_EXTENSIONS + draw_splitbar(hwnd, last_split); +#else + child->split_pos = last_split; +#endif + GetClientRect(hwnd, &rt); + resize_tree(child, rt.right, rt.bottom); + last_split = -1; + ReleaseCapture(); + SetCursor(LoadCursor(0, IDC_ARROW)); + } + break; + + case WM_MOUSEMOVE: + if (GetCapture() == hwnd) { + RECT rt; + int x = LOWORD(lparam); + +#ifdef _NO_EXTENSIONS + HDC hdc = GetDC(hwnd); + GetClientRect(hwnd, &rt); + + rt.left = last_split-SPLIT_WIDTH/2; + rt.right = last_split+SPLIT_WIDTH/2+1; + InvertRect(hdc, &rt); + + last_split = x; + rt.left = x-SPLIT_WIDTH/2; + rt.right = x+SPLIT_WIDTH/2+1; + InvertRect(hdc, &rt); + + ReleaseDC(hwnd, hdc); +#else + GetClientRect(hwnd, &rt); + + if (x>=0 && xsplit_pos = x; + resize_tree(child, rt.right, rt.bottom); + rt.left = x-SPLIT_WIDTH/2; + rt.right = x+SPLIT_WIDTH/2+1; + InvalidateRect(hwnd, &rt, FALSE); + UpdateWindow(child->left.hwnd); + UpdateWindow(hwnd); + UpdateWindow(child->right.hwnd); + } +#endif + } + break; + +#ifndef _NO_EXTENSIONS + case WM_GETMINMAXINFO: + DefMDIChildProc(hwnd, nmsg, wparam, lparam); + + {LPMINMAXINFO lpmmi = (LPMINMAXINFO)lparam; + + lpmmi->ptMaxTrackSize.x <<= 1;/*2*GetSystemMetrics(SM_CXSCREEN) / SM_CXVIRTUALSCREEN */ + lpmmi->ptMaxTrackSize.y <<= 1;/*2*GetSystemMetrics(SM_CYSCREEN) / SM_CYVIRTUALSCREEN */ + break;} +#endif // _NO_EXTENSIONS + + case WM_SETFOCUS: + SetCurrentDirectory(child->path); + SetFocus(child->focus_pane? child->right.hwnd: child->left.hwnd); + break; + + case WM_DISPATCH_COMMAND: { + Pane* pane = GetFocus()==child->left.hwnd? &child->left: &child->right; + + switch(LOWORD(wparam)) { + case ID_WINDOW_NEW: { + ChildWnd* new_child = alloc_child_window(child->path); + + if (!create_child_window(new_child)) + free(new_child); + + break;} + + case ID_REFRESH: + scan_entry(child, pane->cur); + break; + + case ID_ACTIVATE: + activate_entry(child, pane); + break; + + default: + return pane_command(pane, LOWORD(wparam)); + } + + return TRUE;} + + case WM_COMMAND: { + Pane* pane = GetFocus()==child->left.hwnd? &child->left: &child->right; + + switch(HIWORD(wparam)) { + case LBN_SELCHANGE: { + int idx = ListBox_GetCurSel(pane->hwnd); + Entry* entry = (Entry*) ListBox_GetItemData(pane->hwnd, idx); + + if (pane == &child->left) + set_curdir(child, entry); + else + pane->cur = entry; + break;} + + case LBN_DBLCLK: + activate_entry(child, pane); + break; + } + break;} + +#ifndef _NO_EXTENSIONS + case WM_NOTIFY: { + NMHDR* pnmh = (NMHDR*) lparam; + return pane_notify(pnmh->idFrom==IDW_HEADER_LEFT? &child->left: &child->right, pnmh);} +#endif + + case WM_SIZE: + if (wparam != SIZE_MINIMIZED) + resize_tree(child, LOWORD(lparam), HIWORD(lparam)); + /* fall through */ + + default: def: + return DefMDIChildProc(hwnd, nmsg, wparam, lparam); + } + + return 0; +} + + +LRESULT CALLBACK TreeWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + ChildWnd* child = (ChildWnd*) GetWindowLong(GetParent(hwnd), GWL_USERDATA); + Pane* pane = (Pane*) GetWindowLong(hwnd, GWL_USERDATA); + ASSERT(child); + + switch(nmsg) { +#ifndef _NO_EXTENSIONS + case WM_HSCROLL: + set_header(pane); + break; +#endif + + case WM_SETFOCUS: + child->focus_pane = pane==&child->right? 1: 0; + ListBox_SetSel(hwnd, TRUE, 1); + /*TODO: check menu items */ + break; + + case WM_KEYDOWN: + if (wparam == VK_TAB) { + /*TODO: SetFocus(Globals.hdrivebar) */ + SetFocus(child->focus_pane? child->left.hwnd: child->right.hwnd); + } + } + + return CallWindowProc(g_orgTreeWndProc, hwnd, nmsg, wparam, lparam); +} + + +static void InitInstance(HINSTANCE hinstance) +{ + WNDCLASSEX wcFrame; + WNDCLASS wcChild; + ATOM hChildClass; + + INITCOMMONCONTROLSEX icc = { + sizeof(INITCOMMONCONTROLSEX), + ICC_BAR_CLASSES + }; + + HDC hdc = GetDC(0); + + InitCommonControlsEx(&icc); + + wcFrame.cbSize = sizeof(WNDCLASSEX); + wcFrame.style = 0; + wcFrame.lpfnWndProc = FrameWndProc; + wcFrame.cbClsExtra = 0; + wcFrame.cbWndExtra = 0; + wcFrame.hInstance = hinstance; + wcFrame.hIcon = LoadIcon(hinstance, + MAKEINTRESOURCE(IDI_WINEFILE)); + wcFrame.hCursor = LoadCursor(0, IDC_ARROW); + wcFrame.hbrBackground = 0; + wcFrame.lpszMenuName = 0; + wcFrame.lpszClassName = WINEFILEFRAME; + wcFrame.hIconSm = (HICON)LoadImage(hinstance, + MAKEINTRESOURCE(IDI_WINEFILE), + IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), + LR_SHARED); + + /* register frame window class */ + Globals.hframeClass = RegisterClassEx(&wcFrame); + + wcChild.style = CS_CLASSDC|CS_DBLCLKS|CS_VREDRAW; + wcChild.lpfnWndProc = ChildWndProc; + wcChild.cbClsExtra = 0; + wcChild.cbWndExtra = 0; + wcChild.hInstance = hinstance; + wcChild.hIcon = 0; + wcChild.hCursor = LoadCursor(0, IDC_ARROW); + wcChild.hbrBackground = 0; + wcChild.lpszMenuName = 0; + wcChild.lpszClassName = WINEFILETREE; + + /* register tree windows class */ + hChildClass = RegisterClass(&wcChild); + + Globals.haccel = LoadAccelerators(hinstance, MAKEINTRESOURCE(IDA_WINEFILE)); + + Globals.hfont = CreateFont(-MulDiv(8,GetDeviceCaps(hdc,LOGPIXELSY),72), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _T("MS Sans Serif")); + + ReleaseDC(0, hdc); + + Globals.hInstance = hinstance; +} + + +void ShowFileMgr(HWND hWndParent, int cmdshow) +{ + TCHAR path[MAX_PATH]; + ChildWnd* child; + HMENU hMenuFrame, hMenuWindow; + + CLIENTCREATESTRUCT ccs; + + if (Globals.hMainWnd) + return; + + hMenuFrame = LoadMenu(Globals.hInstance, MAKEINTRESOURCE(IDM_WINEFILE)); + hMenuWindow = GetSubMenu(hMenuFrame, GetMenuItemCount(hMenuFrame)-2); + + Globals.hMenuFrame = hMenuFrame; + Globals.hMenuView = GetSubMenu(hMenuFrame, 3); + Globals.hMenuOptions = GetSubMenu(hMenuFrame, 4); + + ccs.hWindowMenu = hMenuWindow; + ccs.idFirstChild = IDW_FIRST_CHILD; + + + /* create main window */ + Globals.hMainWnd = CreateWindowEx(0, (LPCTSTR)(int)Globals.hframeClass, _T("Wine File"), WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + hWndParent, Globals.hMenuFrame, Globals.hInstance, 0/*lpParam*/); + + + Globals.hmdiclient = CreateWindowEx(0, _T("MDICLIENT"), NULL, + WS_CHILD|WS_CLIPCHILDREN|WS_VSCROLL|WS_HSCROLL|WS_VISIBLE|WS_BORDER, + 0, 0, 0, 0, + Globals.hMainWnd, 0, Globals.hInstance, &ccs); + + + { + TBBUTTON drivebarBtn = {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP}; + int btn = 1; + PTSTR p; + + Globals.hdrivebar = CreateToolbarEx(Globals.hMainWnd, WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST, + IDW_DRIVEBAR, 2, Globals.hInstance, IDB_DRIVEBAR, &drivebarBtn, + 1, 16, 13, 16, 13, sizeof(TBBUTTON)); + CheckMenuItem(Globals.hMenuOptions, ID_VIEW_DRIVE_BAR, MF_BYCOMMAND|MF_CHECKED); + + GetLogicalDriveStrings(BUFFER_LEN, Globals.drives); + + drivebarBtn.fsStyle = TBSTYLE_BUTTON; + +#ifndef _NO_EXTENSIONS +#ifdef __linux__ + /* insert unix file system button */ + SendMessage(Globals.hdrivebar, TB_ADDSTRING, 0, (LPARAM)_T("/\0")); + + drivebarBtn.idCommand = ID_DRIVE_UNIX_FS; + SendMessage(Globals.hdrivebar, TB_INSERTBUTTON, btn++, (LPARAM)&drivebarBtn); + drivebarBtn.iString++; +#endif + + /* register windows drive root strings */ + SendMessage(Globals.hdrivebar, TB_ADDSTRING, 0, (LPARAM)Globals.drives); +#endif + + drivebarBtn.idCommand = ID_DRIVE_FIRST; + + for(p=Globals.drives; *p; ) { +#ifdef _NO_EXTENSIONS + /* insert drive letter */ + TCHAR b[3] = {tolower(*p)}; + SendMessage(Globals.hdrivebar, TB_ADDSTRING, 0, (LPARAM)b); +#endif + switch(GetDriveType(p)) { + case DRIVE_REMOVABLE: drivebarBtn.iBitmap = 1; break; + case DRIVE_CDROM: drivebarBtn.iBitmap = 3; break; + case DRIVE_REMOTE: drivebarBtn.iBitmap = 4; break; + case DRIVE_RAMDISK: drivebarBtn.iBitmap = 5; break; + default:/*DRIVE_FIXED*/ drivebarBtn.iBitmap = 2; + } + + SendMessage(Globals.hdrivebar, TB_INSERTBUTTON, btn++, (LPARAM)&drivebarBtn); + drivebarBtn.idCommand++; + drivebarBtn.iString++; + + while(*p++); + } + } + + { + TBBUTTON toolbarBtns[] = { + {0, 0, 0, TBSTYLE_SEP}, + {0, ID_WINDOW_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON}, + {1, ID_WINDOW_CASCADE, TBSTATE_ENABLED, TBSTYLE_BUTTON}, + {2, ID_WINDOW_TILE_HORZ, TBSTATE_ENABLED, TBSTYLE_BUTTON}, + {3, ID_WINDOW_TILE_VERT, TBSTATE_ENABLED, TBSTYLE_BUTTON}, + {4, 2/*TODO: ID_...*/, TBSTATE_ENABLED, TBSTYLE_BUTTON}, + {5, 2/*TODO: ID_...*/, TBSTATE_ENABLED, TBSTYLE_BUTTON}, + }; + + Globals.htoolbar = CreateToolbarEx(Globals.hMainWnd, WS_CHILD|WS_VISIBLE, + IDW_TOOLBAR, 2, Globals.hInstance, IDB_TOOLBAR, toolbarBtns, + sizeof(toolbarBtns)/sizeof(TBBUTTON), 16, 15, 16, 15, sizeof(TBBUTTON)); + CheckMenuItem(Globals.hMenuOptions, ID_VIEW_TOOL_BAR, MF_BYCOMMAND|MF_CHECKED); + } + + Globals.hstatusbar = CreateStatusWindow(WS_CHILD|WS_VISIBLE, 0, Globals.hMainWnd, IDW_STATUSBAR); + CheckMenuItem(Globals.hMenuOptions, ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED); + +/* CreateStatusWindow does not accept WS_BORDER + Globals.hstatusbar = CreateWindowEx(WS_EX_NOPARENTNOTIFY, STATUSCLASSNAME, 0, + WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_BORDER|CCS_NODIVIDER, 0,0,0,0, + Globals.hMainWnd, (HMENU)IDW_STATUSBAR, hinstance, 0);*/ + + /*TODO: read paths and window placements from registry */ + GetCurrentDirectory(MAX_PATH, path); + child = alloc_child_window(path); + + child->pos.showCmd = SW_SHOWMAXIMIZED; + child->pos.rcNormalPosition.left = 0; + child->pos.rcNormalPosition.top = 0; + child->pos.rcNormalPosition.right = 320; + child->pos.rcNormalPosition.bottom = 280; + + if (!create_child_window(child)) + free(child); + + SetWindowPlacement(child->hwnd, &child->pos); + + Globals.himl = ImageList_LoadBitmap(Globals.hInstance, MAKEINTRESOURCE(IDB_IMAGES), 16, 0, RGB(0,255,0)); + + Globals.prescan_node = FALSE; + + ShowWindow(Globals.hMainWnd, cmdshow); + UpdateWindow(Globals.hMainWnd); +} + +void ExitInstance() +{ + ImageList_Destroy(Globals.himl); +} + + +#ifdef _NO_EXTENSIONS + +/* search for already running win[e]files */ + +static int g_foundPrevInstance = 0; + +static BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lparam) +{ + TCHAR cls[128]; + + GetClassName(hwnd, cls, 128); + + if (!lstrcmp(cls, (LPCTSTR)lparam)) { + g_foundPrevInstance++; + return FALSE; + } + + return TRUE; +} + +#endif + + +int winefile_main(HINSTANCE hinstance, HWND hwndParent, int cmdshow) +{ + MSG msg; + + InitInstance(hinstance); + +#ifndef _ROS_ // don't maximize if being called from the ROS desktop + if (cmdshow == SW_SHOWNORMAL) + /*TODO: read window placement from registry */ + cmdshow = SW_MAXIMIZE; +#endif + + ShowFileMgr(hwndParent, cmdshow); + + while(GetMessage(&msg, 0, 0, 0)) { + if (Globals.hmdiclient && TranslateMDISysAccel(Globals.hmdiclient, &msg)) + continue; + + if (Globals.hMainWnd && TranslateAccelerator(Globals.hMainWnd, Globals.haccel, &msg)) + continue; + + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + ExitInstance(); + + return msg.wParam; +} + + +#ifndef _ROS_ + +int APIENTRY WinMain(HINSTANCE hinstance, + HINSTANCE previnstance, + LPSTR cmdline, + int cmdshow) +{ +#ifdef _NO_EXTENSIONS + /* allow only one running instance */ + EnumWindows(EnumWndProc, (LPARAM)WINEFILEFRAME); + + if (g_foundPrevInstance) + return 1; +#endif + + winefile_main(hinstance, 0, cmdshow); + + return 0; +} + +#endif diff --git a/reactos/subsys/system/explorer/winefile.dsw b/reactos/subsys/system/explorer/winefile.dsw new file mode 100644 index 00000000000..1903a7a7546 --- /dev/null +++ b/reactos/subsys/system/explorer/winefile.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "WineFile"=.\WineFile.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/reactos/subsys/system/explorer/winefile.rc b/reactos/subsys/system/explorer/winefile.rc new file mode 100644 index 00000000000..117d2e95df0 --- /dev/null +++ b/reactos/subsys/system/explorer/winefile.rc @@ -0,0 +1,31 @@ +/* + * Copyright 2000 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 + */ + +#include "windows.h" +#include "include/resource.h" + +/* define language neutral resources */ + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +#include "resource.rc" + +/* include localised resources */ + +#include "De.rc" +#include "En.rc"