]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/cshelp.cpp
OS/2 must have positive control IDs.
[wxWidgets.git] / src / common / cshelp.cpp
index f1e8b26f4e2068702a117b83fb89fe22ddef1a27..75749750c9268f711a036cc0b889e522a4815b53 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     08/09/2000
 // RCS-ID:      $Id$
 // Copyright:   (c) 2000 Julian Smart, Vadim Zeitlin
-// Licence:    wxWindows licence
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
@@ -87,6 +87,27 @@ wxContextHelp::~wxContextHelp()
         EndContextHelp();
 }
 
+// Not currently needed, but on some systems capture may not work as
+// expected so we'll leave it here for now.
+#if 0
+static void wxPushOrPopEventHandlers(wxContextHelp* help, wxWindow* win, bool push)
+{
+    if (push)
+        win->PushEventHandler(new wxContextHelpEvtHandler(help));
+    else
+        win->PopEventHandler();
+
+    wxNode* node = win->GetChildren().First();
+    while (node)
+    {
+        wxWindow* child = (wxWindow*) node->Data();
+        wxPushOrPopEventHandlers(help, child, push);
+
+        node = node->Next();
+    }
+}
+#endif
+
 // Begin 'context help mode'
 bool wxContextHelp::BeginContextHelp(wxWindow* win)
 {
@@ -103,7 +124,10 @@ bool wxContextHelp::BeginContextHelp(wxWindow* win)
     //    wxSetCursor(cursor);
 #endif
 
+    m_status = FALSE;
+
     win->PushEventHandler(new wxContextHelpEvtHandler(this));
+    //wxPushOrPopEventHandlers(this, win, TRUE);
 
     win->CaptureMouse();
 
@@ -112,6 +136,7 @@ bool wxContextHelp::BeginContextHelp(wxWindow* win)
     win->ReleaseMouse();
 
     win->PopEventHandler(TRUE);
+    //wxPushOrPopEventHandlers(this, win, FALSE);
 
     win->SetCursor(oldCursor);
 
@@ -119,6 +144,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);
     }
@@ -136,6 +170,7 @@ bool wxContextHelp::EndContextHelp()
 bool wxContextHelp::EventLoop()
 {
     m_inHelp = TRUE;
+
     while ( m_inHelp )
     {
         if (wxTheApp->Pending())
@@ -147,38 +182,35 @@ bool wxContextHelp::EventLoop()
             wxTheApp->ProcessIdle();
         }
     }
+
     return TRUE;
 }
 
 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))
+    {
+        // May have already been set to TRUE by a left-click
+        //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;
@@ -193,8 +225,9 @@ 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.
@@ -214,7 +247,7 @@ bool wxContextHelp::DispatchEvent(wxWindow* win, const wxPoint& pt)
  */
 
 #if !defined(__WXMSW__)
-static char * csquery_xpm[] = {
+static const char * csquery_xpm[] = {
 "12 11 2 1",
 "  c None",
 ". c #000000",
@@ -242,12 +275,19 @@ wxContextHelpButton::wxContextHelpButton(wxWindow* parent,
                                          const wxPoint& pos,
                                          const wxSize& size,
                                          long style)
+#if defined(__WXPM__)
+                   : wxBitmapButton(parent, id, wxBitmap(wxCSQUERY_BITMAP
+                                                         ,wxBITMAP_TYPE_RESOURCE
+                                                        ),
+                                    pos, size, style)
+#else
                    : wxBitmapButton(parent, id, wxBITMAP(csquery),
                                     pos, size, style)
+#endif
 {
 }
 
-void wxContextHelpButton::OnContextHelp(wxCommandEvent& event)
+void wxContextHelpButton::OnContextHelp(wxCommandEvent& WXUNUSED(event))
 {
     wxContextHelp contextHelp(GetParent());
 }
@@ -271,6 +311,11 @@ void wxHelpProvider::AddHelp(wxWindowID WXUNUSED(id),
 {
 }
 
+// removes the association
+void wxHelpProvider::RemoveHelp(wxWindowBase* WXUNUSED(window))
+{
+}
+
 wxHelpProvider::~wxHelpProvider()
 {
 }
@@ -291,23 +336,44 @@ wxString wxSimpleHelpProvider::GetHelp(const wxWindowBase *window)
 
 void wxSimpleHelpProvider::AddHelp(wxWindowBase *window, const wxString& text)
 {
+    m_hashWindows.Delete((long)window);
     m_hashWindows.Put((long)window, text);
 }
 
 void wxSimpleHelpProvider::AddHelp(wxWindowID id, const wxString& text)
 {
+    m_hashIds.Delete((long)id);
     m_hashIds.Put(id, text);
 }
 
+// removes the association
+void wxSimpleHelpProvider::RemoveHelp(wxWindowBase* window)
+{
+    m_hashWindows.Delete((long)window);
+}
+
 bool wxSimpleHelpProvider::ShowHelp(wxWindowBase *window)
 {
+#if wxUSE_TIPWINDOW
+    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;
     }
+#endif // wxUSE_TIPWINDOW
 
     return FALSE;
 }