#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))
{
_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},
CheckMenuItem(_menu_info._hMenuView, ID_VIEW_TOOL_BAR, MF_BYCOMMAND|MF_CHECKED);
- TBBUTTON extraBtns = {0, 0, TBSTATE_ENABLED, BTNS_SEP, {0, 0}, 0, 0};
-
-#ifndef _NO_REBAR
- _hextrabar = CreateToolbarEx(hwnd,
- CCS_NOPARENTALIGN|CCS_NORESIZE|
- WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST,
- IDW_EXTRABAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, NULL, 0,
- 16, 13, 16, 13, sizeof(TBBUTTON));
-#else
- _hextrabar = CreateToolbarEx(hwnd,
- WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST,
- IDW_EXTRABAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, &extraBtns, 1,
- 16, 13, 16, 13, sizeof(TBBUTTON));
-#endif
-
- CheckMenuItem(_menu_info._hMenuView, ID_VIEW_EXTRA_BAR, MF_BYCOMMAND|MF_CHECKED);
-
-
- extraBtns.fsStyle = BTNS_BUTTON;
-
-#ifdef __WINE__
- // insert unix file system button
- extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("/\0"));
- extraBtns.idCommand = ID_DRIVE_UNIX_FS;
- SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
-#endif
-
- // insert explorer window button
- extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("Explore\0"));
- extraBtns.idCommand = ID_DRIVE_DESKTOP;
- SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
-
- // insert shell namespace button
- extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("Shell\0"));
- extraBtns.idCommand = ID_DRIVE_SHELL_NS;
- SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
-
- // insert web control button
- extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("Web\0"));
- extraBtns.idCommand = ID_WEB_WINDOW;
- SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
-
-#define W_VER_NT 0
- if ((HIWORD(GetVersion())>>14) == W_VER_NT) {
- // insert NT object namespace button
- extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("NT Obj\0"));
- extraBtns.idCommand = ID_DRIVE_NTOBJ_NS;
- SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
- }
-
- // insert Registry button
- extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("Reg.\0"));
- extraBtns.idCommand = ID_DRIVE_REGISTRY;
- SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
-
-#ifdef _DEBUG
- // insert FAT direct file system access button
- extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("FAT\0"));
- extraBtns.idCommand = ID_DRIVE_FAT;
- SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
-#endif
-
-
- TBBUTTON drivebarBtn = {0, 0, TBSTATE_ENABLED, BTNS_SEP, {0, 0}, 0, 0};
- PTSTR p;
-
-#ifndef _NO_REBAR
- _hdrivebar = CreateToolbarEx(hwnd,
- CCS_NOPARENTALIGN|CCS_NORESIZE|
- WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST,
- IDW_DRIVEBAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, NULL, 0,
- 16, 13, 16, 13, sizeof(TBBUTTON));
-#else
- _hdrivebar = CreateToolbarEx(hwnd,
- WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST,
- IDW_DRIVEBAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, &drivebarBtn, 1,
- 16, 13, 16, 13, sizeof(TBBUTTON));
-#endif
-
- CheckMenuItem(_menu_info._hMenuView, ID_VIEW_DRIVE_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);
- GetLogicalDriveStrings(BUFFER_LEN, _drives);
+ _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);
- // register windows drive root strings
- SendMessage(_hdrivebar, TB_ADDSTRING, 0, (LPARAM)_drives);
+ /* 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);*/
- drivebarBtn.fsStyle = BTNS_BUTTON;
- drivebarBtn.idCommand = ID_DRIVE_FIRST;
+ _hstatusbar = CreateStatusWindow(WS_CHILD|WS_VISIBLE, 0, hwnd, IDW_STATUSBAR);
+ CheckMenuItem(_menu_info._hMenuView, ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED);
- for(p=_drives; *p; ) {
- 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;
- }
+ _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);
- SendMessage(_hdrivebar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&drivebarBtn);
- ++drivebarBtn.idCommand;
- ++drivebarBtn.iString;
+ TreeView_SetImageList(_hsidebar, _himl, TVSIL_NORMAL);
- while(*p++);
- }
+ CheckMenuItem(_menu_info._hMenuView, ID_VIEW_SIDE_BAR, MF_BYCOMMAND|MF_UNCHECKED/*MF_CHECKED*/);
// create rebar window to manage toolbar and drivebar
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;
- rbBand.cyMinChild = btn_hgt + 4;
- rbBand.cx = 284;
- SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
-
- rbBand.fStyle |= RBBS_BREAK;
- rbBand.lpText = TEXT("Drives");
- rbBand.hwndChild = _hdrivebar;
- rbBand.cxMinChild = 0;
- rbBand.cyMinChild = btn_hgt + 4;
- 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()
+MainFrameBase::~MainFrameBase()
{
ImageList_Destroy(_himl);
// don't exit desktop when closing file manager window
if (!g_Globals._desktop_mode)
- PostQuitMessage(0);
+ if (g_Globals._hMainWnd == _hwnd) // don't quit when switching between MDI and SDI mode
+ PostQuitMessage(0);
}
-HWND MainFrame::Create()
+LRESULT MainFrameBase::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
{
- HMENU hMenuFrame = LoadMenu(g_Globals._hInstance, MAKEINTRESOURCE(IDM_MAINFRAME));
+ LRESULT res;
- return super::Create(WINDOW_CREATOR(MainFrame), 0,
- (LPCTSTR)(int)g_Globals._hframeClass, ResString(IDS_TITLE), WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
- 0/*hwndDesktop*/, hMenuFrame);
+ if (ProcessMessage(nmsg, wparam, lparam, &res))
+ return res;
+ else
+ return super::WndProc(nmsg, wparam, lparam);
}
-HWND MainFrame::Create(LPCTSTR path, int mode)
+bool MainFrameBase::ProcessMessage(UINT nmsg, WPARAM wparam, LPARAM lparam, LRESULT* pres)
{
- HWND hMainFrame = Create();
- if (!hMainFrame)
- return 0;
+ switch(nmsg) {
+ case PM_TRANSLATE_MSG:
+ *pres = TranslateMsg((MSG*)lparam);
+ return true;
- ShowWindow(hMainFrame, SW_SHOW);
+ case WM_SHOWWINDOW:
+ if (wparam) // trigger child resizing after window creation - now we can succesfully call IsWindowVisible()
+ resize_frame_client();
+ return false; // goto def;
- MainFrame* pMainFrame = GET_WINDOW(MainFrame, hMainFrame);
+ case WM_CLOSE:
+ DestroyWindow(_hwnd);
+ g_Globals._hMainWnd = 0;
+ break;
- if (pMainFrame)
- pMainFrame->CreateChild(path, mode);
+ case WM_DESTROY:
+ break;
- return hMainFrame;
-}
+ case WM_SIZE:
+ resize_frame(LOWORD(lparam), HIWORD(lparam));
+ break; // do not pass message to DefFrameProc
-HWND MainFrame::Create(LPCITEMIDLIST pidl, int mode)
-{
- HWND hMainFrame = Create();
- if (!hMainFrame)
- return 0;
+ case WM_GETMINMAXINFO: {
+ LPMINMAXINFO lpmmi = (LPMINMAXINFO)lparam;
- ShowWindow(hMainFrame, SW_SHOW);
+ lpmmi->ptMaxTrackSize.x <<= 1;/*2*GetSystemMetrics(SM_CXSCREEN) / SM_CXVIRTUALSCREEN */
+ lpmmi->ptMaxTrackSize.y <<= 1;/*2*GetSystemMetrics(SM_CYSCREEN) / SM_CYVIRTUALSCREEN */
+ break;}
- MainFrame* pMainFrame = GET_WINDOW(MainFrame, hMainFrame);
+ case PM_FRM_CALC_CLIENT:
+ frame_get_clientspace((PRECT)lparam);
+ *pres = TRUE;
+ return true;
- if (pMainFrame)
- pMainFrame->CreateChild(pidl, mode);
+ case PM_FRM_GET_MENUINFO:
+ *pres = (LPARAM)&_menu_info;
+ return true;
- return hMainFrame;
-}
+ 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;
-ChildWindow* MainFrame::CreateChild(LPCTSTR path, int mode)
-{
- return reinterpret_cast<ChildWindow*>(SendMessage(_hwnd, PM_OPEN_WINDOW, mode, (LPARAM)path));
+ 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
+ _hextrabar = CreateToolbarEx(hwnd,
+ CCS_NOPARENTALIGN|CCS_NORESIZE|
+ WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST,
+ IDW_EXTRABAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, NULL, 0,
+ 16, 13, 16, 13, sizeof(TBBUTTON));
+#else
+ _hextrabar = CreateToolbarEx(hwnd,
+ WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST,
+ IDW_EXTRABAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, &extraBtns, 1,
+ 16, 13, 16, 13, sizeof(TBBUTTON));
+#endif
+
+ CheckMenuItem(_menu_info._hMenuView, ID_VIEW_EXTRA_BAR, MF_BYCOMMAND|MF_CHECKED);
+
+
+ extraBtns.fsStyle = BTNS_BUTTON;
+
+#ifdef __WINE__
+ // insert unix file system button
+ extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("/\0"));
+ extraBtns.idCommand = ID_DRIVE_UNIX_FS;
+ SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
+#endif
+
+ // insert explorer window button
+ extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("Explore\0"));
+ extraBtns.idCommand = ID_DRIVE_DESKTOP;
+ SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
+
+ // insert shell namespace button
+ extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("Shell\0"));
+ extraBtns.idCommand = ID_DRIVE_SHELL_NS;
+ SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
+
+ // insert web control button
+ extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("Web\0"));
+ extraBtns.idCommand = ID_WEB_WINDOW;
+ SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
+
+#define W_VER_NT 0
+ if ((HIWORD(GetVersion())>>14) == W_VER_NT) {
+ // insert NT object namespace button
+ extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("NT Obj\0"));
+ extraBtns.idCommand = ID_DRIVE_NTOBJ_NS;
+ SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
+ }
+
+ // insert Registry button
+ extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("Reg.\0"));
+ extraBtns.idCommand = ID_DRIVE_REGISTRY;
+ SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
+
+#ifdef _DEBUG
+ // insert FAT direct file system access button
+ extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("FAT\0"));
+ extraBtns.idCommand = ID_DRIVE_FAT;
+ SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
+#endif
+
+
+ TBBUTTON drivebarBtn = {0, 0, TBSTATE_ENABLED, BTNS_SEP, {0, 0}, 0, 0};
+ PTSTR p;
+
+#ifndef _NO_REBAR
+ _hdrivebar = CreateToolbarEx(hwnd,
+ CCS_NOPARENTALIGN|CCS_NORESIZE|
+ WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST,
+ IDW_DRIVEBAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, NULL, 0,
+ 16, 13, 16, 13, sizeof(TBBUTTON));
+#else
+ _hdrivebar = CreateToolbarEx(hwnd,
+ WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST,
+ IDW_DRIVEBAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, &drivebarBtn, 1,
+ 16, 13, 16, 13, sizeof(TBBUTTON));
+#endif
+
+ CheckMenuItem(_menu_info._hMenuView, ID_VIEW_DRIVE_BAR, MF_BYCOMMAND|MF_CHECKED);
+
+
+ GetLogicalDriveStrings(BUFFER_LEN, _drives);
+
+ // register windows drive root strings
+ SendMessage(_hdrivebar, TB_ADDSTRING, 0, (LPARAM)_drives);
+
+ drivebarBtn.fsStyle = BTNS_BUTTON;
+ drivebarBtn.idCommand = ID_DRIVE_FIRST;
+
+ for(p=_drives; *p; ) {
+ 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(_hdrivebar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&drivebarBtn);
+ ++drivebarBtn.idCommand;
+ ++drivebarBtn.iString;
+
+ while(*p++);
+ }
+
+
+#ifndef _NO_REBAR
+ 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.lpText = TEXT("Extras");
+ rbBand.hwndChild = _hextrabar;
+ rbBand.cxMinChild = 0;
+ rbBand.cyMinChild = btn_hgt + 4;
+ rbBand.cx = 284;
+ SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
+
+ rbBand.fStyle |= RBBS_BREAK;
+ rbBand.lpText = TEXT("Drives");
+ rbBand.hwndChild = _hdrivebar;
+ rbBand.cxMinChild = 0;
+ rbBand.cyMinChild = btn_hgt + 4;
+ rbBand.cx = 400;
+ SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
+#endif
+}
+
+
+HWND MDIMainFrame::Create()
+{
+ HMENU hMenuFrame = LoadMenu(g_Globals._hInstance, MAKEINTRESOURCE(IDM_MDIFRAME));
+
+ 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 MDIMainFrame::Create(LPCTSTR path, int mode)
+{
+ HWND hMainFrame = Create();
+ if (!hMainFrame)
+ return 0;
+
+ ShowWindow(hMainFrame, SW_SHOW);
+
+ MDIMainFrame* pMainFrame = GET_WINDOW(MDIMainFrame, hMainFrame);
+
+ if (pMainFrame)
+ pMainFrame->CreateChild(path, mode);
+
+ return hMainFrame;
+}
+
+HWND MDIMainFrame::Create(LPCITEMIDLIST pidl, int mode)
+{
+ HWND hMainFrame = Create();
+ if (!hMainFrame)
+ return 0;
+
+ ShowWindow(hMainFrame, SW_SHOW);
+
+ MDIMainFrame* pMainFrame = GET_WINDOW(MDIMainFrame, hMainFrame);
+
+ if (pMainFrame)
+ pMainFrame->CreateChild(pidl, mode);
+
+ return hMainFrame;
+}
+
+
+ChildWindow* MDIMainFrame::CreateChild(LPCTSTR path, int mode)
+{
+ return reinterpret_cast<ChildWindow*>(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<ChildWindow*>(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;
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) {
}
-LRESULT MainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
-{
- 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);
+BOOL MDIMainFrame::TranslateMsg(MSG* pmsg)
+{
+ 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();
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;
-
- case PM_SETSTATUSTEXT:
- SendMessage(_hstatusbar, SB_SETTEXT, 0, lparam);
- break;
-
- case PM_URL_CHANGED:
- SetWindowText(_haddressedit, (LPCTSTR)lparam);
- break;
+ default: {
+ LRESULT res;
- 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];
while(*root)
++root;
-#ifndef _NO_MDI
if (activate_drive_window(root))
return 0;
-#endif
_tsplitpath(root, drv, 0, 0, 0);
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;
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);
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];
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:
#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 (IsWindowVisible(_hdrivebar)) {
+ ClientRect rt(_hdrivebar);
+ prect->top += rt.bottom+2;
+ }
+}
- if (pnmgit->lParam) {
- const BookmarkNode& node = *(BookmarkNode*)pnmgit->lParam;
+void MDIMainFrame::resize_frame(int cx, int cy)
+{
+ if (cy <= 0)
+ return; // avoid resizing children when receiving RBN_AUTOSIZE while getting minimized
- 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;
+ RECT rect = {0, 0, cx, cy};
- if (!node._pbookmark->_url.empty()) {
- if (!txt.empty())
- txt += TEXT(" - ");
+ 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(_hextrabar)) {
+ SendMessage(_hextrabar, WM_SIZE, 0, 0);
+ WindowRect rt(_hextrabar);
+ 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 = --rect.top + rt.bottom;
+ MoveWindow(_hdrivebar, 0, rect.top, rt.right, new_top, TRUE);
+ rect.top = new_top;
+ // 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);
+ }
+
+ MoveWindow(_hmdiclient, rect.left-1, rect.top-1, rect.right-rect.left+2, rect.bottom-rect.top+1, TRUE);
+}
+
+bool MDIMainFrame::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(_hmdiclient,GW_CHILD); child_wnd; child_wnd=::GetNextWindow(child_wnd, GW_HWNDNEXT)) {
+ FileChildWindow* child = (FileChildWindow*) SendMessage(child_wnd, PM_GET_FILEWND_PTR, 0, 0);
+
+ if (child) {
+ _tsplitpath(child->get_root()._path, drv2, 0, 0, 0);
+
+ if (!lstrcmpi(drv2, drv1)) {
+ SendMessage(_hmdiclient, WM_MDIACTIVATE, (WPARAM)child_wnd, 0);
+
+ if (IsMinimized(child_wnd))
+ ShowWindow(child_wnd, SW_SHOWNORMAL);
+
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+bool MDIMainFrame::activate_child_window(LPCTSTR filesys)
+{
+ HWND child_wnd;
+
+ // search for a already open window of the given file system name
+ for(child_wnd=::GetNextWindow(_hmdiclient,GW_CHILD); child_wnd; child_wnd=::GetNextWindow(child_wnd, GW_HWNDNEXT)) {
+ FileChildWindow* child = (FileChildWindow*) SendMessage(child_wnd, PM_GET_FILEWND_PTR, 0, 0);
+
+ if (child) {
+ if (!lstrcmpi(child->get_root()._fs, filesys)) {
+ SendMessage(_hmdiclient, WM_MDIACTIVATE, (WPARAM)child_wnd, 0);
+
+ if (IsMinimized(child_wnd))
+ ShowWindow(child_wnd, SW_SHOWNORMAL);
+
+ return true;
+ }
+ } else {
+ ShellBrowser* shell_child = (ShellBrowser*) SendMessage(child_wnd, PM_GET_SHELLBROWSER_PTR, 0, 0);
+
+ if (shell_child) {
+ if (!lstrcmpi(shell_child->get_root()._fs, filesys)) {
+ SendMessage(_hmdiclient, WM_MDIACTIVATE, (WPARAM)child_wnd, 0);
+
+ if (IsMinimized(child_wnd))
+ ShowWindow(child_wnd, SW_SHOWNORMAL);
+
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+bool MDIMainFrame::go_to(LPCTSTR url, bool new_window)
+{
+ if (!new_window) {
+ HWND hwndClient = (HWND) SendMessage(_hmdiclient, WM_MDIGETACTIVE, 0, 0);
+
+ if (hwndClient)
+ if (SendMessage(hwndClient, PM_JUMP_TO_URL, 0, (LPARAM)url))
+ return true;
+ }
+
+ if (CreateChild(url))
+ return true;
+
+ 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;}
- txt += node._pbookmark->_url;
- }
+ case WM_SETCURSOR:
+ if (LOWORD(lparam) == HTCLIENT) {
+ POINT pt;
+ GetCursorPos(&pt);
+ ScreenToClient(_hwnd, &pt);
- lstrcpyn(pnmgit->pszText, txt.c_str(), pnmgit->cchTextMax);
+ 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 NM_DBLCLK: {
- HTREEITEM hitem = TreeView_GetSelection(_hsidebar);
- LPARAM lparam = TreeView_GetItemData(_hsidebar, hitem);
+ case WM_LBUTTONUP:
+ if (GetCapture() == _hwnd)
+ ReleaseCapture();
+ break;
- if (lparam) {
- const BookmarkNode& node = *(BookmarkNode*)lparam;
+ 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;
- if (node._type == BookmarkNode::BMNT_BOOKMARK) {
- bool new_window = GetAsyncKeyState(VK_SHIFT)<0;
+ case WM_MOUSEMOVE:
+ if (GetCapture() == _hwnd) {
+ int x = LOWORD(lparam);
+
+ ClientRect rt(_hwnd);
+
+ if (x>=0 && x<rt.right) {
+ _split_pos = x;
+ resize_children();
+ rt.left = x-SPLIT_WIDTH/2;
+ rt.right = x+SPLIT_WIDTH/2+1;
+ InvalidateRect(_hwnd, &rt, FALSE);
+ UpdateWindow(_left_hwnd);
+ UpdateWindow(_hwnd);
+ UpdateWindow(_right_hwnd);
+ }
+ }
+ break;
- go_to(node._pbookmark->_url, new_window);
+ case PM_OPEN_WINDOW: {CONTEXT("SDIMainFrame PM_OPEN_WINDOW");
+ TCHAR buffer[MAX_PATH];
+ LPCTSTR path;
+ ShellPath shell_path = DesktopFolderPath();
+
+ if (lparam) {
+ if (wparam & OWM_PIDL) {
+ // take over PIDL from lparam
+ shell_path.assign((LPCITEMIDLIST)lparam); // create as "rooted" window
+ FileSysShellPath fsp(shell_path);
+ path = fsp;
+
+ if (path) {
+ LOG(FmtString(TEXT("PM_OPEN_WINDOW: path=%s"), path));
+ lstrcpy(buffer, path);
+ path = buffer;
+ }
+ } else {
+ // take over path from lparam
+ path = (LPCTSTR)lparam;
+ shell_path = path; // create as "rooted" window
}
+ } else {
+ ///@todo read paths and window placements from registry
+ if (!GetCurrentDirectory(MAX_PATH, buffer))
+ *buffer = '\0';
+
+ path = buffer;
}
- break;}
+
+ jump_to(shell_path, (OPEN_WINDOW_MODE)wparam);
+ return TRUE;} // success
+
+ default: def:
+ return super::WndProc(nmsg, wparam, lparam);
}
return 0;
}
+int SDIMainFrame::Command(int id, int code)
+{
+ switch(id) {
+ case ID_VIEW_MDI:
+ MainFrameBase::Create(_url, true);
+ break;
+
+ default:
+ return super::Command(id, code);
+ }
+
+ return 0;
+}
-void MainFrame::resize_frame_rect(PRECT prect)
+void SDIMainFrame::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;
- }
-
- 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;
- }
-
- 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;
+ rect.top = rt.bottom;
+ // rect.bottom -= rt.bottom;
}
}
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
-}
-
-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);
+ _clnt_rect = rect;
- resize_frame_rect(&rect);
+ resize_children();
}
-void MainFrame::frame_get_clientspace(PRECT prect)
+void SDIMainFrame::resize_children()
{
- if (!IsIconic(_hwnd))
- GetClientRect(_hwnd, prect);
- else {
- WINDOWPLACEMENT wp;
+ HDWP hdwp = BeginDeferWindowPos(2);
- GetWindowPlacement(_hwnd, &wp);
+ int cx = _clnt_rect.left;
- 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 (_left_hwnd) {
+ cx = _split_pos + SPLIT_WIDTH/2;
- if (IsWindowVisible(_htoolbar)) {
- ClientRect rt(_htoolbar);
- prect->top += rt.bottom+2;
+ hdwp = DeferWindowPos(hdwp, _left_hwnd, 0, _clnt_rect.left, _clnt_rect.top, _split_pos-SPLIT_WIDTH/2-_clnt_rect.left, _clnt_rect.bottom-_clnt_rect.top, SWP_NOZORDER|SWP_NOACTIVATE);
+ } else {
+ //_split_pos = 0;
+ cx = 0;
}
- if (IsWindowVisible(_hdrivebar)) {
- ClientRect rt(_hdrivebar);
- prect->top += rt.bottom+2;
- }
+ if (_right_hwnd)
+ hdwp = DeferWindowPos(hdwp, _right_hwnd, 0, _clnt_rect.left+cx+1, _clnt_rect.top, _clnt_rect.right-cx, _clnt_rect.bottom-_clnt_rect.top, SWP_NOZORDER|SWP_NOACTIVATE);
- if (IsWindowVisible(_hstatusbar)) {
- ClientRect rt(_hstatusbar);
- prect->bottom -= rt.bottom;
- }
+ EndDeferWindowPos(hdwp);
}
-BOOL MainFrame::toggle_fullscreen()
+void SDIMainFrame::update_clnt_rect()
{
- 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);
- }
+ ClientRect rect(_hwnd);
- return _fullscreen._mode;
+ resize_frame(rect.right, rect.bottom);
}
-void MainFrame::fullscreen_move()
+void SDIMainFrame::update_shell_browser()
{
- RECT rt, pos;
- GetWindowRect(_hwnd, &pos);
-
- Frame_CalcFrameClient(_hwnd, &rt);
- ClientToScreen(_hwnd, (LPPOINT)&rt.left);
- ClientToScreen(_hwnd, (LPPOINT)&rt.right);
+ int split_pos = DEFAULT_SPLIT_POS;
- 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;
+ if (_shellBrowser.get()) {
+ split_pos = _split_pos;
+ delete _shellBrowser.release();
+ }
- MoveWindow(_hwnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE);
-}
+ // create explorer treeview
+ if (_shellpath_info._open_mode & OWM_EXPLORE) {
+ if (!_left_hwnd) {
+ ClientRect rect(_hwnd);
+ _left_hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, NULL,
+ WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_NOTOOLTIPS|TVS_SHOWSELALWAYS,
+ 0, rect.top, split_pos-SPLIT_WIDTH/2, rect.bottom-rect.top,
+ _hwnd, (HMENU)IDC_FILETREE, g_Globals._hInstance, 0);
-void MainFrame::toggle_child(HWND hwnd, UINT cmd, HWND hchild, int band_idx)
-{
- BOOL vis = IsWindowVisible(hchild);
+ // display tree window as long as the shell view is not yet visible
+ resize_frame(rect.right, rect.bottom);
+ MoveWindow(_left_hwnd, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, TRUE);
+ }
+ } else {
+ if (_left_hwnd) {
+ DestroyWindow(_left_hwnd);
+ _left_hwnd = 0;
+ }
+ }
- CheckMenuItem(_menu_info._hMenuView, cmd, vis?MF_BYCOMMAND:MF_BYCOMMAND|MF_CHECKED);
+ _shellBrowser = auto_ptr<ShellBrowser>(new ShellBrowser(_hwnd, _left_hwnd, _right_hwnd,
+ _shellpath_info, _himlSmall, this));
- if (band_idx != -1)
- SendMessage(_hwndrebar, RB_SHOWBAND, band_idx, !vis);
- else
- ShowWindow(hchild, vis?SW_HIDE:SW_SHOW);
+ _shellBrowser->Init(_hwnd);
- if (_fullscreen._mode)
- fullscreen_move();
+ if (_left_hwnd)
+ _shellBrowser->Init(_himlSmall);
- resize_frame_client();
+ // update _clnt_rect and set size of new created shell view windows
+ update_clnt_rect();
}
-#ifndef _NO_MDI
-bool MainFrame::activate_drive_window(LPCTSTR path)
+void SDIMainFrame::entry_selected(Entry* entry)
{
- TCHAR drv1[_MAX_DRIVE], drv2[_MAX_DRIVE];
- HWND child_wnd;
+ if (entry->_etype == ET_SHELL) {
+ ShellEntry* shell_entry = static_cast<ShellEntry*>(entry);
+ IShellFolder* folder;
+
+ if (shell_entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ folder = static_cast<ShellDirectory*>(shell_entry)->_folder;
+ else
+ folder = shell_entry->get_parent_folder();
+
+ if (!folder) {
+ assert(folder);
+ return;
+ }
- _tsplitpath(path, drv1, 0, 0, 0);
+ TCHAR path[MAX_PATH];
- // search for a already open window for the same drive
- for(child_wnd=::GetNextWindow(_hmdiclient,GW_CHILD); child_wnd; child_wnd=::GetNextWindow(child_wnd, GW_HWNDNEXT)) {
- FileChildWindow* child = (FileChildWindow*) SendMessage(child_wnd, PM_GET_FILEWND_PTR, 0, 0);
+ if (shell_entry->get_path(path)) {
+ String url;
- if (child) {
- _tsplitpath(child->get_root()._path, drv2, 0, 0, 0);
+ if (path[0] == ':')
+ url.printf(TEXT("shell://%s"), path);
+ else
+ url.printf(TEXT("file://%s"), path);
- if (!lstrcmpi(drv2, drv1)) {
- SendMessage(_hmdiclient, WM_MDIACTIVATE, (WPARAM)child_wnd, 0);
+ set_url(url);
+ }
- if (IsMinimized(child_wnd))
- ShowWindow(child_wnd, SW_SHOWNORMAL);
+ _shellBrowser->UpdateFolderView(folder);
- return true;
- }
- }
+ // update _clnt_rect and set size of new created shell view windows
+ update_clnt_rect();
}
-
- return false;
}
-bool MainFrame::activate_child_window(LPCTSTR filesys)
+void SDIMainFrame::set_url(LPCTSTR url)
{
- HWND child_wnd;
-
- // search for a already open window of the given file system name
- for(child_wnd=::GetNextWindow(_hmdiclient,GW_CHILD); child_wnd; child_wnd=::GetNextWindow(child_wnd, GW_HWNDNEXT)) {
- FileChildWindow* child = (FileChildWindow*) SendMessage(child_wnd, PM_GET_FILEWND_PTR, 0, 0);
-
- if (child) {
- if (!lstrcmpi(child->get_root()._fs, filesys)) {
- SendMessage(_hmdiclient, WM_MDIACTIVATE, (WPARAM)child_wnd, 0);
-
- if (IsMinimized(child_wnd))
- ShowWindow(child_wnd, SW_SHOWNORMAL);
-
- return true;
- }
- } else {
- ShellBrowserChild* shell_child = (ShellBrowserChild*) SendMessage(child_wnd, PM_GET_SHELLBROWSER_PTR, 0, 0);
-
- if (shell_child) {
- if (!lstrcmpi(shell_child->get_root()._fs, filesys)) {
- SendMessage(_hmdiclient, WM_MDIACTIVATE, (WPARAM)child_wnd, 0);
-
- if (IsMinimized(child_wnd))
- ShowWindow(child_wnd, SW_SHOWNORMAL);
+ if (_url != url) {
+ _url = url;
- return true;
- }
- }
- }
+ SetWindowText(_haddressedit, url); //SendMessage(_hwndFrame, PM_URL_CHANGED, 0, (LPARAM)url);
}
-
- return false;
}
-void MainFrame::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);
+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);
- g_Globals._favorites.fill_tree(_hsidebar, hitem_bookmarks, _himl, canvas);
+ _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); //@@
- TreeView_Expand(_hsidebar, hitem_bookmarks, TVE_EXPAND);
+ update_shell_browser();
+ }
}
-#endif
-
-
-bool MainFrame::go_to(LPCTSTR url, bool new_window)
+void SDIMainFrame::jump_to(LPCITEMIDLIST path, int mode)
{
-#ifndef _NO_MDI
- if (!new_window) {
- HWND hwndClient = (HWND) SendMessage(_hmdiclient, WM_MDIGETACTIVE, 0, 0);
+/*@@todo
+ if (_shellBrowser.get() && (_shellpath_info._open_mode&~OWM_PIDL)==(mode&~OWM_PIDL)) {
+ ShellPath shell_path = path;
- if (hwndClient)
- if (SendMessage(hwndClient, PM_JUMP_TO_URL, 0, (LPARAM)url))
- return true;
- }
+ _shellBrowser->jump_to(shell_path);
- if (CreateChild(url))
- return true;
-#else
- ///@todo SDI implementation
-#endif
+ _shellpath_info._shell_path = shell_path;
+ } else */{
+ _shellpath_info._open_mode = mode;
+ _shellpath_info._shell_path = path;
+ _shellpath_info._root_shell_path = DesktopFolderPath(); //@@
- return false;
+ update_shell_browser();
+ }
}
#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();
_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()");
+ CONTEXT("ShellBrowser::Init()");
- if (super::Init(pcs))
- return 1;
+ _hWndFrame = hWndFrame;
- _hWndFrame = GetParent(pcs->hwndParent);
+ const String& root_name = GetDesktopFolder().get_name(_create_info._root_shell_path, SHGDN_FORPARSING);
- ClientRect rect(_hwnd);
+ _root._drive_type = DRIVE_UNKNOWN;
+ lstrcpy(_root._volname, root_name); // most of the time "Desktop"
+ _root._fs_flags = 0;
+ lstrcpy(_root._fs, TEXT("Desktop"));
- SHFILEINFO sfi;
+ _root._entry = new ShellDirectory(GetDesktopFolder(), _create_info._root_shell_path, _hwnd);
- _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);
+ jump_to(_create_info._shell_path);
+ // -> set_curdir()
+ _root._entry->read_directory();
- const String& root_name = GetDesktopFolder().get_name(_create_info._root_shell_path, SHGDN_FORPARSING);
+ /* already filled by ShellDirectory constructor
+ lstrcpy(_root._entry->_data.cFileName, TEXT("Desktop")); */
- _root._drive_type = DRIVE_UNKNOWN;
- _root._sort_order = SORT_NAME;
+ return 0;
+}
- lstrcpy(_root._volname, root_name); // most of the time "Desktop"
- _root._fs_flags = 0;
- lstrcpy(_root._fs, TEXT("Desktop"));
+void ShellBrowser::jump_to(LPCITEMIDLIST pidl)
+{
+ Entry* entry = NULL;
-//@@ _root._entry->read_tree(shell_info._root_shell_path.get_folder(), info._shell_path, _root._sort_order/*_sortOrder*/);
+ //@@
+ if (!_cur_dir)
+ _cur_dir = static_cast<ShellDirectory*>(_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()
*/
- _root._entry = new ShellDirectory(GetDesktopFolder(), _create_info._root_shell_path, _hwnd);
- _root._entry->read_directory_base(_root._sort_order);
- /* already filled by ShellDirectory constructor
- lstrcpy(_root._entry->_data.cFileName, TEXT("Desktop")); */
+ if (_cur_dir) {
+ static DynamicFct<LPITEMIDLIST(WINAPI*)(LPCITEMIDLIST, LPCITEMIDLIST)> ILFindChild(TEXT("SHELL32"), 24);
+ LPCITEMIDLIST child_pidl;
- // 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 (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 (_left_hwnd) {
- TreeView_SetImageList(_left_hwnd, _himlSmall, TVSIL_NORMAL);
- TreeView_SetScrollTime(_left_hwnd, 100);
+ if (child_pidl) {
+ _cur_dir->smart_scan();
- InitializeTree();
+ entry = _cur_dir->find_entry(child_pidl);
- InitDragDrop();
- } else
- UpdateFolderView(_create_info._shell_path.get_folder());
+ if (entry)
+ _callback->entry_selected(entry);
+ }
+ }
- return 0;
+ //@@ work around as long as we don't iterate correctly through the ShellEntry tree
+ if (!entry)
+ UpdateFolderView(ShellFolder(pidl));
}
-void ShellBrowserChild::InitializeTree()
+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;
TreeView_Expand(_left_hwnd, hItem, TVE_EXPAND);
}
-
-bool ShellBrowserChild::InitDragDrop()
+bool ShellBrowser::InitDragDrop()
{
- CONTEXT("ShellBrowserChild::InitDragDrop()");
+ CONTEXT("ShellBrowser::InitDragDrop()");
_pDropTarget = new TreeDropTarget(_left_hwnd);
}
-void ShellBrowserChild::OnTreeItemRClick(int idCtrl, LPNMHDR pnmh)
+void ShellBrowser::OnTreeItemRClick(int idCtrl, LPNMHDR pnmh)
{
- CONTEXT("ShellBrowserChild::OnTreeItemRClick()");
+ CONTEXT("ShellBrowser::OnTreeItemRClick()");
TVHITTESTINFO tvhti;
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);
}
}
-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 (entry) {
+ 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;
+ 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;
+ 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_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;
-
- 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_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);
}
}
-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;
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<ShellDirectory*>(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;
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<IShellBrowser*>(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
}
}
} else { // no tree control
- if (MainFrame::OpenShellFolders(pida, _hWndFrame))
+ if (MDIMainFrame::OpenShellFolders(pida, _hWndFrame))
return S_OK;
/* create new Frame Window
}
-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;
}
-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;
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<MDIShellBrowserChild*>(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<ShellBrowser>(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<ShellEntry*>(entry);
+ IShellFolder* folder;
+
+ if (shell_entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ folder = static_cast<ShellDirectory*>(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