1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Context-sensitive help support classes
4 // Author: Julian Smart, Vadim Zeitlin
7 // Copyright: (c) 2000 Julian Smart, Vadim Zeitlin
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
20 #include "wx/hashmap.h"
22 #include "wx/bmpbuttn.h"
27 // ----------------------------------------------------------------------------
28 // classes used to implement context help UI
29 // ----------------------------------------------------------------------------
33 * Invokes context-sensitive help. When the user
34 * clicks on a window, a wxEVT_HELP event will be sent to that
35 * window for the application to display help for.
38 class WXDLLIMPEXP_CORE wxContextHelp
: public wxObject
41 wxContextHelp(wxWindow
* win
= NULL
, bool beginHelp
= true);
42 virtual ~wxContextHelp();
44 bool BeginContextHelp(wxWindow
* win
);
45 bool EndContextHelp();
48 bool DispatchEvent(wxWindow
* win
, const wxPoint
& pt
);
50 void SetStatus(bool status
) { m_status
= status
; }
54 bool m_status
; // true if the user left-clicked
57 DECLARE_DYNAMIC_CLASS(wxContextHelp
)
63 * You can add this to your dialogs (especially on non-Windows platforms)
64 * to put the application into context help mode.
67 class WXDLLIMPEXP_CORE wxContextHelpButton
: public wxBitmapButton
70 wxContextHelpButton(wxWindow
* parent
,
71 wxWindowID id
= wxID_CONTEXT_HELP
,
72 const wxPoint
& pos
= wxDefaultPosition
,
73 const wxSize
& size
= wxDefaultSize
,
74 long style
= wxBU_AUTODRAW
);
76 void OnContextHelp(wxCommandEvent
& event
);
79 DECLARE_DYNAMIC_CLASS_NO_COPY(wxContextHelpButton
)
85 // ----------------------------------------------------------------------------
86 // classes used to implement context help support
87 // ----------------------------------------------------------------------------
89 // wxHelpProvider is an abstract class used by the program implementing context help to
90 // show the help text (or whatever: it may be HTML page or anything else) for
93 // The current help provider must be explicitly set by the application using
94 // wxHelpProvider::Set().
96 // Special note about ShowHelpAtPoint() and ShowHelp(): we want to be able to
97 // override ShowHelpAtPoint() when we need to use different help messages for
98 // different parts of the window, but it should also be possible to override
99 // just ShowHelp() both for backwards compatibility and just because most
100 // often the help does not, in fact, depend on the position and so
101 // implementing just ShowHelp() is simpler and more natural, so by default
102 // ShowHelpAtPoint() forwards to ShowHelp(). But this means that
103 // wxSimpleHelpProvider has to override ShowHelp() and not ShowHelpAtPoint()
104 // for backwards compatibility as otherwise the existing code deriving from it
105 // and overriding ShowHelp() but calling the base class version wouldn't work
106 // any more, which forces us to use a rather ugly hack and pass the extra
107 // parameters of ShowHelpAtPoint() to ShowHelp() via member variables.
108 class WXDLLIMPEXP_CORE wxHelpProvider
111 // get/set the current (application-global) help provider (Set() returns
113 static wxHelpProvider
*Set(wxHelpProvider
*helpProvider
)
115 wxHelpProvider
*helpProviderOld
= ms_helpProvider
;
116 ms_helpProvider
= helpProvider
;
117 return helpProviderOld
;
120 // unlike some other class, the help provider is not created on demand,
121 // this must be explicitly done by the application
122 static wxHelpProvider
*Get() { return ms_helpProvider
; }
124 // get the help string (whose interpretation is help provider dependent
125 // except that empty string always means that no help is associated with
126 // the window) for this window
127 virtual wxString
GetHelp(const wxWindowBase
*window
) = 0;
129 // do show help for the given window (uses window->GetHelpAtPoint()
130 // internally if applicable), return true if it was done or false
131 // if no help available for this window
132 virtual bool ShowHelpAtPoint(wxWindowBase
*window
,
134 wxHelpEvent::Origin origin
)
136 wxCHECK_MSG( window
, false, wxT("window must not be NULL") );
138 m_helptextAtPoint
= pt
;
139 m_helptextOrigin
= origin
;
141 return ShowHelp(window
);
144 // show help for the given window, see ShowHelpAtPoint() above
145 virtual bool ShowHelp(wxWindowBase
* WXUNUSED(window
)) { return false; }
147 // associate the text with the given window or id: although all help
148 // providers have these functions to allow making wxWindow::SetHelpText()
149 // work, not all of them implement them
150 virtual void AddHelp(wxWindowBase
*window
, const wxString
& text
);
152 // this version associates the given text with all window with this id
153 // (may be used to set the same help string for all [Cancel] buttons in
154 // the application, for example)
155 virtual void AddHelp(wxWindowID id
, const wxString
& text
);
157 // removes the association
158 virtual void RemoveHelp(wxWindowBase
* window
);
160 // virtual dtor for any base class
161 virtual ~wxHelpProvider();
165 : m_helptextAtPoint(wxDefaultPosition
),
166 m_helptextOrigin(wxHelpEvent::Origin_Unknown
)
170 // helper method used by ShowHelp(): returns the help string to use by
171 // using m_helptextAtPoint/m_helptextOrigin if they're set or just GetHelp
173 wxString
GetHelpTextMaybeAtPoint(wxWindowBase
*window
);
176 // parameters of the last ShowHelpAtPoint() call, used by ShowHelp()
177 wxPoint m_helptextAtPoint
;
178 wxHelpEvent::Origin m_helptextOrigin
;
181 static wxHelpProvider
*ms_helpProvider
;
184 WX_DECLARE_EXPORTED_HASH_MAP( wxUIntPtr
, wxString
, wxIntegerHash
,
185 wxIntegerEqual
, wxSimpleHelpProviderHashMap
);
187 // wxSimpleHelpProvider is an implementation of wxHelpProvider which supports
188 // only plain text help strings and shows the string associated with the
189 // control (if any) in a tooltip
190 class WXDLLIMPEXP_CORE wxSimpleHelpProvider
: public wxHelpProvider
193 // implement wxHelpProvider methods
194 virtual wxString
GetHelp(const wxWindowBase
*window
);
196 // override ShowHelp() and not ShowHelpAtPoint() as explained above
197 virtual bool ShowHelp(wxWindowBase
*window
);
199 virtual void AddHelp(wxWindowBase
*window
, const wxString
& text
);
200 virtual void AddHelp(wxWindowID id
, const wxString
& text
);
201 virtual void RemoveHelp(wxWindowBase
* window
);
204 // we use 2 hashes for storing the help strings associated with windows
206 wxSimpleHelpProviderHashMap m_hashWindows
,
210 // wxHelpControllerHelpProvider is an implementation of wxHelpProvider which supports
211 // both context identifiers and plain text help strings. If the help text is an integer,
212 // it is passed to wxHelpController::DisplayContextPopup. Otherwise, it shows the string
213 // in a tooltip as per wxSimpleHelpProvider.
214 class WXDLLIMPEXP_CORE wxHelpControllerHelpProvider
: public wxSimpleHelpProvider
217 // Note that it doesn't own the help controller. The help controller
218 // should be deleted separately.
219 wxHelpControllerHelpProvider(wxHelpControllerBase
* hc
= NULL
);
221 // implement wxHelpProvider methods
223 // again (see above): this should be ShowHelpAtPoint() but we need to
224 // override ShowHelp() to avoid breaking existing code
225 virtual bool ShowHelp(wxWindowBase
*window
);
228 void SetHelpController(wxHelpControllerBase
* hc
) { m_helpController
= hc
; }
229 wxHelpControllerBase
* GetHelpController() const { return m_helpController
; }
232 wxHelpControllerBase
* m_helpController
;
234 wxDECLARE_NO_COPY_CLASS(wxHelpControllerHelpProvider
);
237 // Convenience function for turning context id into wxString
238 WXDLLIMPEXP_CORE wxString
wxContextId(int id
);
242 #endif // _WX_CSHELP_H_