]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/cshelp.cpp
corrected realization of vertical toolbars (were always horizontal)
[wxWidgets.git] / src / common / cshelp.cpp
index 375e9f7ce674f89935b808db7add745575f0cee8..cb9a8d895fabc48e7d9db76b4f999c16d5b46a98 100644 (file)
 #if wxUSE_HELP
 
 #ifndef WX_PRECOMP
-    #include "wx/tipwin.h"
 #endif
 
+#include "wx/tipwin.h"
 #include "wx/app.h"
-
+#include "wx/module.h"
 #include "wx/cshelp.h"
 
 // ----------------------------------------------------------------------------
@@ -119,6 +119,15 @@ bool wxContextHelp::BeginContextHelp(wxWindow* win)
     {
         wxPoint pt;
         wxWindow* winAtPtr = wxFindWindowAtPointer(pt);
+       /*
+        if (winAtPtr)
+        {
+       wxString msg;
+        msg.Printf("Picked %s (%d)", (const char*) winAtPtr->GetName(), winAtPtr->GetId());
+        cout << msg << '\n';
+        }
+       */
+
         if (winAtPtr)
             DispatchEvent(winAtPtr, pt);
     }
@@ -152,33 +161,28 @@ bool wxContextHelp::EventLoop()
 
 bool wxContextHelpEvtHandler::ProcessEvent(wxEvent& event)
 {
-    switch (event.GetEventType())
+    if (event.GetEventType() == wxEVT_LEFT_DOWN)
     {
-        case wxEVT_LEFT_DOWN:
-        {
-         //wxMouseEvent& mouseEvent = (wxMouseEvent&) event;
-            m_contextHelp->SetStatus(TRUE);
-            m_contextHelp->EndContextHelp();
-            return TRUE;
-            break;
-        }
-        case wxEVT_CHAR:
-        case wxEVT_KEY_DOWN:
-        case wxEVT_ACTIVATE:
-        case wxEVT_MOUSE_CAPTURE_CHANGED:
-        {
-            m_contextHelp->SetStatus(FALSE);
-            m_contextHelp->EndContextHelp();
-            return TRUE;
-            break;
-        }
-        case wxEVT_PAINT:
-        case wxEVT_ERASE_BACKGROUND:
-        {
-            event.Skip();
-            return FALSE;
-            break;
-        }
+        m_contextHelp->SetStatus(TRUE);
+        m_contextHelp->EndContextHelp();
+        return TRUE;
+    }
+
+    if ((event.GetEventType() == wxEVT_CHAR) ||
+        (event.GetEventType() == wxEVT_KEY_DOWN) ||
+        (event.GetEventType() == wxEVT_ACTIVATE) ||
+        (event.GetEventType() == wxEVT_MOUSE_CAPTURE_CHANGED))
+    {
+        m_contextHelp->SetStatus(FALSE);
+        m_contextHelp->EndContextHelp();
+        return TRUE;
+    }
+
+    if ((event.GetEventType() == wxEVT_PAINT) ||
+        (event.GetEventType() == wxEVT_ERASE_BACKGROUND))
+    {
+        event.Skip();
+        return FALSE;
     }
 
     return TRUE;
@@ -194,7 +198,7 @@ bool wxContextHelp::DispatchEvent(wxWindow* win, const wxPoint& pt)
         wxHelpEvent helpEvent(wxEVT_HELP, subjectOfHelp->GetId(), pt) ;
         helpEvent.SetEventObject(this);
         eventProcessed = win->GetEventHandler()->ProcessEvent(helpEvent);
-        
+
         // Go up the window hierarchy until the event is handled (or not).
         // I.e. keep submitting ancestor windows until one is recognised
         // by the app code that processes the ids and displays help.
@@ -247,7 +251,7 @@ wxContextHelpButton::wxContextHelpButton(wxWindow* parent,
 {
 }
 
-void wxContextHelpButton::OnContextHelp(wxCommandEvent& event)
+void wxContextHelpButton::OnContextHelp(wxCommandEvent& WXUNUSED(event))
 {
     wxContextHelp contextHelp(GetParent());
 }
@@ -301,10 +305,21 @@ void wxSimpleHelpProvider::AddHelp(wxWindowID id, const wxString& text)
 
 bool wxSimpleHelpProvider::ShowHelp(wxWindowBase *window)
 {
+    static wxTipWindow* s_tipWindow = NULL;
+
+    if (s_tipWindow)
+    {
+        // Prevent s_tipWindow being nulled in OnIdle,
+        // thereby removing the chance for the window to be closed by ShowHelp
+        s_tipWindow->SetTipWindowPtr(NULL);
+        s_tipWindow->Close();
+    }
+    s_tipWindow = NULL;
+
     wxString text = GetHelp(window);
     if ( !text.empty() )
     {
-        new wxTipWindow((wxWindow *)window, text);
+        s_tipWindow = new wxTipWindow((wxWindow *)window, text, 100, & s_tipWindow);
 
         return TRUE;
     }
@@ -312,4 +327,80 @@ bool wxSimpleHelpProvider::ShowHelp(wxWindowBase *window)
     return FALSE;
 }
 
+// ----------------------------------------------------------------------------
+// wxHelpControllerHelpProvider
+// ----------------------------------------------------------------------------
+
+wxHelpControllerHelpProvider::wxHelpControllerHelpProvider(wxHelpControllerBase* hc)
+{
+    m_helpController = hc;
+}
+
+bool wxHelpControllerHelpProvider::ShowHelp(wxWindowBase *window)
+{
+    wxString text = GetHelp(window);
+    if ( !text.empty() )
+    {
+        if (m_helpController)
+        {
+            if (text.IsNumber())
+                return m_helpController->DisplayContextPopup(wxAtoi(text));
+
+            // If the help controller is capable of popping up the text...
+            else if (m_helpController->DisplayTextPopup(text, wxGetMousePosition()))
+            {
+                return TRUE;
+            }
+            else
+            // ...else use the default method.
+                return wxSimpleHelpProvider::ShowHelp(window);
+        }
+        else
+            return wxSimpleHelpProvider::ShowHelp(window);
+
+    }
+
+    return FALSE;
+}
+
+// Convenience function for turning context id into wxString
+wxString wxContextId(int id)
+{
+    return wxString(IntToString(id));
+}
+
+// ----------------------------------------------------------------------------
+// wxHelpProviderModule: module responsible for cleaning up help provider.
+// ----------------------------------------------------------------------------
+
+class wxHelpProviderModule : public wxModule
+{
+public:
+    bool OnInit();
+    void OnExit();
+
+private:
+    DECLARE_DYNAMIC_CLASS(wxHelpProviderModule)
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxHelpProviderModule, wxModule)
+
+bool wxHelpProviderModule::OnInit()
+{
+    // Probably we don't want to do anything by default,
+    // since it could pull in extra code
+    // wxHelpProvider::Set(new wxSimpleHelpProvider);
+
+    return TRUE;
+}
+
+void wxHelpProviderModule::OnExit()
+{
+    if (wxHelpProvider::Get())
+    {
+        delete wxHelpProvider::Get();
+        wxHelpProvider::Set(NULL);
+    }
+}
+
 #endif // wxUSE_HELP