4405 lines
139 KiB
C#
4405 lines
139 KiB
C#
using System;
|
|
using System.ComponentModel;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
using System.Drawing;
|
|
using System.Runtime.InteropServices;
|
|
using System.Xml;
|
|
using System.IO;
|
|
using Volian.Controls.Library;
|
|
using VEPROMS.CSLA.Library;
|
|
using C1.Win.C1FlexGrid;
|
|
using System.Text.RegularExpressions;
|
|
using System.Xml.Serialization;
|
|
|
|
namespace Volian.Controls.Library
|
|
{
|
|
public delegate void VlnFlexGridEvent(object sender, EventArgs args);
|
|
public delegate void VlnFlexGridCursorMovementEvent(object sender, VlnFlexGridCursorMovementEventArgs args);
|
|
public delegate string VlnFlexGridPasteEvent(object sender, VlnFlexGridPasteEventArgs args);
|
|
public partial class VlnFlexGrid : C1.Win.C1FlexGrid.C1FlexGrid
|
|
{
|
|
public static GridCopyInfo MyCopyInfo = new GridCopyInfo();
|
|
private Color _DefaultFixedBackgroundColor;
|
|
|
|
public Color DefaultFixedBackgroundColor
|
|
{
|
|
get { return _DefaultFixedBackgroundColor; }
|
|
}
|
|
public void CopyToCopiedFlexGrid(GridCopyOption myCopyOption)
|
|
{
|
|
MyCopyInfo.MyCopiedFlexGrid = new VlnFlexGrid(); //make a copy of the grid being copied
|
|
using (StringReader sr = new StringReader(this.GetXMLData()))
|
|
{
|
|
MyCopyInfo.MyCopiedFlexGrid.ReadXml(sr);
|
|
this.BorderStyle = C1.Win.C1FlexGrid.Util.BaseControls.BorderStyleEnum.None;
|
|
sr.Close();
|
|
}
|
|
MyCopyInfo.MyCopyOption = myCopyOption;
|
|
OnCopyOptionChanged(this, new EventArgs());
|
|
switch (MyCopyInfo.MyCopyOption)
|
|
{
|
|
case GridCopyOption.Row:
|
|
MyCopyInfo.MyCopiedCellRange = MyCopyInfo.MyCopiedFlexGrid.GetCellRange(Selection.r1, 0, Selection.r2, Cols.Count - 1);
|
|
break;
|
|
case GridCopyOption.Column:
|
|
MyCopyInfo.MyCopiedCellRange = MyCopyInfo.MyCopiedFlexGrid.GetCellRange(0, Selection.c1, Rows.Count - 1, Selection.c2);
|
|
break;
|
|
case GridCopyOption.Selection:
|
|
MyCopyInfo.MyCopiedCellRange = MyCopyInfo.MyCopiedFlexGrid.GetCellRange(Selection.r1, Selection.c1, Selection.r2, Selection.c2);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
public event VlnFlexGridEvent CopyOptionChanged;
|
|
public void OnCopyOptionChanged(object sender, EventArgs args)
|
|
{
|
|
if (CopyOptionChanged != null) CopyOptionChanged(sender, args);
|
|
}
|
|
|
|
[XmlElement("MyBorders")]
|
|
[Browsable(false)]
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
public string MyBorderDetailString
|
|
{
|
|
get
|
|
{
|
|
return MyBorders.ConvertToString();
|
|
}
|
|
set
|
|
{
|
|
if (value != null)
|
|
_MyBorders = VlnBorders.Get(value);
|
|
else
|
|
_MyBorders = null;
|
|
}
|
|
}
|
|
private VlnBorders _MyBorders;
|
|
[XmlIgnore]
|
|
public VlnBorders MyBorders
|
|
{
|
|
get
|
|
{
|
|
if (_MyBorders == null)
|
|
_MyBorders = new VlnBorders(GridLinePattern.Single, Rows.Count, Cols.Count);
|
|
return _MyBorders;
|
|
}
|
|
set { _MyBorders = value; }
|
|
}
|
|
private ItemInfo _MyItemInfo;
|
|
public ItemInfo MyItemInfo
|
|
{
|
|
get { return _MyItemInfo; }
|
|
set { _MyItemInfo = value; }
|
|
}
|
|
public void SetBorders(CellRange myRange,
|
|
GridLinePattern top, GridLinePattern middle, GridLinePattern bottom,
|
|
GridLinePattern left, GridLinePattern center, GridLinePattern right)
|
|
{
|
|
for (int r = myRange.r1; r <= myRange.r2; r++)
|
|
for (int c = myRange.c1; c <= myRange.c2; c++)
|
|
{
|
|
CellRange cr = GetMergedRange(r, c);
|
|
if (r == myRange.r1) // Top Border
|
|
if(top != GridLinePattern.Mixed) MyBorders.HorizontalLines[cr.r1, cr.c1]=top;
|
|
if (c == myRange.c1) // Left Border
|
|
if(left != GridLinePattern.Mixed) MyBorders.VerticalLines[cr.r1, cr.c1]=left;
|
|
if (r == myRange.r2) // Bottom Border
|
|
if(bottom != GridLinePattern.Mixed) MyBorders.HorizontalLines[cr.r2 + 1, cr.c2]=bottom;
|
|
if (c == myRange.c2) // Right Border
|
|
if(right != GridLinePattern.Mixed) MyBorders.VerticalLines[cr.r2, cr.c2 + 1] = right;
|
|
if (r == cr.r1 && c == cr.c1) // Look for inside lines
|
|
{
|
|
if (cr.r1 > myRange.r1 && cr.r1 <= myRange.r2) // Inside Horizontal Top
|
|
if(middle != GridLinePattern.Mixed) MyBorders.HorizontalLines[cr.r1, cr.c1]=middle;
|
|
if (cr.r2 > myRange.r1 && cr.r2 < myRange.r2) // Inside Horizontal Bottom
|
|
if(middle != GridLinePattern.Mixed) MyBorders.HorizontalLines[cr.r2 + 1, cr.c2]=middle;
|
|
if (cr.c1 > myRange.c1 && cr.c1 <= myRange.c2) // Inside Vertical Left
|
|
if(center != GridLinePattern.Mixed) MyBorders.VerticalLines[cr.r1, cr.c1]=center;
|
|
if (cr.c2 > myRange.c1 && cr.c2 < myRange.c2) // Inside Vertical Right
|
|
if(center != GridLinePattern.Mixed) MyBorders.VerticalLines[cr.r2, cr.c2 + 1]=center;
|
|
}
|
|
c = cr.c2;//Skip to the end of the merged cells
|
|
}
|
|
|
|
}
|
|
public void PasteBorders(int r, int c, int br, int bc)
|
|
{
|
|
MyBorders.HorizontalLines[r, c] = MyCopyInfo.MyCopiedFlexGrid.MyBorders.HorizontalLines[br,bc];
|
|
MyBorders.VerticalLines[r, c] = MyCopyInfo.MyCopiedFlexGrid.MyBorders.VerticalLines[br, bc];
|
|
MyBorders.HorizontalLines[r+1, c] = MyCopyInfo.MyCopiedFlexGrid.MyBorders.HorizontalLines[br+1, bc];
|
|
MyBorders.VerticalLines[r, c+1] = MyCopyInfo.MyCopiedFlexGrid.MyBorders.VerticalLines[br, bc+1];
|
|
}
|
|
|
|
[XmlIgnore]
|
|
public bool HasVScroll
|
|
{
|
|
get
|
|
{
|
|
return RTBAPI.HasVertScroll(this);
|
|
}
|
|
}
|
|
[XmlIgnore]
|
|
public bool HasHScroll
|
|
{
|
|
get
|
|
{
|
|
return RTBAPI.HasHorzScroll(this);
|
|
}
|
|
}
|
|
public event VlnFlexGridEvent OpenAnnotations;
|
|
public void OnOpenAnnotations(object sender, EventArgs args)
|
|
{
|
|
if (OpenAnnotations != null) OpenAnnotations(sender, args);
|
|
}
|
|
public event VlnFlexGridCursorMovementEvent CursorMovement;
|
|
internal void OnCursorMovement(object sender, VlnFlexGridCursorMovementEventArgs args)
|
|
{
|
|
if (CursorMovement != null) CursorMovement(sender, args);
|
|
}
|
|
public event VlnFlexGridPasteEvent AdjustPastedText;
|
|
internal string OnAdjustPastedText(object sender, VlnFlexGridPasteEventArgs args)
|
|
{
|
|
if (AdjustPastedText != null) return AdjustPastedText(sender, args);
|
|
return args.Text;
|
|
}
|
|
private TableCellEditor _tableCellEditor;
|
|
|
|
public TableCellEditor TableCellEditor
|
|
{
|
|
get { return _tableCellEditor; }
|
|
set { _tableCellEditor = value; }
|
|
}
|
|
private TableClipBoardFuncts _clpbrdCpyPste;
|
|
private int _minColSplitWidth = 10;
|
|
//private int _minRowSplitHeight = 23;
|
|
|
|
//private int _minSplitColWidth = 10;
|
|
//private int _minSplitRowHeight = 20;
|
|
private E_ViewMode _vwMode = E_ViewMode.Edit;
|
|
[XmlIgnore]
|
|
internal E_ViewMode VwMode
|
|
{
|
|
get { return _vwMode; }
|
|
set
|
|
{
|
|
_vwMode = value;
|
|
AllowEditing = _vwMode == E_ViewMode.Edit;
|
|
}
|
|
}
|
|
private bool _IsRoTable = false;
|
|
public bool IsRoTable
|
|
{
|
|
get { return _IsRoTable; }
|
|
set { _IsRoTable = value; }
|
|
}
|
|
private int _RODbId;
|
|
public int RODbId
|
|
{
|
|
get { return _RODbId; }
|
|
set { _RODbId = value; }
|
|
}
|
|
private string _ROID;
|
|
|
|
public string ROID
|
|
{
|
|
get { return _ROID; }
|
|
set { _ROID = value; }
|
|
}
|
|
private float? _DPI = null;
|
|
public float? DPI
|
|
{
|
|
get
|
|
{
|
|
if (_DPI == null)
|
|
_DPI = 120;
|
|
return _DPI;
|
|
}
|
|
set
|
|
{
|
|
if (DPI != value)
|
|
{
|
|
_DPI = value;
|
|
}
|
|
}
|
|
}
|
|
#region Grid Initialize
|
|
|
|
public VlnFlexGrid()
|
|
{
|
|
InitializeComponent();
|
|
SetupGrid(4, 3); // use a default row and column count
|
|
}
|
|
|
|
public VlnFlexGrid(int rows, int cols)
|
|
{
|
|
InitializeComponent();
|
|
SetupGrid(rows, cols);
|
|
}
|
|
|
|
public VlnFlexGrid(IContainer container)
|
|
{
|
|
container.Add(this);
|
|
InitializeComponent();
|
|
SetupGrid(1, 1);
|
|
}
|
|
//public VlnFlexGrid(IContainer container)
|
|
//{
|
|
// container.Add(this);
|
|
|
|
// InitializeComponent();
|
|
// _tableCellEditor = new TableCellEditor(this);
|
|
// _tableCellEditor.ContentsResized += new ContentsResizedEventHandler(_tableCellEditor_ContentsResized);
|
|
//}
|
|
|
|
//void _tableCellEditor_ContentsResized(object sender, ContentsResizedEventArgs e)
|
|
//{
|
|
// if (_tableCellEditor._initializingEdit) return;
|
|
// CellRange cr = GetMergedRange(Row, Col);
|
|
// int oH = cr.UserData == null? 0 : (int)cr.UserData;
|
|
// int nH = _tableCellEditor.ContentsRectangle.Height;
|
|
// int Hadj = (nH - oH);
|
|
// cr.UserData = _tableCellEditor.ContentsRectangle.Height;
|
|
// int cellHeight = GetCellHeight(Row,Col);
|
|
// int cellheightNLines = cellHeight / (Rows.DefaultSize - 3);
|
|
// int nHNLines = nH / (Rows.DefaultSize - 3);
|
|
// if (Hadj != 0)
|
|
// {
|
|
// int curHeight = (Rows[Row].Height == -1) ? Rows.DefaultSize : Rows[Row].Height;
|
|
// //if (Hadj > 0 && cellHeight <= oH)
|
|
// if (Hadj > 0 && cellheightNLines < nHNLines)
|
|
// curHeight += (Rows.DefaultSize - 3);
|
|
// if (Hadj < 0 && CanReduceRow())
|
|
// curHeight -= (Rows.DefaultSize-3);
|
|
// Rows[Row].Height = curHeight;
|
|
// AdjustGridControlSize();
|
|
// }
|
|
// //cr.UserData = _tableCellEditor.ContentsRectangle.Height;
|
|
// //int mh = GetMaxRowHeight();
|
|
// ////Rows[Row].Height = mh + 2;
|
|
// //int h = 0;
|
|
// //if (cr.r1 == cr.r2 && cr.c1 == cr.c2)
|
|
// // h = Rows[Row].Height - 2;
|
|
// //else
|
|
// //{
|
|
// // for (int r = cr.r1; r <= cr.r2; r++)
|
|
// // h += Rows[r].Height - 2;
|
|
// //}
|
|
// //Rows[Row].Height += (mh - h);
|
|
// ////AdjustGridControlSize();
|
|
//}
|
|
private int GetCellHeight(int row, int col)
|
|
{
|
|
return GetRangeHeight(GetMergedRange(row, col))-3;
|
|
}
|
|
|
|
public int GetRangeHeight(CellRange cr)
|
|
{
|
|
int height = 0;
|
|
for (int r = cr.r1; r <= cr.r2; r++)
|
|
height += (Rows[r].Height == -1) ? Rows.DefaultSize : Rows[r].Height;
|
|
return height;
|
|
}
|
|
|
|
public int GetRangeTop(CellRange cr)
|
|
{
|
|
int top = 0;
|
|
for (int r = 0; r < cr.r1; r++)
|
|
top += (Rows[r].Height == -1) ? Rows.DefaultSize : Rows[r].Height;
|
|
return top;
|
|
}
|
|
|
|
public int GetRangeWidth(CellRange cr)
|
|
{
|
|
int width = 0;
|
|
for (int c = cr.c1; c <= cr.c2; c++)
|
|
width += (Cols[c].Width == -1) ? Cols.DefaultSize : Cols[c].Width;
|
|
return width;
|
|
}
|
|
|
|
public int GetRangeLeft(CellRange cr)
|
|
{
|
|
int left = 0;
|
|
for (int c = 0; c < cr.c1; c++)
|
|
left += (Cols[c].Width == -1) ? Cols.DefaultSize : Cols[c].Width;
|
|
return left;
|
|
}
|
|
|
|
public int GetRangeRowsMin(CellRange cr)
|
|
{
|
|
int rowsMin = 1 + cr.r2 - cr.r1;
|
|
for (int c = cr.c1; c <= cr.c2; c++)
|
|
{
|
|
int rows = 0;
|
|
for (int r = cr.r1; r <= cr.r2; r++)
|
|
{
|
|
CellRange chk = GetMergedRange(r, c);
|
|
if (chk.r1 == r && chk.c1 == c)
|
|
rows++;
|
|
}
|
|
rowsMin = Math.Min(rowsMin, rows);
|
|
}
|
|
return rowsMin;
|
|
}
|
|
|
|
public int GetRangeRowsMax(CellRange cr)
|
|
{
|
|
int rowsMax = 0;
|
|
for (int c = cr.c1; c <= cr.c2; c++)
|
|
{
|
|
int rows = 0;
|
|
for (int r = cr.r1; r <= cr.r2; r++)
|
|
{
|
|
CellRange chk = GetMergedRange(r, c);
|
|
if (chk.r1 == r && chk.c1 == c)
|
|
rows++;
|
|
}
|
|
rowsMax = Math.Max(rowsMax, rows);
|
|
}
|
|
return rowsMax;
|
|
}
|
|
|
|
public int GetRangeColsMin(CellRange cr)
|
|
{
|
|
int colsMin = 1 + cr.c2 - cr.c1;
|
|
for (int r = cr.r1; r <= cr.r2; r++)
|
|
{
|
|
int cols = 0;
|
|
for (int c = cr.c1; c <= cr.c2; c++)
|
|
{
|
|
CellRange chk = GetMergedRange(r, c);
|
|
if (chk.r1 == r && chk.c1 == c)
|
|
cols++;
|
|
}
|
|
colsMin = Math.Min(colsMin, cols);
|
|
}
|
|
return colsMin;
|
|
}
|
|
|
|
public int GetRangeColsMax(CellRange cr)
|
|
{
|
|
int colsMax = 0;
|
|
for (int c = cr.c1; c <= cr.c2; c++)
|
|
{
|
|
int cols = 0;
|
|
for (int r = cr.r1; r <= cr.r2; r++)
|
|
{
|
|
CellRange chk = GetMergedRange(r, c);
|
|
if (chk.r1 == r && chk.c1 == c)
|
|
cols++;
|
|
}
|
|
colsMax = Math.Max(colsMax, cols);
|
|
}
|
|
return colsMax;
|
|
}
|
|
|
|
public string GetRangeRowList(CellRange cr)
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
string sep = "";
|
|
for (int r = cr.r1; r <= cr.r2; r++)
|
|
{
|
|
CellRange crm = GetMergedRange(r, cr.c1);
|
|
if (crm.r1 == r)
|
|
{
|
|
sb.Append(sep + r.ToString());
|
|
sep = ".";
|
|
}
|
|
r = crm.r2;
|
|
}
|
|
return sb.ToString();
|
|
}
|
|
|
|
private int BlankRowSpace()
|
|
{
|
|
int curRowHeight = (Rows[Row].Height == -1) ? Rows.DefaultSize - 3 : Rows[Row].Height - 3;
|
|
if (curRowHeight <= (Rows.DefaultSize - 3)) return 0; // never have row less than default height
|
|
int blankRowSpace = curRowHeight;
|
|
for (int c = 0; c < Cols.Count; c++)
|
|
{
|
|
CellRange cr = GetMergedRange(Row, c);
|
|
if (Row >= cr.r1 && Row <= cr.r2)
|
|
{
|
|
int cellHeight = GetCellHeight(Row, c);
|
|
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);
|
|
blankRowSpace = Math.Min(blankRowSpace, Math.Max(0,cellHeight - dataHeight));
|
|
}
|
|
}
|
|
//Console.WriteLine("BlankRowSpace {0}", blankRowSpace);
|
|
return blankRowSpace;
|
|
}
|
|
|
|
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 bool _ReadingXml = false;
|
|
|
|
public bool ReadingXml
|
|
{
|
|
get { return _ReadingXml; }
|
|
}
|
|
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))([^;]*)|(!!!!))(;})");
|
|
public void LoadGrid(ItemInfo itemInfo)
|
|
{
|
|
MyItemInfo = itemInfo;
|
|
string str = itemInfo.MyContent.MyGrid.Data;
|
|
VE_Font vefont = MyItemInfo.GetItemFont();
|
|
FontFamily ff = StepRTB.MyFontFamily ?? vefont.WindowsFont.FontFamily; // TODO: Does not change fixed font.
|
|
if (StepRTB.MySymbolFontName != "VESymbFix")
|
|
str = _ReplaceVESymbFix.Replace(str, "$1" + StepRTB.MySymbolFontName + "$3");
|
|
if (StepRTB.MySymbolFontName != "Arial Unicode MS")
|
|
str = _ReplaceArialUnicodeMS.Replace(str, "$1" + StepRTB.MySymbolFontName + "$3");
|
|
str = _ReplaceTextFont.Replace(str, "$1" + ff.Name + "$4");
|
|
// To prevent scroll bars from being flashed on/off
|
|
// - save an image of the current grid
|
|
// - set Visible to false
|
|
// - draw the saved grid image
|
|
// - do the the load/reload of the grid
|
|
// - set Visible back to true.
|
|
System.Drawing.Image img = this.CreateImage();
|
|
Visible = false;
|
|
if (Parent is GridItem)
|
|
{
|
|
using (Graphics gr = (Parent as GridItem).CreateGraphics())
|
|
{
|
|
gr.DrawImage(img, Left, Top);
|
|
}
|
|
}
|
|
Clear();
|
|
MergedRanges.Clear();
|
|
_ReadingXml = true;
|
|
//Console.WriteLine("LoadGrid - Before ReadXML");
|
|
using (StringReader sr = new StringReader(str))
|
|
{
|
|
ReadXml(sr);
|
|
this.BorderStyle = C1.Win.C1FlexGrid.Util.BaseControls.BorderStyleEnum.None;
|
|
sr.Close();
|
|
}
|
|
//Console.WriteLine("LoadGrid - After ReadXML");
|
|
_ReadingXml = false;
|
|
Select(-1, -1); // this keeps the cell from being selected when the grid is first displayed
|
|
Visible = true;
|
|
|
|
}
|
|
private void SetupGrid(int numrows, int numcols) //C1FlexGrid NewGrid()
|
|
{
|
|
// setup the default size of each cell in the table/grid
|
|
this.Cols.DefaultSize = (int) DPI;
|
|
this.Rows.DefaultSize = 20;
|
|
|
|
// setup the number of rows and columns
|
|
this.Rows.Count = numrows;
|
|
this.Cols.Count = numcols;
|
|
|
|
// make all the cell editable
|
|
this.Rows.Fixed = 0;
|
|
this.Cols.Fixed = 0;
|
|
|
|
this.DrawMode = DrawModeEnum.OwnerDraw;
|
|
this.ScrollBars = ScrollBars.None;
|
|
|
|
// grid styles
|
|
this.Styles.EmptyArea.BackColor = Color.Transparent;
|
|
this.Styles.EmptyArea.Border.Style = BorderStyleEnum.None;
|
|
this.Styles.Normal.Border.Color = Color.Black;
|
|
this.Styles.Normal.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.LeftTop;
|
|
|
|
//SetupCellStyles();
|
|
|
|
this.FocusRect = FocusRectEnum.Solid;
|
|
this.Styles.Highlight.BackColor = Color.LightCyan;
|
|
this.Styles.Highlight.ForeColor = Color.Black;
|
|
this.Styles.Focus.BackColor = Color.LightCyan;
|
|
this.HighLight = HighLightEnum.WithFocus;
|
|
|
|
_DefaultFixedBackgroundColor = this.Styles.Fixed.BackColor;
|
|
this.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.Custom;
|
|
|
|
this.AllowResizing = C1.Win.C1FlexGrid.AllowResizingEnum.Both;
|
|
|
|
|
|
_tableCellEditor = new TableCellEditor(this);
|
|
_tableCellEditor.HeightChanged += new StepRTBEvent(_tableCellEditor_HeightChanged);
|
|
_clpbrdCpyPste = new TableClipBoardFuncts();
|
|
|
|
this.AfterResizeRow += new C1.Win.C1FlexGrid.RowColEventHandler(this.Grid_AfterResize);
|
|
this.StartEdit += new C1.Win.C1FlexGrid.RowColEventHandler(this._StartEdit);
|
|
this.AfterEdit += new C1.Win.C1FlexGrid.RowColEventHandler(this._AfterEdit);
|
|
this.AfterScroll += new C1.Win.C1FlexGrid.RangeEventHandler(this._AfterScroll);
|
|
this.AfterResizeColumn += new C1.Win.C1FlexGrid.RowColEventHandler(this.Grid_AfterResize);
|
|
this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this._KeyPress);
|
|
this.OwnerDrawCell += new OwnerDrawCellEventHandler(this.Grid_OwnerDrawCell);
|
|
this.LeaveCell += new EventHandler(VlnFlexGrid_LeaveCell);
|
|
|
|
this.KeyDown += new KeyEventHandler(VlnFlexGrid_KeyDown);
|
|
this.KeyUp +=new KeyEventHandler(VlnFlexGrid_KeyUp);
|
|
TableCellEditor.EditMode = TableCellEditor.Visible; // need to comment out for compile for only jsj - 07FEB2011
|
|
this.MouseDown += new MouseEventHandler(VlnFlexGrid_MouseDown);
|
|
}
|
|
|
|
void VlnFlexGrid_MouseDown(object sender, MouseEventArgs e)
|
|
{
|
|
int left = 0;
|
|
int top = 0;
|
|
int col = 0;
|
|
int row = 0;
|
|
while (e.X > left && col < Cols.Count)
|
|
{
|
|
left += Cols[col].Width > 0 ? Cols[col].Width : Cols.DefaultSize;
|
|
col++;
|
|
}
|
|
while (e.Y > top && row < Rows.Count)
|
|
{
|
|
top += Rows[row].Height > 0 ? Rows[row].Height : Rows.DefaultSize;
|
|
row++;
|
|
}
|
|
col--;
|
|
row--;
|
|
//Console.WriteLine("Mousedown Row, Col [{0},{1}]", row, col);
|
|
Select(row, col);
|
|
}
|
|
|
|
|
|
|
|
void _tableCellEditor_HeightChanged(object sender, EventArgs args)
|
|
{
|
|
if (_tableCellEditor._initializingEdit || !_tableCellEditor.Visible) return;
|
|
int curHeight = GetCellHeight(Row, Col);//(Rows[Row].Height == -1) ? Rows.DefaultSize : Rows[Row].Height;
|
|
CellRange cr = GetMergedRange(Row, Col);
|
|
int oH = cr.UserData == null ? curHeight : (int)cr.UserData;
|
|
int nH = _tableCellEditor.Height; //.ContentsRectangle.Height;
|
|
int Hadj = (nH - curHeight);//oH);
|
|
cr.UserData = _tableCellEditor.Height; //.ContentsRectangle.Height;
|
|
//int cellHeight = GetCellHeight(Row, Col);
|
|
//int cellheightNLines = cellHeight / (Rows.DefaultSize - 3);
|
|
//int nHNLines = nH / (Rows.DefaultSize - 3);
|
|
if (Hadj != 0)
|
|
{
|
|
//if (Hadj > 0 && cellHeight <= oH)
|
|
//if (Hadj > 0 && cellheightNLines < nHNLines)
|
|
// curHeight += (Rows.DefaultSize - 3);
|
|
//if (Hadj < 0 && CanReduceRow())
|
|
// curHeight -= (Rows.DefaultSize - 3);
|
|
int blankRowSpace = BlankRowSpace();
|
|
if (Hadj < 0)
|
|
Hadj = -Math.Min(-Hadj, blankRowSpace);
|
|
//if (Hadj > 0)
|
|
// Console.WriteLine("r {0}, nh {1}, curh{2}", Row, nH, curHeight);
|
|
if (Hadj != 0)
|
|
{
|
|
int newHeight = Hadj + ((Rows[Row].Height < 0) ? Rows.DefaultSize : Rows[Row].Height);
|
|
//Rows[Row].Height += Hadj;//= curHeight;
|
|
Rows[Row].Height = newHeight;
|
|
AdjustGridControlSize();
|
|
}
|
|
}
|
|
}
|
|
void VlnFlexGrid_KeyUp(object sender, KeyEventArgs e)
|
|
{
|
|
if (e.Control)
|
|
{
|
|
if (e.Alt)
|
|
{
|
|
switch (e.KeyCode)
|
|
{
|
|
case Keys.M:
|
|
OnOpenAnnotations(this, new EventArgs());
|
|
e.Handled = true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
void VlnFlexGrid_KeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
switch (e.KeyCode)
|
|
{
|
|
case Keys.Left:
|
|
if (e.Shift) return;
|
|
_tableCellEditor.StepRTB_ArrowPressed(e.Control ? E_ArrowKeys.CtrlLeft : E_ArrowKeys.Left);
|
|
e.Handled = true;
|
|
break;
|
|
case Keys.Up:
|
|
if (e.Shift) return;
|
|
_tableCellEditor.StepRTB_ArrowPressed(e.Control ? E_ArrowKeys.CtrlUp : E_ArrowKeys.Up);
|
|
e.Handled = true;
|
|
break;
|
|
case Keys.Right:
|
|
if (e.Shift) return;
|
|
_tableCellEditor.StepRTB_ArrowPressed(e.Control ? E_ArrowKeys.CtrlRight : E_ArrowKeys.Right);
|
|
e.Handled = true;
|
|
break;
|
|
case Keys.Down:
|
|
if (e.Shift) return;
|
|
_tableCellEditor.StepRTB_ArrowPressed(e.Control ? E_ArrowKeys.CtrlDown : E_ArrowKeys.Down);
|
|
e.Handled = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void VlnFlexGrid_LeaveCell(object sender, EventArgs e)
|
|
{
|
|
//CellStyle csd = this.CursorCell.StyleDisplay;
|
|
//CellStyle cs = this.GetCellRange(Row, Col).Style;
|
|
//if (cs != null)
|
|
//{
|
|
// Console.WriteLine("LeaveCell Style = {0}", cs.Name);
|
|
// Console.WriteLine("LeaveCell StyleDisplay = {0}", csd.Name);
|
|
// cs.ForeColor = Color.Black;
|
|
//}
|
|
CellStyle cs = this.Styles["Focus"];
|
|
cs.ForeColor = Color.Black;
|
|
cs = this.Styles["Highlight"];
|
|
cs.ForeColor = Color.Black;
|
|
}
|
|
|
|
//void VlnFlexGrid_LeaveEdit(object sender, RowColEventArgs e)
|
|
//{
|
|
// //Console.WriteLine("LeaveEdit Style = {0}", this.GetCellRange(e.Row, e.Col).Style.Name);
|
|
// this.GetCellRange(e.Row, e.Col).Style.ForeColor = Color.Black;
|
|
//}
|
|
private void Grid_OwnerDrawCell(object sender, C1.Win.C1FlexGrid.OwnerDrawCellEventArgs e)
|
|
{
|
|
using (RTF _rtf = new RTF())
|
|
{
|
|
// use nearest solid color
|
|
// (the RTF control doesn't dither, and doesn't support transparent backgrounds)
|
|
Color solid = e.Graphics.GetNearestColor(e.Style.BackColor);
|
|
DPI = e.Graphics.DpiX;
|
|
if (e.Style.BackColor != solid)
|
|
e.Style.BackColor = solid;
|
|
|
|
// check whether the cell contains RTF
|
|
string rtfText = this.GetDataDisplay(e.Row, e.Col).Replace(@"\~", @"\u160?");
|
|
GridItem gi = Parent as GridItem;
|
|
if (gi != null)
|
|
{
|
|
DisplayText dt = new DisplayText(gi.MyItemInfo, rtfText, true);
|
|
rtfText = dt.StartText;
|
|
}
|
|
// it does, so draw background
|
|
e.DrawCell(DrawCellFlags.Background);
|
|
if (rtfText.StartsWith(@"{\rtf"))
|
|
{
|
|
|
|
// draw the RTF text
|
|
if (e.Bounds.Width > 0 && e.Bounds.Height > 0)
|
|
{
|
|
_rtf.Width = e.Bounds.Width - 1; // This has also been -3 which matchs the rener command
|
|
// Please add a comment if this value nedds to be changed
|
|
_rtf.Rtf = rtfText;
|
|
CellRange cr = GetMergedRange(e.Row, e.Col);
|
|
cr.UserData = _rtf.Height;
|
|
int hAdjust = 0;
|
|
int hDiff = e.Bounds.Height - _rtf.Height;
|
|
if (hDiff < 0)
|
|
{
|
|
Rows[e.Row].Height = _rtf.Height + 4;
|
|
AdjustGridControlSize();
|
|
hDiff = 0;
|
|
}
|
|
if (e.Style != null)
|
|
{
|
|
switch (e.Style.TextAlign)
|
|
{
|
|
case TextAlignEnum.CenterBottom:
|
|
case TextAlignEnum.GeneralBottom:
|
|
case TextAlignEnum.LeftBottom:
|
|
case TextAlignEnum.RightBottom:
|
|
hAdjust = hDiff;
|
|
break;
|
|
case TextAlignEnum.CenterCenter:
|
|
case TextAlignEnum.GeneralCenter:
|
|
case TextAlignEnum.LeftCenter:
|
|
case TextAlignEnum.RightCenter:
|
|
hAdjust = hDiff / 2;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
if (IsRoTable)
|
|
{
|
|
_rtf.ForeColor = Color.Red;
|
|
}
|
|
else
|
|
{
|
|
_rtf.ForeColor = e.Style.ForeColor;
|
|
}
|
|
_rtf.BackColor = e.Style.BackColor;
|
|
_rtf.Render(e.Graphics, new Rectangle(e.Bounds.X + 1, e.Bounds.Y + hAdjust, e.Bounds.Width - 3, e.Bounds.Height));
|
|
//CellRange cr = GetCellRange(e.Row, e.Col);
|
|
//Console.WriteLine("ownerDraw UserData [{0},{1}] = {2}", cr.r1, cr.c1, _rtf.ContentsRectangle.Height);
|
|
//cr.UserData = _rtf.ContentsRectangle.Height;
|
|
}
|
|
}
|
|
// and draw border last
|
|
//e.DrawCell(DrawCellFlags.Border);
|
|
// This can be used to draw more specific borders
|
|
DrawCellBorder(e);
|
|
// we're done with this cell
|
|
e.Handled = true;
|
|
}
|
|
}
|
|
private static Color _BorderColor = Color.Black;
|
|
public static Color BorderColor
|
|
{
|
|
get { return VlnFlexGrid._BorderColor; }
|
|
set { VlnFlexGrid._BorderColor = value; }
|
|
}
|
|
private void DrawCellBorder(C1.Win.C1FlexGrid.OwnerDrawCellEventArgs e)
|
|
{
|
|
Graphics grGrid =e.Graphics;
|
|
Rectangle bounds = e.Bounds;
|
|
int row = e.Row;
|
|
int col = e.Col;
|
|
CellRange cr = GetMergedRange(row, col);
|
|
GridLinePattern topSide = MyBorders.HorizontalLines[cr.r1,cr.c1];
|
|
GridLinePattern rightOfTopSide = cr.c2 == Cols.Count - 1 ? GridLinePattern.None : MyBorders.HorizontalLines[cr.r1, cr.c2 + 1];
|
|
GridLinePattern leftOfTopSide = cr.c1 == 0? GridLinePattern.None : MyBorders.HorizontalLines[cr.r1, cr.c1 - 1];
|
|
GridLinePattern leftSide = MyBorders.VerticalLines[cr.r1, cr.c1];
|
|
GridLinePattern aboveLeftSide = cr.r1 == 0 ? GridLinePattern.None : MyBorders.VerticalLines[cr.r1 - 1, cr.c1];
|
|
GridLinePattern belowLeftSide = cr.r2 == Rows.Count - 1 ? GridLinePattern.None : MyBorders.VerticalLines[cr.r2 + 1, cr.c1];
|
|
GridLinePattern bottomSide = MyBorders.HorizontalLines[cr.r2+1, cr.c2];
|
|
GridLinePattern rightOfBottomSide = cr.c2 == Cols.Count - 1 ? GridLinePattern.None : MyBorders.HorizontalLines[cr.r2 + 1, cr.c2 + 1];
|
|
GridLinePattern rightSide = MyBorders.VerticalLines[cr.r2, cr.c2+1];
|
|
GridLinePattern belowRightSide = cr.r2 == Rows.Count - 1 ? GridLinePattern.None : MyBorders.VerticalLines[cr.r2 + 1, cr.c2 + 1];
|
|
GridLinePattern none = GridLinePattern.None;
|
|
int x1 = bounds.Left;
|
|
int y1 = bounds.Top;
|
|
int x2 = bounds.Right - 1;
|
|
int y2 = bounds.Bottom - 1;
|
|
GridItem myGridItem = Parent as GridItem;
|
|
if (myGridItem == null) return;
|
|
if (row == 0 || col == 0) // Top or Left Edge - Draw on parent
|
|
{
|
|
using (Graphics grParent = myGridItem.CreateGraphics())
|
|
{
|
|
if (row == 0)
|
|
{
|
|
if (col == 0)
|
|
{
|
|
// Draw the top left intersection
|
|
DrawIntersection(grParent, Left - 3, Top-1, none, topSide,leftSide, none);
|
|
}
|
|
// Draw the top right intersection
|
|
DrawIntersection(grParent, Left +x2 - 2, Top-1, none, rightOfTopSide,rightSide,topSide);
|
|
// Draw the top side on the parent
|
|
DrawLine(grParent, topSide, Left + x1, Top + y1 - 1, Left + x2-3, Top + y1 -1);
|
|
}
|
|
if (col == 0)
|
|
{
|
|
// Draw the bottom left intersection
|
|
DrawIntersection(grParent, Left -3, Top + y2, leftSide,bottomSide,belowLeftSide,none);
|
|
// Draw the left side
|
|
DrawLine(grParent, leftSide, Left + x1 - 1, Top + y1, Left + x1 - 1, Top + y2-3);
|
|
}
|
|
}
|
|
}
|
|
// Draw the bottom right intersection
|
|
DrawIntersection(grGrid, x2 - 2, y2, rightSide, rightOfBottomSide, belowRightSide, bottomSide);
|
|
// Draw the bottom side
|
|
DrawLine(grGrid, bottomSide, x1, y2, x2-3, y2);
|
|
// Draw the right side
|
|
DrawLine(grGrid, rightSide, x2, y1, x2, y2-3);
|
|
}
|
|
private static void DrawLine(Graphics gr, GridLinePattern pattern, int x1, int y1, int x2, int y2)
|
|
{
|
|
if (pattern == GridLinePattern.None) return;
|
|
Pen pn = VlnBorders.LinePen(pattern, BorderColor);
|
|
DrawLine(gr, pn, pattern, x1, y1, x2, y2);
|
|
}
|
|
private static void DrawLine(Graphics gr, Pen pn, int x1, int y1, int x2, int y2)
|
|
{
|
|
DrawLine(gr, pn, GridLinePattern.Single, x1, y1, x2, y2);
|
|
}
|
|
private static void DrawLine(Graphics gr, Pen pn, GridLinePattern pattern, int x1, int y1, int x2, int y2)
|
|
{
|
|
int dx = 0;
|
|
int dy = 0;
|
|
int dblx = 0;
|
|
int dbly = 0;
|
|
int xThick = 0;
|
|
int yThick = 0;
|
|
if (x1 == x2) // Vertical Line
|
|
{
|
|
dx = (int) (-pn.Width / 2);
|
|
dblx = -2;
|
|
if (pn.Width > 2)
|
|
yThick = 1;
|
|
}
|
|
else // Horizontal Line
|
|
{
|
|
dy = (int) (-pn.Width / 2);
|
|
dbly = -2;
|
|
if (pn.Width > 2)
|
|
xThick = 1;
|
|
}
|
|
gr.DrawLine(pn, x1 + dx, y1 + dy, x2 + dx + xThick, y2 + dy + yThick);
|
|
if(pattern == GridLinePattern.Double)
|
|
gr.DrawLine(pn, x1 + dx +dblx, y1 + dy + dbly, x2 + dx+dblx, y2 + dy+dbly);
|
|
}
|
|
private static void DrawIntersection(Graphics gr, int x, int y, GridLinePattern up, GridLinePattern right, GridLinePattern down, GridLinePattern left)
|
|
{
|
|
if (up == GridLinePattern.Double)
|
|
if (right == GridLinePattern.Double)
|
|
if (down == GridLinePattern.Double)
|
|
if (left == GridLinePattern.Double) DrawIntersectionAllDoubles(gr, x, y);
|
|
else DrawDrawIntersection3Doubles_URD(gr, x, y);
|
|
else // Down is not double
|
|
if (left == GridLinePattern.Double) DrawDrawIntersection3Doubles_URL(gr, x, y);
|
|
else DrawDrawIntersection2Doubles_UR(gr, x, y, down, left);
|
|
else // right is not double
|
|
if (down == GridLinePattern.Double)
|
|
if (left == GridLinePattern.Double) DrawDrawIntersection3Doubles_UDL(gr, x, y);
|
|
else DrawDrawIntersection2Doubles_UD(gr, x, y, right, left);
|
|
else // Down is not double
|
|
if (left == GridLinePattern.Double) DrawIntersection2Doubles_UL(gr, x, y, right, down);
|
|
else DrawIntersectionOneDoubleOrLess(gr, x, y, up, right, down, left);
|
|
else
|
|
if (right == GridLinePattern.Double)
|
|
if (down == GridLinePattern.Double)
|
|
if (left == GridLinePattern.Double) DrawDrawIntersection3Doubles_RDL(gr, x, y);
|
|
else DrawDrawIntersection2Doubles_RD(gr, x, y, up, left);
|
|
else // Down is not double
|
|
if (left == GridLinePattern.Double) DrawDrawIntersection2Doubles_RL(gr, x, y, up, down);
|
|
else DrawIntersectionOneDoubleOrLess(gr, x, y, up, right, down, left);
|
|
else
|
|
if (down == GridLinePattern.Double)
|
|
if (left == GridLinePattern.Double) DrawDrawIntersection2Doubles_DL(gr, x, y, up, right);
|
|
else DrawIntersectionOneDoubleOrLess(gr, x, y, up, right, down, left);
|
|
else // These both use the same function with the same parameters
|
|
if (left == GridLinePattern.Double) DrawIntersectionOneDoubleOrLess(gr, x, y, up, right, down, left);
|
|
else DrawIntersectionOneDoubleOrLess(gr, x, y, up, right, down, left);
|
|
}
|
|
private static Pen pnDouble = VlnBorders.LinePen(GridLinePattern.Double, BorderColor);
|
|
private static Pen pnThick = VlnBorders.LinePen(GridLinePattern.Thick, BorderColor);
|
|
private static void DrawIntersectionAllDoubles(Graphics gr, int x, int y)
|
|
{
|
|
DrawLine(gr, pnDouble, x-1, y, x, y);
|
|
DrawLine(gr, pnDouble, x, y - 2, x, y - 3);
|
|
DrawLine(gr, pnDouble, x + 2, y - 2, x + 3, y - 2);
|
|
DrawLine(gr, pnDouble, x + 2, y, x + 2, y + 1);
|
|
}
|
|
private static void DrawDrawIntersection3Doubles_URD(Graphics gr, int x, int y)
|
|
{
|
|
DrawLine(gr, pnDouble, x , y, x, y - 3);
|
|
DrawLine(gr, pnDouble, x + 2, y - 2, x + 3, y - 2);
|
|
DrawLine(gr, pnDouble, x + 2, y, x + 2, y + 1);
|
|
}
|
|
private static void DrawDrawIntersection3Doubles_URL(Graphics gr, int x, int y)
|
|
{
|
|
DrawLine(gr, pnDouble, x, y, x + 2, y);
|
|
DrawLine(gr, pnDouble, x -1, y - 2, x , y - 2);
|
|
DrawLine(gr, pnDouble, x + 2, y - 2, x + 3, y - 2);
|
|
}
|
|
private static void DrawDrawIntersection3Doubles_UDL(Graphics gr, int x, int y)
|
|
{
|
|
DrawLine(gr, pnDouble, x-1, y, x, y);
|
|
DrawLine(gr, pnDouble, x , y - 2, x , y - 3);
|
|
DrawLine(gr, pnDouble, x + 2, y-3, x + 2, y);
|
|
}
|
|
private static void DrawDrawIntersection3Doubles_RDL(Graphics gr, int x, int y)
|
|
{
|
|
DrawLine(gr, pnDouble, x-1, y, x, y);
|
|
DrawLine(gr, pnDouble, x, y - 2, x + 2, y - 2);
|
|
DrawLine(gr, pnDouble, x + 2, y, x + 2, y + 1);
|
|
}
|
|
private static void DrawDrawIntersection2Doubles_UR(Graphics gr, int x, int y, GridLinePattern lp1, GridLinePattern lp2)
|
|
{
|
|
if (lp1 == GridLinePattern.Thick && lp2 == GridLinePattern.Thick)
|
|
DrawLine(gr, pnThick, x, y, x + 3, y);
|
|
else
|
|
{
|
|
DrawLine(gr, pnDouble, x, y, x + 2, y);
|
|
DrawLine(gr, pnDouble, x , y, x , y - 2);
|
|
DrawLine(gr, pnDouble, x + 2, y - 2, x + 3, y - 2);
|
|
}
|
|
}
|
|
private static void DrawDrawIntersection2Doubles_UD(Graphics gr, int x, int y, GridLinePattern lp1, GridLinePattern lp2)
|
|
{
|
|
if (lp1 == GridLinePattern.Thick && lp2 == GridLinePattern.Thick)
|
|
DrawLine(gr, pnThick, x, y, x + 3, y);
|
|
else
|
|
{
|
|
DrawLine(gr, pnDouble, x, y, x, y - 2);
|
|
DrawLine(gr, pnDouble, x + 2, y, x + 2, y - 2);
|
|
}
|
|
}
|
|
private static void DrawIntersection2Doubles_UL(Graphics gr, int x, int y, GridLinePattern lp1, GridLinePattern lp2)
|
|
{
|
|
if (lp1 == GridLinePattern.Thick && lp2 == GridLinePattern.Thick)
|
|
DrawLine(gr, pnThick, x, y, x + 3, y);
|
|
else
|
|
{
|
|
DrawLine(gr, pnDouble, x, y, x + 2, y);
|
|
DrawLine(gr, pnDouble, x , y - 2, x, y - 3);
|
|
DrawLine(gr, pnDouble, x + 2, y, x + 2, y - 2);
|
|
}
|
|
}
|
|
private static void DrawDrawIntersection2Doubles_RD(Graphics gr, int x, int y, GridLinePattern lp1, GridLinePattern lp2)
|
|
{
|
|
if (lp1 == GridLinePattern.Thick && lp2 == GridLinePattern.Thick)
|
|
DrawLine(gr, pnThick, x, y, x + 3, y);
|
|
else
|
|
{
|
|
DrawLine(gr, pnDouble, x, y, x, y - 2);
|
|
DrawLine(gr, pnDouble, x, y - 2, x + 2, y - 2);
|
|
DrawLine(gr, pnDouble, x + 2, y, x + 2, y + 1);
|
|
}
|
|
}
|
|
private static void DrawDrawIntersection2Doubles_RL(Graphics gr, int x, int y, GridLinePattern lp1, GridLinePattern lp2)
|
|
{
|
|
if (lp1 == GridLinePattern.Thick && lp2 == GridLinePattern.Thick)
|
|
DrawLine(gr, pnThick, x, y, x + 2, y);
|
|
else
|
|
{
|
|
DrawLine(gr, pnDouble, x, y, x + 2, y);
|
|
DrawLine(gr, pnDouble, x, y - 2, x + 2, y - 2);
|
|
}
|
|
}
|
|
private static void DrawDrawIntersection2Doubles_DL(Graphics gr, int x, int y, GridLinePattern lp1, GridLinePattern lp2)
|
|
{
|
|
if (lp1 == GridLinePattern.Thick && lp2 == GridLinePattern.Thick)
|
|
DrawLine(gr, pnThick, x, y, x + 2, y);
|
|
else
|
|
{
|
|
DrawLine(gr, pnDouble, x-1, y, x, y);
|
|
DrawLine(gr, pnDouble, x, y - 2, x + 2, y - 2);
|
|
DrawLine(gr, pnDouble, x + 2, y, x + 2, y - 2);
|
|
}
|
|
}
|
|
private static void DrawIntersectionOneDoubleOrLess(Graphics gr, int x, int y,
|
|
GridLinePattern up, GridLinePattern right, GridLinePattern down, GridLinePattern left)
|
|
{
|
|
Pen pnUp = VlnBorders.LinePen(up, BorderColor);
|
|
Pen pnLeft = VlnBorders.LinePen(left, BorderColor);
|
|
int widthUpDown = Math.Max(VlnBorders.LineWidth0(up), VlnBorders.LineWidth0(down));
|
|
int heightLeftRight = Math.Max(VlnBorders.LineWidth0(left), VlnBorders.LineWidth0(right));
|
|
if (heightLeftRight > 0 && widthUpDown > 0)
|
|
{
|
|
Pen pn = new Pen(BorderColor, widthUpDown);
|
|
if(heightLeftRight > 1)
|
|
DrawLine(gr, pn, x + 2, y + 1 - heightLeftRight, x + 2, y);
|
|
else if(up == GridLinePattern.None) // Work around to set a pixel (actually set two)
|
|
DrawLine(gr, pn, x + 2, y, x + 2, y + 1);
|
|
}
|
|
if (left != GridLinePattern.None)
|
|
{
|
|
DrawLine(gr, pnLeft, x, y, x + 2 - widthUpDown, y);
|
|
if (left == GridLinePattern.Double)
|
|
DrawLine(gr, pnLeft, x, y - 2, x + 2 - widthUpDown, y - 2);
|
|
}
|
|
if (up != GridLinePattern.None)
|
|
{
|
|
DrawLine(gr, pnUp, x + 2, y - 3 , x + 2, y +1 - heightLeftRight);
|
|
if (up == GridLinePattern.Double)
|
|
DrawLine(gr, pnUp, x, y - 3, x, y +1 - heightLeftRight);
|
|
}
|
|
}
|
|
#endregion //Grid Initialize
|
|
#region Grid and Cell Styles
|
|
public void ChangeBackgroundColor(string bckgndColor)
|
|
{
|
|
CellRange cr = this.Selection;
|
|
if (!bckgndColor.EndsWith(";"))
|
|
bckgndColor+=";";
|
|
string strBckgndColor = string.Format("BackColor:{0}", bckgndColor);
|
|
|
|
for (int rw = cr.r1; rw <= cr.r2; rw++)
|
|
for (int cl = cr.c1; cl <= cr.c2; cl++)
|
|
{
|
|
CellRange tmp = this.GetCellRange(rw, cl, rw, cl);
|
|
string StyleName = string.Format("R{0}C{1}Style", rw, cl);
|
|
CellStyle cs = this.Styles.Add(StyleName, tmp.Style);
|
|
cs.ParseString(strBckgndColor);
|
|
tmp.Style = cs;
|
|
}
|
|
}
|
|
|
|
public void ToggleCellTextAlignment()
|
|
{
|
|
// only used in test program
|
|
CellRange cr = this.Selection;
|
|
StepRTB srtb = new StepRTB();
|
|
srtb.Rtf = this.GetCellRTFString(cr.r1, cr.c1);
|
|
|
|
srtb.SelectAll();
|
|
int align = (int)srtb.SelectionAlignment;
|
|
align = (align + 1) % 3;
|
|
|
|
srtb.SelectionAlignment = (HorizontalAlignment)align;
|
|
this.PutCellRTFString(cr.r1, cr.c1, srtb.Rtf);
|
|
}
|
|
|
|
public void RTFTextAlignment(CellRange cr, HorizontalAlignment ha)
|
|
{
|
|
StepRTB srtb = new StepRTB();
|
|
for (int rw = cr.r1; rw <= cr.r2; rw++)
|
|
for (int cl = cr.c1; cl <= cr.c2; cl++)
|
|
{
|
|
srtb.Rtf = this.GetCellRTFString(rw, cl);
|
|
srtb.SelectAll();
|
|
srtb.SelectionAlignment = ha;
|
|
this.PutCellRTFString(rw, cl, srtb.Rtf);
|
|
}
|
|
}
|
|
|
|
|
|
public void SetTableBorder(C1.Win.C1FlexGrid.Util.BaseControls.BorderStyleEnum border)
|
|
{
|
|
this.BorderStyle = border;
|
|
this.AdjustGridControlSize();
|
|
}
|
|
public void ChangeCellAlign(CellRange cr, TextAlignEnum newAlign)
|
|
{
|
|
for (int rw = cr.r1; rw <= cr.r2; rw++)
|
|
for (int col = cr.c1; col <= cr.c2; col++)
|
|
{
|
|
CellRange tmp = this.GetCellRange(rw, col, rw, col);
|
|
string StyleName = string.Format("R{0}C{1}Style", rw, col);
|
|
CellStyle cs = null;
|
|
if (Styles.Contains(StyleName))
|
|
cs = Styles[StyleName];
|
|
else
|
|
cs = this.Styles.Add(StyleName, tmp.Style);
|
|
cs.TextAlign = newAlign;
|
|
tmp.Style = cs;
|
|
}
|
|
}
|
|
public void ChangeCellBorder(CellRange cr, BorderStyleEnum newBorder)
|
|
{
|
|
for (int rw = cr.r1; rw <= cr.r2; rw++)
|
|
for (int col = cr.c1; col <= cr.c2; col++)
|
|
{
|
|
CellRange tmp = this.GetCellRange(rw, col, rw, col);
|
|
string StyleName = string.Format("R{0}C{1}Style", rw, col);
|
|
CellStyle cs = null;
|
|
if (Styles.Contains(StyleName))
|
|
cs = Styles[StyleName];
|
|
else
|
|
cs = this.Styles.Add(StyleName, tmp.Style);
|
|
cs.Border.Style = newBorder;
|
|
tmp.Style = cs;
|
|
}
|
|
}
|
|
public void ListStyles()
|
|
{
|
|
for (int r = 0; r < Rows.Count; r++)
|
|
for (int c = 0; c < Cols.Count; c++)
|
|
{
|
|
CellRange cr = GetMergedRange(r, c);
|
|
if (cr.r1 == r && cr.c1 == c)
|
|
{
|
|
if (cr.Style != null) Console.WriteLine("{0}, {1}, {2}, {3}", r, c, cr.Style.Name, cr.Style.BackColor);
|
|
}
|
|
}
|
|
}
|
|
//public void VerticalCenterText()
|
|
//{
|
|
// StepRTB myStepRTB = new StepRTB();
|
|
// CellRange selRange = this.Selection;
|
|
// for (int r = selRange.r1; r <= selRange.r2; r++)
|
|
// for (int c = selRange.c1; c <= selRange.c2; c++)
|
|
// {
|
|
// CellRange mr = this.GetMergedRange(r, c);
|
|
// if (mr.r1 == r)
|
|
// {
|
|
// int editHeight = (int)mr.UserData;
|
|
// int cellHeight = GetCellHeight(mr.r1, mr.c1);
|
|
// if (editHeight < cellHeight)
|
|
// {
|
|
// myStepRTB.Rtf = (string)mr.Data;
|
|
// RTBAPI.SetSpaceBefore(myStepRTB, (cellHeight - editHeight) / 2);
|
|
// PutCellRTFString(mr.r1, mr.c1, myStepRTB.Rtf);
|
|
// }
|
|
// }
|
|
// }
|
|
//}
|
|
//public void VerticalTopText()
|
|
//{
|
|
// StepRTB myStepRTB = new StepRTB();
|
|
// CellRange selRange = this.Selection;
|
|
// for (int r = selRange.r1; r <= selRange.r2; r++)
|
|
// for (int c = selRange.c1; c <= selRange.c2; c++)
|
|
// {
|
|
// CellRange mr = this.GetMergedRange(r, c);
|
|
// if (mr.r1 == r)
|
|
// {
|
|
// myStepRTB.Rtf = (string)mr.Data;
|
|
// RTBAPI.SetSpaceBefore(myStepRTB, 0);
|
|
// PutCellRTFString(mr.r1, mr.c1, myStepRTB.Rtf);
|
|
// }
|
|
// }
|
|
//}
|
|
//public void VerticalBottomText()
|
|
//{
|
|
// StepRTB myStepRTB = new StepRTB();
|
|
// CellRange selRange = this.Selection;
|
|
// for (int r = selRange.r1; r <= selRange.r2; r++)
|
|
// for (int c = selRange.c1; c <= selRange.c2; c++)
|
|
// {
|
|
// CellRange mr = this.GetMergedRange(r, c);
|
|
// if (mr.r1 == r)
|
|
// {
|
|
// int editHeight = (int)mr.UserData;
|
|
// int cellHeight = GetCellHeight(mr.r1, mr.c1);
|
|
// if (editHeight < cellHeight)
|
|
// {
|
|
// myStepRTB.Rtf = (string)mr.Data;
|
|
// RTBAPI.SetSpaceBefore(myStepRTB, (cellHeight - editHeight));
|
|
// PutCellRTFString(mr.r1, mr.c1, myStepRTB.Rtf);
|
|
// }
|
|
// }
|
|
// }
|
|
//}
|
|
|
|
//public void SetupCellStyles()
|
|
//{
|
|
// //CellStyle cs;
|
|
|
|
// //cs = this.Styles.Add("Dotted");
|
|
// //cs.Border.Style = BorderStyleEnum.Dotted;
|
|
// //cs = this.Styles.Add("Double");
|
|
// //cs.Border.Style = BorderStyleEnum.Double;
|
|
// //cs = this.Styles.Add("Fillet");
|
|
// //cs.Border.Style = BorderStyleEnum.Fillet;
|
|
// //cs = this.Styles.Add("Flat");
|
|
// //cs.Border.Style = BorderStyleEnum.Flat;
|
|
// //cs = this.Styles.Add("Groove");
|
|
// //cs.Border.Style = BorderStyleEnum.Groove;
|
|
// //cs = this.Styles.Add("Inset");
|
|
// //cs.Border.Style = BorderStyleEnum.Inset;
|
|
// //cs = this.Styles.Add("None");
|
|
// //cs.Border.Style = BorderStyleEnum.None;
|
|
// //cs = this.Styles.Add("Raised");
|
|
// //cs.Border.Style = BorderStyleEnum.Raised;
|
|
// //cs = this.Styles.Add("CenterRight");
|
|
// //cs.TextAlign = TextAlignEnum.RightCenter; //.LeftCenter; // this is being ignored - probably due to RTF conversion
|
|
// //cs = this.Styles.Add("Yellow");
|
|
// //cs.BackColor = Color.Yellow;
|
|
// //cs = this.Styles.Add("Margins");
|
|
// //cs.Margins.Bottom = 5;
|
|
// //cs.Margins.Top = 10;
|
|
// //cs.Margins.Left = 15;
|
|
// //cs.Margins.Right = 20;
|
|
//}
|
|
#endregion //Grid and Cell Styles
|
|
|
|
#region Grid Size Adjustments
|
|
|
|
/// <summary>
|
|
/// Adjust the grid control size based on the cell sizes.
|
|
/// </summary>
|
|
public void AdjustGridControlSize()
|
|
{
|
|
if (Parent is GridItem ? (Parent as GridItem).Initializing : false ) return;
|
|
int difW = this.Width - this.ClientSize.Width;
|
|
int difH = this.Height - this.ClientSize.Height;
|
|
int wid = 0;
|
|
if (this != null)
|
|
{
|
|
foreach (C1.Win.C1FlexGrid.Column col in this.Cols)
|
|
wid += (col.Width >= 0) ? col.Width : this.Cols.DefaultSize;
|
|
|
|
int height = 0;
|
|
foreach (C1.Win.C1FlexGrid.Row row in this.Rows)
|
|
//height += (row.Height >= 0) ? row.Height : this.Rows.DefaultSize + 2;
|
|
height += (row.Height >= 0) ? row.Height : this.Rows.DefaultSize;
|
|
|
|
this.Size = new Size(wid + difW, height + difH);
|
|
}
|
|
}
|
|
|
|
public void ConvertTextCellToRTF(int r, int c)
|
|
{
|
|
StepRTB trtb = new StepRTB();
|
|
string tstr = null;
|
|
bool dummyCharWidth = false;
|
|
bool AllowWidthShrink = false;
|
|
trtb.SetTableGridCellRTFPrefix(this.Font);
|
|
trtb.Clear();
|
|
tstr = (string)this[r, c];
|
|
trtb.Font = this.Font;
|
|
if (tstr != null && tstr.Length > 0)
|
|
{
|
|
string tsave = tstr;
|
|
// regular text has special characters to toggle Bold, Underline, and Italics
|
|
// we need to subtract the width of these characters (allow column/row to shrink)
|
|
//AllowWidthShrink = RemoveBoldUlineItalicChars(trtb.Rtf);
|
|
AllowWidthShrink = tstr.Contains("#Link:");
|
|
// this will convert the special characters for Bold, Underline, and Italics
|
|
// into RTF commands
|
|
//trtb.Rtf = trtb.RtfPrefix + ConvertTableText(trtb.Rtf) + "}";
|
|
//string fromRTF = trtb.Rtf;
|
|
//string prefix = trtb.RtfPrefix;
|
|
//if (tstr.Contains("#Link:")) prefix += @"{\colortbl ;\red255\green0\blue0;}";
|
|
//if (tstr.Contains("#Link:"))
|
|
// Console.WriteLine("here");
|
|
//string jText = trtb.RtfPrefix + ConvertTableText(tstr) + @"\par}";
|
|
//trtb.Rtf = jText;
|
|
trtb.Rtf = trtb.RtfPrefix + ConvertTableText(tstr) + @"\par}";
|
|
//string fromStr = trtb.Rtf;
|
|
//if (fromRTF.Contains("SimSun"))
|
|
// Console.WriteLine("SimSun");
|
|
//else
|
|
// Compare(fromRTF, fromStr, tsave);
|
|
}
|
|
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;
|
|
}
|
|
|
|
this[r, c] = trtb.Rtf; // save the cleaned up and processed cell text as RTF
|
|
this.Select(r, c, false);
|
|
CellRange sel = this.Selection;
|
|
//sel.UserData = trtb.ContentsRectangle.Height;
|
|
|
|
// 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;
|
|
//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 + 2;
|
|
|
|
// if (newwidth > this.Cols[c].Width || AllowWidthShrink || r == 0)
|
|
// this.Cols[c].Width = newwidth;
|
|
// }
|
|
//}
|
|
//if (mrgrows && tstr != null)
|
|
//{
|
|
// CellRange cr = GetMergedRange(r, c);
|
|
// //Console.WriteLine("grid[{0},{1}] merge = {2}", r, c,cr);
|
|
// 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) ? _minRowHeight * 2 : h + _minRowHeight;
|
|
// h = (h == -1) ? (defH * 2) + 3 : h + defH;
|
|
// //h = (h == -1) ? (Rows.DefaultSize + 2) * 2 : h + Rows.DefaultSize + 2;
|
|
// //Console.WriteLine("3 Row {0} Old Height = {1}, New Height = {2}", cr.r1, Rows[cr.r1].Height, h);
|
|
// this.Rows[cr.r1].Height = h;
|
|
// nrows++;
|
|
// }
|
|
// }
|
|
//}
|
|
}
|
|
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;
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
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++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private int TotalColWidths()
|
|
{
|
|
int cwid = 0;
|
|
foreach (Column c in Cols)
|
|
{
|
|
cwid += ((c.Width > 0) ? c.Width : Cols.DefaultSize);
|
|
}
|
|
return cwid;
|
|
}
|
|
/// <summary>
|
|
/// This will adjust the column widths of the current table based upon the page width
|
|
/// Note: This is for use in creating a new table - not to process an existing table.
|
|
/// </summary>
|
|
/// <param name="pgWidthPoints"></param>
|
|
public void FitTableToPageWidth(int pgWidthPoints)
|
|
{
|
|
int grdWidth = TotalColWidths();
|
|
int pgwidth = (int)((pgWidthPoints / 72) * this._DPI);
|
|
|
|
if (grdWidth > pgwidth)
|
|
{
|
|
int difWid = grdWidth - pgwidth;
|
|
int colAdj = (difWid / Cols.Count) +(((difWid % Cols.Count) > 0) ? 1 : 0);
|
|
foreach (Column c in Cols)
|
|
{
|
|
int cwid = (c.Width > 0) ? c.Width : Cols.DefaultSize;
|
|
if ((cwid - colAdj) > 0)
|
|
c.Width = cwid - colAdj;
|
|
}
|
|
}
|
|
}
|
|
|
|
//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;
|
|
// }
|
|
|
|
// this.Select(r, c, false);
|
|
// CellRange sel = this.Selection;
|
|
|
|
// // Now see the the selected row,col is in the defined merge ranges
|
|
// 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 + 2;
|
|
|
|
// if (newwidth > 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 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;
|
|
// }
|
|
// }
|
|
// }
|
|
//}
|
|
|
|
#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
|
|
public void MakeRTFcells()
|
|
{
|
|
// This will spin through all the cells in the grid:
|
|
// - convert the text to RTF if needed
|
|
// - 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++)
|
|
this.ConvertTextCellToRTF(r, c);
|
|
}
|
|
|
|
TrimColumnWidths();
|
|
RemoveBlankSpaceFromRows();
|
|
SetupCellUserData();
|
|
this.AdjustGridControlSize();
|
|
}
|
|
|
|
public void FixTableCellsHeightWidth()
|
|
{
|
|
RemoveBlankSpaceFromColumns();
|
|
RemoveBlankSpaceFromRows();
|
|
}
|
|
|
|
private void RemoveBlankSpaceFromRows()
|
|
{
|
|
for (int r = 0; r < Rows.Count; r++)
|
|
{
|
|
Select(r, 0);
|
|
int blankRowSpace = BlankRowSpace();
|
|
if (blankRowSpace > 0)
|
|
Rows[r].Height -= blankRowSpace;
|
|
}
|
|
}
|
|
|
|
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 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;
|
|
|
|
// // Underline next word
|
|
// rtn += str.IndexOf(@"\'17");
|
|
|
|
// // Bold next word
|
|
// rtn += str.IndexOf(@"\'13");
|
|
|
|
// // Italics On
|
|
// rtn += str.IndexOf(@"\'1B4");
|
|
|
|
// // Italics Off
|
|
// rtn += str.IndexOf(@"\'1B5");
|
|
|
|
// // underline On
|
|
// rtn += str.IndexOf(@"\'ab");
|
|
// // underline Off
|
|
// rtn += str.IndexOf(@"\'bb");
|
|
|
|
// return rtn > 0;
|
|
|
|
//}
|
|
|
|
private string ConvertTableText(string str)
|
|
{
|
|
string rtn = str;
|
|
//ShowRawString(str, "ConvertTableText IN");
|
|
rtn = rtn.Replace(@"START]\v0", @"START]\cf1\v0");
|
|
rtn = rtn.Replace(@"\v #Link:", @"\cf0\v #Link:");
|
|
rtn = rtn.Replace("\n", "\\par\r\n");
|
|
rtn = rtn.Replace("\xB3", @"\f1\u9474?\f0"); // Vert Bar
|
|
rtn = rtn.Replace("\xF2", @"\f1\u8805?\f0 "); // greater than or equal
|
|
rtn = rtn.Replace("\x7F", @"\f1\u916?\f0 "); // delta
|
|
rtn = rtn.Replace("\xF3", @"\f1\u8804?\f0 "); // less than or equal
|
|
rtn = rtn.Replace("\xE4", @"\f1\u931?\f0 "); // sigma
|
|
rtn = rtn.Replace("\xE7", @"\f1\u947?\f0 "); // gamma
|
|
rtn = rtn.Replace("\xFE", @"\f1\u9604?\f0 "); // accum 2584
|
|
rtn = rtn.Replace("\x7", @"\f1\u9679?\f0 "); // bullet 25CF
|
|
rtn = rtn.Replace("\xF7", @"\f1\u8776?\f0 "); // approx eq
|
|
rtn = rtn.Replace("\xF0", @"\f1\u8773?\f0 "); // similar eq 2245
|
|
rtn = rtn.Replace("\xFB", @"\f1\u8730?\f0 "); // square root
|
|
rtn = rtn.Replace("\xE2", @"\f1\u961?\f0 "); // rho 3C1
|
|
rtn = rtn.Replace("\xE3", @"\f1\u960?\f0 "); // pi
|
|
rtn = rtn.Replace("\xE6", @"\f1\u956?\f0 "); // micro
|
|
rtn = rtn.Replace("\xEB", @"\f1\u948?\f0 "); // lower case delta
|
|
rtn = rtn.Replace("\xE5", @"\f1\u963?\f0 "); // lower case sigma
|
|
rtn = rtn.Replace("\x90", @"\f1\u274?\f0 "); // energy, 112
|
|
rtn = rtn.Replace("\xEE", @"\f1\u949?\f0 "); // epsilon
|
|
rtn = rtn.Replace("\xE9", @"\f1\u952?\f0 "); // theta, 3B8
|
|
rtn = rtn.Replace("\xEC", @"\f1\u8857?\f0 "); // dot in oval, 2299
|
|
rtn = rtn.Replace("\xA8", @"\f1\u964?\f0 "); // tau, 3C4
|
|
rtn = rtn.Replace("\xA9", @"\f1\u9830?\f0 "); // diamond, 2666
|
|
rtn = rtn.Replace("\x18", @"\f1\u8593?\f0 "); // Up Arrow
|
|
rtn = rtn.Replace("\x19", @"\f1\u8595?\f0 "); // Down Arrow
|
|
rtn = rtn.Replace("\xFF", @"\u160?"); // hardspace
|
|
//rtn = rtn.Replace(@"\'a0", @"\u160?");
|
|
//rtn = rtn.Replace("\xff", @"\u160?");
|
|
//rtn = rtn.Replace("\xA0", @"\u160?");
|
|
// underline On
|
|
rtn = rtn.Replace("\xab", @"\ul");
|
|
// underline Off
|
|
rtn = rtn.Replace("\xbb", @"\ulnone");
|
|
//rtn = rtn.Replace("\xef\xe6", @"\up2 ");
|
|
//rtn = rtn.Replace("\xef\xe7", @"\up0 ");
|
|
rtn = rtn.Replace("\x9566", @"\up2 ");
|
|
rtn = rtn.Replace("\x9567", @"\up0 ");
|
|
rtn = rtn.Replace("{", @"\{");
|
|
rtn = rtn.Replace("}", @"\}");
|
|
rtn = rtn.Replace("\xd5", @"\b");
|
|
rtn = rtn.Replace("\xd6", @"\b0");
|
|
|
|
//ShowRawString(rtn, "ConvertTableText OUT");
|
|
return rtn;
|
|
}
|
|
|
|
private static string SomethingNextWord(string str, string nxtwordcmd, string cmdOn, string cmdOff)
|
|
{
|
|
string rtn = "";
|
|
int bidx = 0;
|
|
int fidx = str.IndexOf(nxtwordcmd, bidx);
|
|
char[] term = " \r\n\x02".ToCharArray();
|
|
while (fidx > 0)
|
|
{
|
|
rtn += str.Substring(bidx, fidx - bidx) + cmdOn;
|
|
bidx = fidx + 4;
|
|
|
|
if (bidx < str.Length)
|
|
{
|
|
fidx = str.IndexOfAny(term, bidx);
|
|
if (fidx > 0)
|
|
{
|
|
rtn += str.Substring(bidx, fidx - bidx) + cmdOff + str.Substring(fidx, 1);
|
|
bidx = fidx + 1;
|
|
}
|
|
}
|
|
|
|
if (bidx < str.Length)
|
|
fidx = str.IndexOf(nxtwordcmd, bidx);
|
|
else
|
|
fidx = -1;
|
|
}
|
|
if (bidx < str.Length)
|
|
rtn += str.Substring(bidx);
|
|
|
|
return rtn;
|
|
}
|
|
|
|
private void _StartEdit(object sender, C1.Win.C1FlexGrid.RowColEventArgs e)
|
|
{
|
|
// start editing the cell with the custom editor
|
|
_tableCellEditor.StartEditing(e.Row, e.Col);
|
|
e.Cancel = true;
|
|
}
|
|
|
|
// after edit handler (built-in editors)
|
|
private void _AfterEdit(object sender, C1.Win.C1FlexGrid.RowColEventArgs e)
|
|
{
|
|
this.GetCellRange(e.Row, e.Col).Style.ForeColor = Color.Black;
|
|
this.AdjustGridControlSize();
|
|
}
|
|
|
|
// if the custom editor is visible, make it follow the cell being edited
|
|
private void _AfterScroll(object sender, C1.Win.C1FlexGrid.RangeEventArgs e)
|
|
{
|
|
this._tableCellEditor.UpdatePosition();
|
|
}
|
|
|
|
// save last key pressed for the custom editor
|
|
private void _KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
|
|
{
|
|
this._tableCellEditor.SetPendingKey(e.KeyChar);
|
|
}
|
|
|
|
public string GetCellRTFString(int row, int col)
|
|
{
|
|
string rtnstr = "";
|
|
foreach (CellRange r in this.MergedRanges)
|
|
{
|
|
if (r.ContainsRow(row) && r.ContainsCol(col))
|
|
{
|
|
rtnstr = (string)this[r.r1, r.c1];
|
|
return rtnstr;
|
|
}
|
|
}
|
|
rtnstr = (string)this[row, col];
|
|
return rtnstr;
|
|
}
|
|
|
|
public void PutCellRTFString(int row, int col, string str)
|
|
{
|
|
foreach (CellRange r in this.MergedRanges)
|
|
{
|
|
if (r.ContainsRow(row) && r.ContainsCol(col))
|
|
{
|
|
this[r.r1, r.c1] = str;
|
|
return;
|
|
}
|
|
}
|
|
this[row, col] = str;
|
|
return;
|
|
}
|
|
public void ClearSelectedCellText()
|
|
{
|
|
CellRange cr = this.Selection;
|
|
cr.Clear(ClearFlags.Content);
|
|
}
|
|
public void SetupCellUserData()
|
|
{
|
|
for (int r = 0; r < Rows.Count; r++)
|
|
for (int c = 0; c < Cols.Count; c++)
|
|
{
|
|
string rtfText = GetDataDisplay(r, c);
|
|
if (rtfText.StartsWith(@"{\rtf"))
|
|
{
|
|
RTF _rtf = new RTF();
|
|
_rtf.Width = Cols[c].Width;
|
|
_rtf.Rtf = rtfText;
|
|
CellRange cr = GetCellRange(r, c);
|
|
cr.UserData = _rtf.ContentsRectangle.Height;
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion //Cell Text
|
|
|
|
#region Merged / Split Range
|
|
|
|
public void MergeSelection()
|
|
{
|
|
this.MergedRanges.Add(this.Selection,true);
|
|
this.Invalidate();
|
|
}
|
|
public bool IsInMergeRange()
|
|
{
|
|
C1.Win.C1FlexGrid.CellRange sel = GetMergedRange(this.Selection.r1, this.Selection.c1);
|
|
return MergedRanges.Contains(sel);
|
|
}
|
|
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);
|
|
//Console.WriteLine("SplitSelection myselection {0}", MySelection);
|
|
//foreach (CellRange sel in MySelection)
|
|
//{
|
|
// //Console.WriteLine("SplitSelection foreach sel {0}", sel);
|
|
// if (sel.IsSingleCell)
|
|
// this.MergedRanges.Remove(sel);
|
|
// if (!(this.MergedRanges.Contains(sel)) && !didit)
|
|
// if (bSplitCols)
|
|
// SplitSelectionColumns();
|
|
// else
|
|
// SplitSelectionRows();
|
|
// didit = true;
|
|
//}
|
|
if (bSplitCols)
|
|
SplitSelectionColumns();
|
|
else
|
|
SplitSelectionRows();
|
|
//Debug_WritelineMySelection();
|
|
//foreach (CellRange sel in MySelection)
|
|
//{
|
|
// //Console.WriteLine("SplitSelection foreach sel {0}", sel);
|
|
// if (this.MergedRanges.Contains(sel))
|
|
// SplitMergedRange(sel, bSplitCols);
|
|
//}
|
|
//this.Refresh();
|
|
//RefreshMergeRangeCollection();
|
|
this.AdjustGridControlSize();
|
|
}
|
|
|
|
private void SplitMergedRange(CellRange sel, bool bSplitCols)
|
|
{
|
|
int sR = sel.r1;
|
|
int eR = sel.r2;
|
|
int sC = sel.c1;
|
|
int eC = sel.c2;
|
|
if (bSplitCols && (IsMergedCols(sel) && !IsMergedRows(sel)) ||
|
|
(!bSplitCols && (IsMergedRows(sel) && !IsMergedCols(sel))))
|
|
MergedRanges.Remove(sel);
|
|
else
|
|
{
|
|
CellRange saveSelection = Selection;
|
|
if (bSplitCols && IsMergedRows(sel))
|
|
{
|
|
MergedRanges.Remove(sel);
|
|
for (int c = sC; c <= eC; c++)
|
|
{
|
|
Select(sR, c, eR, c);
|
|
MergeSelection();
|
|
}
|
|
}
|
|
else if (!bSplitCols && IsMergedCols(sel))
|
|
{
|
|
MergedRanges.Remove(sel);
|
|
for (int r = sR; r <= eR; r++)
|
|
{
|
|
Select(r, sC, r, eC);
|
|
MergeSelection();
|
|
}
|
|
}
|
|
Select(saveSelection);
|
|
}
|
|
}
|
|
private bool IsMergedRows(CellRange sel)
|
|
{
|
|
return (sel.r1 != sel.r2);
|
|
}
|
|
private bool IsMergedCols(CellRange sel)
|
|
{
|
|
return (sel.c1 != sel.c2);
|
|
}
|
|
private void SplitSelectionColumns()
|
|
{
|
|
bool hasNonMergedColumn = false;
|
|
//Console.WriteLine("SplitSelectionColumns this.selection {0}", this.Selection);
|
|
//Debug_WritelineMySelection();
|
|
CellRange cr = this.Selection;
|
|
int numSelCols = (cr.c2 - cr.c1) + 1;
|
|
foreach (CellRange sel in MySelection)
|
|
{
|
|
if (!this.MergedRanges.Contains(sel))
|
|
hasNonMergedColumn = true;
|
|
else
|
|
{
|
|
CellRange mr = GetMergedRange(sel.r1, sel.c1);
|
|
if (mr.c1 == mr.c2)
|
|
hasNonMergedColumn = true;
|
|
}
|
|
}
|
|
// for each column in the selection, add a new column
|
|
if (hasNonMergedColumn)
|
|
{
|
|
for (int c = cr.c2; c >= cr.c1; c--)
|
|
{
|
|
Select(cr.r1, c, cr.r2, c);
|
|
InsertColumnAfter();
|
|
}
|
|
}
|
|
// include new columns in selection
|
|
this.Select(cr.r1, cr.c1, cr.r2, cr.c2 + ((hasNonMergedColumn) ? numSelCols : 0));
|
|
//if a merged range is part of the selectin, try to split it
|
|
foreach (CellRange sel in MySelection)
|
|
{
|
|
//Console.WriteLine("SplitSelection foreach sel {0}", sel);
|
|
if (this.MergedRanges.Contains(sel))
|
|
SplitMergedRange(sel, true);
|
|
}
|
|
cr = this.Selection;
|
|
if (hasNonMergedColumn)
|
|
{
|
|
for (int r = 0; r < this.Rows.Count; r++)
|
|
for (int c = cr.c1; c <= cr.c2; c += 2)
|
|
{
|
|
if (!this.IsCellSelected(r, c))
|
|
{
|
|
CellRange crTmp = GetMergedRange(r, c);
|
|
if (crTmp.IsSingleCell)
|
|
{
|
|
CellRange tcr = this.GetCellRange(r, c, r, c + 1);
|
|
this.MergedRanges.Add(tcr);
|
|
this.Invalidate();
|
|
}
|
|
//CellRange tcr = this.GetCellRange(r, c, r, c + 1);
|
|
//this.MergedRanges.Add(tcr);
|
|
}
|
|
}
|
|
// Adjust selected column widths
|
|
for (int c = cr.c1; c <= cr.c2; c++)
|
|
{
|
|
int recWidth = (Cols[c].Width < 0) ? Cols.DefaultSize : Cols[c].Width; // this.GetCellRect(cr.r1, c).Width;
|
|
int newWidth = Math.Max(recWidth / 2, _minColSplitWidth);
|
|
this.Cols[c].Width = newWidth;
|
|
//Console.WriteLine("Cell[{0},{1}].Width = {2}", cr.r1, c, recWidth);
|
|
//Console.WriteLine("Cell[{0},{1}].NewWidth = {2}", cr.r1, c, newWidth);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void SplitSelectionRows()
|
|
{
|
|
bool hasNonMergedRow = false;
|
|
CellRange cr = this.Selection;
|
|
int numSelRows = (cr.r2 - cr.r1) + 1;
|
|
//Console.WriteLine("numSelRows = {0}", numSelRows);
|
|
//Console.WriteLine("Inital Selection [{0},{1}] - [{2},{3}]", cr.r1, cr.c1, cr.r2, cr.c2);
|
|
foreach (CellRange sel in MySelection)
|
|
{
|
|
if (!this.MergedRanges.Contains(sel))
|
|
hasNonMergedRow = true;
|
|
else
|
|
{
|
|
CellRange mr = GetMergedRange(sel.r1, sel.c1);
|
|
if (mr.r1 == mr.r2)
|
|
hasNonMergedRow = true;
|
|
}
|
|
}
|
|
// for each row in the selection, add a new row
|
|
if (hasNonMergedRow)
|
|
{
|
|
for (int r = cr.r2; r >= cr.r1; r--)
|
|
{
|
|
//Console.WriteLine("Inserted new Row at [{0},{1}]", r, cr.c1);
|
|
Select(r, cr.c1, r, cr.c2);
|
|
InsertRowAfter();
|
|
}
|
|
}
|
|
// include new rows in selection
|
|
this.Select(cr.r1, cr.c1, cr.r2 + numSelRows, cr.c2);
|
|
//if a merged range is part of the selectin, try to split it
|
|
foreach (CellRange sel in MySelection)
|
|
{
|
|
//Console.WriteLine("SplitSelection foreach sel {0}", sel);
|
|
if (this.MergedRanges.Contains(sel))
|
|
SplitMergedRange(sel, false);
|
|
}
|
|
cr = this.Selection;
|
|
//Console.WriteLine(" After Insert [{0},{1}] - [{2},{3}]", cr.r1, cr.c1, cr.r2, cr.c2);
|
|
if (hasNonMergedRow)
|
|
{
|
|
for (int c = 0; c < this.Cols.Count; c++)
|
|
for (int r = cr.r1; r <= cr.r2; r += 2)
|
|
{
|
|
if (!this.IsCellSelected(r, c))
|
|
{
|
|
CellRange crTmp = GetMergedRange(r, c);
|
|
if (crTmp.IsSingleCell)
|
|
{
|
|
CellRange tcr = this.GetCellRange(r, c, r + 1, c);
|
|
this.MergedRanges.Add(tcr);
|
|
this.Invalidate();
|
|
}
|
|
}
|
|
}
|
|
// Adjust selected Row Heights
|
|
for (int r = cr.r1; r <= cr.r2; r++)
|
|
{
|
|
int recHeight = this.GetCellRect(r, cr.c1).Height;
|
|
this.Rows[r].Height = Math.Max(recHeight / 2, Rows.DefaultSize);
|
|
//this.Rows[r].Height = Math.Max(recHeight / 2, _minRowSplitHeight);
|
|
//Console.WriteLine("Cell[{0},{1}].Height = {2}", r, cr.c1, recHeight);
|
|
}
|
|
}
|
|
//foreach (CellRange crng in this.MergedRanges)
|
|
// Console.WriteLine("merge ranges [{0},{1}] - [{2},{3}]", crng.r1, crng.c1, crng.r2, crng.c2);
|
|
}
|
|
|
|
private void AdjustMergedRows(int row, bool above, bool removing)
|
|
{
|
|
CellRangeCollection crc = new CellRangeCollection(this);
|
|
if (removing)
|
|
{
|
|
foreach (CellRange r in this.MergedRanges)
|
|
{
|
|
CellRange cr = r;
|
|
if (r.ContainsRow(row))
|
|
{
|
|
if (r.TopRow != r.BottomRow)
|
|
{
|
|
cr.r2--;
|
|
crc.Add(cr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (row <= r.r1)
|
|
{
|
|
if (row < r.r1)
|
|
cr.r1--;
|
|
cr.r2--;
|
|
}
|
|
crc.Add(cr);
|
|
}
|
|
}
|
|
}
|
|
else // adding
|
|
foreach (CellRange r in this.MergedRanges)
|
|
{
|
|
CellRange cr = r;
|
|
int inspos = (above) ? row : row - 1;
|
|
if (r.ContainsRow(inspos))
|
|
{
|
|
if ((above && cr.r1 == inspos) || (!above && cr.r2 == inspos))
|
|
{
|
|
string tstr = "";
|
|
int newrow = 0;
|
|
if (above)
|
|
{
|
|
if (this[cr.r1 + 1, cr.c1] != null)
|
|
tstr = this[cr.r1 + 1, cr.c1].ToString();
|
|
newrow = cr.r1;
|
|
}
|
|
else
|
|
{
|
|
if (this[cr.r2, cr.c1] != null)
|
|
tstr = this[cr.r2, cr.c1].ToString();
|
|
newrow = cr.r2 + 1;
|
|
}
|
|
if (tstr != null && tstr.Length > 0)
|
|
for (int x = cr.c1; x <= cr.c2; x++)
|
|
this[newrow, x] = tstr;
|
|
}
|
|
cr.r2++;
|
|
}
|
|
else
|
|
{
|
|
if (inspos < cr.r1)
|
|
{
|
|
cr.r1++;
|
|
cr.r2++;
|
|
}
|
|
}
|
|
crc.Add(cr);
|
|
}
|
|
this.MergedRanges.Clear();
|
|
foreach (CellRange r in crc)
|
|
{
|
|
if ((r.r1 != r.r2) || (r.c1 != r.c2))
|
|
this.MergedRanges.Add(r);
|
|
}
|
|
}
|
|
|
|
private void AdjustMergedColumns(int col, bool left, bool removing)
|
|
{
|
|
CellRangeCollection crc = new CellRangeCollection(this);
|
|
if (removing)
|
|
{
|
|
foreach (CellRange r in this.MergedRanges)
|
|
{
|
|
CellRange cr = r;
|
|
if (r.ContainsCol(col))
|
|
{
|
|
if (r.LeftCol != r.RightCol)
|
|
{
|
|
cr.c2--;
|
|
crc.Add(cr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (col < cr.c1)
|
|
{
|
|
cr.c1--;
|
|
cr.c2--;
|
|
}
|
|
crc.Add(cr);
|
|
}
|
|
}
|
|
}
|
|
else // adding
|
|
foreach (CellRange r in this.MergedRanges)
|
|
{
|
|
CellRange cr = r;
|
|
int inspos = (left) ? col : col - 1;
|
|
if (r.ContainsCol(inspos))
|
|
{
|
|
string tstr = "";
|
|
int newcol = 0;
|
|
if (left)
|
|
{
|
|
if (inspos == cr.c1)
|
|
tstr = (this[cr.r1, cr.c1 + 1] == null)?"":this[cr.r1, cr.c1 + 1].ToString();
|
|
else
|
|
tstr = (this[cr.r1, cr.c1] == null) ? "" : this[cr.r1, cr.c1].ToString();
|
|
newcol = cr.c1;
|
|
}
|
|
else
|
|
{
|
|
if (this[cr.r1, cr.c2] != null)
|
|
tstr = this[cr.r1, cr.c2].ToString();
|
|
newcol = cr.c2 + 1;
|
|
}
|
|
for (int x = cr.r1; x <= cr.r2; x++)
|
|
this[x, newcol] = tstr;
|
|
|
|
cr.c2++;
|
|
}
|
|
else if (col <= r.c1)
|
|
{
|
|
cr.c1++;
|
|
cr.c2++;
|
|
}
|
|
crc.Add(cr);
|
|
}
|
|
this.MergedRanges.Clear();
|
|
foreach (CellRange r in crc)
|
|
{
|
|
if ((r.r1 != r.r2) || (r.c1 != r.c2))
|
|
this.MergedRanges.Add(r);
|
|
}
|
|
}
|
|
|
|
private bool RowIsInMergeRange(int row)
|
|
{
|
|
bool rtn = false;
|
|
if (row >= 0)
|
|
{
|
|
CellRange cr = this.Selection;
|
|
rtn = true;
|
|
int c = cr.c1;
|
|
while (rtn && (c <= cr.c2))
|
|
{
|
|
int idx = this.MergedRanges.IndexOf(row, c);
|
|
rtn = (idx > -1);
|
|
c++;
|
|
}
|
|
}
|
|
return rtn;
|
|
}
|
|
|
|
private bool ColIsInMergeRange(int col)
|
|
{
|
|
bool rtn = false;
|
|
if (col >= 0)
|
|
{
|
|
CellRange cr = this.Selection;
|
|
//rtn = true;
|
|
int r = cr.r1;
|
|
while (!rtn && (r <= cr.r2))
|
|
{
|
|
int idx = this.MergedRanges.IndexOf(col, r);
|
|
rtn = (idx > -1);
|
|
r++;
|
|
}
|
|
}
|
|
return rtn;
|
|
}
|
|
|
|
#endregion //Merged / Split Range
|
|
|
|
#region Grid Add and Remove Row / Column
|
|
|
|
private int GetRowInsertPosition(Boolean before)
|
|
{
|
|
int rtnrow;
|
|
CellRange selcr = this.Selection;
|
|
CellRange cr = selcr;
|
|
int idx = this.MergedRanges.IndexOf(cr.r1, cr.c2);
|
|
if (idx > -1)
|
|
cr = this.MergedRanges[idx]; // we want first or last row in merge range
|
|
rtnrow = (before) ? cr.r1 : cr.r2;
|
|
// The following is an adjustment needed when we are copying an entire row that includes some merged cells
|
|
if (selcr.c1 != selcr.c2)
|
|
{
|
|
while (!before && rtnrow > selcr.r2) rtnrow--;
|
|
while (before && rtnrow < selcr.r2) rtnrow++;
|
|
}
|
|
|
|
return rtnrow;
|
|
}
|
|
|
|
private int GetColInsertPosition(Boolean before)
|
|
{
|
|
int rtncol;
|
|
CellRange selcr = this.Selection;
|
|
CellRange cr = selcr;
|
|
int idx = this.MergedRanges.IndexOf(cr.r1, cr.c2);
|
|
if (idx > -1)
|
|
cr = this.MergedRanges[idx]; // we want the first of last col in merge range
|
|
rtncol = (before) ? cr.c1 : cr.c2;
|
|
// The following is an adjustment needed when we are copying an entire column that includes some merged cells
|
|
if (selcr.r1 != selcr.r2)
|
|
{
|
|
while (!before && rtncol > selcr.c2) rtncol--;
|
|
while (before && rtncol < selcr.c2) rtncol++;
|
|
}
|
|
return rtncol;
|
|
}
|
|
|
|
public void InsertColumnBefore()
|
|
{
|
|
int newcol = this.GetColInsertPosition(true);
|
|
this.Cols.Insert(newcol);
|
|
// set new column width to same width as column from where it was inserted
|
|
this.Cols[newcol].Width = this.Cols[newcol + 1].Width;
|
|
MyBorders.InsertColumn(newcol);
|
|
this.AdjustMergedColumns(newcol, true, false);
|
|
this.AdjustGridControlSize();
|
|
}
|
|
|
|
public void InsertColumnAfter()
|
|
{
|
|
int colidx = this.GetColInsertPosition(false);
|
|
if (colidx == this.Cols.Count - 1) // last column
|
|
this.Cols.Add(1);
|
|
else
|
|
this.Cols.Insert(colidx + 1);
|
|
MyBorders.InsertColumn(colidx);
|
|
// set new column width to same width as column from where it was inserted
|
|
this.Cols[colidx + 1].Width = this.Cols[colidx].Width;
|
|
this.AdjustMergedColumns(colidx + 1, false, false);
|
|
this.AdjustGridControlSize();
|
|
}
|
|
|
|
public void InsertRowBefore()
|
|
{
|
|
int newrow = this.GetRowInsertPosition(true);
|
|
this.Rows.Insert(newrow);
|
|
// set new row Height to same heidht as row from where it was inserted
|
|
this.Rows[newrow].Height = (Rows[newrow + 1].Height == -1) ? Rows.DefaultSize : Rows[newrow + 1].Height;
|
|
//this.Rows[newrow].Height = this.Rows[newrow + 1].Height;
|
|
MyBorders.InsertRow(newrow);
|
|
this.AdjustMergedRows(newrow, true, false);
|
|
this.AdjustGridControlSize();
|
|
}
|
|
|
|
public void InsertRowAfter()
|
|
{
|
|
int rowidx = this.GetRowInsertPosition(false);
|
|
if (rowidx == this.Rows.Count - 1) // last row
|
|
this.Rows.Add(1);
|
|
else
|
|
this.Rows.Insert(rowidx + 1);
|
|
// set new row Height to same heidht as row from where it was inserted
|
|
this.Rows[rowidx + 1].Height = (Rows[rowidx].Height == -1) ? Rows.DefaultSize : Rows[rowidx].Height;
|
|
//this.Rows[rowidx + 1].Height = this.Rows[rowidx].Height;
|
|
MyBorders.InsertRow(rowidx + 1);
|
|
this.AdjustMergedRows(rowidx + 1, false, false);
|
|
this.AdjustGridControlSize();
|
|
}
|
|
|
|
public void RemoveSelectedColumn()
|
|
{
|
|
string msg = "";
|
|
string title = "";
|
|
CellRange saveCR = Selection;
|
|
this.SelectionMode = SelectionModeEnum.ColumnRange;
|
|
//this.Select(this.Selection.r1, this.Selection.c1);
|
|
this.Select(0,Selection.c1,Rows.Count-1,Selection.c2);
|
|
this.SelectionMode = SelectionModeEnum.Default;
|
|
if (Selection.c1 != Selection.c2)
|
|
{
|
|
msg = "Remove selected columns?";
|
|
title = "Delete Columns";
|
|
}
|
|
else
|
|
{
|
|
msg = "Remove this column?";
|
|
title = "Delete Column";
|
|
}
|
|
DialogResult dr = MessageBox.Show(msg, title, MessageBoxButtons.YesNo);
|
|
if (dr == DialogResult.Yes)
|
|
RemoveSelectedCells();//RemoveColumns(this.Selection.r1, this.Selection.c1, 1);
|
|
else
|
|
Select(saveCR);
|
|
}
|
|
|
|
public void RemoveSelectedRow()
|
|
{
|
|
string msg = "";
|
|
string title = "";
|
|
CellRange saveCR = Selection;
|
|
this.SelectionMode = SelectionModeEnum.RowRange;
|
|
//this.Select(this.Selection.r1, this.Selection.c1,);
|
|
this.Select(Selection.r1,0,Selection.r2,Cols.Count-1);
|
|
this.SelectionMode = SelectionModeEnum.Default;
|
|
if (Selection.r1 != Selection.r2)
|
|
{
|
|
msg = "Remove selected rows?";
|
|
title = "Delete Rows";
|
|
}
|
|
else
|
|
{
|
|
msg = "Remove this row?";
|
|
title = "Delete Row";
|
|
}
|
|
DialogResult dr = MessageBox.Show(msg, title, MessageBoxButtons.YesNo);
|
|
if (dr == DialogResult.Yes)
|
|
this.RemoveSelectedCells();//this.RemoveRows(this.Selection.r1, this.Selection.c1, 1);
|
|
else
|
|
Select(saveCR);
|
|
}
|
|
|
|
private void RemoveRows(int strow, int stcol, int cnt)
|
|
{
|
|
bool mergedRow = false;
|
|
for (int i = 0; i < cnt; i++)
|
|
{
|
|
//if (this.RowIsInMergeRange(strow))
|
|
//{
|
|
for (int cl = 0; cl < this.Cols.Count && !mergedRow; cl++)
|
|
{
|
|
int idx = this.MergedRanges.IndexOf(strow, cl);
|
|
if (idx > -1)
|
|
{
|
|
CellRange cr = this.MergedRanges[idx];
|
|
if (cr.r1 < cr.r2)
|
|
mergedRow = true;
|
|
//this[cr.r1 + 1, cr.c1] = this[cr.r1, cr.c1];
|
|
}
|
|
cl++;
|
|
}
|
|
//}
|
|
this.Rows.Remove(strow);
|
|
this.AdjustMergedRows(strow, false, true);
|
|
//if (mergedRow)
|
|
//{
|
|
//cnt++;
|
|
mergedRow = false;
|
|
//}
|
|
}
|
|
MyBorders.DeleteRows(strow, cnt);
|
|
this.AdjustGridControlSize();
|
|
}
|
|
|
|
private void RemoveColumns(int strow, int stcol, int cnt)
|
|
{
|
|
bool mergedCol = false;
|
|
for (int i = 0; i < cnt; i++)
|
|
{
|
|
//if (this.ColIsInMergeRange(stcol))
|
|
//{
|
|
for (int rw = 0; rw < this.Rows.Count && !mergedCol; rw++)
|
|
{
|
|
int idx = this.MergedRanges.IndexOf(rw, stcol);
|
|
if (idx > -1)
|
|
{
|
|
CellRange cr = this.MergedRanges[idx];
|
|
if (cr.c1 < cr.c2)
|
|
mergedCol = true;
|
|
//this[cr.r1, cr.c1 + 1] = this[cr.r1, cr.c1];
|
|
}
|
|
}
|
|
//}
|
|
this.Cols.Remove(stcol);
|
|
this.AdjustMergedColumns(stcol, false, true);
|
|
//if (mergedCol)
|
|
//{
|
|
// //cnt++;
|
|
mergedCol = false;
|
|
//}
|
|
}
|
|
MyBorders.DeleteColumns(stcol, cnt);
|
|
this.AdjustGridControlSize();
|
|
}
|
|
|
|
public void RemoveSelectedCells()
|
|
{
|
|
bool didremove = false;
|
|
int lastRow = this.Rows.Count - 1;
|
|
int lastCol = this.Cols.Count - 1;
|
|
CellRange cr = this.Selection;
|
|
|
|
// r2 is last row (or in merge range containing last row)
|
|
// r1 is first row or r1-m (m is in merge range) is first row
|
|
// we can remove columns c1 through c2
|
|
|
|
int idx = this.MergedRanges.IndexOf(cr.r2, cr.c2);
|
|
CellRange mr = new CellRange();
|
|
if (idx > -1) mr = this.MergedRanges[idx];
|
|
if (cr.r2 == lastRow || idx > -1 && mr.r2 == lastRow)//RowIsInMergeRange(grd,cr.r2))
|
|
{
|
|
if (cr.r1 == 0 || this.RowIsInMergeRange(cr.r1 - 1))
|
|
{
|
|
this.RemoveColumns(cr.r1, cr.c1, cr.RightCol - cr.LeftCol + 1);// remove selected columns
|
|
didremove = true;
|
|
}
|
|
}
|
|
|
|
|
|
// c2 is last column (or in merge range containing last column)
|
|
// c1 is first column or c1-m (m is merge range) is first column
|
|
// we can remove rows r1 through r2
|
|
|
|
if (cr.c2 == lastCol || idx > -1 && mr.c2 == lastCol)//ColIsInMergeRange(grd,cr.c1-1))
|
|
{
|
|
if (cr.c1 == 0 || this.ColIsInMergeRange(cr.c1 - 1))
|
|
{
|
|
// remove selected rows
|
|
this.RemoveRows(cr.r1, cr.c1, cr.BottomRow - cr.TopRow + 1);
|
|
didremove = true;
|
|
}
|
|
}
|
|
|
|
if (!didremove)
|
|
MessageBox.Show("Cannot Removed Part of a Row or Column.\n\nNote: This function allows you to delete one or more rows/columns at time.", "Invalid Selection",MessageBoxButtons.OK,MessageBoxIcon.Hand);
|
|
|
|
return;
|
|
}
|
|
|
|
#endregion //Grid Add and Remove Row / Column
|
|
|
|
#region Copy/Paste
|
|
|
|
public void CopyRow()
|
|
{
|
|
DialogResult dr = DialogResult.Yes;
|
|
SelectRow();
|
|
if (Selection.r1 != Selection.r2)
|
|
{
|
|
//dr = MessageBox.Show("You selected a row that includes merged cells.\n\nThese additional rows must be included.\n\nCopy these rows?", "Copy Rows", MessageBoxButtons.YesNo);
|
|
dr = MessageBox.Show("Your selection was expanded due to merged cell regions.\n\nContinue with the copy?", "Copy Rows", MessageBoxButtons.YesNo);
|
|
}
|
|
if (dr == DialogResult.Yes)
|
|
CopyToCopiedFlexGrid(GridCopyOption.Row);
|
|
}
|
|
|
|
public void CopyColumn()
|
|
{
|
|
SelectCol();
|
|
DialogResult dr = DialogResult.Yes;
|
|
if (Selection.c1 != Selection.c2)
|
|
{
|
|
//dr = MessageBox.Show("You selected a column that includes merged cells.\n\nThese additional columns must be included.\n\nCopy these columns?", "Copy Columns", MessageBoxButtons.YesNo);
|
|
dr = MessageBox.Show("Your selection was expanded due to merged cell regions.\n\nContinue with the copy?", "Copy Columns", MessageBoxButtons.YesNo);
|
|
}
|
|
if (dr == DialogResult.Yes)
|
|
CopyToCopiedFlexGrid(GridCopyOption.Column);
|
|
}
|
|
|
|
public void CopyCellSelection()
|
|
{
|
|
DialogResult dr = DialogResult.Yes;
|
|
CellRange cr = Selection;
|
|
MakeSelectionEven();
|
|
if (!cr.Equals(Selection))
|
|
{
|
|
dr = MessageBox.Show("Your selection was expanded due to merged cell regions.\n\nContinue with the copy?", "Copy Selection", MessageBoxButtons.YesNo);
|
|
}
|
|
if (dr == DialogResult.Yes)
|
|
CopyToCopiedFlexGrid(GridCopyOption.Selection);
|
|
}
|
|
|
|
public enum enmPastePos : int
|
|
{
|
|
Before = 1, Replace = 0, After = -1
|
|
}
|
|
|
|
public void PasteRows(enmPastePos pp)
|
|
{
|
|
if (MyCopyInfo.MyCopiedFlexGrid == null || MyCopyInfo.MyCopyOption != GridCopyOption.Row) return;
|
|
int rowsToAdd = MyCopyInfo.MyCopiedCellRange.r2 - MyCopyInfo.MyCopiedCellRange.r1 + 1;
|
|
int colsToAdd = Math.Max((MyCopyInfo.MyCopiedCellRange.c2 - MyCopyInfo.MyCopiedCellRange.c1 + 1) - Cols.Count, 0);
|
|
int rowOffset = Selection.r1 + (pp == enmPastePos.After ? 1 : 0) - MyCopyInfo.MyCopiedCellRange.r1;
|
|
int selR1 = Selection.r1;
|
|
|
|
// If the rows we are copying has more columns than the current table, then append then needed columns to the grid
|
|
if (colsToAdd > 0)
|
|
{
|
|
Cols.Add(colsToAdd);
|
|
AdjustMergedColumns(Cols.Count - 1, false, false);
|
|
MyBorders.InsertColumns(Cols.Count - colsToAdd - 1, colsToAdd);
|
|
}
|
|
|
|
switch (pp)
|
|
{
|
|
case enmPastePos.Before:
|
|
//this.Rows.InsertRange(Selection.r1,rowsToAdd);
|
|
this.Rows.InsertRange(selR1, rowsToAdd);
|
|
AdjustMergedRows(selR1, true, false);
|
|
break;
|
|
case enmPastePos.After:
|
|
if (selR1 < Rows.Count - 1)
|
|
{
|
|
//this.Rows.InsertRange(Selection.r1 + 1, rowsToAdd);
|
|
this.Rows.InsertRange(selR1 + 1, rowsToAdd);
|
|
}
|
|
else
|
|
this.Rows.Add(rowsToAdd);
|
|
AdjustMergedRows(selR1 + 1, false, false);
|
|
break;
|
|
case enmPastePos.Replace:
|
|
if (rowsToAdd > Rows.Count - Selection.r1)
|
|
{
|
|
this.Rows.Add(rowsToAdd - (Rows.Count - Selection.r1));
|
|
AdjustMergedRows(selR1, false, false);
|
|
}
|
|
break;
|
|
}
|
|
|
|
RemoveMergedRanges(MyCopyInfo.MyCopiedCellRange.r1 + rowOffset, MyCopyInfo.MyCopiedCellRange.c1, MyCopyInfo.MyCopiedCellRange.r2 + rowOffset, MyCopyInfo.MyCopiedCellRange.c2);
|
|
|
|
for (int r = MyCopyInfo.MyCopiedCellRange.r1; r <= MyCopyInfo.MyCopiedCellRange.r2; r++)
|
|
{
|
|
Rows[r + rowOffset].Height = MyCopyInfo.MyCopiedFlexGrid.Rows[r].Height;
|
|
for (int c = MyCopyInfo.MyCopiedCellRange.c1; c <= Math.Min(MyCopyInfo.MyCopiedCellRange.c2 + colsToAdd, Cols.Count - 1); c++)
|
|
{
|
|
CellRange crm = MyCopyInfo.MyCopiedFlexGrid.GetMergedRange(r, c);
|
|
if (r == crm.r1 && c == crm.c1)
|
|
{
|
|
Cols[c].Width = Math.Max(Cols[c].Width, MyCopyInfo.MyCopiedFlexGrid.Cols[c].Width);
|
|
CellRange cr = GetCellRange(crm.r1 + rowOffset, crm.c1, crm.r2 + rowOffset, crm.c2);
|
|
if ((crm.r2 > crm.r1) || (crm.c2 > crm.c1))
|
|
MergedRanges.Add(cr);
|
|
this[r + rowOffset, c] = MyCopyInfo.MyCopiedFlexGrid[r, c];
|
|
MatchStyle(crm, cr);
|
|
PasteBorders(r + rowOffset, c, r, c);
|
|
}
|
|
}
|
|
}
|
|
this.AdjustGridControlSize();
|
|
}
|
|
|
|
private void MatchStyle(CellRange crm, CellRange cr)
|
|
{
|
|
if (crm.Style != null)
|
|
{
|
|
ChangeCellAlign(cr, crm.Style.TextAlign);
|
|
ChangeCellBorder(cr, crm.Style.Border.Style);
|
|
}
|
|
//else
|
|
//{
|
|
// cr.Style = null; // - didn't like the null
|
|
//}
|
|
}
|
|
|
|
private void RemoveMergedRanges(int r1, int c1, int r2, int c2)
|
|
{
|
|
for (int r = r1; r <= r2; r++)
|
|
for (int c = c1; c <= c2; c++)
|
|
{
|
|
CellRange cr = GetMergedRange(r, c);
|
|
if (cr.r1 < cr.r2 || cr.c1 < cr.c2)
|
|
MergedRanges.Remove(cr);
|
|
}
|
|
}
|
|
|
|
public void PasteColumns(enmPastePos pp)
|
|
{
|
|
if (MyCopyInfo.MyCopiedFlexGrid == null || MyCopyInfo.MyCopyOption != GridCopyOption.Column) return;
|
|
|
|
int colsToAdd = MyCopyInfo.MyCopiedCellRange.c2 - MyCopyInfo.MyCopiedCellRange.c1 + 1;
|
|
int rowsToAdd = Math.Max((MyCopyInfo.MyCopiedCellRange.r2 - MyCopyInfo.MyCopiedCellRange.r1 + 1) - Rows.Count, 0);
|
|
int colOffset = Selection.c1 + (pp == enmPastePos.After ? 1 : 0) - MyCopyInfo.MyCopiedCellRange.c1;
|
|
int selC1 = Selection.c1;
|
|
|
|
// If the columns we are copying has more rows than the current table, then append the needed rows to the grid
|
|
if (rowsToAdd > 0)
|
|
{
|
|
Rows.Add(rowsToAdd);
|
|
AdjustMergedRows(Rows.Count, false, false);
|
|
MyBorders.InsertRows(Rows.Count - rowsToAdd - 1,rowsToAdd);
|
|
}
|
|
|
|
switch (pp)
|
|
{
|
|
case enmPastePos.Before:
|
|
//this.Cols.InsertRange(Selection.c1, colsToAdd);
|
|
this.Cols.InsertRange(selC1, colsToAdd);
|
|
AdjustMergedColumns(selC1, true, false);
|
|
break;
|
|
case enmPastePos.After:
|
|
//if (Selection.c1 < Cols.Count - 1)
|
|
// this.Cols.InsertRange(Selection.c1 + 1, colsToAdd);
|
|
if (selC1 < Cols.Count - 1)
|
|
this.Cols.InsertRange(selC1 + 1, colsToAdd);
|
|
else
|
|
this.Cols.Add(colsToAdd);
|
|
AdjustMergedColumns(selC1 + 1, false, false);
|
|
break;
|
|
case enmPastePos.Replace:
|
|
//if (colsToAdd > Cols.Count - Selection.c1)
|
|
// this.Cols.Add(colsToAdd - (Cols.Count - Selection.c1));
|
|
if (colsToAdd > Cols.Count - selC1)
|
|
{
|
|
this.Cols.Add(colsToAdd - (Cols.Count - selC1));
|
|
AdjustMergedColumns(selC1, true, false);
|
|
}
|
|
break;
|
|
}
|
|
|
|
RemoveMergedRanges(MyCopyInfo.MyCopiedCellRange.r1, MyCopyInfo.MyCopiedCellRange.c1 + colOffset, MyCopyInfo.MyCopiedCellRange.r2, MyCopyInfo.MyCopiedCellRange.c2 + colOffset);
|
|
|
|
for (int c = MyCopyInfo.MyCopiedCellRange.c1; c <= MyCopyInfo.MyCopiedCellRange.c2; c++)
|
|
{
|
|
Cols[c + colOffset].Width = MyCopyInfo.MyCopiedFlexGrid.Cols[c].Width;
|
|
for (int r = MyCopyInfo.MyCopiedCellRange.r1; r <= Math.Min(MyCopyInfo.MyCopiedCellRange.r2 + rowsToAdd, Rows.Count - 1); r++)
|
|
{
|
|
CellRange crm = MyCopyInfo.MyCopiedFlexGrid.GetMergedRange(r, c);
|
|
if (r == crm.r1 && c == crm.c1)
|
|
{
|
|
Rows[r].Height = Math.Max(Rows[r].Height, MyCopyInfo.MyCopiedFlexGrid.Rows[r].Height);
|
|
CellRange cr = GetCellRange(crm.r1, crm.c1 + colOffset, crm.r2, crm.c2 + colOffset);
|
|
if ((crm.r2 > crm.r1) || (crm.c2 > crm.c1))
|
|
MergedRanges.Add(cr);
|
|
this[r, c + colOffset] = MyCopyInfo.MyCopiedFlexGrid[r, c];
|
|
MatchStyle(crm, cr);
|
|
PasteBorders(r, c + colOffset, r, c);
|
|
}
|
|
}
|
|
}
|
|
this.AdjustGridControlSize();
|
|
}
|
|
|
|
public void PasteCopiedCells()
|
|
{
|
|
// Warn the user that this type of paste will replace the currently selected (highlighted) table cells and give the option to abort.
|
|
DialogResult dr = MessageBox.Show("This will replace the cells that are currently selected (highlighted). \n\nContinue with the paste?","Paste Table Cells",MessageBoxButtons.YesNo,MessageBoxIcon.Question);
|
|
if (dr == DialogResult.No) return;
|
|
|
|
int nSelRows = Selection.r2 - Selection.r1 + 1;
|
|
int nSelCols = Selection.c2 - Selection.c1 + 1;
|
|
int nCpyRows = MyCopyInfo.MyCopiedCellRange.r2 - MyCopyInfo.MyCopiedCellRange.r1 + 1;
|
|
int nCpyCols = MyCopyInfo.MyCopiedCellRange.c2 - MyCopyInfo.MyCopiedCellRange.c1 + 1;
|
|
int colsToAdd = Math.Max(nCpyCols - nSelCols, 0);
|
|
int rowsToAdd = Math.Max(nCpyRows - nSelRows, 0);
|
|
int rowOffset = Selection.r1 - MyCopyInfo.MyCopiedCellRange.r1;
|
|
int colOffset = Selection.c1 - MyCopyInfo.MyCopiedCellRange.c1;
|
|
int selR2 = Selection.r2;
|
|
int selC2 = Selection.c2;
|
|
// If there are more cells to copy than what is seleceted in the target table
|
|
// Add extra rows and columns as needed
|
|
if (rowsToAdd > 0)
|
|
{
|
|
if (selR2 < Rows.Count - 1)
|
|
this.Rows.InsertRange(selR2 + 1, rowsToAdd);
|
|
else
|
|
this.Rows.Add(rowsToAdd);
|
|
MyBorders.InsertRows(selR2,rowsToAdd);
|
|
AdjustMergedRows(selR2 + 1, false, false);
|
|
}
|
|
|
|
if (colsToAdd > 0)
|
|
{
|
|
if (selC2 < Cols.Count - 1)
|
|
this.Cols.InsertRange(selC2 + 1, colsToAdd);
|
|
else
|
|
this.Cols.Add(colsToAdd);
|
|
MyBorders.InsertColumns(selC2,colsToAdd);
|
|
AdjustMergedColumns(selC2 + 1, false, false);
|
|
}
|
|
|
|
RemoveMergedRanges(MyCopyInfo.MyCopiedCellRange.r1 + rowOffset, MyCopyInfo.MyCopiedCellRange.c1 + colOffset, MyCopyInfo.MyCopiedCellRange.r2 + rowOffset, MyCopyInfo.MyCopiedCellRange.c2 + colOffset);
|
|
|
|
for (int c = MyCopyInfo.MyCopiedCellRange.c1; c <= Math.Min(MyCopyInfo.MyCopiedCellRange.c2, Cols.Count - 1 - colOffset); c++)
|
|
Cols[c + colOffset].Width = Math.Max(MyCopyInfo.MyCopiedFlexGrid.Cols[c].Width, Cols[c + colOffset].Width);
|
|
|
|
for (int r = MyCopyInfo.MyCopiedCellRange.r1; r <= Math.Min(MyCopyInfo.MyCopiedCellRange.r2, Rows.Count - 1 - rowOffset); r++)
|
|
{
|
|
Rows[r + rowOffset].Height = Math.Max(MyCopyInfo.MyCopiedFlexGrid.Rows[r].Height, Rows[r + rowOffset].Height);
|
|
for (int c = MyCopyInfo.MyCopiedCellRange.c1; c <= Math.Min(MyCopyInfo.MyCopiedCellRange.c2, Cols.Count - 1 - colOffset); c++)
|
|
{
|
|
CellRange crm = MyCopyInfo.MyCopiedFlexGrid.GetMergedRange(r, c);
|
|
if (r == crm.r1 && c == crm.c1)
|
|
{
|
|
CellRange cr = GetCellRange(crm.r1 + rowOffset, crm.c1 + colOffset, crm.r2 + rowOffset, crm.c2 + colOffset);
|
|
if ((crm.r2 > crm.r1) || (crm.c2 > crm.c1))
|
|
MergedRanges.Add(cr);
|
|
this[r + rowOffset, c + colOffset] = MyCopyInfo.MyCopiedFlexGrid[r, c];
|
|
MatchStyle(crm, cr);
|
|
PasteBorders(r + rowOffset, c + colOffset, r, c);
|
|
}
|
|
}
|
|
}
|
|
this.AdjustGridControlSize();
|
|
}
|
|
|
|
#endregion // Copy/Paste
|
|
#region Selection
|
|
public bool SelectNextCell()
|
|
{
|
|
int r = this.Row;
|
|
int c = this.Col;
|
|
CellRange cr = GetMergedRange(r, c);
|
|
do
|
|
{
|
|
c = cr.c2 + 1;
|
|
if (c >= this.Cols.Count)
|
|
{
|
|
r = r + 1;
|
|
c = 0;
|
|
if (r >= this.Rows.Count) return false;
|
|
}
|
|
cr = GetMergedRange(r, c);
|
|
} while (r != cr.r1 || c != cr.c1);
|
|
Select(r, c);
|
|
return true;
|
|
}
|
|
public bool SelectPrevCell()
|
|
{
|
|
int r = this.Row;
|
|
int c = this.Col;
|
|
CellRange cr = GetMergedRange(r, c);
|
|
do
|
|
{
|
|
c = cr.c1 - 1;
|
|
if (c < 0)
|
|
{
|
|
r = r - 1;
|
|
c = this.Cols.Count-1;
|
|
if (r < 0) return false;
|
|
}
|
|
cr = GetMergedRange(r, c);
|
|
c = cr.c1;
|
|
} while (r != cr.r1);
|
|
Select(r, c);
|
|
return true;
|
|
}
|
|
#endregion
|
|
#region SearchableText
|
|
public string GetSearchableText()
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
int r = 0;
|
|
int c = 0;
|
|
int w = Cols.Count;
|
|
int h = Rows.Count;
|
|
|
|
while (r < h)
|
|
{
|
|
CellRange cr = GetMergedRange(r, c);
|
|
if (cr.r1 == r && cr.c1 == c)
|
|
{
|
|
if (this[r, c] != null)
|
|
{
|
|
string strp = DisplayText.StaticStripRtfCommands((string)this[r, c]);
|
|
sb.Append(strp.Replace("\r\n", " "));
|
|
}
|
|
sb.Append("\r\n");
|
|
}
|
|
c = c + 1;
|
|
if (c == w)
|
|
{
|
|
c = 0;
|
|
r = r + 1;
|
|
}
|
|
}
|
|
return sb.ToString();
|
|
}
|
|
#endregion
|
|
#region Import / Export Grid
|
|
|
|
/// <summary>
|
|
/// Prompts user with Save File dialog.
|
|
/// Grid will be saved to an XML file.
|
|
/// </summary>
|
|
/// <param name="initDir"></param>
|
|
public void ExportToXML(string initDir)
|
|
{
|
|
SaveFileDialog sfd = new SaveFileDialog();
|
|
sfd.DefaultExt = ".xml";
|
|
sfd.Filter = "XML files (*.xml)|*.xml|All files (*.*)|*.* ";
|
|
//sfd.InitialDirectory = @"C:\Development\SampleTableData";
|
|
sfd.InitialDirectory = initDir;
|
|
sfd.Title = "Save XML File";
|
|
sfd.ShowDialog();
|
|
this.WriteXml(sfd.FileName);
|
|
}
|
|
public string GetXMLData()
|
|
{
|
|
string retstr = null;
|
|
using (StringWriter sw = new StringWriter())
|
|
{
|
|
this.WriteXml(sw);
|
|
retstr = sw.GetStringBuilder().ToString();
|
|
sw.Close();
|
|
}
|
|
return retstr;
|
|
}
|
|
/// <summary>
|
|
/// Prompts user with Save File dialog.
|
|
/// Grid will be saved to an Excel file.
|
|
/// </summary>
|
|
/// <param name="initDir"></param>
|
|
public void ExportToExcel(string initDir)
|
|
{
|
|
SaveFileDialog sfd = new SaveFileDialog();
|
|
sfd.DefaultExt = ".xls";
|
|
sfd.Filter = "Excel files (*.xls)|*.xls|All files (*.*)|*.* ";
|
|
//sfd.InitialDirectory = @"C:\Development\SampleTableData";
|
|
sfd.InitialDirectory = initDir;
|
|
sfd.Title = "Save Excel File";
|
|
sfd.ShowDialog();
|
|
this.SaveExcel(sfd.FileName);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Prompts user with Open File dialog.
|
|
/// XML file will be imported to a table grid.
|
|
/// </summary>
|
|
/// <param name="initDir"></param>
|
|
/// <returns></returns>
|
|
public string ImportXML(string initDir)
|
|
{
|
|
string rtn = "";
|
|
OpenFileDialog ofd = new OpenFileDialog();
|
|
ofd.DefaultExt = ".xml";
|
|
ofd.Filter = "XML files (*.xml)|*.xml|All files (*.*)|*.* ";
|
|
//ofd.InitialDirectory = @"C:\Development\SampleTableData";
|
|
ofd.InitialDirectory = initDir;
|
|
ofd.Multiselect = false;
|
|
ofd.Title = "Select XML File";
|
|
ofd.ShowDialog();
|
|
this.Clear();
|
|
this.MergedRanges.Clear();
|
|
this.ReadXml(ofd.FileName);
|
|
this.BorderStyle = C1.Win.C1FlexGrid.Util.BaseControls.BorderStyleEnum.None;
|
|
this.KeyActionTab = KeyActionEnum.MoveAcross;
|
|
this.AdjustGridControlSize();
|
|
rtn = ofd.SafeFileName;
|
|
return rtn;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Prompts user with Open File dialog.
|
|
/// Excel file will be imported to a table grid.
|
|
/// </summary>
|
|
/// <param name="initDir"></param>
|
|
/// <returns></returns>
|
|
public string ImportExcel(string initDir)
|
|
{
|
|
string rtn = "";
|
|
//VlnFlexGrid grd = rbtDefaultTable.Checked ? vlnFlexGrid2 : vlnFlexGrid3; //GetActiveGrid();
|
|
OpenFileDialog ofd = new OpenFileDialog();
|
|
ofd.DefaultExt = ".xls";
|
|
ofd.Filter = "Excel files (*.xls)|*.xls|All files (*.*)|*.*";
|
|
//ofd.InitialDirectory = @"C:\Development\SampleTableData";
|
|
ofd.InitialDirectory = initDir;
|
|
ofd.Multiselect = false;
|
|
ofd.Title = "Select Excel File";
|
|
ofd.ShowDialog();
|
|
this.Clear();
|
|
this.MergedRanges.Clear();
|
|
this.LoadExcel(ofd.FileName);
|
|
this.AdjustGridControlSize();
|
|
rtn = ofd.SafeFileName;
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 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.
|
|
/// </summary>
|
|
/// <param name="txtbuff"></param>
|
|
public void ParseTableFromText(string buff)
|
|
{
|
|
string txtbuff = PrepROTableText(buff);
|
|
if (IsRoTable) txtbuff = _RemoveComments.Replace(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<int, int> dicCols = new Dictionary<int, int>();
|
|
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;
|
|
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
|
|
{
|
|
// 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;
|
|
}
|
|
// 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;
|
|
//}
|
|
//int tcol = dicCols[idx];
|
|
//// 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 < tcol)
|
|
//{
|
|
// for (int i = curCol; i <= tcol; i++)
|
|
// tci[curRow, i].MergeColRight = 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;
|
|
curCol = dicCols[colPos];
|
|
// see what column we are in - new line might occure before last grid column
|
|
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
|
|
{
|
|
//curCol = dicCols[colPos];
|
|
while (curCol > prevCol + 1)
|
|
{
|
|
tci[curRow, prevCol].MergeColRight = true;
|
|
prevCol++;
|
|
}
|
|
// 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.Count==0?0: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());
|
|
//this[r, c] = cellstr.TrimEnd(" \r\n\t".ToCharArray());
|
|
CellRange cr = this.GetMergedRange(r, c);
|
|
if (cr.r1 != cr.r2)
|
|
TrimMergedRangeCellText(cr);
|
|
}
|
|
}
|
|
MyBorders = new VlnBorders(GridLinePattern.Single, Rows.Count, Cols.Count);
|
|
}
|
|
|
|
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
|
|
|
|
#region Bug Work Around
|
|
protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
|
|
{
|
|
|
|
// Note: this fixes a bug that happens when the grid has more rows than columns
|
|
// notified ComponentOne of the problem 6/25/09 via Email
|
|
try
|
|
{
|
|
base.OnMouseDown(e);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
while (ex != null)
|
|
{
|
|
Console.WriteLine("{0} {1} {2}", ex.GetType().Name, ex.Message, ex.StackTrace);
|
|
ex = ex.InnerException;
|
|
}
|
|
}
|
|
|
|
}
|
|
#endregion //Bug Work Around
|
|
|
|
//public void CenterTheCellText()
|
|
//{
|
|
// // Cannot use this type of text allignment with RTF text cells
|
|
// CellRange cr = this.Selection;
|
|
// for (int rw = cr.r1; rw <= cr.r2; rw++)
|
|
// for (int col = cr.c1; col <= cr.c2; col++)
|
|
// {
|
|
// CellRange tmp = this.GetCellRange(rw, col, rw, col);
|
|
// string StyleName = string.Format("R{0}C{1}Style", rw, col);
|
|
// CellStyle cs = this.Styles.Add(StyleName, tmp.Style);
|
|
// cs.TextAlign = TextAlignEnum.CenterCenter;
|
|
// tmp.Style = cs;
|
|
// }
|
|
|
|
//}
|
|
#region Uneven Selections
|
|
/// <summary>
|
|
/// True if the top and bottom row of the selection is the same for every column
|
|
/// </summary>
|
|
public bool EvenSelection
|
|
{
|
|
get
|
|
{
|
|
if (Selection.c1 < 0 || Selection.c2 < 0 || Selection.r1 < 0 || Selection.r2 < 0) return true; // Even if there is no selection
|
|
if (Selection.IsSingleCell) return true; // One cell by definition is Even
|
|
int cMin = MinimumColumn(Selection.r1, Selection.c1); // Get the left column of the top row
|
|
int cMax = MaximumColumn(Selection.r1, Selection.c2); // Get the right column of the top row
|
|
for (int r = Selection.r1 + 1; r <= Selection.r2; r++)
|
|
{
|
|
// Uneven if the top row in this column doesn't match the first column
|
|
if (MinimumColumn(r, Selection.c1) != cMin)
|
|
return false;
|
|
// Uneven if the bottom row in this column doesn't match the first column
|
|
if (MaximumColumn(r, Selection.c2) != cMax)
|
|
return false;
|
|
}
|
|
int rMin = MinimumRow(Selection.r1, Selection.c1); // Get the top row of the left column
|
|
int rMax = MaximumRow(Selection.r2, Selection.c1); // Get the bottom row of the left column
|
|
for (int c = Selection.c1 + 1; c <= Selection.c2; c++)
|
|
{
|
|
// Uneven if the top row in this column doesn't match the first column
|
|
if (MinimumRow(Selection.r1, c) != rMin)
|
|
return false;
|
|
// Uneven if the bottom row in this column doesn't match the first column
|
|
if (MaximumRow(Selection.r2, c) != rMax)
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
public void MakeSelectionEven()
|
|
{
|
|
if (Selection.IsSingleCell) return; // One cell by definition is Even
|
|
MakeSelectionEven(Selection.r1, Selection.c1, Selection.r2, Selection.c2);
|
|
}
|
|
public void SelectRow()
|
|
{
|
|
MakeSelectionEven(Selection.r1, 0, Selection.r2, Cols.Count - 1);
|
|
}
|
|
public void SelectCol()
|
|
{
|
|
MakeSelectionEven(0, Selection.c1, Rows.Count - 1, Selection.c2);
|
|
}
|
|
public void MakeSelectionEven(int r1,int c1, int r2, int c2)
|
|
{
|
|
if (c1 < 0 || c2 < 0 || r1 < 0 || r2 < 0) return; // if there is no selection don't bother
|
|
CellRange cr = GetEvenSelection(r1, c1, r2, c2);
|
|
Select(cr);
|
|
}
|
|
|
|
public CellRange GetEvenSelection()
|
|
{
|
|
return GetEvenSelection(Selection.r1, Selection.c1, Selection.r2, Selection.c2);
|
|
}
|
|
|
|
public CellRange GetEvenSelection(int r1, int c1, int r2, int c2)
|
|
{
|
|
int cMinNew = MinimumColumn(r1, c1); // Get the left column of the top row
|
|
int cMaxNew = MaximumColumn(r1, c2); // Get the right column of the top row
|
|
int rMinNew = MinimumRow(r1, c1); // Get the top row of the left column
|
|
int rMaxNew = MaximumRow(r2, c1); // Get the bottom row of the left column
|
|
int cMin = cMinNew;
|
|
int cMax = cMaxNew;
|
|
int rMin = rMinNew;
|
|
int rMax = rMaxNew;
|
|
do
|
|
{
|
|
cMin = cMinNew;
|
|
cMax = cMaxNew;
|
|
rMin = rMinNew;
|
|
rMax = rMaxNew;
|
|
for (int r = rMin; r <= rMax; r++)
|
|
{
|
|
// Uneven if the top row in this column doesn't match the first column
|
|
int myMin = MinimumColumn(r, cMin);
|
|
if (myMin < cMinNew)
|
|
cMinNew = myMin;
|
|
// Uneven if the bottom row in this column doesn't match the first column
|
|
int myMax = MaximumColumn(r, cMax);
|
|
if (myMax > cMaxNew)
|
|
cMaxNew = myMax;
|
|
}
|
|
for (int c = cMinNew; c <= cMaxNew; c++)
|
|
{
|
|
// if the top row in this column is less than the minimum save it
|
|
int myMin = MinimumRow(rMin, c);
|
|
if (myMin < rMinNew)
|
|
rMinNew = myMin;
|
|
// Uneven if the bottom row in this column doesn't match the first column
|
|
int myMax = MaximumRow(rMax, c);
|
|
if (myMax > rMax)
|
|
rMaxNew = myMax;
|
|
}
|
|
}
|
|
while (cMinNew < cMin || cMaxNew > cMax || rMinNew < rMin || rMaxNew > rMax);
|
|
CellRange cr = GetCellRange(rMinNew, cMinNew, rMaxNew, cMaxNew);
|
|
return cr;
|
|
}
|
|
private int MinimumColumn(int r, int c)
|
|
{
|
|
return GetMergedRange(r, c).c1;
|
|
}
|
|
private int MaximumColumn(int r, int c)
|
|
{
|
|
return GetMergedRange(r, c).c2;
|
|
}
|
|
private int MinimumRow(int r, int c)
|
|
{
|
|
return GetMergedRange(r, c).r1;
|
|
}
|
|
private int MaximumRow(int r, int c)
|
|
{
|
|
return GetMergedRange(r, c).r2;
|
|
}
|
|
public Color StyleBackColor
|
|
{
|
|
get {return Styles.Normal.BackColor;}
|
|
set
|
|
{
|
|
Styles.Normal.BackColor = value;
|
|
Styles.Alternate.BackColor = value;
|
|
for (int c = 0; c < Cols.Count; c++)
|
|
for (int r = 0; r < Rows.Count; r++)
|
|
{
|
|
CellRange cr = GetMergedRange(r, c);
|
|
if (cr.Style != null && cr.Style.BackColor != value && cr.Style.Name != "Fixed")
|
|
{
|
|
cr.Style.BackColor = value;
|
|
//Console.WriteLine("{0}, {1}, {2}, {3}", r, c, cr.Style.Name, cr.Style.BackColor);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Returns a list of cells or merged cells within the selection
|
|
/// </summary>
|
|
public List<CellRange> MySelection
|
|
{
|
|
get
|
|
{
|
|
List<CellRange> ranges = new List<CellRange>();
|
|
for (int c = Selection.c1; c <= Selection.c2; c++)
|
|
for (int r = Selection.r1; r <= Selection.r2; r++)
|
|
{
|
|
CellRange cr = GetMergedRange(r, c);
|
|
if (!ranges.Contains(cr))
|
|
ranges.Add(cr);
|
|
}
|
|
//}
|
|
return ranges;
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// This is a test to see if MySelection works.
|
|
/// </summary>
|
|
public void BoldMySelection()
|
|
{
|
|
foreach (CellRange cr in MySelection)
|
|
{
|
|
StepRTB rtb = new StepRTB();
|
|
rtb.Rtf = GetCellRTFString(cr.r1, cr.c1);
|
|
rtb.SelectAll();
|
|
rtb.SelectionFont = new Font(rtb.SelectionFont, FontStyle.Bold);
|
|
this[cr.r1, cr.c1] = rtb.Rtf;
|
|
}
|
|
}
|
|
|
|
public void ShowMySelection()
|
|
{
|
|
int r1 = MySelection[0].r1;
|
|
int r2 = MySelection[0].r2;
|
|
int c1 = MySelection[0].c1;
|
|
int c2 = MySelection[0].c2;
|
|
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);
|
|
}
|
|
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
|
|
}
|
|
/// <summary>
|
|
/// This is used for storing the grid selection for copy/past Row/Column
|
|
/// </summary>
|
|
public enum GridCopyOption { Row, Column, Selection };
|
|
|
|
#region RTF Class for Cell rendering
|
|
class RTF : StepRTB //RichTextBox
|
|
{
|
|
// messages used by RichEd20.dll
|
|
internal const int
|
|
WM_USER = 0x0400,
|
|
EM_FORMATRANGE = WM_USER + 57;
|
|
|
|
// FORMATRANGE is used by RichEd20.dll to render RTF
|
|
internal struct FORMATRANGE
|
|
{
|
|
internal IntPtr hdc, hdcTarget;
|
|
internal Rectangle rc, rcPage;
|
|
internal int cpMin, cpMax;
|
|
}
|
|
|
|
// render the control directly into a given Graphics object
|
|
// (this does not honor clipping set in the target Graphics object; it that is
|
|
// a problem, use the RenderClipped method instead).
|
|
public void Render(Graphics g, Rectangle rc)
|
|
{
|
|
// convert rect from pixels to twips
|
|
rc.X = (int)(rc.X * 1440 / g.DpiX);
|
|
rc.Y = (int)(rc.Y * 1440 / g.DpiY);
|
|
rc.Width = rc.X + (int)((rc.Width) * 1440 / g.DpiX);
|
|
rc.Height = rc.Y + (int)((rc.Height) * 1440 / g.DpiY);
|
|
|
|
// get dc
|
|
IntPtr hdc = g.GetHdc();
|
|
|
|
// set up FORMATRANGE struct
|
|
FORMATRANGE fmt = new FORMATRANGE();
|
|
fmt.hdc = fmt.hdcTarget = hdc;
|
|
fmt.rc = fmt.rcPage = rc;
|
|
fmt.cpMin = 0;
|
|
fmt.cpMax = -1;
|
|
|
|
// render RTF
|
|
int render = 1;
|
|
SendMessageFormatRange(Handle, EM_FORMATRANGE, render, ref fmt);
|
|
|
|
// clean up
|
|
SendMessage(Handle, EM_FORMATRANGE, render, 0);
|
|
|
|
// done with dc
|
|
g.ReleaseHdc(hdc);
|
|
}
|
|
|
|
// render RTF into a Graphics object using a temporary bitmap to ensure
|
|
// clipping works correctly.
|
|
public void RenderClipped(Graphics g, Rectangle rc)
|
|
{
|
|
// create temp bitmap
|
|
Rectangle rcSrc = new Rectangle(0, 0, rc.Width, rc.Height);
|
|
using (Bitmap bmp = new Bitmap(rc.Width, rc.Height))
|
|
{
|
|
// render RTF into bitmap
|
|
using (Graphics gBmp = Graphics.FromImage(bmp))
|
|
{
|
|
Render(gBmp, rcSrc);
|
|
// transfer bitmap to original Graphics object
|
|
// (this honors clipping set in the target Graphics object)
|
|
g.DrawImage(bmp, rc, rcSrc, GraphicsUnit.Pixel);
|
|
}
|
|
}
|
|
}
|
|
|
|
// SendMessage
|
|
[DllImport("USER32.DLL", CharSet = CharSet.Auto)]
|
|
static private extern int SendMessage(
|
|
IntPtr hWnd,
|
|
uint wMsg,
|
|
int wParam,
|
|
int lParam);
|
|
[DllImport("USER32.DLL", CharSet = CharSet.Auto, EntryPoint = "SendMessage")]
|
|
static private extern int SendMessageFormatRange(
|
|
IntPtr hWnd,
|
|
uint wMsg,
|
|
int wParam,
|
|
ref FORMATRANGE lParam);
|
|
}
|
|
|
|
#endregion //RTF Class for Cell rendering
|
|
# region TableCellInfo for text parse
|
|
class TableCellInfo
|
|
{
|
|
private bool _MergeRowBellow;
|
|
|
|
public bool MergeRowBellow
|
|
{
|
|
get { return _MergeRowBellow; }
|
|
set { _MergeRowBellow = value; }
|
|
}
|
|
private bool _MergeColRight;
|
|
|
|
public bool MergeColRight
|
|
{
|
|
get { return _MergeColRight; }
|
|
set { _MergeColRight = value; }
|
|
}
|
|
private bool _ColEnd;
|
|
|
|
public bool ColEnd
|
|
{
|
|
get { return _ColEnd; }
|
|
set { _ColEnd = value; }
|
|
}
|
|
private string _Text;
|
|
|
|
public string Text
|
|
{
|
|
get { return _Text; }
|
|
set { _Text = value; }
|
|
}
|
|
}
|
|
#endregion //TableCellInfo for text parse
|
|
#region TableCellEditor
|
|
/// <summary>
|
|
/// TableCellEditor inherits from a StepRTB and is used as a custom cell editor
|
|
/// for the C1FlexGrid control.
|
|
/// </summary>
|
|
public class TableCellEditor : StepRTB //System.Windows.Forms.RichTextBox //System.Windows.Forms.TextBox // System.Windows.Forms.ComboBox
|
|
{
|
|
private VlnFlexGrid _owner;
|
|
private int _row, _col;
|
|
private char _pendingKey;
|
|
private bool _cancel;
|
|
public bool _initializingEdit;
|
|
|
|
// constructor: attach to owner grid
|
|
public TableCellEditor(VlnFlexGrid owner)
|
|
{
|
|
Visible = false;
|
|
AutoSize = false;
|
|
BackColor = Color.SkyBlue;
|
|
BorderStyle = BorderStyle.None;
|
|
ScrollBars = RichTextBoxScrollBars.None;
|
|
|
|
_initializingEdit = false;
|
|
_pendingKey = (char)0;
|
|
_cancel = false;
|
|
_owner = owner;
|
|
_owner.Controls.Add(this);
|
|
this.CursorMovement += new StepRTBCursorMovementEvent(TableCellEditor_CursorMovement);
|
|
this.CursorKeyPress += new StepRTBCursorKeysEvent(TableCellEditor_CursorKeyPress);
|
|
this.Leave += new EventHandler(_editor_Leave);
|
|
//this.HeightChanged += new StepRTBEvent(_HeightChanged);
|
|
}
|
|
|
|
// start editing: move to cell and activate
|
|
public void StartEditing(int row, int col)
|
|
{
|
|
_initializingEdit = true;
|
|
ReadOnly = IsRoTable;
|
|
// save coordinates of cell being edited
|
|
_row = row;
|
|
_col = col;
|
|
//this.Clear(); //jsj
|
|
// assume we'll save the edits
|
|
_cancel = false;
|
|
// move editor over the current cell
|
|
Rectangle rc = _owner.GetCellRect(row, col, true);
|
|
rc.Width--;
|
|
rc.Height--;
|
|
Bounds = rc;
|
|
// initialize control content
|
|
Text = "";
|
|
FindAllLinks(); // jsj 1-5-2011
|
|
if (_pendingKey > ' ' && !ReadOnly)
|
|
Text = _pendingKey.ToString();
|
|
else if (_owner[row, col] != null)
|
|
{
|
|
string tmp = _owner[row, col].ToString();
|
|
if (tmp.StartsWith(@"{\rtf"))
|
|
Rtf = tmp.Replace(@"\~",@"\u160?");
|
|
else
|
|
Text = tmp;
|
|
}
|
|
Select(Text.Length, 0);
|
|
|
|
Size sz = new Size(rc.Width, rc.Height);
|
|
|
|
//this.Size = sz;
|
|
this.Width = rc.Width;
|
|
|
|
// make editor visible
|
|
Visible = true;
|
|
|
|
// and get the focus
|
|
//Select();
|
|
Focus();
|
|
_initializingEdit = false;
|
|
}
|
|
|
|
void TableCellEditor_CursorKeyPress(object sender, KeyEventArgs args)
|
|
{
|
|
//throw new Exception("The method or operation is not implemented.");
|
|
}
|
|
|
|
void TableCellEditor_CursorMovement(object sender, StepRTBCursorMovementEventArgs args)
|
|
{
|
|
int row = _owner.Selection.r1;
|
|
int col = _owner.Selection.c1;
|
|
CellRange cr = _owner.GetMergedRange(row, col);
|
|
//Console.WriteLine("keystroke {0} selection {1},{2}", args.Key, row, col);
|
|
//vlnStackTrace.ShowStack("keystroke {0} selection {1},{2}", args.Key, row, col);
|
|
_owner.Select();
|
|
// See if we are in a merged range of cells.
|
|
// if so, use the merged range instead of the selected range
|
|
// so that we can jump to the top/bottom/left/right of the range
|
|
// before attempting the move to the next grid cell.
|
|
//int idx = _owner.MergedRanges.IndexOf(row, col);
|
|
//if (idx > -1) cr = _owner.MergedRanges[idx];
|
|
|
|
switch (args.Key)
|
|
{
|
|
case VEPROMS.CSLA.Library.E_ArrowKeys.CtrlDown:
|
|
case VEPROMS.CSLA.Library.E_ArrowKeys.Down:
|
|
row = cr.r2;
|
|
if (row < _owner.Rows.Count - 1)
|
|
_owner.Select(_owner.GetMergedRange(row + 1, col));
|
|
else
|
|
_owner.OnCursorMovement(this, new VlnFlexGridCursorMovementEventArgs(args.Key));
|
|
break;
|
|
case VEPROMS.CSLA.Library.E_ArrowKeys.CtrlLeft:
|
|
case VEPROMS.CSLA.Library.E_ArrowKeys.Left:
|
|
col = cr.c1;
|
|
if (col > 0)
|
|
_owner.Select(_owner.GetMergedRange(row, col - 1));
|
|
else if(row > 0)
|
|
_owner.Select(_owner.GetMergedRange(row - 1, _owner.Cols.Count - 1));
|
|
else
|
|
_owner.OnCursorMovement(this, new VlnFlexGridCursorMovementEventArgs(args.Key));
|
|
break;
|
|
case VEPROMS.CSLA.Library.E_ArrowKeys.CtrlRight:
|
|
case VEPROMS.CSLA.Library.E_ArrowKeys.Right:
|
|
col = cr.c2;
|
|
if (col < _owner.Cols.Count - 1)
|
|
_owner.Select(_owner.GetMergedRange(row, col + 1));
|
|
else if (cr.r2 < _owner.Rows.Count - 1)
|
|
{
|
|
CellRange crDest = _owner.GetMergedRange(cr.r2 + 1, 0);
|
|
if (cr.r2 < crDest.r1) // It will move to the correct place
|
|
_owner.Select(crDest);
|
|
else if (crDest.r2 < _owner.Rows.Count)
|
|
_owner.Select(_owner.GetMergedRange(crDest.r2 + 1, 0));
|
|
else
|
|
_owner.OnCursorMovement(this, new VlnFlexGridCursorMovementEventArgs(args.Key));
|
|
}
|
|
else
|
|
_owner.OnCursorMovement(this, new VlnFlexGridCursorMovementEventArgs(args.Key));
|
|
break;
|
|
case VEPROMS.CSLA.Library.E_ArrowKeys.CtrlUp:
|
|
case VEPROMS.CSLA.Library.E_ArrowKeys.Up:
|
|
row = cr.r1;
|
|
if (row > 0)
|
|
_owner.Select(_owner.GetMergedRange(row - 1, col));
|
|
else
|
|
_owner.OnCursorMovement(this, new VlnFlexGridCursorMovementEventArgs(args.Key));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
//Console.WriteLine("selection {0}", _owner.Selection);
|
|
//_owner.Focus(); // focus was jumping out of the grid this keeps it in.
|
|
}
|
|
|
|
// after edit handler (custom editor)
|
|
void _editor_Leave(object sender, EventArgs e)
|
|
{
|
|
_owner.Invalidate();
|
|
_owner.AdjustGridControlSize();
|
|
}
|
|
//void _HeightChanged(object sender, EventArgs args)
|
|
//{
|
|
// _owner.Invalidate();
|
|
//}
|
|
|
|
// save key that started the editing mode
|
|
public void SetPendingKey(char chr)
|
|
{
|
|
_pendingKey = chr;
|
|
}
|
|
|
|
// expose internal variables
|
|
public bool Cancel { get { return _cancel; } }
|
|
public int Row { get { return _row; } }
|
|
public int Col { get { return _col; } }
|
|
|
|
// move editor after the grid has scrolled
|
|
public void UpdatePosition()
|
|
{
|
|
// get cell rect now
|
|
Rectangle rcCell = _owner.GetCellRect(_row, _col, false);
|
|
|
|
// intersect with scrollable part of the grid
|
|
Rectangle rcScroll = _owner.ClientRectangle;
|
|
rcScroll.X = _owner.Cols[_owner.Cols.Fixed].Left;
|
|
rcScroll.Y = _owner.Rows[_owner.Rows.Fixed].Top;
|
|
rcScroll.Width -= rcScroll.X;
|
|
rcScroll.Height -= rcScroll.Y;
|
|
rcCell = Rectangle.Intersect(rcCell, rcScroll);
|
|
|
|
// and move the control
|
|
if (rcCell.Width > 0) rcCell.Width--;
|
|
if (rcCell.Height > 0) rcCell.Height--;
|
|
Bounds = rcCell;
|
|
|
|
Size sz = new Size(_owner.GetCellRect(_row, _col).Width, _owner.GetCellRect(_row, _col).Height);
|
|
this.Size = sz;
|
|
}
|
|
|
|
// lost focus: hide the editor
|
|
override protected void OnLeave(System.EventArgs e)
|
|
{
|
|
// base processing
|
|
base.OnLeave(e);
|
|
|
|
// copy text to owner grid
|
|
if (!_cancel)
|
|
{
|
|
_owner[_row, _col] = Rtf; //Text;
|
|
}
|
|
// no more pending keys
|
|
_pendingKey = (char)0;
|
|
|
|
// done for now, hide editor
|
|
Visible = false;
|
|
}
|
|
|
|
// we will handle the Tab key ourselves
|
|
override protected bool IsInputKey(Keys keyData)
|
|
{
|
|
if (keyData == Keys.Tab) return true;
|
|
return base.IsInputKey(keyData);
|
|
}
|
|
|
|
//// some keys end the editing
|
|
//override protected void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
|
|
//{
|
|
// switch (e.KeyCode)
|
|
// {
|
|
// case Keys.Escape: // cancel edits
|
|
// _cancel = true;
|
|
// _owner.Select();
|
|
// e.Handled = true;
|
|
// return;
|
|
|
|
// case Keys.Enter: // finish editing
|
|
// case Keys.Tab:
|
|
// case Keys.Up:
|
|
// case Keys.Down:
|
|
// case Keys.PageUp:
|
|
// case Keys.PageDown:
|
|
// _owner.Select();
|
|
// e.Handled = true;
|
|
// MoveCursor(e.KeyCode);
|
|
// return;
|
|
|
|
// default: // default processing
|
|
// base.OnKeyDown(e);
|
|
// return;
|
|
// }
|
|
//}
|
|
|
|
//// move cursor after done editing
|
|
//protected void MoveCursor(Keys key)
|
|
//{
|
|
// int row = _owner.Row;
|
|
// int col = _owner.Col;
|
|
// switch (key)
|
|
// {
|
|
// case Keys.Tab: col++; break;
|
|
// case Keys.Up: row--; break;
|
|
// //case Keys.Return: row++; break;
|
|
// case Keys.Down: row++; break;
|
|
// //case Keys.PageUp: row -= 10; break;
|
|
// //case Keys.PageDown: row += 10; break;
|
|
// }
|
|
|
|
// // validate new selection
|
|
// if (row < _owner.Rows.Fixed) row = _owner.Rows.Fixed;
|
|
// if (col < _owner.Cols.Fixed) col = _owner.Cols.Fixed;
|
|
// if (row > _owner.Rows.Count - 1) row = _owner.Rows.Count - 1;
|
|
// if (col > _owner.Cols.Count - 1) col = _owner.Cols.Count - 1;
|
|
|
|
// // apply new selection
|
|
// _owner.Select(row, col);
|
|
//}
|
|
|
|
//// suppress some keys to avoid annoying beep
|
|
//override protected void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)
|
|
//{
|
|
// switch (e.KeyChar)
|
|
// {
|
|
// case (char)27: // Keys.Escape:
|
|
// case (char)13: // Keys.Enter:
|
|
// case (char)9: // Keys.Tab:
|
|
// e.Handled = true;
|
|
// return;
|
|
// }
|
|
// base.OnKeyPress(e);
|
|
//}
|
|
}
|
|
#endregion // TableCellEditor
|
|
#region TableClipBoardFuncts Class
|
|
class TableClipBoardFuncts
|
|
{
|
|
DataFormats.Format dfmtTableCellRange = DataFormats.GetFormat("TableCellRange");
|
|
private SelectedTableCells mySeldTableCellsObject;
|
|
private DataObject myDataObject;
|
|
public TableClipBoardFuncts()
|
|
{
|
|
//mySeldTableCellsObject = new DataObject(dfmtTableCellRange.Name, seldTableCells);
|
|
}
|
|
|
|
public void Put(CellRange cr)
|
|
{
|
|
// Copies myObject into the clipboard.
|
|
// Clip get the value (text) of all the cells in the selected range
|
|
// This is saved as one RTF string.
|
|
Clipboard.SetDataObject(cr.Clip, true); // the "true" make the copy persistent
|
|
//Console.WriteLine("\nClip: '{0}' \n'{1}'", cr.Clip,cr.DataDisplay);
|
|
//mySeldTableCellsObject = new SelectedTableCells();
|
|
//mySeldTableCellsObject.CpbrdCellRange = cr;
|
|
// myDataObject = new DataObject(dfmtTableCellRange.Name, mySeldTableCellsObject);
|
|
// try
|
|
// {
|
|
// Clipboard.SetDataObject(myDataObject); //,true);
|
|
// }
|
|
// catch (Exception ex)
|
|
// {
|
|
// Console.WriteLine(ex.Message);
|
|
// }
|
|
|
|
}
|
|
|
|
public ArrayList Get()
|
|
{
|
|
// Retrieves the data from the clipboard.
|
|
IDataObject myRetrievedObject = Clipboard.GetDataObject();
|
|
string jj = (string)myRetrievedObject.GetData(DataFormats.Text);
|
|
return GetCellStrings(jj);
|
|
}
|
|
|
|
//public CellRange get_cr_Paste()
|
|
//{
|
|
// mySeldTableCellsObject = new SelectedTableCells();
|
|
// CellRange cr = new CellRange();
|
|
// SelectedTableCells sc;
|
|
// IDataObject myRetrievedObject = Clipboard.GetDataObject();
|
|
// try
|
|
// {
|
|
// //object obj = myRetrievedObject.GetData(dfmtTableCellRange.Name);
|
|
// object obj = myRetrievedObject.GetData("TableCellRange");
|
|
// //sc = (SelectedTableCells)myRetrievedObject.GetData(dfmtTableCellRange.Name);
|
|
// sc = (SelectedTableCells)obj;
|
|
// cr = sc.CpbrdCellRange;
|
|
// }
|
|
// catch (Exception ex)
|
|
// {
|
|
// Console.WriteLine(ex.Message);
|
|
// }
|
|
// return cr;
|
|
//}
|
|
|
|
private ArrayList GetCellStrings(string instr)
|
|
{
|
|
// The table cells placed on the clipboard is saved as one long RTF string.
|
|
// "\r\n\t" defines a cell border
|
|
// "\r\n\r" defines beginning of next line (row)
|
|
// This function will separate each cell text and place them in an array.
|
|
// This allow the clipboard information to be pasted independently from
|
|
// how it was selected.
|
|
|
|
// Bug fix: the CellRange.Clip (see cr.clip in the Put() function above) is replacing
|
|
// new lines with spaces. We need to put them back.
|
|
instr = instr.Replace(@"}} \", "}}\r\n\\");
|
|
string tstr = ""; // this will contain the parsed out cell text
|
|
ArrayList arylstCellStrings = new ArrayList();
|
|
int sidx = 0; // start index
|
|
int tidx = 0;
|
|
if (instr != null)
|
|
{
|
|
int idx = instr.IndexOf(@"{\rtf",sidx+1); // cell boarder
|
|
while (idx > 0)
|
|
{
|
|
tstr = instr.Substring(sidx, idx - sidx);
|
|
tstr = tstr.Substring(0, tstr.LastIndexOf('}') + 1);
|
|
//Console.WriteLine("\ntstr: '{0}'", tstr);
|
|
arylstCellStrings.Add(tstr);
|
|
sidx = idx;
|
|
idx = instr.IndexOf(@"{\rtf",sidx+1);
|
|
}
|
|
if (sidx < instr.Length)
|
|
{
|
|
tstr = instr.Substring(sidx);
|
|
arylstCellStrings.Add(tstr);
|
|
}
|
|
}
|
|
return arylstCellStrings;
|
|
}
|
|
|
|
//private ArrayList GetCellStrings(string instr)
|
|
//{
|
|
// // The table cells placed on the clipboard is saved as one long RTF string.
|
|
// // "\r\n\t" defines a cell border
|
|
// // "\r\n\r" defines beginning of next line (row)
|
|
// // This function will separate each cell text and place them in an array.
|
|
// // This allow the clipboard information to be pasted independently from
|
|
// // how it was selected.
|
|
|
|
// string tstr = ""; // this will contain the parsed out cell text
|
|
// ArrayList arylstCellStrings = new ArrayList();
|
|
// int sidx = 0; // start index
|
|
// int tidx = 0;
|
|
// if (instr != null)
|
|
// {
|
|
// int idx = instr.IndexOf("\r\n\t"); // cell boarder
|
|
// if (idx < 0) idx = instr.IndexOf("\r\n\r"); // new line (needed for multiple lines in one cell)
|
|
// while (idx > 0)
|
|
// {
|
|
// tstr = instr.Substring(sidx, idx - sidx);
|
|
// tidx = tstr.IndexOf("\r\n\r");
|
|
// if (tidx > 0)
|
|
// {
|
|
// idx = instr.IndexOf("\r\n\r", sidx);
|
|
// tstr = instr.Substring(sidx, idx - sidx);
|
|
// }
|
|
// arylstCellStrings.Add(tstr.Substring(tstr.IndexOf("{\\rtf")));
|
|
// sidx = idx + 3;
|
|
// if (sidx < instr.Length)
|
|
// {
|
|
// idx = instr.IndexOf("\r\n\t", sidx);
|
|
// if (idx < 0) idx = instr.IndexOf("\r\n\r", sidx);
|
|
// }
|
|
// }
|
|
// if (sidx < instr.Length)
|
|
// {
|
|
// tstr = instr.Substring(sidx);
|
|
// arylstCellStrings.Add(tstr.Substring(tstr.IndexOf("{\\rtf")));
|
|
// }
|
|
// }
|
|
// return arylstCellStrings;
|
|
//}
|
|
}
|
|
|
|
[Serializable]
|
|
public class SelectedTableCells : Object
|
|
{
|
|
private CellRange _cpbrdCellRange;
|
|
|
|
public CellRange CpbrdCellRange
|
|
{
|
|
get { return _cpbrdCellRange; }
|
|
set { _cpbrdCellRange = value; }
|
|
}
|
|
public SelectedTableCells()
|
|
{
|
|
}
|
|
}
|
|
#endregion // TableClipBoardFuncts Class
|
|
public class VlnFlexGridCursorMovementEventArgs
|
|
{
|
|
private E_ArrowKeys _Key;
|
|
public E_ArrowKeys Key
|
|
{
|
|
get { return _Key; }
|
|
set { _Key = value; }
|
|
}
|
|
public VlnFlexGridCursorMovementEventArgs(E_ArrowKeys key)
|
|
{
|
|
_Key = key;
|
|
}
|
|
}
|
|
public class VlnFlexGridPasteEventArgs
|
|
{
|
|
private string _Text;
|
|
public string Text
|
|
{
|
|
get { return _Text; }
|
|
set { _Text = value; }
|
|
}
|
|
public VlnFlexGridPasteEventArgs(string text)
|
|
{
|
|
_Text = text;
|
|
}
|
|
}
|
|
public class GridCopyInfo
|
|
{
|
|
private int _Bozo = 5;
|
|
[XmlIgnore]
|
|
public int Bozo
|
|
{
|
|
get { return _Bozo; }
|
|
set { _Bozo = value; }
|
|
}
|
|
|
|
private GridCopyOption _MyCopyOption = GridCopyOption.Selection;
|
|
|
|
public GridCopyOption MyCopyOption
|
|
{
|
|
get { return _MyCopyOption; }
|
|
set
|
|
{
|
|
Console.WriteLine("MyCopyOption = {0}", _MyCopyOption);
|
|
if (_MyCopyOption != value)
|
|
Console.WriteLine("Changed Option to {0}", value);
|
|
_MyCopyOption = value;
|
|
}
|
|
}
|
|
private VlnFlexGrid _MyCopiedFlexGrid = null;
|
|
|
|
public VlnFlexGrid MyCopiedFlexGrid
|
|
{
|
|
get { return _MyCopiedFlexGrid; }
|
|
set { _MyCopiedFlexGrid = value; }
|
|
}
|
|
private CellRange _MyCopiedCellRange;
|
|
|
|
public CellRange MyCopiedCellRange
|
|
{
|
|
get { return _MyCopiedCellRange; }
|
|
set { _MyCopiedCellRange = value; }
|
|
}
|
|
|
|
}
|
|
}
|