using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.ComponentModel; using DevExpress.XtraEditors.Registrator; using DevExpress.XtraEditors; namespace GOLLF.Infrastructure.ControlLibrary { public class TextEditCommon { public enum MaskType { Numeric, RegularEx, } public static void SetMask(MaskType maskType, GollfAmountRepositoryItemTextEdit properties, bool showComma, int amountIntegerLength, int amountDecimalLength) { //properties.Tag = properties..Container..Components == null; switch (maskType) { case MaskType.Numeric: properties.Mask.EditMask = GenerateMask(amountIntegerLength, amountDecimalLength);// "#,###,###,###.###;#,###,###,###.###"; properties.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.Numeric; break; case MaskType.RegularEx: // //"(-)?((//d{0,12}(//R.//d{0,3}))?|//d{1,3}([b]{0,1})?|//d{0,3}(//R.//d{1,3}[b]{0,1})?|//d{1,6}([mm]{0,2})?|//d{0,6}(//R.//d{1,3}[mm]{0,2})?|//d{1,7}([m]{0,1})?|//d{0,7}(//R.//d{1,3}[m]{0,1})?|//d{1,9}([k]{0,1})?|//d{0,9}(//R.//d{1,3}[k]{0,1})?)"; string mask = @"((/d{0,12}(/R./d{0,3}))?|/d{1,3}([b]{0,1})?|/d{0,3}(/R./d{1,3}[b]{0,1})?|/d{1,6}([mm]{0,2})?|/d{0,6}(/R./d{1,3}[mm]{0,2})?|/d{1,7}([m]{0,1})?|/d{0,7}(/R./d{1,3}[m]{0,1})?|/d{1,9}([k]{0,1})?|/d{0,9}(/R./d{1,3}[k]{0,1})?)"; #region RegExpress //12 0,3 mask = mask.Replace("12", amountIntegerLength.ToString()).Replace("0,3", "0," + amountDecimalLength.ToString()); //1,3 if (amountDecimalLength > 0) mask = mask.Replace("1,3", "1," + amountDecimalLength.ToString()); else mask = mask.Replace("1,3", "0,0"); //0,6 1,6 int n6 = 6 - 12 + amountIntegerLength; if (n6 < 1) { mask = mask.Replace("0,6", "0,0"); mask = mask.Replace("1,6", "0,0"); } else { mask = mask.Replace("0,6", "0," + n6); mask = mask.Replace("1,6", "1," + n6); } //0,7 1,7 int n7 = 7 - 12 + amountIntegerLength; if (n7 < 1) { mask = mask.Replace("0,7", "0,0"); mask = mask.Replace("1,7", "0,0"); } else { mask = mask.Replace("0,7", "0," + n7); mask = mask.Replace("1,7", "1," + n7); } //0,9 1,9 int n9 = 9 - 12 + amountIntegerLength; if (n9 < 1) { mask = mask.Replace("0,9", "0,0"); mask = mask.Replace("1,9", "0,0"); } else { mask = mask.Replace("0,9", "0," + n9); mask = mask.Replace("1,9", "1," + n9); } #endregion properties.Mask.EditMask = mask; properties.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.RegEx; break; } if (showComma) { properties.DisplayFormat.FormatType = DevExpress.Utils.FormatType.Custom; properties.DisplayFormat.FormatString = GenerateMask(amountIntegerLength, amountDecimalLength); //properties.EditFormat.FormatType = DevExpress.Utils.FormatType.Custom; //properties.EditFormat.FormatString = GenerateMask(amountIntegerLength, amountDecimalLength); } else { properties.DisplayFormat.FormatType = DevExpress.Utils.FormatType.None; properties.DisplayFormat.FormatString = string.Empty; //properties.EditFormat.FormatType = DevExpress.Utils.FormatType.None; //properties.EditFormat.FormatString = string.Empty; } } static string GenerateMask(int amountIntegerLength, int amountDecimalLength) { String mask = string.Empty; for (int i = 0; i < amountIntegerLength; i++) { if (i % 3 == 0 && i != 0) mask = "#," + mask; else mask = "#" + mask; } if (amountDecimalLength > 0) { mask += "."; for (int i = 0; i < amountDecimalLength; i++) { mask += "#"; } } return mask; } private static bool isNumeric(string val, System.Globalization.NumberStyles NumberStyle) { Double result; return Double.TryParse(val, NumberStyle, System.Globalization.CultureInfo.CurrentCulture, out result); } public static void ValidateEditor(GollfAmountTextEdit edit) { string text = Convert.ToString(edit.EditValue); if (string.IsNullOrEmpty(text.Trim('-', '.'))) edit.EditValue = null; if (!string.IsNullOrEmpty(text.Trim('-', '.'))) { double numValue = 0; int convertValue = 1; if (text.Length > 1 && text.EndsWith("b", StringComparison.OrdinalIgnoreCase)) { text = text.Substring(0, text.Length - 1); convertValue = 1000000000; } else if (text.Length > 2 && text.EndsWith("mm", StringComparison.OrdinalIgnoreCase)) { text = text.Substring(0, text.Length - 2); convertValue = 1000000; } else if (text.Length > 1 && text.EndsWith("m", StringComparison.OrdinalIgnoreCase)) { text = text.Substring(0, text.Length - 1); convertValue = 100000; } else if (text.Length > 1 && (text.EndsWith("k", StringComparison.OrdinalIgnoreCase))) { text = text.Substring(0, text.Length - 1); convertValue = 1000; } if (isNumeric(text, System.Globalization.NumberStyles.Float | System.Globalization.NumberStyles.AllowThousands)) { numValue = Convert.ToDouble(text) * convertValue; edit.EditValue = numValue; edit.ErrorText = null; } else edit.ErrorText = "Invalid Value"; } } } [UserRepositoryItem("Register")] public class GollfAmountTextEdit : DevExpress.XtraEditors.TextEdit { //private log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); public GollfAmountTextEdit() : base() { InitializeComponent(); } private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GollfAmountTextEdit)); this.Properties.AllowNullInput = DevExpress.Utils.DefaultBoolean.True; this.Properties.Appearance.Options.UseTextOptions = true; this.Properties.Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far; Amount_A_MaskType = GOLLF.Infrastructure.ControlLibrary.TextEditCommon.MaskType.Numeric; } #region ReglarEx mask events protected override void OnLeave(EventArgs e) { if (Amount_A_MaskType == GOLLF.Infrastructure.ControlLibrary.TextEditCommon.MaskType.RegularEx) GOLLF.Infrastructure.ControlLibrary.TextEditCommon.ValidateEditor(this); base.OnLeave(e); } protected override void OnKeyPress(KeyPressEventArgs e) { if (Amount_A_MaskType == GOLLF.Infrastructure.ControlLibrary.TextEditCommon.MaskType.RegularEx) if ((int)e.KeyChar == (int)Keys.Enter) { GOLLF.Infrastructure.ControlLibrary.TextEditCommon.ValidateEditor(this); } base.OnKeyPress(e); } //This event is required for repository editor protected override void OnEditorLeave(EventArgs e) { if (Amount_A_MaskType == GOLLF.Infrastructure.ControlLibrary.TextEditCommon.MaskType.RegularEx) GOLLF.Infrastructure.ControlLibrary.TextEditCommon.ValidateEditor(this); } #endregion protected override void OnKeyUp(KeyEventArgs e) { if (Amount_A_MaskType == GOLLF.Infrastructure.ControlLibrary.TextEditCommon.MaskType.Numeric) { if (e.KeyCode == Keys.Delete || e.KeyCode == Keys.Back) { double val; if (this.SelectionLength == this.Text.Length || (double.TryParse(this.Text, out val) && val == 0)) { this.EditValue = null; } } } base.OnKeyUp(e); } #region Register RepositoryItemTextEdit static GollfAmountTextEdit() { GollfAmountRepositoryItemTextEdit.Register(); } public override string EditorTypeName { get { return GollfAmountRepositoryItemTextEdit.EditorName; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public new GollfAmountRepositoryItemTextEdit Properties { get { return base.Properties as GollfAmountRepositoryItemTextEdit; } } #endregion #region New Properties for Gollf control GOLLF.Infrastructure.ControlLibrary.TextEditCommon.MaskType amountMaskType; [Description("Numeric mask is simple, used in COMPS. RegularEx mask support user type 'k','m','mm' etc."), Category("~Gollf"), DefaultValue(GOLLF.Infrastructure.ControlLibrary.TextEditCommon.MaskType.Numeric)] public GOLLF.Infrastructure.ControlLibrary.TextEditCommon.MaskType Amount_A_MaskType { get { if (this.Properties.Tag != null && this.Properties.Tag.ToString() == GOLLF.Infrastructure.ControlLibrary.TextEditCommon.MaskType.RegularEx.ToString()) amountMaskType = GOLLF.Infrastructure.ControlLibrary.TextEditCommon.MaskType.RegularEx;//value from properties return amountMaskType; } set { amountMaskType = value; GOLLF.Infrastructure.ControlLibrary.TextEditCommon.SetMask(amountMaskType, this.Properties, showComma, amountIntegerLength, amountDecimalLength); } } int amountIntegerLength = 8; [Description("Gets or Sets length not include decimal"), Category("~Gollf"), DefaultValue(8)] public int Amount_B_IntegerLength { get { return amountIntegerLength; } set { if (value > 0) { amountIntegerLength = value; Amount_A_MaskType = amountMaskType;//reinit } } } int amountDecimalLength = 3; [Description("Gets or Sets decimal length"), Category("~Gollf"), DefaultValue(3)] public int Amount_C_DecimalLength { get { return amountDecimalLength; } set { if (value >= 0) { amountDecimalLength = value; Amount_A_MaskType = amountMaskType;//reinit } } } bool showComma = true; [Description("Gets or Sets need show comma"), Category("~Gollf"), DefaultValue(true)] public bool Amount_D_ShowComma { get { return showComma; } set { showComma = value; Amount_A_MaskType = amountMaskType;//reinit } } #endregion } public class GollfAmountRepositoryItemTextEdit : DevExpress.XtraEditors.Repository.RepositoryItemTextEdit { #region Register To IDE internal const string EditorName = "GollfAmountRepositoryItemTextEdit"; static GollfAmountRepositoryItemTextEdit() { Register(); } public override string EditorTypeName { get { return EditorName; } } public static void Register() { EditorRegistrationInfo.Default.Editors.Add(new EditorClassInfo( EditorName, typeof(GollfAmountTextEdit), typeof(GollfAmountRepositoryItemTextEdit), typeof(DevExpress.XtraEditors.ViewInfo.TextEditViewInfo), new DevExpress.XtraEditors.Drawing.TextEditPainter(), true, null)); } #endregion public GollfAmountRepositoryItemTextEdit() { Amount_A_MaskType = GOLLF.Infrastructure.ControlLibrary.TextEditCommon.MaskType.Numeric; } #region New Properties for Gollf control GOLLF.Infrastructure.ControlLibrary.TextEditCommon.MaskType amountMaskType; [Description("Numeric mask is simple, used in COMPS. RegularEx mask support user type 'k','m','mm' etc./r/nATTENTION: Datasource column type should be Numeric type like Double, Float, etc. Otherwise the mask will not work."), Category("~Gollf"), DefaultValue(GOLLF.Infrastructure.ControlLibrary.TextEditCommon.MaskType.Numeric)] public GOLLF.Infrastructure.ControlLibrary.TextEditCommon.MaskType Amount_A_MaskType { get { return amountMaskType; } set { amountMaskType = value; this.Tag = value.ToString(); GOLLF.Infrastructure.ControlLibrary.TextEditCommon.SetMask(amountMaskType, this, showComma, amountIntegerLength, amountDecimalLength); } } int amountIntegerLength = 8; [Description("Gets or Sets length not include decimal"), Category("~Gollf"), DefaultValue(8)] public int Amount_B_IntegerLength { get { return amountIntegerLength; } set { if (value > 0) { amountIntegerLength = value; Amount_A_MaskType = amountMaskType;//reinit } } } int amountDecimalLength = 3; [Description("Gets or Sets decimal length"), Category("~Gollf"), DefaultValue(3)] public int Amount_C_DecimalLength { get { return amountDecimalLength; } set { if (value >= 0) { amountDecimalLength = value; Amount_A_MaskType = amountMaskType;//reinit } } } bool showComma = true; [Description("Gets or Sets need show comma"), Category("~Gollf"), DefaultValue(true)] public bool Amount_D_ShowComma { get { return showComma; } set { showComma = value; Amount_A_MaskType = amountMaskType;//reinit } } #endregion } }