Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'mcs/class/Managed.Windows.Forms/System.Windows.Forms/ErrorProvider.cs')
-rw-r--r--mcs/class/Managed.Windows.Forms/System.Windows.Forms/ErrorProvider.cs440
1 files changed, 440 insertions, 0 deletions
diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ErrorProvider.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ErrorProvider.cs
new file mode 100644
index 00000000000..450e975a883
--- /dev/null
+++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ErrorProvider.cs
@@ -0,0 +1,440 @@
+// 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)
+//
+//
+
+// COMPLETE
+
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+
+namespace System.Windows.Forms {
+ [ToolboxItemFilter("System.Windows.Forms")]
+ [ProvideProperty("IconAlignment", "System.Windows.Forms.Control, " + Consts.AssemblySystem_Windows_Forms)]
+ [ProvideProperty("IconPadding", "System.Windows.Forms.Control, " + Consts.AssemblySystem_Windows_Forms)]
+ [ProvideProperty("Error", "System.Windows.Forms.Control, " + Consts.AssemblySystem_Windows_Forms)]
+ public class ErrorProvider : Component, IExtenderProvider {
+ #region Private Classes
+ private class ErrorProperty {
+ public ErrorIconAlignment alignment;
+ public int padding;
+ public string text;
+ public Control control;
+ public ErrorProvider ep;
+ private UserControl window;
+ private bool visible;
+ private int blink_count;
+ private EventHandler tick;
+ private System.Windows.Forms.Timer timer;
+
+ public ErrorProperty(ErrorProvider ep, Control control) {
+ this.ep = ep;
+ this.control = control;
+
+ alignment = ErrorIconAlignment.MiddleRight;
+ padding = 0;
+ text = string.Empty;
+ blink_count = 0;
+
+ tick = new EventHandler(window_Tick);
+
+ window = new UserControl();
+ window.Visible = false;
+ window.Width = ep.icon.Width;
+ window.Height = ep.icon.Height;
+
+ if (ep.container != null) {
+ ep.container.Controls.Add(window);
+ ep.container.Controls.SetChildIndex(window, 0);
+ } else {
+ control.parent.Controls.Add(window);
+ control.parent.Controls.SetChildIndex(window, 0);
+ }
+
+ window.Paint += new PaintEventHandler(window_Paint);
+ window.MouseEnter += new EventHandler(window_MouseEnter);
+ window.MouseLeave += new EventHandler(window_MouseLeave);
+ control.SizeChanged += new EventHandler(control_SizeLocationChanged);
+ control.LocationChanged += new EventHandler(control_SizeLocationChanged);
+ // Do we want to block mouse clicks? if so we need a few more events handled
+
+ CalculateAlignment();
+ }
+
+ public string Text {
+ get {
+ return text;
+ }
+
+ set {
+ text = value;
+ if (text != String.Empty) {
+ window.Visible = true;
+ } else {
+ window.Visible = false;
+ }
+
+ if (ep.blinkstyle != ErrorBlinkStyle.NeverBlink) {
+ if (timer == null) {
+ timer = new System.Windows.Forms.Timer();
+ }
+ timer.Interval = ep.blinkrate;
+ timer.Tick += tick;
+ blink_count = 0;
+ timer.Enabled = true;
+ }
+ }
+ }
+
+ public ErrorIconAlignment Alignment {
+ get {
+ return alignment;
+ }
+
+ set {
+ if (alignment != value) {
+ alignment = value;
+ CalculateAlignment();
+ }
+ }
+ }
+
+ public int Padding {
+ get {
+ return padding;
+ }
+
+ set {
+ if (padding != value) {
+ padding = value;
+ CalculateAlignment();
+ }
+ }
+ }
+
+ private void CalculateAlignment() {
+ if (visible) {
+ visible = false;
+ ep.tooltip.Visible = false;
+ }
+
+ switch (alignment) {
+ case ErrorIconAlignment.TopLeft: {
+ window.Left = control.Left - ep.icon.Width - padding;
+ window.Top = control.Top;
+ break;
+ }
+
+ case ErrorIconAlignment.TopRight: {
+ window.Left = control.Left + control.Width + padding;
+ window.Top = control.Top;
+ break;
+ }
+
+ case ErrorIconAlignment.MiddleLeft: {
+ window.Left = control.Left - ep.icon.Width - padding;
+ window.Top = control.Top + (control.Height - ep.icon.Height) / 2;
+ break;
+ }
+
+ case ErrorIconAlignment.MiddleRight: {
+ window.Left = control.Left + control.Width + padding;
+ window.Top = control.Top + (control.Height - ep.icon.Height) / 2;
+ break;
+ }
+
+ case ErrorIconAlignment.BottomLeft: {
+ window.Left = control.Left - ep.icon.Width - padding;
+ window.Top = control.Top + control.Height - ep.icon.Height;
+ break;
+ }
+
+ case ErrorIconAlignment.BottomRight: {
+ window.Left = control.Left + control.Width + padding;
+ window.Top = control.Top + control.Height - ep.icon.Height;
+ break;
+ }
+ }
+ }
+
+ private void window_Paint(object sender, PaintEventArgs e) {
+ if (text != string.Empty) {
+ e.Graphics.DrawIcon(this.ep.icon, 0, 0);
+ }
+ }
+
+ private void window_MouseEnter(object sender, EventArgs e) {
+ if (!visible) {
+ Size size;
+ Point pt;
+
+ visible = true;
+
+ pt = Control.MousePosition;
+
+ size = ThemeEngine.Current.ToolTipSize(ep.tooltip, text);
+ ep.tooltip.Width = size.Width;
+ ep.tooltip.Height = size.Height;
+ ep.tooltip.Text = text;
+
+ if ((pt.X + size.Width) < SystemInformation.WorkingArea.Width) {
+ ep.tooltip.Left = pt.X;
+ } else {
+ ep.tooltip.Left = pt.X - size.Width;
+ }
+
+ if ((pt.Y + size.Height) < (SystemInformation.WorkingArea.Height - 16)) {
+ ep.tooltip.Top = pt.Y + 16;
+ } else {
+ ep.tooltip.Top = pt.Y - size.Height;
+ }
+ ep.tooltip.Visible = true;
+ }
+ }
+
+ private void window_MouseLeave(object sender, EventArgs e) {
+ if (visible) {
+ visible = false;
+ ep.tooltip.Visible = false;
+ }
+ }
+
+ private void control_SizeLocationChanged(object sender, EventArgs e) {
+ if (visible) {
+ visible = false;
+ ep.tooltip.Visible = false;
+ }
+ CalculateAlignment();
+ }
+
+ private void window_Tick(object sender, EventArgs e) {
+ if (timer.Enabled) {
+ Graphics g;
+
+ blink_count++;
+
+ // Dunno why this POS doesn't reliably blink
+ g = window.CreateGraphics();
+ if ((blink_count % 2) == 0) {
+ g.FillRectangle(ThemeEngine.Current.ResPool.GetSolidBrush(window.parent.BackColor), window.ClientRectangle);
+ } else {
+ g.DrawIcon(this.ep.icon, 0, 0);
+ }
+ g.Dispose();
+
+ if ((blink_count > 6) && (ep.blinkstyle == ErrorBlinkStyle.BlinkIfDifferentError)) {
+ timer.Stop();
+ blink_count = 0;
+ }
+ }
+ }
+ }
+ #endregion
+
+ #region Local Variables
+ private int blinkrate;
+ private ErrorBlinkStyle blinkstyle;
+ private string datamember;
+ private object datasource;
+ private ContainerControl container;
+ private Icon icon;
+ private Hashtable controls;
+ private ToolTip.ToolTipWindow tooltip;
+ #endregion // Local Variables
+
+ #region Public Constructors
+ public ErrorProvider() {
+ controls = new Hashtable();
+
+ blinkrate = 250;
+ blinkstyle = ErrorBlinkStyle.BlinkIfDifferentError;
+
+ icon = (Icon)Locale.GetResource("errorProvider.ico");
+ tooltip = new ToolTip.ToolTipWindow(null);
+ }
+
+ public ErrorProvider(ContainerControl parentControl) : this() {
+ container = parentControl;
+ }
+ #endregion // Public Constructors
+
+ #region Public Instance Properties
+ [DefaultValue(250)]
+ [RefreshProperties(RefreshProperties.Repaint)]
+ public int BlinkRate {
+ get {
+ return blinkrate;
+ }
+
+ set {
+ blinkrate = value;
+ }
+ }
+
+ [DefaultValue(ErrorBlinkStyle.BlinkIfDifferentError)]
+ public ErrorBlinkStyle BlinkStyle {
+ get {
+ return blinkstyle;
+ }
+
+ set {
+ blinkstyle = value;
+ }
+ }
+
+ [DefaultValue(null)]
+ public ContainerControl ContainerControl {
+ get {
+ return container;
+ }
+
+ set {
+ container = value;
+ }
+ }
+
+ [MonoTODO]
+ [DefaultValue(null)]
+ [Editor ("System.Windows.Forms.Design.DataMemberListEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
+ public string DataMember {
+ get {
+ return datamember;
+ }
+
+ set {
+ datamember = value;
+ // FIXME - add binding magic and also update BindToDataAndErrors with it
+ }
+ }
+
+ [MonoTODO]
+ [DefaultValue(null)]
+ [TypeConverter("System.Windows.Forms.Design.DataSourceConverter, " + Consts.AssemblySystem_Design)]
+ public object DataSource {
+ get {
+ return datasource;
+ }
+
+ set {
+ datasource = value;
+ // FIXME - add binding magic and also update BindToDataAndErrors with it
+ }
+ }
+
+ [Localizable(true)]
+ public Icon Icon {
+ get {
+ return icon;
+ }
+
+ set {
+ icon = value;
+ }
+ }
+
+ public override ISite Site {
+ set {
+ base.Site = value;
+ }
+ }
+ #endregion // Public Instance Properties
+
+ #region Public Instance Methods
+ [MonoTODO]
+ public void BindToDataAndErrors(object newDataSource, string newDataMember) {
+ datasource = newDataSource;
+ datamember = newDataMember;
+ // FIXME - finish
+ }
+
+ public bool CanExtend(object extendee) {
+ if (!(extendee is Control)) {
+ return false;
+ }
+
+ if ((extendee is Form) || (extendee is ToolBar)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ [Localizable(true)]
+ [DefaultValue("")]
+ public string GetError(Control control) {
+ return GetErrorProperty(control).Text;
+ }
+
+ [Localizable(true)]
+ [DefaultValue(ErrorIconAlignment.MiddleRight)]
+ public ErrorIconAlignment GetIconAlignment(Control control) {
+ return GetErrorProperty(control).Alignment;
+ }
+
+ [Localizable(true)]
+ [DefaultValue(0)]
+ public int GetIconPadding(Control control) {
+ return GetErrorProperty(control).padding;
+ }
+
+ public void SetError(Control control, string value) {
+ GetErrorProperty(control).Text = value;
+ }
+
+ public void SetIconAlignment(Control control, ErrorIconAlignment value) {
+ GetErrorProperty(control).Alignment = value;
+ }
+
+ public void SetIconPadding(Control control, int padding) {
+ GetErrorProperty(control).Padding = padding;
+ }
+
+ [MonoTODO]
+ public void UpdateBinding() {
+ }
+ #endregion // Public Instance Methods
+
+ #region Protected Instance Methods
+ protected override void Dispose(bool disposing) {
+ base.Dispose (disposing);
+ }
+ #endregion // Protected Instance Methods
+
+ #region Private Methods
+ private ErrorProperty GetErrorProperty(Control control) {
+ ErrorProperty ep;
+
+ ep = (ErrorProperty)controls[control];
+ if (ep == null) {
+ ep = new ErrorProperty(this, control);
+ controls[control] = ep;
+ }
+
+ return ep;
+ }
+ #endregion // Private Methods
+ }
+}