1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
23 // Peter Bartok (pbartok@novell.com)
28 // Still missing: Tie-in to HTML help when the user presses F1 on the control
31 using System.Collections;
32 using System.ComponentModel;
35 namespace System.Windows.Forms {
36 [ToolboxItemFilter("System.Windows.Forms")]
37 [ProvideProperty("ShowHelp", "System.Windows.Forms.Control, " + Consts.AssemblySystem_Windows_Forms)]
38 [ProvideProperty("HelpNavigator", "System.Windows.Forms.Control, " + Consts.AssemblySystem_Windows_Forms)]
39 [ProvideProperty("HelpKeyword", "System.Windows.Forms.Control, " + Consts.AssemblySystem_Windows_Forms)]
40 [ProvideProperty("HelpString", "System.Windows.Forms.Control, " + Consts.AssemblySystem_Windows_Forms)]
41 public class HelpProvider : Component, IExtenderProvider {
42 #region HelpProperty Class
43 private class HelpProperty {
44 internal string keyword;
45 internal HelpNavigator navigator;
48 internal Control control;
49 internal HelpProvider hp;
51 public HelpProperty(HelpProvider hp, Control control) {
52 this.control = control;
56 navigator = HelpNavigator.AssociateIndex;
60 control.HelpRequested += hp.HelpRequestHandler;
63 public string Keyword {
64 get { return keyword; }
65 set { keyword = value; }
68 public HelpNavigator Navigator {
69 get { return navigator; }
70 set { navigator = value; }
83 #endregion // HelpProperty Class
85 #region Local Variables
86 private string helpnamespace;
87 private Hashtable controls;
88 private ToolTip.ToolTipWindow tooltip;
89 private EventHandler HideToolTipHandler;
90 private KeyPressEventHandler HideToolTipKeyHandler;
91 private MouseEventHandler HideToolTipMouseHandler;
92 private HelpEventHandler HelpRequestHandler;
94 #endregion // Local Variables
96 #region Public Constructors
97 public HelpProvider() {
98 controls = new Hashtable();
99 tooltip = new ToolTip.ToolTipWindow();
101 //UIA Framework: Event used to indicate that ToolTip is shown
102 tooltip.VisibleChanged += delegate (object sender, EventArgs args) {
103 if (tooltip.Visible == true)
104 OnUIAHelpRequested (this, new ControlEventArgs (UIAControl));
106 OnUIAHelpUnRequested (this, new ControlEventArgs (UIAControl));
109 HideToolTipHandler = new EventHandler(HideToolTip);
110 HideToolTipKeyHandler = new KeyPressEventHandler(HideToolTipKey);
111 HideToolTipMouseHandler = new MouseEventHandler(HideToolTipMouse);
112 HelpRequestHandler = new HelpEventHandler(HelpRequested);
114 #endregion // Public Constructors
116 #region Public Instance Properties
118 [Editor ("System.Windows.Forms.Design.HelpNamespaceEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
120 public virtual string HelpNamespace {
122 return helpnamespace;
126 helpnamespace = value;
130 [Localizable (false)]
132 [TypeConverter (typeof (StringConverter))]
133 [DefaultValue (null)]
134 [MWFCategory ("Data")]
137 get { return this.tag; }
138 set { this.tag = value; }
140 #endregion // Public Instance Properties
142 #region Public Instance Methods
143 public virtual bool CanExtend(object target) {
144 if (!(target is Control)) {
148 if ((target is Form) || (target is ToolBar)) {
157 public virtual string GetHelpKeyword(Control ctl) {
158 return GetHelpProperty(ctl).Keyword;
161 [DefaultValue(HelpNavigator.AssociateIndex)]
163 public virtual HelpNavigator GetHelpNavigator(Control ctl) {
164 return GetHelpProperty(ctl).Navigator;
169 public virtual string GetHelpString(Control ctl) {
170 return GetHelpProperty(ctl).Text;
174 public virtual bool GetShowHelp(Control ctl) {
175 return GetHelpProperty(ctl).Show;
178 public virtual void ResetShowHelp(Control ctl) {
181 hp = GetHelpProperty(ctl);
183 if ((hp.Keyword != null) || (hp.Text != null)) {
190 public virtual void SetHelpKeyword(Control ctl, string keyword) {
191 GetHelpProperty(ctl).Keyword = keyword;
194 public virtual void SetHelpNavigator(Control ctl, HelpNavigator navigator) {
195 GetHelpProperty(ctl).Navigator = navigator;
198 public virtual void SetHelpString(Control ctl, string helpString) {
199 GetHelpProperty(ctl).Text = helpString;
202 public virtual void SetShowHelp(Control ctl, bool value) {
203 GetHelpProperty(ctl).Show = value;
206 public override string ToString() {
207 return base.ToString() + ", HelpNameSpace: " + helpnamespace;
210 #endregion // Public Instance Methods
212 #region Private Methods
213 private HelpProperty GetHelpProperty(Control control) {
216 hp = (HelpProperty)controls[control];
218 hp = new HelpProperty(this, control);
219 controls[control] = hp;
225 private void HideToolTip(object Sender, EventArgs e) {
228 control = (Control)Sender;
229 control.LostFocus -= HideToolTipHandler;
231 this.tooltip.Visible = false;
234 private void HideToolTipKey(object Sender, KeyPressEventArgs e) {
237 control = (Control)Sender;
238 control.KeyPress -= HideToolTipKeyHandler;
240 this.tooltip.Visible = false;
243 private void HideToolTipMouse(object Sender, MouseEventArgs e) {
246 control = (Control)Sender;
247 control.MouseDown -= HideToolTipMouseHandler;
249 this.tooltip.Visible = false;
253 // This is called when the user does a "what's this" style lookup. It uses the 'text' property
254 private void HelpRequested(object sender, HelpEventArgs e) {
259 control = (Control)sender;
261 //UIA Framework: Associates requested control with internal variable to generate event
262 UIAControl = control;
264 if (GetHelpProperty(control).Text == null) {
271 tooltip.Text = GetHelpProperty(control).Text;
272 size = ThemeEngine.Current.ToolTipSize(tooltip, tooltip.Text);
273 tooltip.Width = size.Width;
274 tooltip.Height = size.Height;
275 pt.X -= size.Width / 2;
278 pt.X += size.Width / 2;
281 if ((pt.X + size.Width) < SystemInformation.WorkingArea.Width) {
284 tooltip.Left = pt.X - size.Width;
287 if ((pt.Y + size.Height) < (SystemInformation.WorkingArea.Height - 16)) {
290 tooltip.Top = pt.Y - size.Height;
294 tooltip.Visible = true;
295 control.KeyPress += HideToolTipKeyHandler;
296 control.MouseDown += HideToolTipMouseHandler;
297 control.LostFocus += HideToolTipHandler;
300 #endregion // Private Methods
302 #region UIA Framework: Events, Delegates and Methods
303 private Control uia_control;
305 private Control UIAControl {
306 get { return uia_control; }
307 set { uia_control = value; }
310 internal static event ControlEventHandler UIAHelpRequested;
311 internal static event ControlEventHandler UIAHelpUnRequested;
313 internal Rectangle UIAToolTipRectangle {
314 get { return tooltip.Bounds; }
317 internal static void OnUIAHelpRequested (HelpProvider provider, ControlEventArgs args)
319 if (UIAHelpRequested != null)
320 UIAHelpRequested (provider, args);
323 internal static void OnUIAHelpUnRequested (HelpProvider provider, ControlEventArgs args)
325 if (UIAHelpUnRequested != null)
326 UIAHelpUnRequested (provider, args);