// Created: 08/09/2000
// RCS-ID: $Id$
// Copyright: (c) 2000 Julian Smart, Vadim Zeitlin
-// Licence: wxWindows licence
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
-#ifdef __GNUG__
- #pragma implementation "cshelp.h"
-#endif
-
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
//// Data
wxContextHelp* m_contextHelp;
+
+ DECLARE_NO_COPY_CLASS(wxContextHelpEvtHandler)
};
// ============================================================================
wxContextHelp::wxContextHelp(wxWindow* win, bool beginHelp)
{
- m_inHelp = FALSE;
+ m_inHelp = false;
if (beginHelp)
BeginContextHelp(win);
EndContextHelp();
}
+// Not currently needed, but on some systems capture may not work as
+// expected so we'll leave it here for now.
+#ifdef __WXMOTIF__
+static void wxPushOrPopEventHandlers(wxContextHelp* help, wxWindow* win, bool push)
+{
+ if (push)
+ win->PushEventHandler(new wxContextHelpEvtHandler(help));
+ else
+ win->PopEventHandler(true);
+
+ wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst();
+ while (node)
+ {
+ wxWindow* child = node->GetData();
+ wxPushOrPopEventHandlers(help, child, push);
+
+ node = node->GetNext();
+ }
+}
+#endif
+
// Begin 'context help mode'
bool wxContextHelp::BeginContextHelp(wxWindow* win)
{
if (!win)
win = wxTheApp->GetTopWindow();
if (!win)
- return FALSE;
+ return false;
wxCursor cursor(wxCURSOR_QUESTION_ARROW);
wxCursor oldCursor = win->GetCursor();
// wxSetCursor(cursor);
#endif
+ m_status = false;
+
+#ifdef __WXMOTIF__
+ wxPushOrPopEventHandlers(this, win, true);
+#else
win->PushEventHandler(new wxContextHelpEvtHandler(this));
+#endif
win->CaptureMouse();
win->ReleaseMouse();
- win->PopEventHandler(TRUE);
+#ifdef __WXMOTIF__
+ wxPushOrPopEventHandlers(this, win, false);
+#else
+ win->PopEventHandler(true);
+#endif
win->SetCursor(oldCursor);
{
wxPoint pt;
wxWindow* winAtPtr = wxFindWindowAtPointer(pt);
- /*
+
+#if 0
if (winAtPtr)
{
- wxString msg;
- msg.Printf("Picked %s (%d)", (const char*) winAtPtr->GetName(), winAtPtr->GetId());
- cout << msg << '\n';
+ printf("Picked %s (%d)\n", winAtPtr->GetName().c_str(),
+ winAtPtr->GetId());
}
- */
+#endif
if (winAtPtr)
DispatchEvent(winAtPtr, pt);
}
- return TRUE;
+ return true;
}
bool wxContextHelp::EndContextHelp()
{
- m_inHelp = FALSE;
+ m_inHelp = false;
- return TRUE;
+ return true;
}
bool wxContextHelp::EventLoop()
{
- m_inHelp = TRUE;
+ m_inHelp = true;
+
while ( m_inHelp )
{
if (wxTheApp->Pending())
wxTheApp->ProcessIdle();
}
}
- return TRUE;
+
+ return true;
}
bool wxContextHelpEvtHandler::ProcessEvent(wxEvent& event)
{
if (event.GetEventType() == wxEVT_LEFT_DOWN)
{
- m_contextHelp->SetStatus(TRUE);
+ m_contextHelp->SetStatus(true);
m_contextHelp->EndContextHelp();
- return TRUE;
+ 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);
+ // May have already been set to true by a left-click
+ //m_contextHelp->SetStatus(false);
m_contextHelp->EndContextHelp();
- return TRUE;
+ return true;
}
-
+
if ((event.GetEventType() == wxEVT_PAINT) ||
(event.GetEventType() == wxEVT_ERASE_BACKGROUND))
{
event.Skip();
- return FALSE;
+ return false;
}
-
- return TRUE;
+
+ return true;
}
// Dispatch the help event to the relevant window
bool wxContextHelp::DispatchEvent(wxWindow* win, const wxPoint& pt)
{
wxWindow* subjectOfHelp = win;
- bool eventProcessed = FALSE;
+ bool eventProcessed = false;
while (subjectOfHelp && !eventProcessed)
{
wxHelpEvent helpEvent(wxEVT_HELP, subjectOfHelp->GetId(), pt) ;
- helpEvent.SetEventObject(this);
+ helpEvent.SetEventObject(subjectOfHelp);
+
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.
* to put the application into context help mode.
*/
-#if !defined(__WXMSW__)
-static char * csquery_xpm[] = {
+#ifndef __WXPM__
+
+static const char * csquery_xpm[] = {
"12 11 2 1",
" c None",
". c #000000",
" .. ",
" .. ",
" "};
+
#endif
IMPLEMENT_CLASS(wxContextHelpButton, wxBitmapButton)
const wxPoint& pos,
const wxSize& size,
long style)
- : wxBitmapButton(parent, id, wxBITMAP(csquery),
+#if defined(__WXPM__)
+ : wxBitmapButton(parent, id, wxBitmap(wxCSQUERY_BITMAP
+ ,wxBITMAP_TYPE_RESOURCE
+ ),
+ pos, size, style)
+#else
+ : wxBitmapButton(parent, id, wxBitmap(csquery_xpm),
pos, size, style)
+#endif
{
}
-void wxContextHelpButton::OnContextHelp(wxCommandEvent& event)
+void wxContextHelpButton::OnContextHelp(wxCommandEvent& WXUNUSED(event))
{
wxContextHelp contextHelp(GetParent());
}
{
}
+// removes the association
+void wxHelpProvider::RemoveHelp(wxWindowBase* WXUNUSED(window))
+{
+}
+
wxHelpProvider::~wxHelpProvider()
{
}
// wxSimpleHelpProvider
// ----------------------------------------------------------------------------
+#define WINHASH_KEY(w) wxPtrToUInt(w)
+
wxString wxSimpleHelpProvider::GetHelp(const wxWindowBase *window)
{
- bool wasFound;
- wxString text = m_hashWindows.Get((long)window, &wasFound);
- if ( !wasFound )
- text = m_hashIds.Get(window->GetId());
+ wxSimpleHelpProviderHashMap::iterator it = m_hashWindows.find(WINHASH_KEY(window));
- return text;
+ if ( it == m_hashWindows.end() )
+ {
+ it = m_hashIds.find(window->GetId());
+ if ( it == m_hashIds.end() )
+ return wxEmptyString;
+ }
+
+ return it->second;
}
void wxSimpleHelpProvider::AddHelp(wxWindowBase *window, const wxString& text)
{
- m_hashWindows.Put((long)window, text);
+ m_hashWindows.erase(WINHASH_KEY(window));
+ m_hashWindows[WINHASH_KEY(window)] = text;
}
void wxSimpleHelpProvider::AddHelp(wxWindowID id, const wxString& text)
{
- m_hashIds.Put(id, text);
+ wxSimpleHelpProviderHashMap::key_type key = (wxSimpleHelpProviderHashMap::key_type)id;
+ m_hashIds.erase(key);
+ m_hashIds[key] = text;
+}
+
+// removes the association
+void wxSimpleHelpProvider::RemoveHelp(wxWindowBase* window)
+{
+ m_hashWindows.erase(WINHASH_KEY(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;
+ return true;
}
+#else
+ wxUnusedVar(window);
+#endif // wxUSE_TIPWINDOW
- return FALSE;
+ return false;
}
// ----------------------------------------------------------------------------
// If the help controller is capable of popping up the text...
else if (m_helpController->DisplayTextPopup(text, wxGetMousePosition()))
{
- return TRUE;
+ return true;
}
else
// ...else use the default method.
}
- return FALSE;
+ return false;
}
// Convenience function for turning context id into wxString
wxString wxContextId(int id)
{
- return wxString(IntToString(id));
+ return wxString::Format(_T("%d"), id);
}
// ----------------------------------------------------------------------------
// since it could pull in extra code
// wxHelpProvider::Set(new wxSimpleHelpProvider);
- return TRUE;
+ return true;
}
void wxHelpProviderModule::OnExit()