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;
96 #endregion // Local Variables
98 #region Public Constructors
99 public HelpProvider() {
100 controls = new Hashtable();
101 tooltip = new ToolTip.ToolTipWindow();
104 //UIA Framework: Event used to indicate that ToolTip is shown
105 tooltip.VisibleChanged += delegate (object sender, EventArgs args) {
106 if (tooltip.Visible == true)
107 OnUIAHelpRequested (this, new ControlEventArgs (UIAControl));
109 OnUIAHelpUnRequested (this, new ControlEventArgs (UIAControl));
113 HideToolTipHandler = new EventHandler(HideToolTip);
114 HideToolTipKeyHandler = new KeyPressEventHandler(HideToolTipKey);
115 HideToolTipMouseHandler = new MouseEventHandler(HideToolTipMouse);
116 HelpRequestHandler = new HelpEventHandler(HelpRequested);
118 #endregion // Public Constructors
120 #region Public Instance Properties
122 [Editor ("System.Windows.Forms.Design.HelpNamespaceEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
124 public virtual string HelpNamespace {
126 return helpnamespace;
130 helpnamespace = value;
135 [Localizable (false)]
137 [TypeConverter (typeof (StringConverter))]
138 [DefaultValue (null)]
139 [MWFCategory ("Data")]
142 get { return this.tag; }
143 set { this.tag = value; }
146 #endregion // Public Instance Properties
148 #region Public Instance Methods
149 public virtual bool CanExtend(object target) {
150 if (!(target is Control)) {
154 if ((target is Form) || (target is ToolBar)) {
163 public virtual string GetHelpKeyword(Control ctl) {
164 return GetHelpProperty(ctl).Keyword;
167 [DefaultValue(HelpNavigator.AssociateIndex)]
169 public virtual HelpNavigator GetHelpNavigator(Control ctl) {
170 return GetHelpProperty(ctl).Navigator;
175 public virtual string GetHelpString(Control ctl) {
176 return GetHelpProperty(ctl).Text;
180 public virtual bool GetShowHelp(Control ctl) {
181 return GetHelpProperty(ctl).Show;
184 public virtual void ResetShowHelp(Control ctl) {
187 hp = GetHelpProperty(ctl);
189 if ((hp.Keyword != null) || (hp.Text != null)) {
196 public virtual void SetHelpKeyword(Control ctl, string keyword) {
197 GetHelpProperty(ctl).Keyword = keyword;
200 public virtual void SetHelpNavigator(Control ctl, HelpNavigator navigator) {
201 GetHelpProperty(ctl).Navigator = navigator;
204 public virtual void SetHelpString(Control ctl, string helpString) {
205 GetHelpProperty(ctl).Text = helpString;
208 public virtual void SetShowHelp(Control ctl, bool value) {
209 GetHelpProperty(ctl).Show = value;
212 public override string ToString() {
213 return base.ToString() + ", HelpNameSpace: " + helpnamespace;
216 #endregion // Public Instance Methods
218 #region Private Methods
219 private HelpProperty GetHelpProperty(Control control) {
222 hp = (HelpProperty)controls[control];
224 hp = new HelpProperty(this, control);
225 controls[control] = hp;
231 private void HideToolTip(object Sender, EventArgs e) {
234 control = (Control)Sender;
235 control.LostFocus -= HideToolTipHandler;
237 this.tooltip.Visible = false;
240 private void HideToolTipKey(object Sender, KeyPressEventArgs e) {
243 control = (Control)Sender;
244 control.KeyPress -= HideToolTipKeyHandler;
246 this.tooltip.Visible = false;
249 private void HideToolTipMouse(object Sender, MouseEventArgs e) {
252 control = (Control)Sender;
253 control.MouseDown -= HideToolTipMouseHandler;
255 this.tooltip.Visible = false;
259 // This is called when the user does a "what's this" style lookup. It uses the 'text' property
260 private void HelpRequested(object sender, HelpEventArgs e) {
265 control = (Control)sender;
268 //UIA Framework: Associates requested control with internal variable to generate event
269 UIAControl = control;
272 if (GetHelpProperty(control).Text == null) {
279 tooltip.Text = GetHelpProperty(control).Text;
280 size = ThemeEngine.Current.ToolTipSize(tooltip, tooltip.Text);
281 tooltip.Width = size.Width;
282 tooltip.Height = size.Height;
283 pt.X -= size.Width / 2;
286 pt.X += size.Width / 2;
289 if ((pt.X + size.Width) < SystemInformation.WorkingArea.Width) {
292 tooltip.Left = pt.X - size.Width;
295 if ((pt.Y + size.Height) < (SystemInformation.WorkingArea.Height - 16)) {
298 tooltip.Top = pt.Y - size.Height;
302 tooltip.Visible = true;
303 control.KeyPress += HideToolTipKeyHandler;
304 control.MouseDown += HideToolTipMouseHandler;
305 control.LostFocus += HideToolTipHandler;
308 #endregion // Private Methods
310 #region UIA Framework: Events, Delegates and Methods
312 private Control uia_control;
314 private Control UIAControl {
315 get { return uia_control; }
316 set { uia_control = value; }
319 internal static event ControlEventHandler UIAHelpRequested;
320 internal static event ControlEventHandler UIAHelpUnRequested;
322 internal Rectangle UIAToolTipRectangle {
323 get { return tooltip.Bounds; }
326 internal static void OnUIAHelpRequested (HelpProvider provider, ControlEventArgs args)
328 if (UIAHelpRequested != null)
329 UIAHelpRequested (provider, args);
332 internal static void OnUIAHelpUnRequested (HelpProvider provider, ControlEventArgs args)
334 if (UIAHelpUnRequested != null)
335 UIAHelpUnRequested (provider, args);