]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/helpwin.cpp
backported fix for proper tree ctrl refershing after changing item colour/font from 2.2
[wxWidgets.git] / src / msw / helpwin.cpp
index f5d4860472572b1563ca89164d77f10937a2257a..a507852e1e5ebcc66de5fff9179e1e46f7a0d85e 100644 (file)
 #include "wx/defs.h"
 #endif
 
+#if wxUSE_HELP
+
+#include "wx/filefn.h"
 #include "wx/msw/helpwin.h"
 
-#if wxUSE_HELP
 #include <time.h>
 
 #ifdef __WXMSW__
-#include <wx/msw/private.h>
+#include "wx/msw/private.h"
 #endif
 
 #include <string.h>
 
-// MAX path length
-#define _MAXPATHLEN 500
-
-// MAX length of Help descriptor
-#define _MAX_HELP_LEN 500
-
-#if !USE_SHARED_LIBRARY
-IMPLEMENT_DYNAMIC_CLASS(wxWinHelpController, wxHelpControllerBase)
-#endif
-
-wxWinHelpController::wxWinHelpController(void)
+static HWND GetSuitableHWND()
 {
-  m_helpFile = "";
+    if (wxTheApp->GetTopWindow())
+        return (HWND) wxTheApp->GetTopWindow()->GetHWND();
+    else
+        return GetDesktopWindow();
 }
 
-wxWinHelpController::~wxWinHelpController(void)
-{
-}
+IMPLEMENT_DYNAMIC_CLASS(wxWinHelpController, wxHelpControllerBase)
 
 bool wxWinHelpController::Initialize(const wxString& filename)
 {
-  m_helpFile = filename;
-  return TRUE;
+    m_helpFile = filename;
+    return TRUE;
 }
 
 bool wxWinHelpController::LoadFile(const wxString& file)
 {
-  m_helpFile = file;
-  return TRUE;
+    if (!file.IsEmpty())
+        m_helpFile = file;
+    return TRUE;
 }
 
 bool wxWinHelpController::DisplayContents(void)
 {
-    if (m_helpFile == _T("")) return FALSE;
-
-    wxString str = m_helpFile;
-    size_t len = str.Length();
-    if (!(str[(size_t)(len-1)] == _T('p') && str[(size_t)(len-2)] == _T('l') && str[(size_t)(len-3)] == _T('h') && str[(size_t)(len-4)] == _T('.')))
-      str += _T(".hlp");
-
-    if (wxTheApp->GetTopWindow())
-    {
+    if (m_helpFile.IsEmpty()) return FALSE;
+    
+    wxString str = GetValidFilename(m_helpFile);
+    
 #if defined(__WIN95__)
-      WinHelp((HWND) wxTheApp->GetTopWindow()->GetHWND(), (const wxChar*) str, HELP_FINDER, 0L);
+    return (WinHelp(GetSuitableHWND(), (const wxChar*) str, HELP_FINDER, 0L) != 0);
 #else
-      WinHelp((HWND) wxTheApp->GetTopWindow()->GetHWND(), (const wxChar*) str, HELP_CONTENTS, 0L);
+    return (WinHelp(GetSuitableHWND(), (const wxChar*) str, HELP_CONTENTS, 0L) != 0);
 #endif
-     return TRUE;
-    }
-       return FALSE;
 }
 
 bool wxWinHelpController::DisplaySection(int section)
 {
     // Use context number
-    if (m_helpFile == _T("")) return FALSE;
+    if (m_helpFile.IsEmpty()) return FALSE;
+    
+    wxString str = GetValidFilename(m_helpFile);
 
-    wxString str = m_helpFile;
-    size_t len = str.Length();
-    if (!(str[(size_t)(len-1)] == _T('p') && str[(size_t)(len-2)] == _T('l') && str[(size_t)(len-3)] == _T('h') && str[(size_t)(len-4)] == _T('.')))
-      str += _T(".hlp");
-
-    if (wxTheApp->GetTopWindow())
-       {
-      WinHelp((HWND) wxTheApp->GetTopWindow()->GetHWND(), (const wxChar*) str, HELP_CONTEXT, (DWORD)section);
-      return TRUE;
-       }
-    return FALSE;
+    return (WinHelp((HWND) wxTheApp->GetTopWindow()->GetHWND(), (const wxChar*) str, HELP_CONTEXT, (DWORD)section) != 0);
 }
 
-bool wxWinHelpController::DisplayBlock(long block)
+bool wxWinHelpController::DisplayContextPopup(int contextId)
 {
-    // Use context number -- a very rough equivalent to block id!
-    if (m_helpFile == _T("")) return FALSE;
+    if (m_helpFile.IsEmpty()) return FALSE;
+    
+    wxString str = GetValidFilename(m_helpFile);
 
-    wxString str = m_helpFile;
-    size_t len = str.Length();
-    if (!(str[(size_t)(len-1)] == 'p' && str[(size_t)(len-2)] == 'l' && str[(size_t)(len-3)] == 'h' && str[(size_t)(len-4)] == '.'))
-      str += _T(".hlp");
+    return (WinHelp((HWND) wxTheApp->GetTopWindow()->GetHWND(), (const wxChar*) str, HELP_CONTEXTPOPUP, (DWORD) contextId) != 0);
+}
 
-    if (wxTheApp->GetTopWindow())
-       {
-      WinHelp((HWND) wxTheApp->GetTopWindow()->GetHWND(), (const wxChar*) str, HELP_CONTEXT, (DWORD)block);
-      return TRUE;
-       }
-    return FALSE;
+bool wxWinHelpController::DisplayBlock(long block)
+{
+    DisplaySection(block);
+    return TRUE;
 }
 
 bool wxWinHelpController::KeywordSearch(const wxString& k)
 {
-    if (m_helpFile == _T("")) return FALSE;
-
-    wxString str = m_helpFile;
-    size_t len = str.Length();
-    if (!(str[(size_t)(len-1)] == _T('p') && str[(size_t)(len-2)] == _T('l') && str[(size_t)(len-3)] == _T('h') && str[(size_t)(len-4)] == _T('.')))
-      str += _T(".hlp");
-
-    if (wxTheApp->GetTopWindow())
-    {
-      WinHelp((HWND) wxTheApp->GetTopWindow()->GetHWND(), (const wxChar*) str, HELP_PARTIALKEY, (DWORD)(const wxChar*) k);
-      return TRUE;
-    }
-    return FALSE;
+    if (m_helpFile.IsEmpty()) return FALSE;
+    
+    wxString str = GetValidFilename(m_helpFile);
+    
+    return (WinHelp(GetSuitableHWND(), (const wxChar*) str, HELP_PARTIALKEY, (DWORD)(const wxChar*) k) != 0);
 }
 
 // Can't close the help window explicitly in WinHelp
 bool wxWinHelpController::Quit(void)
 {
-  if (wxTheApp->GetTopWindow())
-  {
-    WinHelp((HWND) wxTheApp->GetTopWindow()->GetHWND(), 0, HELP_QUIT, 0L);
-    return TRUE;
-  }
-  else
-    return FALSE;
+    return (WinHelp(GetSuitableHWND(), 0, HELP_QUIT, 0L) != 0);
 }
 
-// Don't get notified of WinHelp quitting
-void wxWinHelpController::OnQuit(void)
+// Append extension if necessary.
+wxString wxWinHelpController::GetValidFilename(const wxString& file) const
 {
+    wxString path, name, ext;
+    wxSplitPath(file, & path, & name, & ext);
+
+    wxString fullName;
+    if (path.IsEmpty())
+        fullName = name + wxT(".hlp");
+    else if (path.Last() == wxT('\\'))
+        fullName = path + name + wxT(".hlp");
+    else
+        fullName = path + wxT("\\") + name + wxT(".hlp");
+    return fullName;
 }
 
 #endif // wxUSE_HELP