1 /* 2 * Copyright 2005 James Hawkins 3 * Copyright 2007 Jacek Caban for CodeWeavers 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2.1 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public 16 * License along with this library; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 18 */ 19 20 #ifndef HHCTRL_H 21 #define HHCTRL_H 22 23 #include <stdarg.h> 24 25 #define COBJMACROS 26 27 #include "windef.h" 28 #include "winbase.h" 29 #include "wine/winternl.h" 30 #include "winuser.h" 31 #include "winnls.h" 32 #include "htmlhelp.h" 33 #include "ole2.h" 34 #include "exdisp.h" 35 #include "mshtmhst.h" 36 #include "commctrl.h" 37 38 #ifdef INIT_GUID 39 #include "initguid.h" 40 #endif 41 42 #include "wine/itss.h" 43 #include "wine/heap.h" 44 #include "wine/list.h" 45 46 #define WB_GOBACK 0 47 #define WB_GOFORWARD 1 48 #define WB_GOHOME 2 49 #define WB_SEARCH 3 50 #define WB_REFRESH 4 51 #define WB_STOP 5 52 #define WB_PRINT 6 53 54 typedef struct { 55 LPWSTR chm_file; 56 LPWSTR chm_index; 57 } ChmPath; 58 59 typedef struct ContentItem { 60 struct ContentItem *parent; 61 struct ContentItem *child; 62 struct ContentItem *next; 63 64 HTREEITEM id; 65 66 LPWSTR name; 67 LPWSTR local; 68 ChmPath merge; 69 } ContentItem; 70 71 typedef struct IndexSubItem { 72 LPWSTR name; 73 LPWSTR local; 74 } IndexSubItem; 75 76 typedef struct IndexItem { 77 struct IndexItem *next; 78 79 HTREEITEM id; 80 LPWSTR keyword; 81 ChmPath merge; 82 83 int nItems; 84 int itemFlags; 85 int indentLevel; 86 IndexSubItem *items; 87 } IndexItem; 88 89 typedef struct SearchItem { 90 struct SearchItem *next; 91 92 HTREEITEM id; 93 LPWSTR title; 94 LPWSTR filename; 95 } SearchItem; 96 97 typedef struct CHMInfo 98 { 99 IITStorage *pITStorage; 100 IStorage *pStorage; 101 WCHAR *szFile; 102 103 IStream *strings_stream; 104 char **strings; 105 DWORD strings_size; 106 107 WCHAR *compiledFile; 108 WCHAR *defWindow; 109 WCHAR *defTopic; 110 WCHAR *defTitle; 111 WCHAR *defToc; 112 113 UINT codePage; 114 } CHMInfo; 115 116 #define TAB_CONTENTS 0 117 #define TAB_INDEX 1 118 #define TAB_SEARCH 2 119 #define TAB_FAVORITES 3 120 #define TAB_NUMTABS TAB_FAVORITES 121 122 typedef struct { 123 HWND hwnd; 124 DWORD id; 125 } HHTab; 126 127 typedef struct { 128 HWND hwndList; 129 HWND hwndPopup; 130 HWND hwndCallback; 131 } IndexPopup; 132 133 typedef struct { 134 SearchItem *root; 135 HWND hwndEdit; 136 HWND hwndList; 137 HWND hwndContainer; 138 } SearchTab; 139 140 typedef struct { 141 HIMAGELIST hImageList; 142 } ContentsTab; 143 144 struct wintype_stringsW { 145 WCHAR *pszType; 146 WCHAR *pszCaption; 147 WCHAR *pszToc; 148 WCHAR *pszIndex; 149 WCHAR *pszFile; 150 WCHAR *pszHome; 151 WCHAR *pszJump1; 152 WCHAR *pszJump2; 153 WCHAR *pszUrlJump1; 154 WCHAR *pszUrlJump2; 155 WCHAR *pszCustomTabs; 156 }; 157 158 struct wintype_stringsA { 159 char *pszType; 160 char *pszCaption; 161 char *pszToc; 162 char *pszIndex; 163 char *pszFile; 164 char *pszHome; 165 char *pszJump1; 166 char *pszJump2; 167 char *pszUrlJump1; 168 char *pszUrlJump2; 169 char *pszCustomTabs; 170 }; 171 172 typedef struct { 173 IOleClientSite IOleClientSite_iface; 174 IOleInPlaceSite IOleInPlaceSite_iface; 175 IOleInPlaceFrame IOleInPlaceFrame_iface; 176 IDocHostUIHandler IDocHostUIHandler_iface; 177 178 LONG ref; 179 180 IOleObject *ole_obj; 181 IWebBrowser2 *web_browser; 182 HWND hwndWindow; 183 } WebBrowserContainer; 184 185 typedef struct { 186 WebBrowserContainer *web_browser; 187 188 HH_WINTYPEW WinType; 189 190 struct wintype_stringsA stringsA; 191 struct wintype_stringsW stringsW; 192 193 struct list entry; 194 CHMInfo *pCHMInfo; 195 ContentItem *content; 196 IndexItem *index; 197 IndexPopup popup; 198 SearchTab search; 199 ContentsTab contents; 200 HWND hwndTabCtrl; 201 HWND hwndSizeBar; 202 HFONT hFont; 203 204 HHTab tabs[TAB_FAVORITES+1]; 205 int viewer_initialized; 206 DWORD current_tab; 207 } HHInfo; 208 209 BOOL InitWebBrowser(HHInfo*,HWND) DECLSPEC_HIDDEN; 210 void ReleaseWebBrowser(HHInfo*) DECLSPEC_HIDDEN; 211 void ResizeWebBrowser(HHInfo*,DWORD,DWORD) DECLSPEC_HIDDEN; 212 void DoPageAction(WebBrowserContainer*,DWORD) DECLSPEC_HIDDEN; 213 214 void InitContent(HHInfo*) DECLSPEC_HIDDEN; 215 void ReleaseContent(HHInfo*) DECLSPEC_HIDDEN; 216 void ActivateContentTopic(HWND,LPCWSTR,ContentItem *) DECLSPEC_HIDDEN; 217 218 void InitIndex(HHInfo*) DECLSPEC_HIDDEN; 219 void ReleaseIndex(HHInfo*) DECLSPEC_HIDDEN; 220 221 CHMInfo *OpenCHM(LPCWSTR szFile) DECLSPEC_HIDDEN; 222 BOOL LoadWinTypeFromCHM(HHInfo *info) DECLSPEC_HIDDEN; 223 CHMInfo *CloseCHM(CHMInfo *pCHMInfo) DECLSPEC_HIDDEN; 224 void SetChmPath(ChmPath*,LPCWSTR,LPCWSTR) DECLSPEC_HIDDEN; 225 IStream *GetChmStream(CHMInfo*,LPCWSTR,ChmPath*) DECLSPEC_HIDDEN; 226 LPWSTR FindContextAlias(CHMInfo*,DWORD) DECLSPEC_HIDDEN; 227 WCHAR *GetDocumentTitle(CHMInfo*,LPCWSTR) DECLSPEC_HIDDEN; 228 229 extern struct list window_list DECLSPEC_HIDDEN; 230 HHInfo *CreateHelpViewer(HHInfo*,LPCWSTR,HWND) DECLSPEC_HIDDEN; 231 void ReleaseHelpViewer(HHInfo*) DECLSPEC_HIDDEN; 232 BOOL NavigateToUrl(HHInfo*,LPCWSTR) DECLSPEC_HIDDEN; 233 BOOL NavigateToChm(HHInfo*,LPCWSTR,LPCWSTR) DECLSPEC_HIDDEN; 234 void MergeChmProperties(HH_WINTYPEW*,HHInfo*,BOOL) DECLSPEC_HIDDEN; 235 void UpdateHelpWindow(HHInfo *info) DECLSPEC_HIDDEN; 236 237 void InitSearch(HHInfo *info, const char *needle) DECLSPEC_HIDDEN; 238 void ReleaseSearch(HHInfo *info) DECLSPEC_HIDDEN; 239 240 LPCWSTR skip_schema(LPCWSTR url) DECLSPEC_HIDDEN; 241 void wintype_stringsA_free(struct wintype_stringsA *stringsA) DECLSPEC_HIDDEN; 242 void wintype_stringsW_free(struct wintype_stringsW *stringsW) DECLSPEC_HIDDEN; 243 WCHAR *decode_html(const char *html_fragment, int html_fragment_len, UINT code_page) DECLSPEC_HIDDEN; 244 HHInfo *find_window(const WCHAR *window) DECLSPEC_HIDDEN; 245 246 /* memory allocation functions */ 247 248 static inline void * __WINE_ALLOC_SIZE(2) heap_realloc_zero(void *mem, size_t len) 249 { 250 return HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, mem, len); 251 } 252 253 static inline LPWSTR strdupW(LPCWSTR str) 254 { 255 LPWSTR ret; 256 int size; 257 258 if(!str) 259 return NULL; 260 261 size = (lstrlenW(str)+1)*sizeof(WCHAR); 262 ret = heap_alloc(size); 263 memcpy(ret, str, size); 264 265 return ret; 266 } 267 268 static inline LPWSTR strdupnAtoW(LPCSTR str, LONG lenA) 269 { 270 LPWSTR ret; 271 DWORD len; 272 273 if(!str) 274 return NULL; 275 276 if (lenA > 0) 277 { 278 /* find length of string */ 279 LPCSTR eos = memchr(str, 0, lenA); 280 if (eos) lenA = eos - str; 281 } 282 283 len = MultiByteToWideChar(CP_ACP, 0, str, lenA, NULL, 0)+1; /* +1 for null pad */ 284 ret = heap_alloc(len*sizeof(WCHAR)); 285 MultiByteToWideChar(CP_ACP, 0, str, lenA, ret, len); 286 ret[len-1] = 0; 287 288 return ret; 289 } 290 291 static inline LPWSTR strdupAtoW(LPCSTR str) 292 { 293 return strdupnAtoW(str, -1); 294 } 295 296 static inline LPSTR strdupWtoA(LPCWSTR str) 297 { 298 LPSTR ret; 299 DWORD len; 300 301 if(!str) 302 return NULL; 303 304 len = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL); 305 ret = heap_alloc(len); 306 WideCharToMultiByte(CP_ACP, 0, str, -1, ret, len, NULL, NULL); 307 return ret; 308 } 309 310 311 extern HINSTANCE hhctrl_hinstance DECLSPEC_HIDDEN; 312 extern BOOL hh_process DECLSPEC_HIDDEN; 313 314 #endif 315