diff --git a/PROMS/DataLoader/Steps.cs b/PROMS/DataLoader/Steps.cs index 271700de..a9fb4cc5 100644 --- a/PROMS/DataLoader/Steps.cs +++ b/PROMS/DataLoader/Steps.cs @@ -341,6 +341,7 @@ namespace DataLoader } private Regex _RemoveComments = new Regex(@"\\v .*?\\v0( |$)"); + private string ConvertTableToGrid(string stepText, Content content, FormatInfo fmt, bool isROTable) { string savethis = stepText; @@ -350,49 +351,7 @@ namespace DataLoader VE_Font vefont = fmt.PlantFormat.FormatData.StepDataList.Table.Font; Font GridFont = new Font(vefont.Family, (float)vefont.Size); grd.Font = GridFont; // this also changes the default Row Height "Rows.DefaultSize" - stepText = FixStepText(stepText); - stepText = stepText.Replace(@"\u8209?", "-"); - stepText = stepText.Replace(@"\u9474?", "\xB3"); // Vert Line graphic character - stepText = stepText.Replace(@"\'b0", "\xB0"); - stepText = stepText.Replace(@"\up2 ", "\x9566"); - stepText = stepText.Replace(@"\up0 ", "\x9567"); - stepText = stepText.Replace(@"\ulnone", "\xBB"); - stepText = stepText.Replace(@"\ul", "\xAB"); - stepText = stepText.Replace(@"\{", "{"); - stepText = stepText.Replace(@"\}", "}"); - stepText = stepText.Replace(@"\b0", "\xD6"); - stepText = stepText.Replace(@"\b", "\xD5"); - stepText = stepText.Replace(@"\u160?", "\xA0"); //hard space - stepText = stepText.Replace(@"\u916?", "\x7F"); // delta - stepText = stepText.Replace(@"\u8805?", "\xF2"); //greater than or equal - stepText = stepText.Replace(@"\u8804?", "\xF3"); // less than or equal - stepText = stepText.Replace(@"\u931?", "\xE4"); // sigma - stepText = stepText.Replace(@"\u947?", "\xE7"); // gamma - stepText = stepText.Replace(@"\u9604?", "\xFE"); // accum 2584 - stepText = stepText.Replace(@"\u9679?", "\x7"); // bullet 25CF - stepText = stepText.Replace(@"\u8776?", "\xF7"); // approx eq - stepText = stepText.Replace(@"\u8773?", "\xF0"); // similar eq 2245 - stepText = stepText.Replace(@"\u8730?", "\xFB"); // square root - stepText = stepText.Replace(@"\u961?", "\xE2"); // rho 3C1 - stepText = stepText.Replace(@"\u960?", "\xE3"); // pi - stepText = stepText.Replace(@"\u956?", "\xE6"); // micro - stepText = stepText.Replace(@"\u948?", "\xEB"); // lower case delta - stepText = stepText.Replace(@"\u963?", "\xE5"); // lower case sigma - stepText = stepText.Replace(@"\u274?", "\x90"); // energy, 112 - stepText = stepText.Replace(@"\u949?", "\xEE"); // epsilon - stepText = stepText.Replace(@"\u952?", "\xE9"); // theta, 3B8 - stepText = stepText.Replace(@"\u8857?", "\xEC"); // dot in oval, 2299 - stepText = stepText.Replace(@"\u964?", "\xA8"); // tau, 3C4 - stepText = stepText.Replace(@"\u9830?", "\xA9"); // diamond, 2666 - stepText = stepText.Replace(@"\u8593?", "\x18"); // Up Arrow - changes to \xff - stepText = stepText.Replace(@"\u8595?", "\x19"); // Down Arrow - changes to \xd6 - - //Console.WriteLine("B4 Parse Orig Text: '{0}'", savethis); - //Console.WriteLine("B4 Parse sym repl: '{0}'", stepText); - if (grd.IsRoTable) - grd.ParseTableFromText(_RemoveComments.Replace(stepText, "")); - else - grd.ParseTableFromText(stepText); + grd.ParseTableFromText(stepText); grd.AutoSizeCols(); grd.AutoSizeRows(); grd.MakeRTFcells(); @@ -407,23 +366,7 @@ namespace DataLoader } return strGrid; } - //private void FixSymbolsInGridTable(Content content, ItemInfo ii) - //{ - // VlnFlexGrid grd = new VlnFlexGrid(1, 1); - // using (TextReader stringreader = new StringReader(content.MyGrid.Data)) - // { - // grd.ReadXml(stringreader); - // stringreader.Close(); - // } - // for (int r = 0; r < grd.Rows.Count; r++) - // for (int c = 0; c < grd.Cols.Count; c++) - // { - // StepRTB trtb = new StepRTB(); - // trtb = grd[r, c]; - // DisplayText dt = new DisplayText(trtb.Rtf, true); - // grd[r, c] = dt.OriginalText; - // } - //} + private bool IsATable(int? contenttype) { bool rtnval = false; diff --git a/PROMS/Volian.Controls.Library/GridItem.cs b/PROMS/Volian.Controls.Library/GridItem.cs index 694c9fe3..0f4973bf 100644 --- a/PROMS/Volian.Controls.Library/GridItem.cs +++ b/PROMS/Volian.Controls.Library/GridItem.cs @@ -290,12 +290,13 @@ namespace Volian.Controls.Library { if (MyFlexGrid.IsRoTable) { - MyFlexGrid.MergedRanges.Clear(); - MyFlexGrid.Clear(); - ConvertTableToGrid(args.RawValText); - MyFlexGrid.RODbId = args.RODbID; - MyFlexGrid.ROID = args.ROID; - SaveContents(); + MyFlexGrid.ConvertTableROToGrid(args.ValText, args.RODbID, args.ROID); + //MyFlexGrid.MergedRanges.Clear(); + //MyFlexGrid.Clear(); + //ConvertTableToGrid(args.RawValText, args.RODbID, args.ROID); + //MyFlexGrid.RODbId = args.RODbID; + //MyFlexGrid.ROID = args.ROID; + //SaveContents(); } else MyStepRTB.UpdateStepRtb(args.LinkText, args.ValText); @@ -498,17 +499,23 @@ namespace Volian.Controls.Library MyItemInfo.MyContent.RefreshContentRoUsages(); return string.Format(@"#Link:ReferencedObject:{0} {1} {2}", rousg.ROUsageID, MyFlexGrid.ROID, MyFlexGrid.RODbId); } - private void ConvertTableToGrid(string valtext) - { - VE_Font vefont = MyItemInfo.GetItemFont(); - MyFlexGrid.Font = vefont.WindowsFont; - Initializing = true; - MyFlexGrid.ParseTableFromText(valtext); - MyFlexGrid.AutoSizeCols(); - MyFlexGrid.AutoSizeRows(); - MyFlexGrid.MakeRTFcells(); - Initializing = false; - } + //private void ConvertTableToGrid(string valtext, int rodbid, string roid) + //{ + // VE_Font vefont = MyItemInfo.GetItemFont(); + // MyFlexGrid.Font = vefont.WindowsFont; + // //Initializing = true; + // MyFlexGrid.MergedRanges.Clear(); + // MyFlexGrid.Clear(); + // MyFlexGrid.ParseTableFromText(valtext); + // MyFlexGrid.AutoSizeCols(); + // MyFlexGrid.AutoSizeRows(); + // MyFlexGrid.MakeRTFcells(); + // MyFlexGrid.RODbId = rodbid; + // MyFlexGrid.ROID = roid; + // MyFlexGrid.IsRoTable = true; + // //Initializing = false; + // SaveContents(); + //} private bool FinishSave(string searchableText) { // Just in case if the grid was in a mode to change sizes, clear out that setting @@ -879,18 +886,19 @@ namespace Volian.Controls.Library IdentifyMe(false); } - private void RefreshGridData() - { - string ROID = MyFlexGrid.ROID; - int rodbid = MyFlexGrid.RODbId; - MyFlexGrid.Clear(); - ROFSTLookup MyROFSTLookup = MyItemInfo.MyDocVersion.DocVersionAssociations[0].MyROFst.ROFSTLookup; - ConvertTableToGrid(MyROFSTLookup.GetRoValue(ROID)); - MyFlexGrid.RODbId = rodbid; - MyFlexGrid.ROID = ROID; - MyFlexGrid.IsRoTable = true; - SaveContents(); - } + //private void RefreshGridData() + //{ + // string ROID = MyFlexGrid.ROID; + // int rodbid = MyFlexGrid.RODbId; + // //MyFlexGrid.Clear(); + // ROFSTLookup MyROFSTLookup = MyItemInfo.MyDocVersion.DocVersionAssociations[0].MyROFst.ROFSTLookup; + // MyFlexGrid.ConvertTableROToGrid(MyROFSTLookup.GetRoValue(ROID), rodbid, ROID); + // //ConvertTableToGrid(MyROFSTLookup.GetRoValue(ROID), rodbid, ROID); + // //MyFlexGrid.RODbId = rodbid; + // //MyFlexGrid.ROID = ROID; + // //MyFlexGrid.IsRoTable = true; + // //SaveContents(); + //} public override void SetExpandAndExpander(ItemInfo itemInfo) { CanExpand = false; } // can't expand a table public void SavePastedCellRoTran() { diff --git a/PROMS/Volian.Controls.Library/StepTabRibbon.cs b/PROMS/Volian.Controls.Library/StepTabRibbon.cs index 73c9c19e..cc8e37d0 100644 --- a/PROMS/Volian.Controls.Library/StepTabRibbon.cs +++ b/PROMS/Volian.Controls.Library/StepTabRibbon.cs @@ -1171,15 +1171,17 @@ namespace Volian.Controls.Library } string roid = myGrid.ROID; int rodbid = myGrid.RODbId; - Font GridFont = myGrid.Font; - myGrid.Clear(); - myGrid.ParseTableFromText(args.ROText); - myGrid.AutoSizeCols(); - myGrid.AutoSizeRows(); - myGrid.MakeRTFcells(); - myGrid.RODbId = rodbid; - myGrid.ROID = roid; - myGrid.IsRoTable = true; + ////Font GridFont = myGrid.Font; + //myGrid.MergedRanges.Clear(); + //myGrid.Clear(); + //myGrid.ParseTableFromText(args.ROText); + //myGrid.AutoSizeCols(); + //myGrid.AutoSizeRows(); + //myGrid.MakeRTFcells(); + //myGrid.RODbId = rodbid; + //myGrid.ROID = roid; + //myGrid.IsRoTable = true; + myGrid.ConvertTableROToGrid(args.ROText, rodbid, roid); using (StringWriter sw = new StringWriter()) { myGrid.WriteXml(sw); diff --git a/PROMS/Volian.Controls.Library/VlnFlexGrid.cs b/PROMS/Volian.Controls.Library/VlnFlexGrid.cs index 8f550474..bbbc09b2 100644 --- a/PROMS/Volian.Controls.Library/VlnFlexGrid.cs +++ b/PROMS/Volian.Controls.Library/VlnFlexGrid.cs @@ -296,6 +296,7 @@ namespace Volian.Controls.Library { return GetRangeHeight(GetMergedRange(row, col))-3; } + public int GetRangeHeight(CellRange cr) { int height = 0; @@ -303,6 +304,7 @@ namespace Volian.Controls.Library height += (Rows[r].Height == -1) ? Rows.DefaultSize : Rows[r].Height; return height; } + public int GetRangeTop(CellRange cr) { int top = 0; @@ -310,6 +312,7 @@ namespace Volian.Controls.Library top += (Rows[r].Height == -1) ? Rows.DefaultSize : Rows[r].Height; return top; } + public int GetRangeWidth(CellRange cr) { int width = 0; @@ -317,6 +320,7 @@ namespace Volian.Controls.Library width += (Cols[c].Width == -1) ? Cols.DefaultSize : Cols[c].Width; return width; } + public int GetRangeLeft(CellRange cr) { int left = 0; @@ -324,6 +328,7 @@ namespace Volian.Controls.Library left += (Cols[c].Width == -1) ? Cols.DefaultSize : Cols[c].Width; return left; } + public int GetRangeRowsMin(CellRange cr) { int rowsMin = 1 + cr.r2 - cr.r1; @@ -340,6 +345,7 @@ namespace Volian.Controls.Library } return rowsMin; } + public int GetRangeRowsMax(CellRange cr) { int rowsMax = 0; @@ -356,6 +362,7 @@ namespace Volian.Controls.Library } return rowsMax; } + public int GetRangeColsMin(CellRange cr) { int colsMin = 1 + cr.c2 - cr.c1; @@ -372,6 +379,7 @@ namespace Volian.Controls.Library } return colsMin; } + public int GetRangeColsMax(CellRange cr) { int colsMax = 0; @@ -388,6 +396,7 @@ namespace Volian.Controls.Library } return colsMax; } + public string GetRangeRowList(CellRange cr) { StringBuilder sb = new StringBuilder(); @@ -404,16 +413,7 @@ namespace Volian.Controls.Library } return sb.ToString(); } - private int GetCellWidth(int row, int col) - { - int width = 0; - CellRange cr = GetMergedRange(row, col); - for (int c = cr.c1; c <= cr.c2; c++) - { - width += (Cols[c].Width == -1) ? Cols.DefaultSize - 3 : Cols[c].Width -3; - } - return width; - } + private int BlankRowSpace() { int curRowHeight = (Rows[Row].Height == -1) ? Rows.DefaultSize - 3 : Rows[Row].Height - 3; @@ -435,83 +435,95 @@ namespace Volian.Controls.Library //Console.WriteLine("BlankRowSpace {0}", blankRowSpace); return blankRowSpace; } - private int BlankColSpace() - { - int curColWidth = (Cols[Col].Width == -1) ? Cols.DefaultSize - 3 : Cols[Col].Width - 3; - //int curRowHeightNLines = curRowHeight / (Rows.DefaultSize - 3); - if (curColWidth <= Cols.DefaultSize - 3) return 0; // never have col less than default width - int blankColSpace = curColWidth; - for (int r = 0; r < Rows.Count; r++) - { - StepRTB srtb = new StepRTB(); - CellRange cr = GetMergedRange(r, Col); - srtb.Rtf = GetCellRTFString(cr.r1,cr.c1); - if (Col >= cr.c1 && Col <= cr.c2) - { - int cellWidth = GetCellWidth(r, Col); - srtb.Width = cellWidth; - Application.DoEvents(); - //int mergeCellHeightNLines = cellHeight / (Rows.DefaultSize - 3); - //int dataHeight = (cr.UserData == null) ? cellHeight : (int)cr.UserData; - //int ud = dataHeight / (Rows.DefaultSize - 3); - //if (cellHeight < dataHeight) - // Console.WriteLine("r {0}, c {1}, cell{2}, data{3}", Row, c, cellHeight, dataHeight); - blankColSpace = Math.Min(blankColSpace, Math.Max(0, cellWidth - srtb.MaxTextWidth)); - } - } - //Console.WriteLine("BlankRowSpace {0}", blankRowSpace); - return blankColSpace; - } - //private bool CanReduceRow() - //{ - // int curRowHeight = (Rows[Row].Height == -1) ? Rows.DefaultSize - 3 : Rows[Row].Height -3; - // int curRowHeightNLines = curRowHeight / (Rows.DefaultSize - 3); - // bool bReduce = (curRowHeight > (Rows.DefaultSize - 3)); - // if (bReduce) - // { - // for (int c = 0; c < Cols.Count; c++) - // { - // CellRange cr = GetMergedRange(Row, c); - // if (Row >= cr.r1 && Row <= cr.r2) - // { - // int mergeCellHeightNLines = GetCellHeight(Row, c) / (Rows.DefaultSize - 3); - // //int ud = (cr.UserData == null) ? 0 : (int)cr.UserData; - // //if ((c != Col) && curRowHeight <= ud && ud >= mergeCellHeight) - // // bReduce = false; - // int ud = ((cr.UserData == null) ? 0 : (int)cr.UserData) / (Rows.DefaultSize - 3); - // if ((c != Col) && curRowHeightNLines <= ud && ud >= mergeCellHeightNLines) - // bReduce = false; - // } - // } - // } - // //Console.WriteLine("canreduce {0}, {1}", Row, bReduce); - // return bReduce; - //} - //private int GetMaxRowHeight() - //{ - // int maxRTFHeight = _minRowSplitHeight; //Rows.DefaultSize;// the smallest a row can be - // Console.WriteLine("================================================================="); - // for (int c = 0; c < Cols.Count; c++) - // { - // CellRange cr = GetMergedRange(Row, c);//GetCellRange(Row, c); - // maxRTFHeight = Math.Max(maxRTFHeight, (int)cr.UserData); - // if (c==0) - // Console.WriteLine("Height in Row[{0}] = {1}", Row, Rows[Row].Height); - // Console.WriteLine("UserData Cell[{0},{1}] = {2}", Row, c, cr.UserData); - // } - // return maxRTFHeight; - //} - //private bool IsInMergeRange(int row, int col) - //{ - // //foreach (CellRange cr in this.MergedRanges) - // //{ - // // if (cr.Contains(row, col)) - // // return true; // in a merged range - // //} - // CellRange cr = GetMergedRange(row, col); - // return (cr.r1 == row && cr.c1 == col); - //} + private int GetCellWidth(int row, int col) + { + int width = 0; + CellRange cr = GetMergedRange(row, col); + for (int c = cr.c1; c <= cr.c2; c++) + { + width += (Cols[c].Width == -1) ? Cols.DefaultSize - 3 : Cols[c].Width -3; + } + return width; + } + + private int BlankColSpace() + { + int curColWidth = (Cols[Col].Width == -1) ? Cols.DefaultSize - 3 : Cols[Col].Width - 3; + //int curRowHeightNLines = curRowHeight / (Rows.DefaultSize - 3); + if (curColWidth <= Cols.DefaultSize - 3) return 0; // never have col less than default width + int blankColSpace = curColWidth; + for (int r = 0; r < Rows.Count; r++) + { + StepRTB srtb = new StepRTB(); + CellRange cr = GetMergedRange(r, Col); + srtb.Rtf = GetCellRTFString(cr.r1, cr.c1); + if (Col >= cr.c1 && Col <= cr.c2) + { + int cellWidth = GetCellWidth(r, Col); + srtb.Width = cellWidth; + //Application.DoEvents(); + //int mergeCellHeightNLines = cellHeight / (Rows.DefaultSize - 3); + //int dataHeight = (cr.UserData == null) ? cellHeight : (int)cr.UserData; + //int ud = dataHeight / (Rows.DefaultSize - 3); + //if (cellHeight < dataHeight) + // Console.WriteLine("r {0}, c {1}, cell{2}, data{3}", Row, c, cellHeight, dataHeight); + blankColSpace = Math.Min(blankColSpace, Math.Max(0, cellWidth - srtb.MaxTextWidth)); + } + } + //Console.WriteLine("BlankRowSpace {0}", blankRowSpace); + return blankColSpace; + } + //private bool CanReduceRow() + //{ + // int curRowHeight = (Rows[Row].Height == -1) ? Rows.DefaultSize - 3 : Rows[Row].Height - 3; + // int curRowHeightNLines = curRowHeight / (Rows.DefaultSize - 3); + // bool bReduce = (curRowHeight > (Rows.DefaultSize - 3)); + // if (bReduce) + // { + // for (int c = 0; c < Cols.Count; c++) + // { + // CellRange cr = GetMergedRange(Row, c); + // if (Row >= cr.r1 && Row <= cr.r2) + // { + // int mergeCellHeightNLines = GetCellHeight(Row, c) / (Rows.DefaultSize - 3); + // //int ud = (cr.UserData == null) ? 0 : (int)cr.UserData; + // //if ((c != Col) && curRowHeight <= ud && ud >= mergeCellHeight) + // // bReduce = false; + // int ud = ((cr.UserData == null) ? 0 : (int)cr.UserData) / (Rows.DefaultSize - 3); + // if ((c != Col) && curRowHeightNLines <= ud && ud >= mergeCellHeightNLines) + // bReduce = false; + // } + // } + // } + // //Console.WriteLine("canreduce {0}, {1}", Row, bReduce); + // return bReduce; + //} + //private int GetMaxRowHeight() + //{ + // int maxRTFHeight = _minRowSplitHeight; //Rows.DefaultSize;// the smallest a row can be + // Console.WriteLine("================================================================="); + // for (int c = 0; c < Cols.Count; c++) + // { + // CellRange cr = GetMergedRange(Row, c);//GetCellRange(Row, c); + // maxRTFHeight = Math.Max(maxRTFHeight, (int)cr.UserData); + // if (c == 0) + // Console.WriteLine("Height in Row[{0}] = {1}", Row, Rows[Row].Height); + // Console.WriteLine("UserData Cell[{0},{1}] = {2}", Row, c, cr.UserData); + // } + // return maxRTFHeight; + //} + + private bool IsInMergeRange(int row, int col) + { + //foreach (CellRange cr in this.MergedRanges) + //{ + // if (cr.Contains(row, col)) + // return true; // in a merged range + //} + CellRange cr = GetMergedRange(row, col); + return (cr.r1 == row && cr.c1 == col); + } private static Regex _ReplaceVESymbFix = new Regex(@"({\\f[0-9]+[^ ]* )(VESymbFix)(;})"); private static Regex _ReplaceArialUnicodeMS = new Regex(@"({\\f[0-9]+[^ ]* )(Arial Unicode MS)(;})"); private static Regex _ReplaceTextFont = new Regex(@"({\\f[0-9]+[^ ]* )(?((?!VESymbFix)(?!Arial Unicode MS))([^;]*)|(!!!!))(;})"); @@ -1296,6 +1308,8 @@ namespace Volian.Controls.Library // Now adjust the Height and Width in the defined merge ranges AdjustMergeRangeHeightWidth(r, c, trtb, tstr, AllowWidthShrink); + + //// Now see the the selected row,col is in the defined merge ranges //bool mrgrows = false; //bool mrgcols = false; @@ -1365,106 +1379,106 @@ namespace Volian.Controls.Library // } //} } - private void AdjustCellHeightWidth(int r, int c) - { - StepRTB trtb = new StepRTB(); - string tstr = null; - bool dummyCharWidth = false; - bool AllowWidthShrink = false; - trtb.SetTableGridCellRTFPrefix(this.Font); - trtb.Clear(); - trtb.Font = this.Font; - trtb.Rtf = (string)this[r, c]; - tstr = trtb.Text; - if (tstr != null && tstr.Length > 0) - AllowWidthShrink = tstr.Contains("#Link:"); - else - { - trtb.Text = "X"; // this is to trick steprtf in giving a char width to fit one character - // note that a space character was too small. - dummyCharWidth = true; - } - // find the needed cell width - trtb.AdjustWidthForContent(); + private void AdjustCellHeightWidth(int r, int c) + { + StepRTB trtb = new StepRTB(); + string tstr = null; + bool dummyCharWidth = false; + bool AllowWidthShrink = false; + trtb.SetTableGridCellRTFPrefix(this.Font); + trtb.Clear(); + trtb.Font = this.Font; + trtb.Rtf = (string)this[r, c]; + tstr = trtb.Text; + if (tstr != null && tstr.Length > 0) + AllowWidthShrink = tstr.Contains("#Link:"); + else + { + trtb.Text = "X"; // this is to trick steprtf in giving a char width to fit one character + // note that a space character was too small. + dummyCharWidth = true; + } + // find the needed cell width + trtb.AdjustWidthForContent(); - if (dummyCharWidth) - { - trtb.Text = ""; // clear out the dummy character before saving - dummyCharWidth = false; - } + if (dummyCharWidth) + { + trtb.Text = ""; // clear out the dummy character before saving + dummyCharWidth = false; + } - this.Select(r, c, false); - CellRange sel = this.Selection; + this.Select(r, c, false); + CellRange sel = this.Selection; - // Now adjust the Height and Width in the defined merge ranges - AdjustMergeRangeHeightWidth(r, c, trtb, tstr, AllowWidthShrink); - } + // Now adjust the Height and Width in the defined merge ranges + AdjustMergeRangeHeightWidth(r, c, trtb, tstr, AllowWidthShrink); + } - private void AdjustMergeRangeHeightWidth(int r, int c, StepRTB trtb, string tstr, bool AllowWidthShrink) - { - bool mrgrows = false; - bool mrgcols = false; - foreach (CellRange cr in this.MergedRanges) - { - if (cr.Contains(r, c)) - { - if (cr.c1 != cr.c2) - mrgcols = true; // in a range of merged columns - if (cr.r1 != cr.r2) - mrgrows = true; // in a range of merged rows - continue; - } - } - if (!mrgcols || !mrgrows) - { - // IF the row of the selected cell is NOT in merged range - // then go ahead and adjust the row height (if needed) - if (!mrgrows) - { - // add adjustment for grid and cell borders - int newheight = trtb.Height + 3; + private void AdjustMergeRangeHeightWidth(int r, int c, StepRTB trtb, string tstr, bool AllowWidthShrink) + { + bool mrgrows = false; + bool mrgcols = false; + foreach (CellRange cr in this.MergedRanges) + { + if (cr.Contains(r, c)) + { + if (cr.c1 != cr.c2) + mrgcols = true; // in a range of merged columns + if (cr.r1 != cr.r2) + mrgrows = true; // in a range of merged rows + continue; + } + } + if (!mrgcols || !mrgrows) + { + // IF the row of the selected cell is NOT in merged range + // then go ahead and adjust the row height (if needed) + if (!mrgrows) + { + // add adjustment for grid and cell borders + int newheight = trtb.Height + 3; - //Console.WriteLine("{0} {1} {2} '{3}'", r, c, newheight,trtb.Text); - if (newheight > this.Rows[r].Height) - { - //Console.WriteLine("1 Row {0} Old Height = {1}, New Height = {2}", r, Rows[r].Height, newheight); - this.Rows[r].Height = newheight; - } - } - // IF the column of the selected cell is NOT in merged range - // then go ahead and adjust the column width (if needed) - if (!mrgcols) - { - // add adjustment for grid and cell borders - int newwidth = trtb.Width + 3; // 2; - if (newwidth > (this.Cols[c].Width == -1 ? this.Cols.DefaultSize : this.Cols[c].Width) || AllowWidthShrink || r == 0) - this.Cols[c].Width = newwidth; - } - } - if (mrgrows && tstr != null) - { - CellRange cr = GetMergedRange(r, c); - if (cr.r1 == r && cr.c1 == c) - { - // if in merged rows, then make sure the cell's height is large enough - string[] strary = tstr.Split("\n".ToCharArray()); - // count number of lines of text - int nlines = strary.Length; - // count number of rows in merge range - int nrows = (cr.r2 - cr.r1) + 1; - //Console.WriteLine("2 Row {0} Height = {1}", cr.r1, Rows[cr.r1].Height); - while (nlines > nrows) - { - // add length to first row in merged range - int h = this.Rows[cr.r1].Height; - int defH = Rows.DefaultSize - 3; - h = (h == -1) ? (defH * 2) + 3 : h + defH; - this.Rows[cr.r1].Height = h; - nrows++; - } - } - } - } + //Console.WriteLine("{0} {1} {2} '{3}'", r, c, newheight,trtb.Text); + if (newheight > this.Rows[r].Height) + { + //Console.WriteLine("1 Row {0} Old Height = {1}, New Height = {2}", r, Rows[r].Height, newheight); + this.Rows[r].Height = newheight; + } + } + // IF the column of the selected cell is NOT in merged range + // then go ahead and adjust the column width (if needed) + if (!mrgcols) + { + // add adjustment for grid and cell borders + int newwidth = trtb.Width + 3; // 2; + if (newwidth > (this.Cols[c].Width == -1 ? this.Cols.DefaultSize : this.Cols[c].Width) || AllowWidthShrink || r == 0) + this.Cols[c].Width = newwidth; + } + } + if (mrgrows && tstr != null) + { + CellRange cr = GetMergedRange(r, c); + if (cr.r1 == r && cr.c1 == c) + { + // if in merged rows, then make sure the cell's height is large enough + string[] strary = tstr.Split("\n".ToCharArray()); + // count number of lines of text + int nlines = strary.Length; + // count number of rows in merge range + int nrows = (cr.r2 - cr.r1) + 1; + //Console.WriteLine("2 Row {0} Height = {1}", cr.r1, Rows[cr.r1].Height); + while (nlines > nrows) + { + // add length to first row in merged range + int h = this.Rows[cr.r1].Height; + int defH = Rows.DefaultSize - 3; + h = (h == -1) ? (defH * 2) + 3 : h + defH; + this.Rows[cr.r1].Height = h; + nrows++; + } + } + } + } //private void AdjustCellHeightWidth(int r, int c) //{ // StepRTB trtb = new StepRTB(); @@ -1562,52 +1576,53 @@ namespace Volian.Controls.Library // } //} - private void Compare(string fromRTF, string fromStr, string rawstr) - { - int istart = fromRTF.IndexOf(" ",fromRTF.IndexOf("viewkind")); - int jstart = fromStr.IndexOf(" ",fromStr.IndexOf("viewkind")); - for (int i = istart; i < fromRTF.Length; i++) - { - int j = i - istart + jstart; - //else if (fromRTF[i] != fromStr[j]) - if (fromRTF[i] != fromStr[j]) - { - if (fromRTF.Substring(i, 1) == @"~" && fromStr.Substring(j, 3) == @"'a0") - { - //i++; - jstart += 2; - } - else - { - Console.WriteLine("fromStr:\r\n'{0}'\r\nfromRTF:\r\n'{1}'", fromStr, fromRTF); - ShowRawString(rawstr, "rawstr"); - Console.WriteLine("Str:'{0}' , RTF:'{1}'", fromStr.Substring(j, Math.Min(10,fromStr.Length-j-1)), fromRTF.Substring(i, Math.Min(10,fromRTF.Length-i-1))); - return; - } - } - } - } + //private void Compare(string fromRTF, string fromStr, string rawstr) + //{ + // int istart = fromRTF.IndexOf(" ",fromRTF.IndexOf("viewkind")); + // int jstart = fromStr.IndexOf(" ",fromStr.IndexOf("viewkind")); + // for (int i = istart; i < fromRTF.Length; i++) + // { + // int j = i - istart + jstart; + // //else if (fromRTF[i] != fromStr[j]) + // if (fromRTF[i] != fromStr[j]) + // { + // if (fromRTF.Substring(i, 1) == @"~" && fromStr.Substring(j, 3) == @"'a0") + // { + // //i++; + // jstart += 2; + // } + // else + // { + // Console.WriteLine("fromStr:\r\n'{0}'\r\nfromRTF:\r\n'{1}'", fromStr, fromRTF); + // ShowRawString(rawstr, "rawstr"); + // Console.WriteLine("Str:'{0}' , RTF:'{1}'", fromStr.Substring(j, Math.Min(10,fromStr.Length-j-1)), fromRTF.Substring(i, Math.Min(10,fromRTF.Length-i-1))); + // return; + // } + // } + // } + //} - private void ShowRawString(string str, string title) - { - Console.WriteLine("Raw Start --{0}:\n", title); - foreach (char c in str) - { - int ic= (int)c; - if (c!='\n'&&( ic > 126 || ic < 32)) - Console.Write("<<{0:x4}>>", ic); - else - Console.Write(c); - } - Console.WriteLine("\n-- Raw End:{0}", title); - } + #region DEBUG + //private void ShowRawString(string str, string title) + //{ + // Console.WriteLine("Raw Start --{0}:\n", title); + // foreach (char c in str) + // { + // int ic= (int)c; + // if (c!='\n'&&( ic > 126 || ic < 32)) + // Console.Write("<<{0:x4}>>", ic); + // else + // Console.Write(c); + // } + // Console.WriteLine("\n-- Raw End:{0}", title); + //} + #endregion private void Grid_AfterResize(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { this.AdjustGridControlSize(); } - #endregion // Grid Size Adjustments #region Cell Text @@ -1623,39 +1638,17 @@ namespace Volian.Controls.Library this.ConvertTextCellToRTF(r, c); } - //this.Refresh(); - //Application.DoEvents(); - this.AdjustGridControlSize(); - + TrimColumnWidths(); + RemoveBlankSpaceFromRows(); SetupCellUserData(); - - //RemoveBlankSpaceFromColumns(); - RemoveBlankSpaceFromRows(); - + this.AdjustGridControlSize(); } - public void FixTableCellsHeightWidth() - { - //StepRTB trtb = new StepRTB(); - ////trtb.SetTableGridCellRTFPrefix(this.Font); - //trtb.Font = this.Font; - //// This will spin through all the cells in the grid: - //// - adjust the grid dimensions based on the cell info. - //for (int r = 0; r < this.Rows.Count; r++) - //{ - // this.Rows[r].Height = Rows.DefaultSize;//_minRowHeight;//20;//10; - // for (int c = 0; c < this.Cols.Count; c++) - // { - // trtb.Clear(); - // trtb.Rtf = (string)this[r, c]; - // this.AdjustCellHeightWidth(r, c, trtb); - // } - //} - //this.AdjustGridControlSize(); - //SetupCellUserData(); - RemoveBlankSpaceFromColumns(); - RemoveBlankSpaceFromRows(); - } + public void FixTableCellsHeightWidth() + { + RemoveBlankSpaceFromColumns(); + RemoveBlankSpaceFromRows(); + } private void RemoveBlankSpaceFromRows() { @@ -1668,17 +1661,45 @@ namespace Volian.Controls.Library } } - private void RemoveBlankSpaceFromColumns() + private void RemoveBlankSpaceFromColumns() + { + for (int c = 0; c < Cols.Count; c++) + { + Select(0, c); + int blankColSpace = BlankColSpace(); + if (blankColSpace > 0) + Cols[c].Width -= blankColSpace; + } + } + + private void TrimColumnWidths() { for (int c = 0; c < Cols.Count; c++) { Select(0, c); - int blankColSpace = BlankColSpace(); - if (blankColSpace > 0) - Cols[c].Width -= blankColSpace; + int newColWidth = MinColWidth(); + Cols[c].Width = newColWidth; } } + private int MinColWidth() + { + int curColWidth = 0; + for (int r = 0; r < Rows.Count; r++) + { + CellRange cr = GetMergedRange(r, Col); + // find the needed cell width + if (Col == cr.c1) + { + StepRTB srtb = new StepRTB(); + srtb.Rtf = GetCellRTFString(cr.r1, cr.c1); + srtb.AdjustWidthForContent(); + curColWidth = Math.Max(curColWidth, srtb.Width + 3); + } + } + return curColWidth; + } + //private bool RemoveBoldUlineItalicChars(string str) //{ // int rtn = 0; @@ -1704,13 +1725,10 @@ namespace Volian.Controls.Library //} - //private string ConvertTableText(string str, VE_Font vf) private string ConvertTableText(string str) { string rtn = str; //ShowRawString(str, "ConvertTableText IN"); - //if (!str.StartsWith(@"{\rtf")) - //{ rtn = rtn.Replace(@"START]\v0", @"START]\cf1\v0"); rtn = rtn.Replace(@"\v #Link:", @"\cf0\v #Link:"); rtn = rtn.Replace("\n", "\\par\r\n"); @@ -1754,97 +1772,11 @@ namespace Volian.Controls.Library rtn = rtn.Replace("}", @"\}"); rtn = rtn.Replace("\xd5", @"\b"); rtn = rtn.Replace("\xd6", @"\b0"); - //} - //else - //{ - // // Underline next word - // rtn = SomethingNextWord(rtn, @"\'17", @"\ul ", @"\ulnone "); - - // // Bold next word - // rtn = SomethingNextWord(rtn, @"\'13", @"\b ", @"\b0 "); - - // // Italics On - // rtn = rtn.Replace(@"\'1B4", @"\i "); - - // // Italics Off - // rtn = rtn.Replace(@"\'1B5", @"\i0 "); - - // // underline On - // rtn = rtn.Replace(@"\'ab", @"\ul"); - // // underline Off - // rtn = rtn.Replace(@"\'bb", @"\ulnone"); - - // rtn = rtn.Replace(@"\'ef\'e6", @"\up2 "); - // rtn = rtn.Replace(@"\'ef\'e7", @"\up0 "); - // rtn = rtn.Replace(@"\'f2", @"\f1 \u8805?\f0 "); //greater than or equal - // //rtn = rtn.Replace("\xB0 ", @"\'b0 "); - // //rtn = rtn.Replace("\x2552", "\\b "); - // //rtn = rtn.Replace("\x2553", "\\b0 "); - // rtn = rtn.Replace(@"\'d5", @"\b"); - // rtn = rtn.Replace(@"\'d6", @"\b0"); - // //rtn = rtn.Replace("\xA0", @"\u160?"); - // //rtn = rtn.Replace(@"\'a0", @"\u160?"); - // rtn = rtn.Replace(@"\'ff", @"\u160?"); - // //rtn = rtn.Replace("\xFF", @"\u160?"); - // //rtn = rtn.Replace(@"\~", @"\u160?"); - // rtn = rtn.Replace("\x7F", @"\f1 \u916?\f0 "); // delta - //} //ShowRawString(rtn, "ConvertTableText OUT"); return rtn; } - //private void ConvertTableText(StepRTB srtb) - //{ - // string[] symb = { @"\'f2"}; - // string str = srtb.Rtf; - - // // Underline next word - // str = SomethingNextWord(str, @"\'17", @"\ul ", @"\ulnone "); - - // // Bold next word - // str = SomethingNextWord(str, @"\'13", @"\b ", @"\b0 "); - - // // Italics On - // str = str.Replace(@"\'1B4", @"\i "); - - // // Italics Off - // str = str.Replace(@"\'1B5", @"\i0 "); - - // // underline On - // str = str.Replace(@"\'ab", @"\ul"); - // // underline Off - // str = str.Replace(@"\'bb", @"\ulnone"); - - // str = str.Replace(@"\'ef\'e6", @"\up2 "); - // str = str.Replace(@"\'ef\'e7", @"\up0 "); - // str = str.Replace(@"\'d5", @"\b"); - // str = str.Replace(@"\'d6", @"\b0"); - // str = str.Replace("\xA0", @"\u160?"); - // str = str.Replace("\x7F", @"\u916?"); - // VE_Font vf = new VE_Font(this.Font.FontFamily.Name,(int)this.Font.Size,E_Style.None); - // DisplayText dt = new DisplayText(str,vf, true); - - // srtb.Rtf = str; - // //srtb.SelectionStart = 0; - // //foreach (string s in symb) - // //{ - // // int idx = srtb.Rtf.LastIndexOf(s, srtb.Rtf.Length-1); - // // while (idx >= 0) - // // { - // // srtb.Rtf = srtb.Rtf.Remove(idx, s.Length); - // // srtb.SelectionStart = idx; - // // srtb.InsertSymbol(s); - // // idx = srtb.Rtf.LastIndexOf(s,idx); - // // } - // //} - // //rtn = rtn.Replace("\xf2 ", @"\u8805?"); //greater than or equal - // //rtn = rtn.Replace("\xA0", @"\u160?"); - // //rtn = rtn.Replace("\x7F", @"\u916?"); - - //} - - // This converts Underline or bold next word character to the corresponding on/off commands private static string SomethingNextWord(string str, string nxtwordcmd, string cmdOn, string cmdOff) { string rtn = ""; @@ -1880,13 +1812,6 @@ namespace Volian.Controls.Library private void _StartEdit(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { // start editing the cell with the custom editor - //CellStyle cs = this.Styles["Focus"]; - ////CellStyle cs=this.GetCellRange(e.Row, e.Col).StyleNew; - ////cs.Name = string.Format("R{0}C{1}", e.Row, e.Col); - //cs.ForeColor = Color.White; - //cs = this.Styles["Highlight"]; - //cs.ForeColor = Color.LightCyan; - ////Console.WriteLine("Style = {0}",cs.Name); _tableCellEditor.StartEditing(e.Row, e.Col); e.Cancel = true; } @@ -1894,7 +1819,6 @@ namespace Volian.Controls.Library // after edit handler (built-in editors) private void _AfterEdit(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { - //Console.WriteLine("Style = {0}", this.GetCellRange(e.Row, e.Col).Style.Name); this.GetCellRange(e.Row, e.Col).Style.ForeColor = Color.Black; this.AdjustGridControlSize(); } @@ -1942,8 +1866,6 @@ namespace Volian.Controls.Library public void ClearSelectedCellText() { CellRange cr = this.Selection; - //DialogResult dr = MessageBox.Show("Clear Selected cells?", "Clear", MessageBoxButtons.YesNo); - //if (dr == DialogResult.Yes) cr.Clear(ClearFlags.Content); } public void SetupCellUserData() @@ -1959,7 +1881,6 @@ namespace Volian.Controls.Library _rtf.Rtf = rtfText; CellRange cr = GetCellRange(r, c); cr.UserData = _rtf.ContentsRectangle.Height; - //Console.WriteLine("ownerDraw UserData [{0},{1}] = {2}", cr.r1, cr.c1, _rtf.ContentsRectangle.Height); } } } @@ -1980,22 +1901,29 @@ namespace Volian.Controls.Library } public void SplitSelection(bool bSplitCols) { + //Console.WriteLine("SplitSelection this.selection {0}", this.Selection); + //Debug_WritelineMySelection(); C1.Win.C1FlexGrid.CellRange sel = this.GetMergedRange(this.Selection.r1, this.Selection.c1); - if (this.MergedRanges.Contains(sel)) - this.MergedRanges.Remove(sel); - else //split cells - { - if (bSplitCols) - SplitSelectionColumns(); - else - SplitSelectionRows(); - } + //foreach (CellRange sel in MySelection) + //{ + if (this.MergedRanges.Contains(sel)) + this.MergedRanges.Remove(sel); + else //split cells + { + if (bSplitCols) + SplitSelectionColumns(); + else + SplitSelectionRows(); + } + //} this.Refresh(); this.AdjustGridControlSize(); } private void SplitSelectionColumns() { + //Console.WriteLine("SplitSelectionColumns this.selection {0}", this.Selection); + //Debug_WritelineMySelection(); CellRange cr = this.Selection; int numSelCols = (cr.c2 - cr.c1) + 1; // for each column in the selection, add a new column @@ -2936,14 +2864,88 @@ namespace Volian.Controls.Library return rtn; } + public void ConvertTableROToGrid(string valtext, int rodbid, string roid) + { + VE_Font vefont = MyItemInfo.GetItemFont(); + this.Font = vefont.WindowsFont; + this.MergedRanges.Clear(); + this.Clear(); + this.IsRoTable = true; + this.ParseTableFromText(valtext); + this.AutoSizeCols(); + this.AutoSizeRows(); + this.MakeRTFcells(); + this.RODbId = rodbid; + this.ROID = roid; + } + + private Regex _ReplaceSpaceNewLine = new Regex(@"(?<=\\[^' \\?\r\n\t]*) (?=\r\n)"); + private Regex _ReplaceTokenSpaceToken = new Regex(@"(?<=\\[^' \\?\r\n\t]*) (?=\\)"); + private Regex _RemoveComments = new Regex(@"\\v .*?\\v0( |$)"); + + private string PrepROTableText(string stepText) + { + // we need to convert some RTF command to DOS so that we can + // figure out the table size + stepText = stepText.Replace("\xF8", @"\'f8"); + stepText = stepText.Replace(@"\par ", "\r\n"); + stepText = _ReplaceTokenSpaceToken.Replace(stepText, ""); + + //Change Token Order to match RTB output + stepText = stepText.Replace(@"\v0\b0", @"\b0\v0"); + stepText = stepText.Replace(@"\b0\ulnone", @"\ulnone\b0"); + stepText = _ReplaceSpaceNewLine.Replace(stepText, ""); + + // Now change the Unicode symbols to DOS symbols + stepText = stepText.Replace(@"\u8209?", "-"); + stepText = stepText.Replace(@"\u9474?", "\xB3"); // Vert Line graphic character + stepText = stepText.Replace(@"\'b0", "\xB0"); + stepText = stepText.Replace(@"\up2 ", "\x9566"); + stepText = stepText.Replace(@"\up0 ", "\x9567"); + stepText = stepText.Replace(@"\ulnone", "\xBB"); + stepText = stepText.Replace(@"\ul", "\xAB"); + stepText = stepText.Replace(@"\{", "{"); + stepText = stepText.Replace(@"\}", "}"); + stepText = stepText.Replace(@"\b0", "\xD6"); + stepText = stepText.Replace(@"\b", "\xD5"); + stepText = stepText.Replace(@"\u160?", "\xA0"); //hard space + stepText = stepText.Replace(@"\u916?", "\x7F"); // delta + stepText = stepText.Replace(@"\u8805?", "\xF2"); //greater than or equal + stepText = stepText.Replace(@"\u8804?", "\xF3"); // less than or equal + stepText = stepText.Replace(@"\u931?", "\xE4"); // sigma + stepText = stepText.Replace(@"\u947?", "\xE7"); // gamma + stepText = stepText.Replace(@"\u9604?", "\xFE"); // accum 2584 + stepText = stepText.Replace(@"\u9679?", "\x7"); // bullet 25CF + stepText = stepText.Replace(@"\u8776?", "\xF7"); // approx eq + stepText = stepText.Replace(@"\u8773?", "\xF0"); // similar eq 2245 + stepText = stepText.Replace(@"\u8730?", "\xFB"); // square root + stepText = stepText.Replace(@"\u961?", "\xE2"); // rho 3C1 + stepText = stepText.Replace(@"\u960?", "\xE3"); // pi + stepText = stepText.Replace(@"\u956?", "\xE6"); // micro + stepText = stepText.Replace(@"\u948?", "\xEB"); // lower case delta + stepText = stepText.Replace(@"\u963?", "\xE5"); // lower case sigma + stepText = stepText.Replace(@"\u274?", "\x90"); // energy, 112 + stepText = stepText.Replace(@"\u949?", "\xEE"); // epsilon + stepText = stepText.Replace(@"\u952?", "\xE9"); // theta, 3B8 + stepText = stepText.Replace(@"\u8857?", "\xEC"); // dot in oval, 2299 + stepText = stepText.Replace(@"\u964?", "\xA8"); // tau, 3C4 + stepText = stepText.Replace(@"\u9830?", "\xA9"); // diamond, 2666 + stepText = stepText.Replace(@"\u8593?", "\x18"); // Up Arrow - changes to \xff + stepText = stepText.Replace(@"\u8595?", "\x19"); // Down Arrow - changes to \xd6 + + return stepText; + } + /// /// This will parse a string containing the ascii text of the old style VE-PROMS (16-bit) tables. /// It will find the number of rows and columns base on newlines, vertical bars, and dashes. /// Then it will parse the the text, place them in cells, and attempt to merge cells were needed. /// /// - public void ParseTableFromText(string txtbuff) + public void ParseTableFromText(string buff) { + string txtbuff = PrepROTableText(buff); + if (IsRoTable) txtbuff = _RemoveComments.Replace(txtbuff, ""); int curRow = 0; int curCol = 0; int maxRow = 0; @@ -3108,7 +3110,7 @@ namespace Volian.Controls.Library tstr = txtbuff.Substring(idxst, idx - idxst); if (tstr.EndsWith("\r")) // strip off carrage return tstr = tstr.Substring(0, tstr.Length - 1); - tstr = tstr.TrimEnd(" ".ToCharArray()); + //tstr = tstr.TrimEnd(" ".ToCharArray()); if (tstr.Length == 0) tstr += " "; // test for a string of '-' characters @@ -3174,7 +3176,7 @@ namespace Volian.Controls.Library } // parse out the remaining text tstr = txtbuff.Substring(idxst); - tstr = tstr.TrimEnd(" ".ToCharArray()); + //tstr = tstr.TrimEnd(" ".ToCharArray()); if (tstr.Length == 0) tstr += " "; // test for a string of '-' characters @@ -3249,7 +3251,8 @@ namespace Volian.Controls.Library if (this[r, c] != null) { string cellstr = this[r, c].ToString(); - this[r, c] = cellstr.TrimEnd(" \r\n\t".ToCharArray()); + this[r, c] = cellstr.TrimEnd("\r\n\t".ToCharArray()); + //this[r, c] = cellstr.TrimEnd(" \r\n\t".ToCharArray()); CellRange cr = this.GetMergedRange(r, c); if (cr.r1 != cr.r2) TrimMergedRangeCellText(cr); @@ -3258,336 +3261,63 @@ namespace Volian.Controls.Library MyBorders = new VlnBorders(GridLinePattern.Single, Rows.Count, Cols.Count); } - //private Regex _RemoveComments = new Regex(@"\\v .*?\\v0( |$)"); - - //public void ParseTableFromText2(string rtfText) - //{ - // //string txtbuff = _RemoveComments.Replace(rtfText, ""); - // string txtbuff = ""; - // int curRow = 0; - // int curCol = 0; - // int maxRow = 0; - // int maxCol = 0; - // // Get Max Rows and Max Cols - // char[] test = "|\n\x02".ToCharArray(); - // int idx = 0; - // int idxst = 0; - // int colPos = 0; - // int strow = 0; - // Dictionary dicCols = new Dictionary(); - // //Dictionary dicCols2 = new Dictionary(); - - // //If this is not a table ro, then process the RTF version of the text so as to caputure Link references - // if (!this.IsRoTable) - // txtbuff = rtfText; - // else - // txtbuff = _RemoveComments.Replace(rtfText, ""); - // do - // { - // idx = txtbuff.IndexOfAny(test, idxst); - // if (idx > -1) - // { - // switch (txtbuff[idx]) - // { - // case '|': // end of a column - // colPos = idxst - strow; - // if (!dicCols.ContainsKey(colPos)) - // dicCols.Add(colPos, curCol); - // else if (curCol > dicCols[colPos]) - // { - // dicCols.Remove(colPos); - // dicCols.Add(colPos, curCol); - // } - // curCol++; - // break; - // case '\x02': - // case '\n': // end of a row - // colPos = idxst - strow; - // if (!dicCols.ContainsKey(colPos)) - // dicCols.Add(colPos, curCol); - // else if (curCol > dicCols[colPos]) - // { - // dicCols.Remove(colPos); - // dicCols.Add(colPos, curCol); - // } - // curRow++; - // strow = idx + 1; - // if (curCol > maxCol) - // maxCol = curCol; - // curCol = 0; - // break; - // } - // idxst = idx + 1; - // if (idxst >= txtbuff.Length) - // idx = -1; - // } - // } while (idx != -1); - // maxRow = curRow + 1; - // curRow = 0; - // curCol = 0; - // // The resulting Table Grid size in rows and columns - // this.Cols.Count = maxCol + 1; - // this.Rows.Count = maxRow + 1; - - // // make all rows and columns editable - // this.Rows.Fixed = 0; - // this.Cols.Fixed = 0; - - // // TableCellInfo is used to assign merge ranges - // // Make a two dimensional array of TableCellinfo the same size as the table grid - // TableCellInfo[,] tci = new TableCellInfo[maxRow + 1, maxCol + 1]; - // for (int r = 0; r <= maxRow; r++) - // for (int c = 0; c <= maxCol; c++) - // tci[r, c] = new TableCellInfo(); - - // // Read in each cell of the grid - // idx = 0; - // idxst = 0; - // colPos = 0; - // strow = 0; - // int prevCol = 0; - // int tstidx = 0; - // string tstr = ""; - // bool incRow = false; - // ////If this is not a table ro, then process the RTF version of the text so as to caputure Link references - // //if (!this.IsRoTable) - // // txtbuff = rtfText; - // do - // { - // idx = txtbuff.IndexOfAny(test, idxst); - // if (idx > -1) - // { - // switch (txtbuff[idx]) - // { - // case '|': // end of column - // colPos = idxst - strow; - // // based on the position of the | char, find what column we are in. - // // note that this will tell us if any columns to the left were merged - // // the while loop will flag cell that need to be merged - // curCol = dicCols[colPos]; - // while (curCol > prevCol + 1) - // { - // tci[curRow, prevCol].MergeColRight = true; - // prevCol++; - // } - // prevCol = curCol; - - // // parse out the text to be placed in the table cell - // tstr = txtbuff.Substring(idxst, idx - idxst); - // if (tstr.Length == 0) - // tstr += " "; - // // test for a string of '-' characters - // for (tstidx = 0; (tstidx < tstr.Length) && (tstr[tstidx] == '-'); tstidx++) ; - // if (tstidx < tstr.Length) // not a full line (row) of '-' chars - // { - // // if this column is in a merged grouping of rows, - // // get the cell text in the first cell of the merged grouping of cells - // // we will append the newly parsed text to this cell's text. - // int rw = curRow; - // while (rw - 1 >= 0 && tci[rw - 1, curCol].MergeRowBellow) rw--; - // int cl = curCol; - // while (cl - 1 >= 0 && tci[rw, cl - 1].MergeColRight) cl--; - // //string jstr = (string)this[rw, curCol]; - // string jstr = (string)this[rw, cl]; - // if (jstr == null) - // jstr = tstr; - // else - // jstr += ((cl == curCol) ? "\n" : "") + tstr; // multi line cell - // //jstr += "\n" + tstr; // multi line cell - // //this[rw, curCol] = jstr; - // this[rw, cl] = jstr; - // // take a peek at the start of the next piece of table text to parse - // // if it starts with a '-' char, then flag to merge the columns up to - // // this point with the same columns in the next row - // if (idx < txtbuff.Length - 1 && txtbuff[idx + 1] == '-') - // { - // for (int c = curCol; c >= -0; c--) - // if (!tci[curRow, c].ColEnd) - // tci[curRow, c].MergeRowBellow = true; - // } - // } - // else // parsed text contains all dashes - // { - // tci[curRow, curCol].ColEnd = true; - // incRow = true; - // } - // break; - // case '\x02': // end of file - // case '\n': // new line of 16-bit table text - // colPos = idxst - strow; - // // see what column we are in - new line might occure before last grid column - // curCol = dicCols[colPos]; - // strow = idx + 1; - // // parse out the cell text - // tstr = txtbuff.Substring(idxst, idx - idxst); - // if (tstr.EndsWith("\r")) // strip off carrage return - // tstr = tstr.Substring(0, tstr.Length - 1); - // tstr = tstr.TrimEnd(" ".ToCharArray()); - // if (tstr.Length == 0) - // tstr += " "; - // // test for a string of '-' characters - // for (tstidx = 0; (tstidx < tstr.Length) && (tstr[tstidx] == '-'); tstidx++) ; - // if (tstidx < tstr.Length) // not a full line (row) of '-' chars - // { - // // if this column is in a merged grouping of rows, - // // get the cell text in the first cell of the merged grouping of cells - // // we will append the newly parsed text to this cell's text. - // int rw = curRow; - // while (rw - 1 >= 0 && tci[rw - 1, curCol].MergeRowBellow) rw--; - // int cl = curCol; - // while (cl - 1 >= 0 && tci[rw, cl - 1].MergeColRight) cl--; - // //string jstr = (string)this[rw, curCol]; - // string jstr = (string)this[rw, cl]; - // if (jstr == null) - // jstr = tstr; - // else - // jstr += ((cl == curCol) ? "\n" : "") + tstr; // multi line cell - // //jstr += "\n" + tstr; // multi line cell - - // //this[rw, curCol] = jstr; - // this[rw, cl] = jstr; - // } - // else if (tstr.Length > 0) // parsed text is all dash characters - // { - // incRow = true; - // if (curRow > 0) // merge the column in the previous row with this one - // tci[curRow - 1, curCol].MergeRowBellow = false; - // } - // // if were are that the end of the 16-bit text line, but not in the last column, - // // merge the remaining columns to the right - // if ((curCol < maxCol) && (tstidx < tstr.Length)) - // { - // for (int i = curCol; i < maxCol; i++) - // tci[curRow, i].MergeColRight = true; - // } - // if (incRow) - // curRow++; - // curCol = 0; - // incRow = false; - // break; - // } - // idxst = idx + 1; - // if (idxst >= txtbuff.Length) - // idx = -1; - // } - // else if (idxst < txtbuff.Length - 1) // handle any remaining text not yet parsed - // { - // // find the curent column and merge remaining columns to the right - // colPos = idxst - strow; - // curCol = dicCols[colPos]; - // while (curCol > prevCol + 1) - // { - // tci[curRow, prevCol].MergeColRight = true; - // prevCol++; - // } - // // parse out the remaining text - // tstr = txtbuff.Substring(idxst); - // tstr = tstr.TrimEnd(" ".ToCharArray()); - // if (tstr.Length == 0) - // tstr += " "; - // // test for a string of '-' characters - // for (tstidx = 0; (tstidx < tstr.Length) && (tstr[tstidx] == '-'); tstidx++) ; - // if (tstidx < tstr.Length) - // { - // // if this column is in a merged grouping of rows, - // // get the cell text in the first cell of the merged grouping of cells - // // we will append the newly parsed text to this cell's text. - // int rw = curRow; - // while (rw - 1 >= 0 && tci[rw - 1, curCol].MergeRowBellow) rw--; - // int cl = curCol; - // while (cl - 1 >= 0 && tci[rw, cl - 1].MergeColRight) cl--; - // //string jstr = (string)this[rw, curCol]; - // string jstr = (string)this[rw, cl]; - // if (jstr == null) - // jstr = tstr; - // else - // jstr += ((cl == curCol) ? "\n" : "") + tstr; // multi line cell - // //jstr += "\n" + tstr; // multi line cell - // //this[rw, curCol] = jstr; - // this[rw, cl] = jstr; - // } - // } - // } while (idx != -1); - - // // we are done parsing the 16-bit text. - // // now set the merge ranges in the table grid, based on the - // // information saved in that two dimensional array of TableCellinfo - // this.Rows.Count = curRow + 1; - // this.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.Custom; - // maxRow = curRow; - // int rR = 0; - // int rC = 0; - // for (int r = 0; r <= maxRow; r++) - // for (int c = 0; c <= maxCol; c++) - // { - // if (tci[r, c].MergeColRight) - // { - // rC = c; - // while ((rC < maxCol) && (tci[r, rC].MergeColRight)) rC++; - // if (rC > c) - // { - // this.MergedRanges.Add(this.GetCellRange(r, c, r, rC)); - // string cellstr = this[r, c].ToString(); - // for (int x = c + 1; x <= rC; x++) - // this[r, x] = cellstr; - // c = rC; - // } - // } - // } - // for (int c = 0; c <= maxCol; c++) - // for (int r = 0; r <= maxRow; r++) - // { - // if (tci[r, c].MergeRowBellow) - // { - // rR = r; - // while ((rR < maxRow) && (tci[rR, c].MergeRowBellow)) rR++; - // if (rR > r) - // { - // this.MergedRanges.Add(this.GetCellRange(r, c, rR, c)); - // string cellstr = this[r, c].ToString(); - // for (int x = r + 1; x <= rR; x++) - // this[x, c] = cellstr; - // r = rR; - // } - // } - // } - // for (int c = 0; c <= maxCol; c++) - // for (int r = 0; r <= maxRow; r++) - // { - // if (this[r, c] != null) - // { - // string cellstr = this[r, c].ToString(); - // this[r, c] = cellstr.TrimEnd(" \r\n\t".ToCharArray()); - // CellRange cr = this.GetMergedRange(r, c); - // if (cr.r1 != cr.r2) - // TrimMergedRangeCellText(cr); - // } - // } - //} - private void TrimMergedRangeCellText(CellRange cr) - { - // count number of newlines - string cellstr = this[cr.r1, cr.c1].ToString(); - string[] strary = cellstr.Split("\n".ToCharArray()); - int nlines = strary.Length; - // count number of rows in merge range - int nrows = (cr.r2 - cr.r1) + 1; - // if nlines > rows then trim blank lines from top - bool bNeedToTrim = (nlines > nrows); - string jstr = ""; - foreach (string tmpstr in strary) - { - int tlen = tmpstr.Trim().Length; - if (!bNeedToTrim || tlen > 0) - { - if (jstr.Length > 0) jstr += "\n"; - jstr += tmpstr; - } - else nlines--; - bNeedToTrim = (tlen == 0 && nlines > nrows); - } - this[cr.r1, cr.c1] = jstr; - } + private void TrimMergedRangeCellText(CellRange cr) + { + // count number of newlines + string cellstr = this[cr.r1, cr.c1].ToString(); + string[] strary = cellstr.Split("\n".ToCharArray()); + int nlines = strary.Length; + // count number of rows in merge range + int nrows = (cr.r2 - cr.r1) + 1; + int neededLines = (nlines - (nrows - 1)); + bool bNeedToTrim = (nlines > neededLines); + string jstr = ""; + int LinesToGo = neededLines; + if (bNeedToTrim) + { + int numBlanksEnd = 0; + // find the number of blank lines at the end of this table cell + for (int i = nlines-1; i >= 0; i--) + { + if (strary[i].Trim().Length == 0) + numBlanksEnd++; + else + break; + } + int preBlanksLines = 0; + //foreach (string tmpstr in strary) + // we ignore the ending blank lines + // this allows us to include any blank lines that are between text lines + for (int i = 0; i < nlines - numBlanksEnd; i++) + { + string tmpstr = strary[i]; + int tlen = tmpstr.Trim().Length; + if (tlen > 0 || (LinesToGo < neededLines)) + { + if (jstr.Length > 0) jstr += "\n"; + jstr += tmpstr; + LinesToGo--; + } + else if (LinesToGo == (nlines - (nrows - 1))) + preBlanksLines++; + } + while (LinesToGo > 0) + { + // need to put this type of hard space (not \xA0) to hold the newline position + if (preBlanksLines > 0) + { + jstr = "\\~\n" + jstr; + LinesToGo--; + } + if (numBlanksEnd > 0) + { + jstr += "\n\\~"; + LinesToGo--; + } + } + this[cr.r1, cr.c1] = jstr; + } + } #endregion //Import / Export Grid @@ -3816,6 +3546,23 @@ namespace Volian.Controls.Library Select(r1,c1,r2,c2); } + public void Debug_WritelineMySelection() + { + int r1 = MySelection[0].r1; + int r2 = MySelection[0].r2; + int c1 = MySelection[0].c1; + int c2 = MySelection[0].c2; + Console.WriteLine("Initial MySelection[0] {0}", MySelection[0]); + foreach (CellRange cr in MySelection) + { + r1 = Math.Min(r1, cr.r1); + c1 = Math.Min(c1, cr.c1); + r2 = Math.Max(r2, cr.r2); + c2 = Math.Max(c2, cr.c2); + Console.WriteLine("Foreach range ({0},{1}) - ({2},{3})", r1, c1, r2, c2); + } + } + #endregion } ///