#include <mainframe.h>


| Public Types | |
| typedef ExtContextMenuHandlerT < ShellBrowserChildT < MainFrameBase > > | super | 
| Public Member Functions | |
| SDIMainFrame (HWND hwnd) | |
| Static Public Member Functions | |
| static HWND | Create () | 
| static HWND | Create (LPCTSTR path, int mode=OWM_EXPLORE|OWM_DETAILS) | 
| static HWND | Create (LPCITEMIDLIST pidl, int mode=OWM_EXPLORE|OWM_DETAILS|OWM_PIDL) | 
| Protected Member Functions | |
| 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) | 
| virtual void | entry_selected (Entry *entry) | 
| void | set_url (LPCTSTR url) | 
| Protected Attributes | |
| ShellPathInfo | _shellpath_info | 
| WindowHandle | _left_hwnd | 
| WindowHandle | _right_hwnd | 
| int | _split_pos | 
| int | _last_split | 
| RECT | _clnt_rect | 
| String | _url | 
Definition at line 141 of file mainframe.h.
Reimplemented from ExtContextMenuHandlerT< ShellBrowserChildT< MainFrameBase > >.
Definition at line 147 of file mainframe.h.
| SDIMainFrame::SDIMainFrame | ( | HWND | hwnd ) | 
Definition at line 1365 of file mainframe.cpp.
References _last_split, _split_pos, and DEFAULT_SPLIT_POS.
: super(hwnd) { _split_pos = DEFAULT_SPLIT_POS; _last_split = DEFAULT_SPLIT_POS; /* wait for PM_OPEN_WINDOW message before creating a shell view update_shell_browser();*/ }
| int SDIMainFrame::Command | ( | int | id, | 
| int | code | ||
| ) |  [protected, virtual] | 
Reimplemented from MainFrameBase.
Definition at line 1555 of file mainframe.cpp.
References _url, MainFrameBase::Command(), Create(), MainFrameBase::ExecuteCommandbar(), ID_VIEW_MDI, and IDW_COMMANDBAR.
{
    switch(id) {
      case ID_VIEW_MDI:
        MainFrameBase::Create(ExplorerCmd(_url, true));
        break;
      case IDW_COMMANDBAR:
        if (code == 1)
            ExecuteCommandbar(_url);
        break;
      default:
        return super::Command(id, code);
    }
    return 0;
}

| HWND SDIMainFrame::Create | ( | ) |  [static] | 
Definition at line 1375 of file mainframe.cpp.
References ExplorerGlobals::_hframeClass, ExplorerGlobals::_hInstance, g_Globals, IDM_SDIFRAME, IDS_TITLE, and WINDOW_CREATOR.
Referenced by Command(), and 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);
}

Definition at line 1401 of file mainframe.cpp.
References Create(), MDIMainFrame::CreateChild(), GET_WINDOW, and HWND.
{
    HWND hFrame = Create();
    if (!hFrame)
        return 0;
    ShowWindow(hFrame, SW_SHOW);
    MDIMainFrame* pMainFrame = GET_WINDOW(MDIMainFrame, hFrame);
    if (pMainFrame)
        pMainFrame->CreateChild(path, mode);
    return hFrame;
}

| HWND SDIMainFrame::Create | ( | LPCITEMIDLIST | pidl, | 
| int | mode = OWM_EXPLORE|OWM_DETAILS|OWM_PIDL | ||
| ) |  [static] | 
Definition at line 1385 of file mainframe.cpp.
References Create(), GET_WINDOW, HWND, and jump_to().
{
    HWND hFrame = Create();
    if (!hFrame)
        return 0;
    ShowWindow(hFrame, SW_SHOW);
    SDIMainFrame* pFrame = GET_WINDOW(SDIMainFrame, hFrame);
    if (pFrame)
        pFrame->jump_to(pidl, mode);
    return hFrame;
}

| void SDIMainFrame::entry_selected | ( | Entry * | entry ) |  [protected, virtual] | 
Implements BrowserCallback.
Definition at line 1692 of file mainframe.cpp.
References _left_hwnd, ShellBrowserChildT< MainFrameBase >::_shellBrowser, COUNTOF, Entry::get_path(), Entry::get_shell_folder(), String::printf(), resize_children(), set_url(), and TEXT.
{
    if (_left_hwnd)
        _shellBrowser->select_folder(entry, false);
    _shellBrowser->UpdateFolderView(entry->get_shell_folder());
     // set size of new created shell view windows
    resize_children();
    TCHAR path[MAX_PATH];
    if (entry->get_path(path, COUNTOF(path))) {
        String url;
        if (path[0] == ':')
            url.printf(TEXT("shell://%s"), path);
        else
            url.printf(TEXT("file://%s"), path);
        set_url(url);
    }
}

| void SDIMainFrame::jump_to | ( | LPCTSTR | path, | 
| int | mode | ||
| ) |  [protected] | 
Definition at line 1725 of file mainframe.cpp.
References ShellPathInfo::_open_mode, ShellPathInfo::_shell_path, _shellpath_info, and update_shell_browser().
Referenced by Create(), and WndProc().
{/*@@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;
        update_shell_browser();
    }
}


| void SDIMainFrame::jump_to | ( | LPCITEMIDLIST | path, | 
| int | mode | ||
| ) |  [protected] | 
Definition at line 1739 of file mainframe.cpp.
References ShellPathInfo::_open_mode, ShellPathInfo::_shell_path, ShellBrowserChildT< MainFrameBase >::_shellBrowser, _shellpath_info, OWM_PIDL, and update_shell_browser().
{
    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;
        update_shell_browser();
    }
}

| void SDIMainFrame::resize_children | ( | ) |  [protected] | 
Definition at line 1624 of file mainframe.cpp.
References _clnt_rect, _left_hwnd, _right_hwnd, _split_pos, and SPLIT_WIDTH.
Referenced by entry_selected(), resize_frame(), and WndProc().
{
    HDWP hdwp = BeginDeferWindowPos(2);
    int cx = _clnt_rect.left;
    if (_left_hwnd) {
        cx = _split_pos + SPLIT_WIDTH/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 = -1;
        cx = 0;
    }
    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);
    EndDeferWindowPos(hdwp);
}

| void SDIMainFrame::resize_frame | ( | int | cx, | 
| int | cy | ||
| ) |  [protected, virtual] | 
Reimplemented from MainFrameBase.
Definition at line 1574 of file mainframe.cpp.
References _clnt_rect, MainFrameBase::_haddressedit, MainFrameBase::_hcommandedit, MainFrameBase::_hsidebar, MainFrameBase::_hstatusbar, MainFrameBase::_htoolbar, MainFrameBase::_hwndrebar, and resize_children().
Referenced by update_clnt_rect(), update_shell_browser(), and WndProc().
{
    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;
        rect.top += height;
        rect.top += 5;
    } 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);
    }
    _clnt_rect = rect;
    resize_children();
}


| void SDIMainFrame::set_url | ( | LPCTSTR | url ) |  [protected] | 
Definition at line 1716 of file mainframe.cpp.
References MainFrameBase::_haddressedit, and _url.
Referenced by entry_selected().
{
    if (_url != url) {
        _url = url;
        SetWindowText(_haddressedit, url); //SendMessage(_hwndFrame, PM_URL_CHANGED, 0, (LPARAM)url);
    }
}

| void SDIMainFrame::update_clnt_rect | ( | ) |  [protected] | 
Definition at line 1645 of file mainframe.cpp.
References WindowHandle::_hwnd, and resize_frame().
Referenced by update_shell_browser().
{
    ClientRect rect(_hwnd);
    resize_frame(rect.right, rect.bottom);
}


| void SDIMainFrame::update_shell_browser | ( | ) |  [protected] | 
Definition at line 1652 of file mainframe.cpp.
References ExtContextMenuHandlerT< ShellBrowserChildT< MainFrameBase > >::_cm_ifs, ExplorerGlobals::_hInstance, WindowHandle::_hwnd, _left_hwnd, ShellPathInfo::_open_mode, _right_hwnd, ShellBrowserChildT< MainFrameBase >::_shellBrowser, _shellpath_info, _split_pos, DEFAULT_SPLIT_POS, g_Globals, IDC_FILETREE, OWM_EXPLORE, resize_frame(), SPLIT_WIDTH, and update_clnt_rect().
Referenced by jump_to().
{
    int split_pos = DEFAULT_SPLIT_POS;
    if (_shellBrowser.get()) {
        split_pos = _split_pos;
        delete _shellBrowser.release();
    }
     // 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|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);
             // 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;
        }
    }
    _shellBrowser = auto_ptr<ShellBrowser>(new ShellBrowser(_hwnd, _hwnd, _left_hwnd, _right_hwnd,
                                                _shellpath_info, this, _cm_ifs));
    if (_left_hwnd)
        _shellBrowser->Init();
     // update _clnt_rect and set size of new created shell view windows
    update_clnt_rect();
}


| LRESULT SDIMainFrame::WndProc | ( | UINT | nmsg, | 
| WPARAM | wparam, | ||
| LPARAM | lparam | ||
| ) |  [protected, virtual] | 
Reimplemented from ExtContextMenuHandlerT< ShellBrowserChildT< MainFrameBase > >.
Definition at line 1417 of file mainframe.cpp.
References WindowHandle::_hwnd, _last_split, _left_hwnd, _right_hwnd, ShellPathInfo::_root_shell_path, _shellpath_info, _split_pos, ShellPath::assign(), COLOR_SPLITBAR, CONTEXT, jump_to(), LOG, OWM_PIDL, OWM_ROOTED, PM_OPEN_WINDOW, resize_children(), resize_frame(), ScreenToClient(), SPLIT_WIDTH, TEXT, and ExtContextMenuHandlerT< ShellBrowserChildT< MainFrameBase > >::WndProc().
{
    switch(nmsg) {
      case WM_SIZE:
        resize_frame(LOWORD(lparam), HIWORD(lparam));
        break;
      case WM_PAINT: {
        PaintCanvas canvas(_hwnd);
        if (_left_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 (_left_hwnd)
            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:
        if (_left_hwnd) {
            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 = GET_X_LPARAM(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;
      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("SDIMainFrame 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;
            shell_path = path;
        }
        if (wparam & OWM_ROOTED)
            _shellpath_info._root_shell_path = shell_path;
        else
            _shellpath_info._root_shell_path = DesktopFolderPath(); //SpecialFolderPath(CSIDL_DRIVES, _hwnd);
        jump_to(shell_path, wparam);    ///@todo content of 'path' not used any more
        return TRUE;}   // success
      default: def:
        return super::WndProc(nmsg, wparam, lparam);
    }
    return 0;
}

| RECT SDIMainFrame::_clnt_rect  [protected] | 
Definition at line 167 of file mainframe.h.
Referenced by resize_children(), and resize_frame().
| int SDIMainFrame::_last_split  [protected] | 
Definition at line 166 of file mainframe.h.
Referenced by SDIMainFrame(), and WndProc().
| WindowHandle SDIMainFrame::_left_hwnd  [protected] | 
Definition at line 158 of file mainframe.h.
Referenced by entry_selected(), resize_children(), update_shell_browser(), and WndProc().
| WindowHandle SDIMainFrame::_right_hwnd  [protected] | 
Definition at line 159 of file mainframe.h.
Referenced by resize_children(), update_shell_browser(), and WndProc().
| ShellPathInfo SDIMainFrame::_shellpath_info  [protected] | 
Definition at line 156 of file mainframe.h.
Referenced by jump_to(), update_shell_browser(), and WndProc().
| int SDIMainFrame::_split_pos  [protected] | 
Definition at line 165 of file mainframe.h.
Referenced by resize_children(), SDIMainFrame(), update_shell_browser(), and WndProc().
| String SDIMainFrame::_url  [protected] | 
Definition at line 169 of file mainframe.h.
| ROS Explorer Source Code Documentation generated on 02.01.2013 by   |