diff --git a/PROMS/Volian.Controls.Library/StepItem.cs b/PROMS/Volian.Controls.Library/StepItem.cs index d287deec..9e0d1025 100644 --- a/PROMS/Volian.Controls.Library/StepItem.cs +++ b/PROMS/Volian.Controls.Library/StepItem.cs @@ -318,8 +318,8 @@ namespace Volian.Controls.Library } private int FindTop(int bottom) { - int? lastBottomPrev = 0; - int? lastBottomParent = 0; + int lastBottomPrev = 0; + int lastBottomParent = 0; if (_MyPreviousStepItem != null) lastBottomPrev = _MyPreviousStepItem.BottomMostStepItem.Bottom; else if(_MyParentStepItem != null) @@ -332,6 +332,9 @@ namespace Volian.Controls.Library // Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", MyID, lastBottomPrev,lastBottomParent, bottom, bottomRNO); //if (MyID == 2125) // Console.WriteLine("Oops!"); + if (lastBottomPrev > bottom) bottom = lastBottomPrev; // RHM 20090615 ES02 Step8 + // Moving from Step 8 to the Note preceeding step 8 caused the step 9 to be positioned in the wrong place. + //if (lastBottomParent > bottom) bottom = lastBottomParent; if (bottomRNO == null) return bottom; return (int) max(bottomRNO, bottom); } @@ -1354,6 +1357,14 @@ namespace Volian.Controls.Library { _MyStepPanel.OnAttachmentClicked(sender, new StepPanelAttachmentEventArgs(this)); } + private void _MyStepRTB_CursorKeyPress(object sender, KeyEventArgs args) + { + _MyStepPanel.StepCursorKeys(sender as StepRTB, args); + } + private void _MyStepRTB_CursorMovement(object sender, StepRTBCursorMovementEventArgs args) + { + _MyStepPanel.CursorMovement(sender as StepRTB, args.CursorLocation, args.Key); + } #endregion // Event Handlers #region Private Methods /// diff --git a/PROMS/Volian.Controls.Library/StepItem.designer.cs b/PROMS/Volian.Controls.Library/StepItem.designer.cs index 6f0f9aa3..a3884716 100644 --- a/PROMS/Volian.Controls.Library/StepItem.designer.cs +++ b/PROMS/Volian.Controls.Library/StepItem.designer.cs @@ -50,15 +50,19 @@ namespace Volian.Controls.Library | System.Windows.Forms.AnchorStyles.Right))); this._MyStepRTB.BackColor = System.Drawing.Color.Linen; this._MyStepRTB.BorderStyle = System.Windows.Forms.BorderStyle.None; - this._MyStepRTB.ContentsRectangle = new System.Drawing.Rectangle(0, 0, 0, 0); + this._MyStepRTB.ContentsRectangle = new System.Drawing.Rectangle(0, 0, 234, 20); this._MyStepRTB.EpMode = VEPROMS.CSLA.Library.E_EditPrintMode.Edit; this._MyStepRTB.Font = new System.Drawing.Font("Prestige Elite Tall", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(2))); this._MyStepRTB.Location = new System.Drawing.Point(80, 0); this._MyStepRTB.MyClassName = "RichEdit20W"; this._MyStepRTB.MyItemInfo = null; this._MyStepRTB.MyLinkText = null; + this._MyStepRTB.MyStepItem = null; this._MyStepRTB.Name = "_MyStepRTB"; + this._MyStepRTB.ProcessKeystrokes = true; + this._MyStepRTB.RTBRangeStatus = Volian.Controls.Library.StepRTB.RangeStatus.NoContainedLinks; this._MyStepRTB.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.None; + this._MyStepRTB.ShowDebug = false; this._MyStepRTB.Size = new System.Drawing.Size(234, 20); this._MyStepRTB.TabIndex = 2; this._MyStepRTB.Text = ""; @@ -67,6 +71,8 @@ namespace Volian.Controls.Library this._MyStepRTB.Enter += new System.EventHandler(this._StepRTB_Enter); this._MyStepRTB.HeightChanged += new Volian.Controls.Library.StepRTBEvent(this._StepRTB_HeightChanged); this._MyStepRTB.LinkModifyTran += new Volian.Controls.Library.StepRTBLinkEvent(this._StepRTB_LinkModifyTran); + this._MyStepRTB.CursorKeyPress += new Volian.Controls.Library.StepRTBCursorKeysEvent(this._MyStepRTB_CursorKeyPress); + this._MyStepRTB.CursorMovement += new Volian.Controls.Library.StepRTBCursorMovementEvent(this._MyStepRTB_CursorMovement); this._MyStepRTB.LinkModifyRO += new Volian.Controls.Library.StepRTBLinkEvent(this._StepRTB_LinkModifyRO); // // _MyvlnExpander diff --git a/PROMS/Volian.Controls.Library/StepRTB.cs b/PROMS/Volian.Controls.Library/StepRTB.cs index 62e64eeb..75e59f90 100644 --- a/PROMS/Volian.Controls.Library/StepRTB.cs +++ b/PROMS/Volian.Controls.Library/StepRTB.cs @@ -13,6 +13,9 @@ using VEPROMS.CSLA.Library; namespace Volian.Controls.Library { public delegate void StepRTBEvent(object sender, EventArgs args); + public delegate void StepRTBCursorKeysEvent(object sender, KeyEventArgs args); + public delegate void StepRTBCursorMovementEvent(object sender, StepRTBCursorMovementEventArgs args); + //public delegate void StepRTBMouseWheelEvent(object sender, MouseEventArgs args); public partial class StepRTB : RichTextBox , IStepRTB { #region Events @@ -31,6 +34,22 @@ namespace Volian.Controls.Library { if (RTBRangeStatusChanged != null) RTBRangeStatusChanged(sender, args); } + public event StepRTBCursorKeysEvent CursorKeyPress; + private void OnCursorKeyPress(object sender, KeyEventArgs args) + { + if (CursorKeyPress != null) CursorKeyPress(sender, args); + } + public event StepRTBCursorMovementEvent CursorMovement; + private void OnCursorMovement(object sender, StepRTBCursorMovementEventArgs args) + { + if (CursorMovement != null) CursorMovement(sender, args); + } + //public event StepRTBMouseWheelEvent MouseWheel; + //private void OnMouseWheel(object sender, MouseEventArgs args) + //{ + // if (MouseWheel != null) MouseWheel(sender, args); + //} + /// /// This event is not raised during all the in-between changes for link deletions /// @@ -166,10 +185,15 @@ namespace Volian.Controls.Library get { return RTBAPI.GetScrollLocation(this); } set { RTBAPI.SetScrollLocation(this, value); } } - private Rectangle _ContentsRectangle; + private Rectangle _ContentsRectangle = new Rectangle(0,0,0,0); public Rectangle ContentsRectangle { - get { return _ContentsRectangle; } + get + { + if (_ContentsRectangle.X == 0 && _ContentsRectangle.Y == 0 && _ContentsRectangle.Width == 0 && _ContentsRectangle.Height == 0) + _ContentsRectangle = this.ClientRectangle; + return _ContentsRectangle; + } set { _ContentsRectangle = value; @@ -180,7 +204,7 @@ namespace Volian.Controls.Library { get { return _ContentsRectangle.Size; } } - private Size _AdjustSize; // if 0,0 puts text right next to bottom of box. + private Size _AdjustSize = new Size(0,0); // if 0,0 puts text right next to bottom of box. public Size AdjustSize { get { return _AdjustSize; } @@ -232,14 +256,16 @@ namespace Volian.Controls.Library _Container = container; SetUp(); } - protected override void OnMouseWheel(MouseEventArgs e) - { - _MyStepItem.MyStepPanel.MouseWheel(e); - //base.OnMouseWheel(e); - } + //protected override void OnMouseWheel(MouseEventArgs e) + //{ + // //_MyStepItem.MyStepPanel.MouseWheel(e); + // OnMouseWheel(this,e); + // //base.OnMouseWheel(e); + //} private void SetUp() { BorderStyle = System.Windows.Forms.BorderStyle.None; + this.ScrollBars = RichTextBoxScrollBars.None; this.DetectUrls = true; ContentsResized += new ContentsResizedEventHandler(StepRTB_ContentsResized); this.LinkClicked += new LinkClickedEventHandler(StepRTB_LinkClicked); @@ -274,7 +300,8 @@ namespace Volian.Controls.Library void StepRTB_MouseUp(object sender, MouseEventArgs e) { _MouseDown = false; - HandleSelectionChange(); + if(this.Focused) // Only HandleSelectionChange if this control has focus. + HandleSelectionChange(); } #endregion #region ApplicationSupport @@ -574,11 +601,79 @@ namespace Volian.Controls.Library } private void AdjustSizeForContents() { - // The client size should match the new rectangle. - // First, determine the offset Size offset = Size - ClientSize; - this.Size = ContentsSize + offset + AdjustSize; - OnHeightChanged(this, new EventArgs()); + int widthNew = ContentsSize.Width + offset.Width + AdjustSize.Width; + int heightNew = ContentsSize.Height + offset.Height + AdjustSize.Height; + Size szNew = new Size(widthNew,heightNew); + if (this.Size != szNew) + { + this.Size = szNew; + OnHeightChanged(this, new EventArgs()); + } + } + private float GetStringWidth(string strMeasureString) + { + using (Graphics g = Graphics.FromHwnd(Handle)) + { + return g.MeasureString(strMeasureString, Font).Width; + } + } + private int Ceiling(float f) + { + return (int)(Math.Ceiling(f)); + } + public void AdjustWidthForContent() + { + int widthNL = Ceiling(GetStringWidth("\n")); + int widthMax = 0; + int widthMaxWW = 0; + int indexStart = 0; + int lineCountFromLines = Lines.Length; + int lineCountFromGet = GetLineFromCharIndex(TextLength)+1; + for (int i = 0; i < Lines.Length; i++) + { + int lineStart = GetLineFromCharIndex(indexStart); + int indexEnd = indexStart + Lines[i].Length; + int lineEnd = GetLineFromCharIndex(indexEnd); + Point pointStart = GetPositionFromCharIndex(indexStart); + Point pointEnd = GetPositionFromCharIndex(indexEnd); + int indexEndPos = GetCharIndexFromPosition(pointEnd); + if (indexEndPos + 1 < indexEnd) // This indicates that the text is wider than the Rich Text Box + { + int w = pointEnd.X + (indexEnd - indexEndPos) * widthNL; + if (w > widthMaxWW) + { + widthMaxWW = w; + } + } + if (lineEnd > lineStart)// this indicates that there was word-wrap on this line. + { + int w = pointEnd.X + Width * (lineEnd - lineStart); + if (w > widthMaxWW) + widthMaxWW = w; + } + else + { + if (pointEnd.X > widthMax) + widthMax = pointEnd.X; + } + indexStart = indexEnd + 1; + } + if (widthMaxWW == 0) + { + int widthBorder = Width - ClientSize.Width; + int w = widthMax + widthNL + widthBorder; + if (Width != w) + { + Width = w; + AdjustWidthForContent();// Try one more time + } + } + else + { + Width = widthMaxWW; + AdjustWidthForContent(); + } } public int CalculateHeight() { @@ -1129,17 +1224,20 @@ namespace Volian.Controls.Library if (MyItemInfo.IsProcedure || MyItemInfo.IsSection) return; // Cursor moves out of box only if control is pressed too - otherwise key is // handled in rtb. - if (keyargs.Control)_MyStepItem.MyStepPanel.StepCursorKeys(this, keyargs); + //if (keyargs.Control)_MyStepItem.MyStepPanel.StepCursorKeys(this, keyargs); // Replaced with an event + if (keyargs.Control) OnCursorKeyPress(this, keyargs); } private void StepRTB_PageKeyPressed(KeyEventArgs keyargs) { if (MyItemInfo.IsProcedure || MyItemInfo.IsSection) return; - _MyStepItem.MyStepPanel.StepCursorKeys(this, keyargs); + //_MyStepItem.MyStepPanel.StepCursorKeys(this, keyargs); Replaced with an event + OnCursorKeyPress(this, keyargs); } private void StepRTB_ArrowPressed(E_ArrowKeys key) { Point cp = PointToClient(Cursor.Position); - _MyStepItem.MyStepPanel.CursorMovement(this, cp, key); + //_MyStepItem.MyStepPanel.CursorMovement(this, cp, key); Replaced with an event + OnCursorMovement(this, new StepRTBCursorMovementEventArgs(cp, key)); } private void StepRTB_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) { @@ -1698,6 +1796,26 @@ namespace Volian.Controls.Library } #endregion } + public class StepRTBCursorMovementEventArgs + { + private Point _CursorLocation; + public Point CursorLocation + { + get { return _CursorLocation; } + set { _CursorLocation = value; } + } + private E_ArrowKeys _Key; + public E_ArrowKeys Key + { + get { return _Key; } + set { _Key = value; } + } + public StepRTBCursorMovementEventArgs(Point pt, E_ArrowKeys key) + { + _CursorLocation = pt; + _Key = key; + } + } #region LinkLocation Class public class LinkLocation {