diff --git a/PROMS/Volian.Controls.Library/GridItem.cs b/PROMS/Volian.Controls.Library/GridItem.cs index f972fdd1..71cb3cc9 100644 --- a/PROMS/Volian.Controls.Library/GridItem.cs +++ b/PROMS/Volian.Controls.Library/GridItem.cs @@ -17,6 +17,12 @@ namespace Volian.Controls.Library public partial class GridItem : EditItem { #region Fields + private bool _IsSaving; + public bool IsSaving + { + get { return _IsSaving; } + set { _IsSaving = value; } + } public VlnFlexGrid MyFlexGrid { get { return _MyFlexGrid; } @@ -381,8 +387,10 @@ namespace Volian.Controls.Library //_MyToolTip.SetSuperTooltip(MyStepRTB, tpi); _MyToolTip.SetSuperTooltip(MyFlexGrid, tpi); } + private bool DoNotRefresh = false; public override void RefreshContent() { + if (DoNotRefresh) return; _ActiveMode = MyFlexGrid.ContainsFocus; using (Grid myGrid = MyItemInfo.MyContent.MyGrid.Get()) { @@ -432,6 +440,7 @@ namespace Volian.Controls.Library public override void SetFocus() { MyFlexGrid.Focus();} public override void SaveContents() { + if (!MyFlexGrid.IsDirty && !IsSaving) return; List RtfRoUsageList = new List(); List RtfTransList = new List(); @@ -1144,17 +1153,22 @@ namespace Volian.Controls.Library } public override void SaveCurrentAndContents() { + IsSaving = true; if (MyFlexGrid.Row >= 0 && MyFlexGrid.Col >= 0 && MyStepRTB.EditMode) // Only if a Cell is Selected { int row = MyFlexGrid.Row; int col = MyFlexGrid.Col; - SaveContents(); + //SaveContents(); + DoNotRefresh = true; MyStepRTB.Rtf = MyStepRTB.DoNewLinkInGridCell(); + DoNotRefresh = false; MyFlexGrid.Row = row; MyFlexGrid.Col = col; MyFlexGrid[MyFlexGrid.Row, MyFlexGrid.Col] = MyStepRTB.Rtf; } + if (!MyFlexGrid.IsDirty) return; SaveContents(); + IsSaving = false; } #endregion #region Miscellaneous Support diff --git a/PROMS/Volian.Controls.Library/StepRTB.cs b/PROMS/Volian.Controls.Library/StepRTB.cs index 0a727981..da11a8f8 100644 --- a/PROMS/Volian.Controls.Library/StepRTB.cs +++ b/PROMS/Volian.Controls.Library/StepRTB.cs @@ -2876,10 +2876,14 @@ namespace Volian.Controls.Library { rousg = itm.MyContent.ContentRoUsages.Add(roparts[1], rodb); } + //get temporary rousageid oldid = rousg.ROUsageID; Rtf = Rtf.Replace("", string.Format("", rousg.ROUsageID)); + //save temporary rousageid to get real rousageid itm.Save(); + //replace temprorary rousageid with real rousageid Rtf = Rtf.Replace(string.Format("", oldid), rousg.ROUsageID.ToString()); + //save real rousageid itm.Save(); MyItemInfo.MyContent.RefreshContentRoUsages(); } diff --git a/PROMS/Volian.Controls.Library/VlnFlexGrid.cs b/PROMS/Volian.Controls.Library/VlnFlexGrid.cs index 6307fc06..b419a1e6 100644 --- a/PROMS/Volian.Controls.Library/VlnFlexGrid.cs +++ b/PROMS/Volian.Controls.Library/VlnFlexGrid.cs @@ -32,8 +32,160 @@ namespace Volian.Controls.Library get { return _SpellChecker; } set { _SpellChecker = value; } } - - public static GridCopyInfo MyCopyInfo = new GridCopyInfo(); + //public string GridStackTrace + //{ + // get + // { + // string st = Volian.Base.Library.vlnStackTrace.GetStack(); + // st = StripFunnyCharacters(st); + // return st; + // Console.WriteLine(st); + // return st.Replace(@"\","|"); + // } + // set + // { + // ; + // } + //} + //private string StripFunnyCharacters(string st) + //{ + // StringBuilder sb = new StringBuilder(); + // foreach (char c in st) + // { + // if ((c < ' ' || c > 255) && !"\r\n\t".Contains(c.ToString())) + // sb.Append(string.Format("x{0:X4}", (int)c)); + // else + // sb.Append(c); + // } + // return sb.ToString(); + //} + public bool IsDirty + { + get + { + return IsGridChanged(this._MyItemInfo.MyContent.MyGrid.Data, this.GetXMLData()); + } + } + private bool IsGridChanged(string oldXml, string newXml) + { + if (this.TableCellEditor.Text.Contains("")) + return false; + XmlDocument XdOld = new XmlDocument(); + XdOld.LoadXml(oldXml); + XmlDocument XdNew = new XmlDocument(); + XdNew.LoadXml(newXml); + //check volian borders 1st + if (XdNew.SelectSingleNode("C1FlexGrid/Control/MyBorderDetailString").InnerText != XdOld.SelectSingleNode("C1FlexGrid/Control/MyBorderDetailString").InnerText) + return true; + //check row/col sizes 2nd + if (GetRowColSizeString(XdNew) != GetRowColSizeString(XdOld)) + return true; + //check for cell data changes 3rd + if (GetCellDataString(XdNew) != GetCellDataString(XdOld)) + return true; + //check for cell format changes 4th + if (GetCellFormatString(XdNew) != GetCellFormatString(XdOld)) + return true; + //check for merged cells 5th + if (GetCellMergeString(XdNew) != GetCellMergeString(XdOld)) + return true; + return false; + } + private string GetRowColSizeString(XmlDocument xd) + { + string defCW = xd.SelectSingleNode("C1FlexGrid/ColumnInfo/DefaultSize").InnerText; + string defRH = xd.SelectSingleNode("C1FlexGrid/RowInfo/DefaultSize").InnerText; + int cols = int.Parse(xd.SelectSingleNode("C1FlexGrid/ColumnInfo/Count").InnerText); + int rows = int.Parse(xd.SelectSingleNode("C1FlexGrid/RowInfo/Count").InnerText); + List rh = new List(); + for (int i = 0; i < rows; i++) + rh.Add(defRH); + List cw = new List(); + for (int i = 0; i < cols; i++) + cw.Add(defCW); + XmlNodeList nlr = xd.SelectNodes("C1FlexGrid/Rows/Row"); + foreach (XmlNode nr in nlr) + { + int idx = int.Parse(nr.Attributes.GetNamedItem("index").InnerText); + rh[idx] = nr.SelectSingleNode("Height").InnerText; + } + XmlNodeList nlc = xd.SelectNodes("C1FlexGrid/Columns/Column"); + foreach (XmlNode nc in nlc) + { + int idx = int.Parse(nc.Attributes.GetNamedItem("index").InnerText); + cw[idx] = nc.SelectSingleNode("Width").InnerText; + } + string rhcw = "RowHeights: "; + string sep = string.Empty; + foreach (string s in rh) + { + rhcw += sep + s; + sep = ","; + } + rhcw += " - ColWidths: "; + sep = string.Empty; + foreach (string s in cw) + { + rhcw += sep + s; + sep = ","; + } + return rhcw; + } + private string GetCellDataString(XmlDocument xd) + { + int cols = int.Parse(xd.SelectSingleNode("C1FlexGrid/ColumnInfo/Count").InnerText); + int rows = int.Parse(xd.SelectSingleNode("C1FlexGrid/RowInfo/Count").InnerText); + List datum = new List(); + for (int i = 0; i < rows * cols; i++) + datum.Add("|"); + XmlNodeList nl = xd.SelectNodes("C1FlexGrid/Cells/Cell/Data"); + string data = string.Empty; + foreach (XmlNode xn in nl) + { + RichTextBox rtb = new RichTextBox(); + rtb.Rtf = xn.InnerText; + XmlAttribute xa = xn.ParentNode.Attributes.GetNamedItem("index") as XmlAttribute; + string[] rc = xa.InnerText.Split(','); + int r = int.Parse(rc[0]); + int c = int.Parse(rc[1]); + int index = r * cols + c; + datum[index] = "|" + (rtb.Text == "" ? "" : rtb.Text); + } + foreach (string s in datum) + data += s; + return data; + } + private string GetCellFormatString(XmlDocument xd) + { + int cols = int.Parse(xd.SelectSingleNode("C1FlexGrid/ColumnInfo/Count").InnerText); + int rows = int.Parse(xd.SelectSingleNode("C1FlexGrid/RowInfo/Count").InnerText); + List datum = new List(); + for (int i = 0; i < rows * cols; i++) + datum.Add("|"); + XmlNodeList nl = xd.SelectNodes("C1FlexGrid/Cells/Cell/Data"); + string data = string.Empty; + foreach (XmlNode xn in nl) + { + RichTextBox rtb = new RichTextBox(); + rtb.Rtf = xn.InnerText; + XmlAttribute xa = xn.ParentNode.Attributes.GetNamedItem("index") as XmlAttribute; + string[] rc = xa.InnerText.Split(','); + int r = int.Parse(rc[0]); + int c = int.Parse(rc[1]); + int index = r * cols + c; + datum[index] = "|" + (rtb.Text == "" ? "" : rtb.Rtf); + } + foreach (string s in datum) + data += s; + return data; + } + private string GetCellMergeString(XmlDocument xd) + { + if(xd.SelectSingleNode("C1FlexGrid/MergedRanges") == null) + return string.Empty; + return xd.SelectSingleNode("C1FlexGrid/MergedRanges").InnerXml; + } + public static GridCopyInfo MyCopyInfo = new GridCopyInfo(); private Color _DefaultCellBackgroundcolor; public Color DefaultCellBackgroundcolor