a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
331 lines
8.9 KiB
C#
331 lines
8.9 KiB
C#
// Permission is hereby granted, free of charge, to any person obtaining
|
|
// a copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to
|
|
// permit persons to whom the Software is furnished to do so, subject to
|
|
// the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be
|
|
// included in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
//
|
|
// Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
|
|
//
|
|
// Authors:
|
|
// Peter Bartok (pbartok@novell.com)
|
|
//
|
|
//
|
|
|
|
// NOT COMPLETE
|
|
// Still missing: Tie-in to HTML help when the user presses F1 on the control
|
|
|
|
using System;
|
|
using System.Collections;
|
|
using System.ComponentModel;
|
|
using System.Drawing;
|
|
|
|
namespace System.Windows.Forms {
|
|
[ToolboxItemFilter("System.Windows.Forms")]
|
|
[ProvideProperty("ShowHelp", "System.Windows.Forms.Control, " + Consts.AssemblySystem_Windows_Forms)]
|
|
[ProvideProperty("HelpNavigator", "System.Windows.Forms.Control, " + Consts.AssemblySystem_Windows_Forms)]
|
|
[ProvideProperty("HelpKeyword", "System.Windows.Forms.Control, " + Consts.AssemblySystem_Windows_Forms)]
|
|
[ProvideProperty("HelpString", "System.Windows.Forms.Control, " + Consts.AssemblySystem_Windows_Forms)]
|
|
public class HelpProvider : Component, IExtenderProvider {
|
|
#region HelpProperty Class
|
|
private class HelpProperty {
|
|
internal string keyword;
|
|
internal HelpNavigator navigator;
|
|
internal string text;
|
|
internal bool show;
|
|
internal Control control;
|
|
internal HelpProvider hp;
|
|
|
|
public HelpProperty(HelpProvider hp, Control control) {
|
|
this.control = control;
|
|
this.hp = hp;
|
|
|
|
keyword = null;
|
|
navigator = HelpNavigator.AssociateIndex;
|
|
text = null;
|
|
show = false;
|
|
|
|
control.HelpRequested += hp.HelpRequestHandler;
|
|
}
|
|
|
|
public string Keyword {
|
|
get { return keyword; }
|
|
set { keyword = value; }
|
|
}
|
|
|
|
public HelpNavigator Navigator {
|
|
get { return navigator; }
|
|
set { navigator = value; }
|
|
}
|
|
|
|
public string Text {
|
|
get { return text; }
|
|
set { text = value; }
|
|
}
|
|
|
|
public bool Show {
|
|
get { return show; }
|
|
set { show = value; }
|
|
}
|
|
}
|
|
#endregion // HelpProperty Class
|
|
|
|
#region Local Variables
|
|
private string helpnamespace;
|
|
private Hashtable controls;
|
|
private ToolTip.ToolTipWindow tooltip;
|
|
private EventHandler HideToolTipHandler;
|
|
private KeyPressEventHandler HideToolTipKeyHandler;
|
|
private MouseEventHandler HideToolTipMouseHandler;
|
|
private HelpEventHandler HelpRequestHandler;
|
|
private object tag;
|
|
#endregion // Local Variables
|
|
|
|
#region Public Constructors
|
|
public HelpProvider() {
|
|
controls = new Hashtable();
|
|
tooltip = new ToolTip.ToolTipWindow();
|
|
|
|
//UIA Framework: Event used to indicate that ToolTip is shown
|
|
tooltip.VisibleChanged += delegate (object sender, EventArgs args) {
|
|
if (tooltip.Visible == true)
|
|
OnUIAHelpRequested (this, new ControlEventArgs (UIAControl));
|
|
else
|
|
OnUIAHelpUnRequested (this, new ControlEventArgs (UIAControl));
|
|
};
|
|
|
|
HideToolTipHandler = new EventHandler(HideToolTip);
|
|
HideToolTipKeyHandler = new KeyPressEventHandler(HideToolTipKey);
|
|
HideToolTipMouseHandler = new MouseEventHandler(HideToolTipMouse);
|
|
HelpRequestHandler = new HelpEventHandler(HelpRequested);
|
|
}
|
|
#endregion // Public Constructors
|
|
|
|
#region Public Instance Properties
|
|
[DefaultValue(null)]
|
|
[Editor ("System.Windows.Forms.Design.HelpNamespaceEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
|
|
[Localizable(true)]
|
|
public virtual string HelpNamespace {
|
|
get {
|
|
return helpnamespace;
|
|
}
|
|
|
|
set {
|
|
helpnamespace = value;
|
|
}
|
|
}
|
|
|
|
[Localizable (false)]
|
|
[Bindable (true)]
|
|
[TypeConverter (typeof (StringConverter))]
|
|
[DefaultValue (null)]
|
|
[MWFCategory ("Data")]
|
|
public object Tag
|
|
{
|
|
get { return this.tag; }
|
|
set { this.tag = value; }
|
|
}
|
|
#endregion // Public Instance Properties
|
|
|
|
#region Public Instance Methods
|
|
public virtual bool CanExtend(object target) {
|
|
if (!(target is Control)) {
|
|
return false;
|
|
}
|
|
|
|
if ((target is Form) || (target is ToolBar)) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
[DefaultValue(null)]
|
|
[Localizable(true)]
|
|
public virtual string GetHelpKeyword(Control ctl) {
|
|
return GetHelpProperty(ctl).Keyword;
|
|
}
|
|
|
|
[DefaultValue(HelpNavigator.AssociateIndex)]
|
|
[Localizable(true)]
|
|
public virtual HelpNavigator GetHelpNavigator(Control ctl) {
|
|
return GetHelpProperty(ctl).Navigator;
|
|
}
|
|
|
|
[DefaultValue(null)]
|
|
[Localizable(true)]
|
|
public virtual string GetHelpString(Control ctl) {
|
|
return GetHelpProperty(ctl).Text;
|
|
}
|
|
|
|
[Localizable(true)]
|
|
public virtual bool GetShowHelp(Control ctl) {
|
|
return GetHelpProperty(ctl).Show;
|
|
}
|
|
|
|
public virtual void ResetShowHelp(Control ctl) {
|
|
HelpProperty hp;
|
|
|
|
hp = GetHelpProperty(ctl);
|
|
|
|
if ((hp.Keyword != null) || (hp.Text != null)) {
|
|
hp.Show = true;
|
|
} else {
|
|
hp.Show = false;
|
|
}
|
|
}
|
|
|
|
public virtual void SetHelpKeyword(Control ctl, string keyword) {
|
|
GetHelpProperty(ctl).Keyword = keyword;
|
|
}
|
|
|
|
public virtual void SetHelpNavigator(Control ctl, HelpNavigator navigator) {
|
|
GetHelpProperty(ctl).Navigator = navigator;
|
|
}
|
|
|
|
public virtual void SetHelpString(Control ctl, string helpString) {
|
|
GetHelpProperty(ctl).Text = helpString;
|
|
}
|
|
|
|
public virtual void SetShowHelp(Control ctl, bool value) {
|
|
GetHelpProperty(ctl).Show = value;
|
|
}
|
|
|
|
public override string ToString() {
|
|
return base.ToString() + ", HelpNameSpace: " + helpnamespace;
|
|
}
|
|
|
|
#endregion // Public Instance Methods
|
|
|
|
#region Private Methods
|
|
private HelpProperty GetHelpProperty(Control control) {
|
|
HelpProperty hp;
|
|
|
|
hp = (HelpProperty)controls[control];
|
|
if (hp == null) {
|
|
hp = new HelpProperty(this, control);
|
|
controls[control] = hp;
|
|
}
|
|
|
|
return hp;
|
|
}
|
|
|
|
private void HideToolTip(object Sender, EventArgs e) {
|
|
Control control;
|
|
|
|
control = (Control)Sender;
|
|
control.LostFocus -= HideToolTipHandler;
|
|
|
|
this.tooltip.Visible = false;
|
|
}
|
|
|
|
private void HideToolTipKey(object Sender, KeyPressEventArgs e) {
|
|
Control control;
|
|
|
|
control = (Control)Sender;
|
|
control.KeyPress -= HideToolTipKeyHandler;
|
|
|
|
this.tooltip.Visible = false;
|
|
}
|
|
|
|
private void HideToolTipMouse(object Sender, MouseEventArgs e) {
|
|
Control control;
|
|
|
|
control = (Control)Sender;
|
|
control.MouseDown -= HideToolTipMouseHandler;
|
|
|
|
this.tooltip.Visible = false;
|
|
}
|
|
|
|
|
|
// This is called when the user does a "what's this" style lookup. It uses the 'text' property
|
|
private void HelpRequested(object sender, HelpEventArgs e) {
|
|
Size size;
|
|
Point pt;
|
|
Control control;
|
|
|
|
control = (Control)sender;
|
|
|
|
//UIA Framework: Associates requested control with internal variable to generate event
|
|
UIAControl = control;
|
|
|
|
if (GetHelpProperty(control).Text == null) {
|
|
return;
|
|
}
|
|
|
|
pt = e.MousePos;
|
|
|
|
// Display Tip
|
|
tooltip.Text = GetHelpProperty(control).Text;
|
|
size = ThemeEngine.Current.ToolTipSize(tooltip, tooltip.Text);
|
|
tooltip.Width = size.Width;
|
|
tooltip.Height = size.Height;
|
|
pt.X -= size.Width / 2;
|
|
|
|
if (pt.X < 0) {
|
|
pt.X += size.Width / 2;
|
|
}
|
|
|
|
if ((pt.X + size.Width) < SystemInformation.WorkingArea.Width) {
|
|
tooltip.Left = pt.X;
|
|
} else {
|
|
tooltip.Left = pt.X - size.Width;
|
|
}
|
|
|
|
if ((pt.Y + size.Height) < (SystemInformation.WorkingArea.Height - 16)) {
|
|
tooltip.Top = pt.Y;
|
|
} else {
|
|
tooltip.Top = pt.Y - size.Height;
|
|
}
|
|
|
|
|
|
tooltip.Visible = true;
|
|
control.KeyPress += HideToolTipKeyHandler;
|
|
control.MouseDown += HideToolTipMouseHandler;
|
|
control.LostFocus += HideToolTipHandler;
|
|
e.Handled = true;
|
|
}
|
|
#endregion // Private Methods
|
|
|
|
#region UIA Framework: Events, Delegates and Methods
|
|
private Control uia_control;
|
|
|
|
private Control UIAControl {
|
|
get { return uia_control; }
|
|
set { uia_control = value; }
|
|
}
|
|
|
|
internal static event ControlEventHandler UIAHelpRequested;
|
|
internal static event ControlEventHandler UIAHelpUnRequested;
|
|
|
|
internal Rectangle UIAToolTipRectangle {
|
|
get { return tooltip.Bounds; }
|
|
}
|
|
|
|
internal static void OnUIAHelpRequested (HelpProvider provider, ControlEventArgs args)
|
|
{
|
|
if (UIAHelpRequested != null)
|
|
UIAHelpRequested (provider, args);
|
|
}
|
|
|
|
internal static void OnUIAHelpUnRequested (HelpProvider provider, ControlEventArgs args)
|
|
{
|
|
if (UIAHelpUnRequested != null)
|
|
UIAHelpUnRequested (provider, args);
|
|
}
|
|
#endregion
|
|
}
|
|
}
|