From dc7eb108cb84230ae5459f655f5044142bbf53ec Mon Sep 17 00:00:00 2001 From: Rich Date: Mon, 27 Sep 2010 16:12:46 +0000 Subject: [PATCH] Correct cursor position after RO Insert Correct dispose logic for transition destination ITEMs Correct cursor position after Transition Insert Correct logic to parse Transition Link Token Correct Save Config to dispose of ITEM Removed debug vlnStackTrace --- PROMS/Volian.Controls.Library/DisplayRO.cs | 20 +++--- PROMS/Volian.Controls.Library/DisplayText.cs | 69 +++++++++++-------- .../DisplayTransition.cs | 32 +++++---- PROMS/Volian.Controls.Library/LinkText.cs | 4 +- PROMS/Volian.Controls.Library/StepRTB.cs | 59 ++++++++-------- .../Volian.Controls.Library/StepTabRibbon.cs | 1 - 6 files changed, 104 insertions(+), 81 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplayRO.cs b/PROMS/Volian.Controls.Library/DisplayRO.cs index 79327eab..f0695d53 100644 --- a/PROMS/Volian.Controls.Library/DisplayRO.cs +++ b/PROMS/Volian.Controls.Library/DisplayRO.cs @@ -17,6 +17,7 @@ namespace Volian.Controls.Library { public partial class DisplayRO : UserControl { + private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #region Properties private DisplayTabControl _TabControl; @@ -494,15 +495,16 @@ namespace Volian.Controls.Library string linktxt = string.Format(@"#Link:ReferencedObject: {0} {1}", padroid, _MyROFST.MyRODb.RODbID); // Resolve symbols and scientific notation in the RO return value string valtxt = ConvertSymbolsAndStuff(selectedChld.value); - _MyRTB.InsertRO(valtxt, linktxt); - //_MyRTB.Select(_MyRTB.SelectionStart + valtxt.Length + linktxt.Length, 0); - int ss = _MyRTB.SelectionStart; - _MyRTB.SaveText(); - //_MyRTB.Select(_MyRTB.SelectionStart + valtxt.Length + linktxt.Length, 0); - //_MyRTB.Select(_MyRTB.SelectionStart + valtxt.Length, 0); - //_MyRTB.Select(_MyRTB.SelectionStart + 1, 0); - _MyRTB.Select(ss + valtxt.Length + linktxt.Length+1, 0); - //_MyRTB.Select(ss, 0); + int ss = _MyRTB.SelectionStart; // Remember where the link is being added + _MyRTB.InsertRO(valtxt, linktxt); // Insert the LINK + _MyRTB.SaveText(); // Save the text with the LINK - This also moves the cursor to the end of the text + // By selecting a starting position within a link, StepRTB (HandleSelectionChange) will select the link + _MyRTB.Select(ss + 7 + valtxt.Length , 0);// Select the link, Try 7 for " 1 && (str[ind - 2] == ',' || str[ind - 2] == ' ')) return str; - if (ind == -1) - return str; + if (ind <= 0) return str; return str.Substring(0,ind - 1) + @"\u160?" + str.Substring(ind); } private bool StepTransition(int TransId) @@ -561,18 +560,31 @@ namespace Volian.Controls.Library string[] tparts = linkstr.Split(" ".ToCharArray()); int type = System.Convert.ToInt32(tparts[0]); int tr1 = System.Convert.ToInt32(tparts[2]); // tparts[1] is token for tranid - Item itm1 = Item.Get(tr1); + bool dispose1 = false; + Item itm1 = null; + bool dispose2 = false; Item itm2 = null; + if (itm.ItemID != tr1) + { + dispose1 = true; + itm1 = Item.Get(tr1); + } + else + itm1 = itm; // a transition that points to itself should not dispose if (dte.Type == E_TextElementType.TransitionRange) { + dispose2 = true; itm2 = Item.Get(System.Convert.ToInt32(tparts[3])); } else itm2 = itm1; ContentTransition ct = itm.MyContent.ContentTransitions.Add(itm1, itm2); + //Console.WriteLine("CT {0},{1},{2},{3}", ct.TransitionID, itm.ItemID, itm.MyContent.MyContentUnique, itm.MyContent.ContentTransitions.Count); ct.TranType = type; l_dte.Link = l_dte.Link.Replace("", string.Format("", ct.TransitionID)); l_dte.TextAndLink = l_dte.TextAndLink.Replace("", string.Format("", ct.TransitionID)); + if (dispose2) itm2.Dispose(); + if (dispose1) itm1.Dispose(); } } } @@ -597,32 +609,33 @@ namespace Volian.Controls.Library } private void RtfToDisplayTextElements(string text) { - // get original text into displaytext elements for comparison for links: - if (DisplayTextElementList == null) - DisplayTextElementList = new List(); - else - DisplayTextElementList.Clear(); + // get original text into displaytext elements for comparison for links: + if (DisplayTextElementList == null) + DisplayTextElementList = new List(); + else + DisplayTextElementList.Clear(); - if (text == null || text == "") return; + if (text == null || text == "") return; - string noExtraRtfStr = text; - int startIndex = 0; - int index = -1; + string noExtraRtfStr = text; + + int startIndex = 0; + int index = -1; noExtraRtfStr = noExtraRtfStr.Replace(@"><", @">\v0 \v <"); - while ((index = FindTokenChar(noExtraRtfStr, startIndex)) > -1) - { - // Do any 'plain' text that preceeds the token. - if (index > startIndex) DoTextElement(noExtraRtfStr, startIndex, index); + while ((index = FindTokenChar(noExtraRtfStr, startIndex)) > -1) + { + // Do any 'plain' text that preceeds the token. + if (index > startIndex) DoTextElement(noExtraRtfStr, startIndex, index); - if (noExtraRtfStr[index + 1] == 'v') - index = DoLink(noExtraRtfStr, index); - else - index = DoSymbol(noExtraRtfStr, startIndex, index); - startIndex = index; // +1; - if (startIndex >= noExtraRtfStr.Length) break; - } - // Add any remaining text. - if (startIndex < noExtraRtfStr.Length) DoTextElement(noExtraRtfStr, startIndex, index); + if (noExtraRtfStr[index + 1] == 'v') + index = DoLink(noExtraRtfStr, index); + else + index = DoSymbol(noExtraRtfStr, startIndex, index); + startIndex = index; // +1; + if (startIndex >= noExtraRtfStr.Length) break; + } + // Add any remaining text. + if (startIndex < noExtraRtfStr.Length) DoTextElement(noExtraRtfStr, startIndex, index); } private string RtfToDbText(string text) { @@ -1076,6 +1089,7 @@ namespace Volian.Controls.Library if (m.Success) return m.Groups[1].ToString()[0]; return '\0'; } + private int DoLinkElements(string text, int index, displayLinkElement vte) { // Find the 'end comment' for this int endLinkIndxV = text.IndexOf(@"\v0 ", linkIndx); if (endLinkIndxV == -1) endLinkIndxV = text.IndexOf(@"\v0", linkIndx); // at end of string - int endLinkIndxE = text.IndexOf(@"[END>", linkIndx); + int endLinkIndxE = text.IndexOf(@"[END>", linkIndx); int endLinkIndx = (endLinkIndxV < endLinkIndxE) ? endLinkIndxV : endLinkIndxE; vte.Link = text.Substring(linkIndx + 6, endLinkIndx - linkIndx - 6); // 6 for #Link: @@ -1111,7 +1125,7 @@ namespace Volian.Controls.Library // Now get the entire text & link. Account for various ending possibilities: // ends with '\v0\'; ends with '\v0 '; ends with '\v0' (end of string); // ends with '[END>' if two in a row - will have ", endLinkIndx + 3); // get past end of link + int endToken = (endLinkIndx == endLinkIndxE)?endLinkIndx+3:text.IndexOf(@"[END>", endLinkIndx + 3); // get past end of link int endComment = text.IndexOf(@"\v0", endToken); int rettoken = 0; @@ -1131,7 +1145,6 @@ namespace Volian.Controls.Library DisplayTextElementList.Add(vte); return rettoken; } - private int DoSymbol(string text, int startIndex, int index) { displayTextElement vte = new displayTextElement(); diff --git a/PROMS/Volian.Controls.Library/DisplayTransition.cs b/PROMS/Volian.Controls.Library/DisplayTransition.cs index 2dfd244f..1996d139 100644 --- a/PROMS/Volian.Controls.Library/DisplayTransition.cs +++ b/PROMS/Volian.Controls.Library/DisplayTransition.cs @@ -14,6 +14,7 @@ namespace Volian.Controls.Library { public partial class DisplayTransition : UserControl { + private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #region Properties private int _TranFmtIndx = -1; // stores selected transition format private ItemInfo _CurItemFrom; // stores what item transition is 'from' @@ -30,6 +31,7 @@ namespace Volian.Controls.Library if (_CurTrans == value && _CurItemFrom == MyRTB.MyItemInfo) return; _CurItemFrom = MyRTB.MyItemInfo; _TranFmtIndx = 0; + btnTranSave.Enabled = btnTranCancel.Enabled = true; } else // Modify a transition { @@ -409,15 +411,15 @@ namespace Volian.Controls.Library ItemInfo selitm = startitm; if (!nostep) { - if (_CurTrans == null) + if (_CurTrans == null) + { + if (!startitm.IsHigh) { - if (!startitm.IsHigh) - { - startitm = startitm.MyParent; - selitm = startitm; - } + startitm = startitm.MyParent; + selitm = startitm; } } + } else selitm = null; E_TransUI etm = (E_TransUI)_CurItemFrom.ActiveFormat.PlantFormat.FormatData.TransData.TransTypeList[listBoxTranFmt.SelectedIndex].TransUI; @@ -522,7 +524,7 @@ namespace Volian.Controls.Library { cbTranSects.Enabled = false; } - + // check for range - if no range, then range button/label & step tree selections should be // 'cleared/invisble'. btnTranRangeClear.Visible = _DoingRange; @@ -767,7 +769,7 @@ namespace Volian.Controls.Library if (selii != null) allowSave = true; } if (!_DoingRange) - { + { SaveCancelEnabling(allowSave, selii); return; } @@ -800,7 +802,6 @@ namespace Volian.Controls.Library } } } - private void SaveCancelEnabling(bool allowSave, ItemInfo selii) { btnTranSave.Enabled = allowSave; @@ -934,9 +935,16 @@ namespace Volian.Controls.Library } // Can I build the text right now? trantxt = TransitionText.GetResolvedText(_MyRTB.MyItemInfo, listBoxTranFmt.SelectedIndex,toItem,rangeItem ?? toItem); - _MyRTB.InsertTran(trantxt, linktxt); - _MyRTB.Select(_MyRTB.SelectionStart + trantxt.Length + linktxt.Length, 0); - _MyRTB.SaveText(); + int ss = _MyRTB.SelectionStart;// Remember where the link is being added + _MyRTB.InsertTran(trantxt, linktxt);// Insert the LINK + _MyRTB.SaveText();// Save the text with the LINK - This also moves the cursor to the end of the text + // By selecting a starting position within a link, StepRTB (HandleSelectionChange) will select the link + _MyRTB.Select(ss + 7 + trantxt.Length, 0);// Try 7 for -1) + if (subst[1].IndexOf("CTID") > -1) _MyTransitionInfo = null; - else if (subst[0].IndexOf("NewID") > -1) + else if (subst[1].IndexOf("NewID") > -1) _MyTransitionInfo = null; else { diff --git a/PROMS/Volian.Controls.Library/StepRTB.cs b/PROMS/Volian.Controls.Library/StepRTB.cs index 615d512c..9a6b3761 100644 --- a/PROMS/Volian.Controls.Library/StepRTB.cs +++ b/PROMS/Volian.Controls.Library/StepRTB.cs @@ -678,9 +678,11 @@ namespace Volian.Controls.Library public void SaveConfig() { if (!_MyItemInfo.MyConfig.IsDirty) return; - Item itm = _MyItemInfo.Get(); - itm.MyContent.Config = _MyItemInfo.MyConfig.ToString(); - itm.Save(); + using (Item itm = _MyItemInfo.Get()) + { + itm.MyContent.Config = _MyItemInfo.MyConfig.ToString(); + itm.Save(); + } _MyItemInfo.MyConfig.IsDirty = false; } #endregion @@ -720,9 +722,7 @@ namespace Volian.Controls.Library _SelectedRtfSB.Append(@"{\f1\fnil\fcharset0 VESymbFix;}}{\colortbl ;\red255\green0\blue0;}"); _SelectedRtfSB.Append("\r\n"); // use styles to construct rtf commands to insert into next line (where \b, etc is) - //_SelectedRtfSB.Append(@"\viewkind4\uc1\pard\sl-240\slmult0" + sbbeg.ToString() + @"\fs" + Convert.ToInt32(this.Font.SizeInPoints * 2).ToString() + @" "); // \f0\fs" + this.Font.SizeInPoints * 2 + @" " + myDisplayTextElement.Text + @"}"; - _SelectedRtfSB.Append(@"\viewkind4\uc1\sb240\slmult0\pard" + sbbeg.ToString() + @"\fs" + Convert.ToInt32(this.Font.SizeInPoints * 2).ToString() + @" "); // \f0\fs" + this.Font.SizeInPoints * 2 + @" " + myDisplayTextElement.Text + @"}"; - + _SelectedRtfSB.Append(@"\viewkind4\uc1\pard\sl-240\slmult0" + sbbeg.ToString() + @"\fs" + Convert.ToInt32(this.Font.SizeInPoints * 2).ToString() + @" "); // \f0\fs" + this.Font.SizeInPoints * 2 + @" " + myDisplayTextElement.Text + @"}"; } private bool FontIsFixed() @@ -1466,29 +1466,29 @@ namespace Volian.Controls.Library IsControlChar = true; switch (e.KeyCode) { - //case Keys.X: //ctrl-X - //case Keys.C: //ctrl-C - // // handle the clipboard copy and cut when a Transition or RO is selected - // // For now, we are coping/cutting just the displayed text to the clipboard (like 16-bit VE-PROMS) - // Clipboard.SetText(GetSelectedDisplayableText()); - // e.Handled = true; - // e.SuppressKeyPress = true; - // if (e.KeyCode == Keys.X) // cut to clipboard - delete the selected text - // HandleDeleteKeyWithSelectedText(e, null); - // break; - //case Keys.V: - // IDataObject iData = Clipboard.GetDataObject(); - // if (!iData.GetDataPresent(DataFormats.Text) && !iData.GetDataPresent(DataFormats.Rtf)) - // { - // MessageBox.Show("Cannot paste, text has special characters or symbols that will not paste correctly."); - // } - // else - // { - // Paste(); - // if (SelectionLength == 0) SelectionFont = MyStyleFont.WindowsFont; - // } - // e.Handled = true; - // return; + case Keys.X: //ctrl-X + case Keys.C: //ctrl-C + // handle the clipboard copy and cut when a Transition or RO is selected + // For now, we are coping/cutting just the displayed text to the clipboard (like 16-bit VE-PROMS) + Clipboard.SetText(GetSelectedDisplayableText()); + e.Handled = true; + e.SuppressKeyPress = true; + if (e.KeyCode == Keys.X) // cut to clipboard - delete the selected text + HandleDeleteKeyWithSelectedText(e, null); + break; + case Keys.V: + IDataObject iData = Clipboard.GetDataObject(); + if (!iData.GetDataPresent(DataFormats.Text) && !iData.GetDataPresent(DataFormats.Rtf)) + { + MessageBox.Show("Cannot paste, text has special characters or symbols that will not paste correctly."); + } + else + { + Paste(); + if (SelectionLength == 0) SelectionFont = MyStyleFont.WindowsFont; + } + e.Handled = true; + return; case Keys.Home: StepRTB_HomeEndPressed(e); e.Handled = true; @@ -2346,6 +2346,7 @@ namespace Volian.Controls.Library @"\u9508", // HEX@"\u2524",// Right Tee - 16-bit char: '\xB4' @"\u9532", // HEX@"\u253c" // + Plus - 16-bit char: '\xC5' }; + private int MaxCharacterWidth() { // loop through lines and get the width in characters diff --git a/PROMS/Volian.Controls.Library/StepTabRibbon.cs b/PROMS/Volian.Controls.Library/StepTabRibbon.cs index 06b9d0e0..886681ed 100644 --- a/PROMS/Volian.Controls.Library/StepTabRibbon.cs +++ b/PROMS/Volian.Controls.Library/StepTabRibbon.cs @@ -511,7 +511,6 @@ namespace Volian.Controls.Library { ItemInfo ichld = MyItemInfo.Steps[0]; btn.Click += new System.EventHandler(btnInsStep_Click); - //Volian.Base.Library.vlnStackTrace.ShowStackLocal("btn", 2, 10); btn.Tag = string.Format("{0} {1}", fromtype, ichld.MyContent.Type - 20000); return; }