#if FRAMEWORK20 using System; using System.Text; using System.Windows.Forms; using System.ComponentModel; using System.Drawing; using System.Collections; using DevComponents.DotNetBar; using DevComponents.DotNetBar.Rendering; namespace DevComponents.Editors { [ToolboxItem(false)] public class VisualControlBase : PopupItemControl, IInputButtonControl, ISupportInitialize { #region Private Variables private VisualItem _RootVisual = null; private bool _FocusHighlightEnabled = false; private Color _LastBackColor = Color.Empty; private static Color _DefaultHighlightColor = Color.FromArgb(0xFF, 0xFF, 0x88); private Color _FocusHighlightColor = _DefaultHighlightColor; private bool _MouseOver = false; #endregion #region Events /// /// Occurs when ButtonCustom control is clicked. /// public event EventHandler ButtonCustomClick; /// /// Occurs when ButtonCustom2 control is clicked. /// public event EventHandler ButtonCustom2Click; #endregion #region Constructor /// /// Creates new instance of the class. /// public VisualControlBase() { this.SetStyle(ControlStyles.UserPaint, true); this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); this.SetStyle(ControlStyles.Opaque, true); this.SetStyle(ControlStyles.ResizeRedraw, true); this.SetStyle(SystemOptions.DoubleBufferFlag, true); this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); this.SetStyle(ControlStyles.Selectable, true); this.IsAccessible = true; _Colors = new InputControlColors(); _Colors.ColorChanged += new EventHandler(ColorsColorChanged); _ButtonCustom = new InputButtonSettings(this); _ButtonCustom2 = new InputButtonSettings(this); _RootVisual = CreateRootVisual(); _RootVisual.ArrangeInvalid += new EventHandler(VisualArrangeInvalid); _RootVisual.RenderInvalid += new EventHandler(VisualRenderInvalid); _RootVisual.ResetMouseHover += VisualResetMouseHover; _BackgroundStyle.Class = ElementStyleClassKeys.DateTimeInputBackgroundKey; _BackgroundStyle.SetColorScheme(this.ColorScheme); _BackgroundStyle.StyleChanged += new EventHandler(this.VisualPropertyChanged); ApplyFieldNavigation(); } #endregion #region Internal Implementation private void VisualResetMouseHover(object sender, EventArgs e) { DevComponents.AdvTree.Interop.WinApi.ResetHover(this); } /// /// Resets the input position so the new input overwrites current value. /// public void ResetInputPosition() { if (_RootVisual is VisualInputBase) ((VisualInputBase)_RootVisual).ResetInputPosition(); else if (_RootVisual is VisualInputGroup) ((VisualInputGroup)_RootVisual).ResetInputPosition(); } private void ColorsColorChanged(object sender, EventArgs e) { this.Invalidate(); } protected virtual PaintInfo CreatePaintInfo(PaintEventArgs e) { PaintInfo p = new PaintInfo(); p.Graphics = e.Graphics; p.DefaultFont = this.Font; p.ForeColor = this.ForeColor; p.RenderOffset = new System.Drawing.Point(); p.WatermarkColor = _WatermarkColor; p.WatermarkEnabled = _WatermarkEnabled; p.WatermarkFont = _WatermarkFont; p.AvailableSize = this.ClientRectangle.Size; p.ParentEnabled = this.Enabled; p.MouseOver = _MouseOver || this.Focused; p.Colors = _Colors; if (!_DisabledForeColor.IsEmpty) p.DisabledForeColor = _DisabledForeColor; return p; } private bool _RenderControlButtons = true; /// /// Gets or sets whether control system buttons are rendered. Default value is true. /// internal bool RenderControlButtons { get { return _RenderControlButtons; } set { _RenderControlButtons = value; OnRenderControlButtonsChanged(); } } private void OnRenderControlButtonsChanged() { // Update IsRendered on system items. if (_RootVisual is VisualGroup) { VisualGroup group = (VisualGroup)_RootVisual; VisualItem[] items = new VisualItem[group.Items.Count]; group.Items.CopyTo(items); foreach (VisualItem item in items) { if (item.ItemType == eSystemItemType.SystemButton || item is VisualUpDownButton || item is LockUpdateCheckBox) { item.IsRendered = _RenderControlButtons; } } } this.Invalidate(); } private bool _CallBasePaintBackground = true; /// /// Gets or sets whether during painting OnPaintBackground on base control is called when BackColor=Transparent. /// [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] internal bool CallBasePaintBackground { get { return _CallBasePaintBackground; } set { _CallBasePaintBackground = value; } } internal void InternalPaint(PaintEventArgs e) { OnPaint(e); } private void PerformRootVisualLayout() { if (this.InvokeRequired) { this.BeginInvoke(new MethodInvoker(delegate { this.PerformRootVisualLayout(); })); return; } using (Graphics g = this.CreateGraphics()) { PaintEventArgs e = new PaintEventArgs(g, Rectangle.Empty); PaintInfo p = CreatePaintInfo(e); Rectangle clientRect = this.ClientRectangle; bool disposeStyle = false; ElementStyle style = GetBackgroundStyle(out disposeStyle); if (style.Custom) { ElementStyleDisplayInfo displayInfo = new ElementStyleDisplayInfo(style, e.Graphics, clientRect); clientRect.X += ElementStyleLayout.LeftWhiteSpace(style); clientRect.Y += ElementStyleLayout.TopWhiteSpace(style); clientRect.Width -= ElementStyleLayout.HorizontalStyleWhiteSpace(style); clientRect.Height -= ElementStyleLayout.VerticalStyleWhiteSpace(style); p.RenderOffset = clientRect.Location; p.AvailableSize = clientRect.Size; } _RootVisual.PerformLayout(p); e.Dispose(); if (disposeStyle) style.Dispose(); } } protected override void OnPaint(PaintEventArgs e) { Rectangle clientRect = this.ClientRectangle; PaintInfo p = CreatePaintInfo(e); bool enabled = this.Enabled; if (!enabled) { Color c = _DisabledBackColor; if (c.IsEmpty) c = SystemColors.Control; using (SolidBrush brush = new SolidBrush(c)) e.Graphics.FillRectangle(brush, clientRect); } else if (this.BackColor != Color.Transparent) e.Graphics.FillRectangle(SystemBrushes.Window, clientRect); else if (this.BackColor == Color.Transparent && _CallBasePaintBackground) base.OnPaintBackground(e); bool disposeStyle = false; ElementStyle style = GetBackgroundStyle(out disposeStyle); if (style.Custom) { ElementStyleDisplayInfo displayInfo = new ElementStyleDisplayInfo(style, e.Graphics, clientRect); if (!enabled) { ElementStyleDisplay.PaintBorder(displayInfo); } else ElementStyleDisplay.Paint(displayInfo); clientRect.X += ElementStyleLayout.LeftWhiteSpace(style); clientRect.Y += ElementStyleLayout.TopWhiteSpace(style); clientRect.Width -= ElementStyleLayout.HorizontalStyleWhiteSpace(style); clientRect.Height -= ElementStyleLayout.VerticalStyleWhiteSpace(style); p.RenderOffset = clientRect.Location; p.AvailableSize = clientRect.Size; } if (_FocusHighlightEnabled && this.Focused && !_FocusHighlightColor.IsEmpty) { using (SolidBrush brush = new SolidBrush(_FocusHighlightColor)) e.Graphics.FillRectangle(brush, clientRect); } if (!_RootVisual.IsLayoutValid) { if (_RootVisual is VisualGroup) ((VisualGroup)_RootVisual).HorizontalItemAlignment = _InputHorizontalAlignment; _RootVisual.PerformLayout(p); } if (SupportsFreeTextEntry) { if (!IsFreeTextEntryVisible) HideFreeTextBoxEntry(); else { Control textBox = GetFreeTextBox(); Rectangle r = GetFreeTextBounds(textBox.PreferredSize, clientRect); if (textBox.Bounds != r) textBox.Bounds = r; p.RenderSystemItemsOnly = true; } } if (_InputHorizontalAlignment != eHorizontalAlignment.Left) { if (_InputHorizontalAlignment == eHorizontalAlignment.Right) p.RenderOffset = new Point(clientRect.Width - _RootVisual.Size.Width, (clientRect.Height - _RootVisual.Size.Height) / 2); else p.RenderOffset = new Point((clientRect.Width - _RootVisual.Size.Width) / 2, (clientRect.Height - _RootVisual.Size.Height) / 2); } else p.RenderOffset = new Point(0, (clientRect.Height - _RootVisual.Size.Height) / 2); if (this.WatermarkEnabled && this.WatermarkText.Length > 0 && this.IsWatermarkRendered) { Rectangle watermarkBounds = clientRect; watermarkBounds.Inflate(-1, -1); DrawWatermark(p, watermarkBounds); } else _RootVisual.ProcessPaint(p); base.OnPaint(e); if (disposeStyle) style.Dispose(); } private ElementStyle GetBackgroundStyle(out bool disposeStyle) { disposeStyle = false; _BackgroundStyle.SetColorScheme(this.ColorScheme); return ElementStyleDisplay.GetElementStyle(_BackgroundStyle, out disposeStyle); } protected virtual void DrawWatermark(PaintInfo p, Rectangle r) { if (this.WatermarkText.Length == 0) return; Font font = p.DefaultFont; if (this.WatermarkFont != null) font = this.WatermarkFont; eTextFormat format = eTextFormat.Default; if (_WatermarkAlignment == eTextAlignment.Center) format |= eTextFormat.HorizontalCenter; else if (_WatermarkAlignment == eTextAlignment.Right) format |= eTextFormat.Right; TextDrawing.DrawString(p.Graphics, this.WatermarkText, font, this.WatermarkColor, r, format); } /// /// Gets whether watermark text should be rendered. /// protected virtual bool IsWatermarkRendered { get { return false; } } protected override bool IsInputChar(char charCode) { return true; } protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown(e); if(!e.Handled) _RootVisual.ProcessKeyDown(e); } protected override void OnKeyPress(KeyPressEventArgs e) { base.OnKeyPress(e); if(!e.Handled) _RootVisual.ProcessKeyPress(e); } protected override void OnKeyUp(KeyEventArgs e) { base.OnKeyUp(e); if(!e.Handled) _RootVisual.ProcessKeyUp(e); } protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (!IsFreeTextEntryVisible && _RootVisual.ProcessCmdKey(ref msg, keyData)) return true; return base.ProcessCmdKey(ref msg, keyData); } protected override void OnMouseDown(MouseEventArgs e) { if (!this.Focused) { if (this.Parent is MenuPanel) this.Focus(); else this.Select(); } _RootVisual.ProcessMouseDown(e); base.OnMouseDown(e); } private bool _InputMouseWheelEnabled = true; /// /// Gets or sets whether mouse wheel affects the input control. Default value is true. /// [DefaultValue(true), Category("Behavior"), Description("Indicates whether mouse wheel affects the input control.")] public bool InputMouseWheelEnabled { get { return _InputMouseWheelEnabled; } set { _InputMouseWheelEnabled = value; } } protected override void OnMouseWheel(MouseEventArgs e) { if (_InputMouseWheelEnabled) _RootVisual.ProcessMouseWheel(e); base.OnMouseWheel(e); } protected override void OnMouseMove(MouseEventArgs e) { _RootVisual.ProcessMouseMove(e); base.OnMouseMove(e); } protected override void OnMouseUp(MouseEventArgs e) { _RootVisual.ProcessMouseUp(e); base.OnMouseUp(e); } protected override void OnMouseEnter(EventArgs e) { _MouseOver = true; this.Invalidate(); base.OnMouseEnter(e); } protected override void OnMouseLeave(EventArgs e) { _MouseOver = false; _RootVisual.ProcessMouseLeave(); this.Invalidate(); base.OnMouseLeave(e); } protected override void OnMouseHover(EventArgs e) { _RootVisual.ProcessMouseHover(e); base.OnMouseHover(e); } protected override void OnClick(EventArgs e) { _RootVisual.ProcessClick(); base.OnClick(e); } protected override void OnMouseClick(MouseEventArgs e) { _RootVisual.ProcessMouseClick(e); base.OnMouseClick(e); } protected override void OnGotFocus(EventArgs e) { _RootVisual.ProcessGotFocus(); base.OnGotFocus(e); } protected override void OnLostFocus(EventArgs e) { _RootVisual.ProcessLostFocus(); base.OnLostFocus(e); } protected override bool ProcessDialogKey(Keys keyData) { if (SupportsFreeTextEntry && (keyData & (Keys.Alt | Keys.Control)) == Keys.None && (keyData & Keys.Shift) == Keys.Shift && IsFreeTextEntryVisible) { Keys keys = keyData & Keys.KeyCode; switch (keys) { case Keys.Tab: if (this.ProcessTabKey(false)) { return true; } break; } } return base.ProcessDialogKey(keyData); } protected virtual bool ProcessTabKey(bool forward) { return Parent.SelectNextControl(this, forward, true, false, false); } private bool _IsKeyboardFocusWithin = false; /// /// Gets whether keyboard focus is within the control. /// [Browsable(false)] public bool IsKeyboardFocusWithin { get { return _IsKeyboardFocusWithin; } internal set { _IsKeyboardFocusWithin = value; OnIsKeyboardFocusWithinChanged(); } } protected virtual void OnIsKeyboardFocusWithinChanged() { if (SupportsFreeTextEntry) { if (!IsKeyboardFocusWithin) _RootVisual.ProcessLostFocus(); } if (FocusHighlightEnabled) this.Invalidate(); } protected override void OnEnter(EventArgs e) { this.IsKeyboardFocusWithin = true; base.OnEnter(e); } protected override void OnLeave(EventArgs e) { this.IsKeyboardFocusWithin = false; base.OnLeave(e); } protected virtual VisualItem CreateRootVisual() { return null; } /// /// Gets the reference to internal visual item used as the root visual for the control. Using this property is in all cases not necessary except for some /// very advanced usage scenarios. /// [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public virtual VisualItem RootVisualItem { get { return _RootVisual; } } private void VisualArrangeInvalid(object sender, EventArgs e) { this.Invalidate(); } private void VisualRenderInvalid(object sender, EventArgs e) { this.Invalidate(); } private eHorizontalAlignment _InputHorizontalAlignment = eHorizontalAlignment.Left; /// /// Gets or sets the input field alignment inside the control /// [Browsable(true), DefaultValue(eHorizontalAlignment.Left), Category("Appearance"), Description("Indicates alignment of input fields inside of the control.")] public virtual eHorizontalAlignment InputHorizontalAlignment { get { return _InputHorizontalAlignment; } set { if (_InputHorizontalAlignment != value) { eHorizontalAlignment oldValue = _InputHorizontalAlignment; _InputHorizontalAlignment = value; _RootVisual.InvalidateArrange(); OnInputHorizontalAlignmentChanged(oldValue, value); this.Invalidate(); } } } /// /// Called when InputHorizontalAlignment property value has changed. /// /// Old value. /// New Value. protected virtual void OnInputHorizontalAlignmentChanged(eHorizontalAlignment oldValue, eHorizontalAlignment newValue) { } private Font _WatermarkFont = null; /// /// Gets or sets the watermark font. /// [Browsable(true), Category("Appearance"), Description("Indicates watermark font."), DefaultValue(null)] public virtual Font WatermarkFont { get { return _WatermarkFont; } set { _WatermarkFont = value; this.Invalidate(); } } private Color _WatermarkColor = SystemColors.GrayText; /// /// Gets or sets the watermark text color. /// [Browsable(true), Category("Appearance"), Description("Indicates watermark text color.")] public virtual Color WatermarkColor { get { return _WatermarkColor; } set { _WatermarkColor = value; this.Invalidate(); } } /// /// Indicates whether property should be serialized by Windows Forms designer. /// [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeWatermarkColor() { return _WatermarkColor != SystemColors.GrayText; } /// /// Resets the property to default value. /// [EditorBrowsable(EditorBrowsableState.Never)] public void ResetWatermarkColor() { this.WatermarkColor = SystemColors.GrayText; } private bool _WatermarkEnabled = true; /// /// Gets or sets whether watermark text is displayed if set for the input items. Default value is true. /// [DefaultValue(true), Description("Indicates whether watermark text is displayed if set for the input items.")] public virtual bool WatermarkEnabled { get { return _WatermarkEnabled; } set { _WatermarkEnabled = value; this.Invalidate(); } } private string _WatermarkText = ""; /// /// Gets or sets the watermark text displayed on the input control when control is empty. /// [DefaultValue(""), Description("Indicates watermark text displayed on the input control when control is empty."), Category("Watermark"), Localizable(true)] public string WatermarkText { get { return _WatermarkText; } set { if (value != null) { _WatermarkText = value; this.Invalidate(); } } } private eTextAlignment _WatermarkAlignment = eTextAlignment.Left; /// /// Gets or sets the watermark text alignment. Default value is left. /// [Browsable(true), DefaultValue(eTextAlignment.Left), Description("Indicates watermark text alignment."), Category("Watermark")] public eTextAlignment WatermarkAlignment { get { return _WatermarkAlignment; } set { if (_WatermarkAlignment != value) { _WatermarkAlignment = value; this.Invalidate(); } } } /// /// Gets or sets whether FocusHighlightColor is used as background color to highlight text box when it has input focus. Default value is false. /// [DefaultValue(false), Browsable(true), Category("Appearance"), Description("Indicates whether FocusHighlightColor is used as background color to highlight text box when it has input focus.")] public virtual bool FocusHighlightEnabled { get { return _FocusHighlightEnabled; } set { if (_FocusHighlightEnabled != value) { _FocusHighlightEnabled = value; if (this.Focused) this.Invalidate(); } } } /// /// Gets or sets the color used as background color to highlight text box when it has input focus and focus highlight is enabled. /// [Browsable(true), Category("Appearance"), Description("Indicates color used as background color to highlight text box when it has input focus and focus highlight is enabled.")] public virtual Color FocusHighlightColor { get { return _FocusHighlightColor; } set { if (_FocusHighlightColor != value) { _FocusHighlightColor = value; if (this.Focused) this.Invalidate(); } } } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeFocusHighlightColor() { return !_FocusHighlightColor.Equals(_DefaultHighlightColor); } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public void ResetFocusHighlightColor() { FocusHighlightColor = _DefaultHighlightColor; } private InputButtonSettings _ButtonCustom = null; /// /// Gets the object that describes the settings for the custom button that can execute an custom action of your choosing when clicked. /// [Category("Buttons"), Description("Describes the settings for the custom button that can execute an custom action of your choosing when clicked."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public InputButtonSettings ButtonCustom { get { return _ButtonCustom; } } private InputButtonSettings _ButtonCustom2 = null; /// /// Gets the object that describes the settings for the custom button that can execute an custom action of your choosing when clicked. /// [Category("Buttons"), Description("Describes the settings for the custom button that can execute an custom action of your choosing when clicked."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public InputButtonSettings ButtonCustom2 { get { return _ButtonCustom2; } } void IInputButtonControl.InputButtonSettingsChanged(InputButtonSettings inputButtonSettings) { OnInputButtonSettingsChanged(inputButtonSettings); } protected virtual void OnInputButtonSettingsChanged(InputButtonSettings inputButtonSettings) { RecreateButtons(); } protected virtual void RecreateButtons() { VisualItem[] buttons = CreateOrderedButtonList(); if (_RootVisual is VisualGroup) { // Remove all system buttons that are already in the list VisualGroup group = _RootVisual as VisualGroup; VisualItem[] items = new VisualItem[group.Items.Count]; group.Items.CopyTo(items); foreach (VisualItem item in items) { if (item.ItemType == eSystemItemType.SystemButton) { group.Items.Remove(item); if (item == _ButtonCustom.ItemReference) item.Click -= new EventHandler(CustomButtonClick); else if (item == _ButtonCustom2.ItemReference) item.Click -= new EventHandler(CustomButton2Click); item.IsRendered = _RenderControlButtons; } } // Add new buttons to the list group.Items.AddRange(buttons); } } protected override void ScaleControl(SizeF factor, BoundsSpecified specified) { if (Dpi.RecordScalePerControl) Dpi.SetScaling(factor); _RootVisual.InvalidateArrange(); RecreateButtons(); base.ScaleControl(factor, specified); } private void CustomButtonClick(object sender, EventArgs e) { OnButtonCustomClick(e); } protected virtual void OnButtonCustomClick(EventArgs e) { if (ButtonCustomClick != null) ButtonCustomClick(this, e); } private void CustomButton2Click(object sender, EventArgs e) { OnButtonCustom2Click(e); } protected virtual void OnButtonCustom2Click(EventArgs e) { if (ButtonCustom2Click != null) ButtonCustom2Click(this, e); } private VisualItem[] CreateOrderedButtonList() { SortedList list = CreateSortedButtonList(); VisualItem[] items = new VisualItem[list.Count]; list.Values.CopyTo(items, 0); return items; } protected virtual SortedList CreateSortedButtonList() { SortedList list = new SortedList(4); if (_ButtonCustom.Visible) { VisualItem button = CreateButton(_ButtonCustom); if (_ButtonCustom.ItemReference != null) _ButtonCustom.ItemReference.Click -= new EventHandler(CustomButtonClick); _ButtonCustom.ItemReference = button; button.Click += new EventHandler(CustomButtonClick); button.Enabled = _ButtonCustom.Enabled; list.Add(_ButtonCustom, button); } if (_ButtonCustom2.Visible) { VisualItem button = CreateButton(_ButtonCustom2); if (_ButtonCustom.ItemReference != null) _ButtonCustom.ItemReference.Click -= new EventHandler(CustomButton2Click); _ButtonCustom2.ItemReference = button; button.Click += new EventHandler(CustomButton2Click); button.Enabled = _ButtonCustom2.Enabled; list.Add(_ButtonCustom2, button); } return list; } protected virtual VisualItem CreateButton(InputButtonSettings buttonSettings) { VisualCustomButton button = new VisualCustomButton(); ApplyButtonSettings(buttonSettings, button); return button; } protected virtual void ApplyButtonSettings(InputButtonSettings buttonSettings, VisualButton button) { button.Text = buttonSettings.Text; button.Image = buttonSettings.Image; button.Alignment = eItemAlignment.Right; button.ItemType = eSystemItemType.SystemButton; button.Enabled = buttonSettings.Enabled; button.Shortcut = buttonSettings.Shortcut; button.Tooltip = buttonSettings.Tooltip; button.Symbol = buttonSettings.Symbol; button.SymbolSet = buttonSettings.SymbolSet; button.SymbolColor = buttonSettings.SymbolColor; } protected override void OnResize(EventArgs e) { AutoAdjustHeight(); _RootVisual.InvalidateArrange(); base.OnResize(e); } protected override PopupItem CreatePopupItem() { return new ButtonItem(); } protected override void RecalcSize() { } public override void PerformClick() { } private ElementStyle _BackgroundStyle = new ElementStyle(); /// /// Specifies the background style of the control. /// [Category("Style"), Description("Gets or sets control background style."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public ElementStyle BackgroundStyle { get { return _BackgroundStyle; } } /// /// Resets style to default value. Used by windows forms designer. /// [EditorBrowsable(EditorBrowsableState.Never)] public void ResetBackgroundStyle() { _BackgroundStyle.StyleChanged -= new EventHandler(this.VisualPropertyChanged); _BackgroundStyle = new ElementStyle(); _BackgroundStyle.StyleChanged += new EventHandler(this.VisualPropertyChanged); this.Invalidate(); } private void VisualPropertyChanged(object sender, EventArgs e) { OnVisualPropertyChanged(); } protected virtual void OnVisualPropertyChanged() { _RootVisual.InvalidateArrange(); this.Invalidate(); } protected override void Dispose(bool disposing) { if (_BackgroundStyle != null) _BackgroundStyle.StyleChanged -= VisualPropertyChanged; _BackgroundStyle.Dispose(); base.Dispose(disposing); } [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public override string Text { get { return base.Text; } set { base.Text = value; } } /// /// Gets the preferred height of the control. /// [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public int PreferredHeight { get { return GetPreferredHeight(); } } private int _PreferredHeight = -1; protected virtual int GetPreferredHeight() { if (_PreferredHeight > -1) { return _PreferredHeight; } bool disposeStyle = false; ElementStyle style = GetBackgroundStyle(out disposeStyle); int h = 0; if (_AutoBorderSize != 0 || style.BorderTopWidth == 0 && style.BorderBottomWidth == 0) { h = this.Font.Height + ((_AutoBorderSize != 0) ? _AutoBorderSize : ((SystemInformation.BorderSize.Height * 4) + 3)); } else { h = this.Font.Height + (style.BorderTopWidth * 2 + style.BorderBottomWidth * 2) + 3; } _PreferredHeight = h; if (disposeStyle) style.Dispose(); return h; } private int _AutoBorderSize; internal int AutoBorderSize { get { return _AutoBorderSize; } set { _AutoBorderSize = value; _PreferredHeight = -1; } } protected override void OnFontChanged(EventArgs e) { _PreferredHeight = -1; this.Height = PreferredHeight; base.OnFontChanged(e); } protected override Size DefaultSize { get { return new Size(80, GetPreferredHeight()); } } public override Size GetPreferredSize(Size proposedSize) { // Calculate preferred size Size size = new Size(0, GetPreferredHeight()); if (!_RootVisual.IsLayoutValid) PerformRootVisualLayout(); size.Width = _RootVisual.CalculatedSize.Width + 4; // borders and padding return size; //Size size = this.DefaultSize; //if (proposedSize.Width > 0 && proposedSize.Width < size.Width) // size.Width = proposedSize.Width; //return this.DefaultSize; } protected override void OnHandleCreated(EventArgs e) { AutoAdjustHeight(); base.OnHandleCreated(e); } private void AutoAdjustHeight() { if (this.Height != PreferredHeight) this.Height = PreferredHeight; } private eInputFieldNavigation _FieldNavigation = eInputFieldNavigation.All; /// /// Gets or sets the keys used to navigate between the input fields provided by this control. /// [DefaultValue(eInputFieldNavigation.All), Description("Indicates keys used to navigate between the input fields provided by this control")] public eInputFieldNavigation FieldNavigation { get { return _FieldNavigation; } set { if (_FieldNavigation != value) { _FieldNavigation = value; ApplyFieldNavigation(); } } } protected virtual void ApplyFieldNavigation() { if (_RootVisual is VisualInputGroup) { VisualInputGroup group = _RootVisual as VisualInputGroup; group.ArrowNavigationEnabled = ((_FieldNavigation & eInputFieldNavigation.Arrows) == eInputFieldNavigation.Arrows); group.TabNavigationEnabled = ((_FieldNavigation & eInputFieldNavigation.Tab) == eInputFieldNavigation.Tab); group.EnterNavigationEnabled = ((_FieldNavigation & eInputFieldNavigation.Enter) == eInputFieldNavigation.Enter); } } protected virtual bool IsNull(object value) { if (value == null || value is DBNull) return true; return false; } private Color _DisabledBackColor = Color.Empty; /// /// Gets or sets the control background color when control is disabled. Default value is an empty color which indicates that background is not changed when control is disabled. /// [Description("Indicates control background color when control is disabled"), Category("Appearance")] public Color DisabledBackColor { get { return _DisabledBackColor; } set { if (_DisabledBackColor != value) { _DisabledBackColor = value; if (!this.Enabled) this.Invalidate(); } } } [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeDisabledBackColor() { return !_DisabledBackColor.IsEmpty; } [EditorBrowsable(EditorBrowsableState.Never)] public void ResetDisabledBackColor() { DisabledBackColor = Color.Empty; } private Color _DisabledForeColor = Color.Empty; /// /// Gets or sets the control text color when control is disabled. Default value is an empty color which indicates that background is not changed when control is disabled. /// [Description("Indicates control background color when control is disabled"), Category("Appearance")] public Color DisabledForeColor { get { return _DisabledForeColor; } set { if (_DisabledForeColor != value) { _DisabledForeColor = value; if (!this.Enabled) this.Invalidate(); } } } [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeDisabledForeColor() { return !_DisabledForeColor.IsEmpty; } [EditorBrowsable(EditorBrowsableState.Never)] public void ResetDisabledForeColor() { DisabledForeColor = Color.Empty; } private InputControlColors _Colors = null; /// /// Gets the system colors used by the control. /// [Category("Colors"), Description("System colors used by the control."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public InputControlColors Colors { get { return _Colors; } } /// /// Selects next input field if possible. /// /// true if next input field was selected otherwise false. public bool SelectNextInputField() { VisualInputGroup group = _RootVisual as VisualInputGroup; if (group != null) return group.SelectNextInput(); return false; } /// /// Selects previous input field if possible. /// /// true if previous input field was selected otherwise false. public bool SelectPreviousInputField() { VisualInputGroup group = _RootVisual as VisualInputGroup; if (group != null) return group.SelectPreviousInput(); return false; } #endregion #region Free-Text Entry Support protected virtual Rectangle GetFreeTextBounds(Size preferedSize, Rectangle clientRect) { Rectangle r = Rectangle.Empty; if (_RootVisual == null) return r; r = clientRect; // _RootVisual.RenderBounds; VisualGroup group = _RootVisual as VisualGroup; foreach (VisualItem item in group.Items) { if (item.ItemType == eSystemItemType.SystemButton) { DisplayHelp.ExcludeEdgeRect(ref r, item.RenderBounds); } } if (r.Width != clientRect.Width) { r.Inflate(-1, 0); } if (preferedSize.Height > 0 && preferedSize.Height < r.Height) { r.Y += (r.Height - preferedSize.Height) / 2; r.Height = preferedSize.Height; } return r; } protected virtual bool SupportsFreeTextEntry { get { return false; } } protected virtual Control GetFreeTextBox() { throw new Exception("The method or operation is not implemented."); } protected virtual bool IsFreeTextEntryVisible { get { return false; } } protected virtual void HideFreeTextBoxEntry() { } #endregion #region Property Hiding [Browsable(false)] public override Color BackColor { get { return base.BackColor; } set { base.BackColor = value; } } [Browsable(false)] public override Image BackgroundImage { get { return base.BackgroundImage; } set { base.BackgroundImage = value; } } [Browsable(false)] public override ImageLayout BackgroundImageLayout { get { return base.BackgroundImageLayout; } set { base.BackgroundImageLayout = value; } } [Browsable(false)] public override bool DisabledImagesGrayScale { get { return base.DisabledImagesGrayScale; } set { base.DisabledImagesGrayScale = value; } } [Browsable(false)] public new System.Windows.Forms.Padding Padding { get { return base.Padding; } set { base.Padding = value; } } [Browsable(false)] public override eDotNetBarStyle Style { get { return base.Style; } set { base.Style = value; } } [Browsable(false)] public override bool ThemeAware { get { return base.ThemeAware; } set { base.ThemeAware = value; } } #endregion #region ISupportInitialize private bool _Initializing = false; protected virtual bool IsInitializing { get { return _Initializing; } } /// /// ISupportInitialize.BeginInit implementation. While initialization is in progress ValueChanged events will not be fired. /// [EditorBrowsable(EditorBrowsableState.Advanced)] public void BeginInit() { _Initializing = true; } /// /// ISupportInitialize.EndInit implementation. /// [EditorBrowsable(EditorBrowsableState.Advanced)] public void EndInit() { _Initializing = false; } #endregion } #region Free Text Box Entry internal class FreeTextEntryBox : TextBox { private bool _HideOnLostFocus; public event EventHandler RevertValue; public event EventHandler ApplyValue; public event EventHandler IncreaseValue; public event EventHandler DecreaseValue; /// /// Raises DecreaseValue event. /// /// Provides event arguments. protected virtual void OnDecreaseValue(EventArgs e) { EventHandler handler = DecreaseValue; if (handler != null) handler(this, e); } /// /// Raises IncreaseValue event. /// /// Provides event arguments. protected virtual void OnIncreaseValue(EventArgs e) { EventHandler handler = IncreaseValue; if (handler != null) handler(this, e); } public FreeTextEntryBox() { //this.MaxLength = 15; } private void OnApplyValue(EventArgs e) { if (ApplyValue != null) ApplyValue(this, e); } private void OnRevertValue(EventArgs e) { if (RevertValue != null) RevertValue(this, e); } public void HideOnLostFocus() { if (this.Focused) _HideOnLostFocus = true; } protected override void OnLostFocus(EventArgs e) { if (_HideOnLostFocus) { this.Visible = false; _HideOnLostFocus = false; } base.OnLostFocus(e); } protected override void OnKeyDown(KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { OnApplyValue(e); } else if (e.KeyCode == Keys.Escape) { OnRevertValue(e); } else if (e.KeyCode == Keys.Up) { OnIncreaseValue(e); } else if (e.KeyCode == Keys.Down) { OnDecreaseValue(e); } //else //{ // char c = BarFunctions.GetCharForKeyValue(e.KeyValue); // if (c != '.' && !char.IsDigit(c) && !char.IsControl(c)) // e.SuppressKeyPress = true; //} base.OnKeyDown(e); } protected override void OnMouseWheel(MouseEventArgs e) { if (!this.ReadOnly) { if (!(this.Parent is VisualControlBase) || ((VisualControlBase)this.Parent).InputMouseWheelEnabled) { if (e.Delta > 0) { OnIncreaseValue(EventArgs.Empty); } else { OnDecreaseValue(EventArgs.Empty); } } } base.OnMouseWheel(e); } protected override void OnLeave(EventArgs e) { OnApplyValue(e); base.OnLeave(e); } } #endregion #region FreeTextEntryConversion Event Handler and Arguments /// /// Defines data for ConvertFreeTextEntry event. /// public class FreeTextEntryConversionEventArgs : EventArgs { /// /// Gets the string value that was entered by the user. /// public readonly string ValueEntered; /// /// Gets or sets the converted ValueEntered into the control's value type. For example for IpAddressInput the value set here /// must be of string type and in IP address format. For IntegerInput control the value set here must be an int type. For DateTimeInput /// control value set here must be DateTime type. /// If you provide ControlValue set ValueConverted=true to indicate so. /// public object ControlValue = null; /// /// Gets or sets whether ValueEntered has been converted to ControlValue. Set to true to indicate that you have performed conversion. /// public bool IsValueConverted = false; public FreeTextEntryConversionEventArgs(string valueEntered) { this.ValueEntered = valueEntered; } } /// /// Defines delegate for ConvertFreeTextEntry event. /// /// Source of event. /// Provides event data. public delegate void FreeTextEntryConversionEventHandler(object sender, FreeTextEntryConversionEventArgs e); #endregion } #endif