Module: wine Branch: master Commit: 9544bcd10b4b7e0b97c16286ff2355c72ec777a0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9544bcd10b4b7e0b97c16286ff...
Author: Jay Yang jkelleyy@gmail.com Date: Sun Jul 3 21:35:55 2011 -0400
explorer: Add navigation buttons to explorer.
---
programs/explorer/explorer.c | 134 ++++++++++++++++++++++++++++++++++++++---- 1 files changed, 123 insertions(+), 11 deletions(-)
diff --git a/programs/explorer/explorer.c b/programs/explorer/explorer.c index 0dc82cf..bcdfcff 100644 --- a/programs/explorer/explorer.c +++ b/programs/explorer/explorer.c @@ -31,12 +31,15 @@ #include <windows.h> #include <shobjidl.h> #include <shlobj.h> - +#include <commoncontrols.h> +#include <commctrl.h>
WINE_DEFAULT_DEBUG_CHANNEL(explorer);
#define EXPLORER_INFO_INDEX 0
+#define NAV_TOOLBAR_HEIGHT 30 + #define DEFAULT_WIDTH 640 #define DEFAULT_HEIGHT 480
@@ -54,16 +57,28 @@ typedef struct parametersTAG { typedef struct { IExplorerBrowser *browser; + HWND main_window; + INT rebar_height; } explorer_info;
+enum +{ + BACK_BUTTON,FORWARD_BUTTON,UP_BUTTON +}; + static void make_explorer_window(IShellFolder* startFolder) { RECT explorerRect; - HWND window; + HWND rebar,nav_toolbar; FOLDERSETTINGS fs; explorer_info *info; HRESULT hres; WCHAR explorer_title[100]; + TBADDBITMAP bitmap_info; + TBBUTTON nav_buttons[3]; + int hist_offset,view_offset; + REBARBANDINFOW band_info; + memset(nav_buttons,0,sizeof(nav_buttons)); LoadStringW(explorer_hInstance,IDS_EXPLORER_TITLE,explorer_title, sizeof(explorer_title)/sizeof(WCHAR)); info = HeapAlloc(GetProcessHeap(),0,sizeof(explorer_info)); @@ -80,10 +95,12 @@ static void make_explorer_window(IShellFolder* startFolder) HeapFree(GetProcessHeap(),0,info); return; } + info->rebar_height=0; + info->main_window + = CreateWindowW(EXPLORER_CLASS,explorer_title,WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT,CW_USEDEFAULT,DEFAULT_WIDTH, + DEFAULT_HEIGHT,NULL,NULL,explorer_hInstance,NULL);
- window = CreateWindowW(EXPLORER_CLASS,explorer_title,WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT,CW_USEDEFAULT,DEFAULT_WIDTH, - DEFAULT_HEIGHT,NULL,NULL,explorer_hInstance,NULL); fs.ViewMode = FVM_DETAILS; fs.fFlags = FWF_AUTOARRANGE; explorerRect.left = 0; @@ -91,20 +108,60 @@ static void make_explorer_window(IShellFolder* startFolder) explorerRect.right = DEFAULT_WIDTH; explorerRect.bottom = DEFAULT_HEIGHT;
- IExplorerBrowser_Initialize(info->browser,window,&explorerRect,&fs); + IExplorerBrowser_Initialize(info->browser,info->main_window,&explorerRect,&fs); IExplorerBrowser_SetOptions(info->browser,EBO_SHOWFRAMES); - SetWindowLongPtrW(window,EXPLORER_INFO_INDEX,(LONG_PTR)info); + SetWindowLongPtrW(info->main_window,EXPLORER_INFO_INDEX,(LONG)info); + + /*setup navbar*/ + rebar = CreateWindowExW(WS_EX_TOOLWINDOW,REBARCLASSNAMEW,NULL, + WS_CHILD|WS_VISIBLE|RBS_VARHEIGHT|CCS_TOP|CCS_NODIVIDER, + 0,0,0,0,info->main_window,NULL,explorer_hInstance,NULL); + nav_toolbar + = CreateWindowExW(TBSTYLE_EX_MIXEDBUTTONS,TOOLBARCLASSNAMEW,NULL, + WS_CHILD|WS_VISIBLE|TBSTYLE_FLAT,0,0,0,0,rebar,NULL, + explorer_hInstance,NULL); + + bitmap_info.hInst = HINST_COMMCTRL; + bitmap_info.nID = IDB_HIST_LARGE_COLOR; + hist_offset= SendMessageW(nav_toolbar,TB_ADDBITMAP,0,(LPARAM)&bitmap_info); + bitmap_info.nID = IDB_VIEW_LARGE_COLOR; + view_offset= SendMessageW(nav_toolbar,TB_ADDBITMAP,0,(LPARAM)&bitmap_info); + + nav_buttons[0].iBitmap=hist_offset+HIST_BACK; + nav_buttons[0].idCommand=BACK_BUTTON; + nav_buttons[0].fsState=TBSTATE_ENABLED; + nav_buttons[0].fsStyle=BTNS_BUTTON|BTNS_AUTOSIZE; + nav_buttons[1].iBitmap=hist_offset+HIST_FORWARD; + nav_buttons[1].idCommand=FORWARD_BUTTON; + nav_buttons[1].fsState=TBSTATE_ENABLED; + nav_buttons[1].fsStyle=BTNS_BUTTON|BTNS_AUTOSIZE; + nav_buttons[2].iBitmap=view_offset+VIEW_PARENTFOLDER; + nav_buttons[2].idCommand=UP_BUTTON; + nav_buttons[2].fsState=TBSTATE_ENABLED; + nav_buttons[2].fsStyle=BTNS_BUTTON|BTNS_AUTOSIZE; + SendMessageW(nav_toolbar,TB_BUTTONSTRUCTSIZE,sizeof(TBBUTTON),0); + SendMessageW(nav_toolbar,TB_ADDBUTTONSW,sizeof(nav_buttons)/sizeof(TBBUTTON),(LPARAM)nav_buttons); + + band_info.cbSize = sizeof(band_info); + band_info.fMask = RBBIM_STYLE|RBBIM_CHILD|RBBIM_CHILDSIZE|RBBIM_SIZE; + band_info.hwndChild = nav_toolbar; + band_info.fStyle=RBBS_GRIPPERALWAYS|RBBS_CHILDEDGE; + band_info.cyChild=NAV_TOOLBAR_HEIGHT; + band_info.cx=0; + band_info.cyMinChild=NAV_TOOLBAR_HEIGHT; + band_info.cxMinChild=0; + SendMessageW(rebar,RB_INSERTBANDW,-1,(LPARAM)&band_info); IExplorerBrowser_BrowseToObject(info->browser,(IUnknown*)startFolder, SBSP_ABSOLUTE); - ShowWindow(window,SW_SHOWDEFAULT); - UpdateWindow(window); + ShowWindow(info->main_window,SW_SHOWDEFAULT); + UpdateWindow(info->main_window); }
static void update_window_size(explorer_info *info, int height, int width) { RECT new_rect; new_rect.left = 0; - new_rect.top = 0; + new_rect.top = info->rebar_height; new_rect.right = width; new_rect.bottom = height; IExplorerBrowser_SetRect(info->browser,NULL,new_rect); @@ -116,12 +173,40 @@ static void do_exit(int code) ExitProcess(code); }
+static LRESULT update_rebar_size(explorer_info* info,NMRBAUTOSIZE *size_info) +{ + RECT new_rect; + RECT window_rect; + info->rebar_height = size_info->rcTarget.bottom-size_info->rcTarget.top; + GetWindowRect(info->main_window,&window_rect); + new_rect.left = 0; + new_rect.top = info->rebar_height; + new_rect.right = window_rect.right-window_rect.left; + new_rect.bottom = window_rect.bottom-window_rect.top; + IExplorerBrowser_SetRect(info->browser,NULL,new_rect); + return 0; +} + +static LRESULT explorer_on_notify(explorer_info* info,NMHDR* notification) +{ + WINE_TRACE("code=%i\n",notification->code); + switch(notification->code) + { + case RBN_AUTOSIZE: + return update_rebar_size(info,(NMRBAUTOSIZE*)notification); + default: + break; + } + return 0; +} + static LRESULT CALLBACK explorer_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { explorer_info *info = (explorer_info*)GetWindowLongPtrW(hwnd,EXPLORER_INFO_INDEX); IExplorerBrowser *browser = NULL;
+ WINE_TRACE("(hwnd=%p,uMsg=%u,wParam=%lx,lParam=%lx)\n",hwnd,uMsg,wParam,lParam); if(info) browser = info->browser; switch(uMsg) @@ -133,6 +218,25 @@ static LRESULT CALLBACK explorer_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, L break; case WM_QUIT: do_exit(wParam); + case WM_NOTIFY: + return explorer_on_notify(info,(NMHDR*)lParam); + case WM_COMMAND: + if(HIWORD(wParam)==BN_CLICKED) + { + switch(LOWORD(wParam)) + { + case BACK_BUTTON: + IExplorerBrowser_BrowseToObject(browser,NULL,SBSP_NAVIGATEBACK); + break; + case FORWARD_BUTTON: + IExplorerBrowser_BrowseToObject(browser,NULL,SBSP_NAVIGATEFORWARD); + break; + case UP_BUTTON: + IExplorerBrowser_BrowseToObject(browser,NULL,SBSP_PARENT); + break; + } + } + break; case WM_SIZE: update_window_size(info,HIWORD(lParam),LOWORD(lParam)); break; @@ -153,7 +257,7 @@ static void register_explorer_window_class(void) window_class.hInstance = explorer_hInstance; window_class.hIcon = NULL; window_class.hCursor = NULL; - window_class.hbrBackground = NULL; + window_class.hbrBackground = (HBRUSH)COLOR_BACKGROUND; window_class.lpszMenuName = NULL; window_class.lpszClassName = EXPLORER_CLASS; window_class.hIconSm = NULL; @@ -309,6 +413,7 @@ int WINAPI wWinMain(HINSTANCE hinstance, HRESULT hres; MSG msg; IShellFolder *folder; + INITCOMMONCONTROLSEX init_info;
memset(¶meters,0,sizeof(parameters)); explorer_hInstance = hinstance; @@ -319,6 +424,13 @@ int WINAPI wWinMain(HINSTANCE hinstance, WINE_ERR("Could not initialize COM\n"); ExitProcess(EXIT_FAILURE); } + init_info.dwSize = sizeof(INITCOMMONCONTROLSEX); + init_info.dwICC = ICC_BAR_CLASSES | ICC_COOL_CLASSES; + if(!InitCommonControlsEx(&init_info)) + { + WINE_ERR("Could not initialize Comctl\n"); + ExitProcess(EXIT_FAILURE); + } register_explorer_window_class(); folder = get_starting_shell_folder(¶meters); make_explorer_window(folder);