2022-12-27 17:33:33 +08:00

580 lines
16 KiB
C#

using System;
using System.Drawing;
using System.Windows.Forms;
namespace GoldPrinter
{
public class DrawGrid : GoldGrid, IDraw, IDisposable
{
private Graphics _graphics;
private Rectangle _rectangle;
private Brush _brush;
private Pen _pen;
public Graphics Graphics
{
get
{
return this._graphics;
}
set
{
this._graphics = value;
}
}
public Rectangle Rectangle
{
get
{
return this._rectangle;
}
set
{
this._rectangle = value;
}
}
public Pen Pen
{
get
{
return this._pen;
}
set
{
if (value != null)
{
this._pen = value;
}
}
}
public Brush Brush
{
get
{
return this._brush;
}
set
{
if (value != null)
{
this._brush = value;
}
}
}
public DrawGrid()
{
this._pen = new Pen(Color.Black);
this._brush = Brushes.Black;
}
public DrawGrid(int rows, int cols)
{
base.Initialize(rows, cols);
}
public override void Dispose()
{
base.Dispose();
this._graphics.Dispose();
}
public void DrawGridLine()
{
this.DrawGridLine(this._graphics, this._rectangle, this.Pen, base.GridText, base.PreferredRowHeight, base.ColsWidth, base.Line, base.Border, new PointF(1f, 1f), base.Merge);
}
public void DrawGridText()
{
this.DrawGridText(this._graphics, this._rectangle, this.Brush, base.GridText, base.PreferredRowHeight, base.ColsWidth, base.ColsAlignString, base.Font, new PointF(1f, 1f), base.Merge);
}
public void DrawGridBorder()
{
this.DrawGridBorder(this._graphics, this._rectangle, this.Pen, base.Border);
}
public void Draw()
{
this.DrawGridLine();
this.DrawGridText();
this.DrawGridBorder();
}
protected void DrawGridLine(Graphics g, Rectangle p_rec, Pen p_pen, int p_rows, int p_cols, int p_rowHeight, int[] p_arrColsWidth, GridLineFlag p_gridLineFlag, GridBorderFlag p_gridBorderFlag, PointF p_scaleXY)
{
Rectangle rectangle = new Rectangle(p_rec.X, p_rec.Y, p_rec.Width, p_rec.Height);
this.TransGrid(g, rectangle, p_scaleXY);
if (p_gridLineFlag != GridLineFlag.None)
{
int width = rectangle.Width;
int height = rectangle.Height;
if (p_gridLineFlag == GridLineFlag.Horizontal || p_gridLineFlag == GridLineFlag.Both)
{
int num = rectangle.X;
int num2 = rectangle.Y;
int x = num + width;
for (int i = 1; i < p_rows; i++)
{
num2 += p_rowHeight;
int y = num2;
g.DrawLine(p_pen, num, num2, x, y);
}
}
if (p_gridLineFlag == GridLineFlag.Vertical || p_gridLineFlag == GridLineFlag.Both)
{
int[] array = new int[p_cols];
int num = rectangle.X;
int num2 = rectangle.Y;
int y = num2 + height;
for (int j = 0; j < p_cols - 1; j++)
{
num += p_arrColsWidth[j];
int x = num;
g.DrawLine(p_pen, num, num2, x, y);
}
}
}
if (p_gridBorderFlag != GridBorderFlag.None)
{
this.DrawGridBorder(g, rectangle, p_pen, p_gridBorderFlag);
}
this.ResetTransGrid();
}
protected void DrawGridLine(Graphics g, Rectangle p_rec, Pen p_pen, string[,] arrStrGrid, int p_rowHeight, int[] p_arrColsWidth, GridLineFlag p_gridLineFlag, GridBorderFlag p_gridBorderFlag, PointF p_scaleXY)
{
int length = arrStrGrid.GetLength(0);
int length2 = arrStrGrid.GetLength(1);
this.DrawGridLine(g, p_rec, p_pen, length, length2, p_rowHeight, p_arrColsWidth, p_gridLineFlag, p_gridBorderFlag, p_scaleXY);
}
protected void DrawGridMergeLine(Graphics g, Rectangle p_rec, Pen p_pen, string[,] arrStrGrid, int p_rowHeight, int[] p_arrColsWidth, GridLineFlag p_gridLineFlag, GridBorderFlag p_gridBorderFlag, PointF p_scaleXY, GridMergeFlag gridMergeFlag)
{
Rectangle rectangle = new Rectangle(p_rec.X, p_rec.Y, p_rec.Width, p_rec.Height);
int length = arrStrGrid.GetLength(0);
int length2 = arrStrGrid.GetLength(1);
if (gridMergeFlag == GridMergeFlag.None)
{
this.DrawGridLine(g, rectangle, p_pen, length, length2, p_rowHeight, p_arrColsWidth, p_gridLineFlag, p_gridBorderFlag, p_scaleXY);
}
else if (p_gridLineFlag != GridLineFlag.None)
{
this.TransGrid(g, rectangle, p_scaleXY);
int[] array = new int[length2];
for (int i = 0; i < length; i++)
{
int num = rectangle.X;
int num2 = rectangle.Y;
for (int j = 0; j < length2; j++)
{
int x = num + p_arrColsWidth[j];
num2 = rectangle.Y + p_rowHeight * i;
int num3 = num2;
if (i > 0)
{
if (gridMergeFlag == GridMergeFlag.Any)
{
if (arrStrGrid[i, j] == "" || arrStrGrid[i, j] != arrStrGrid[i - 1, j])
{
g.DrawLine(p_pen, num, num2, x, num3);
}
}
}
if (j > 0)
{
num3 += p_rowHeight;
x = num;
if (gridMergeFlag == GridMergeFlag.Any)
{
if (arrStrGrid[i, j] == "" || arrStrGrid[i, j] != arrStrGrid[i, j - 1])
{
g.DrawLine(p_pen, num, num2, x, num3);
}
}
}
num += p_arrColsWidth[j];
}
}
if (p_gridBorderFlag != GridBorderFlag.None)
{
this.DrawGridBorder(g, rectangle, p_pen, p_gridBorderFlag);
}
this.ResetTransGrid();
}
}
protected void DrawGridText(Graphics g, Rectangle p_rec, Brush p_brush, string[,] arrStrGrid, int p_rowHeight, int[] p_arrColsWidth, string alignment, Font p_font, PointF p_scaleXY)
{
try
{
Rectangle p_rec2 = new Rectangle(p_rec.X, p_rec.Y, p_rec.Width, p_rec.Height);
Font font = p_font;
if (font == null)
{
font = new Font("宋体", 12f);
}
int length = arrStrGrid.GetLength(0);
int length2 = arrStrGrid.GetLength(1);
int[] array = new int[length2];
AlignFlag[] colsAlign = this.GetColsAlign(alignment);
this.TransGrid(g, p_rec2, p_scaleXY);
StringFormat stringFormat = new StringFormat();
stringFormat.LineAlignment = StringAlignment.Center;
stringFormat.FormatFlags = (StringFormatFlags.NoWrap | StringFormatFlags.LineLimit);
for (int i = 0; i < length; i++)
{
int num = p_rec2.X;
int y = p_rec2.Y + p_rowHeight * i;
for (int j = 0; j < length2; j++)
{
int num2 = p_arrColsWidth[j];
Rectangle r = new Rectangle(num, y, num2, p_rowHeight + 4);
stringFormat.Alignment = StringAlignment.Near;
if (colsAlign.Length > j)
{
if (colsAlign[j] == AlignFlag.Center)
{
stringFormat.Alignment = StringAlignment.Center;
}
else if (colsAlign[j] == AlignFlag.Right)
{
stringFormat.Alignment = StringAlignment.Far;
}
}
g.DrawString(arrStrGrid[i, j], font, p_brush, r, stringFormat);
num += num2;
}
}
this.ResetTransGrid();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
}
}
protected void DrawGridMergeText(Graphics g, Rectangle p_rec, Brush p_brush, string[,] arrStrGrid, int p_rowHeight, int[] p_arrColsWidth, string alignment, Font p_font, PointF p_scaleXY, GridMergeFlag gridMergeFlag)
{
if (gridMergeFlag == GridMergeFlag.None)
{
this.DrawGridText(g, p_rec, p_brush, arrStrGrid, p_rowHeight, p_arrColsWidth, alignment, p_font, p_scaleXY);
}
else
{
try
{
Rectangle p_rec2 = new Rectangle(p_rec.X, p_rec.Y, p_rec.Width, p_rec.Height);
Font font = p_font;
if (font == null)
{
font = new Font("宋体", 12f);
}
int length = arrStrGrid.GetLength(0);
int length2 = arrStrGrid.GetLength(1);
int[] array = new int[length2];
AlignFlag[] colsAlign = this.GetColsAlign(alignment);
this.TransGrid(g, p_rec2, p_scaleXY);
StringFormat stringFormat = new StringFormat();
stringFormat.LineAlignment = StringAlignment.Center;
stringFormat.FormatFlags = (StringFormatFlags.NoWrap | StringFormatFlags.LineLimit);
CellRectangle mergeCell = new CellRectangle(p_rec2.X, p_rec2.Y, 0, p_rowHeight);
for (int i = 0; i < length; i++)
{
for (int j = 0; j < length2; j++)
{
mergeCell = this.GetMergeCell(new Point(p_rec2.X, p_rec2.Y), arrStrGrid, p_rowHeight, p_arrColsWidth, i, j);
Rectangle r = new Rectangle(mergeCell.Left, mergeCell.Top, mergeCell.Width, mergeCell.Height + 4);
stringFormat.Alignment = StringAlignment.Near;
if (colsAlign.Length > j)
{
if (colsAlign[j] == AlignFlag.Center)
{
stringFormat.Alignment = StringAlignment.Center;
}
else if (colsAlign[j] == AlignFlag.Right)
{
stringFormat.Alignment = StringAlignment.Far;
}
}
g.DrawString(arrStrGrid[i, j], font, p_brush, r, stringFormat);
}
}
this.ResetTransGrid();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
}
}
}
protected void DrawGridBorder(Graphics g, Rectangle rec, Pen p_pen, GridBorderFlag p_gridBorderFlag)
{
if (p_gridBorderFlag != GridBorderFlag.None)
{
float width = 1f;
int num = 0;
switch (p_gridBorderFlag)
{
case GridBorderFlag.SingleBold:
width = 2f;
break;
case GridBorderFlag.Double:
g.DrawRectangle(p_pen, rec);
num = 2;
break;
case GridBorderFlag.DoubleBold:
g.DrawRectangle(p_pen, rec);
width = 2f;
num = 3;
break;
}
Pen pen = (Pen)p_pen.Clone();
pen.Width = width;
Rectangle rect = rec;
rect.X = rec.X - num;
rect.Y = rec.Y - num;
rect.Width = rec.Width + num * 2;
rect.Height = rec.Height + num * 2;
g.DrawRectangle(pen, rect);
pen.Dispose();
}
}
private void TransGrid(Graphics g, Rectangle p_rec, PointF p_scaleXY)
{
if (!p_scaleXY.IsEmpty)
{
g.ScaleTransform(p_scaleXY.X, p_scaleXY.Y);
}
}
private void ResetTransGrid()
{
}
protected void DrawGridLine(Graphics g, Rectangle p_rec, Pen p_pen, string[,] arrStrGrid, int p_rowHeight, int[] p_arrColsWidth, GridLineFlag p_gridLineFlag, GridBorderFlag p_gridBorderFlag, PointF p_scaleXY, GridMergeFlag gridMergeFlag)
{
Rectangle rectangle = new Rectangle(p_rec.X, p_rec.Y, p_rec.Width, p_rec.Height);
int length = arrStrGrid.GetLength(0);
int length2 = arrStrGrid.GetLength(1);
if (gridMergeFlag == GridMergeFlag.None)
{
this.DrawGridLine(g, rectangle, p_pen, length, length2, p_rowHeight, p_arrColsWidth, p_gridLineFlag, p_gridBorderFlag, p_scaleXY);
}
else if (p_gridLineFlag != GridLineFlag.None)
{
this.TransGrid(g, rectangle, p_scaleXY);
int[] array = new int[length2];
for (int i = 0; i < length; i++)
{
int num = rectangle.X;
int num2 = rectangle.Y;
for (int j = 0; j < length2; j++)
{
int x = num + p_arrColsWidth[j];
num2 = rectangle.Y + p_rowHeight * i;
int num3 = num2;
if (i > 0)
{
switch (gridMergeFlag)
{
case GridMergeFlag.None:
g.DrawLine(p_pen, num, num2, x, num3);
break;
case GridMergeFlag.Row:
g.DrawLine(p_pen, num, num2, x, num3);
break;
case GridMergeFlag.Col:
if (arrStrGrid[i, j] == "" || arrStrGrid[i, j] != arrStrGrid[i - 1, j])
{
g.DrawLine(p_pen, num, num2, x, num3);
}
break;
case GridMergeFlag.Any:
if (arrStrGrid[i, j] == "" || arrStrGrid[i, j] != arrStrGrid[i - 1, j])
{
g.DrawLine(p_pen, num, num2, x, num3);
}
break;
}
}
if (j > 0)
{
num3 += p_rowHeight;
x = num;
switch (gridMergeFlag)
{
case GridMergeFlag.None:
g.DrawLine(p_pen, num, num2, x, num3);
break;
case GridMergeFlag.Row:
if (arrStrGrid[i, j] == "" || arrStrGrid[i, j] != arrStrGrid[i, j - 1])
{
g.DrawLine(p_pen, num, num2, x, num3);
}
break;
case GridMergeFlag.Col:
g.DrawLine(p_pen, num, num2, x, num3);
break;
case GridMergeFlag.Any:
if (arrStrGrid[i, j] == "" || arrStrGrid[i, j] != arrStrGrid[i, j - 1])
{
g.DrawLine(p_pen, num, num2, x, num3);
}
break;
}
}
num += p_arrColsWidth[j];
}
}
if (p_gridBorderFlag != GridBorderFlag.None)
{
this.DrawGridBorder(g, rectangle, p_pen, p_gridBorderFlag);
}
this.ResetTransGrid();
}
}
protected void DrawGridText(Graphics g, Rectangle p_rec, Brush p_brush, string[,] arrStrGrid, int p_rowHeight, int[] p_arrColsWidth, string alignment, Font p_font, PointF p_scaleXY, GridMergeFlag gridMergeFlag)
{
if (gridMergeFlag == GridMergeFlag.None)
{
this.DrawGridText(g, p_rec, p_brush, arrStrGrid, p_rowHeight, p_arrColsWidth, alignment, p_font, p_scaleXY);
}
else
{
try
{
Rectangle p_rec2 = new Rectangle(p_rec.X, p_rec.Y, p_rec.Width, p_rec.Height);
Font font = p_font;
if (font == null)
{
font = new Font("宋体", 12f);
}
int length = arrStrGrid.GetLength(0);
int length2 = arrStrGrid.GetLength(1);
int[] array = new int[length2];
AlignFlag[] colsAlign = this.GetColsAlign(alignment);
this.TransGrid(g, p_rec2, p_scaleXY);
StringFormat stringFormat = new StringFormat();
stringFormat.LineAlignment = StringAlignment.Center;
stringFormat.FormatFlags = StringFormatFlags.LineLimit;
CellRectangle mergeCell = new CellRectangle(p_rec2.X, p_rec2.Y, 0, p_rowHeight);
for (int i = 0; i < length; i++)
{
for (int j = 0; j < length2; j++)
{
mergeCell = this.GetMergeCell(new Point(p_rec2.X, p_rec2.Y), arrStrGrid, p_rowHeight, p_arrColsWidth, i, j, gridMergeFlag);
Rectangle r = new Rectangle(mergeCell.Left, mergeCell.Top, mergeCell.Width, mergeCell.Height + 4);
stringFormat.Alignment = StringAlignment.Near;
if (colsAlign.Length > j)
{
if (colsAlign[j] == AlignFlag.Center)
{
stringFormat.Alignment = StringAlignment.Center;
}
else if (colsAlign[j] == AlignFlag.Right)
{
stringFormat.Alignment = StringAlignment.Far;
}
}
g.DrawString(arrStrGrid[i, j], font, p_brush, r, stringFormat);
}
}
this.ResetTransGrid();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
}
}
}
protected virtual CellRectangle GetMergeCell(Point GridLocation, string[,] arrStrGrid, int rowHeight, int[] ArrColWidth, int rowSel, int colSel, GridMergeFlag gridMergeFlag)
{
CellRectangle result = new CellRectangle(0, 0, 0, 0);
int length = arrStrGrid.GetLength(0);
int length2 = arrStrGrid.GetLength(1);
int num = 1;
int num2 = 1;
int num3 = rowSel;
int num4 = rowSel;
int num5 = colSel;
int num6 = colSel;
if (gridMergeFlag == GridMergeFlag.Any || gridMergeFlag == GridMergeFlag.Col || gridMergeFlag == GridMergeFlag.ColDependOnBeforeGroup)
{
for (int i = rowSel - 1; i >= 0; i--)
{
if (!(arrStrGrid[rowSel, colSel] == arrStrGrid[i, colSel]))
{
break;
}
num++;
num3--;
}
for (int i = rowSel + 1; i < length; i++)
{
if (!(arrStrGrid[rowSel, colSel] == arrStrGrid[i, colSel]))
{
break;
}
num++;
num4++;
}
}
if (gridMergeFlag == GridMergeFlag.Any || gridMergeFlag == GridMergeFlag.Row)
{
for (int j = colSel - 1; j >= 0; j--)
{
if (!(arrStrGrid[rowSel, colSel] == arrStrGrid[rowSel, j]))
{
break;
}
num2++;
num5--;
}
for (int j = colSel + 1; j < length2; j++)
{
if (!(arrStrGrid[rowSel, colSel] == arrStrGrid[rowSel, j]))
{
break;
}
num2++;
num6++;
}
}
int num7 = GridLocation.X;
int cellTop = GridLocation.Y + num3 * rowHeight;
int num8 = 0;
for (int k = num5 - 1; k >= 0; k--)
{
num7 += ArrColWidth[k];
}
for (int k = num5; k <= num6; k++)
{
num8 += ArrColWidth[k];
}
int cellHeight = num * rowHeight;
result = new CellRectangle(num7, cellTop, num8, cellHeight);
return result;
}
}
}