#if wxUSE_HELP
#ifndef WX_PRECOMP
- // FIXME: temporary needed for wxSimpleHelpProvider compilation, to be
- // removed later
- #include "wx/intl.h"
- #include "wx/msgdlg.h"
#endif
+#include "wx/tipwin.h"
#include "wx/app.h"
-
+#include "wx/module.h"
#include "wx/cshelp.h"
// ----------------------------------------------------------------------------
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)
{
// wxSetCursor(cursor);
#endif
+ m_status = FALSE;
+
win->PushEventHandler(new wxContextHelpEvtHandler(this));
+ //wxPushOrPopEventHandlers(this, win, TRUE);
win->CaptureMouse();
win->ReleaseMouse();
win->PopEventHandler(TRUE);
+ //wxPushOrPopEventHandlers(this, win, FALSE);
win->SetCursor(oldCursor);
{
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);
}
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;
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.
*/
#if !defined(__WXMSW__)
-static char * csquery_xpm[] = {
+static const char * csquery_xpm[] = {
"12 11 2 1",
" c None",
". c #000000",
{
}
-void wxContextHelpButton::OnContextHelp(wxCommandEvent& event)
+void wxContextHelpButton::OnContextHelp(wxCommandEvent& WXUNUSED(event))
{
wxContextHelp contextHelp(GetParent());
}
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() )
{
- wxMessageBox(text, _("Help"), wxICON_INFORMATION | wxOK,
- (wxWindow *)window);
+ s_tipWindow = new wxTipWindow((wxWindow *)window, text, 100, & s_tipWindow);
return TRUE;
}
+#endif // wxUSE_TIPWINDOW
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