Owen Rudge : hhctrl.ocx: Implement Show/Hide functionality.

Alexandre Julliard julliard at winehq.org
Tue Jan 18 10:27:34 CST 2011


Module: wine
Branch: master
Commit: deda1b2c4e7ca439f2cbafe7bd8b755851ee9dfb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=deda1b2c4e7ca439f2cbafe7bd8b755851ee9dfb

Author: Owen Rudge <orudge at codeweavers.com>
Date:   Mon Jan 17 22:26:40 2011 +0000

hhctrl.ocx: Implement Show/Hide functionality.

---

 dlls/hhctrl.ocx/help.c |   98 +++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 85 insertions(+), 13 deletions(-)

diff --git a/dlls/hhctrl.ocx/help.c b/dlls/hhctrl.ocx/help.c
index 31a7c1b..9d732a6 100644
--- a/dlls/hhctrl.ocx/help.c
+++ b/dlls/hhctrl.ocx/help.c
@@ -3,6 +3,7 @@
  *
  * Copyright 2005 James Hawkins
  * Copyright 2007 Jacek Caban for CodeWeavers
+ * Copyright 2011 Owen Rudge for CodeWeavers
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -32,6 +33,7 @@
 WINE_DEFAULT_DEBUG_CHANNEL(htmlhelp);
 
 static LRESULT Help_OnSize(HWND hWnd);
+static void ExpandContract(HHInfo *pHHInfo);
 
 /* Window type defaults */
 
@@ -264,10 +266,13 @@ static BOOL HH_AddSizeBar(HHInfo *pHHInfo)
 {
     HWND hWnd;
     HWND hwndParent = pHHInfo->WinType.hwndHelp;
-    DWORD dwStyles = WS_CHILDWINDOW | WS_VISIBLE | WS_OVERLAPPED;
+    DWORD dwStyles = WS_CHILDWINDOW | WS_OVERLAPPED;
     DWORD dwExStyles = WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR;
     RECT rc;
 
+    if (!pHHInfo->WinType.fNotExpanded)
+        dwStyles |= WS_VISIBLE;
+
     SB_GetSizeBarRect(pHHInfo, &rc);
 
     hWnd = CreateWindowExW(dwExStyles, szSizeBarClass, szEmpty, dwStyles,
@@ -646,6 +651,8 @@ static void TB_OnClick(HWND hWnd, DWORD dwID)
             break;
         case IDTB_EXPAND:
         case IDTB_CONTRACT:
+            ExpandContract(info);
+            break;
         case IDTB_SYNC:
         case IDTB_OPTIONS:
         case IDTB_BROWSE_FWD:
@@ -671,12 +678,20 @@ static void TB_AddButton(TBBUTTON *pButtons, DWORD dwIndex, DWORD dwID)
     pButtons[dwIndex].iString = 0;
 }
 
-static void TB_AddButtonsFromFlags(TBBUTTON *pButtons, DWORD dwButtonFlags, LPDWORD pdwNumButtons)
+static void TB_AddButtonsFromFlags(HHInfo *pHHInfo, TBBUTTON *pButtons, DWORD dwButtonFlags, LPDWORD pdwNumButtons)
 {
     *pdwNumButtons = 0;
 
     if (dwButtonFlags & HHWIN_BUTTON_EXPAND)
+    {
         TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_EXPAND);
+        TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_CONTRACT);
+
+        if (pHHInfo->WinType.fNotExpanded)
+            pButtons[1].fsState |= TBSTATE_HIDDEN;
+        else
+            pButtons[0].fsState |= TBSTATE_HIDDEN;
+    }
 
     if (dwButtonFlags & HHWIN_BUTTON_BACK)
         TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_BACK);
@@ -733,7 +748,7 @@ static BOOL HH_AddToolbar(HHInfo *pHHInfo)
     else
         toolbarFlags = HHWIN_DEF_BUTTONS;
 
-    TB_AddButtonsFromFlags(buttons, toolbarFlags, &dwNumButtons);
+    TB_AddButtonsFromFlags(pHHInfo, buttons, toolbarFlags, &dwNumButtons);
 
     dwStyles = WS_CHILDWINDOW | WS_VISIBLE | TBSTYLE_FLAT |
                TBSTYLE_WRAPABLE | TBSTYLE_TOOLTIPS | CCS_NODIVIDER;
@@ -815,10 +830,13 @@ static BOOL HH_AddNavigationPane(HHInfo *info)
 {
     HWND hWnd, hwndTabCtrl;
     HWND hwndParent = info->WinType.hwndHelp;
-    DWORD dwStyles = WS_CHILDWINDOW | WS_VISIBLE;
+    DWORD dwStyles = WS_CHILDWINDOW;
     DWORD dwExStyles = WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR;
     RECT rc;
 
+    if (!info->WinType.fNotExpanded)
+        dwStyles |= WS_VISIBLE;
+
     NP_GetNavigationRect(info, &rc);
 
     hWnd = CreateWindowExW(dwExStyles, szChildClass, szEmpty, dwStyles,
@@ -829,7 +847,7 @@ static BOOL HH_AddNavigationPane(HHInfo *info)
 
     SetWindowLongPtrW(hWnd, GWLP_USERDATA, (LONG_PTR)info);
 
-    hwndTabCtrl = CreateWindowExW(dwExStyles, WC_TABCONTROLW, szEmpty, dwStyles,
+    hwndTabCtrl = CreateWindowExW(dwExStyles, WC_TABCONTROLW, szEmpty, dwStyles | WS_VISIBLE,
                                   0, TAB_TOP_PADDING,
                                   rc.right - TAB_RIGHT_PADDING,
                                   rc.bottom - TAB_TOP_PADDING,
@@ -864,10 +882,16 @@ static void HP_GetHTMLRect(HHInfo *info, RECT *rc)
 
     GetClientRect(info->WinType.hwndHelp, &rectWND);
     GetClientRect(info->WinType.hwndToolBar, &rectTB);
-    GetClientRect(info->WinType.hwndNavigation, &rectNP);
     GetClientRect(info->hwndSizeBar, &rectSB);
 
-    rc->left = rectNP.right + rectSB.right;
+    if (info->WinType.fNotExpanded)
+        rc->left = 0;
+    else
+    {
+        GetClientRect(info->WinType.hwndNavigation, &rectNP);
+        rc->left = rectNP.right + rectSB.right;
+    }
+
     rc->top = rectTB.bottom;
     rc->right = rectWND.right - rc->left;
     rc->bottom = rectWND.bottom - rectTB.bottom;
@@ -1203,6 +1227,37 @@ static BOOL AddIndexPopup(HHInfo *info)
 
 /* Viewer Window */
 
+static void ExpandContract(HHInfo *pHHInfo)
+{
+    RECT r, nav;
+
+    pHHInfo->WinType.fNotExpanded = !pHHInfo->WinType.fNotExpanded;
+    GetWindowRect(pHHInfo->WinType.hwndHelp, &r);
+    NP_GetNavigationRect(pHHInfo, &nav);
+
+    /* hide/show both the nav bar and the size bar */
+    if (pHHInfo->WinType.fNotExpanded)
+    {
+        ShowWindow(pHHInfo->WinType.hwndNavigation, SW_HIDE);
+        ShowWindow(pHHInfo->hwndSizeBar, SW_HIDE);
+        r.left = r.left + nav.right;
+
+        SendMessageW(pHHInfo->WinType.hwndToolBar, TB_HIDEBUTTON, IDTB_EXPAND, MAKELPARAM(FALSE, 0));
+        SendMessageW(pHHInfo->WinType.hwndToolBar, TB_HIDEBUTTON, IDTB_CONTRACT, MAKELPARAM(TRUE, 0));
+    }
+    else
+    {
+        ShowWindow(pHHInfo->WinType.hwndNavigation, SW_SHOW);
+        ShowWindow(pHHInfo->hwndSizeBar, SW_SHOW);
+        r.left = r.left - nav.right;
+
+        SendMessageW(pHHInfo->WinType.hwndToolBar, TB_HIDEBUTTON, IDTB_EXPAND, MAKELPARAM(TRUE, 0));
+        SendMessageW(pHHInfo->WinType.hwndToolBar, TB_HIDEBUTTON, IDTB_CONTRACT, MAKELPARAM(FALSE, 0));
+    }
+
+    MoveWindow(pHHInfo->WinType.hwndHelp, r.left, r.top, r.right-r.left, r.bottom-r.top, TRUE);
+}
+
 static LRESULT Help_OnSize(HWND hWnd)
 {
     HHInfo *pHHInfo = (HHInfo *)GetWindowLongPtrW(hWnd, GWLP_USERDATA);
@@ -1212,13 +1267,17 @@ static LRESULT Help_OnSize(HWND hWnd)
     if (!pHHInfo)
         return 0;
 
-    NP_GetNavigationRect(pHHInfo, &rc);
-    SetWindowPos(pHHInfo->WinType.hwndNavigation, HWND_TOP, 0, 0,
-                 rc.right, rc.bottom, SWP_NOMOVE);
+    if (!pHHInfo->WinType.fNotExpanded)
+    {
+        NP_GetNavigationRect(pHHInfo, &rc);
+        SetWindowPos(pHHInfo->WinType.hwndNavigation, HWND_TOP, 0, 0,
+                     rc.right, rc.bottom, SWP_NOMOVE);
 
-    SB_GetSizeBarRect(pHHInfo, &rc);
-    SetWindowPos(pHHInfo->hwndSizeBar, HWND_TOP, rc.left, rc.top,
-                 rc.right, rc.bottom, SWP_SHOWWINDOW);
+        SB_GetSizeBarRect(pHHInfo, &rc);
+        SetWindowPos(pHHInfo->hwndSizeBar, HWND_TOP, rc.left, rc.top,
+                     rc.right, rc.bottom, SWP_SHOWWINDOW);
+
+    }
 
     HP_GetHTMLRect(pHHInfo, &rc);
     SetWindowPos(pHHInfo->WinType.hwndHTML, HWND_TOP, rc.left, rc.top,
@@ -1312,6 +1371,19 @@ static BOOL HH_CreateHelpWindow(HHInfo *info)
         height = WINTYPE_DEFAULT_HEIGHT;
     }
 
+    if (info->WinType.fNotExpanded)
+    {
+        if (!(info->WinType.fsValidMembers & HHWIN_PARAM_NAV_WIDTH) &&
+              info->WinType.iNavWidth == 0)
+        {
+            info->WinType.iNavWidth = WINTYPE_DEFAULT_NAVWIDTH;
+        }
+
+        x += info->WinType.iNavWidth;
+        width -= info->WinType.iNavWidth;
+    }
+
+
     caption = info->WinType.pszCaption;
     if (!*caption) caption = info->pCHMInfo->defTitle;
 




More information about the wine-cvs mailing list