diff --git a/reactos/subsys/system/explorer/desktop/desktop.cpp b/reactos/subsys/system/explorer/desktop/desktop.cpp index 75bb0ed9213..0a11cfd30cc 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.cpp +++ b/reactos/subsys/system/explorer/desktop/desktop.cpp @@ -481,9 +481,9 @@ LRESULT DesktopWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) HRESULT DesktopWindow::OnDefaultCommand(LPIDA pida) { - if (MainFrame::OpenShellFolders(pida, 0)) +/*@@ if (SDIMainFrame::OpenShellFolders(pida, 0)) return S_OK; - +*/ return E_NOTIMPL; } diff --git a/reactos/subsys/system/explorer/explorer-jp.rc b/reactos/subsys/system/explorer/explorer-jp.rc index c9590af0c47..04da4647358 100644 --- a/reactos/subsys/system/explorer/explorer-jp.rc +++ b/reactos/subsys/system/explorer/explorer-jp.rc @@ -1,17 +1,4 @@ -// =Memo for future Japanese maintainer= -// For future ease of maintenance, I marked "FIXME?" on strings I suspect I have -// mistranslated or I haven't translated(especially, "IDM_WINEFILE" have many -// suspected strings because I haven't tested under WINE). Others are set as is in -// purpose. BTW, I feel it strange that the word;"directory" turns into "folder" for -// Japanese Windows(..or English Windows also use "folder" instead of "directory"? I -// have no idea). I obeyed as the MS do. Also, there might be some menus which have -// different shortcut keys between EN-Win and JA-Win but I dunno which ones are =D -// Despite I'm not sure that we can use "MS UI Gothic" under ROS, I changed "MS Sans -// Serif" to "MS UI Gothic" because it's lear that MS Sans Serif doesn't suit for -// the Japanese(most of you know this, I suppose). -// - M.T - -//Microsoft Developer Studio generated resource script. +// Microsoft Visual C++ generated resource script. // #include "explorer_intres.h" @@ -26,7 +13,7 @@ #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// Japanese resources +// Japanisch resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) #ifdef _WIN32 @@ -39,7 +26,7 @@ LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT // Menu // -IDM_MAINFRAME MENU PRELOAD DISCARDABLE +IDM_MDIFRAME MENU BEGIN POPUP "ファイル(&F)" BEGIN @@ -49,6 +36,7 @@ BEGIN BEGIN MENUITEM "ツールバー(&T)", ID_VIEW_TOOL_BAR MENUITEM "ステータスバー(&S)", ID_VIEW_STATUSBAR + MENUITEM "最新の情報に更新(&R)\tF5", ID_REFRESH END POPUP "ウィンドウ(&W)" BEGIN @@ -58,7 +46,6 @@ BEGIN MENUITEM "垂直に整列(&V)\tShift+F4", ID_WINDOW_TILE_VERT MENUITEM "自動整列", ID_WINDOW_AUTOSORT MENUITEM "最小化された子ウィンドウを整列(&S)", ID_WINDOW_ARRANGE - MENUITEM "最新の情報に更新(&R)\tF5", ID_REFRESH END POPUP "ヘルプ(&H)" BEGIN @@ -68,7 +55,7 @@ BEGIN END END -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU BEGIN POPUP "ファイル(&F)" BEGIN @@ -178,7 +165,7 @@ BEGIN END END -IDM_DESKTOPBAR MENU DISCARDABLE +IDM_DESKTOPBAR MENU BEGIN POPUP "" BEGIN @@ -189,14 +176,34 @@ BEGIN END END +IDM_SDIFRAME MENU +BEGIN + POPUP "ファイル(&F)" + BEGIN + MENUITEM "終了(&X)", ID_FILE_EXIT + END + POPUP "表\示(&V)" + BEGIN + MENUITEM "ツールバー(&T)", ID_VIEW_TOOL_BAR + MENUITEM "ステータスバー(&S)", ID_VIEW_STATUSBAR + MENUITEM "最新の情報に更新(&R)\tF5", ID_REFRESH + END + POPUP "ヘルプ(&H)" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER + MENUITEM "About &OS...", ID_ABOUT_WINDOWS + END +END + ///////////////////////////////////////////////////////////////////////////// // // Dialog // -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +IDD_EXECUTE DIALOG 15, 13, 210, 63 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Execute" FONT 8, "MS UI Gothic" BEGIN @@ -212,8 +219,8 @@ BEGIN END IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 144, 65 -STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME +STYLE DS_SETFONT | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | + WS_CAPTION | WS_SYSMENU | WS_THICKFRAME EXSTYLE WS_EX_APPWINDOW CAPTION "スタートメニューからプログラムを検索" FONT 9, "MS UI Gothic", 0, 0, 0x1 @@ -225,8 +232,8 @@ BEGIN WS_TABSTOP,7,25,130,33 END -IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 172 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +IDD_DESKBAR_DESKTOP DIALOG 0, 0, 212, 172 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "デスクトップのプロパティ" FONT 9, "MS UI Gothic" BEGIN @@ -258,15 +265,15 @@ BEGIN WS_TABSTOP,159,121,46,44 END -IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 154 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +IDD_DESKBAR_TASKBAR DIALOG 0, 0, 210, 154 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "タスクバーのプロパティ" FONT 9, "MS UI Gothic" BEGIN END -IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 154 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +IDD_DESKBAR_STARTMENU DIALOG 0, 0, 210, 154 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "スタートメニューのプロパティ" FONT 9, "MS UI Gothic" BEGIN @@ -278,7 +285,7 @@ END // String Table // -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN IDS_TITLE "ReactOS Explorer" IDS_START "スタート" @@ -297,7 +304,7 @@ BEGIN IDS_ADMIN "管理ツール" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN IDS_NETWORK "ネットワーク" IDS_CONNECTIONS "ネットワーク接続" @@ -318,18 +325,18 @@ BEGIN IDS_TASKBAR "タスクバー" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN IDS_STARTMENU "スタートメニュー" IDS_MINIMIZE_ALL "全ウィンドウを最小化" END -#endif // Japanese resources +#endif // Japanisch resources ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// -// German (Germany) resources +// Deutsch (Deutschland) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) #ifdef _WIN32 @@ -343,18 +350,18 @@ LANGUAGE LANG_GERMAN, SUBLANG_GERMAN // TEXTINCLUDE // -1 TEXTINCLUDE DISCARDABLE +1 TEXTINCLUDE BEGIN "explorer_intres.h\0" END -2 TEXTINCLUDE DISCARDABLE +2 TEXTINCLUDE BEGIN "#include \r\n" "\0" END -3 TEXTINCLUDE DISCARDABLE +3 TEXTINCLUDE BEGIN "\r\n" "\0" @@ -362,7 +369,7 @@ END #endif // APSTUDIO_INVOKED -#endif // German (Germany) resources +#endif // Deutsch (Deutschland) resources ///////////////////////////////////////////////////////////////////////////// @@ -376,3 +383,4 @@ END ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED + diff --git a/reactos/subsys/system/explorer/explorer.cpp b/reactos/subsys/system/explorer/explorer.cpp index fb55a7c808c..5bd8f2273e4 100644 --- a/reactos/subsys/system/explorer/explorer.cpp +++ b/reactos/subsys/system/explorer/explorer.cpp @@ -535,31 +535,7 @@ void explorer_show_frame(int cmdshow, LPTSTR lpCmdLine) g_Globals._prescan_nodes = false; // create main window - HWND hMainFrame = MainFrame::Create(); - - if (hMainFrame) { - g_Globals._hMainWnd = hMainFrame; - - ShowWindow(hMainFrame, cmdshow); - UpdateWindow(hMainFrame); - - bool valid_dir = false; - - if (lpCmdLine) { - DWORD attribs = GetFileAttributes(lpCmdLine); - - if (attribs!=INVALID_FILE_ATTRIBUTES && (attribs&FILE_ATTRIBUTE_DIRECTORY)) - valid_dir = true; - else if (*lpCmdLine==':' || *lpCmdLine=='"') - valid_dir = true; - } - - // Open the first child window after initializing the application - if (valid_dir) - PostMessage(hMainFrame, PM_OPEN_WINDOW, 0, (LPARAM)lpCmdLine); - else - PostMessage(hMainFrame, PM_OPEN_WINDOW, OWM_EXPLORE|OWM_DETAILS, 0); - } + MainFrameBase::Create(lpCmdLine, true, cmdshow); } diff --git a/reactos/subsys/system/explorer/explorer.h b/reactos/subsys/system/explorer/explorer.h index be9719bf3db..4531393b92c 100644 --- a/reactos/subsys/system/explorer/explorer.h +++ b/reactos/subsys/system/explorer/explorer.h @@ -65,7 +65,7 @@ #define CLASSNAME_WINEFILETREE TEXT("WFS_Tree") -#include "shell/mainframe.h" #include "shell/pane.h" #include "shell/filechild.h" #include "shell/shellbrowser.h" +#include "shell/mainframe.h" diff --git a/reactos/subsys/system/explorer/explorer_intres.h b/reactos/subsys/system/explorer/explorer_intres.h index 666ed944e7d..1e9a4e0b1d1 100644 --- a/reactos/subsys/system/explorer/explorer_intres.h +++ b/reactos/subsys/system/explorer/explorer_intres.h @@ -56,9 +56,10 @@ #define IDB_IMAGES 107 #define IDD_EXECUTE 108 #define IDR_MAINFRAME 109 -#define IDM_MAINFRAME 110 +#define IDM_MDIFRAME 110 #define ID_EXECUTE 111 #define IDM_WINEFILE 112 +#define IDM_SDIFRAME 113 #define IDI_LOGOFF 124 #define IDI_FOLDERARROW 125 #define IDI_ARROW 125 @@ -164,11 +165,11 @@ #define ID_ABOUT_WINDOWS 40002 #define ID_ABOUT_EXPLORER 40003 #define ID_DESKTOPBAR_SETTINGS 40004 -#define ID_GO_BACK 40005 -#define ID_GO_FORWARD 40006 -#define ID_GO_HOME 40007 -#define ID_GO_SEARCH 40008 -#define ID_GO_UP 40009 +#define ID_GO_BACK 40005 +#define ID_GO_FORWARD 40006 +#define ID_GO_HOME 40007 +#define ID_GO_SEARCH 40008 +#define ID_GO_UP 40009 #define ID_STOP 40010 #define ID_MINIMIZE_ALL 40011 #define ID_EXPLORE 40012 @@ -178,6 +179,8 @@ #define ID_SHOW_HIDDEN_ICONS 40016 #define ID_CONFIG_NOTIFYAREA 40017 #define ID_CONFIG_TIME 40018 +#define ID_VIEW_MDI 40019 +#define ID_VIEW_SDI 40020 #define ID_SWITCH_DESKTOP_1 50000 #define ID_WINDOW_NEW 0xE130 #define ID_WINDOW_ARRANGE 0xE131 @@ -196,7 +199,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 166 -#define _APS_NEXT_COMMAND_VALUE 40019 +#define _APS_NEXT_COMMAND_VALUE 40021 #define _APS_NEXT_CONTROL_VALUE 1029 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/reactos/subsys/system/explorer/explorer_intres.rc b/reactos/subsys/system/explorer/explorer_intres.rc index 5222c1f0ba3..52c550ed81e 100644 --- a/reactos/subsys/system/explorer/explorer_intres.rc +++ b/reactos/subsys/system/explorer/explorer_intres.rc @@ -37,7 +37,7 @@ BEGIN END END -IDM_MAINFRAME MENU PRELOAD DISCARDABLE +IDM_MDIFRAME MENU PRELOAD DISCARDABLE BEGIN POPUP "ホトシ(&F)" BEGIN @@ -51,7 +51,9 @@ BEGIN MENUITEM "イ牾゚タク(&S)", ID_VIEW_SIDE_BAR MENUITEM "ラエフャタク(&S)", ID_VIEW_STATUSBAR MENUITEM SEPARATOR + MENUITEM "ヒ「ミツ(&R)\tF5", ID_REFRESH MENUITEM "ネォニチ(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&SDI", ID_VIEW_SDI END POPUP "エーソレ(&W)" BEGIN @@ -61,7 +63,30 @@ BEGIN MENUITEM "ランマニスニフ(&V)\tShift+F4", ID_WINDOW_TILE_VERT MENUITEM "ラヤカッナナチミ(&A)", ID_WINDOW_AUTOSORT MENUITEM "ネォイソラミ。サッ(&S)", ID_WINDOW_ARRANGE + END + POPUP "ーヨ(&H)" + BEGIN + MENUITEM "莟タタニーヨホトオオ(&F)...", ID_EXPLORER_FAQ + MENUITEM "ケリモレ莟タタニ(&A)...", ID_ABOUT_EXPLORER + MENUITEM "ケリモレイルラマオヘウ(&O)...", ID_ABOUT_WINDOWS + END +END + +IDM_SDIFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "ホトシ(&F)" + BEGIN + MENUITEM "ヘヒウ(&X)", ID_FILE_EXIT + END + POPUP "イ鯀エ(&V)" + BEGIN + MENUITEM "ケ、セ゚タク(&T)", ID_VIEW_TOOL_BAR + MENUITEM "イ牾゚タク(&S)", ID_VIEW_SIDE_BAR + MENUITEM "ラエフャタク(&S)", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR MENUITEM "ヒ「ミツ(&R)\tF5", ID_REFRESH + MENUITEM "ネォニチ(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI END POPUP "ーヨ(&H)" BEGIN @@ -311,7 +336,7 @@ STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME EXSTYLE WS_EX_APPWINDOW CAPTION "ヤレソェハシイヒオ・ヒムヒウフミ" -FONT 8, "MS Sans Serif" +FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN LTEXT "&Filter:",IDC_STATIC,7,9,18,8 EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL @@ -417,7 +442,7 @@ LANGUAGE LANG_ROMANIAN, SUBLANG_DEFAULT // Menu // -IDM_MAINFRAME MENU PRELOAD DISCARDABLE +IDM_MDIFRAME MENU PRELOAD DISCARDABLE BEGIN POPUP "&Fiコier" BEGIN @@ -431,7 +456,9 @@ BEGIN MENUITEM "&Bara de stare", ID_VIEW_STATUSBAR MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR MENUITEM SEPARATOR + MENUITEM "&Resetare\tF5", ID_REFRESH MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&SDI", ID_VIEW_SDI END POPUP "&Fereastr" BEGIN @@ -441,7 +468,30 @@ BEGIN MENUITEM "Aliniaz &Vertical\tShift+F4", ID_WINDOW_TILE_VERT MENUITEM "Aranjeaz automat", ID_WINDOW_AUTOSORT MENUITEM "Aranjeaz &Simbolurile", ID_WINDOW_ARRANGE + END + POPUP "&Ajutor" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&Despre Explorer...", ID_ABOUT_EXPLORER + MENUITEM "Despre &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_SDIFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "&Fiコier" + BEGIN + MENUITEM "&Ieコire", ID_FILE_EXIT + END + POPUP "&Prezentare" + BEGIN + MENUITEM "&Bara cu instrumente", ID_VIEW_TOOL_BAR + MENUITEM "&Bara de stare", ID_VIEW_STATUSBAR + MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR + MENUITEM SEPARATOR MENUITEM "&Resetare\tF5", ID_REFRESH + MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI END POPUP "&Ajutor" BEGIN @@ -708,7 +758,7 @@ BEGIN END END -IDM_MAINFRAME MENU PRELOAD DISCARDABLE +IDM_MDIFRAME MENU PRELOAD DISCARDABLE BEGIN POPUP "&Datei" BEGIN @@ -719,10 +769,12 @@ BEGIN MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR MENUITEM "Lauf&werkleiste", ID_VIEW_DRIVE_BAR, CHECKED - MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR MENUITEM "&Status Bar", ID_VIEW_STATUSBAR MENUITEM SEPARATOR + MENUITEM "&Aktualisieren\tF5", ID_REFRESH MENUITEM "&Vollbild\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&SDI", ID_VIEW_SDI END POPUP "&Fenster" BEGIN @@ -732,9 +784,32 @@ BEGIN MENUITEM "&Nebeneinander\tUmschalt+F4", ID_WINDOW_TILE_VERT MENUITEM "au&tomatisch anordnen", ID_WINDOW_AUTOSORT MENUITEM "&Symbole anordnen", ID_WINDOW_ARRANGE - MENUITEM "&Aktualisieren\tF5", ID_REFRESH END - POPUP "&Help" + POPUP "&Hilfe" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER + MENUITEM "About &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_SDIFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "&Datei" + BEGIN + MENUITEM "&Beenden", ID_FILE_EXIT + END + POPUP "&Ansicht" + BEGIN + MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR + MENUITEM "&Status Bar", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Aktualisieren\tF5", ID_REFRESH + MENUITEM "&Vollbild\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Hilfe" BEGIN MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER @@ -778,6 +853,25 @@ BEGIN END +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_ABOUT_EXPLORER, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 189 + TOPMARGIN, 7 + BOTTOMMARGIN, 102 + END +END +#endif // APSTUDIO_INVOKED + + ///////////////////////////////////////////////////////////////////////////// // // Bitmap @@ -854,25 +948,6 @@ IDI_DOT ICON DISCARDABLE "res/dot.ico" IDI_DOT_TRANS ICON DISCARDABLE "res/dot_trans.ico" IDI_DOT_RED ICON DISCARDABLE "res/dot_red.ico" -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_ABOUT_EXPLORER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 189 - TOPMARGIN, 7 - BOTTOMMARGIN, 102 - END -END -#endif // APSTUDIO_INVOKED - - ///////////////////////////////////////////////////////////////////////////// // // String Table @@ -951,7 +1026,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // Menu // -IDM_MAINFRAME MENU PRELOAD DISCARDABLE +IDM_MDIFRAME MENU PRELOAD DISCARDABLE BEGIN POPUP "&File" BEGIN @@ -965,7 +1040,9 @@ BEGIN MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR MENUITEM "&Status Bar", ID_VIEW_STATUSBAR MENUITEM SEPARATOR + MENUITEM "&Refresh\tF5", ID_REFRESH MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&SDI", ID_VIEW_SDI END POPUP "&Window" BEGIN @@ -975,7 +1052,30 @@ BEGIN MENUITEM "Tile &Vertically\tShift+F4", ID_WINDOW_TILE_VERT MENUITEM "Arrange Automatically", ID_WINDOW_AUTOSORT MENUITEM "Arrange &Symbols", ID_WINDOW_ARRANGE + END + POPUP "&Help" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER + MENUITEM "About &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_SDIFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "E&xit", ID_FILE_EXIT + END + POPUP "&View" + BEGIN + MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR + MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR + MENUITEM "&Status Bar", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR MENUITEM "&Refresh\tF5", ID_REFRESH + MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI END POPUP "&Help" BEGIN @@ -1378,7 +1478,7 @@ LANGUAGE LANG_FRENCH, SUBLANG_FRENCH // Menu // -IDM_MAINFRAME MENU PRELOAD DISCARDABLE +IDM_MDIFRAME MENU PRELOAD DISCARDABLE BEGIN POPUP "&Fichier" BEGIN @@ -1392,7 +1492,9 @@ BEGIN MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR MENUITEM "Barre d'&騁at", ID_VIEW_STATUSBAR MENUITEM SEPARATOR + MENUITEM "&Refresh\tF5", ID_REFRESH MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&SDI", ID_VIEW_SDI END POPUP "&Window" BEGIN @@ -1402,7 +1504,30 @@ BEGIN MENUITEM "Tile &Vertically\tShift+F4", ID_WINDOW_TILE_VERT MENUITEM "Arrange Automatically", ID_WINDOW_AUTOSORT MENUITEM "Arrange &Symbols", ID_WINDOW_ARRANGE + END + POPUP "A&ide" + BEGIN + MENUITEM "&FAQ Explorateur...", ID_EXPLORER_FAQ + MENUITEM "A propos de l'&explorateur...", ID_ABOUT_WINDOWS + MENUITEM "A propos de l'&OS...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "&Fichier" + BEGIN + MENUITEM "&Fermer", ID_FILE_EXIT + END + POPUP "&Affichage" + BEGIN + MENUITEM "Barre d'&outils", ID_VIEW_TOOL_BAR + MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR + MENUITEM "Barre d'&騁at", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR MENUITEM "&Refresh\tF5", ID_REFRESH + MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI END POPUP "A&ide" BEGIN diff --git a/reactos/subsys/system/explorer/shell/filechild.h b/reactos/subsys/system/explorer/shell/filechild.h index bbb08fbfab1..2fea578a020 100644 --- a/reactos/subsys/system/explorer/shell/filechild.h +++ b/reactos/subsys/system/explorer/shell/filechild.h @@ -40,7 +40,7 @@ struct FileChildWndInfo : public ChildWndInfo int _open_mode; //OPEN_WINDOW_MODE }; - /// information structure for creation of ShellBrowserChild + /// information structure for creation of MDIShellBrowserChild struct ShellChildWndInfo : public FileChildWndInfo { typedef FileChildWndInfo super; diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index af334eacaaf..a4c245f161a 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -36,7 +36,57 @@ extern HWND create_webchildwindow(const WebChildWndInfo& info); #include "../explorer_intres.h" -MainFrame::MainFrame(HWND hwnd) +HWND MainFrameBase::Create(LPCTSTR path, bool mdi, UINT cmdshow) +{ + HWND hMainFrame; + +#ifndef _NO_MDI ///@todo implement command line option to switch between MDI and SDI + if (mdi) + hMainFrame = MDIMainFrame::Create(); + else +#endif + hMainFrame = SDIMainFrame::Create(); + + if (hMainFrame) { + String sPath; + HWND hwndOld = g_Globals._hMainWnd; + + g_Globals._hMainWnd = hMainFrame; + + if (path) { + sPath = path; // copy path to avoid accessing freed memory + path = sPath; + } + + if (hwndOld) + DestroyWindow(hwndOld); + + ShowWindow(hMainFrame, cmdshow); + UpdateWindow(hMainFrame); + + bool valid_dir = false; + + if (path) { + DWORD attribs = GetFileAttributes(path); + + if (attribs!=INVALID_FILE_ATTRIBUTES && (attribs&FILE_ATTRIBUTE_DIRECTORY)) + valid_dir = true; + else if (*path==':' || *path=='"') + valid_dir = true; + } + + // Open the first child window after initializing the application + if (valid_dir) + PostMessage(hMainFrame, PM_OPEN_WINDOW, 0, (LPARAM)path); + else + PostMessage(hMainFrame, PM_OPEN_WINDOW, OWM_EXPLORE|OWM_DETAILS, 0); + } + + return hMainFrame; +} + + +MainFrameBase::MainFrameBase(HWND hwnd) : super(hwnd), _himl(ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_MASK|ILC_COLOR24, 2, 0)) { @@ -48,18 +98,6 @@ MainFrame::MainFrame(HWND hwnd) _hAccel = LoadAccelerators(g_Globals._hInstance, MAKEINTRESOURCE(IDA_EXPLORER)); - CLIENTCREATESTRUCT ccs; - - ccs.hWindowMenu = _hMenuWindow; - ccs.idFirstChild = IDW_FIRST_CHILD; - -#ifndef _NO_MDI - _hmdiclient = CreateWindowEx(0, TEXT("MDICLIENT"), NULL, - WS_CHILD|WS_CLIPCHILDREN|WS_VSCROLL|WS_HSCROLL|WS_VISIBLE|WS_BORDER, - 0, 0, 0, 0, - hwnd, 0, g_Globals._hInstance, &ccs); -#endif - TBBUTTON toolbarBtns[] = { #ifdef _NO_REBAR {0, 0, 0, BTNS_SEP, {0, 0}, 0, 0}, @@ -93,6 +131,499 @@ MainFrame::MainFrame(HWND hwnd) CheckMenuItem(_menu_info._hMenuView, ID_VIEW_TOOL_BAR, MF_BYCOMMAND|MF_CHECKED); + // address & command bar + WindowCanvas canvas(hwnd); + RECT rect = {0, 0, 0, 0}; + DrawText(canvas, TEXT("My"), -1, &rect, DT_SINGLELINE|DT_NOPREFIX|DT_CALCRECT); + HFONT hfont = GetStockFont(DEFAULT_GUI_FONT); + + _haddressedit = CreateWindow(TEXT("EDIT"), NULL, WS_CHILD|WS_VISIBLE, 0, 0, 0, rect.bottom, + hwnd, (HMENU)IDW_ADDRESSBAR, g_Globals._hInstance, 0); + SetWindowFont(_haddressedit, hfont, FALSE); + new EditController(_haddressedit); + + _hcommandedit = CreateWindow(TEXT("EDIT"), TEXT("> "), WS_CHILD|WS_VISIBLE, 0, 0, 0, rect.bottom, + hwnd, (HMENU)IDW_COMMANDBAR, g_Globals._hInstance, 0); + SetWindowFont(_hcommandedit, hfont, FALSE); + new EditController(_hcommandedit); + + /* CreateStatusWindow does not accept WS_BORDER + _hstatusbar = CreateWindowEx(WS_EX_NOPARENTNOTIFY, STATUSCLASSNAME, 0, + WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_BORDER|CCS_NODIVIDER, 0,0,0,0, + hwnd, (HMENU)IDW_STATUSBAR, g_Globals._hInstance, 0);*/ + + _hstatusbar = CreateStatusWindow(WS_CHILD|WS_VISIBLE, 0, hwnd, IDW_STATUSBAR); + CheckMenuItem(_menu_info._hMenuView, ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED); + + _hsidebar = CreateWindowEx(WS_EX_STATICEDGE, WC_TREEVIEW, TEXT("Sidebar"), + WS_CHILD|WS_TABSTOP|WS_BORDER|/*WS_VISIBLE|*/WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_SHOWSELALWAYS|TVS_INFOTIP, + -1, -1, 200, 0, _hwnd, (HMENU)IDW_SIDEBAR, g_Globals._hInstance, 0); + + TreeView_SetImageList(_hsidebar, _himl, TVSIL_NORMAL); + + CheckMenuItem(_menu_info._hMenuView, ID_VIEW_SIDE_BAR, MF_BYCOMMAND|MF_UNCHECKED/*MF_CHECKED*/); + + + // create rebar window to manage toolbar and drivebar +#ifndef _NO_REBAR + _hwndrebar = CreateWindowEx(WS_EX_TOOLWINDOW, REBARCLASSNAME, NULL, + WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN| + RBS_VARHEIGHT|RBS_AUTOSIZE|RBS_DBLCLKTOGGLE| + CCS_NODIVIDER|CCS_NOPARENTALIGN, + 0, 0, 0, 0, _hwnd, 0, g_Globals._hInstance, 0); + + int btn_hgt = HIWORD(SendMessage(_htoolbar, TB_GETBUTTONSIZE, 0, 0)); + + REBARBANDINFO rbBand; + + rbBand.cbSize = sizeof(REBARBANDINFO); + rbBand.fMask = RBBIM_TEXT|RBBIM_STYLE|RBBIM_CHILD|RBBIM_CHILDSIZE|RBBIM_SIZE; +#ifndef RBBS_HIDETITLE // missing in MinGW headers as of 25.02.2004 +#define RBBS_HIDETITLE 0x400 +#endif + rbBand.fStyle = RBBS_CHILDEDGE|RBBS_GRIPPERALWAYS|RBBS_HIDETITLE; + + rbBand.cxMinChild = 0; + rbBand.cyMinChild = 0; + rbBand.cyChild = 0; + rbBand.cyMaxChild = 0; + rbBand.cyIntegral = btn_hgt; + + rbBand.lpText = NULL;//TEXT("Toolbar"); + rbBand.hwndChild = _htoolbar; + rbBand.cxMinChild = 0; + rbBand.cyMinChild = btn_hgt + 4; + rbBand.cx = 284; + SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); +#endif +} + + +MainFrameBase::~MainFrameBase() +{ + ImageList_Destroy(_himl); + + // don't exit desktop when closing file manager window + if (!g_Globals._desktop_mode) + if (g_Globals._hMainWnd == _hwnd) // don't quit when switching between MDI and SDI mode + PostQuitMessage(0); +} + + +LRESULT MainFrameBase::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + LRESULT res; + + if (ProcessMessage(nmsg, wparam, lparam, &res)) + return res; + else + return super::WndProc(nmsg, wparam, lparam); +} + +bool MainFrameBase::ProcessMessage(UINT nmsg, WPARAM wparam, LPARAM lparam, LRESULT* pres) +{ + switch(nmsg) { + case PM_TRANSLATE_MSG: + *pres = TranslateMsg((MSG*)lparam); + return true; + + case WM_SHOWWINDOW: + if (wparam) // trigger child resizing after window creation - now we can succesfully call IsWindowVisible() + resize_frame_client(); + return false; // goto def; + + case WM_CLOSE: + DestroyWindow(_hwnd); + g_Globals._hMainWnd = 0; + break; + + case WM_DESTROY: + break; + + case WM_SIZE: + resize_frame(LOWORD(lparam), HIWORD(lparam)); + break; // do not pass message to DefFrameProc + + 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 PM_FRM_CALC_CLIENT: + frame_get_clientspace((PRECT)lparam); + *pres = TRUE; + return true; + + case PM_FRM_GET_MENUINFO: + *pres = (LPARAM)&_menu_info; + return true; + + case PM_GET_CONTROLWINDOW: + if (wparam == FCW_STATUS) { + *pres = (LRESULT)(HWND)_hstatusbar; + return true; + } + break; + + case PM_SETSTATUSTEXT: + SendMessage(_hstatusbar, SB_SETTEXT, 0, lparam); + break; + + case PM_URL_CHANGED: + SetWindowText(_haddressedit, (LPCTSTR)lparam); + break; + + default: + return false; + } + + *pres = 0; + return true; +} + +BOOL MainFrameBase::TranslateMsg(MSG* pmsg) +{ + if (TranslateAccelerator(_hwnd, _hAccel, pmsg)) + return TRUE; + + return FALSE; +} + + +int MainFrameBase::Command(int id, int code) +{ + CONTEXT("MainFrameBase::Command()"); + + switch(id) { + case ID_FILE_EXIT: + SendMessage(_hwnd, WM_CLOSE, 0, 0); + break; + + case ID_VIEW_TOOL_BAR: + toggle_child(_hwnd, id, _htoolbar, 0); + break; + + case ID_VIEW_STATUSBAR: + toggle_child(_hwnd, id, _hstatusbar); + break; + + case ID_VIEW_SIDE_BAR: + // lazy initialization + if (!TreeView_GetCount(_hsidebar)) + FillBookmarks(); + + toggle_child(_hwnd, id, _hsidebar); + break; + + case ID_EXECUTE: { + ExecuteDialog dlg = {{0}, 0}; + + if (DialogBoxParam(g_Globals._hInstance, MAKEINTRESOURCE(IDD_EXECUTE), _hwnd, ExecuteDialog::WndProc, (LPARAM)&dlg) == IDOK) { + CONTEXT("ShellExecute()"); + + 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, TEXT("explorer")/*file explorer.hlp*/, HELP_INDEX, 0); + break; + + case ID_VIEW_FULLSCREEN: + CheckMenuItem(_menu_info._hMenuView, id, toggle_fullscreen()?MF_CHECKED:0); + break; + + case ID_ABOUT_WINDOWS: + ShellAbout(_hwnd, ResString(IDS_TITLE), NULL, 0); + break; + + case ID_ABOUT_EXPLORER: + explorer_about(_hwnd); + break; + + case ID_EXPLORER_FAQ: + launch_file(_hwnd, TEXT("http://www.sky.franken.de/explorer/"), SW_SHOW); + break; + + case IDW_ADDRESSBAR: + if (code == 1) { + TCHAR url[BUFFER_LEN]; + + if (GetWindowText(_haddressedit, url, BUFFER_LEN)) + go_to(url, false); + } + break; + + case IDW_COMMANDBAR: + //@todo execute command in command bar + break; + + default: + return 1; // no command handlers in Window::Command() + } + + return 0; +} + + +int MainFrameBase::Notify(int id, NMHDR* pnmh) +{ + switch(pnmh->code) { + // resize children windows when the rebar size changes + case RBN_AUTOSIZE: + resize_frame_client(); + break; + + case TVN_GETINFOTIP: { + NMTVGETINFOTIP* pnmgit = (NMTVGETINFOTIP*)pnmh; + + if (pnmgit->lParam) { + const BookmarkNode& node = *(BookmarkNode*)pnmgit->lParam; + + if (node._type == BookmarkNode::BMNT_FOLDER) { + // display tooltips for bookmark folders + if (!node._pfolder->_description.empty()) + lstrcpyn(pnmgit->pszText, node._pfolder->_description.c_str(), pnmgit->cchTextMax); + } else if (node._type == BookmarkNode::BMNT_BOOKMARK) { + // display tooltips for bookmark folders + String txt = node._pbookmark->_description; + + if (!node._pbookmark->_url.empty()) { + if (!txt.empty()) + txt += TEXT(" - "); + + txt += node._pbookmark->_url; + } + + lstrcpyn(pnmgit->pszText, txt.c_str(), pnmgit->cchTextMax); + } + } + break;} + + case NM_DBLCLK: { + HTREEITEM hitem = TreeView_GetSelection(_hsidebar); + LPARAM lparam = TreeView_GetItemData(_hsidebar, hitem); + + if (lparam) { + const BookmarkNode& node = *(BookmarkNode*)lparam; + + if (node._type == BookmarkNode::BMNT_BOOKMARK) { + bool new_window = GetAsyncKeyState(VK_SHIFT)<0; + + go_to(node._pbookmark->_url, new_window); + } + } + break;} + } + + return 0; +} + + +void MainFrameBase::resize_frame(int cx, int cy) +{ + if (cy <= 0) + return; // avoid resizing children when receiving RBN_AUTOSIZE while getting minimized + + RECT rect = {0, 0, cx, cy}; + + if (_hwndrebar) { + int height = ClientRect(_hwndrebar).bottom; + MoveWindow(_hwndrebar, rect.left, rect.top, rect.right-rect.left, height, TRUE); + rect.top += height; + } else { + if (IsWindowVisible(_htoolbar)) { + SendMessage(_htoolbar, WM_SIZE, 0, 0); + WindowRect rt(_htoolbar); + rect.top = rt.bottom; + // rect.bottom -= rt.bottom; + } + } + + if (IsWindowVisible(_hstatusbar)) { + int parts[] = {300, 500}; + + SendMessage(_hstatusbar, WM_SIZE, 0, 0); + SendMessage(_hstatusbar, SB_SETPARTS, 2, (LPARAM)&parts); + ClientRect rt(_hstatusbar); + rect.bottom -= rt.bottom; + } + + if (IsWindowVisible(_haddressedit) || IsWindowVisible(_hcommandedit)) { + ClientRect rt(_haddressedit); + rect.bottom -= rt.bottom; + + int mid = (rect.right-rect.left) / 2; ///@todo use split bar + SetWindowPos(_haddressedit, 0, 0, rect.bottom, mid, rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER); + SetWindowPos(_hcommandedit, 0, mid+1, rect.bottom, rect.right-(mid+1), rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER); + } + + if (IsWindowVisible(_hsidebar)) { + WindowRect rt(_hsidebar); + rect.left += rt.right-rt.left; + + SetWindowPos(_hsidebar, 0, -1, rect.top-1, rt.right-rt.left, rect.bottom-rect.top+1, SWP_NOACTIVATE|SWP_NOZORDER); + } +} + +void MainFrameBase::resize_frame_client() +{ + ClientRect rect(_hwnd); + + resize_frame(rect.right, rect.bottom); +} + +void MainFrameBase::frame_get_clientspace(PRECT prect) +{ + 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(_htoolbar)) { + ClientRect rt(_htoolbar); + prect->top += rt.bottom+2; + } + + if (IsWindowVisible(_hstatusbar)) { + ClientRect rt(_hstatusbar); + prect->bottom -= rt.bottom; + } +} + +BOOL MainFrameBase::toggle_fullscreen() +{ + RECT rt; + + if ((_fullscreen._mode=!_fullscreen._mode)) { + GetWindowRect(_hwnd, &_fullscreen._orgPos); + _fullscreen._wasZoomed = IsZoomed(_hwnd); + + Frame_CalcFrameClient(_hwnd, &rt); + ClientToScreen(_hwnd, (LPPOINT)&rt.left); + ClientToScreen(_hwnd, (LPPOINT)&rt.right); + + rt.left = _fullscreen._orgPos.left-rt.left; + rt.top = _fullscreen._orgPos.top-rt.top; + rt.right = GetSystemMetrics(SM_CXSCREEN)+_fullscreen._orgPos.right-rt.right; + rt.bottom = GetSystemMetrics(SM_CYSCREEN)+_fullscreen._orgPos.bottom-rt.bottom; + + MoveWindow(_hwnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE); + } else { + MoveWindow(_hwnd, _fullscreen._orgPos.left, _fullscreen._orgPos.top, + _fullscreen._orgPos.right-_fullscreen._orgPos.left, + _fullscreen._orgPos.bottom-_fullscreen._orgPos.top, TRUE); + + if (_fullscreen._wasZoomed) + ShowWindow(_hwnd, WS_MAXIMIZE); + } + + return _fullscreen._mode; +} + +void MainFrameBase::fullscreen_move() +{ + 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); +} + + +void MainFrameBase::toggle_child(HWND hwnd, UINT cmd, HWND hchild, int band_idx) +{ + BOOL vis = IsWindowVisible(hchild); + + CheckMenuItem(_menu_info._hMenuView, cmd, vis?MF_BYCOMMAND:MF_BYCOMMAND|MF_CHECKED); + + if (band_idx != -1) + SendMessage(_hwndrebar, RB_SHOWBAND, band_idx, !vis); + else + ShowWindow(hchild, vis? SW_HIDE: SW_SHOW); + + if (_fullscreen._mode) + fullscreen_move(); + + resize_frame_client(); +} + +void MainFrameBase::FillBookmarks() +{ + HiddenWindow hide(_hsidebar); + WindowCanvas canvas(_hwnd); + + TreeView_DeleteAllItems(_hsidebar); + + g_Globals._icon_cache.get_icon(ICID_FAVORITES).add_to_imagelist(_himl, canvas); + g_Globals._icon_cache.get_icon(ICID_BOOKMARK).add_to_imagelist(_himl, canvas); + ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT), GetStockBrush(WHITE_BRUSH), canvas); + g_Globals._icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas); + g_Globals._icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas); + + TV_INSERTSTRUCT tvi; + + tvi.hParent = TVI_ROOT; + tvi.hInsertAfter = TVI_LAST; + tvi.item.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE; + ResString sFavorites(IDS_FAVORITES); + tvi.item.pszText = (LPTSTR)sFavorites.c_str(); + tvi.item.iSelectedImage = tvi.item.iImage = 0; + + HTREEITEM hitem_bookmarks = TreeView_InsertItem(_hsidebar, &tvi); + + g_Globals._favorites.fill_tree(_hsidebar, hitem_bookmarks, _himl, canvas); + + TreeView_Expand(_hsidebar, hitem_bookmarks, TVE_EXPAND); +} + + +bool MainFrameBase::go_to(LPCTSTR url, bool new_window) +{ + ///@todo SDI implementation + + return false; +} + + +#ifndef _NO_MDI + +MDIMainFrame::MDIMainFrame(HWND hwnd) + : super(hwnd) +{ + CLIENTCREATESTRUCT ccs; + + ccs.hWindowMenu = _hMenuWindow; + ccs.idFirstChild = IDW_FIRST_CHILD; + + _hmdiclient = CreateWindowEx(0, TEXT("MDICLIENT"), NULL, + WS_CHILD|WS_CLIPCHILDREN|WS_VSCROLL|WS_HSCROLL|WS_VISIBLE|WS_BORDER, + 0, 0, 0, 0, + hwnd, 0, g_Globals._hInstance, &ccs); + TBBUTTON extraBtns = {0, 0, TBSTATE_ENABLED, BTNS_SEP, {0, 0}, 0, 0}; #ifndef _NO_REBAR @@ -200,14 +731,7 @@ MainFrame::MainFrame(HWND hwnd) } - // create rebar window to manage toolbar and drivebar #ifndef _NO_REBAR - _hwndrebar = CreateWindowEx(WS_EX_TOOLWINDOW, REBARCLASSNAME, NULL, - WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN| - RBS_VARHEIGHT|RBS_AUTOSIZE|RBS_DBLCLKTOGGLE| - CCS_NODIVIDER|CCS_NOPARENTALIGN, - 0, 0, 0, 0, _hwnd, 0, g_Globals._hInstance, 0); - int btn_hgt = HIWORD(SendMessage(_htoolbar, TB_GETBUTTONSIZE, 0, 0)); REBARBANDINFO rbBand; @@ -219,19 +743,6 @@ MainFrame::MainFrame(HWND hwnd) #endif rbBand.fStyle = RBBS_CHILDEDGE|RBBS_GRIPPERALWAYS|RBBS_HIDETITLE; - rbBand.cxMinChild = 0; - rbBand.cyMinChild = 0; - rbBand.cyChild = 0; - rbBand.cyMaxChild = 0; - rbBand.cyIntegral = btn_hgt; - - rbBand.lpText = NULL;//TEXT("Toolbar"); - rbBand.hwndChild = _htoolbar; - rbBand.cxMinChild = 0; - rbBand.cyMinChild = btn_hgt + 4; - rbBand.cx = 284; - SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); - rbBand.lpText = TEXT("Extras"); rbBand.hwndChild = _hextrabar; rbBand.cxMinChild = 0; @@ -247,63 +758,20 @@ MainFrame::MainFrame(HWND hwnd) rbBand.cx = 400; SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); #endif - - - // address & command bar - WindowCanvas canvas(hwnd); - RECT rect = {0, 0, 0, 0}; - DrawText(canvas, TEXT("My"), -1, &rect, DT_SINGLELINE|DT_NOPREFIX|DT_CALCRECT); - HFONT hfont = GetStockFont(DEFAULT_GUI_FONT); - - _haddressedit = CreateWindow(TEXT("EDIT"), NULL, WS_CHILD|WS_VISIBLE, 0, 0, 0, rect.bottom, - hwnd, (HMENU)IDW_ADDRESSBAR, g_Globals._hInstance, 0); - SetWindowFont(_haddressedit, hfont, FALSE); - new EditController(_haddressedit); - - _hcommandedit = CreateWindow(TEXT("EDIT"), TEXT("> "), WS_CHILD|WS_VISIBLE, 0, 0, 0, rect.bottom, - hwnd, (HMENU)IDW_COMMANDBAR, g_Globals._hInstance, 0); - SetWindowFont(_hcommandedit, hfont, FALSE); - new EditController(_hcommandedit); - - /* CreateStatusWindow does not accept WS_BORDER - _hstatusbar = CreateWindowEx(WS_EX_NOPARENTNOTIFY, STATUSCLASSNAME, 0, - WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_BORDER|CCS_NODIVIDER, 0,0,0,0, - hwnd, (HMENU)IDW_STATUSBAR, g_Globals._hInstance, 0);*/ - - _hstatusbar = CreateStatusWindow(WS_CHILD|WS_VISIBLE, 0, hwnd, IDW_STATUSBAR); - CheckMenuItem(_menu_info._hMenuView, ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED); - - _hsidebar = CreateWindowEx(WS_EX_STATICEDGE, WC_TREEVIEW, TEXT("Sidebar"), - WS_CHILD|WS_TABSTOP|WS_BORDER|/*WS_VISIBLE|*/WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_SHOWSELALWAYS|TVS_INFOTIP, - -1, -1, 200, 0, _hwnd, (HMENU)IDW_SIDEBAR, g_Globals._hInstance, 0); - - TreeView_SetImageList(_hsidebar, _himl, TVSIL_NORMAL); - - CheckMenuItem(_menu_info._hMenuView, ID_VIEW_SIDE_BAR, MF_BYCOMMAND|MF_UNCHECKED/*MF_CHECKED*/); } -MainFrame::~MainFrame() +HWND MDIMainFrame::Create() { - ImageList_Destroy(_himl); + HMENU hMenuFrame = LoadMenu(g_Globals._hInstance, MAKEINTRESOURCE(IDM_MDIFRAME)); - // don't exit desktop when closing file manager window - if (!g_Globals._desktop_mode) - PostQuitMessage(0); -} - - -HWND MainFrame::Create() -{ - HMENU hMenuFrame = LoadMenu(g_Globals._hInstance, MAKEINTRESOURCE(IDM_MAINFRAME)); - - return super::Create(WINDOW_CREATOR(MainFrame), 0, + return Window::Create(WINDOW_CREATOR(MDIMainFrame), 0, (LPCTSTR)(int)g_Globals._hframeClass, ResString(IDS_TITLE), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0/*hwndDesktop*/, hMenuFrame); } -HWND MainFrame::Create(LPCTSTR path, int mode) +HWND MDIMainFrame::Create(LPCTSTR path, int mode) { HWND hMainFrame = Create(); if (!hMainFrame) @@ -311,7 +779,7 @@ HWND MainFrame::Create(LPCTSTR path, int mode) ShowWindow(hMainFrame, SW_SHOW); - MainFrame* pMainFrame = GET_WINDOW(MainFrame, hMainFrame); + MDIMainFrame* pMainFrame = GET_WINDOW(MDIMainFrame, hMainFrame); if (pMainFrame) pMainFrame->CreateChild(path, mode); @@ -319,7 +787,7 @@ HWND MainFrame::Create(LPCTSTR path, int mode) return hMainFrame; } -HWND MainFrame::Create(LPCITEMIDLIST pidl, int mode) +HWND MDIMainFrame::Create(LPCITEMIDLIST pidl, int mode) { HWND hMainFrame = Create(); if (!hMainFrame) @@ -327,7 +795,7 @@ HWND MainFrame::Create(LPCITEMIDLIST pidl, int mode) ShowWindow(hMainFrame, SW_SHOW); - MainFrame* pMainFrame = GET_WINDOW(MainFrame, hMainFrame); + MDIMainFrame* pMainFrame = GET_WINDOW(MDIMainFrame, hMainFrame); if (pMainFrame) pMainFrame->CreateChild(pidl, mode); @@ -336,18 +804,18 @@ HWND MainFrame::Create(LPCITEMIDLIST pidl, int mode) } -ChildWindow* MainFrame::CreateChild(LPCTSTR path, int mode) +ChildWindow* MDIMainFrame::CreateChild(LPCTSTR path, int mode) { return reinterpret_cast(SendMessage(_hwnd, PM_OPEN_WINDOW, mode, (LPARAM)path)); } -ChildWindow* MainFrame::CreateChild(LPCITEMIDLIST pidl, int mode) +ChildWindow* MDIMainFrame::CreateChild(LPCITEMIDLIST pidl, int mode) { return reinterpret_cast(SendMessage(_hwnd, PM_OPEN_WINDOW, mode|OWM_PIDL, (LPARAM)pidl)); } -int MainFrame::OpenShellFolders(LPIDA pida, HWND hFrameWnd) +int MDIMainFrame::OpenShellFolders(LPIDA pida, HWND hFrameWnd) { int cnt = 0; @@ -369,7 +837,7 @@ int MainFrame::OpenShellFolders(LPIDA pida, HWND hFrameWnd) if (SendMessage(hFrameWnd, PM_OPEN_WINDOW, OWM_PIDL, (LPARAM)(LPCITEMIDLIST)pidl_abs)) ++cnt; } else { - if (MainFrame::Create(pidl_abs, 0)) + if (MDIMainFrame::Create(pidl_abs, 0)) ++cnt; } } catch(COMException& e) { @@ -400,54 +868,19 @@ int MainFrame::OpenShellFolders(LPIDA pida, HWND hFrameWnd) } -LRESULT MainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) + +BOOL MDIMainFrame::TranslateMsg(MSG* pmsg) { - switch(nmsg) { - case PM_TRANSLATE_MSG: { - MSG* pmsg = (MSG*) lparam; - -#ifndef _NO_MDI - if (_hmdiclient && TranslateMDISysAccel(_hmdiclient, pmsg)) - return TRUE; -#endif - - if (TranslateAccelerator(_hwnd, _hAccel, pmsg)) - return TRUE; - - return FALSE;} - - case WM_SHOWWINDOW: - if (wparam) // trigger child resizing after window creation - now we can succesfully call IsWindowVisible() - resize_frame_rect(ClientRect(_hwnd)); - goto def; - - case WM_CLOSE: - DestroyWindow(_hwnd); - g_Globals._hMainWnd = 0; - break; - - case WM_DESTROY: - break; - - case WM_SIZE: - resize_frame(LOWORD(lparam), HIWORD(lparam)); - break; // do not pass message to DefFrameProc - - 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 PM_FRM_CALC_CLIENT: - frame_get_clientspace((PRECT)lparam); + if (_hmdiclient && TranslateMDISysAccel(_hmdiclient, pmsg)) return TRUE; - case PM_FRM_GET_MENUINFO: - return (LPARAM)&_menu_info; + return super::TranslateMsg(pmsg); +} - case PM_OPEN_WINDOW: {CONTEXT("PM_OPEN_WINDOW"); +LRESULT MDIMainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case PM_OPEN_WINDOW: {CONTEXT("MDIMainFrame PM_OPEN_WINDOW"); TCHAR buffer[MAX_PATH]; LPCTSTR path; ShellPath shell_path = DesktopFolderPath(); @@ -496,46 +929,32 @@ LRESULT MainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) create_info._open_mode = (OPEN_WINDOW_MODE)wparam; // FileChildWindow::create(_hmdiclient, create_info); - return (LRESULT)ShellBrowserChild::create(create_info); + return (LRESULT)MDIShellBrowserChild::create(create_info); } return TRUE;} // success - case PM_GET_CONTROLWINDOW: - if (wparam == FCW_STATUS) - return (LRESULT)(HWND)_hstatusbar; - break; + default: { + LRESULT res; - case PM_SETSTATUSTEXT: - SendMessage(_hstatusbar, SB_SETTEXT, 0, lparam); - break; - - case PM_URL_CHANGED: - SetWindowText(_haddressedit, (LPCTSTR)lparam); - break; - - default: def: -#ifndef _NO_MDI - return DefFrameProc(_hwnd, _hmdiclient, nmsg, wparam, lparam); -#else - return super::WndProc(nmsg, wparam, lparam); -#endif + if (super::ProcessMessage(nmsg, wparam, lparam, &res)) + return res; + else + return DefFrameProc(_hwnd, _hmdiclient, nmsg, wparam, lparam); + } } return 0; } - -int MainFrame::Command(int id, int code) +int MDIMainFrame::Command(int id, int code) { - CONTEXT("MainFrame::Command()"); + CONTEXT("MDIMainFrame::Command()"); -#ifndef _NO_MDI HWND hwndClient = (HWND) SendMessage(_hmdiclient, WM_MDIGETACTIVE, 0, 0); if (hwndClient) if (SendMessage(hwndClient, PM_DISPATCH_COMMAND, MAKELONG(id,code), 0)) return 0; -#endif if (id>=ID_DRIVE_FIRST && id<=ID_DRIVE_FIRST+0xFF) { TCHAR drv[_MAX_DRIVE], path[MAX_PATH]; @@ -545,10 +964,8 @@ int MainFrame::Command(int id, int code) while(*root) ++root; -#ifndef _NO_MDI if (activate_drive_window(root)) return 0; -#endif _tsplitpath(root, drv, 0, 0, 0); @@ -559,32 +976,20 @@ int MainFrame::Command(int id, int code) GetCurrentDirectory(MAX_PATH, path); ///@todo store last directory per drive -#ifndef _NO_MDI FileChildWindow::create(FileChildWndInfo(_hmdiclient, path)); -#else - ///@todo SDI implementation -#endif + return 1; } switch(id) { - case ID_FILE_EXIT: - SendMessage(_hwnd, WM_CLOSE, 0, 0); - break; - case ID_WINDOW_NEW: { TCHAR path[MAX_PATH]; GetCurrentDirectory(MAX_PATH, path); -#ifndef _NO_MDI FileChildWindow::create(FileChildWndInfo(_hmdiclient, path)); -#else - ///@todo SDI implementation -#endif break;} -#ifndef _NO_MDI case ID_WINDOW_CASCADE: SendMessage(_hmdiclient, WM_MDICASCADE, 0, 0); break; @@ -600,11 +1005,6 @@ int MainFrame::Command(int id, int code) case ID_WINDOW_ARRANGE: SendMessage(_hmdiclient, WM_MDIICONARRANGE, 0, 0); break; -#endif - - case ID_VIEW_TOOL_BAR: - toggle_child(_hwnd, id, _htoolbar, 0); - break; case ID_VIEW_EXTRA_BAR: toggle_child(_hwnd, id, _hextrabar, 1); @@ -614,39 +1014,6 @@ int MainFrame::Command(int id, int code) toggle_child(_hwnd, id, _hdrivebar, 2); break; - case ID_VIEW_STATUSBAR: - toggle_child(_hwnd, id, _hstatusbar); - break; - - case ID_VIEW_SIDE_BAR: - // lazy initialization - if (!TreeView_GetCount(_hsidebar)) - FillBookmarks(); - - toggle_child(_hwnd, id, _hsidebar); - break; - - case ID_EXECUTE: { - ExecuteDialog dlg = {{0}, 0}; - - if (DialogBoxParam(g_Globals._hInstance, MAKEINTRESOURCE(IDD_EXECUTE), _hwnd, ExecuteDialog::WndProc, (LPARAM)&dlg) == IDOK) { - CONTEXT("ShellExecute()"); - - 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, TEXT("explorer")/*file explorer.hlp*/, HELP_INDEX, 0); - break; - - case ID_VIEW_FULLSCREEN: - CheckMenuItem(_menu_info._hMenuView, id, toggle_fullscreen()?MF_CHECKED:0); - break; - #ifdef __WINE__ case ID_DRIVE_UNIX_FS: { TCHAR path[MAX_PATH]; @@ -654,78 +1021,56 @@ int MainFrame::Command(int id, int code) getcwd(path, MAX_PATH); -#ifndef _NO_MDI if (activate_child_window(TEXT("unixfs"))) break; FileChildWindow::create(_hmdiclient, FileChildWndInfo(path)); -#else - ///@todo SDI implementation -#endif break;} #endif case ID_DRIVE_DESKTOP: { TCHAR path[MAX_PATH]; -#ifndef _NO_MDI if (activate_child_window(TEXT("Desktop"))) break; -#endif GetCurrentDirectory(MAX_PATH, path); - ShellBrowserChild::create(ShellChildWndInfo(_hmdiclient, path, DesktopFolderPath())); + MDIShellBrowserChild::create(ShellChildWndInfo(_hmdiclient, path, DesktopFolderPath())); break;} case ID_DRIVE_SHELL_NS: { TCHAR path[MAX_PATH]; GetCurrentDirectory(MAX_PATH, path); -#ifndef _NO_MDI if (activate_child_window(TEXT("Shell"))) break; FileChildWindow::create(ShellChildWndInfo(_hmdiclient, path, DesktopFolderPath())); -#else - ///@todo SDI implementation -#endif break;} case ID_DRIVE_NTOBJ_NS: { -#ifndef _NO_MDI if (activate_child_window(TEXT("NTOBJ"))) break; FileChildWindow::create(NtObjChildWndInfo(_hmdiclient, TEXT("\\"))); -#else - ///@todo SDI implementation -#endif break;} case ID_DRIVE_REGISTRY: { if (activate_child_window(TEXT("Registry"))) break; -#ifndef _NO_MDI FileChildWindow::create(RegistryChildWndInfo(_hmdiclient, TEXT("\\"))); -#else - ///@todo SDI implementation -#endif break;} case ID_DRIVE_FAT: { ///@todo prompt for image file -#ifndef _NO_MDI if (activate_child_window(TEXT("FAT"))) break; FileChildWindow::create(FATChildWndInfo(_hmdiclient, TEXT("FAT Image"))); //@@ -#else - ///@todo SDI implementation -#endif break;} case ID_WEB_WINDOW: @@ -736,131 +1081,72 @@ int MainFrame::Command(int id, int code) #endif break; - ///@todo There are even more menu items! - - case ID_ABOUT_WINDOWS: - ShellAbout(_hwnd, ResString(IDS_TITLE), NULL, 0); - break; - - case ID_ABOUT_EXPLORER: - explorer_about(_hwnd); - break; - case ID_EXPLORER_FAQ: create_webchildwindow(WebChildWndInfo(_hmdiclient, TEXT("http://www.sky.franken.de/explorer/"))); break; - case IDW_ADDRESSBAR: - if (code == 1) { - TCHAR url[BUFFER_LEN]; - - if (GetWindowText(_haddressedit, url, BUFFER_LEN)) - go_to(url, false); - } + case ID_VIEW_SDI: + MainFrameBase::Create(NULL, false); break; - case IDW_COMMANDBAR: - //@todo execute command in command bar - break; + ///@todo There are even more menu items! default: -#ifndef _NO_MDI - return DefFrameProc(_hwnd, _hmdiclient, WM_COMMAND, MAKELONG(id,code), 0); -#else - return 1; -#endif + if (super::Command(id, code) == 0) + return 0; + else + return DefFrameProc(_hwnd, _hmdiclient, WM_COMMAND, MAKELONG(id,code), 0); } return 0; } -int MainFrame::Notify(int id, NMHDR* pnmh) +void MDIMainFrame::frame_get_clientspace(PRECT prect) { - switch(pnmh->code) { - case RBN_AUTOSIZE: - resize_frame_rect(ClientRect(_hwnd)); - break; + super::frame_get_clientspace(prect); - case TVN_GETINFOTIP: { - NMTVGETINFOTIP* pnmgit = (NMTVGETINFOTIP*)pnmh; - - if (pnmgit->lParam) { - const BookmarkNode& node = *(BookmarkNode*)pnmgit->lParam; - - if (node._type == BookmarkNode::BMNT_FOLDER) { - // display tooltips for bookmark folders - if (!node._pfolder->_description.empty()) - lstrcpyn(pnmgit->pszText, node._pfolder->_description.c_str(), pnmgit->cchTextMax); - } else if (node._type == BookmarkNode::BMNT_BOOKMARK) { - // display tooltips for bookmark folders - String txt = node._pbookmark->_description; - - if (!node._pbookmark->_url.empty()) { - if (!txt.empty()) - txt += TEXT(" - "); - - txt += node._pbookmark->_url; - } - - lstrcpyn(pnmgit->pszText, txt.c_str(), pnmgit->cchTextMax); - } - } - break;} - - case NM_DBLCLK: { - HTREEITEM hitem = TreeView_GetSelection(_hsidebar); - LPARAM lparam = TreeView_GetItemData(_hsidebar, hitem); - - if (lparam) { - const BookmarkNode& node = *(BookmarkNode*)lparam; - - if (node._type == BookmarkNode::BMNT_BOOKMARK) { - bool new_window = GetAsyncKeyState(VK_SHIFT)<0; - - go_to(node._pbookmark->_url, new_window); - } - } - break;} + if (IsWindowVisible(_hdrivebar)) { + ClientRect rt(_hdrivebar); + prect->top += rt.bottom+2; } - - return 0; } - -void MainFrame::resize_frame_rect(PRECT prect) +void MDIMainFrame::resize_frame(int cx, int cy) { - if (prect->bottom <= prect->top) + if (cy <= 0) return; // avoid resizing children when receiving RBN_AUTOSIZE while getting minimized + RECT rect = {0, 0, cx, cy}; + if (_hwndrebar) { int height = ClientRect(_hwndrebar).bottom; - MoveWindow(_hwndrebar, prect->left, prect->top, prect->right-prect->left, height, TRUE); - prect->top += height; + MoveWindow(_hwndrebar, rect.left, rect.top, rect.right-rect.left, height, TRUE); + rect.top += height; } else { if (IsWindowVisible(_htoolbar)) { SendMessage(_htoolbar, WM_SIZE, 0, 0); WindowRect rt(_htoolbar); - prect->top = rt.bottom; - // prect->bottom -= rt.bottom; + rect.top = rt.bottom; + // rect.bottom -= rt.bottom; } if (IsWindowVisible(_hextrabar)) { SendMessage(_hextrabar, WM_SIZE, 0, 0); WindowRect rt(_hextrabar); - int new_top = --prect->top + rt.bottom; - MoveWindow(_hextrabar, 0, prect->top, rt.right, new_top, TRUE); - prect->top = new_top; - // prect->bottom -= rt.bottom; + int new_top = --rect.top + rt.bottom; + MoveWindow(_hextrabar, 0, rect.top, rt.right, new_top, TRUE); + rect.top = new_top; + // rect.bottom -= rt.bottom; } if (IsWindowVisible(_hdrivebar)) { SendMessage(_hdrivebar, WM_SIZE, 0, 0); WindowRect rt(_hdrivebar); - int new_top = --prect->top + rt.bottom; - MoveWindow(_hdrivebar, 0, prect->top, rt.right, new_top, TRUE); - prect->top = new_top; - // prect->bottom -= rt.bottom; + int new_top = --rect.top + rt.bottom; + MoveWindow(_hdrivebar, 0, rect.top, rt.right, new_top, TRUE); + rect.top = new_top; + // rect.bottom -= rt.bottom; } } @@ -870,149 +1156,29 @@ void MainFrame::resize_frame_rect(PRECT prect) SendMessage(_hstatusbar, WM_SIZE, 0, 0); SendMessage(_hstatusbar, SB_SETPARTS, 2, (LPARAM)&parts); ClientRect rt(_hstatusbar); - prect->bottom -= rt.bottom; + rect.bottom -= rt.bottom; } if (IsWindowVisible(_haddressedit) || IsWindowVisible(_hcommandedit)) { ClientRect rt(_haddressedit); - prect->bottom -= rt.bottom; + rect.bottom -= rt.bottom; - int mid = (prect->right-prect->left) / 2; ///@todo use split bar - SetWindowPos(_haddressedit, 0, 0, prect->bottom, mid, rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER); - SetWindowPos(_hcommandedit, 0, mid+1, prect->bottom, prect->right-(mid+1), rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER); + int mid = (rect.right-rect.left) / 2; ///@todo use split bar + SetWindowPos(_haddressedit, 0, 0, rect.bottom, mid, rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER); + SetWindowPos(_hcommandedit, 0, mid+1, rect.bottom, rect.right-(mid+1), rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER); } if (IsWindowVisible(_hsidebar)) { WindowRect rt(_hsidebar); - prect->left += rt.right-rt.left; + rect.left += rt.right-rt.left; - SetWindowPos(_hsidebar, 0, -1, prect->top-1, rt.right-rt.left, prect->bottom-prect->top+1, SWP_NOACTIVATE|SWP_NOZORDER); + SetWindowPos(_hsidebar, 0, -1, rect.top-1, rt.right-rt.left, rect.bottom-rect.top+1, SWP_NOACTIVATE|SWP_NOZORDER); } -#ifndef _NO_MDI - MoveWindow(_hmdiclient, prect->left-1, prect->top-1, prect->right-prect->left+2, prect->bottom-prect->top+1, TRUE); -#endif + MoveWindow(_hmdiclient, rect.left-1, rect.top-1, rect.right-rect.left+2, rect.bottom-rect.top+1, TRUE); } -void MainFrame::resize_frame(int cx, int cy) -{ - RECT rect; - - rect.left = 0; - rect.top = 0; - rect.right = cx; - rect.bottom = cy; - - resize_frame_rect(&rect); -} - -void MainFrame::resize_frame_client() -{ - ClientRect rect(_hwnd); - - resize_frame_rect(&rect); -} - -void MainFrame::frame_get_clientspace(PRECT prect) -{ - 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(_htoolbar)) { - ClientRect rt(_htoolbar); - prect->top += rt.bottom+2; - } - - if (IsWindowVisible(_hdrivebar)) { - ClientRect rt(_hdrivebar); - prect->top += rt.bottom+2; - } - - if (IsWindowVisible(_hstatusbar)) { - ClientRect rt(_hstatusbar); - prect->bottom -= rt.bottom; - } -} - -BOOL MainFrame::toggle_fullscreen() -{ - RECT rt; - - if ((_fullscreen._mode=!_fullscreen._mode)) { - GetWindowRect(_hwnd, &_fullscreen._orgPos); - _fullscreen._wasZoomed = IsZoomed(_hwnd); - - Frame_CalcFrameClient(_hwnd, &rt); - ClientToScreen(_hwnd, (LPPOINT)&rt.left); - ClientToScreen(_hwnd, (LPPOINT)&rt.right); - - rt.left = _fullscreen._orgPos.left-rt.left; - rt.top = _fullscreen._orgPos.top-rt.top; - rt.right = GetSystemMetrics(SM_CXSCREEN)+_fullscreen._orgPos.right-rt.right; - rt.bottom = GetSystemMetrics(SM_CYSCREEN)+_fullscreen._orgPos.bottom-rt.bottom; - - MoveWindow(_hwnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE); - } else { - MoveWindow(_hwnd, _fullscreen._orgPos.left, _fullscreen._orgPos.top, - _fullscreen._orgPos.right-_fullscreen._orgPos.left, - _fullscreen._orgPos.bottom-_fullscreen._orgPos.top, TRUE); - - if (_fullscreen._wasZoomed) - ShowWindow(_hwnd, WS_MAXIMIZE); - } - - return _fullscreen._mode; -} - -void MainFrame::fullscreen_move() -{ - 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); -} - - -void MainFrame::toggle_child(HWND hwnd, UINT cmd, HWND hchild, int band_idx) -{ - BOOL vis = IsWindowVisible(hchild); - - CheckMenuItem(_menu_info._hMenuView, cmd, vis?MF_BYCOMMAND:MF_BYCOMMAND|MF_CHECKED); - - if (band_idx != -1) - SendMessage(_hwndrebar, RB_SHOWBAND, band_idx, !vis); - else - ShowWindow(hchild, vis?SW_HIDE:SW_SHOW); - - if (_fullscreen._mode) - fullscreen_move(); - - resize_frame_client(); -} - -#ifndef _NO_MDI -bool MainFrame::activate_drive_window(LPCTSTR path) +bool MDIMainFrame::activate_drive_window(LPCTSTR path) { TCHAR drv1[_MAX_DRIVE], drv2[_MAX_DRIVE]; HWND child_wnd; @@ -1040,7 +1206,7 @@ bool MainFrame::activate_drive_window(LPCTSTR path) return false; } -bool MainFrame::activate_child_window(LPCTSTR filesys) +bool MDIMainFrame::activate_child_window(LPCTSTR filesys) { HWND child_wnd; @@ -1058,7 +1224,7 @@ bool MainFrame::activate_child_window(LPCTSTR filesys) return true; } } else { - ShellBrowserChild* shell_child = (ShellBrowserChild*) SendMessage(child_wnd, PM_GET_SHELLBROWSER_PTR, 0, 0); + ShellBrowser* shell_child = (ShellBrowser*) SendMessage(child_wnd, PM_GET_SHELLBROWSER_PTR, 0, 0); if (shell_child) { if (!lstrcmpi(shell_child->get_root()._fs, filesys)) { @@ -1076,41 +1242,8 @@ bool MainFrame::activate_child_window(LPCTSTR filesys) return false; } -void MainFrame::FillBookmarks() +bool MDIMainFrame::go_to(LPCTSTR url, bool new_window) { - HiddenWindow hide(_hsidebar); - WindowCanvas canvas(_hwnd); - - TreeView_DeleteAllItems(_hsidebar); - - g_Globals._icon_cache.get_icon(ICID_FAVORITES).add_to_imagelist(_himl, canvas); - g_Globals._icon_cache.get_icon(ICID_BOOKMARK).add_to_imagelist(_himl, canvas); - ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT), GetStockBrush(WHITE_BRUSH), canvas); - g_Globals._icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas); - g_Globals._icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas); - - TV_INSERTSTRUCT tvi; - - tvi.hParent = TVI_ROOT; - tvi.hInsertAfter = TVI_LAST; - tvi.item.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE; - ResString sFavorites(IDS_FAVORITES); - tvi.item.pszText = (LPTSTR)sFavorites.c_str(); - tvi.item.iSelectedImage = tvi.item.iImage = 0; - - HTREEITEM hitem_bookmarks = TreeView_InsertItem(_hsidebar, &tvi); - - g_Globals._favorites.fill_tree(_hsidebar, hitem_bookmarks, _himl, canvas); - - TreeView_Expand(_hsidebar, hitem_bookmarks, TVE_EXPAND); -} - -#endif - - -bool MainFrame::go_to(LPCTSTR url, bool new_window) -{ -#ifndef _NO_MDI if (!new_window) { HWND hwndClient = (HWND) SendMessage(_hmdiclient, WM_MDIGETACTIVE, 0, 0); @@ -1121,9 +1254,369 @@ bool MainFrame::go_to(LPCTSTR url, bool new_window) if (CreateChild(url)) return true; -#else - ///@todo SDI implementation -#endif - return false; + return super::go_to(url, new_window); +} + +#endif // _NO_MDI + + +SDIMainFrame::SDIMainFrame(HWND hwnd) + : super(hwnd) +{ + _split_pos = DEFAULT_SPLIT_POS; + _last_split = DEFAULT_SPLIT_POS; + + // create image list for explorer tree view + init_himl(); + + /* wait for PM_OPEN_WINDOW message before creating a shell view + update_shell_browser();*/ +} + +HWND SDIMainFrame::Create() +{ + HMENU hMenuFrame = LoadMenu(g_Globals._hInstance, MAKEINTRESOURCE(IDM_SDIFRAME)); + + return Window::Create(WINDOW_CREATOR(SDIMainFrame), 0, + (LPCTSTR)(int)g_Globals._hframeClass, ResString(IDS_TITLE), WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + 0/*hwndDesktop*/, hMenuFrame); +} + +LRESULT SDIMainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case WM_SIZE: + resize_frame(LOWORD(lparam), HIWORD(lparam)); + break; + + case WM_PAINT: { + PaintCanvas canvas(_hwnd); + ClientRect rt(_hwnd); + rt.left = _split_pos-SPLIT_WIDTH/2; + rt.right = _split_pos+SPLIT_WIDTH/2+1; + + if (_right_hwnd) { + WindowRect right_rect(_right_hwnd); + ScreenToClient(_hwnd, &right_rect); + rt.top = right_rect.top; + rt.bottom = right_rect.bottom; + } + + HBRUSH lastBrush = SelectBrush(canvas, GetStockBrush(COLOR_SPLITBAR)); + Rectangle(canvas, rt.left, rt.top-1, rt.right, rt.bottom+1); + SelectObject(canvas, lastBrush); + break;} + + case WM_SETCURSOR: + if (LOWORD(lparam) == HTCLIENT) { + POINT pt; + GetCursorPos(&pt); + ScreenToClient(_hwnd, &pt); + + if (pt.x>=_split_pos-SPLIT_WIDTH/2 && pt.x<_split_pos+SPLIT_WIDTH/2+1) { + SetCursor(LoadCursor(0, IDC_SIZEWE)); + return TRUE; + } + } + goto def; + + case WM_LBUTTONDOWN: { + int x = GET_X_LPARAM(lparam); + + ClientRect rt(_hwnd); + + if (x>=_split_pos-SPLIT_WIDTH/2 && x<_split_pos+SPLIT_WIDTH/2+1) { + _last_split = _split_pos; + SetCapture(_hwnd); + } + + break;} + + case WM_LBUTTONUP: + if (GetCapture() == _hwnd) + ReleaseCapture(); + break; + + case WM_KEYDOWN: + if (wparam == VK_ESCAPE) + if (GetCapture() == _hwnd) { + _split_pos = _last_split; + resize_children(); + _last_split = -1; + ReleaseCapture(); + SetCursor(LoadCursor(0, IDC_ARROW)); + } + break; + + case WM_MOUSEMOVE: + if (GetCapture() == _hwnd) { + int x = LOWORD(lparam); + + ClientRect rt(_hwnd); + + if (x>=0 && x(new ShellBrowser(_hwnd, _left_hwnd, _right_hwnd, + _shellpath_info, _himlSmall, this)); + + _shellBrowser->Init(_hwnd); + + if (_left_hwnd) + _shellBrowser->Init(_himlSmall); + + // update _clnt_rect and set size of new created shell view windows + update_clnt_rect(); +} + +void SDIMainFrame::entry_selected(Entry* entry) +{ + if (entry->_etype == ET_SHELL) { + ShellEntry* shell_entry = static_cast(entry); + IShellFolder* folder; + + if (shell_entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + folder = static_cast(shell_entry)->_folder; + else + folder = shell_entry->get_parent_folder(); + + if (!folder) { + assert(folder); + return; + } + + TCHAR path[MAX_PATH]; + + if (shell_entry->get_path(path)) { + String url; + + if (path[0] == ':') + url.printf(TEXT("shell://%s"), path); + else + url.printf(TEXT("file://%s"), path); + + set_url(url); + } + + _shellBrowser->UpdateFolderView(folder); + + // update _clnt_rect and set size of new created shell view windows + update_clnt_rect(); + } +} + +void SDIMainFrame::set_url(LPCTSTR url) +{ + if (_url != url) { + _url = url; + + SetWindowText(_haddressedit, url); //SendMessage(_hwndFrame, PM_URL_CHANGED, 0, (LPARAM)url); + } +} + +void SDIMainFrame::jump_to(LPCTSTR path, int mode) +{/*@@todo + if (_shellBrowser.get() && (_shellpath_info._open_mode&~OWM_PIDL)==(mode&~OWM_PIDL)) { + _shellBrowser->jump_to(path); + + _shellpath_info._shell_path = path; + } else */{ + _shellpath_info._open_mode = mode; + _shellpath_info._shell_path = path; + _shellpath_info._root_shell_path = SpecialFolderPath(CSIDL_DRIVES, _hwnd); //@@ + + update_shell_browser(); + } +} + +void SDIMainFrame::jump_to(LPCITEMIDLIST path, int mode) +{ +/*@@todo + if (_shellBrowser.get() && (_shellpath_info._open_mode&~OWM_PIDL)==(mode&~OWM_PIDL)) { + ShellPath shell_path = path; + + _shellBrowser->jump_to(shell_path); + + _shellpath_info._shell_path = shell_path; + } else */{ + _shellpath_info._open_mode = mode; + _shellpath_info._shell_path = path; + _shellpath_info._root_shell_path = DesktopFolderPath(); //@@ + + update_shell_browser(); + } } diff --git a/reactos/subsys/system/explorer/shell/mainframe.h b/reactos/subsys/system/explorer/shell/mainframe.h index c1564dd2d9a..4c96cc916e9 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.h +++ b/reactos/subsys/system/explorer/shell/mainframe.h @@ -30,13 +30,65 @@ enum OPEN_WINDOW_MODE {OWM_EXPLORE=1, OWM_DETAILS=2, OWM_PIDL=4}; - /// Explorer frame window -struct MainFrame : public PreTranslateWindow + /// Explorer frame window base class +struct MainFrameBase : public PreTranslateWindow { typedef PreTranslateWindow super; - MainFrame(HWND hwnd); - ~MainFrame(); + MainFrameBase(HWND hwnd); + ~MainFrameBase(); + + static HWND Create(LPCTSTR path, bool mdi=true, UINT cmdshow=SW_SHOWNORMAL); + + WindowHandle _hwndrebar; + + WindowHandle _htoolbar; + WindowHandle _hstatusbar; + + WindowHandle _haddressedit; + WindowHandle _hcommandedit; + + WindowHandle _hsidebar; + HIMAGELIST _himl; + + HMENU _hMenuFrame; + HMENU _hMenuWindow; + + MenuInfo _menu_info; + +protected: + FullScreenParameters _fullscreen; + + HACCEL _hAccel; + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + bool ProcessMessage(UINT nmsg, WPARAM wparam, LPARAM lparam, LRESULT* pres); + int Command(int id, int code); + int Notify(int id, NMHDR* pnmh); + + virtual BOOL TranslateMsg(MSG* pmsg); + + void toggle_child(HWND hwnd, UINT cmd, HWND hchild, int band_idx=-1); + + void resize_frame_client(); + virtual void resize_frame(int cx, int cy); + virtual void frame_get_clientspace(PRECT prect); + + BOOL toggle_fullscreen(); + void fullscreen_move(); + + void FillBookmarks(); + virtual bool go_to(LPCTSTR url, bool new_window); +}; + + +#ifndef _NO_MDI + +struct MDIMainFrame : public MainFrameBase +{ + typedef MainFrameBase super; + + MDIMainFrame(HWND hwnd); static HWND Create(); static HWND Create(LPCTSTR path, int mode=OWM_EXPLORE|OWM_DETAILS); @@ -47,47 +99,68 @@ struct MainFrame : public PreTranslateWindow ChildWindow* CreateChild(LPCITEMIDLIST pidl, int mode=OWM_EXPLORE|OWM_DETAILS|OWM_PIDL); protected: - FullScreenParameters _fullscreen; - -#ifndef _NO_MDI HWND _hmdiclient; -#endif - WindowHandle _hstatusbar; - WindowHandle _hwndrebar; - WindowHandle _htoolbar; WindowHandle _hextrabar; WindowHandle _hdrivebar; - WindowHandle _haddressedit; - WindowHandle _hcommandedit; - WindowHandle _hsidebar; - - HIMAGELIST _himl; - - HMENU _hMenuFrame; - HMENU _hMenuWindow; - - MenuInfo _menu_info; protected: LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); int Command(int id, int code); - int Notify(int id, NMHDR* pnmh); - void toggle_child(HWND hwnd, UINT cmd, HWND hchild, int band_idx=-1); + virtual BOOL TranslateMsg(MSG* pmsg); + bool activate_drive_window(LPCTSTR path); bool activate_child_window(LPCTSTR filesys); - void resize_frame_rect(PRECT prect); - void resize_frame(int cx, int cy); - void resize_frame_client(); - void frame_get_clientspace(PRECT prect); - BOOL toggle_fullscreen(); - void fullscreen_move(); + virtual void resize_frame(int cx, int cy); + virtual void frame_get_clientspace(PRECT prect); - void FillBookmarks(); - bool go_to(LPCTSTR url, bool new_window); + virtual bool go_to(LPCTSTR url, bool new_window); - HACCEL _hAccel; TCHAR _drives[BUFFER_LEN]; }; + +#endif + + +struct SDIMainFrame : public ShellBrowserChildT +{ + typedef ShellBrowserChildT super; + + SDIMainFrame(HWND hwnd); + + static HWND Create(); + +protected: + ShellPathInfo _shellpath_info; + + WindowHandle _left_hwnd; + WindowHandle _right_hwnd; + +/**@todo focus handling for TAB switching + int _focus_pane; // 0: left 1: right +*/ + + int _split_pos; + int _last_split; + RECT _clnt_rect; + + String _url; + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + int Command(int id, int code); + + void resize_frame(int cx, int cy); + void resize_children(); + void update_clnt_rect(); + + void update_shell_browser(); + void jump_to(LPCTSTR path, int mode); + void jump_to(LPCITEMIDLIST path, int mode); + + // interface BrowserCallback + virtual void entry_selected(Entry* entry); + + void set_url(LPCTSTR url); +}; diff --git a/reactos/subsys/system/explorer/shell/pane.cpp b/reactos/subsys/system/explorer/shell/pane.cpp index e6d760c9fa4..652260faac9 100644 --- a/reactos/subsys/system/explorer/shell/pane.cpp +++ b/reactos/subsys/system/explorer/shell/pane.cpp @@ -980,9 +980,9 @@ BOOL Pane::command(UINT cmd) return TRUE; } -MainFrame* Pane::get_frame() +MainFrameBase* Pane::get_frame() { HWND owner = GetParent(_hwnd); - return (MainFrame*)owner; + return (MainFrameBase*)owner; } diff --git a/reactos/subsys/system/explorer/shell/pane.h b/reactos/subsys/system/explorer/shell/pane.h index c40824ace93..32c64ac1ba7 100644 --- a/reactos/subsys/system/explorer/shell/pane.h +++ b/reactos/subsys/system/explorer/shell/pane.h @@ -101,7 +101,7 @@ protected: void calc_width(LPDRAWITEMSTRUCT dis, int col, LPCTSTR str); void calc_tabbed_width(LPDRAWITEMSTRUCT dis, int col, LPCTSTR str); - MainFrame* get_frame(); + struct MainFrameBase* get_frame(); protected: HIMAGELIST _himl; diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index 72d438fc117..c674a8c681b 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -31,21 +31,22 @@ #include "../explorer_intres.h" -ShellBrowserChild::ShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info) - : super(hwnd, info), - _create_info(info) +ShellBrowser::ShellBrowser(HWND hwnd, HWND left_hwnd, WindowHandle& right_hwnd, ShellPathInfo& create_info, HIMAGELIST himl, BrowserCallback* cb) + : _hwnd(hwnd), + _left_hwnd(left_hwnd), + _right_hwnd(right_hwnd), + _create_info(create_info), + _himl(himl), + _callback(cb) { _pShellView = NULL; _pDropTarget = NULL; - _himlSmall = 0; _last_sel = 0; - // store path into history - if (info._path && *info._path) - _url_history.push(info._path); + _cur_dir = NULL; } -ShellBrowserChild::~ShellBrowserChild() +ShellBrowser::~ShellBrowser() { if (_pShellView) _pShellView->Release(); @@ -54,73 +55,87 @@ ShellBrowserChild::~ShellBrowserChild() _pDropTarget->Release(); _pDropTarget = NULL; } + + if (_right_hwnd) { + DestroyWindow(_right_hwnd); + _right_hwnd = 0; + } } -LRESULT ShellBrowserChild::Init(LPCREATESTRUCT pcs) +LRESULT ShellBrowser::Init(HWND hWndFrame) { - CONTEXT("ShellBrowserChild::Init()"); - - if (super::Init(pcs)) - return 1; - - _hWndFrame = GetParent(pcs->hwndParent); - - ClientRect rect(_hwnd); - - SHFILEINFO sfi; - - _himlSmall = (HIMAGELIST)SHGetFileInfo(TEXT("C:\\"), 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX|SHGFI_SMALLICON); -// _himlLarge = (HIMAGELIST)SHGetFileInfo(TEXT("C:\\"), 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX|SHGFI_LARGEICON); + CONTEXT("ShellBrowser::Init()"); + _hWndFrame = hWndFrame; const String& root_name = GetDesktopFolder().get_name(_create_info._root_shell_path, SHGDN_FORPARSING); _root._drive_type = DRIVE_UNKNOWN; - _root._sort_order = SORT_NAME; - lstrcpy(_root._volname, root_name); // most of the time "Desktop" _root._fs_flags = 0; lstrcpy(_root._fs, TEXT("Desktop")); -//@@ _root._entry->read_tree(shell_info._root_shell_path.get_folder(), info._shell_path, _root._sort_order/*_sortOrder*/); - -/*@todo - we should call read_tree() here to iterate through the hierarchy and open all folders from shell_info._root_shell_path to shell_info._shell_path - -> see FileChildWindow::FileChildWindow() -*/ _root._entry = new ShellDirectory(GetDesktopFolder(), _create_info._root_shell_path, _hwnd); - _root._entry->read_directory_base(_root._sort_order); + + jump_to(_create_info._shell_path); + + // -> set_curdir() + _root._entry->read_directory(); /* already filled by ShellDirectory constructor lstrcpy(_root._entry->_data.cFileName, TEXT("Desktop")); */ - - // create explorer treeview - if (_create_info._open_mode & OWM_EXPLORE) - _left_hwnd = CreateWindowEx(0, WC_TREEVIEW, NULL, - WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_SHOWSELALWAYS,//|TVS_NOTOOLTIPS - 0, rect.top, _split_pos-SPLIT_WIDTH/2, rect.bottom-rect.top, - _hwnd, (HMENU)IDC_FILETREE, g_Globals._hInstance, 0); - - if (_left_hwnd) { - TreeView_SetImageList(_left_hwnd, _himlSmall, TVSIL_NORMAL); - TreeView_SetScrollTime(_left_hwnd, 100); - - InitializeTree(); - - InitDragDrop(); - } else - UpdateFolderView(_create_info._shell_path.get_folder()); - return 0; } +void ShellBrowser::jump_to(LPCITEMIDLIST pidl) +{ + Entry* entry = NULL; -void ShellBrowserChild::InitializeTree() + //@@ + if (!_cur_dir) + _cur_dir = static_cast(_root._entry); + +/*@todo + we should call read_tree() here to iterate through the hierarchy and open all folders from shell_info._root_shell_path to shell_info._shell_path + _root._entry->read_tree(shell_info._root_shell_path.get_folder(), info._shell_path, SORT_NAME); + -> see FileChildWindow::FileChildWindow() +*/ + + if (_cur_dir) { + static DynamicFct ILFindChild(TEXT("SHELL32"), 24); + + LPCITEMIDLIST child_pidl; + + if (ILFindChild) + child_pidl = (*ILFindChild)(_cur_dir->create_absolute_pidl(), pidl); + else + child_pidl = pidl; // This is not correct in the common case, but works on the desktop level. + + if (child_pidl) { + _cur_dir->smart_scan(); + + entry = _cur_dir->find_entry(child_pidl); + + if (entry) + _callback->entry_selected(entry); + } + } + + //@@ work around as long as we don't iterate correctly through the ShellEntry tree + if (!entry) + UpdateFolderView(ShellFolder(pidl)); +} + + +void ShellBrowser::InitializeTree(HIMAGELIST himl) { CONTEXT("ShellBrowserChild::InitializeTree()"); + TreeView_SetImageList(_left_hwnd, himl, TVSIL_NORMAL); + TreeView_SetScrollTime(_left_hwnd, 100); + TV_INSERTSTRUCT tvInsert; tvInsert.hParent = 0; @@ -138,10 +153,9 @@ void ShellBrowserChild::InitializeTree() TreeView_Expand(_left_hwnd, hItem, TVE_EXPAND); } - -bool ShellBrowserChild::InitDragDrop() +bool ShellBrowser::InitDragDrop() { - CONTEXT("ShellBrowserChild::InitDragDrop()"); + CONTEXT("ShellBrowser::InitDragDrop()"); _pDropTarget = new TreeDropTarget(_left_hwnd); @@ -171,9 +185,9 @@ bool ShellBrowserChild::InitDragDrop() } -void ShellBrowserChild::OnTreeItemRClick(int idCtrl, LPNMHDR pnmh) +void ShellBrowser::OnTreeItemRClick(int idCtrl, LPNMHDR pnmh) { - CONTEXT("ShellBrowserChild::OnTreeItemRClick()"); + CONTEXT("ShellBrowser::OnTreeItemRClick()"); TVHITTESTINFO tvhti; @@ -185,13 +199,13 @@ void ShellBrowserChild::OnTreeItemRClick(int idCtrl, LPNMHDR pnmh) if (TVHT_ONITEM & tvhti.flags) { ClientToScreen(_left_hwnd, &tvhti.pt); - Tree_DoItemMenu(_left_hwnd, tvhti.hItem , &tvhti.pt); + Tree_DoItemMenu(_left_hwnd, tvhti.hItem, &tvhti.pt); } } -void ShellBrowserChild::Tree_DoItemMenu(HWND hwndTreeView, HTREEITEM hItem, LPPOINT pptScreen) +void ShellBrowser::Tree_DoItemMenu(HWND hwndTreeView, HTREEITEM hItem, LPPOINT pptScreen) { - CONTEXT("ShellBrowserChild::Tree_DoItemMenu()"); + CONTEXT("ShellBrowser::Tree_DoItemMenu()"); LPARAM itemData = TreeView_GetItemData(hwndTreeView, hItem); @@ -214,45 +228,47 @@ void ShellBrowserChild::Tree_DoItemMenu(HWND hwndTreeView, HTREEITEM hItem, LPPO } } -void ShellBrowserChild::OnTreeGetDispInfo(int idCtrl, LPNMHDR pnmh) +void ShellBrowser::OnTreeGetDispInfo(int idCtrl, LPNMHDR pnmh) { - CONTEXT("ShellBrowserChild::OnTreeGetDispInfo()"); + CONTEXT("ShellBrowser::OnTreeGetDispInfo()"); LPNMTVDISPINFO lpdi = (LPNMTVDISPINFO)pnmh; ShellEntry* entry = (ShellEntry*)lpdi->item.lParam; - if (lpdi->item.mask & TVIF_TEXT) - lpdi->item.pszText = entry->_display_name; - - if (lpdi->item.mask & (/*TVIF_TEXT|*/TVIF_IMAGE|TVIF_SELECTEDIMAGE)) { - ShellPath pidl_abs = entry->create_absolute_pidl(); // Caching of absolute PIDLs could enhance performance. - LPCITEMIDLIST pidl = pidl_abs; - - SHFILEINFO sfi; -/* + if (entry) { if (lpdi->item.mask & TVIF_TEXT) - if (SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL|SHGFI_DISPLAYNAME)) - lstrcpy(lpdi->item.pszText, sfi.szDisplayName); ///@todo look at cchTextMax if there is enough space available - else - lpdi->item.pszText = entry->_data.cFileName; -*/ - if (lpdi->item.mask & TVIF_IMAGE) - if ((HIMAGELIST)SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL|SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_LINKOVERLAY) == _himlSmall) - lpdi->item.iImage = sfi.iIcon; - else - lpdi->item.iImage = -1; + lpdi->item.pszText = entry->_display_name; - if (lpdi->item.mask & TVIF_SELECTEDIMAGE) - if ((HIMAGELIST)SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL|SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_OPENICON) == _himlSmall) - lpdi->item.iSelectedImage = sfi.iIcon; - else - lpdi->item.iSelectedImage = -1; + if (lpdi->item.mask & (/*TVIF_TEXT|*/TVIF_IMAGE|TVIF_SELECTEDIMAGE)) { + ShellPath pidl_abs = entry->create_absolute_pidl(); // Caching of absolute PIDLs could enhance performance. + LPCITEMIDLIST pidl = pidl_abs; + + SHFILEINFO sfi; +/* + if (lpdi->item.mask & TVIF_TEXT) + if (SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL|SHGFI_DISPLAYNAME)) + lstrcpy(lpdi->item.pszText, sfi.szDisplayName); ///@todo look at cchTextMax if there is enough space available + else + lpdi->item.pszText = entry->_data.cFileName; +*/ + if (lpdi->item.mask & TVIF_IMAGE) + if ((HIMAGELIST)SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL|SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_LINKOVERLAY) == _himl) + lpdi->item.iImage = sfi.iIcon; + else + lpdi->item.iImage = -1; + + if (lpdi->item.mask & TVIF_SELECTEDIMAGE) + if ((HIMAGELIST)SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL|SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_OPENICON) == _himl) + lpdi->item.iSelectedImage = sfi.iIcon; + else + lpdi->item.iSelectedImage = -1; + } } } -void ShellBrowserChild::OnTreeItemExpanding(int idCtrl, LPNMTREEVIEW pnmtv) +void ShellBrowser::OnTreeItemExpanding(int idCtrl, LPNMTREEVIEW pnmtv) { - CONTEXT("ShellBrowserChild::OnTreeItemExpanding()"); + CONTEXT("ShellBrowser::OnTreeItemExpanding()"); if (pnmtv->action == TVE_COLLAPSE) TreeView_Expand(_left_hwnd, pnmtv->itemNew.hItem, TVE_COLLAPSE|TVE_COLLAPSERESET); @@ -275,9 +291,9 @@ void ShellBrowserChild::OnTreeItemExpanding(int idCtrl, LPNMTREEVIEW pnmtv) } } -int ShellBrowserChild::InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFolder* pParentFolder) +int ShellBrowser::InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFolder* pParentFolder) { - CONTEXT("ShellBrowserChild::InsertSubitems()"); + CONTEXT("ShellBrowser::InsertSubitems()"); WaitCursor wait; @@ -328,47 +344,21 @@ int ShellBrowserChild::InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShel return cnt; } -void ShellBrowserChild::OnTreeItemSelected(int idCtrl, LPNMTREEVIEW pnmtv) +void ShellBrowser::OnTreeItemSelected(int idCtrl, LPNMTREEVIEW pnmtv) { - CONTEXT("ShellBrowserChild::OnTreeItemSelected()"); + CONTEXT("ShellBrowser::OnTreeItemSelected()"); ShellEntry* entry = (ShellEntry*)pnmtv->itemNew.lParam; _last_sel = pnmtv->itemNew.hItem; - if (entry->_etype == ET_SHELL) { - IShellFolder* folder; - - if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - folder = static_cast(entry)->_folder; - else - folder = entry->get_parent_folder(); - - if (!folder) { - assert(folder); - return; - } - - TCHAR path[MAX_PATH]; - - if (entry->get_path(path)) { - String url; - - if (path[0] == ':') - url.printf(TEXT("shell://%s"), path); - else - url.printf(TEXT("file://%s"), path); - - set_url(url); - } - - UpdateFolderView(folder); - } + if (entry) + _callback->entry_selected(entry); } -void ShellBrowserChild::UpdateFolderView(IShellFolder* folder) +void ShellBrowser::UpdateFolderView(IShellFolder* folder) { - CONTEXT("ShellBrowserChild::UpdateFolderView()"); + CONTEXT("ShellBrowser::UpdateFolderView()"); FOLDERSETTINGS fs; IShellView* pLastShellView = _pShellView; @@ -397,63 +387,15 @@ void ShellBrowserChild::UpdateFolderView(IShellFolder* folder) pLastShellView->UIActivate(SVUIA_DEACTIVATE); pLastShellView->DestroyViewWindow(); pLastShellView->Release(); - - ClientRect clnt(_hwnd); - resize_children(clnt.right, clnt.bottom); } _pShellView->UIActivate(SVUIA_ACTIVATE_NOFOCUS); } -LRESULT ShellBrowserChild::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +HRESULT ShellBrowser::OnDefaultCommand(LPIDA pida) { - switch(nmsg) { - case WM_GETISHELLBROWSER: // for Registry Explorer Plugin - return (LRESULT)static_cast(this); - - case PM_GET_SHELLBROWSER_PTR: - return (LRESULT)this; - - case PM_DISPATCH_COMMAND: { - switch(LOWORD(wparam)) { - case ID_WINDOW_NEW: {CONTEXT("ShellBrowserChild PM_DISPATCH_COMMAND ID_WINDOW_NEW"); - ShellBrowserChild::create(_create_info); - break;} - - case ID_REFRESH: - //@todo refresh shell child - break; - - default: - return super::WndProc(nmsg, wparam, lparam); - } - return TRUE;} - - default: - return super::WndProc(nmsg, wparam, lparam); - } - - return 0; -} - -int ShellBrowserChild::Notify(int id, NMHDR* pnmh) -{ - switch(pnmh->code) { - case TVN_GETDISPINFO: OnTreeGetDispInfo(id, pnmh); break; - case TVN_SELCHANGED: OnTreeItemSelected(id, (LPNMTREEVIEW)pnmh); break; - case TVN_ITEMEXPANDING: OnTreeItemExpanding(id, (LPNMTREEVIEW)pnmh); break; - case NM_RCLICK: OnTreeItemRClick(id, pnmh); break; - default: return super::Notify(id, pnmh); - } - - return 0; -} - - -HRESULT ShellBrowserChild::OnDefaultCommand(LPIDA pida) -{ - CONTEXT("ShellBrowserChild::OnDefaultCommand()"); + CONTEXT("ShellBrowser::OnDefaultCommand()"); if (pida->cidl >= 1) { if (_left_hwnd) { // explorer mode @@ -479,7 +421,7 @@ HRESULT ShellBrowserChild::OnDefaultCommand(LPIDA pida) } } } else { // no tree control - if (MainFrame::OpenShellFolders(pida, _hWndFrame)) + if (MDIMainFrame::OpenShellFolders(pida, _hWndFrame)) return S_OK; /* create new Frame Window @@ -493,9 +435,9 @@ HRESULT ShellBrowserChild::OnDefaultCommand(LPIDA pida) } -HTREEITEM ShellBrowserChild::select_entry(HTREEITEM hitem, Entry* entry, bool expand) +HTREEITEM ShellBrowser::select_entry(HTREEITEM hitem, Entry* entry, bool expand) { - CONTEXT("ShellBrowserChild::select_entry()"); + CONTEXT("ShellBrowser::select_entry()"); if (expand && !TreeView_Expand(_left_hwnd, hitem, TVE_EXPAND)) return 0; @@ -517,28 +459,7 @@ HTREEITEM ShellBrowserChild::select_entry(HTREEITEM hitem, Entry* entry, bool ex } -String ShellBrowserChild::jump_to_int(LPCTSTR url) -{ - String dir, fname; - - if (!_tcsnicmp(url, TEXT("shell://"), 8)) { - if (jump_to_pidl(ShellPath(url+8))) - return url; - } - - if (SplitFileSysURL(url, dir, fname)) { - - ///@todo use fname - - if (jump_to_pidl(ShellPath(dir))) - return FmtString(TEXT("file://%s"), (LPCTSTR)dir); - } - - return String(); -} - - -bool ShellBrowserChild::jump_to_pidl(LPCITEMIDLIST pidl) +bool ShellBrowser::jump_to_pidl(LPCITEMIDLIST pidl) { if (!_root._entry) return false; @@ -569,3 +490,171 @@ bool ShellBrowserChild::jump_to_pidl(LPCITEMIDLIST pidl) return false; } + + +#ifndef _NO_MDI + +MDIShellBrowserChild::MDIShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info) + : super(hwnd, info), + _create_info(info), + _shellpath_info(info) //@@ copies info -> no referenz to _create_info ! +{ +/**todo Conversion of shell path into path string -> store into URL history + // store path into history + if (info._path && *info._path) + _url_history.push(info._path); +*/ +} + + +MDIShellBrowserChild* MDIShellBrowserChild::create(const ShellChildWndInfo& info) +{ + ChildWindow* child = ChildWindow::create(info, info._pos.rcNormalPosition, + WINDOW_CREATOR_INFO(MDIShellBrowserChild,ShellChildWndInfo), CLASSNAME_CHILDWND, NULL, info._pos.showCmd==SW_SHOWMAXIMIZED? WS_MAXIMIZE: 0); + + return static_cast(child); +} + + +LRESULT MDIShellBrowserChild::Init(LPCREATESTRUCT pcs) +{ + CONTEXT("MDIShellBrowserChild::Init()"); + + if (super::Init(pcs)) + return 1; + + init_himl(); + + update_shell_browser(); + + if (&*_shellBrowser) + if (_left_hwnd) + _shellBrowser->Init(_himlSmall); + else + _shellBrowser->UpdateFolderView(_create_info._shell_path.get_folder()); + + return 0; +} + + +LRESULT MDIShellBrowserChild::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case PM_DISPATCH_COMMAND: { + switch(LOWORD(wparam)) { + case ID_WINDOW_NEW: {CONTEXT("MDIShellBrowserChild PM_DISPATCH_COMMAND ID_WINDOW_NEW"); + MDIShellBrowserChild::create(_create_info); + break;} + + case ID_REFRESH: + //@todo refresh shell child + break; + + case ID_VIEW_SDI: + MainFrameBase::Create(_url, false); + break; + + default: + return super::WndProc(nmsg, wparam, lparam); + } + return TRUE;} + + default: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; +} + +void MDIShellBrowserChild::update_shell_browser() +{ + int split_pos = DEFAULT_SPLIT_POS; + + if (_shellBrowser.get()) { + split_pos = _split_pos; + delete _shellBrowser.release(); + } + + // create explorer treeview + if (_create_info._open_mode & OWM_EXPLORE) { + if (!_left_hwnd) { + ClientRect rect(_hwnd); + + _left_hwnd = CreateWindowEx(0, WC_TREEVIEW, NULL, + WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_SHOWSELALWAYS,//|TVS_NOTOOLTIPS + 0, rect.top, split_pos-SPLIT_WIDTH/2, rect.bottom-rect.top, + _hwnd, (HMENU)IDC_FILETREE, g_Globals._hInstance, 0); + } + } else { + if (_left_hwnd) { + DestroyWindow(_left_hwnd); + _left_hwnd = 0; + } + } + + _shellBrowser = auto_ptr(new ShellBrowser(_hwnd, _left_hwnd, _right_hwnd, + _shellpath_info, _himlSmall, this)); + + _shellBrowser->Init(_hwnd); +} + + +String MDIShellBrowserChild::jump_to_int(LPCTSTR url) +{ + String dir, fname; + + if (!_tcsnicmp(url, TEXT("shell://"), 8)) { + if (_shellBrowser->jump_to_pidl(ShellPath(url+8))) + return url; + } + + if (SplitFileSysURL(url, dir, fname)) { + + ///@todo use fname + + if (_shellBrowser->jump_to_pidl(ShellPath(dir))) + return FmtString(TEXT("file://%s"), (LPCTSTR)dir); + } + + return String(); +} + + +void MDIShellBrowserChild::entry_selected(Entry* entry) +{ + if (entry->_etype == ET_SHELL) { + ShellEntry* shell_entry = static_cast(entry); + IShellFolder* folder; + + if (shell_entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + folder = static_cast(shell_entry)->_folder; + else + folder = shell_entry->get_parent_folder(); + + if (!folder) { + assert(folder); + return; + } + + TCHAR path[MAX_PATH]; + + if (shell_entry->get_path(path)) { + String url; + + if (path[0] == ':') + url.printf(TEXT("shell://%s"), path); + else + url.printf(TEXT("file://%s"), path); + + set_url(url); + } + + _shellBrowser->UpdateFolderView(folder); + + // set size of new created shell view windows + ClientRect rt(_hwnd); + resize_children(rt.right, rt.bottom); + } +} + +#endif diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.h b/reactos/subsys/system/explorer/shell/shellbrowser.h index a7546d4b02d..c99e07b573d 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.h +++ b/reactos/subsys/system/explorer/shell/shellbrowser.h @@ -29,26 +29,37 @@ #include "../utility/shellbrowserimpl.h" - /// Implementation of IShellBrowserImpl interface in explorer child windows -struct ShellBrowserChild : public ChildWindow, public IShellBrowserImpl + /// information structure to hold current shell folder information +struct ShellPathInfo { - typedef ChildWindow super; + ShellPathInfo(int mode=0) : _open_mode(mode) {} - ShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info); - ~ShellBrowserChild(); - - static ShellBrowserChild* create(const FileChildWndInfo& info) + ShellPathInfo(const ShellChildWndInfo& info) + : _shell_path(info._shell_path), + _root_shell_path(info._root_shell_path), + _open_mode(info._open_mode) { -#ifndef _NO_MDI - ChildWindow* child = ChildWindow::create(info, info._pos.rcNormalPosition, - WINDOW_CREATOR_INFO(ShellBrowserChild,ShellChildWndInfo), CLASSNAME_CHILDWND, NULL, info._pos.showCmd==SW_SHOWMAXIMIZED? WS_MAXIMIZE: 0); -#else - ///@todo SDI implementation -#endif - - return static_cast(child); } + ShellPath _shell_path; + ShellPath _root_shell_path; + + int _open_mode; //OPEN_WINDOW_MODE +}; + + +struct BrowserCallback +{ + virtual void entry_selected(Entry* entry) = 0; +}; + + + /// Implementation of IShellBrowserImpl interface in explorer child windows +struct ShellBrowser : public IShellBrowserImpl +{ + ShellBrowser(HWND hwnd, HWND left_hwnd, WindowHandle& right_hwnd, ShellPathInfo& create_info, HIMAGELIST himl, BrowserCallback* cb); + virtual ~ShellBrowser(); + //IOleWindow virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND* lphwnd) { @@ -101,39 +112,148 @@ struct ShellBrowserChild : public ChildWindow, public IShellBrowserImpl const Root& get_root() const {return _root;} -protected: - Root _root; - - WindowHandle _hWndFrame; - ShellChildWndInfo _create_info; - ShellFolder _folder; - - IShellView* _pShellView; // current hosted shellview - HIMAGELIST _himlSmall; // list -// HIMAGELIST _himlLarge; // shell image - TreeDropTarget* _pDropTarget; - - HTREEITEM _last_sel; - - LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); - int Notify(int id, NMHDR* pnmh); - - LRESULT Init(LPCREATESTRUCT); - void InitializeTree(/*const FileChildWndInfo& info*/); - int InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFolder* pParentFolder); - bool InitDragDrop(); - - virtual String jump_to_int(LPCTSTR url); - bool jump_to_pidl(LPCITEMIDLIST pidl); - - HRESULT OnDefaultCommand(LPIDA pida); - void OnTreeGetDispInfo(int idCtrl, LPNMHDR pnmh); void OnTreeItemExpanding(int idCtrl, LPNMTREEVIEW pnmtv); void OnTreeItemRClick(int idCtrl, LPNMHDR pnmh); void OnTreeItemSelected(int idCtrl, LPNMTREEVIEW pnmtv); + LRESULT Init(HWND hWndFrame); + + void Init(HIMAGELIST himl) + { + InitializeTree(himl); + InitDragDrop(); + } + + int InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFolder* pParentFolder); + + bool jump_to_pidl(LPCITEMIDLIST pidl); + + HRESULT OnDefaultCommand(LPIDA pida); + void UpdateFolderView(IShellFolder* folder); void Tree_DoItemMenu(HWND hwndTreeView, HTREEITEM hItem, LPPOINT pptScreen); HTREEITEM select_entry(HTREEITEM hitem, Entry* entry, bool expand=true); + +protected: + HWND _hwnd; + HWND _left_hwnd; + WindowHandle& _right_hwnd; + ShellPathInfo& _create_info; + HIMAGELIST _himl; + BrowserCallback* _callback; + + WindowHandle _hWndFrame; + ShellFolder _folder; + + IShellView* _pShellView; // current hosted shellview + TreeDropTarget* _pDropTarget; + + HTREEITEM _last_sel; + + Root _root; + ShellDirectory* _cur_dir; + + void InitializeTree(HIMAGELIST himl); + bool InitDragDrop(); + + // for SDIMainFrame + void jump_to(LPCITEMIDLIST pidl); }; + + +template struct ShellBrowserChildT + : public BASE, public BrowserCallback +{ + typedef BASE super; + + // constructor for SDIMainFrame + ShellBrowserChildT(HWND hwnd) + : super(hwnd) + { + _himlSmall = 0; + } + + // constructor for MDIShellBrowserChild + ShellBrowserChildT(HWND hwnd, const ShellChildWndInfo& info) + : super(hwnd, info) + { + _himlSmall = 0; + } + + void init_himl() + { + SHFILEINFO sfi; + + _himlSmall = (HIMAGELIST)SHGetFileInfo(TEXT("C:\\"), 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX|SHGFI_SMALLICON); +// _himlLarge = (HIMAGELIST)SHGetFileInfo(TEXT("C:\\"), 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX|SHGFI_LARGEICON); + } + +protected: + HIMAGELIST _himlSmall; // list +// HIMAGELIST _himlLarge; // shell image + +protected: + auto_ptr _shellBrowser; + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) + { + switch(nmsg) { + case PM_GET_SHELLBROWSER_PTR: + return (LRESULT)&*_shellBrowser; + + case WM_GETISHELLBROWSER: // for Registry Explorer Plugin + return (LRESULT)static_cast(&*_shellBrowser); + + default: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; + } + + int Notify(int id, NMHDR* pnmh) + { + if (&*_shellBrowser) + switch(pnmh->code) { + case TVN_GETDISPINFO: _shellBrowser->OnTreeGetDispInfo(id, pnmh); break; + case TVN_SELCHANGED: _shellBrowser->OnTreeItemSelected(id, (LPNMTREEVIEW)pnmh); break; + case TVN_ITEMEXPANDING: _shellBrowser->OnTreeItemExpanding(id, (LPNMTREEVIEW)pnmh); break; + case NM_RCLICK: _shellBrowser->OnTreeItemRClick(id, pnmh); break; + default: return super::Notify(id, pnmh); + } + else + return super::Notify(id, pnmh); + + return 0; + } +}; + + +#ifndef _NO_MDI + +struct MDIShellBrowserChild : public ShellBrowserChildT +{ + typedef ShellBrowserChildT super; + + MDIShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info); + + static MDIShellBrowserChild* create(const ShellChildWndInfo& info); + + LRESULT Init(LPCREATESTRUCT); + + virtual String jump_to_int(LPCTSTR url); + +protected: + ShellChildWndInfo _create_info; + ShellPathInfo _shellpath_info; + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + + void update_shell_browser(); + + // interface BrowserCallback + virtual void entry_selected(Entry* entry); +}; + +#endif diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.cpp b/reactos/subsys/system/explorer/taskbar/startmenu.cpp index 8bd3c5c4ec9..ec326a4f564 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.cpp +++ b/reactos/subsys/system/explorer/taskbar/startmenu.cpp @@ -1675,7 +1675,7 @@ int StartMenuHandler::Command(int id, int code) case IDC_CONTROL_PANEL: CloseStartMenu(id); - MainFrame::Create(TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}"), 0); + //@@SDIMainFrame::Create(TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}"), 0); break; case IDC_ADMIN: